From aac2fa9f8e3e652fefe4b2173612688bcaed10f0 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 29 Jan 2024 14:38:00 -0600 Subject: [PATCH 01/98] SPEX citation: algo 1021 of ACM TOMS --- CITATION.bib | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CITATION.bib b/CITATION.bib index 13b13d93ac..45fe575c6c 100644 --- a/CITATION.bib +++ b/CITATION.bib @@ -474,7 +474,7 @@ @article{10.1145/3337792 @article{10.1145/3519024, author = {Lourenco, Christopher and Chen, Jinhao and Moreno-Centeno, Erick and Davis, Timothy A.}, -title = {Algorithm 1XXX: SPEX Left LU, Exactly Solving Sparse Linear Systems via a Sparse Left-Looking Integer-Preserving LU Factorization}, +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}, @@ -482,9 +482,8 @@ @article{10.1145/3519024 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.}, -note = {Just Accepted}, journal = {ACM Trans. Math. Softw.}, -month = {feb}, +month = {jun}, keywords = {exact matrix factorization, sparse linear systems, sparse matrix algorithms, exactly solving linear systems, roundoff errors} } From 32caf51b474892b8a9a8d5b882202ce9ad749af5 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 30 Jan 2024 17:51:29 -0600 Subject: [PATCH 02/98] SPEX 3.1.0: major API revision from SPEX 2.x; many more features (Cholesky & Backslash) --- ChangeLog | 29 + Example/CMakeLists.txt | 8 +- Example/Include/my.h | 4 +- Example/Source/my.c | 3 +- Example/Source/my_cxx.cc | 3 +- README.md | 2 +- SPEX/CMakeLists.txt | 153 +- SPEX/Config/SPEX.h.in | 1176 +- SPEX/Config/Tcov_Makefile.in | 271 + SPEX/Config/spex_deps.m.in | 22 + .../Utilities/spex_demo_check_solution.c} | 100 +- .../Utilities/spex_demo_determine_error.c | 35 + .../spex_demo_process_command_line.c | 133 + SPEX/Demo/Utilities/spex_demo_read_dense.c | 72 + SPEX/Demo/Utilities/spex_demo_tripread.c | 130 + SPEX/Demo/spex_demo_backslash.c | 123 + SPEX/Demo/spex_demo_cholesky_extended.c | 152 + SPEX/Demo/spex_demo_cholesky_simple.c | 145 + SPEX/Demo/spex_demo_lu_doub.c | 234 + .../spex_demo_lu_extended.c} | 209 +- .../example.c => Demo/spex_demo_lu_simple1.c} | 75 +- .../spex_demo_lu_simple2.c} | 96 +- SPEX/Demo/spex_demo_threaded.c | 183 + SPEX/Demo/spex_demos.h | 95 + SPEX/Doc/ChangeLog | 46 +- SPEX/Doc/Makefile | 5 +- SPEX/Doc/SPEX_UserGuide.bib | 12 + SPEX/Doc/SPEX_UserGuide.pdf | Bin 335801 -> 381370 bytes SPEX/Doc/SPEX_UserGuide.tex | 3906 ++- SPEX/Doc/SPEX_version.tex | 2 +- SPEX/Doc/appendix_A.pdf | Bin 0 -> 100257 bytes SPEX/Doc/appendix_A.tex | 426 + .../10teams.mat.txt} | 0 .../10teams.rhs.txt} | 0 SPEX/ExampleMats/494_bus.mat.txt | 1667 + SPEX/ExampleMats/494_bus.rhs.txt | 495 + SPEX/ExampleMats/LF10.mat.txt | 83 + SPEX/ExampleMats/LFAT5.mat.txt | 47 + .../NSR8K.mat.txt} | 0 .../NSR8K_v.txt => ExampleMats/NSR8K.rhs.txt} | 0 SPEX/ExampleMats/README.txt | 49 + SPEX/ExampleMats/Trefethen_500.mat.txt | 8479 +++++ SPEX/ExampleMats/Trefethen_500.rhs.txt | 501 + SPEX/ExampleMats/example.mat.txt | 9 + SPEX/ExampleMats/example.rhs.txt | 9 + SPEX/ExampleMats/mesh1e1.mat.txt | 307 + SPEX/ExampleMats/mesh1e1.rhs.txt | 49 + .../test_mat.txt => ExampleMats/test.mat.txt} | 0 .../test_rhs.txt => ExampleMats/test.rhs.txt} | 0 SPEX/ExampleMats/test1.mat.txt | 2 + SPEX/ExampleMats/test2.mat.txt | 4 + SPEX/ExampleMats/test3.mat.txt | 3 + SPEX/ExampleMats/test4.mat.txt | 3 + SPEX/ExampleMats/test5.mat.txt | 2 + SPEX/ExampleMats/tomography.mat | 28727 ++++++++++++++++ SPEX/ExampleMats/tomography.rhs | 501 + SPEX/Include/SPEX.h | 1186 +- SPEX/LICENSE.txt | 14 +- SPEX/MATLAB/.gitignore | 3 + SPEX/MATLAB/Source/SPEX_mex.h | 131 + SPEX/MATLAB/Source/spex_mex_check_for_inf.c | 67 + SPEX/MATLAB/Source/spex_mex_error.c | 52 + .../Source/spex_mex_get_A_and_b.c} | 68 +- .../Source/spex_mex_get_matlab_options.c} | 65 +- SPEX/MATLAB/spex_backslash.m | 132 + SPEX/MATLAB/spex_backslash_mex_soln.c | 181 + SPEX/MATLAB/spex_cholesky_backslash.m | 133 + SPEX/MATLAB/spex_cholesky_mex_soln.c | 182 + .../spex_lu_backslash.m} | 22 +- .../spex_lu_mex_soln.c} | 93 +- SPEX/MATLAB/spex_mex_demo.m | 159 + SPEX/MATLAB/spex_mex_install.m | 128 + SPEX/MATLAB/spex_mex_test.m | 224 + SPEX/Makefile | 25 +- SPEX/Python/.gitignore | 7 + SPEX/Python/SPEXpy/Options.py | 47 + SPEX/Python/SPEXpy/SPEX_error.py | 25 + .../SPEXpy/Source/spex_python_connect.c | 168 + .../SPEXpy/Source/spex_python_connect.h | 30 + SPEX/Python/SPEXpy/__init__.py | 33 + SPEX/Python/SPEXpy/backslash.py | 43 + SPEX/Python/SPEXpy/cholesky_backslash.py | 49 + SPEX/Python/SPEXpy/lu_backslash.py | 45 + SPEX/Python/SPEXpy/setup.py | 15 + SPEX/Python/SPEXpy/spex_connect.py | 80 + SPEX/Python/SPEXpy/spex_matrix_from_file.py | 37 + SPEX/Python/spex_python_demo.py | 72 + SPEX/README.md | 74 +- .../License/CONTRIBUTOR-LICENSE.txt | 9 +- .../License/GPLv2.txt | 0 .../License/lesserv3.txt | 0 .../License/license.txt | 7 +- SPEX/SPEX_Backslash/README.md | 14 + SPEX/SPEX_Backslash/Source/SPEX_backslash.c | 163 + .../License/CONTRIBUTOR-LICENSE.txt | 169 + .../License/GPLv2.txt | 0 .../License/lesserv3.txt | 0 SPEX/SPEX_Cholesky/License/license.txt | 39 + SPEX/SPEX_Cholesky/README.txt | 16 + .../Source/SPEX_cholesky_analyze.c | 112 + .../Source/SPEX_cholesky_backslash.c | 180 + .../Source/SPEX_cholesky_factorize.c | 112 + .../Source/SPEX_cholesky_solve.c | 156 + .../Source/spex_cholesky_backward_sub.c | 70 + .../Source/spex_cholesky_counts.c | 124 + .../Source/spex_cholesky_ereach.c | 67 + .../Source/spex_cholesky_etree.c | 79 + .../Source/spex_cholesky_factor.c | 141 + .../Source/spex_cholesky_forward_sub.c | 190 + .../Source/spex_cholesky_internal.h | 355 + .../SPEX_Cholesky/Source/spex_cholesky_leaf.c | 62 + .../Source/spex_cholesky_left_factor.c | 244 + .../spex_cholesky_left_triangular_solve.c | 345 + .../Source/spex_cholesky_permute_A.c | 134 + .../SPEX_Cholesky/Source/spex_cholesky_post.c | 77 + .../Source/spex_cholesky_pre_left_factor.c | 127 + .../Source/spex_cholesky_preorder.c | 185 + .../Source/spex_cholesky_symbolic_analysis.c | 93 + .../SPEX_Cholesky/Source/spex_cholesky_tdfs.c | 46 + .../Source/spex_cholesky_up_factor.c | 259 + .../spex_cholesky_up_triangular_solve.c | 309 + .../License/CONTRIBUTOR-LICENSE.txt | 8 +- SPEX/SPEX_LU/License/GPLv2.txt | 339 + SPEX/SPEX_LU/License/lesserv3.txt | 165 + .../License/license.txt | 9 +- SPEX/{SPEX_Left_LU => SPEX_LU}/README.md | 31 +- SPEX/SPEX_LU/Source/SPEX_lu_analyze.c | 160 + .../Source/SPEX_lu_backslash.c} | 94 +- .../Source/SPEX_lu_factorize.c} | 185 +- SPEX/SPEX_LU/Source/SPEX_lu_solve.c | 142 + .../Source/spex_left_lu_back_sub.c | 31 +- .../Source/spex_left_lu_dfs.c | 24 +- .../Source/spex_left_lu_forward_sub.c | 85 +- .../Source/spex_left_lu_get_largest_pivot.c | 24 +- .../Source/spex_left_lu_get_nonzero_pivot.c | 26 +- .../Source/spex_left_lu_get_pivot.c | 144 +- .../Source/spex_left_lu_get_smallest_pivot.c | 28 +- .../Source/spex_left_lu_reach.c | 20 +- .../spex_left_lu_ref_triangular_solve.c | 106 +- SPEX/SPEX_LU/Source/spex_lu_internal.h | 183 + SPEX/SPEX_Left_LU/Demo/.gitignore | 7 - SPEX/SPEX_Left_LU/Demo/demos.c | 464 - SPEX/SPEX_Left_LU/Demo/demos.h | 76 - SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_demo.m | 109 - .../MATLAB/SPEX_Left_LU_install.m | 85 - SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_test.m | 89 - .../MATLAB/Source/SPEX_Left_LU_mex.h | 94 - .../Source/spex_left_lu_mex_check_for_inf.c | 58 - .../MATLAB/Source/spex_left_lu_mex_error.c | 52 - SPEX/SPEX_Left_LU/Source/SPEX_Left_LU_solve.c | 176 - .../Source/spex_left_lu_internal.h | 199 - .../Source/spex_left_lu_permute_b.c | 68 - .../Source/spex_left_lu_permute_x.c | 69 - SPEX/SPEX_Left_LU/Tcov/.gitignore | 56 - SPEX/SPEX_Left_LU/Tcov/Makefile | 160 - SPEX/SPEX_Left_LU/Tcov/covall | 7 - SPEX/SPEX_Left_LU/Tcov/tcov_malloc_test.c | 94 - SPEX/SPEX_Left_LU/Tcov/tcov_malloc_test.h | 88 - SPEX/SPEX_Util/Source/SPEX_LU_analysis_free.c | 35 - SPEX/SPEX_Util/Source/SPEX_LU_analyze.c | 187 - SPEX/SPEX_Util/Source/SPEX_finalize.c | 28 - SPEX/SPEX_Util/Source/SPEX_gmp.h | 99 - SPEX/SPEX_Util/Source/SPEX_initialize.c | 48 - SPEX/SPEX_Util/Source/SPEX_matrix_div.c | 86 - SPEX/SPEX_Util/Source/SPEX_matrix_free.c | 114 - SPEX/SPEX_Util/Source/SPEX_version.c | 19 - .../SPEX_Util/Source/spex_expand_mpfr_array.c | 65 - SPEX/SPEX_Util/Source/spex_expand_mpq_array.c | 62 - .../License/CONTRIBUTOR-LICENSE.txt | 170 + SPEX/SPEX_Utilities/License/GPLv2.txt | 339 + SPEX/SPEX_Utilities/License/lesserv3.txt | 165 + SPEX/SPEX_Utilities/License/license.txt | 41 + SPEX/{SPEX_Util => SPEX_Utilities}/README.md | 7 +- .../Source/SPEX_calloc.c | 10 +- .../Source/SPEX_create_default_options.c | 32 +- .../Source/SPEX_determine_symmetry.c | 114 + .../Source/SPEX_factorization_free.c | 48 + SPEX/SPEX_Utilities/Source/SPEX_finalize.c | 34 + .../Source/SPEX_free.c | 9 +- .../Source/SPEX_gmp.c | 1117 +- SPEX/SPEX_Utilities/Source/SPEX_initialize.c | 62 + .../Source/SPEX_initialize_expert.c | 37 +- .../Source/SPEX_malloc.c | 11 +- .../Source/SPEX_matrix_allocate.c | 113 +- .../Source/SPEX_matrix_check.c | 235 +- .../Source/SPEX_matrix_copy.c | 225 +- SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c | 113 + .../Source/SPEX_matrix_nnz.c | 39 +- .../Source/SPEX_realloc.c | 30 +- .../Source/SPEX_symbolic_analysis_free.c | 45 + .../Source/SPEX_thread_finalize.c | 23 + .../Source/SPEX_thread_initialize.c | 22 + SPEX/SPEX_Utilities/Source/SPEX_transpose.c | 106 + SPEX/SPEX_Utilities/Source/SPEX_version.c | 38 + SPEX/SPEX_Utilities/Source/spex_amd.c | 76 + .../Source/spex_cast_array.c | 111 +- .../Source/spex_cast_matrix.c | 31 +- SPEX/SPEX_Utilities/Source/spex_colamd.c | 101 + .../Source/spex_create_mpfr_array.c | 26 +- SPEX/SPEX_Utilities/Source/spex_create_mpq.c | 37 + .../Source/spex_create_mpq_array.c | 20 +- .../Source/spex_create_mpz_array.c | 27 +- .../Source/spex_cumsum.c} | 14 +- .../Source/spex_expand_double_array.c | 82 +- .../Source/spex_expand_mpfr_array.c | 135 + .../Source/spex_expand_mpq_array.c | 56 + SPEX/SPEX_Utilities/Source/spex_gmp.h | 246 + .../Source/spex_matrix_mul.c} | 22 +- .../Source/spex_permute_dense_matrix.c | 70 + .../Source/spex_sparse_collapse.c | 17 +- .../Source/spex_sparse_realloc.c | 21 +- .../Source/spex_util_internal.h | 465 +- SPEX/{SPEX_Left_LU => }/Tcov/README.txt | 6 +- SPEX/{SPEX_Left_LU => }/Tcov/cov.awk | 0 SPEX/Tcov/covall | 6 + SPEX/{SPEX_Left_LU => }/Tcov/cover | 0 SPEX/{SPEX_Left_LU => }/Tcov/covs | 0 SPEX/{SPEX_Left_LU => }/Tcov/gcovs | 4 +- SPEX/Tcov/simple_rand.c | 64 + SPEX/Tcov/simple_rand.h | 34 + SPEX/Tcov/tcov_for_cholesky.c | 564 + .../Tcov/tcov_test.c => Tcov/tcov_for_lu.c} | 473 +- SPEX/Tcov/tcov_for_lu2.c | 183 + SPEX/Tcov/tcov_utilities.c | 245 + SPEX/Tcov/tcov_utilities.h | 164 + SPEX/cmake_modules/FindGMP.cmake | 177 +- SPEX/cmake_modules/FindMPFR.cmake | 151 +- SuiteSparse_config/CMakeLists.txt | 4 +- SuiteSparse_config/SuiteSparse_config.h | 8 +- 229 files changed, 60090 insertions(+), 7494 deletions(-) create mode 100644 SPEX/Config/Tcov_Makefile.in create mode 100644 SPEX/Config/spex_deps.m.in rename SPEX/{SPEX_Util/Source/SPEX_check_solution.c => Demo/Utilities/spex_demo_check_solution.c} (51%) create mode 100644 SPEX/Demo/Utilities/spex_demo_determine_error.c create mode 100644 SPEX/Demo/Utilities/spex_demo_process_command_line.c create mode 100644 SPEX/Demo/Utilities/spex_demo_read_dense.c create mode 100644 SPEX/Demo/Utilities/spex_demo_tripread.c create mode 100644 SPEX/Demo/spex_demo_backslash.c create mode 100644 SPEX/Demo/spex_demo_cholesky_extended.c create mode 100644 SPEX/Demo/spex_demo_cholesky_simple.c create mode 100644 SPEX/Demo/spex_demo_lu_doub.c rename SPEX/{SPEX_Left_LU/Demo/spexlu_demo.c => Demo/spex_demo_lu_extended.c} (65%) rename SPEX/{SPEX_Left_LU/Demo/example.c => Demo/spex_demo_lu_simple1.c} (67%) rename SPEX/{SPEX_Left_LU/Demo/example2.c => Demo/spex_demo_lu_simple2.c} (59%) create mode 100644 SPEX/Demo/spex_demo_threaded.c create mode 100644 SPEX/Demo/spex_demos.h create mode 100644 SPEX/Doc/appendix_A.pdf create mode 100644 SPEX/Doc/appendix_A.tex rename SPEX/{SPEX_Left_LU/ExampleMats/10teams_mat.txt => ExampleMats/10teams.mat.txt} (100%) rename SPEX/{SPEX_Left_LU/ExampleMats/10teams_v.txt => ExampleMats/10teams.rhs.txt} (100%) create mode 100644 SPEX/ExampleMats/494_bus.mat.txt create mode 100644 SPEX/ExampleMats/494_bus.rhs.txt create mode 100644 SPEX/ExampleMats/LF10.mat.txt create mode 100644 SPEX/ExampleMats/LFAT5.mat.txt rename SPEX/{SPEX_Left_LU/ExampleMats/NSR8K_mat.txt => ExampleMats/NSR8K.mat.txt} (100%) rename SPEX/{SPEX_Left_LU/ExampleMats/NSR8K_v.txt => ExampleMats/NSR8K.rhs.txt} (100%) create mode 100644 SPEX/ExampleMats/README.txt create mode 100644 SPEX/ExampleMats/Trefethen_500.mat.txt create mode 100644 SPEX/ExampleMats/Trefethen_500.rhs.txt create mode 100644 SPEX/ExampleMats/example.mat.txt create mode 100644 SPEX/ExampleMats/example.rhs.txt create mode 100644 SPEX/ExampleMats/mesh1e1.mat.txt create mode 100644 SPEX/ExampleMats/mesh1e1.rhs.txt rename SPEX/{SPEX_Left_LU/ExampleMats/test_mat.txt => ExampleMats/test.mat.txt} (100%) rename SPEX/{SPEX_Left_LU/ExampleMats/test_rhs.txt => ExampleMats/test.rhs.txt} (100%) create mode 100644 SPEX/ExampleMats/test1.mat.txt create mode 100644 SPEX/ExampleMats/test2.mat.txt create mode 100644 SPEX/ExampleMats/test3.mat.txt create mode 100644 SPEX/ExampleMats/test4.mat.txt create mode 100644 SPEX/ExampleMats/test5.mat.txt create mode 100644 SPEX/ExampleMats/tomography.mat create mode 100644 SPEX/ExampleMats/tomography.rhs create mode 100644 SPEX/MATLAB/.gitignore create mode 100644 SPEX/MATLAB/Source/SPEX_mex.h create mode 100644 SPEX/MATLAB/Source/spex_mex_check_for_inf.c create mode 100644 SPEX/MATLAB/Source/spex_mex_error.c rename SPEX/{SPEX_Left_LU/MATLAB/Source/spex_left_lu_mex_get_A_and_b.c => MATLAB/Source/spex_mex_get_A_and_b.c} (70%) rename SPEX/{SPEX_Left_LU/MATLAB/Source/spex_left_lu_get_matlab_options.c => MATLAB/Source/spex_mex_get_matlab_options.c} (77%) create mode 100644 SPEX/MATLAB/spex_backslash.m create mode 100644 SPEX/MATLAB/spex_backslash_mex_soln.c create mode 100644 SPEX/MATLAB/spex_cholesky_backslash.m create mode 100644 SPEX/MATLAB/spex_cholesky_mex_soln.c rename SPEX/{SPEX_Left_LU/MATLAB/SPEX_Left_LU_backslash.m => MATLAB/spex_lu_backslash.m} (87%) rename SPEX/{SPEX_Left_LU/MATLAB/SPEX_Left_LU_mex_soln.c => MATLAB/spex_lu_mex_soln.c} (65%) create mode 100644 SPEX/MATLAB/spex_mex_demo.m create mode 100644 SPEX/MATLAB/spex_mex_install.m create mode 100644 SPEX/MATLAB/spex_mex_test.m create mode 100644 SPEX/Python/.gitignore create mode 100644 SPEX/Python/SPEXpy/Options.py create mode 100644 SPEX/Python/SPEXpy/SPEX_error.py create mode 100644 SPEX/Python/SPEXpy/Source/spex_python_connect.c create mode 100644 SPEX/Python/SPEXpy/Source/spex_python_connect.h create mode 100644 SPEX/Python/SPEXpy/__init__.py create mode 100644 SPEX/Python/SPEXpy/backslash.py create mode 100644 SPEX/Python/SPEXpy/cholesky_backslash.py create mode 100644 SPEX/Python/SPEXpy/lu_backslash.py create mode 100644 SPEX/Python/SPEXpy/setup.py create mode 100644 SPEX/Python/SPEXpy/spex_connect.py create mode 100644 SPEX/Python/SPEXpy/spex_matrix_from_file.py create mode 100644 SPEX/Python/spex_python_demo.py rename SPEX/{SPEX_Util => SPEX_Backslash}/License/CONTRIBUTOR-LICENSE.txt (97%) rename SPEX/{SPEX_Left_LU => SPEX_Backslash}/License/GPLv2.txt (100%) rename SPEX/{SPEX_Left_LU => SPEX_Backslash}/License/lesserv3.txt (100%) rename SPEX/{SPEX_Util => SPEX_Backslash}/License/license.txt (88%) create mode 100644 SPEX/SPEX_Backslash/README.md create mode 100644 SPEX/SPEX_Backslash/Source/SPEX_backslash.c create mode 100644 SPEX/SPEX_Cholesky/License/CONTRIBUTOR-LICENSE.txt rename SPEX/{SPEX_Util => SPEX_Cholesky}/License/GPLv2.txt (100%) rename SPEX/{SPEX_Util => SPEX_Cholesky}/License/lesserv3.txt (100%) create mode 100644 SPEX/SPEX_Cholesky/License/license.txt create mode 100644 SPEX/SPEX_Cholesky/README.txt create mode 100644 SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c create mode 100644 SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c create mode 100644 SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c create mode 100644 SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_backward_sub.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_left_factor.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_pre_left_factor.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c create mode 100644 SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c rename SPEX/{SPEX_Left_LU => SPEX_LU}/License/CONTRIBUTOR-LICENSE.txt (97%) create mode 100644 SPEX/SPEX_LU/License/GPLv2.txt create mode 100644 SPEX/SPEX_LU/License/lesserv3.txt rename SPEX/{SPEX_Left_LU => SPEX_LU}/License/license.txt (82%) rename SPEX/{SPEX_Left_LU => SPEX_LU}/README.md (68%) create mode 100644 SPEX/SPEX_LU/Source/SPEX_lu_analyze.c rename SPEX/{SPEX_Left_LU/Source/SPEX_Left_LU_backslash.c => SPEX_LU/Source/SPEX_lu_backslash.c} (53%) rename SPEX/{SPEX_Left_LU/Source/SPEX_Left_LU_factorize.c => SPEX_LU/Source/SPEX_lu_factorize.c} (68%) create mode 100644 SPEX/SPEX_LU/Source/SPEX_lu_solve.c rename SPEX/{SPEX_Left_LU => SPEX_LU}/Source/spex_left_lu_back_sub.c (65%) rename SPEX/{SPEX_Left_LU => SPEX_LU}/Source/spex_left_lu_dfs.c (77%) rename SPEX/{SPEX_Left_LU => SPEX_LU}/Source/spex_left_lu_forward_sub.c (63%) rename SPEX/{SPEX_Left_LU => SPEX_LU}/Source/spex_left_lu_get_largest_pivot.c (78%) rename SPEX/{SPEX_Left_LU => SPEX_LU}/Source/spex_left_lu_get_nonzero_pivot.c (72%) rename SPEX/{SPEX_Left_LU => SPEX_LU}/Source/spex_left_lu_get_pivot.c (63%) rename SPEX/{SPEX_Left_LU => SPEX_LU}/Source/spex_left_lu_get_smallest_pivot.c (79%) rename SPEX/{SPEX_Left_LU => SPEX_LU}/Source/spex_left_lu_reach.c (71%) rename SPEX/{SPEX_Left_LU => SPEX_LU}/Source/spex_left_lu_ref_triangular_solve.c (77%) create mode 100644 SPEX/SPEX_LU/Source/spex_lu_internal.h delete mode 100644 SPEX/SPEX_Left_LU/Demo/.gitignore delete mode 100644 SPEX/SPEX_Left_LU/Demo/demos.c delete mode 100644 SPEX/SPEX_Left_LU/Demo/demos.h delete mode 100644 SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_demo.m delete mode 100644 SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_install.m delete mode 100644 SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_test.m delete mode 100644 SPEX/SPEX_Left_LU/MATLAB/Source/SPEX_Left_LU_mex.h delete mode 100644 SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_mex_check_for_inf.c delete mode 100644 SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_mex_error.c delete mode 100644 SPEX/SPEX_Left_LU/Source/SPEX_Left_LU_solve.c delete mode 100644 SPEX/SPEX_Left_LU/Source/spex_left_lu_internal.h delete mode 100644 SPEX/SPEX_Left_LU/Source/spex_left_lu_permute_b.c delete mode 100644 SPEX/SPEX_Left_LU/Source/spex_left_lu_permute_x.c delete mode 100644 SPEX/SPEX_Left_LU/Tcov/.gitignore delete mode 100644 SPEX/SPEX_Left_LU/Tcov/Makefile delete mode 100755 SPEX/SPEX_Left_LU/Tcov/covall delete mode 100644 SPEX/SPEX_Left_LU/Tcov/tcov_malloc_test.c delete mode 100644 SPEX/SPEX_Left_LU/Tcov/tcov_malloc_test.h delete mode 100644 SPEX/SPEX_Util/Source/SPEX_LU_analysis_free.c delete mode 100644 SPEX/SPEX_Util/Source/SPEX_LU_analyze.c delete mode 100644 SPEX/SPEX_Util/Source/SPEX_finalize.c delete mode 100644 SPEX/SPEX_Util/Source/SPEX_gmp.h delete mode 100644 SPEX/SPEX_Util/Source/SPEX_initialize.c delete mode 100644 SPEX/SPEX_Util/Source/SPEX_matrix_div.c delete mode 100644 SPEX/SPEX_Util/Source/SPEX_matrix_free.c delete mode 100644 SPEX/SPEX_Util/Source/SPEX_version.c delete mode 100644 SPEX/SPEX_Util/Source/spex_expand_mpfr_array.c delete mode 100644 SPEX/SPEX_Util/Source/spex_expand_mpq_array.c create mode 100644 SPEX/SPEX_Utilities/License/CONTRIBUTOR-LICENSE.txt create mode 100644 SPEX/SPEX_Utilities/License/GPLv2.txt create mode 100644 SPEX/SPEX_Utilities/License/lesserv3.txt create mode 100644 SPEX/SPEX_Utilities/License/license.txt rename SPEX/{SPEX_Util => SPEX_Utilities}/README.md (60%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/SPEX_calloc.c (64%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/SPEX_create_default_options.c (55%) create mode 100644 SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c create mode 100644 SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c create mode 100644 SPEX/SPEX_Utilities/Source/SPEX_finalize.c rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/SPEX_free.c (67%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/SPEX_gmp.c (60%) create mode 100644 SPEX/SPEX_Utilities/Source/SPEX_initialize.c rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/SPEX_initialize_expert.c (51%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/SPEX_malloc.c (62%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/SPEX_matrix_allocate.c (67%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/SPEX_matrix_check.c (72%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/SPEX_matrix_copy.c (79%) create mode 100644 SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/SPEX_matrix_nnz.c (60%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/SPEX_realloc.c (76%) create mode 100644 SPEX/SPEX_Utilities/Source/SPEX_symbolic_analysis_free.c create mode 100644 SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c create mode 100644 SPEX/SPEX_Utilities/Source/SPEX_thread_initialize.c create mode 100644 SPEX/SPEX_Utilities/Source/SPEX_transpose.c create mode 100644 SPEX/SPEX_Utilities/Source/SPEX_version.c create mode 100644 SPEX/SPEX_Utilities/Source/spex_amd.c rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/spex_cast_array.c (79%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/spex_cast_matrix.c (80%) create mode 100644 SPEX/SPEX_Utilities/Source/spex_colamd.c rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/spex_create_mpfr_array.c (60%) create mode 100644 SPEX/SPEX_Utilities/Source/spex_create_mpq.c rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/spex_create_mpq_array.c (70%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/spex_create_mpz_array.c (56%) rename SPEX/{SPEX_Util/Source/SPEX_cumsum.c => SPEX_Utilities/Source/spex_cumsum.c} (73%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/spex_expand_double_array.c (55%) create mode 100644 SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c create mode 100644 SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c create mode 100644 SPEX/SPEX_Utilities/Source/spex_gmp.h rename SPEX/{SPEX_Util/Source/SPEX_matrix_mul.c => SPEX_Utilities/Source/spex_matrix_mul.c} (66%) create mode 100644 SPEX/SPEX_Utilities/Source/spex_permute_dense_matrix.c rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/spex_sparse_collapse.c (81%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/spex_sparse_realloc.c (78%) rename SPEX/{SPEX_Util => SPEX_Utilities}/Source/spex_util_internal.h (57%) rename SPEX/{SPEX_Left_LU => }/Tcov/README.txt (69%) rename SPEX/{SPEX_Left_LU => }/Tcov/cov.awk (100%) create mode 100755 SPEX/Tcov/covall rename SPEX/{SPEX_Left_LU => }/Tcov/cover (100%) rename SPEX/{SPEX_Left_LU => }/Tcov/covs (100%) rename SPEX/{SPEX_Left_LU => }/Tcov/gcovs (86%) create mode 100644 SPEX/Tcov/simple_rand.c create mode 100644 SPEX/Tcov/simple_rand.h create mode 100644 SPEX/Tcov/tcov_for_cholesky.c rename SPEX/{SPEX_Left_LU/Tcov/tcov_test.c => Tcov/tcov_for_lu.c} (74%) create mode 100644 SPEX/Tcov/tcov_for_lu2.c create mode 100644 SPEX/Tcov/tcov_utilities.c create mode 100644 SPEX/Tcov/tcov_utilities.h diff --git a/ChangeLog b/ChangeLog index 0f1eb87902..a4c5e0a35b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,32 @@ +Feb XX, 2024: version 7.7.0 + + * SPEX 3.1.0: major revision to API, new methods. Added SPEX_Cholesky, + SPEX_Backslash, and python interface. MATLAB interface revised. + * Example 1.7.0: revised for change in SPEX API + * SuiteSparse_config: only version number changed to reflect update to + SPEX. + * Package versions in this release: + SuiteSparse_config 7.7.0 + AMD 3.3.1 + BTF 2.3.1 + CAMD 3.3.1 + CCOLAMD 3.3.2 + CHOLMOD 5.2.0 + COLAMD 3.3.2 + CSparse 4.3.1 + CXSparse 4.3.1 + Example 1.7.0 + GraphBLAS 9.0.1 + KLU 2.3.2 + LDL 3.3.1 + LAGraph 1.1.2 + SuiteSparse_Mongoose 3.3.2 + ParU 0.1.2 + RBio 4.3.1 + SPEX 3.1.0 + SPQR 4.3.2 + UMFPACK 6.3.2 + Jan 20, 2024: version 7.6.0 * CHOLMOD 5.2.0: bug fix (restore ABI compatibility with 5.0.x, i.e., 5.2.0 diff --git a/Example/CMakeLists.txt b/Example/CMakeLists.txt index 85cb7d81e0..72ea5b5a5f 100644 --- a/Example/CMakeLists.txt +++ b/Example/CMakeLists.txt @@ -53,10 +53,10 @@ message ( STATUS "MY prefix path: ${CMAKE_PREFIX_PATH}" ) #------------------------------------------------------------------------------- # cmake inserts the date and version number into Include/my.h: -set ( MY_DATE "Jan 20, 2024" ) +set ( MY_DATE "Feb XX, 2024" ) set ( MY_VERSION_MAJOR 1 ) set ( MY_VERSION_MINOR 6 ) -set ( MY_VERSION_PATCH 2 ) +set ( MY_VERSION_PATCH 3 ) message ( STATUS "Building MY library version: v" ${MY_VERSION_MAJOR}. @@ -87,7 +87,7 @@ project ( my #------------------------------------------------------------------------------- # look for all SuiteSparse packages: -find_package ( SuiteSparse_config 7.6.0 REQUIRED ) +find_package ( SuiteSparse_config 7.7.0 REQUIRED ) find_package ( AMD 3.3.1 REQUIRED ) find_package ( BTF 2.3.1 REQUIRED ) find_package ( CAMD 3.3.1 REQUIRED ) @@ -103,7 +103,7 @@ find_package ( LAGraph 1.1.2 ) find_package ( SuiteSparse_Mongoose 3.3.2 REQUIRED ) find_package ( ParU 0.1.2 REQUIRED ) find_package ( RBio 4.3.1 REQUIRED ) -find_package ( SPEX 2.3.2 REQUIRED ) # requires GMP and MPFR +find_package ( SPEX 3.1.0 REQUIRED ) # requires GMP and MPFR find_package ( SPQR 4.3.2 REQUIRED ) find_package ( UMFPACK 6.3.2 REQUIRED ) diff --git a/Example/Include/my.h b/Example/Include/my.h index 1b3cace009..ef071496ee 100644 --- a/Example/Include/my.h +++ b/Example/Include/my.h @@ -11,10 +11,10 @@ // file, since it is constructed from Config/my.h.in by cmake. // version and date for example user library -#define MY_DATE "Jan 20, 2024" +#define MY_DATE "Feb XX, 2024" #define MY_MAJOR_VERSION 1 #define MY_MINOR_VERSION 6 -#define MY_PATCH_VERSION 2 +#define MY_PATCH_VERSION 3 #ifdef __cplusplus extern "C" { diff --git a/Example/Source/my.c b/Example/Source/my.c index a1cfce66ae..83caa38f13 100644 --- a/Example/Source/my.c +++ b/Example/Source/my.c @@ -374,7 +374,8 @@ int my_function (void) // returns 0 on success, -1 on failure //-------------------------------------------------------------------------- OK (SPEX_initialize ( ) == SPEX_OK) ; - SPEX_version (version) ; + char spex_date [128] ; + OK (SPEX_version (version, spex_date) == SPEX_OK) ; OK (my_check_version ("SPEX", SPEX_VERSION_MAJOR, SPEX_VERSION_MINOR, SPEX_VERSION_SUB, SPEX_DATE, version, SPEX__VERSION)) ; diff --git a/Example/Source/my_cxx.cc b/Example/Source/my_cxx.cc index bb4df525ad..ffeb1484bd 100644 --- a/Example/Source/my_cxx.cc +++ b/Example/Source/my_cxx.cc @@ -381,7 +381,8 @@ int my_function (void) // returns 0 on success, -1 on failure //-------------------------------------------------------------------------- OK (SPEX_initialize ( ) == SPEX_OK) ; - SPEX_version (version) ; + char spex_date [128] ; + OK (SPEX_version (version, spex_date) == SPEX_OK) ; OK (my_check_version ("SPEX", SPEX_VERSION_MAJOR, SPEX_VERSION_MINOR, SPEX_VERSION_SUB, SPEX_DATE, version, SPEX__VERSION)) ; diff --git a/README.md b/README.md index 29c74df122..d352271356 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ SuiteSparse: A Suite of Sparse matrix packages at http://suitesparse.com ----------------------------------------------------------------------------- -Jan 20, 2024, SuiteSparse VERSION 7.6.0 +Feb XX, 2024, SuiteSparse VERSION 7.7.0 SuiteSparse is a set of sparse-matrix-related packages written or co-authored by Tim Davis, available at https://github.com/DrTimothyAldenDavis/SuiteSparse . diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index bf95b7e4b4..89cb2fd554 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -2,7 +2,7 @@ # SuiteSparse/SPEX/CMakeLists.txt: cmake for SPEX #------------------------------------------------------------------------------- -# SPEX_Left_LU: (c) 2019-2024, Chris Lourenco (US Naval Academy), Jinhao Chen, +# SPEX: (c) 2019-2024, Chris Lourenco (US Naval Academy), Jinhao Chen, # Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. # SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later @@ -12,10 +12,10 @@ cmake_minimum_required ( VERSION 3.22 ) -set ( SPEX_DATE "Jan 20, 2024" ) -set ( SPEX_VERSION_MAJOR 2 CACHE STRING "" FORCE ) -set ( SPEX_VERSION_MINOR 3 CACHE STRING "" FORCE ) -set ( SPEX_VERSION_SUB 2 CACHE STRING "" FORCE ) +set ( SPEX_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 +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}. @@ -45,10 +45,10 @@ include ( SuiteSparsePolicy ) #------------------------------------------------------------------------------- if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) - find_package ( SuiteSparse_config 7.6.0 + 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.6.0 REQUIRED ) + find_package ( SuiteSparse_config 7.7.0 REQUIRED ) endif ( ) find_package ( AMD 3.3.1 @@ -82,8 +82,12 @@ configure_file ( "Config/SPEX_version.tex.in" # include directories #------------------------------------------------------------------------------- -include_directories ( SPEX_Left_LU/Source SPEX_Util/Source Include - SPEX_Left_LU/Demo ) +include_directories ( Include + SPEX_Backslash/Source SPEX_Cholesky/Source SPEX_LU/Source + SPEX_Utilities/Source + ${SUITESPARSE_CONFIG_INCLUDE_DIR} + ${GMP_INCLUDE_DIR} ${MPFR_INCLUDE_DIR} + ${AMD_INCLUDE_DIR} ${COLAMD_INCLUDE_DIR} ) #------------------------------------------------------------------------------- # dynamic spex library properties @@ -338,6 +342,36 @@ if ( NOT MSVC ) DESTINATION ${SUITESPARSE_PKGFILEDIR}/pkgconfig ) endif ( ) +#------------------------------------------------------------------------------- +# python interface +#------------------------------------------------------------------------------- + +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 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} ) + +# GMP: +# must occur after MPFR +target_link_libraries ( spexpython PUBLIC ${GMP_LIBRARIES} ) + +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} ) + #------------------------------------------------------------------------------- # Demo library and programs #------------------------------------------------------------------------------- @@ -354,21 +388,38 @@ if ( SUITESPARSE_DEMOS ) # Demo programs #--------------------------------------------------------------------------- - add_executable ( spexlu_demo "SPEX_Left_LU/Demo/spexlu_demo.c" - "SPEX_Left_LU/Demo/demos.c" ) - add_executable ( example "SPEX_Left_LU/Demo/example.c" ) - add_executable ( example2 "SPEX_Left_LU/Demo/example2.c" - "SPEX_Left_LU/Demo/demos.c" ) + include_directories ( Demo ) + file ( GLOB SPEX_DEMO_SOURCES "Demo/Utilities/*.c" ) + + add_executable ( spex_demo_backslash "Demo/spex_demo_backslash.c" ${SPEX_DEMO_SOURCES} ) + add_executable ( spex_demo_cholesky_extended "Demo/spex_demo_cholesky_extended.c" ${SPEX_DEMO_SOURCES} ) + add_executable ( spex_demo_cholesky_simple "Demo/spex_demo_cholesky_simple.c" ${SPEX_DEMO_SOURCES} ) + add_executable ( spex_demo_lu_doub "Demo/spex_demo_lu_doub.c" ${SPEX_DEMO_SOURCES} ) + add_executable ( spex_demo_lu_extended "Demo/spex_demo_lu_extended.c" ${SPEX_DEMO_SOURCES} ) + add_executable ( spex_demo_lu_simple1 "Demo/spex_demo_lu_simple1.c" ${SPEX_DEMO_SOURCES} ) + add_executable ( spex_demo_lu_simple2 "Demo/spex_demo_lu_simple2.c" ${SPEX_DEMO_SOURCES} ) + 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 ( spexlu_demo PUBLIC SPEX ) - target_link_libraries ( example PUBLIC SPEX ) - target_link_libraries ( example2 PUBLIC SPEX ) + target_link_libraries ( spex_demo_backslash PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) + target_link_libraries ( spex_demo_cholesky_extended PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) + target_link_libraries ( spex_demo_cholesky_simple PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) + target_link_libraries ( spex_demo_lu_doub PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) + target_link_libraries ( spex_demo_lu_extended PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) + target_link_libraries ( spex_demo_lu_simple1 PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) + target_link_libraries ( spex_demo_lu_simple2 PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) + target_link_libraries ( spex_demo_threaded PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) + else ( ) - target_link_libraries ( spexlu_demo PUBLIC SPEX_static ) - target_link_libraries ( example PUBLIC SPEX_static ) - target_link_libraries ( example2 PUBLIC SPEX_static ) + target_link_libraries ( spex_demo_backslash PUBLIC SPEX_static ) + target_link_libraries ( spex_demo_cholesky_extended PUBLIC SPEX_static ) + target_link_libraries ( spex_demo_cholesky_simple PUBLIC SPEX_static ) + target_link_libraries ( spex_demo_lu_doub PUBLIC SPEX_static ) + target_link_libraries ( spex_demo_lu_extended PUBLIC SPEX_static ) + target_link_libraries ( spex_demo_lu_simple1 PUBLIC SPEX_static ) + target_link_libraries ( spex_demo_lu_simple2 PUBLIC SPEX_static ) + target_link_libraries ( spex_demo_threaded PUBLIC SPEX_static ) endif ( ) else ( ) @@ -377,8 +428,70 @@ else ( ) 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_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 ) + #------------------------------------------------------------------------------- # report status #------------------------------------------------------------------------------- include ( SuiteSparseReport ) + diff --git a/SPEX/Config/SPEX.h.in b/SPEX/Config/SPEX.h.in index 6f46f2f110..11c2455334 100644 --- a/SPEX/Config/SPEX.h.in +++ b/SPEX/Config/SPEX.h.in @@ -1,176 +1,20 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/Include/SPEX.h: user #include file for SPEX_Left_LU. +// SPEX/Include/SPEX.h: Include file for SPEX Library //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2023, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ -#ifndef SPEX_LEFT_LU_H -#define SPEX_LEFT_LU_H +#ifndef SPEX_H +#define SPEX_H -// This software package exactly solves a sparse system of linear equations -// using the SPEX Left LU factorization. This code accompanies the paper (submitted -// to ACM Transactions on Mathematical Software): -// "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, ACM Trans. Mathematical Software, -// June 2022. https://doi.org/10.1145/3519024 - -// The theory associated with this software can be found in the paper -// (published in SIAM journal on matrix analysis and applications): - -// "Exact Solution of Sparse Linear Systems via Left-Looking -// Roundoff-Error-Free LU Factorization in Time Proportional to -// Arithmetic Work", C. Lourenco, A. R. Escobedo, E. Moreno-Centeno, -// T. Davis, SIAM J. Matrix Analysis and Applications. pp 609-638, -// vol 40, no 2, 2019. - -// 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 Left LU for a publication, we request that you please cite -// the above two papers. - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//-------------------------Authors---------------------------------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -// Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy Davis -// - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//-------------------------Contact Information---------------------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -// Please contact Chris Lourenco (chrisjlourenco@gmail.com) -// or Tim Davis (timdavis@aldenmath.com, DrTimothyAldenDavis@gmail.com, -// davis@tamu.edu) - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//-------------------------Copyright-------------------------------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -// SPEX Left LU 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. -// -// See license.txt for license info. -// -// This software is copyright by Christopher Lourenco, Jinhao Chen, Erick -// Moreno-Centeno and Timothy A. Davis. All Rights Reserved. -// - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//---------------------------DISCLAIMER----------------------------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -// SPEX Left LU 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. - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//--------------------------Summary--------------------------------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -// This software package solves the linear system Ax = b exactly. The input -// matrix and right hand side vectors are stored as either integers, double -// precision numbers, multiple precision floating points (through the mpfr -// library) or as rational numbers (as a collection of numerators and -// denominators using the GMP mpq_t data structure). Appropriate routines -// within the code transform the input into an integral matrix in compressed -// column form. - -// This package computes the factorization PAQ = LDU. Note that we store the -// "functional" form of the factorization by only storing L and U. The user -// is given some freedom to select the permutation matrices P and Q. The -// recommended default settings select Q using the COLAMD column ordering -// and select P via a partial pivoting scheme in which the diagonal entry -// in column k is selected if it is the same magnitude as the smallest -// entry, otherwise the smallest entry is selected as the kth pivot. -// Alternative strategies allowed to select Q include the AMD column -// ordering or no column permutation (Q=I). For pivots, there are a variety -// of potential schemes including traditional partial pivoting, diagonal -// pivoting, tolerance pivoting etc. This package does not allow pivoting -// based on sparsity criterion. - -// The factors L and U are computed via integer preserving operations via -// integer-preserving Gaussian elimination. The key part of this algorithm -// is a Roundoff Error Free (REF) sparse triangular solve function which -// exploits sparsity to reduce the number of operations that must be -// performed. - -// Once L and U are computed, a simplified version of the triangular solve -// is performed which assumes the vector b is dense. The final solution -// vector x is gauranteed to be exact. This vector can be output in one of -// three ways: 1) full precision rational arithmetic (as a sequence of -// numerators and denominators) using the GMP mpq_t data type, 2) double -// precision while not exact will produce a solution accurate to machine -// roundoff unless the size of the associated solution exceeds double -// precision (i.e., the solution is 10^500 or something), 3) variable -// precision floating point using the GMP mpfr_t data type. The associated -// precision is user defined. - - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//---------------------Include files required by SPEX Left LU------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -#include -#include -#include -#include -#include -#include -#include -#include "SuiteSparse_config.h" -// #include "SPEX_Util.h" - - -//------------------------------------------------------------------------------ -// SPEX_Util/Include/SPEX_Util.h: Include file for utility functions for SPEX -//------------------------------------------------------------------------------ - -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -#ifndef SPEX_UTIL_H -#define SPEX_UTIL_H - -// SPEX_Util is a collection of utility functions for the SParse EXact package. -// Included are several routines for memory management, matrix operations, and +// SPEX is a collection of functions for the SParse EXact package. +// Included are several routines for memory management, matrix operations, and // wrappers to the GMP library. // // This is the global include file and should be included in all SPEX_* packages @@ -181,9 +25,10 @@ //-------------------------Authors---------------------------------------------- //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// Unless otherwise noted all Utility functions are authored by: +// Unless otherwise noted all functions are authored by: // -// Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy Davis +// Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis // //------------------------------------------------------------------------------ @@ -192,8 +37,10 @@ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// Please contact Chris Lourenco (chrisjlourenco@gmail.com, lourenco@usna.edu) -// or Tim Davis (timdavis@aldenmath.com, DrTimothyAldenDavis@gmail.com, +// Please contact +// Chris Lourenco (chrisjlourenco@gmail.com, lourenco@usna.edu) +// or +// Tim Davis (timdavis@aldenmath.com, DrTimothyAldenDavis@gmail.com, // davis@tamu.edu) //------------------------------------------------------------------------------ @@ -219,8 +66,9 @@ // // See license.txt for license info. // -// This software is copyright by Christopher Lourenco, Jinhao Chen, Erick -// Moreno-Centeno and Timothy A. Davis. All Rights Reserved. +// This software is copyright by Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno and Timothy A. Davis. +// All Rights Reserved. // //------------------------------------------------------------------------------ @@ -234,41 +82,47 @@ // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. - //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //---------------------Include files required by SPEX -------------------------- //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// #include -// #include -// #include -// #include -// #include -// #include -// #include -#include -#include -// #include -#include -#include +#include +#include +#include +#include +#include +#include +#include +// #include +// #include +// #include +// #include #include "SuiteSparse_config.h" //------------------------------------------------------------------------------ -// Version +// SPEX Version //------------------------------------------------------------------------------ +// Current version of the code #define SPEX_DATE "@SPEX_DATE@" -#define SPEX_VERSION "@SPEX_VERSION_MAJOR@.@SPEX_VERSION_MINOR@.@SPEX_VERSION_SUB@" +#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,6,0)) -#error "SPEX @SPEX_VERSION_MAJOR@.@SPEX_VERSION_MINOR@.@SPEX_VERSION_SUB@ requires SuiteSparse_config 7.6.0 or later" + (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 ) @@ -276,12 +130,6 @@ extern "C" { #endif -//------------------------------------------------------------------------------ -// version -//------------------------------------------------------------------------------ - -void SPEX_version (int version [3]) ; - //------------------------------------------------------------------------------ // Error codes //------------------------------------------------------------------------------ @@ -292,49 +140,100 @@ void SPEX_version (int version [3]) ; typedef enum { - SPEX_OK = 0, // all is well - SPEX_OUT_OF_MEMORY = -1, // out of memory - SPEX_SINGULAR = -2, // the input matrix A is singular - SPEX_INCORRECT_INPUT = -3, // one or more input arguments are incorrect - SPEX_INCORRECT = -4, // The solution is incorrect - SPEX_UNSYMMETRIC = -5, // The input matrix is unsymmetric (for Cholesky) - SPEX_PANIC = -6 // SPEX used without proper initialization + + SPEX_OK = 0, // all is well + SPEX_OUT_OF_MEMORY = -1, // out of memory + SPEX_SINGULAR = -2, // the input matrix A is singular + SPEX_INCORRECT_INPUT = -3, // one or more input arguments are incorrect + SPEX_NOTSPD = -4, // The input matrix is not symmetric positive + // definite (for a Cholesky factorization) + SPEX_INCORRECT_ALGORITHM = -5,// The algorithm is not compatible with + // the factorization + SPEX_PANIC = -6 // SPEX used without proper initialization, + // or other unrecoverable error } SPEX_info ; +//------------------------------------------------------------------------------ +// SPEX Version, continued +//------------------------------------------------------------------------------ + +SPEX_info SPEX_version +( + int version [3], // SPEX major, minor, and sub version + char date [128] // date of this version +) ; + +// Requirements: SPEX requires GMP 6.1.2 or later, and MPFR 4.0.2 or later. +// NOTE that these version numbers are from the original source distributions. +// It is NOT the "number 10" assigned to libgmp.so.10 in the Ubuntu linux +// distro. + +// GMP v6.1.2 or later is required: +#if __GNU_MP_RELEASE < 60102 +#error "GMP v6.1.2 or later is required." +#endif + +// MPFR v4.0.2 or later is required: +#if MPFR_VERSION < MPFR_VERSION_NUM(4,0,2) +#error "MPFR v4.0.2 or later is required." +#endif + //------------------------------------------------------------------------------ // Pivot scheme codes //------------------------------------------------------------------------------ +// SPEX_DEFAULT is only used to define the defaults for the following enums but +// in all other places we use the appropiate default (ie SPEX_DEFAULT_ORDERING) +// for ease of reading +#define SPEX_DEFAULT 0 + // A code in SPEX_options to tell SPEX what type of pivoting to use for pivoting // in unsymmetric LU factorization. typedef enum { - SPEX_SMALLEST = 0, // Smallest pivot + SPEX_SMALLEST = SPEX_DEFAULT, // Smallest pivot (the default method) SPEX_DIAGONAL = 1, // Diagonal pivoting SPEX_FIRST_NONZERO = 2, // First nonzero per column chosen as pivot SPEX_TOL_SMALLEST = 3, // Diagonal pivoting with tol for smallest pivot. - // (Default) SPEX_TOL_LARGEST = 4, // Diagonal pivoting with tol. for largest pivot SPEX_LARGEST = 5 // Largest pivot } SPEX_pivot ; //------------------------------------------------------------------------------ -// Column ordering scheme codes +// Fill-reducing ordering scheme codes +//------------------------------------------------------------------------------ + +// A code in SPEX_options to tell SPEX which fill-reducing ordering to used +// prior to exact factorization + +typedef enum +{ + SPEX_DEFAULT_ORDERING = SPEX_DEFAULT, // Default: colamd for LU + // AMD for Cholesky + SPEX_NO_ORDERING = 1, // None: A is factorized as-is + SPEX_COLAMD = 2, // COLAMD: Default for LU (and QR in the FUTURE) + SPEX_AMD = 3 // AMD: Default for Cholesky +} +SPEX_preorder ; + +//------------------------------------------------------------------------------ +// Factorization type codes //------------------------------------------------------------------------------ -// A code in SPEX_options to tell SPEX which column ordering to used prior to -// exact factorization +// A code in SPEX_options to tell SPEX which factorization algorithm to use typedef enum { - SPEX_NO_ORDERING = 0, // None: A is factorized as-is - SPEX_COLAMD = 1, // COLAMD: Default - SPEX_AMD = 2 // AMD + SPEX_ALGORITHM_DEFAULT = SPEX_DEFAULT, // Defaults: Left for LU, + // Up for Chol + SPEX_LU_LEFT = 1, // Left looking LU factorization + SPEX_CHOL_LEFT = 2, // Left looking Cholesky factorization + SPEX_CHOL_UP = 3 // Up looking Cholesky factorization } -SPEX_col_order ; +SPEX_factorization_algorithm ; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -344,26 +243,52 @@ SPEX_col_order ; // This struct serves as a global struct to define all user-selectable options. -typedef struct SPEX_options +typedef struct { - SPEX_pivot pivot ; // row pivoting scheme used. - SPEX_col_order order ; // column ordering scheme used - double tol ; // tolerance for the row-pivotin methods + SPEX_pivot pivot ; // row pivoting scheme used (LU only) + SPEX_preorder order ; // ordering scheme used + double tol ; // tolerance for the row-pivoting methods for LU. // SPEX_TOL_SMALLEST and SPEX_TOL_LARGEST int print_level ; // 0: print nothing, 1: just errors, - // 2: terse (basic stats from COLAMD/AMD and - // SPEX Left LU), 3: all, with matrices and results - int32_t prec ; // Precision used to output file if MPFR is chosen + // 2: terse (basic stats from COLAMD/AMD and the + // factorization), 3: all, with matrices and results + uint64_t prec ; // Precision for MPFR mpfr_rnd_t round ; // Type of MPFR rounding used - bool check ; // Set true if the solution to the system should be - // checked. Intended for debugging only; SPEX is - // guaranteed to return the exact solution. -} SPEX_options ; + SPEX_factorization_algorithm algo ; // parameter which tells the function + // which factorization algorithm to use +} SPEX_options_struct ; + +// A SPEX_options object is a pointer to a SPEX_options_struct +typedef SPEX_options_struct *SPEX_options ; // Purpose: Create SPEX_options object with default parameters // upon successful allocation, which are defined in SPEX_util_nternal.h -// To free it, simply use SPEX_FREE (*option). -SPEX_info SPEX_create_default_options (SPEX_options **option) ; +// To free it, simply use SPEX_FREE (option). + +SPEX_info SPEX_create_default_options (SPEX_options *option_handle) ; + + +//------------------------------------------------------------------------------ +// SPEX_vector +//------------------------------------------------------------------------------ + +// 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. + +typedef struct +{ + int64_t nz; // number of explicit entries in the vector + int64_t nzmax;// size of array i and x, nz <= nzmax + int64_t *i; // array of size nzmax that contains the column/row indices + // of each nnz. + mpz_t *x; // array of size nzmax that contains the values of each nnz + mpq_t scale; // a scale factor that has not applied to entries in this v. + // The real value of the k-th nonzero entry in the list should + // be computed as x[k]*scale. x[k]/den(scale) must be integer. +} SPEX_vector_struct ; + +// A SPEX_vector is a pointer to a SPEX_vector_struct +typedef SPEX_vector_struct *SPEX_vector ; //------------------------------------------------------------------------------ @@ -371,18 +296,19 @@ SPEX_info SPEX_create_default_options (SPEX_options **option) ; //------------------------------------------------------------------------------ // SPEX uses a single matrix data type, SPEX_matrix, which can be held in -// one of three kinds of formats: sparse CSC (compressed sparse column), -// sparse triplet, and dense: +// one of four kinds of formats: sparse CSC (compressed sparse column), +// sparse triplet, dense, and sparse dynamic CSC. 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 + SPEX_DENSE = 2, // matrix is in dense format (held by column) } SPEX_kind ; -// Each of the three formats can have values of 5 different data types: mpz_t, +// The last format (SPEX_DYNAMIC_CSC) only support mpz_t type, while each of +// the first three formats can have values of 5 different data types: mpz_t, // mpq_t, mpfr_t, int64_t, and double: typedef enum @@ -395,8 +321,10 @@ typedef enum } SPEX_type ; -// This gives a total of 15 different matrix types. Not all functions accept -// all 15 matrices types, however. +// This gives a total of 16 different matrix types: +// (sparse CSC, triplet, dense) x (5 data types) = 15 formats, + +// Not all functions accept all 16 matrices types, however. // Suppose A is an m-by-n matrix with nz <= nzmax entries. // The p, i, j, and x components are defined as: @@ -419,34 +347,45 @@ 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. - +// // 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->p_shallow has no effect. typedef struct { + SPEX_kind kind ; // CSC, triplet, dense + SPEX_type type ; // mpz, mpq, mpfr, int64, or fp64 (double) + + int64_t m ; // number of rows int64_t n ; // number of columns - int64_t nzmax ; // size of A->i, A->j, and A->x + + mpq_t scale ; // scale factor for mpz matrices (never shallow) + // For all matrices whose type is not mpz, + // mpz_scale = 1. + // The real value of the nonzero entry A(i,j) + // should be computed as A(i,j)/scale. + + //-------------------------------------------------------------------------- + // 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 and dense matrices. - SPEX_kind kind ; // CSC, triplet, or dense - SPEX_type type ; // mpz, mpq, mpfr, int64, or fp64 (double) + // 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. - bool p_shallow ; // if true, A->p is shallow. int64_t *i ; // if CSC or triplet: row indices, of size nzmax. // if dense: A->i is NULL. - bool i_shallow ; // if true, A->i is shallow. + int64_t *j ; // if triplet: column indices, of size nzmax. // if CSC or dense: A->j is NULL. - bool j_shallow ; // if true, A->j is shallow. union // A->x.type has size nzmax. { @@ -456,45 +395,71 @@ typedef struct int64_t *int64 ; // A->x.int64 double *fp64 ; // A->x.fp64 } x ; + + //-------------------------------------------------------------------------- + // This component is only used for SPEX_DYNAMIC_CSC matrix, and ignored for + // CSC, triplet and dense matrix, for a future version of SPEX. + //-------------------------------------------------------------------------- + + SPEX_vector *v; // In this version of SPEX, v is always NULL, and + // should not be used. + + //-------------------------------------------------------------------------- + // flags to indicate if any component is shallow + //-------------------------------------------------------------------------- + + bool p_shallow ; // if true, A->p is shallow. + bool i_shallow ; // if true, A->i is shallow. + bool j_shallow ; // if true, A->j is shallow. bool x_shallow ; // if true, A->x.type is shallow. - mpq_t scale ; // scale factor for mpz matrices (never shallow) - // For all matrices who's type is not mpz, - // mpz_scale = 1. +} SPEX_matrix_struct ; -} SPEX_matrix ; +// A SPEX_matrix is a pointer to a SPEX_matrix_struct +typedef SPEX_matrix_struct *SPEX_matrix ; //------------------------------------------------------------------------------ // SPEX_matrix_allocate: allocate an m-by-n SPEX_matrix //------------------------------------------------------------------------------ +// 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). + +// 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 shallow is false: All components (p,i,j,x) are allocated and set to zero, // and then shallow flags are all false. // if shallow is true: All components (p,i,j,x) are NULL, and their shallow -// flags are all true. The user can then set A->p, -// A->i, A->j, and/or A->x accordingly, from their own -// arrays. +// flags are all true. SPEX_info SPEX_matrix_allocate ( - SPEX_matrix **A_handle, // matrix to allocate - SPEX_kind kind, // CSC, triplet, or dense + SPEX_matrix *A_handle, // matrix to allocate + SPEX_kind kind, // CSC, triplet, dense (and a future dynamic CSC) SPEX_type type, // mpz, mpq, mpfr, int64, or double int64_t m, // # of rows int64_t n, // # of columns - int64_t nzmax, // max # of entries + int64_t nzmax, // max # of entries for CSC or triplet + // (ignored if A is dense) bool shallow, // if true, matrix is shallow. A->p, A->i, A->j, // A->x are all returned as NULL and must be set // by the caller. All A->*_shallow are returned - // as true. + // as true. Ignored if kind is dynamic_CSC. bool init, // If true, and the data types are mpz, mpq, or // mpfr, the entries are initialized (using the // appropriate SPEX_mp*_init function). If false, - // the mpz, mpq, and mpfr arrays are allocated but - // not initialized. Meaningless for data types - // FP64 or INT64 - const SPEX_options *option + // the mpz, mpq, and mpfr arrays are malloced but + // not initialized. Utilized internally to reduce + // memory. Ignored if shallow is true. + const SPEX_options option ) ; //------------------------------------------------------------------------------ @@ -503,19 +468,29 @@ SPEX_info SPEX_matrix_allocate SPEX_info SPEX_matrix_free ( - SPEX_matrix **A_handle, // matrix to free - const SPEX_options *option + SPEX_matrix *A_handle, // matrix to free + const SPEX_options option ) ; //------------------------------------------------------------------------------ // SPEX_matrix_nnz: # of entries in a matrix //------------------------------------------------------------------------------ -SPEX_info SPEX_matrix_nnz // find the # of entries in A +SPEX_info SPEX_matrix_nnz // find the # of entries in A +( + int64_t *nnz, // # of entries in A, -1 if A is NULL + const SPEX_matrix A, // matrix to query + const SPEX_options option // command options, currently unused +) ; + +//------------------------------------------------------------------------------ +// SPEX_matrix_check: check and print a SPEX_matrix +//------------------------------------------------------------------------------ + +SPEX_info SPEX_matrix_check // returns a SPEX status code ( - int64_t *nnz, // # of entries in A, -1 if A is NULL - const SPEX_matrix *A, // matrix to query - const SPEX_options *option + const SPEX_matrix A, // matrix to check + const SPEX_options option ) ; //------------------------------------------------------------------------------ @@ -524,68 +499,174 @@ SPEX_info SPEX_matrix_nnz // find the # of entries in A // 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). + SPEX_info SPEX_matrix_copy ( - SPEX_matrix **C_handle, // matrix to create (never shallow) + SPEX_matrix *C_handle, // matrix to create (never shallow) // inputs, not modified: - SPEX_kind C_kind, // C->kind: CSC, triplet, or dense + SPEX_kind C_kind, // C->kind: CSC, triplet, dense, + // (or future dynamic CSC) SPEX_type C_type, // C->type: mpz_t, mpq_t, mpfr_t, int64_t, or double - SPEX_matrix *A, // matrix to make a copy of (may be shallow) - const SPEX_options *option + const SPEX_matrix A, // matrix to make a copy of (may be shallow) + const SPEX_options option ) ; //------------------------------------------------------------------------------ -// SPEX_matrix macros +// SPEX symbolic analysis and factorization //------------------------------------------------------------------------------ -// 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) +typedef enum +{ + SPEX_LU_FACTORIZATION = 0, // LU factorization + SPEX_CHOLESKY_FACTORIZATION = 1, // Cholesky factorization + SPEX_QR_FACTORIZATION = 2 // QR factorization (FUTURE) +} +SPEX_factorization_kind ; //------------------------------------------------------------------------------ -// SPEX_LU_analysis: symbolic pre-analysis +// SPEX_symbolic_analysis: symbolic pre-analysis //------------------------------------------------------------------------------ -// This struct stores the column permutation for LU and the estimate of the -// number of nonzeros in L and U. +// This struct stores the results of symbolic analysis + +// This object is constructed by SPEX_lu_analyze and SPEX_cholesky_analyze. +// All these functions allocate space and assign values, and thus do not +// require user to perform any memory allocation. Certain components of this +// object can still be NULL after it is constructed. User can access (read or +// print) components of this object, but should not try to modify any of them +// other than calling SPEX_symbolic_analysis_free to free the memory space. typedef struct { - int64_t *q ; // Column permutation for LU factorization, representing - // the permutation matrix Q. The matrix A*Q is factorized. - // If the kth column of L, U, and A*Q is column j of the - // unpermuted matrix A, then j = S->q [k]. - int64_t lnz ; // Approximate number of nonzeros in L. - int64_t unz ; // Approximate number of nonzeros in U. - // lnz and unz are used to allocate the initial space for - // L and U; the space is reallocated as needed. -} SPEX_LU_analysis ; - -// The symbolic analysis object is created by SPEX_LU_analyze. - -// SPEX_LU_analysis_free frees the SPEX_LU_analysis object. -SPEX_info SPEX_LU_analysis_free + SPEX_factorization_kind kind; // LU, Cholesky (or QR in the FUTURE) + + //-------------------------------------------------------------------------- + // The permutations of the matrix that are found during the symbolic + // analysis process. One or more of these permutations could be NULL for + // some SPEX_symbolic_analysis_kind. Specifically, + // For kind == SPEX_LU_FACTORIZATION, only Q_perm is not NULL. + // For kind == SPEX_CHOLESKY_FACTORIZATION, both Q_perm and Qinv_perm are + // NULL. + //-------------------------------------------------------------------------- + int64_t *P_perm; // row permutation + int64_t *Pinv_perm; // inverse of row permutation + + int64_t *Q_perm; // column permutation + int64_t *Qinv_perm; // inverse of column permutation + + //-------------------------------------------------------------------------- + // estimates of nonzeros that will apprear in the factorization + //-------------------------------------------------------------------------- + + int64_t lnz ; // Approximate number of nonzeros in L. + // Available only for SPEX_LU_FACTORIZATION + // or SPEX_CHOLESKY_FACTORIZATION. + int64_t unz ; // Approximate number of nonzeros in U. + // lnz and unz are used to allocate + // the initial space for L and U; the + // space is reallocated as needed. + // Available only for SPEX_LU_FACTORIZATION. + + //-------------------------------------------------------------------------- + // These are only used in the Cholesky analysis process + //-------------------------------------------------------------------------- + int64_t *parent; // Elimination tree of target matrix + // for Cholesky factorization. + int64_t *cp; // column pointers of L for Cholesky + // factorization. + +} SPEX_symbolic_analysis_struct ; + +// A SPEX_symbolic_analysis object is a pointer to a +// SPEX_symbolic_analysis_struct +typedef SPEX_symbolic_analysis_struct *SPEX_symbolic_analysis ; + +//------------------------------------------------------------------------------ +// SPEX_symbolic_analysis_free frees the SPEX_symbolic_analysis object. +//------------------------------------------------------------------------------ + +SPEX_info SPEX_symbolic_analysis_free ( - SPEX_LU_analysis **S, // Structure to be deleted - const SPEX_options *option + SPEX_symbolic_analysis *S_handle, // Structure to be deleted + const SPEX_options option ) ; -// SPEX_LU_analyze performs the symbolic ordering and analysis for LU factorization. -// Currently, there are three options: no ordering, COLAMD, and AMD. -SPEX_info SPEX_LU_analyze +//------------------------------------------------------------------------------ +// SPEX_factorization: data structure for factorization +//------------------------------------------------------------------------------ + +// The SPEX_factorization object holds an LU, Cholesky, or (in the future) QR +// 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, or +// SPEX_cholesky_factorize. All these function will create a +// static factorization of corresponding kind. +// +// To free the factorization object, simply call SPEX_factorization_free. + +typedef struct +{ + SPEX_factorization_kind kind; // LU, Cholesky, QR factorization + + bool updatable; // flag to denote if the factorization + // is in the updatable format + // (for a future SPEX version) + + mpq_t scale_for_A; // the scale of the target matrix + + //-------------------------------------------------------------------------- + // These are used for LU or Cholesky factorization, but ignored for QR + // factorization. + //-------------------------------------------------------------------------- + + SPEX_matrix L; // The lower-triangular matrix from LU + // or Cholesky factorization. + SPEX_matrix U; // The upper-triangular matrix from LU + // factorization. NULL for Cholesky + // factorization. + SPEX_matrix rhos; // A n-by-1 dense matrix for the + // pivot values + + + //-------------------------------------------------------------------------- + // The permutations of the matrix that are used during the factorization. + // 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 + // For kind == SPEX_CHOLESKY_FACTORIZATION, both Q_perm and Qinv_perm are + // NULL. + //-------------------------------------------------------------------------- + + int64_t *P_perm; // row permutation + int64_t *Pinv_perm; // inverse of row permutation + + int64_t *Q_perm; // column permutation + int64_t *Qinv_perm; // inverse of column permutation + +} SPEX_factorization_struct ; + +// A SPEX_factorization is a pointer to a SPEX_factorization_struct +typedef SPEX_factorization_struct *SPEX_factorization ; + +//------------------------------------------------------------------------------ +// SPEX_factorization_free frees the SPEX_factorization object. +//------------------------------------------------------------------------------ + +SPEX_info SPEX_factorization_free ( - SPEX_LU_analysis **S, // symbolic analysis (column permutation and nnz L,U) - const SPEX_matrix *A, // Input matrix - const SPEX_options *option // Control parameters + SPEX_factorization *F_handle, // Structure to be deleted + const SPEX_options option ) ; - //------------------------------------------------------------------------------ // Memory management //------------------------------------------------------------------------------ @@ -595,6 +676,7 @@ SPEX_info SPEX_LU_analyze // SuiteSparse_free. // Allocate and initialize memory space for SPEX + void *SPEX_calloc ( size_t nitems, // number of items to allocate @@ -602,12 +684,14 @@ void *SPEX_calloc ) ; // Allocate memory space for SPEX + void *SPEX_malloc ( size_t size // size of memory space to allocate ) ; // Free the memory allocated by SPEX_calloc, SPEX_malloc, or SPEX_realloc. + void SPEX_free ( void *p // pointer to memory space to free @@ -655,81 +739,73 @@ void *SPEX_realloc // pointer to reallocated block, or original block ) ; //------------------------------------------------------------------------------ -// SPEX memory environment routines +// SPEX environment routines //------------------------------------------------------------------------------ // SPEX_initialize: initializes the working evironment for SPEX library. // It must be called prior to calling any other SPEX_* function. -SPEX_info SPEX_initialize (void) ; + +SPEX_info SPEX_initialize ( void ) ; // SPEX_initialize_expert is the same as SPEX_initialize, except that it allows // for a redefinition of custom memory functions that are used for SPEX and // GMP. The four inputs to this function are pointers to four functions with // the same signatures as the ANSI C malloc, calloc, realloc, and free. + SPEX_info SPEX_initialize_expert ( - void* (*MyMalloc) (size_t), // user-defined malloc - void* (*MyCalloc) (size_t, size_t), // user-defined calloc - void* (*MyRealloc) (void *, size_t), // user-defined realloc + void *(*MyMalloc) (size_t), // user-defined malloc + void *(*MyCalloc) (size_t, size_t), // user-defined calloc + void *(*MyRealloc) (void *, size_t), // user-defined realloc void (*MyFree) (void *) // user-defined free ) ; // SPEX_finalize: This function finalizes the working evironment for SPEX // library, and frees any internal workspace created by SPEX. It must be // called as the last SPEX_* function called. -SPEX_info SPEX_finalize (void) ; - -// SPEX_matrix_check: check and print a SPEX_sparse matrix -SPEX_info SPEX_matrix_check // returns a SPEX status code +SPEX_info SPEX_finalize ( - const SPEX_matrix *A, // matrix to check - const SPEX_options* option // defines the print level + void ) ; +// SPEX is thread-safe but it requires each user thread to call +// SPEX_thread_initialize when it starts, and SPEX_thread_finalize when it +// finishes. These two functions must be called after the user's primary thread +// calls SPEX_initialize (or SPEX_initialize_experm) and before the user's +// primary thread calls SPEX_finalize. -/* Purpose: This function takes as input a mpz_t SPEX_matrix and divides - * it by an mpz_t constant storing the solution in a mpq_t dense SPEX_matrix - * array. - */ -SPEX_info SPEX_matrix_div // divides the x matrix by a scalar -( - SPEX_matrix **x2_handle, // x2 = x/scalar - SPEX_matrix* x, // input vector x - const mpz_t scalar, // the scalar - const SPEX_options *option -) ; +SPEX_info SPEX_thread_initialize ( void ) ; + +SPEX_info SPEX_thread_finalize ( void ) ; -/* Purpose: This function multiplies matrix x a scalar - */ -SPEX_info SPEX_matrix_mul // multiplies x by a scalar +//------------------------------------------------------------------------------ +// SPEX matrix utilities +//------------------------------------------------------------------------------ + +// Purpose: This function sets C = A', where A must be a SPEX_CSC matrix +// C_handle is NULL on input. On output, C_handle contains a pointer to A' + +SPEX_info SPEX_transpose ( - SPEX_matrix *x, // matrix to be multiplied - const mpz_t scalar // scalar to multiply by + SPEX_matrix *C_handle, // C = A' + SPEX_matrix A, // Matrix to be transposed + const SPEX_options option ) ; +// Purpose: Determine if the input A is symmetric. Since SPEX is an exact +// framework, the method checks if the matrix is symmetric both numerically +// and in its symbolic pattern. The method has no option for checking just +// pattern symmetry. -/* SPEX_check_solution: checks the solution of the linear system. Performs a - * quick rational arithmetic check of A*x=b. - */ -SPEX_info SPEX_check_solution -( - const SPEX_matrix *A, // input matrix - const SPEX_matrix *x, // solution vector - const SPEX_matrix *b, // right hand side - const SPEX_options* option // Command options -); - -/* Purpose: p [0..n] = cumulative sum of c [0..n-1], and then copy p [0..n-1] - * into c. This function is lightly modified from CSparse. - */ -SPEX_info SPEX_cumsum +SPEX_info SPEX_determine_symmetry ( - int64_t *p, // vector to store the sum of c - int64_t *c, // vector which is summed - int64_t n // size of c -); + bool *is_symmetric, // true if matrix is symmetric, false otherwise + const SPEX_matrix A, // Input matrix to be checked for symmetry + const SPEX_options option // Command options +) ; +// ended HERE on Apr 10. //------------------------------------------------------------------------------ //---------------------------SPEX GMP/MPFR Functions---------------------------- @@ -749,7 +825,7 @@ SPEX_info SPEX_cumsum // allocated by that function. The list is started fresh each time a GMP // function is called. If any allocation fails, the NULL pointer is not // returned to GMP. Instead, all allocated blocks in the list are freed, -// and spex_gmp_allocate returns directly to wrapper. +// and the allocation routine passed to GMP returns directly to the wrapper. SPEX_info SPEX_mpfr_asprintf (char **str, const char *format, ... ) ; @@ -757,7 +833,7 @@ SPEX_info SPEX_gmp_fscanf (FILE *fp, const char *format, ... ) ; SPEX_info SPEX_mpz_init (mpz_t x) ; -SPEX_info SPEX_mpz_init2(mpz_t x, const size_t size) ; +SPEX_info SPEX_mpz_init2(mpz_t x, const uint64_t size) ; SPEX_info SPEX_mpz_set (mpz_t x, const mpz_t y) ; @@ -765,28 +841,38 @@ SPEX_info SPEX_mpz_set_ui (mpz_t x, const uint64_t y) ; SPEX_info SPEX_mpz_set_si (mpz_t x, const int64_t y) ; +SPEX_info SPEX_mpz_swap (mpz_t x, mpz_t y); + SPEX_info SPEX_mpz_get_d (double *x, const mpz_t y) ; SPEX_info SPEX_mpz_get_si (int64_t *x, const mpz_t y) ; -SPEX_info SPEX_mpz_set_q (mpz_t x, const mpq_t y) ; - SPEX_info SPEX_mpz_mul (mpz_t a, const mpz_t b, const mpz_t c) ; -#if 0 +SPEX_info SPEX_mpz_mul_si (mpz_t a, const mpz_t b, const int64_t c) ; + +SPEX_info SPEX_mpz_sub (mpz_t a, const mpz_t b, const mpz_t c) ; + SPEX_info SPEX_mpz_add (mpz_t a, const mpz_t b, const mpz_t c) ; SPEX_info SPEX_mpz_addmul (mpz_t x, const mpz_t y, const mpz_t z) ; -#endif SPEX_info SPEX_mpz_submul (mpz_t x, const mpz_t y, const mpz_t z) ; +SPEX_info SPEX_mpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d) ; + +SPEX_info SPEX_mpz_cdiv_q (mpz_t q, const mpz_t n, const mpz_t d) ; + +SPEX_info SPEX_mpz_cdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d) ; + SPEX_info SPEX_mpz_divexact (mpz_t x, const mpz_t y, const mpz_t z) ; SPEX_info SPEX_mpz_gcd (mpz_t x, const mpz_t y, const mpz_t z) ; SPEX_info SPEX_mpz_lcm (mpz_t lcm, const mpz_t x, const mpz_t y) ; +SPEX_info SPEX_mpz_neg (mpz_t x, const mpz_t y) ; + SPEX_info SPEX_mpz_abs (mpz_t x, const mpz_t y) ; SPEX_info SPEX_mpz_cmp (int *r, const mpz_t x, const mpz_t y) ; @@ -795,6 +881,8 @@ SPEX_info SPEX_mpz_cmpabs (int *r, const mpz_t x, const mpz_t y) ; SPEX_info SPEX_mpz_cmp_ui (int *r, const mpz_t x, const uint64_t y) ; +SPEX_info SPEX_mpz_cmpabs_ui (int *r, const mpz_t x, const uint64_t y) ; + SPEX_info SPEX_mpz_sgn (int *sgn, const mpz_t x) ; SPEX_info SPEX_mpz_sizeinbase (size_t *size, const mpz_t x, int64_t base) ; @@ -805,6 +893,8 @@ SPEX_info SPEX_mpq_set (mpq_t x, const mpq_t y) ; SPEX_info SPEX_mpq_set_z (mpq_t x, const mpz_t y) ; +SPEX_info SPEX_mpq_canonicalize (mpq_t x); + SPEX_info SPEX_mpq_set_d (mpq_t x, const double y) ; SPEX_info SPEX_mpq_set_ui (mpq_t x, const uint64_t y, const uint64_t z) ; @@ -815,10 +905,10 @@ SPEX_info SPEX_mpq_set_num (mpq_t x, const mpz_t y) ; SPEX_info SPEX_mpq_set_den (mpq_t x, const mpz_t y) ; -SPEX_info SPEX_mpq_get_den (mpz_t x, const mpq_t y) ; - SPEX_info SPEX_mpq_get_d (double *x, const mpq_t y) ; +SPEX_info SPEX_mpq_neg (mpq_t x, const mpq_t y) ; + SPEX_info SPEX_mpq_abs (mpq_t x, const mpq_t y) ; SPEX_info SPEX_mpq_add (mpq_t x, const mpq_t y, const mpq_t z) ; @@ -874,83 +964,352 @@ SPEX_info SPEX_mpfr_free_cache (void) ; SPEX_info SPEX_mpfr_free_str (char *str) ; -#if 0 -// These functions are currently unused, but kept here for future reference. -SPEX_info SPEX_gmp_asprintf (char **str, const char *format, ... ) ; -SPEX_info SPEX_gmp_printf (const char *format, ... ) ; -SPEX_info SPEX_mpfr_printf ( const char *format, ... ) ; -SPEX_info SPEX_gmp_fprintf (FILE *fp, const char *format, ... ) ; -SPEX_info SPEX_mpfr_fprintf (FILE *fp, const char *format, ... ) ; -SPEX_info SPEX_mpz_set_d (mpz_t x, const double y) ; -SPEX_info SPEX_mpfr_log2(mpfr_t x, const mpfr_t y, const mpfr_rnd_t rnd) ; -#endif +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//-------------------------SPEX Left LU----------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// This portion of the SPEX library solves a sparse system of linear equations +// using the SPEX Left LU factorization. This code accompanies the paper +// (submitted to ACM Transactions on Mathematical Software): + +// "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, +// ACM Trans. Mathematical Software. pp 1-23, vol 48, no 2, 2022. + +// The theory associated with this software can be found in the paper +// (published in SIAM journal on matrix analysis and applications): + +// "Exact Solution of Sparse Linear Systems via Left-Looking +// Roundoff-Error-Free LU Factorization in Time Proportional to +// Arithmetic Work", C. Lourenco, A. R. Escobedo, E. Moreno-Centeno, +// T. Davis, SIAM J. Matrix Analysis and Applications. pp 609-638, +// vol 40, no 2, 2019. + +// 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 Left LU for a publication, we request that you please cite +// the above two papers. + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//-------------------------Authors---------------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// Christopher Lourenco, Jinhao Chen, Timothy A. Davis, and Erick Moreno-Centeno + + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//--------------------------Summary--------------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// This software package solves the linear system Ax = b exactly. The input +// matrix and right hand side vectors are stored as either integers, double +// precision numbers, multiple precision floating points (through the mpfr +// library) or as rational numbers (as a collection of numerators and +// denominators using the GMP mpq_t data structure). Appropriate routines +// within the code transform the input into an integral matrix in compressed +// column form. + +// This package computes the factorization PAQ = LDU. Note that we store the +// "functional" form of the factorization by only storing L and U. The user +// is given some freedom to select the permutation matrices P and Q. The +// recommended default settings select Q using the COLAMD column ordering +// and select P via a partial pivoting scheme in which the diagonal entry +// in column k is selected if it is the same magnitude as the smallest +// entry, otherwise the smallest entry is selected as the kth pivot. +// Alternative strategies allowed to select Q include the AMD column +// ordering or no column permutation (Q=I). For pivots, there are a variety +// of potential schemes including traditional partial pivoting, diagonal +// pivoting, tolerance pivoting etc. This package does not allow pivoting +// based on sparsity criterion. + +// The factors L and U are computed via integer preserving operations via +// integer-preserving Gaussian elimination. The key part of this algorithm +// is a Roundoff Error Free (REF) sparse triangular solve function which +// exploits sparsity to reduce the number of operations that must be +// performed. + +// Once L and U are computed, a simplified version of the triangular solve +// is performed which assumes the vector b is dense. The final solution +// vector x is gauranteed to be exact. This vector can be output in one of +// three ways: 1) full precision rational arithmetic (as a sequence of +// numerators and denominators) using the GMP mpq_t data type, 2) double +// precision while not exact will produce a solution accurate to machine +// roundoff unless the size of the associated solution exceeds double +// precision (i.e., the solution is 10^500 or something), 3) variable +// precision floating point using the GMP mpfr_t data type. The associated +// precision is user defined. -#endif //------------------------------------------------------------------------------ // Primary factorization & solve routines //------------------------------------------------------------------------------ -// SPEX_backslash solves the linear system Ax = b. This is the simplest way to -// use the SPEX Left LU package. This function encompasses both factorization and -// solve and returns the solution vector in the user desired type. It can be -// thought of as an exact version of MATLAB sparse backslash. -SPEX_info SPEX_Left_LU_backslash +// SPEX_lu_backslash solves the linear system Ax = b via LU factorization +// of A. This is the simplest way to use the SPEX Left LU package. This +// function encompasses both factorization and solve and returns the solution +// vector in the user desired type. It can be thought of as an exact version +// of MATLAB sparse backslash. +// x and b be can be single vectors, or matrices. + +SPEX_info SPEX_lu_backslash ( // Output - SPEX_matrix **X_handle, // Final solution vector + SPEX_matrix *x_handle, // Final solution vector // Input - SPEX_type type, // Type of output desired: - // Must be SPEX_MPQ, SPEX_MPFR, - // or SPEX_FP64 - const SPEX_matrix *A, // Input matrix - const SPEX_matrix *b, // Right hand side vector(s) - const SPEX_options* option + SPEX_type type, // Type of output desired. Must be + // SPEX_MPQ, SPEX_MPFR, or SPEX_FP64 + const SPEX_matrix A, // Input matrix + const SPEX_matrix b, // Right hand side vector(s) + const SPEX_options option // Command options ) ; -// SPEX_Left_LU_factorize performs the SPEX Left LU factorization. -// This factorization is done via n iterations of the sparse REF -// triangular solve function. The overall factorization is -// PAQ = LDU. The determinant can be obtained as rhos->x.mpz[n-1]. -// -// L: undefined on input, created on output -// U: undefined on input, created on output -// rhos: undefined on input, created on output -// pinv: undefined on input, created on output -// -// A: input only, not modified -// S: input only, not modified -// option: input only, not modified -SPEX_info SPEX_Left_LU_factorize +SPEX_info SPEX_lu_analyze +( + SPEX_symbolic_analysis *S_handle, // symbolic analysis including + // column perm. and nnz of L and U + const SPEX_matrix A, // Input matrix + const SPEX_options option // Control parameters, if NULL, use default +) ; + +SPEX_info SPEX_lu_factorize ( // output: - SPEX_matrix **L_handle, // lower triangular matrix - SPEX_matrix **U_handle, // upper triangular matrix - SPEX_matrix **rhos_handle, // sequence of pivots - int64_t **pinv_handle, // inverse row permutation + SPEX_factorization *F_handle, // LU factorization // input: - const SPEX_matrix *A, // matrix to be factored - const SPEX_LU_analysis *S, // column permutation and estimates - // of nnz in L and U - const SPEX_options* option + const SPEX_matrix A, // matrix to be factored + const SPEX_symbolic_analysis S, // symbolic analysis + const SPEX_options option // command options ) ; -// SPEX_Left_LU_solve solves the linear system LD^(-1)U x = b. -SPEX_info SPEX_Left_LU_solve // solves the linear system LD^(-1)U x = b +// solves the linear system Ax = b via LU factorization. +// x and b be can be single vectors, or matrices. + +SPEX_info SPEX_lu_solve // solves the linear system LD^(-1)U x = b ( // Output - SPEX_matrix **X_handle, // rational solution to the system + SPEX_matrix *x_handle, // rational solution to the system + // input/output: + SPEX_factorization F, // The LU factorization. + // Mathematically, F is unchanged. // input: - const SPEX_matrix *b, // right hand side vector - const SPEX_matrix *A, // Input matrix - const SPEX_matrix *L, // lower triangular matrix - const SPEX_matrix *U, // upper triangular matrix - const SPEX_matrix *rhos, // sequence of pivots - const SPEX_LU_analysis *S, // symbolic analysis struct - const int64_t *pinv, // inverse row permutation - const SPEX_options* option + const SPEX_matrix b, // right hand side vector(s) + const SPEX_options option // Command options +) ; + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//-------------------------SPEX Cholesky---------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// This portion of the SPEX library exactly solves a sparse symmetric positive +// definite (SPD) system of linear equations using one of two Integer- +// Preserving Cholesky factorizations. This code accompanies the paper (to be +// submitted to ACM TOMs) + +// "Algorithm 1xxx: Exactly Solving Sparse Symmetric Positive Definite +// Linear Systems via SPEX Cholesky factorization," C. Lourenco, L. Mejia +// Domenzain, E. Moreno-Centeno, T. Davis, to be submitted ACM TOMS. + +// The theory associated with this paper is found at: + +// "Exactly Solving Sparse Rational Linear Systems via Roundoff-Error-Free +// Cholesky Factorizations", C. Lourenco, E. Moreno-Centeno, +// SIAM J. Matrix Analysis and Applications. +// pp 609-638, vol 43, no 1, 2022. + +// To use this code you must first download and install the GMP, +// MPFR, AMD, and COLAMD libraries. GMP and MPFR can be found at: +// https://gmplib.org/ +// http://www.mpfr.org/ +// +// SPEX_Utilities, AMD, and COLAMD are distributed along with SPEX_Cholesky. +// The easiest way ensure these dependencies are met is to only access this +// package through the SPEX repository. +// +// All of these codes are components of the SPEX software library. This code +// may be found at: +// https://github.com/clouren/spex +// www.suitesparse.com +// +// + + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//-------------------------Authors---------------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. + + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//--------------------------Summary--------------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// This software package solves the SPD linear system Ax = b exactly. The +// key property of this package is that it can exactly solve any SPD input +// system. The input matrix and right hand side vectors are stored as +// either integers, double precision numbers, multiple precision floating +// points (through the mpfr library) or as rational numbers (as a collection +// of numerators and denominators using the GMP mpq_t data structure). +// Appropriate routines within the code transform the input into an integral +// matrix in compressed column form. + +// This package computes the factorization PAP' = LDL'. Note that we store +// the "functional" form of the factorization by only storing the matrix L. +// The user is given some freedom to select the permutation matrix P. The +// recommended default settings select P using the AMD ordering. +// Alternative strategies allowed to select P include the COLAMD +// ordering or no column permutation (P=I). + +// The factor L is computed via integer preserving operations via +// integer-preserving Gaussian elimination. The key part of this algorithm +// is a REF Sparse triangular solve function which exploits sparsity and +// symmetry to reduce the number of operations that must be performed. + +// Once L is computed, a simplified version of the triangular solve +// is performed which assumes the vector b is dense. The final solution +// vector x is gauranteed to be exact. This vector can be output in one of +// three ways: 1) full precision rational arithmetic (as a sequence of +// numerators and denominators) using the GMP mpq_t data type, 2) double +// precision while not exact will produce a solution accurate to machine +// roundoff unless the size of the associated solution exceeds double +// precision (i.e., the solution is 10^500 or something), 3) variable +// precision floating point using the GMP mpfr_t data type. The associated +// precision is user defined. + + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//-----------------------Primary SPEX Cholesky routines------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// Purpose: Compute the exact solution of Ax = b via Cholesky factorization of A +// On input, A is expected to be SPD and x is NULL +// On output, x contains the solution of the linear system + +SPEX_info SPEX_cholesky_backslash +( + // Output + SPEX_matrix *x_handle, // On input: undefined. + // On output: solution vector(s) + // Input + SPEX_type type, // Type of output desired + // Must be SPEX_FP64, SPEX_MPFR, or SPEX_MPQ + const SPEX_matrix A, // Input matrix. Must be SPEX_MPZ and SPEX_CSC + const SPEX_matrix b, // Right hand side vector(s). Must be + // SPEX_MPZ and SPEX_DENSE + const SPEX_options option // Command options (Default if NULL) +) ; + +SPEX_info SPEX_cholesky_analyze +( + // Output + SPEX_symbolic_analysis *S_handle, // Symbolic analysis data structure + // Input + const SPEX_matrix A, // Input matrix. Must be SPEX_MPZ and SPEX_CSC + const SPEX_options option // Command options (Default if NULL) +) ; + +SPEX_info SPEX_cholesky_factorize +( + // Output + SPEX_factorization *F_handle, // Cholesky factorization struct + //Input + const SPEX_matrix A, // Matrix to be factored. Must be SPEX_MPZ + // and SPEX_CSC + const SPEX_symbolic_analysis S, // Symbolic analysis struct containing the + // elimination tree of A, the column + // pointers of L, and the exact number of + // nonzeros of L. + const SPEX_options option // command options. + // Notably, option->chol_type indicates + // whether CHOL_UP (default) or CHOL_LEFT + // is used. +) ; + +// Purpose: After computing the REF Cholesky factorization A = LDL', +// this function solves the associated linear system LDL' x = b. +// +// On input x is undefined, F contains the REF Cholesky factorization +// of A (including L, rhos, and row permutation), b contains +// the user's right hand side. +// +// On output x contains the rational solution of the system LDL' x = b +// x and b be can be single vectors, or matrices. + + +SPEX_info SPEX_cholesky_solve +( + // Output + SPEX_matrix *x_handle, // On input: undefined. + // On output: Rational solution (SPEX_MPQ) + // to the system. + // input/output: + 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 Backslash-------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// SPEX_backslash is a wrapper for the exact routines contained within the +// SPEX software package. + +// SPEX_BACKSLASH: solve Ax=b via sparse integer-preserving factorization. +// SPEX_backslash: computes the exact solution to the sparse linear system Ax = +// b. A and b may be stored as either int64, double precision, arbitrary +// precision floating point (mpfr_t), arbitrary sized integer (mpz_t), or +// arbitrary size rational numbers (mpq_t). The result x is computed exactly, +// represented in arbitrary-precision rational values. This solution vector +// may be returned in either this rational form, or in double precision or in +// arbitrary precision floating point. +// +// A must be square. If A is SPD, an exact up-looking Cholesky factorization is +// applied. Otherwise, an exact left-looking LU functionality is applied. +// x and b be can be single vectors, or matrices. + +//------------------------------------------------------------------------------ +// Purpose: Solve Ax = b by analyzing the input matrix and applying the +// appropiate factorization approach +//------------------------------------------------------------------------------ + +SPEX_info SPEX_backslash +( + // Output + SPEX_matrix *x_handle, // On output: Final solution vector(s) + // On input: undefined + // Input + const SPEX_type type, // Type of output desired + // Must be SPEX_MPQ, SPEX_MPFR, or SPEX_FP64 + const SPEX_matrix A, // Input matrix + const SPEX_matrix b, // Right hand side vector(s) + SPEX_options option // Command options (NULL: means use defaults) ) ; #if defined ( __cplusplus ) @@ -958,3 +1317,4 @@ SPEX_info SPEX_Left_LU_solve // solves the linear system LD^(-1)U x = b #endif #endif + diff --git a/SPEX/Config/Tcov_Makefile.in b/SPEX/Config/Tcov_Makefile.in new file mode 100644 index 0000000000..c0a921c52f --- /dev/null +++ b/SPEX/Config/Tcov_Makefile.in @@ -0,0 +1,271 @@ +#------------------------------------------------------------------------------- +# 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. +# All Rights Reserved. +# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +#------------------------------------------------------------------------------- + +default: cov + +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@ + +SUITESPARSE_CONFIG_PATH = @SUITESPARSE_CONFIG_PATH@ +COLAMD_PATH = @COLAMD_PATH@ +AMD_PATH = @AMD_PATH@ +GMP_PATH = @GMP_PATH@ +MPFR_PATH = @MPFR_PATH@ + +################################################################################ + + # use 8 jobs by default + JOBS ?= 8 + + LDFLAGS = --coverage + LDFLAGS += -Wl,-rpath=$(SUITESPARSE_CONFIG_PATH):$(AMD_PATH):$(COLAMD_PATH):$(GMP_PATH):$(MPFR_PATH) + + # remove object files, but keep compiled libraries via 'make clean' + CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d \ + *.gcda *.gcno *.aux *.bbl *.blg *.log *.toc *.dvi *.lof *.lot + + # also remove compiled libraries, via 'make distclean' + PURGE = *.so* *.a *.dll *.dylib *.dSYM + +################################################################################ + +# select the thread-safety mechanism to test: none, openmp, or pthreads. +# THREADS = +# THREADS = -fopenmp + THREADS = -DSPEX_USE_PTHREADS -pthread + +# Linux test coverage (gcc is required for test coverage) +CC = gcc +CFLAGS = -g -fprofile-arcs -ftest-coverage \ + -Wall -W -Wshadow -Wmissing-prototypes -Wstrict-prototypes \ + -Wredundant-decls -Wnested-externs -Wdisabled-optimization -std=c99 \ + -Wno-unused-parameter \ + $(INC) -I../Demo \ + -DSPEX_GMP_LIST_INIT=2 -DSPEX_GMP_TEST_COVERAGE $(THREADS) + +# run all statement coverage tests, and then check for 100% coverage +cov: runtests + ./covall + +all: tcov_for_lu spex_demo_lu_extended tcov_for_cholesky tcov_for_lu2 + +#------------------------------------------------------------------------------- +# compile .c file in this folder + +OBJ_Tcov = tcov_utilities.o + +$(OBJ_Tcov): tcov_utilities.h + +#------------------------------------------------------------------------------- +# link and compile each .c file in SPEX_Utilities/Source + +OBJ_Util = \ + SPEX_version.o \ + SPEX_calloc.o \ + spex_cast_array.o \ + spex_cast_matrix.o \ + SPEX_create_default_options.o \ + spex_create_mpfr_array.o \ + spex_create_mpq_array.o \ + spex_create_mpz_array.o \ + spex_cumsum.o \ + spex_expand_double_array.o \ + spex_expand_mpfr_array.o \ + spex_expand_mpq_array.o \ + SPEX_finalize.o \ + SPEX_free.o \ + SPEX_gmp.o \ + SPEX_initialize.o \ + SPEX_initialize_expert.o \ + SPEX_malloc.o \ + SPEX_matrix_allocate.o \ + SPEX_matrix_check.o \ + SPEX_matrix_copy.o \ + SPEX_matrix_free.o \ + spex_matrix_mul.o \ + SPEX_matrix_nnz.o \ + spex_permute_dense_matrix.o \ + SPEX_realloc.o \ + spex_sparse_collapse.o \ + spex_sparse_realloc.o \ + SPEX_symbolic_analysis_free.o \ + SPEX_factorization_free.o \ + SPEX_determine_symmetry.o \ + SPEX_transpose.o \ + spex_amd.o \ + spex_colamd.o \ + spex_create_mpq.o + +$(OBJ_Util): ../Include/SPEX.h ../SPEX_Utilities/Source/spex_util_internal.h + +.PRECIOUS: SPEX_%.c spex_%.c + +SPEX_%.c: + - ln -s ../SPEX_Utilities/Source/$@ + +spex_%.c: + - ln -s ../SPEX_Utilities/Source/$@ + +#------------------------------------------------------------------------------- +# link and compile each .c file in SPEX_LU/Source + +OBJ_LU = \ + SPEX_lu_analyze.o \ + SPEX_lu_backslash.o \ + spex_left_lu_back_sub.o \ + spex_left_lu_dfs.o \ + SPEX_lu_factorize.o \ + spex_left_lu_forward_sub.o \ + spex_left_lu_get_largest_pivot.o \ + spex_left_lu_get_nonzero_pivot.o \ + spex_left_lu_get_pivot.o \ + spex_left_lu_get_smallest_pivot.o \ + spex_left_lu_reach.o \ + spex_left_lu_ref_triangular_solve.o \ + SPEX_lu_solve.o + +.PRECIOUS: SPEX_lu_%.c SPEX_lu_%.c spex_left_lu_%.c + +SPEX_lu_%.c: + - ln -s ../SPEX_LU/Source/$@ + +SPEX_lu_%.c: + - ln -s ../SPEX_LU/Source/$@ + +spex_left_lu_%.c: + - ln -s ../SPEX_LU/Source/$@ + +#------------------------------------------------------------------------------- +# compile each .c file in Demo/Utilities + +DEMO_SRC = \ + ../Demo/Utilities/spex_demo_check_solution.c \ + ../Demo/Utilities/spex_demo_determine_error.c \ + ../Demo/Utilities/spex_demo_process_command_line.c \ + ../Demo/Utilities/spex_demo_read_dense.c \ + ../Demo/Utilities/spex_demo_tripread.c + +#------------------------------------------------------------------------------- +# link and compile each .c file in SPEX_Cholesky/Source + +OBJ_Cholesky = \ + SPEX_cholesky_analyze.o \ + SPEX_cholesky_backslash.o \ + spex_cholesky_backward_sub.o \ + spex_cholesky_counts.o \ + spex_cholesky_ereach.o \ + spex_cholesky_etree.o \ + spex_cholesky_factor.o \ + SPEX_cholesky_factorize.o \ + spex_cholesky_forward_sub.o \ + spex_cholesky_leaf.o \ + spex_cholesky_left_factor.o \ + spex_cholesky_left_triangular_solve.o \ + spex_cholesky_permute_A.o \ + spex_cholesky_post.o \ + spex_cholesky_pre_left_factor.o \ + spex_cholesky_preorder.o \ + SPEX_cholesky_solve.o \ + spex_cholesky_symbolic_analysis.o \ + spex_cholesky_tdfs.o \ + spex_cholesky_up_factor.o \ + spex_cholesky_up_triangular_solve.o + +$(OBJ_Cholesky): ../Include/SPEX.h + +.PRECIOUS: SPEX_cholesky_%.c spex_cholesky_%.c + +SPEX_cholesky_%.c: + - ln -s ../SPEX_Cholesky/Source/$@ + +spex_cholesky_%.c: + - ln -s ../SPEX_Cholesky/Source/$@ + +#chol_demos.c: +# - ln -s ../SPEX_Cholesky/Demo/$@ + +#------------------------------------------------------------------------------- + +tcov_for_lu: $(OBJ_Tcov) $(OBJ_Util) $(OBJ_LU) tcov_for_lu.c + $(CC) $(LDFLAGS) tcov_for_lu.c $(CFLAGS) -o tcov_for_lu $(OBJ_Tcov) $(OBJ_Util) $(OBJ_LU) $(LIBS) + +tcov_for_lu2: $(OBJ_Tcov) $(OBJ_Util) $(OBJ_Cholesky) tcov_for_lu2.c simple_rand.c simple_rand.h $(DEMO_SRC) + $(CC) $(LDFLAGS) $(CFLAGS) tcov_for_lu2.c simple_rand.c $(DEMO_SRC) -o tcov_for_lu2 $(OBJ_Tcov) $(OBJ_Util) $(OBJ_LU) $(LIBS) + +spex_demo_lu_extended: $(OBJ_Util) $(OBJ_LU) ../Demo/spex_demo_lu_extended.c $(DEMO_SRC) ../Demo/spex_demos.h + $(CC) $(LDFLAGS) ../Demo/spex_demo_lu_extended.c $(DEMO_SRC) $(CFLAGS) -o spex_demo_lu_extended $(OBJ_Tcov) $(OBJ_Util) $(OBJ_LU) $(LIBS) + +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) + +#------------------------------------------------------------------------------- + +# run all statement coverage tests +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 + + +# only run test for SPEX_Cholesky +runtests4chol: all + - ./tcov_for_cholesky ../ExampleMats/mesh1e1.mat.txt ../ExampleMats/mesh1e1.rhs.txt > test_for_cholesky.out + +#------------------------------------------------------------------------------- + +# To run with valgrind: +# V = valgrind +V = valgrind --leak-check=full --show-leak-kinds=all + +# run all statement coverage tests but with valgrind +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 + + +# run test for SPEX_Cholesky with valgrind +vtests4chol: all + - $(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 + - $(RM) -r SPEX_*.c spex_*.c *.dSYM + - $(RM) -r tcov_for_cholesky + +purge: distclean + +distclean: clean diff --git a/SPEX/Config/spex_deps.m.in b/SPEX/Config/spex_deps.m.in new file mode 100644 index 0000000000..6c20211e54 --- /dev/null +++ b/SPEX/Config/spex_deps.m.in @@ -0,0 +1,22 @@ +function [suitesparse_libdir, suitesparse_incdir, gmp_lib, gmp_include, mpfr_lib, mpfr_include] = spex_deps +%SPEX_DEPS: return location of GMP and MPFR libraries and include files +% The SPEX/MATLAB/spex_deps.m function is configured by cmake, from the +% source file SPEX/Config/spex_deps.m.in. +% +% 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@ + +% 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 = '@libdir@' ; +suitesparse_incdir = '@includedir@' ; +gmp_lib = '@GMP_LIBRARY@' ; +gmp_include = '@GMP_INCLUDE_DIR@' ; +mpfr_lib = '@MPFR_LIBRARY@' ; +mpfr_include = '@MPFR_INCLUDE_DIR@' ; + diff --git a/SPEX/SPEX_Util/Source/SPEX_check_solution.c b/SPEX/Demo/Utilities/spex_demo_check_solution.c similarity index 51% rename from SPEX/SPEX_Util/Source/SPEX_check_solution.c rename to SPEX/Demo/Utilities/spex_demo_check_solution.c index 573333f7b1..9e2a8c8a13 100644 --- a/SPEX/SPEX_Util/Source/SPEX_check_solution.c +++ b/SPEX/Demo/Utilities/spex_demo_check_solution.c @@ -1,58 +1,63 @@ //------------------------------------------------------------------------------ -// SPEX_Util/spex_check_solution: check solution to Ax=b +// Demo/spex_check_solution: checks whether a given vector exactly solves Ax=b //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ -/* 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 only used for debugging purposes, as the routines within SPEX are gauranteed - * to be exact. - */ -#define SPEX_FREE_ALL \ +#include "spex_demos.h" + +#undef FREE_WORKSPACE +#define FREE_WORKSPACE \ +{ \ SPEX_MPQ_CLEAR(temp); \ - SPEX_matrix_free(&b2, NULL); + SPEX_MPQ_CLEAR(scale); \ + SPEX_matrix_free(&b2, NULL); \ +} -#include "spex_util_internal.h" -SPEX_info SPEX_check_solution +SPEX_info spex_demo_check_solution ( - const SPEX_matrix *A, // Input matrix - const SPEX_matrix *x, // Solution vectors - const SPEX_matrix *b, // Right hand side vectors - const SPEX_options* option // Command options + const SPEX_matrix A, // Input matrix + const SPEX_matrix x, // Solution vectors + const SPEX_matrix b, // Right hand side vectors + const SPEX_options option // Command options ) { - if (!spex_initialized ( )) return (SPEX_PANIC) ; + 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) ; + /*SPEX_REQUIRE (A, SPEX_CSC, SPEX_MPZ); + SPEX_REQUIRE (x, SPEX_DENSE, SPEX_MPQ); + SPEX_REQUIRE (b, SPEX_DENSE, SPEX_MPZ);*/ //-------------------------------------------------------------------------- // Declare vars //-------------------------------------------------------------------------- - int64_t p, j, i ; - SPEX_matrix *b2 = NULL; // b2 stores the solution of A*x + 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_CHECK (SPEX_mpq_init(temp)); + 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_addmul in loops to compute b2 = A*x + // perform SPEX_mpq_addmul in loops to compute b2 = A'*x, where A' is the + // scaled matrix with all entries in integer //-------------------------------------------------------------------------- for (j = 0; j < b->n; j++) @@ -63,19 +68,37 @@ SPEX_info SPEX_check_solution { // temp = A[p][i] (note this must be done seperately since A is // mpz and temp is mpq) - SPEX_CHECK(SPEX_mpq_set_z(temp, A->x.mpz[p])); + SPEX_MPQ_SET_Z(temp, A->x.mpz[p]); // temp = temp*x[i] - SPEX_CHECK(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_CHECK(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); } } } + //-------------------------------------------------------------------------- + // Apply scales of A and b to b2 before comparing the b2 with scaled b' + //-------------------------------------------------------------------------- + + 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); + 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); + } + } + //-------------------------------------------------------------------------- // check if b==b2 //-------------------------------------------------------------------------- @@ -85,14 +108,14 @@ SPEX_info SPEX_check_solution for (i = 0; i < b->m; i++) { // temp = b[i] (correct b) - SPEX_CHECK(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 - int r ; - SPEX_CHECK(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) { - info = SPEX_INCORRECT; + //printf("ERROR\n"); + info = SPEX_PANIC; j = b->n; break; } @@ -103,23 +126,22 @@ SPEX_info SPEX_check_solution // Print info //-------------------------------------------------------------------------- - int pr = SPEX_OPTION_PRINT_LEVEL (option) ; + int pr = SPEX_OPTION_PRINT_LEVEL (option); if (info == SPEX_OK) { - SPEX_PR1 ("Solution is verified to be exact.\n") ; + SPEX_PR1 ("Solution is verified to be exact.\n"); } - else if (info == SPEX_INCORRECT) + 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") ; + "contact the authors of SPEX.\n"); } //-------------------------------------------------------------------------- // Free memory //-------------------------------------------------------------------------- - SPEX_FREE_ALL; + FREE_WORKSPACE ; return info; } - diff --git a/SPEX/Demo/Utilities/spex_demo_determine_error.c b/SPEX/Demo/Utilities/spex_demo_determine_error.c new file mode 100644 index 0000000000..3cc1d9806e --- /dev/null +++ b/SPEX/Demo/Utilities/spex_demo_determine_error.c @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------ +// Demo/spex_determine_error: auxiliary file for test coverage (tcov) +//------------------------------------------------------------------------------ + +// 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 + +//------------------------------------------------------------------------------ + +/* Purpose: Determine why a SPEX function failed + */ + +#include "spex_demos.h" + + +void spex_demo_determine_error +( + SPEX_info ok +) +{ + if (ok == SPEX_OUT_OF_MEMORY) + { + printf("\nOut of memory\n"); + } + else if (ok == SPEX_SINGULAR) + { + printf("\nInput matrix is singular OR no diagonal pivot. Please ensure input is SPD\n"); + } + else if (ok == SPEX_INCORRECT_INPUT) + { + printf("\nIncorrect input for a SPEX_Chol Function\n"); + } +} diff --git a/SPEX/Demo/Utilities/spex_demo_process_command_line.c b/SPEX/Demo/Utilities/spex_demo_process_command_line.c new file mode 100644 index 0000000000..c05bcf25c4 --- /dev/null +++ b/SPEX/Demo/Utilities/spex_demo_process_command_line.c @@ -0,0 +1,133 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This processes the command line for user specified options */ + +#include "spex_demos.h" + +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 + 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. + // 1: mpz, 2: double, 3: mpfr +) +{ + //SPEX_info ok; + for (int64_t i = 1; i < argc; i++) + { + char *arg = (char*) argv[i]; + if ( strcmp(arg,"help") == 0) + { + //SPEX_show_usage(); + return SPEX_INCORRECT_INPUT; + } + else if ( strcmp(arg, "q") == 0 || strcmp(arg,"col") == 0) + { + if (!argv[++i]) + { + printf("\n****ERROR! There must be an argument between 0-2" + "following q\n"); + return SPEX_INCORRECT_INPUT; + } + option->order = atoi(argv[i]); + if (option->order < 0 || option->order > 2) + { + printf("\n****ERROR! Invalid column ordering" + "\nDefaulting to COLAMD\n\n"); + option->order = SPEX_COLAMD; + } + } + else if ( strcmp(arg,"out2") == 0 || strcmp(arg, "o2") == 0) + { + if (!argv[++i]) + { + printf("\n****ERROR! o2 or out2 must be followed by" + " 0 (print nothing) 1 (print err) or 2 (terse) \n"); + return SPEX_INCORRECT_INPUT; + } + else if (!atoi(argv[i])) + { + printf("\n****ERROR! o2 or out2 must be followed by" + " 0 (print nothing) 1 (print err) or 2 (terse) \n"); + return SPEX_INCORRECT_INPUT; + } + option->print_level = atoi(argv[i]); + } + else if ( strcmp(arg, "out") == 0 || strcmp(arg, "o") == 0) + { + if (!argv[++i]) + { + printf("\n****ERROR! o or out must be followed by" + " 1 (rational) 2 (double) or 3 (variable precision) \n"); + return SPEX_INCORRECT_INPUT; + } + else if (!atoi(argv[i])) + { + printf("\n****ERROR! o or out must be followed by" + " 1 (rational) 2 (double) or 3 (variable precision) \n"); + return SPEX_INCORRECT_INPUT; + } + *rat = atoi(argv[i]); + if (*rat < 1 || *rat > 3) + { + printf("\n\n****ERROR! Invalid output type!\n" + "Defaulting to rational"); + *rat = 1; + } + if (*rat == 3) + { + if (!argv[++i]) + { + printf("\n****ERROR! Precision must be specified\n"); + return SPEX_INCORRECT_INPUT; + } + else if (!atoi(argv[i])) + { + printf("\n****ERROR! Precision must be specified\n"); + return SPEX_INCORRECT_INPUT; + } + option->prec = atoi(argv[i]); + if (option->prec < 2) + { + printf("\n\n****ERROR! Invalid precision. prec >= 2\n"); + return SPEX_INCORRECT_INPUT; + } + } + } + else if ( strcmp(arg, "f") == 0 || strcmp(arg, "file") == 0) + { + if (!argv[++i]) + { + printf("\n****ERROR! Matrix name must be entered\n"); + return SPEX_INCORRECT_INPUT; + } + *mat_name = argv[i]; + if (!argv[++i]) + { + printf("\n****ERROR! Right hand side vector name must" + " be entered\n"); + return SPEX_INCORRECT_INPUT; + } + *rhs_name = argv[i]; + } + else + { + printf("\n\n**ERROR! Unknown command line parameter: %s" + "\nIgnoring this parameter\n",arg); + return SPEX_INCORRECT_INPUT; + } + } + return SPEX_OK; +} diff --git a/SPEX/Demo/Utilities/spex_demo_read_dense.c b/SPEX/Demo/Utilities/spex_demo_read_dense.c new file mode 100644 index 0000000000..19faff8a54 --- /dev/null +++ b/SPEX/Demo/Utilities/spex_demo_read_dense.c @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: Read a dense matrix for RHS vectors. + * the values in the file must be integers + */ + +#include "spex_demos.h" + + +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_options option +) +{ + + if (file == NULL) + { + printf ("invalid inputs\n"); + return SPEX_INCORRECT_INPUT; + } + int64_t nrows, ncols; + SPEX_info info ; + + // First, we obtain the dimension of the matrix + int s = fscanf(file, "%"PRId64" %"PRId64, &nrows, &ncols); + if (feof(file) || s < 2) + { + printf ("premature end-of-file\n"); + return SPEX_INCORRECT_INPUT; + } + + // Now, we create our dense mpz_t matrix + SPEX_matrix A = NULL; + info = SPEX_matrix_allocate(&A, SPEX_DENSE, SPEX_MPZ, nrows, ncols, + nrows*ncols, false, true, option); + if (info != SPEX_OK) + { + return (info); + } + + // We now populate the matrix b. + for (int64_t i = 0; i < nrows; i++) + { + for (int64_t j = 0; j < ncols; j++) + { + info = SPEX_gmp_fscanf(file, "%Zd", &(A->x.mpz[i+j*nrows])); + if (info != SPEX_OK) + { + printf("\n\nhere at i = %"PRId64" and j = %"PRId64"", i, j); + return SPEX_INCORRECT_INPUT; + } + } + } + + //-------------------------------------------------------------------------- + // Success, set b_handle = A + //-------------------------------------------------------------------------- + + (*b_handle) = A; + return (info); +} diff --git a/SPEX/Demo/Utilities/spex_demo_tripread.c b/SPEX/Demo/Utilities/spex_demo_tripread.c new file mode 100644 index 0000000000..eb8bd8cdbf --- /dev/null +++ b/SPEX/Demo/Utilities/spex_demo_tripread.c @@ -0,0 +1,130 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This function reads a matrix stored in triplet format of a given type + * This format used is illustrated in the example mat files. + * + * The first line of the file contains three integers: m, n, nnz, + * where the matrix is m-by-n with nnz entries. + * + * Each of the following nnz lines contains a single triplet: i, j, aij, + * which defines the row index (i), column index (j), and value (aij) of + * the entry A(i,j). + */ + + +#include "spex_demos.h" + +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_options option +) +{ + SPEX_info info ; + ASSERT(A_handle!=NULL); + ASSERT(file!=NULL); + + (*A_handle) = NULL ; + + int64_t m, n, nz; + + if (C_type != SPEX_FP64 && C_type != SPEX_MPZ ) + { + printf("%d\n",C_type); + printf ("this function only supports double or mpz matrices\n"); + } + + // Read in size of matrix & number of nonzeros + int s = fscanf(file, "%"PRId64" %"PRId64" %"PRId64"\n", &m, &n, &nz); + if (feof(file) || s < 3) + { + printf ("premature end-of-file 1\n"); + return SPEX_INCORRECT_INPUT; + } + + // Allocate memory for A + // A is a triplet mpz_t or double matrix + SPEX_matrix A = NULL; + info = SPEX_matrix_allocate(&A, SPEX_TRIPLET, C_type, m, n, nz, + false, true, option); + + if (info != SPEX_OK) + { + printf ("unable to allocate matrix\n"); + return (info); + } + + // Read in the values from file + + switch(C_type) + { + case SPEX_FP64: + for (int64_t k = 0; k < nz; k++) + { + s = fscanf(file, "%"PRId64" %"PRId64" %lf\n", + &(A->i[k]), &(A->j[k]), &(A->x.fp64[k])); + if ((feof(file) && k != nz-1) || s < 3) + { + printf ("premature end-of-file\n"); + SPEX_matrix_free(&A, option); + return SPEX_INCORRECT_INPUT; + } + //Conversion from 1 based to 0 based + A->i[k] -= 1; + A->j[k] -= 1; + } + break; + + case SPEX_MPZ: + for (int64_t k = 0; k < nz; k++) + { + info = SPEX_gmp_fscanf(file, "%"PRId64" %"PRId64" %Zd\n", + &A->i[k], &A->j[k], &A->x.mpz[k]); + if ((feof(file) && k != nz-1) || info != SPEX_OK) + { + printf ("premature end-of-file 2\n"); + SPEX_matrix_free(&A, option); + return SPEX_INCORRECT_INPUT; + } + A->i[k] -= 1; + A->j[k] -= 1; + } + break; + default: + printf ("type not supported\n"); + return SPEX_INCORRECT_INPUT; + } + + // the triplet matrix now has nz entries + A->nz = nz; + + info = SPEX_matrix_check (A, option); + if (info != SPEX_OK) + { + printf ("invalid matrix\n"); + return (info); + } + + // A now contains our input matrix in triplet format. We now + // do a matrix copy to get it into CSC form + // C is a copy of A which is CSC and mpz_t + SPEX_matrix C = NULL; + SPEX_matrix_copy(&C, SPEX_CSC, SPEX_MPZ, A, option); + + // Free A, set A_handle + SPEX_matrix_free(&A, option); + (*A_handle) = C; + + return SPEX_OK; +} diff --git a/SPEX/Demo/spex_demo_backslash.c b/SPEX/Demo/spex_demo_backslash.c new file mode 100644 index 0000000000..31e838bbf3 --- /dev/null +++ b/SPEX/Demo/spex_demo_backslash.c @@ -0,0 +1,123 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + + +/* A demo of SPEX_Backslash in C + */ + +# include "spex_demos.h" + +#define FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&A,NULL); \ + SPEX_matrix_free(&b,NULL); \ + SPEX_matrix_free(&x,NULL); \ + SPEX_matrix_free(&x2, NULL); \ + SPEX_FREE(option); \ + 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; + + SPEX_matrix A = NULL; + SPEX_matrix b = NULL; + SPEX_matrix x = NULL; + SPEX_matrix x2 = 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; + + // Process the command line + DEMO_OK(spex_demo_process_command_line(argc, argv, option, + &mat_name, &rhs_name, &rat)); + + //-------------------------------------------------------------------------- + // Allocate memory + //-------------------------------------------------------------------------- + + // Read in A + FILE *mat_file = fopen(mat_name,"r"); + if( mat_file == NULL ) + { + perror("Error while opening the file"); + FREE_WORKSPACE; + return 0; + } + + // 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)); + fclose(mat_file); + 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"); + if( rhs_file == NULL ) + { + perror("Error while opening the file"); + FREE_WORKSPACE; + return 0; + } + DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); + fclose(rhs_file); + + //-------------------------------------------------------------------------- + // Solve Ax = b + //-------------------------------------------------------------------------- + + printf("solving Ax=b ...\n"); + fflush (stdout); + fflush (stderr); + double start = SuiteSparse_time (); + + option->print_level = 0; + + DEMO_OK( SPEX_backslash(&x, SPEX_MPQ, A, b, option)); + + double end = SuiteSparse_time (); + + 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)); + + + // 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)); + + //-------------------------------------------------------------------------- + // Free Memory + //-------------------------------------------------------------------------- + FREE_WORKSPACE; +} + diff --git a/SPEX/Demo/spex_demo_cholesky_extended.c b/SPEX/Demo/spex_demo_cholesky_extended.c new file mode 100644 index 0000000000..cbfd154bd8 --- /dev/null +++ b/SPEX/Demo/spex_demo_cholesky_extended.c @@ -0,0 +1,152 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + + +#include "spex_demos.h" + +#define FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&A,NULL); \ + SPEX_matrix_free(&b,NULL); \ + SPEX_matrix_free(&x,NULL); \ + SPEX_symbolic_analysis_free (&S, option); \ + SPEX_factorization_free(&F, option); \ + SPEX_FREE(option); \ + SPEX_finalize(); \ +} + +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; + + SPEX_symbolic_analysis S = NULL; + SPEX_factorization F = NULL ; + SPEX_matrix A = NULL; + SPEX_matrix b = NULL; + SPEX_matrix x = NULL; + + char *mat_name, *rhs_name; + int64_t rat = 1; + + // Default options. + SPEX_options option = NULL; + DEMO_OK(SPEX_create_default_options(&option)); + + // Process the command line + DEMO_OK(spex_demo_process_command_line(argc, argv, option, + &mat_name, &rhs_name, &rat)); + + //-------------------------------------------------------------------------- + // Allocate memory + //-------------------------------------------------------------------------- + + // Read in A + FILE *mat_file = fopen(mat_name,"r"); + if( mat_file == NULL ) + { + perror("Error while opening the file"); + FREE_WORKSPACE; + return 0; + } + + DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); + fclose(mat_file); + 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); + + // 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"); + if( rhs_file == NULL ) + { + perror("Error while opening the file"); + FREE_WORKSPACE; + return 0; + } + DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); + fclose(rhs_file); + + //-------------------------------------------------------------------------- + // Perform Analysis of A + //-------------------------------------------------------------------------- + + 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)); + + double end_col = SuiteSparse_time (); + + //-------------------------------------------------------------------------- + // Factorize PAP + //-------------------------------------------------------------------------- + + //option->algo=SPEX_CHOL_LEFT; + double start_factor = SuiteSparse_time (); + + DEMO_OK( SPEX_cholesky_factorize(&F, A, S, option)); + + double end_factor = SuiteSparse_time (); + + option->print_level=3; + //DEMO_OK(SPEX_matrix_check(F->L,option)); + + //-------------------------------------------------------------------------- + // Solve linear system + //-------------------------------------------------------------------------- + + double start_solve = SuiteSparse_time (); + + DEMO_OK( SPEX_cholesky_solve(&x, F, b, option)); + + double end_solve = SuiteSparse_time (); + + //-------------------------------------------------------------------------- + // Output & Timing Stats + //-------------------------------------------------------------------------- + + 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("\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)); + + //-------------------------------------------------------------------------- + // Free Memory + //-------------------------------------------------------------------------- + + FREE_WORKSPACE; +} + diff --git a/SPEX/Demo/spex_demo_cholesky_simple.c b/SPEX/Demo/spex_demo_cholesky_simple.c new file mode 100644 index 0000000000..2cf702914c --- /dev/null +++ b/SPEX/Demo/spex_demo_cholesky_simple.c @@ -0,0 +1,145 @@ +//------------------------------------------------------------------------------ +// 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. +// 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 + +#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(); \ +} + + +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(); + + //-------------------------------------------------------------------------- + // 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) + { + mat_name = argv[1]; + } + + //-------------------------------------------------------------------------- + // Declare our data structures + //-------------------------------------------------------------------------- + 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 0; + } + option->order = SPEX_AMD; //AMD is default for Cholesky + + // Process the command line + DEMO_OK(spex_demo_process_command_line(argc, argv, option, + &mat_name, &rhs_name, &rat)); + + //-------------------------------------------------------------------------- + // Allocate memory, read in A and b + //-------------------------------------------------------------------------- + + // Read in A. The output of this demo function is A in CSC format with + // double entries. + FILE *mat_file = fopen(mat_name,"r"); + if( mat_file == NULL ) + { + perror("Error while opening the file"); + FREE_WORKSPACE; + return 0; + } + + DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); + fclose(mat_file); + + int64_t n = A->n; + 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"); + if( rhs_file == NULL ) + { + perror("Error while opening the file"); + FREE_WORKSPACE; + return 0; + } + DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); + fclose(rhs_file); + + // Check if the size of A matches b + if (A->n != b->m) + { + printf("%"PRId64" %"PRId64" \n", A->m,b->m); + fprintf (stderr, "Error! Size of A and b do not match!\n"); + FREE_WORKSPACE; + return 0; + } + //-------------------------------------------------------------------------- + // solve + //-------------------------------------------------------------------------- + double start_s = SuiteSparse_time (); + option->algo=SPEX_CHOL_LEFT; + + DEMO_OK(SPEX_cholesky_backslash( &x, SPEX_MPQ, A, b, option)); + + double end_s = SuiteSparse_time (); + + 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)); + + // check solution + option->print_level=1; + 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; +} + diff --git a/SPEX/Demo/spex_demo_lu_doub.c b/SPEX/Demo/spex_demo_lu_doub.c new file mode 100644 index 0000000000..203f90793f --- /dev/null +++ b/SPEX/Demo/spex_demo_lu_doub.c @@ -0,0 +1,234 @@ +//------------------------------------------------------------------------------ +// 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. +// 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: +// +// 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 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 +// 2: First nonzero per column chosen as pivot +// 3: Diagonal pivoting with tolerance for smallest pivot +// 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: +// +// 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 +// 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: +// 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(); \ +} + +int main (int argc, char *argv[]) +{ + + //-------------------------------------------------------------------------- + // 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 ; + + // 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; + + //-------------------------------------------------------------------------- + // After initializing memory, we process the command line for this function. + // Such a step is optional, a user can also manually set these parameters. + // For example, if one wished to use the AMD ordering, they can just set + // option->order = SPEX_AMD. + //-------------------------------------------------------------------------- + + DEMO_OK(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 + FILE *mat_file = fopen(mat_name,"r"); + if( mat_file == NULL ) + { + perror("Error while opening the file"); + FREE_WORKSPACE; + return 0; + } + + DEMO_OK(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 + + //-------------------------------------------------------------------------- + // 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 (); + + // Column ordering using either AMD, COLAMD or nothing + DEMO_OK(SPEX_lu_analyze(&S, A, option)); + + double end_col = SuiteSparse_time (); + + //-------------------------------------------------------------------------- + // Now we perform the SPEX Left LU factorization to obtain matrices L and U + // and a row permutation P such that PAQ = LDU. Note that the D matrix is + // never explicitly constructed or used. + //-------------------------------------------------------------------------- + + 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; + } + + double end_factor = SuiteSparse_time (); + + //-------------------------------------------------------------------------- + // 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) ; + + printf("\nNumber of L+U nonzeros: \t\t%"PRId64, + (F->L->p[F->L->n]) + (F->U->p[F->U->n]) - (F->L->m)); + printf("\nSymbolic analysis time: \t\t%lf", t_sym); + printf("\nSPEX Left LU Factorization time: \t%lf", t_factor); + + //-------------------------------------------------------------------------- + // Free Memory + //-------------------------------------------------------------------------- + + FREE_WORKSPACE; + printf ("\n%s: all tests passed\n\n", __FILE__); + return 0; +} + diff --git a/SPEX/SPEX_Left_LU/Demo/spexlu_demo.c b/SPEX/Demo/spex_demo_lu_extended.c similarity index 65% rename from SPEX/SPEX_Left_LU/Demo/spexlu_demo.c rename to SPEX/Demo/spex_demo_lu_extended.c index b6ca44fa5b..b0d67ccdb2 100644 --- a/SPEX/SPEX_Left_LU/Demo/spexlu_demo.c +++ b/SPEX/Demo/spex_demo_lu_extended.c @@ -1,34 +1,33 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/Demo/spex_lu_demo.c: example main program for SPEX +// Demo/spex_demo_lu_extended.c: example of extended SPEX_LU call for a double matrix. //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 "demos.h" - /* 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 + * 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: +// spexlu_demo 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 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 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_Left_LU will use -// smallest pivot for pivot scheme. Other available options are listed -// as follows: // 0: Smallest pivot: Default and recommended // 1: Diagonal pivoting // 2: First nonzero per column chosen as pivot @@ -36,18 +35,21 @@ // 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_Left_LU -// will use COLAMD for column ordering. Other available options are: -// 0: None: Not recommended for sparse matrices -// 1: COLAMD: Default -// 2: AMD +// 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_lu_demo t 1e-10, which indicates SPEX_Left_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_lu_demo o 1, which indicates SPEX_Left_LU will output the +// 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 @@ -55,31 +57,30 @@ // // If none of the above args is given, they are set to the following default: // -// mat_name = "../ExampleMats/10teams_mat.txt" -// rhs_name = "../ExampleMats/10teams_v.txt" + // 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_matrix_free(&L, option); \ - SPEX_matrix_free(&U, option); \ + SPEX_symbolic_analysis_free(&S, option); \ + SPEX_factorization_free(&F, option); \ SPEX_matrix_free(&x, option); \ SPEX_matrix_free(&b, option); \ - SPEX_matrix_free(&rhos, option); \ - SPEX_FREE(pinv); \ - SPEX_LU_analysis_free(&S, option); \ SPEX_FREE(option); \ - SPEX_finalize( ) ; + SPEX_finalize(); \ +} -int main (int argc, char* argv[]) +int main (int argc, char *argv[]) { //-------------------------------------------------------------------------- - // Prior to using SPEX Left LU, its environment must be initialized. This is done - // by calling the SPEX_initialize() function. + // Prior to using SPEX Left LU, its environment must be initialized. This + // is done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- SPEX_initialize(); @@ -94,47 +95,47 @@ int main (int argc, char* argv[]) // 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 + // 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 + // 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 + // 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) + // 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_matrix *L = NULL; - SPEX_matrix *U = NULL; - SPEX_matrix *x = NULL; - SPEX_matrix *b = NULL; - SPEX_matrix *rhos = NULL; - int64_t* pinv = NULL; - SPEX_LU_analysis* S = NULL; + 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; - OK(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; - SPEX_type rat; - mat_name = "../ExampleMats/10teams_mat.txt";// Set demo matrix and RHS name - rhs_name = "../ExampleMats/10teams_v.txt"; - + 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. @@ -142,37 +143,36 @@ int main (int argc, char* argv[]) // option->order = SPEX_AMD. //-------------------------------------------------------------------------- - OK(SPEX_process_command_line(argc, argv, option, + DEMO_OK(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 + // 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 - FILE* 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 0; } - OK(SPEX_tripread(&A, mat_file, option)); + DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); fclose(mat_file); // Read in right hand side - FILE* 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 0; } - OK(SPEX_read_dense(&b, rhs_file, option)); + DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); // Check if the size of A matches b @@ -185,7 +185,7 @@ int main (int argc, char* argv[]) //-------------------------------------------------------------------------- // 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 + // 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. // @@ -194,62 +194,52 @@ 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 - OK(SPEX_LU_analyze(&S, A, option)); - if (option->print_level > 0) - { - SPEX_print_options(option); - } + DEMO_OK(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 and a - // row permutation P such that PAQ = LDU. Note that the D matrix is never - // explicitly constructed or used. + // Now we perform the SPEX Left LU factorization to obtain matrices L and U + // and a row permutation P such that PAQ = LDU. Note that the D matrix is + // never explicitly constructed or used. //-------------------------------------------------------------------------- - clock_t start_factor = clock(); + double start_factor = SuiteSparse_time (); - OK(SPEX_Left_LU_factorize(&L, &U, &rhos, &pinv, A, S, option)); + DEMO_OK(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 debugging. + // SPEX Left LU has an optional check step which can verify that the + // solution vector x satisfies Ax=b in perfect precision intended for + // debugging. // // Note that this is entirely optional and not necessary. The solution // returned is guaranteed to be exact. It appears here just as a - // verification that SPEX Left LU is computing its expected result. This test - // can fail only if it runs out of memory, or if there is a bug in the + // verification that SPEX Left LU is computing its expected result. This + // test can fail only if it runs out of memory, or if there is a bug in the // code. Also, note that this function can be quite time consuming; thus // it is not recommended to be used in general. - // - // To enable said check, the following bool is set to true // - option->check = true; - + // To enable said check, the following bool is set to true + + //option->check = true; + // Solve LDU x = b - OK(SPEX_Left_LU_solve(&x, b, - (const SPEX_matrix *) A, - (const SPEX_matrix *) L, - (const SPEX_matrix *) U, - (const SPEX_matrix *) rhos, - S, - (const int64_t *) pinv, - option)); - - clock_t end_solve = clock(); - - // Done, x now contains the exact solution of the linear system Ax=b in + DEMO_OK(SPEX_lu_solve(&x, F, b, option)); + + 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 // can cast their solution to a different data type or matrix format. // Below, we have a block of code which illustrates how one would do this. @@ -259,17 +249,17 @@ int main (int argc, char* argv[]) // SPEX_kind my_kind = SPEX_DENSE; // SPEX_CSC, SPEX_TRIPLET or SPEX_DENSE // SPEX_type my_type = SPEX_FP64; // SPEX_MPQ, SPEX_MPFR, or SPEX_FP64 // - // SPEX_matrix* my_x = NULL; // New output + // SPEX_matrix my_x = NULL; // New output // Create copy which is stored as my_kind and my_type: // 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, - (L->p[L->n]) + (U->p[U->n]) - (L->m)); + (F->L->p[F->L->n]) + (F->U->p[F->U->n]) - (F->L->m)); printf("\nSymbolic analysis time: \t\t%lf", t_sym); printf("\nSPEX Left LU Factorization time: \t%lf", t_factor); printf("\nFB Substitution time: \t\t\t%lf\n\n", t_solve); @@ -279,7 +269,8 @@ int main (int argc, char* argv[]) //-------------------------------------------------------------------------- FREE_WORKSPACE; - printf ("\n%s: all tests passed\n\n", __FILE__) ; + printf ("\n%s: all tests passed\n\n", __FILE__); + //fprintf (stderr, "%s: all tests passed\n\n", __FILE__); return 0; } diff --git a/SPEX/SPEX_Left_LU/Demo/example.c b/SPEX/Demo/spex_demo_lu_simple1.c similarity index 67% rename from SPEX/SPEX_Left_LU/Demo/example.c rename to SPEX/Demo/spex_demo_lu_simple1.c index 466d7bf734..cd92f8e41b 100644 --- a/SPEX/SPEX_Left_LU/Demo/example.c +++ b/SPEX/Demo/spex_demo_lu_simple1.c @@ -1,58 +1,56 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/Demo/example.c: example main program for SPEX_Left_LU +// Demo/example.c: example of simple SPEX_LU call using as input a random matrix //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 "demos.h" - - -/* 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 // out is file for output calculated result +#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() ; \ + SPEX_finalize(); \ +} - - int main (void) { - + //-------------------------------------------------------------------------- - // Prior to using SPEX Left LU, its environment must be initialized. This is done - // by calling the SPEX_initialize() function. + // Prior to using SPEX Left LU, its environment must be initialized. This + // is done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_initialize(); + SPEX_info ok = SPEX_initialize(); //-------------------------------------------------------------------------- // Declare and initialize essential variables //-------------------------------------------------------------------------- - SPEX_info ok; 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; - OK(SPEX_create_default_options(&option)); + 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 @@ -61,11 +59,11 @@ int main (void) // R is a n*n triplet matrix whose entries are FP64 Note that the first // boolean parameter says that the matrix is not shallow, so that A->i, // 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 + // 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); - + // 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); @@ -92,25 +90,22 @@ int main (void) //-------------------------------------------------------------------------- // A is a copy of the R matrix. A is a CSC matrix with mpz_t entries - 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. - OK ( SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, Rb, 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. + DEMO_OK ( SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, Rb, option)); //-------------------------------------------------------------------------- // Solve //-------------------------------------------------------------------------- - 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; + double start_s = SuiteSparse_time (); + // Solve the system and give double solution - OK(SPEX_Left_LU_backslash( &x, SPEX_FP64, A, b, option)); - - clock_t end_s = clock(); + DEMO_OK(SPEX_lu_backslash( &x, SPEX_FP64, A, b, option)); + + 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); @@ -119,7 +114,7 @@ int main (void) //-------------------------------------------------------------------------- FREE_WORKSPACE; - printf ("\n%s: all tests passed\n\n", __FILE__) ; + printf ("\n%s: all tests passed\n\n", __FILE__); return 0; } diff --git a/SPEX/SPEX_Left_LU/Demo/example2.c b/SPEX/Demo/spex_demo_lu_simple2.c similarity index 59% rename from SPEX/SPEX_Left_LU/Demo/example2.c rename to SPEX/Demo/spex_demo_lu_simple2.c index 955a6830d6..674a2d7ea5 100644 --- a/SPEX/SPEX_Left_LU/Demo/example2.c +++ b/SPEX/Demo/spex_demo_lu_simple2.c @@ -1,35 +1,38 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/Demo/example2.c: example main program for SPEX_Left_LU +// Demo/spex_demo_lu_simple2.c: example of simple SPEX_LU call for triplet format //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 "demos.h" - -// This example shows how to use SPEX Left LU within your code -// Unlike example1, the input matrix here is directly read in from the -// triplet formmat. Also, differs from example1 in that the output solution -// is given in mpq_t precision +// This example shows how to use SPEX Left LU within your code. Unlike +// example1, the input matrix here is directly read in from the triplet +// formmat. Also, differs from example1 in that the output solution is given in +// mpq_t precision // usage: -// example2 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 file for output calculated result -#define FREE_WORKSPACE \ - SPEX_LU_analysis_free(&S, option);\ - SPEX_matrix_free(&A, option); \ - SPEX_FREE(option); \ - SPEX_matrix_free(&b, option); \ - SPEX_matrix_free(&x, option); \ - SPEX_finalize(); +#include "spex_demos.h" + +#define FREE_WORKSPACE \ +{ \ + SPEX_symbolic_analysis_free(&S, option); \ + SPEX_matrix_free(&A, option); \ + SPEX_FREE(option); \ + SPEX_matrix_free(&b, option); \ + SPEX_matrix_free(&x, option); \ + SPEX_finalize(); \ +} int main (int argc, char **argv) { @@ -42,25 +45,28 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- // Get matrix and right hand side file names //-------------------------------------------------------------------------- - char *mat_name, *rhs_name; - mat_name = "../ExampleMats/10teams_mat.txt"; - rhs_name = "../ExampleMats/10teams_v.txt"; - if (argc > 2) - { - mat_name = argv[1]; - rhs_name = argv[2]; + + char *mat_name = NULL, *rhs_name = NULL; + if (argc < 3) + { + perror ("usage: spex_demo_lu_simple2 matfile rhsfile"); + return 0 ; } + mat_name = argv[1]; + rhs_name = argv[2]; + + //-------------------------------------------------------------------------- // Declare our data structures //-------------------------------------------------------------------------- SPEX_info ok; - SPEX_matrix *A = NULL ; // input matrix - SPEX_matrix *b = NULL ; // Right hand side vector - SPEX_matrix *x = NULL ; // Solution vectors - SPEX_LU_analysis *S = NULL ; // Column permutation - SPEX_options *option = NULL; - OK(SPEX_create_default_options(&option)); + 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 @@ -68,26 +74,26 @@ 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"); + FILE *mat_file = fopen(mat_name,"r"); if( mat_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; return 0; } - OK(SPEX_tripread(&A, mat_file, option)); + DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); fclose(mat_file); // 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"); + FILE *rhs_file = fopen(rhs_name,"r"); if( rhs_file == NULL ) { perror("Error while opening the file"); FREE_WORKSPACE; return 0; } - OK(SPEX_read_dense(&b, rhs_file, option)); + DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); // Check if the size of A matches b @@ -103,18 +109,18 @@ int main (int argc, char **argv) // solve //-------------------------------------------------------------------------- - 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; - + 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 - OK(SPEX_Left_LU_backslash( &x, SPEX_MPQ, A, b, option)); - - clock_t end_s = clock(); + DEMO_OK(SPEX_lu_backslash( &x, SPEX_MPQ, A, b, option)); + + 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); @@ -124,7 +130,7 @@ int main (int argc, char **argv) FREE_WORKSPACE; - printf ("\n%s: all tests passed\n\n", __FILE__) ; + printf ("\n%s: all tests passed\n\n", __FILE__); return 0; } diff --git a/SPEX/Demo/spex_demo_threaded.c b/SPEX/Demo/spex_demo_threaded.c new file mode 100644 index 0000000000..64eefa863a --- /dev/null +++ b/SPEX/Demo/spex_demo_threaded.c @@ -0,0 +1,183 @@ +//------------------------------------------------------------------------------ +// 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. +// 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. + */ + +# include "spex_demos.h" + +#define FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&A,NULL); \ + SPEX_matrix_free(&b,NULL); \ + SPEX_FREE(option); \ + SPEX_finalize(); \ +} \ + +#ifdef _OPENMP +#include +#endif + +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 ; + + 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; + + // Process the command line + DEMO_OK(spex_demo_process_command_line(argc, argv, option, + &mat_name, &rhs_name, &rat)); + + //-------------------------------------------------------------------------- + // Allocate memory + //-------------------------------------------------------------------------- + + // Read in A + FILE *mat_file = fopen(mat_name,"r"); + if( mat_file == NULL ) + { + perror("Error while opening the file"); + FREE_WORKSPACE; + return 0; + } + + // 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)); + fclose(mat_file); + 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"); + if( rhs_file == NULL ) + { + perror("Error while opening the file"); + FREE_WORKSPACE; + return 0; + } + DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); + fclose(rhs_file); + + //-------------------------------------------------------------------------- + // Solve Ax = b + //-------------------------------------------------------------------------- + + // This demo solves the same system many times, which isn't very useful, + // since each thread should compute the same solution each time. However, + // it serves as a useful test for the thread safety feature of SPEX. If + // there is a race condition, then it's likely that one thread will fail + // to properly solve one of its systems. + + fflush (stdout); + fflush (stderr); + + option->print_level = 0; + + int nthreads = 1 ; + #ifdef _OPENMP + nthreads = omp_get_max_threads ( ) ; + #endif + + #define NTRIALS 10 + + printf("solving Ax=b with nthreads: %d, with %d trials per thread\n" + "Please wait...\n", nthreads, NTRIALS); + + bool test_pass = true ; + + #pragma omp parallel for num_threads(nthreads) schedule(static,1) \ + reduction(&&:test_pass) + for (int id = 0 ; id < nthreads ; id++) + { + SPEX_info info = SPEX_thread_initialize ( ) ; + if (info != SPEX_OK) + { + printf ("SPEX thread %d: failed to initialize its context\n", id) ; + test_pass = false ; + SPEX_thread_finalize ( ) ; + continue ; + } + + // this thread solves the same system many times, just to + // hammer the thread-safety aspect of SPEX + bool my_test_pass = true ; + for (int ntrials = 0 ; ntrials < NTRIALS ; ntrials++) + { + SPEX_matrix myx = NULL ; + info = SPEX_backslash (&myx, SPEX_MPQ, A, b, option) ; + if (info != SPEX_OK) + { + printf ("SPEX thread %d: backslash failed\n", id) ; + my_test_pass = false ; + test_pass = false ; + break ; + } + info = spex_demo_check_solution (A,myx,b,option) ; + SPEX_matrix_free (&myx, NULL) ; + if (info != SPEX_OK) + { + printf ("SPEX thread %d: wrong solution\n", id) ; + my_test_pass = false ; + test_pass = false ; + break ; + } + } + + info = SPEX_thread_finalize ( ) ; + if (info != SPEX_OK) + { + printf ("SPEX thread %d: failed to finalize its context\n", id) ; + my_test_pass = false ; + test_pass = false ; + } + + if (my_test_pass) + { + printf ("SPEX thread %d: ok. All systems solved exactly.\n", id) ; + } + } + + if (!test_pass) + { + printf ("SPEX thread test failed\n\n") ; + } + else + { + printf ("SPEX thread test passed\n\n") ; + } + + //-------------------------------------------------------------------------- + // Free Memory + //-------------------------------------------------------------------------- + + FREE_WORKSPACE; +} + diff --git a/SPEX/Demo/spex_demos.h b/SPEX/Demo/spex_demos.h new file mode 100644 index 0000000000..8d8a847343 --- /dev/null +++ b/SPEX/Demo/spex_demos.h @@ -0,0 +1,95 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + + +#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 ; \ + } \ +} + +#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 + 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. + // 1: mpz, 2: double, 3: mpfr +); + +/* Purpose: This function reads in a matrix stored in a triplet format. + * This format used can be seen in any of the example mat files. + */ +SPEX_info spex_demo_tripread +( + 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 +) ; + +/* Purpose: This function reads in a double matrix stored in a triplet format. + * This format used can be seen in any of the example mat files. + */ +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_options option +) ; + +/* Purpose: This function reads in a matrix stored in a triplet format. + * This format used can be seen in any of the example mat files. + */ +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_options option +) ; + +/* 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_options option +) ; + +/* Purpose: Determine why a SPEX_Chol function failed + */ +void spex_demo_determine_error +( + SPEX_info ok +); + + +SPEX_info spex_demo_check_solution +( + const SPEX_matrix A, // Input matrix + const SPEX_matrix x, // Solution vectors + const SPEX_matrix b, // Right hand side vectors + const SPEX_options option // Command options +); diff --git a/SPEX/Doc/ChangeLog b/SPEX/Doc/ChangeLog index 16ab050aeb..8dcdc0e2db 100644 --- a/SPEX/Doc/ChangeLog +++ b/SPEX/Doc/ChangeLog @@ -1,28 +1,24 @@ -Jan 10, 2024: version 2.3.1 - - * minor updates to build system - -Dec 30, 2023: version 2.3.0 - - * major change to build system: by Markus Mützel - * SPEX_version: added to return version of SPEX - -Sept 18, 2023: version 2.2.1 - - * cmake update: add "None" build type, from Antonio Rojas, for Arch Linux - -Sept 8, 2023: version 2.2.0 - - * cmake updates: SuiteSparse:: namespace by Markus Muetzel - -June 16, 2023: version 2.0.4 - - * cmake build system updates: update by Markus Muetzel. - Includes changes to FindMPFR.cmake and FindGMP.cmake. - -Jan 17, 2023: version 2.0.3 - - * SuiteSparse_config: now v7.0.0 +Feb XX, 2024: version 3.1.0 + + * major update to build system + +Jul 26, 2023: version 3.0.0 + + * major change to the API: new SPEX_factorization and SPEX_symbolic_analysis + objects. Uniform analyze/factorize/solve functions for all kinds of + factorizations. + * thread-safe: SPEX 2.0 was not thread-safe if the user application called + it in parallel; v3.0 is now thread-safe with SPEX_thread_initialize + and SPEX_thread_finalize. + * SPEX_Cholesky: robust implementation of sparse REF Cholesky. + * SPEX_Backslash: automatically determines (between SPEX LU and SPEX + Cholesky) the best exact algorithm to use when solving a SLE. + * python interface: SPEX can now be used to solve SLEs in python with only + one line. There are separate functions for SPEX LU, SPEX Cholesky and + SPEX Backslash. + * MATLAB interface: SPEX can now be used to solve SLEs in MATLAB with only + one line. There are separate functions for SPEX LU, SPEX Cholesky and + SPEX Backslash. Dec 9, 2022: version 2.0.2 diff --git a/SPEX/Doc/Makefile b/SPEX/Doc/Makefile index cc226a1b9d..2d933eea0f 100644 --- a/SPEX/Doc/Makefile +++ b/SPEX/Doc/Makefile @@ -2,8 +2,9 @@ # SPEX/Doc/Makefile #------------------------------------------------------------------------------- -# SPEX: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -# Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +# 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_UserGuide.bib b/SPEX/Doc/SPEX_UserGuide.bib index 49fbddab01..83ffe4dc5e 100644 --- a/SPEX/Doc/SPEX_UserGuide.bib +++ b/SPEX/Doc/SPEX_UserGuide.bib @@ -78,3 +78,15 @@ @article{lourenco2019exact year={2019}, publisher={SIAM} } + + +@article{lourenco2022exactly, + title={Exactly Solving Sparse Rational Linear Systems via Roundoff-Error-Free Cholesky Factorizations}, + author={Lourenco, Christopher J and Moreno-Centeno, Erick}, + journal={SIAM Journal on Matrix Analysis and Applications}, + volume={43}, + number={1}, + pages={439--463}, + year={2022}, + publisher={SIAM} +} \ No newline at end of file diff --git a/SPEX/Doc/SPEX_UserGuide.pdf b/SPEX/Doc/SPEX_UserGuide.pdf index e7fc49d102afb30781cb10cc32c9d3ad81601f5d..add589916bd1ab91e07ed49bf70c5becbe262f55 100644 GIT binary patch delta 323759 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 k$1b#n9b@Dq6Ex;0RE~*J^%m! diff --git a/SPEX/Doc/SPEX_UserGuide.tex b/SPEX/Doc/SPEX_UserGuide.tex index 641053a4fd..dc8c7676cb 100644 --- a/SPEX/Doc/SPEX_UserGuide.tex +++ b/SPEX/Doc/SPEX_UserGuide.tex @@ -1,5 +1,5 @@ -\documentclass[12pt]{report} -\batchmode +\documentclass[12pt,oneside]{book} + \usepackage{amsmath,amssymb,amsthm,latexsym,paralist,comment} \usepackage{graphicx} \usepackage{psfrag} @@ -8,7 +8,6 @@ \usepackage{multirow} \usepackage{algorithm} \usepackage{algpseudocode} -\usepackage{cprotect} \usepackage{graphicx} \usepackage{subcaption} \usepackage{listings} @@ -22,7 +21,7 @@ linkcolor = blue, urlcolor = Maroon } -\usepackage{geometry} +\usepackage[letterpaper,margin=1in]{geometry} \theoremstyle{definition} \newcommand{\N}{\mathbf{N}} @@ -30,146 +29,111 @@ \newcommand{\Z}{\mathbf{Z}} \newcommand{\import}{\textcolor{red}{\textbf{**IMPORTANT**}}} -\begin{document} - -\begin{center} -\begin{large} -\textbf{User Guide for the SPEX Software Package} \\ -\vspace{5mm} -\input{SPEX_version.tex} -\vspace{20mm} +% Whether to include SPEX update or not +% If update is set to true, then all of the text on updates is shown +% if update is set to false, then all of the text on updates is hidden +\usepackage{ifthen} +\newboolean{update} +\setboolean{update}{false} +\newcommand{\update}[1]{\ifthenelse{\boolean{update}}{#1}{}} -Christopher Lourenco, Jinhao Chen, \\ Erick Moreno-Centeno, Timothy A. Davis \\ +\usepackage[Glenn]{fncychap} %Fancy Chapter Headers -US Naval Academy, Texas A\&M University +\usepackage{cprotect} -\vspace{20mm} -Contact Information: Contact Chris Lourenco, \href{mailto:chrisjlourenco@gmail.com}{chrisjlourenco@gmail.com} \href{mailto:lourenco@usna.edu}{lourenco@usna.edu}, or Tim Davis, -\href{mailto:timdavis@aldenmath.com}{timdavis@aldenmath.com}, -\href{mailto:davis@tamu.edu}{davis@tamu.edu}, -\href{DrTimothyAldenDavis@gmail.com}{DrTimothyAldenDavis@gmail.com} +% ------------------------------------------------------ +% Centered Tabular Environment, with default small size +% ------------------------------------------------------ +% Example 1 (small): \begin{SizedCenteredTabular}|l|l|l|} +% Example 2 (scriptsize): \begin{SizedCenteredTabular}[\scriptsize]{|l|l|l|} +\newenvironment{SizedCenteredTabular}[2][\small] + { + #1\begin{center}\begin{tabular}{#2} + }{ + \end{tabular}\end{center} + } -\end{large} -\end{center} -\newpage -\tableofcontents +\begin{document} -\newpage +\thispagestyle{empty} +\begin{center}\begin{large} + \phantom{.}\\[1in] + \textbf{User Guide for the SPEX Software Package} \\ + \vspace{5mm} -\chapter{SPEX Overview} - -SPEX is a software package comprising several state-of-the-art SParse EXact -linear algebra routines. It currently is comprised of the following: + Version 3.0, July 2023 % VERSION + \vspace{20mm} + + Jinhao Chen, Timothy A. Davis, Christopher Lourenco, Lorena Mejia-Domenzain, Erick Moreno-Centeno \\ + Texas A\&M University and US Naval Academy + \vspace{20mm} + + Contact Information: Contact Chris Lourenco, \href{mailto:chrisjlourenco@gmail.com}{chrisjlourenco@gmail.com}, \href{mailto:lourenco@usna.edu}{lourenco@usna.edu}, or Tim Davis, + \href{mailto:timdavis@aldenmath.com}{timdavis@aldenmath.com}, + \href{mailto:davis@tamu.edu}{davis@tamu.edu}, + \href{DrTimothyAldenDavis@gmail.com}{DrTimothyAldenDavis@gmail.com} +\end{large}\end{center} -\begin{description} -\item[SPEX Utilities] Utility and auxiliary functions for all SPEX routines: interface to the GMP/MPFR library, memory management functions, the \verb|SPEX_matrix| data structure, and various functions that are auxiliary to the factorization and solve functions. Please refer to Chapter \ref{ch:Util} for further details. -\item[SPEX Left LU] Sparse exact left-looking LU factorization to solve the linear system $A \mathbf{x} = \mathbf{b}$. The solution time is proportional to the arithmetic work in the bit-complexity model; this is an asymptotically efficient complexity bound. Please refer to Chapter \ref{ch:LeftLU} for further details. -\end{description} -\noindent \textbf{Location:} \url{https://github.com/clouren/SPEX} and -\url{www.suitesparse.com}\\ -\noindent \textbf{Required Packages:} SPEX depends on the following packages: - \begin{itemize} - \item AMD \cite{amestoy1996approximate,amestoy2004algorithmamd}, available under a BSD -3-clause license and distributed along with SPEX. May be independently obtained at \url{www.suitesparse.com} - \item COLAMD \cite{davis2004column,davis2004algorithmcolamd}, available under a BSD -3-clause license and distributed along with SPEX. May be independently obtained at \url{www.suitesparse.com} - \item - \verb|SuiteSparse_config| \cite{davis2020suitesparse}, no license restrictions and distributed along with SPEX. May be independently obtained at \url{www.suitesparse.com} - \item GNU GMP \cite{granlund2015gnu} and MPFR -\cite{fousse2007mpfr} libraries. Distributed under the LGPL3 and GPL2 and can be acquired and installed -from \url{https://gmplib.org/} and \url{http://www.mpfr.org/}, respectively. +%------------------------------------------------------------------------------- +\newpage +\tableofcontents +%------------------------------------------------------------------------------- - \end{itemize} -Within a Debian/Ubuntu based Linux system, a compatible version of GMP and MPFR can be installed with the following terminal commands: +%------------------------------------------------------------------------------- +\chapter{SPEX Overview}\vspace{-0.75in} +%------------------------------------------------------------------------------- +SPEX is a software package comprising several state-of-the-art SParse EXact +linear algebra routines. It currently consists of the following: -{\small -\begin{verbatim} - sudo apt-get install libgmp-dev - sudo apt-get install libmpfr-dev libmpfr-doc -\end{verbatim} } - -SPEX requires GMP 6.1.2 or later, and MPFR 4.0.2 or later. -Be aware that the Debian package versions differ. -The Debian \verb'libgmp.so.10.3.2' corresponds to GMP 6.1.2, -and \verb'libmpfr.so.6.0.2' corresponds to MPFR 4.0.2. -The same is true for the spack package manager. -Do not rely on the suffix \verb'X.Y.Z' in the \verb'lib*.so.X.Y.Z' to -determine the version. The CMake script will display the correct -version numbers of GMP and MPFR, and report an error if they are not -recent enough. - -\chapter{SPEX Utilities} \label{ch:Util} +\begin{description} + \item[SPEX Utilities] Utility and auxiliary functions for all SPEX routines: interface to the GMP/MPFR library, memory management functions, the \verb|SPEX_matrix|, \linebreak \verb|SPEX_factorization|, and \verb|SPEX_symbolic_analysis| data structures, and various functions that are auxiliary to the factorization and solve functions. Please refer to Chapter \ref{ch:Util} for further details. -\section{Overview} \label{s:util:overview} -%------------------------------------------------------------------------------- + \item[SPEX LU] Sparse exact left-looking LU factorization to solve the linear system $A \mathbf{x} = \mathbf{b}$. The solution time is proportional to the arithmetic work in the bit-complexity model; which is asymptotically efficient. Please refer to Chapter \ref{ch:LeftLU} for further details. -SPEX Util is a software package containing utility and auxiliary functions for the SPEX -factorizations. Additionally, SPEX Util provides a wrapper class for -the GNU Multiple Precision Arithmetic (GMP) \cite{granlund2015gnu} and GNU -Multiple Precision Floating Point Reliable (MPFR) \cite{fousse2007mpfr} -libraries that prevent memory leaks and improve the overall stability of -these external libraries. SPEX Util is written in ANSI C. + \item[SPEX Cholesky] Sparse exact left-looking and up-looking Cholesky factorizations to solve the symmetric positive definite (SPD) linear system $A \mathbf{x} = \mathbf{b}$. The solution time is proportional to the arithmetic work in the bit-complexity model; this is an asymptotically efficient complexity bound. Please refer to Chapter \ref{ch:Chol} for further details. -SPEX operates on matrices stored in any of the following 15 combinations of matrix formats and entry data-types: -$\{$Compressed Sparse Column (CSC), triplet, dense$\} \times \{$ \verb|mpz_t|, -\verb|mpq_t|, \verb|mpfr_t|, \verb|int64_t|, or \verb|double|$\}$. Using the SPEX matrix copy function, a matrix of any given form and data-type can be copied and converted into a matrix of any one of the 15 matrix-form and data-type combinations. + \item[SPEX Backslash] Routines to exactly solve the system $A \mathbf{x} = \mathbf{b}$ using either LU or Cholesky factorization. This is the simplest way to access the SPEX software package. Please refer to Chapter \ref{ch:Backslash} for further details. -Most routines require the matrix to be in CSC form with \verb|mpz_t| (i.e., arbitrary-sized integer) data -type. This data structure stores the matrix $A$ as a sequence of three arrays: + \update{ + \item[SPEX Update] Sparse exact factorization update. Currently consists of LU and Cholesky column replacement updates and Cholesky rank 1 update. Please refer to Chapter \ref{ch:Update} for further details.} +\end{description} -\begin{itemize} -\item -\verb|A->p|: Column pointers; an array of size \verb|n+1|. The row indices of -column $j$ are located in positions \verb|A->p[j]| to \verb|A->p[j+1]-1| of the -array \verb|A->i|. Data type: \verb|int64_t|. +\noindent \textbf{Location:} \url{https://github.com/clouren/SPEX} and +\url{www.suitesparse.com}\\ -\item -\verb|A->i|: Row indices; an array of size equal to the number of entries in -the matrix. The entry \verb|A->i[k]| is the row index of the $k$th nonzero in -the matrix. Data type: \verb|int64_t|. +\noindent \textbf{Required Packages:} SPEX depends on the following packages: +\begin{itemize} + \item GNU GMP \cite{granlund2015gnu} and MPFR \cite{fousse2007mpfr} libraries. Distributed under the LGPL3 and GPL2 and can be acquired and installed from \url{https://gmplib.org/} and \url{http://www.mpfr.org/}, respectively. -\item -\verb|A->x|: Numeric entries. The entry \verb|A->x[k]| is the numeric value of -the $k$th nonzero in the matrix. The array \verb|A->x| has a union type and -must be accessed via a suffix according to the type of \verb|A|. For details, -please refer to Section~\ref{ss:SPEX_matrix}. + \item CMake, available under a BSD 3-clause license. May be independently obtained at \url{https://cmake.org}. + + \item AMD \cite{amestoy1996approximate,amestoy2004algorithmamd}, available under a BSD 3-clause license and distributed along with SPEX. May be independently obtained at \url{www.suitesparse.com} + + \item COLAMD \cite{davis2004column,davis2004algorithmcolamd}, available under a BSD 3-clause license and distributed along with SPEX. May be independently obtained at \url{www.suitesparse.com} + %COMMENTED OUT because (1) no license, (2) distributed in SPEX, and (3) consistency with paper + %\item \verb|SuiteSparse_config| \cite{davis2020suitesparse}, no license restrictions and distributed along with SPEX. May be independently obtained at \url{www.suitesparse.com} \end{itemize} -An example matrix $A$ with \verb|mpz_t| type is stored as follows (note that indexing is zero based as per the C convention). -\[ -A = \begin{bmatrix} -1 & 0 & 0 & 1 \\ -2 & 0 & 4 & 12 \\ -7 & 1 & 1 & 1 \\ -0 & 2 & 3 & 0 \\ -\end{bmatrix} -\] - -\begin{verbatim} -A->p = [0, 3, 5, 8, 11] -A->i = [0, 1, 2, 2, 3, 1, 2, 3, 0, 1, 2] -A->x.mpz = [1, 2, 7, 1, 2, 4, 1, 3, 1, 12, 1] -\end{verbatim} -For example, the last column appears in positions 8 to 10 of \verb|A->i| and \verb|A->x.mpz|, with row indices 0, 1, and 2, and values $a_{03}=1$, $a_{13}=12$, and $a_{23}=1$. +%------------------------------------------------------------------------------- +\chapter{Setting up SPEX}\vspace{-0.75in} +%------------------------------------------------------------------------------- %------------------------------------------------------------------------------- \section{Licensing} \label{s:util:licensing} %------------------------------------------------------------------------------- +\textbf{Copyright:} The copyright of this software is held by Christopher Lourenco, Jinhao Chen, Lorena Mejia-Domenzain, 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, +\noindent \textbf{Contact Info:} Chris Lourenco, \href{mailto:chrisjlourenco@gmail.com}{chrisjlourenco@gmail.com} \href{mailto:lourenco@usna.edu}{lourenco@usna.edu}, or Tim Davis, \href{mailto:timdavis@aldenmath.com}{timdavis@aldenmath.com}, -\href{mailto:davis@tamu.edu}{davis@tamu.edu}, or -\href{DrTimothyAldenDavis@gmail.com}{DrTimothyAldenDavis@gmail.com}\\ +\href{DrTimothyAldenDavis@gmail.com}{DrTimothyAldenDavis@gmail.com}, or \href{mailto:davis@tamu.edu}{davis@tamu.edu}\\ \noindent \textbf{License:} This software package is dual licensed under the GNU General Public License version 2 or the GNU Lesser General Public License version 3. Details of this license are in \verb|SPEX/License/license.txt|. For alternative licenses, please contact the authors. @@ -177,1218 +141,1435 @@ \section{Licensing} \label{s:util:licensing} %------------------------------------------------------------------------------- \section{Installation} \label{s:util:install} %------------------------------------------------------------------------------- +Installation of SPEX requires the \verb|cmake| utility in Linux, MacOS, and Windows. +With the appropriate compiler and version of cmake, typing \verb|make| under the main +directory will compile AMD, COLAMD, and SPEX to their respective \verb|build| folder. +All shared library files can be found in the top level \verb|build| folder. To further +install the libraries onto your computer, simply type \verb|make install|. Thereafter, +to use the code inside of your program, precede your code with \newline \verb|#include "SPEX.h"|. -Installation of SPEX requires cmake. An optional top-level \verb'Makefile' -is provided to simplify its use (just do \verb'make ; make install'). +SPEX is also distributed with MATLAB and Python interfaces. Note that these interfaces have been thoroughly tested in Linux and are tuned to work ``out of the box'' on these types of machines. However, if the end user wishes to utilize the MATLAB or Python interfaces within a MacOS or Windows system, they may require additional library linkage in order to function properly. For example, on the MacOS, MATLAB R2022 does not currently support binaries compiled on ARM architecture, thus the code would have to be compiled with x-86. + +To install the MATLAB interface, +navigate to the \verb|SPEX/MATLAB| folder from the MATLAB command window and type +\verb|spex_mex_install| which will install the MATLAB interfaces to all SPEX packages. +These packages can then be used outside of the \verb|SPEX/MATLAB| folder by using the +MATLAB addpath tool. The Python interface does not need any additional installation, but does require the \texttt{Numpy}, \texttt{SciPy}, and \texttt{ctypes} libraries. Note that + +\chapter{General SPEX Data Structures and Macros}\vspace{-0.75in} + +The following macros/data structures are defined in \verb|SPEX.h| and are used in all SPEX functions. -\newpage -%------------------------------------------------------------------------------- -\section{Managing the SPEX environment} \label{s:user:setup} -%------------------------------------------------------------------------------- %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_VERSION|: the software package version} +%\cprotect\section{\verb|SPEX_VERSION|: the software package version} +\section{\texttt{SPEX\_VERSION}: the software package version} %------------------------------------------------------------------------------- - SPEX defines the following strings with \verb|#define|. Refer to the \verb|SPEX.h| file for details. -%---------------------------------------- -\begin{center} -\begin{tabular}{ll} -\hline -Macro & purpose \\ -\hline -\verb|SPEX_VERSION| & current version of the code (as a string)\\ -\verb|SPEX_VERSION_MAJOR| & major version of the code\\ -\verb|SPEX_VERSION_MINOR| & minor version of the code \\ -\verb|SPEX_VERSION_SUB| & sub version of the code\\ -\hline -\end{tabular} -\end{center} +\begin{SizedCenteredTabular}{ll} \hline + Macro & Purpose \\ \hline + \verb|SPEX_VERSION| & Current version of the code (as a string)\\ + \verb|SPEX_VERSION_MAJOR| & Major version of the code \\ + \verb|SPEX_VERSION_MINOR| & Minor version of the code \\ + \verb|SPEX_VERSION_SUB| & Sub version of the code \\ \hline +\end{SizedCenteredTabular} + %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_info|: status codes returned by SPEX} -\label{ss:SPEX_info} +%\cprotect\section{\verb|SPEX_info|: status codes returned by SPEX} +\section{\texttt{SPEX\_info}: status codes returned by SPEX} \label{ss:SPEX_info} %------------------------------------------------------------------------------- - Most SPEX functions return their status to the caller as their return value, an enumerated type called \verb|SPEX_info|. All current possible values for \verb|SPEX_info| are listed as follows: -\begin{center} -\begin{tabular}{rll} -\hline - 0& \verb|SPEX_OK|& The function was successfully executed.\\ -\hline - -1& \verb|SPEX_OUT_OF_MEMORY|& out of memory\\ -\hline - -2& \verb|SPEX_SINGULAR|& The input matrix $A$ is exactly singular.\\ -\hline - -3& \verb|SPEX_INCORRECT_INPUT|& One or more input arguments are incorrect.\\ -\hline - -4& \verb|SPEX_INCORRECT|& The solution is incorrect.\\ -\hline - -5& \verb|SPEX_UNSYMMETRIC|& The input matrix is unsymmetric (for Cholesky)\\ -\hline - -5& \verb|SPEX_PANIC| & SPEX environment error \\ -\hline -\end{tabular} -\end{center} - -Either \verb|SPEX_initialize| or \verb|SPEX_initialize_expert| (but not both) -must be called prior to using any other SPEX function. \verb|SPEX_finalize| -must be called as the last SPEX function. +\begin{SizedCenteredTabular}{rll} \hline + 0 & \verb|SPEX_OK|& The function was successfully executed.\\ \hline + -1 & \verb|SPEX_OUT_OF_MEMORY|& Out of memory\\ \hline + -2 & \verb|SPEX_SINGULAR|& The input matrix $A$ is exactly singular.\\ \hline + -3 & \verb|SPEX_INCORRECT_INPUT|& One or more input arguments are incorrect.\\ \hline + -4 & \verb|SPEX_NOTSPD| & The input matrix is not SPD (thus can't use Cholesky) \\ \hline + -5 & \verb|SPEX_INCORRECT_ALGORITHM| & The algorithm is not compatible with the factorization \\ \hline + -6 & \verb|SPEX_PANIC| & SPEX environment error \\ \hline +\end{SizedCenteredTabular} -Subsequent SPEX sessions can be restarted after a call to -\verb|SPEX_finalize|, by calling either \verb|SPEX_initialize| or -\verb|SPEX_initialize_expert| (but not both), followed by a final call to -\verb|SPEX_finalize| when finished. %------------------------------------------------------------------------------- -\newpage -\cprotect\subsection{\verb|SPEX_initialize|: initialize the working environment} +%\cprotect\section{\verb|SPEX_pivot|: enum for pivoting schemes} +\section{\texttt{SPEX\_pivot}: enum for pivoting schemes}\label{ss:SPEX_pivot} %------------------------------------------------------------------------------- +There are six available pivoting schemes provided in SPEX that can be +selected with the \verb|SPEX_options| structure. If the matrix is non-singular +(in an exact sense), then the pivot is always nonzero, and is chosen as the +{\em smallest} nonzero entry, with the smallest magnitude. This may seem +counter-intuitive, but selecting a small nonzero pivot leads to smaller growth +in the number of digits in the entries of \verb|L| and \verb|U|. This choice +does not lead to any kind of numerical inaccuracy, since SPEX is guaranteed +to find an exact roundoff-error free factorization of a non-singular matrix +(unless it runs out of memory), for any nonzero pivot choice. -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize -\begin{verbatim} - SPEX_info SPEX_initialize - ( - void - ) ; -\end{verbatim} -} \end{mdframed} +The pivot tolerance for two of the pivoting schemes is specified by the +\verb|tol| component in \verb|SPEX_options|. The pivoting schemes are as +follows: + +\begin{SizedCenteredTabular}{llp{4in}}\hline + 0 & \verb|SPEX_SMALLEST| & The $k$-th pivot is selected as the smallest + entry in the $k$-th column.\\ \hline + 1 & \verb|SPEX_DIAGONAL| & The $k$-th pivot is selected as the diagonal + entry. If the diagonal entry is zero, + this method instead selects the smallest + pivot in the column.\\ \hline + 2 & \verb|SPEX_FIRST_NONZERO| & The $k$-th pivot is selected as the first + eligible nonzero in the column. \\ \hline + 3 & \verb|SPEX_TOL_SMALLEST| & The $k$-th pivot is selected as the diagonal + entry if the diagonal is within a + specified tolerance of the smallest entry in + the column. Otherwise, the smallest + entry in the $k$-th column is selected. + This is the default pivot selection + strategy. \\ \hline + 4 & \verb|SPEX_TOL_LARGEST| & The $k$-th pivot is selected as the diagonal + entry if the diagonal is within a + specified tolerance of the largest entry in + the column. Otherwise, the largest + entry in the $k$-th column is selected. \\ \hline + 5 & \verb|SPEX_LARGEST| & The $k$-th pivot is selected as the largest + entry in the $k$-th column. \\ \hline +\end{SizedCenteredTabular} + +%------------------------------------------------------------------------------- +%\cprotect\section{\verb|SPEX_preorder|} \label{ss:SPEX_preorder} +\section{\texttt{SPEX\_preorder}} \label{ss:SPEX_preorder} +%------------------------------------------------------------------------------- +The SPEX Library provides three ordering schemes: no ordering, COLAMD, and AMD. In LU factorization, the ordering is applied only to the columns, that is this ordering gives the matrix Q. In Cholesky factorizations, the ordering is applied to both the rows and columns, that is the ordering gives the matrices P and Q. + +\begin{SizedCenteredTabular}{llp{4in}} \hline + 1 & \verb|SPEX_NO_ORDERING| & No pre-ordering is performed on the matrix $A$, + that is $Q = I$. \\ \hline + 2 & \verb|SPEX_COLAMD| & The rows and/or columns of $A$ are permuted prior to + factorization using the COLAMD + \cite{davis2004algorithmcolamd} ordering. + This is recommended for LU factorization. \\ \hline + 3 & \verb|SPEX_AMD| & The rows and/or columns of $A$ are permuted prior + to the factorization using the the AMD + \cite{amestoy2004algorithmamd}. + This is recommended for Cholesky factorization. \\ \hline +\end{SizedCenteredTabular} + + +%------------------------------------------------------------------------------- +%\cprotect\section{\verb|SPEX_factorization_algorithm|} \label{ss:SPEX_factorization_algorithm} +\section{\texttt{SPEX\_factorization\_algorithm}} \label{ss:SPEX_factorization_algorithm} +%------------------------------------------------------------------------------- +This code tells SPEX which factorization is being used. Importantly, this is only used within a given solver. That is, this code is only used within LU/Cholesky factorization codes themselves. This is \textbf{NOT} used in the SPEX Backslash routines as that code selects the type of factorization using its own logic. + +\begin{SizedCenteredTabular}{llp{4in}} \hline + 1 & \verb|SPEX_LU_LEFT| & Left-looking LU factorization \\ \hline + 2 & \verb|SPEX_CHOL_LEFT| & Left-looking Chokesy factorization\\ \hline + 3 & \verb|SPEX_CHOL_UP| & Up-looking Cholesky factorization \\ \hline +\end{SizedCenteredTabular} + + +%------------------------------------------------------------------------------- +%\cprotect\section{ \verb|SPEX_options| structure} +\section{\texttt{SPEX\_options} structure} \label{ss:SPEX_options_struct} +%------------------------------------------------------------------------------- +The \verb|SPEX_options| struct stores key command parameters for various +functions used in the SPEX package. The \verb|SPEX_options* option| struct +contains the following components: + +\begin{itemize} + \item \verb|option->pivot|: An enum \verb|SPEX_pivot| type which controls the type of pivoting used. Default value: \verb|SPEX_SMALLEST| (3). + + \item \verb|option->order|: An enum \verb|SPEX_preorder| type which controls what column ordering is used. Default value: \verb|SPEX_COLAMD| for LU and \verb|SPEX_AMD| for Cholesky. + + \item \verb|option->tol|: A \verb|double| tolerance for the tolerance-based pivoting scheme, i.e., \newline \verb|SPEX_TOL_SMALLEST| or \verb|SPEX_TOL_LARGEST|. \verb|option->tol| must be in the range of $(0,1]$. Default value: 1 meaning that the diagonal entry will be selected if it has the same magnitude as the smallest entry in the $k$ the column. + + \item \verb|option->print_level|: An \verb|int| which controls the amount of output: 0: print nothing, 1: just errors, 2: terse, with basic stats from COLAMD/AMD and SPEX, 3: all, with matrices and results. Default value: 0. + + \item \verb|option->prec|: An \verb|int32_t| which specifies the precision used for multiple precision floating point numbers, (i.e., MPFR). This can be any integer larger than \verb|MPFR_PREC_MIN| (value of 1 in MPFR 4.0.2 and 2 in some legacy versions) and smaller than \verb|MPFR_PREC_MAX| (usually the largest possible integer available in your system). Default value: 128 (quad precision). + + \item \verb|option->round|: A \verb|mpfr_rnd_t| which determines the type of MPFR rounding to be used by SPEX. This is a parameter of the MPFR library. The options for this parameter are: + + \begin{itemize} + \item \verb|MPFR_RNDN|: Round to nearest (roundTiesToEven in IEEE 754-2008) + \item \verb|MPFR_RNDZ|: Round toward zero (roundTowardZero in IEEE 754-2008) + \item \verb|MPFR_RNDU|: Round toward plus infinity (roundTowardPositive in IEEE 754-2008) + \item \verb|MPFR_RNDD|: Round toward minus infinity (roundTowardNegative in IEEE 754-2008) + \item \verb|MPFR_RNDA|: Round away from zero + \item \verb|MPFR_RNDF|: Faithful rounding. This is not stable. + \end{itemize} + + \noindent Refer to the MPFR User Guide available at \url{https://www.mpfr.org/mpfr-current/mpfr.pdf} for details on the MPFR rounding style and any other utilized MPFR convention. Default value: \verb|MPFR_RNDN|. + + \item \verb|option->algo|: A \verb|SPEX_factorization_algorithm| which indicates which type of factorization is being used. +\end{itemize} + +All SPEX routines except basic memory management routines in Sections \ref{ss:SPEX_finalize}-\ref{ss:SPEX_calloc} and \verb|SPEX_options| allocation routine in \ref{ss:create_default_options} require \verb|option| as an input argument. The construction of the \verb|option| struct can be avoided by passing \verb|NULL| for the default settings. Otherwise, the following functions create and destroy a \verb|SPEX_options| structure: + +\begin{SizedCenteredTabular}{lp{2.5in}l} \hline + Function/Macro Name & Description & Section \\ \hline + \verb|SPEX_create_default_options| + & create and return \verb|SPEX_options| pointer with default parameters upon successful allocation + & \ref{ss:create_default_options} \\ \hline + \verb|SPEX_FREE| + & destroy \verb|SPEX_options| structure + & \ref{ss:SPEX_free} \\ \hline +\end{SizedCenteredTabular} -\verb|SPEX_initialize| initializes the working environment for SPEX -functions. SPEX utilizes a specialized memory management scheme in order to -prevent potential memory failures caused by GMP and MPFR libraries. Either -this function or \verb|SPEX_initialize_expert| must be called prior to using -any other function in the library. Returns \verb|SPEX_PANIC| if SPEX has -already been initialized, or \verb|SPEX_OK| if successful. %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_initialize_expert|: initialize environment -(expert version)}\label{ss:SPEX_initialize_expert} +%\cprotect\section{\verb|SPEX_vector|} \label{ss:SPEX_vector} +\section{\texttt{SPEX\_vector}} \label{ss:SPEX_vector} %------------------------------------------------------------------------------- +SPEX vector is a compressed sparse vector data structure which will be used for SPEX dynamic CSC matrices. This struct is not used in SPEX version 3.0 and its funcionality will be fully developed in a future release of SPEX; however the struct is provided here so that future versions of SPEX have backward compatibility. -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize -\begin{verbatim} - SPEX_info SPEX_initialize_expert - ( - void* (*MyMalloc) (size_t), // user-defined malloc - void* (*MyCalloc) (size_t, size_t), // user-defined calloc - void* (*MyRealloc) (void *, size_t), // user-defined realloc - void (*MyFree) (void *) // user-defined free - ) ; -\end{verbatim} -} \end{mdframed} +\update{ +This is only used publicly when calling the functions in SPEX Update to construct the vector to modify original matrix A, (either \verb|w| for $A'=A+\sigma ww^T$ in rank-1 update/downdate or \verb|vk| to be swapped with \verb|A->v[k]| in the update for column replacement). +} +This is \textbf{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 \verb|SPEX_matrix|. This struct contains the following components: -\verb|SPEX_initialize_expert| is the same as \verb|SPEX_initialize| except that -it allows for a redefinition of custom memory functions that are used for SPEX -and GMP/ MPFR. The four inputs to this function are pointers to four -functions with the same signatures as the ANSI C \verb'malloc', \verb'calloc', -\verb'realloc', and \verb'free' functions. That is: +\begin{itemize} + \item \verb|vector->nz|: The number of explicit entries in the vector. Data Type: \verb|int64_t|. -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize -\begin{verbatim} - #include - void *malloc (size_t size) ; - void *calloc (size_t nmemb, size_t size) ; - void *realloc (void *ptr, size_t size) ; - void free (void *ptr) ; -\end{verbatim} -} \end{mdframed} + \item \verb|vector->nzmax|: The size of the \verb|i| and \verb|x| arrays. Note that \verb|nz| $\le$ \verb|nzmax|. Data Type: \verb|int64_t|. + + \item \verb|vector->i|: An array of size \verb|nzmax| containing the row indices of all explicit entries in the vector. The last \verb|(nzmax-nz)| entries are undefined. Data Type: \verb|int64_t*|. + + \item \verb|vector->x|: An array of size \verb|nzmax| containing the numeric values of all explicit entries in the vector. The last \verb|(nzmax-nz)| entries are undefined. Data Type: \verb|mpz_t*|. + + \item \verb|vector->scale|: Scaling parameter. The actual value of the $k$-th nonzero should be computed as \verb|x[k]*scale|. Both \verb|x[k]*scale| and \verb|x[k]/mpq_denref(scale)| must be integer for all entries, where \verb|mpq_denref(scale)| is a GMP macro that gives the denominator of \verb|scale|. This is used to skip explicit update(s) for a column/row of the factorization matrix, when all entries are to be multiplied with the same scaling factor(s). Data Type: \verb|mpq_t|. +\end{itemize} + +In the current release, the \verb|SPEX_vector| is only used as a part of the \verb|SPEX_matrix| struct and is always a NULL pointer. +\update{ +The SPEX package has a set of functions to allocate, +destroy and reallocate a SPEX vector, \verb|SPEX_vector|, as shown in the following table. + +\begin{SizedCenteredTabular}{lll} \hline + Function Name & Description & Section \\ \hline + \verb|SPEX_vector_allocate| + & allocate \verb|SPEX_vector| with \verb|nzmax| entries + & \ref{ss:spex_vector_allocate} \\ \hline + \verb|SPEX_vector_realloc| + & reallocate \verb|SPEX_vector| with \verb|new_size| entries + & \ref{ss:spex_vector_realloc} \\ \hline + \verb|SPEX_vector_free| + & destroy a \verb|SPEX_vector| and free its allocated + & \ref{ss:spex_vector_free} \\& memory&\\ \hline +\end{SizedCenteredTabular} + +}%End Update -Returns \verb|SPEX_PANIC| if SPEX has already been initialized, -or \verb|SPEX_OK| if successful. %------------------------------------------------------------------------------- -\newpage -\cprotect\subsection{\verb|SPEX_finalize|: free the working environment} -\label{ss:SPEX_finalize} +%\cprotect\section{The \verb|SPEX_matrix| structure} \label{ss:SPEX_matrix} +\section{The \texttt{SPEX\_matrix} structure} \label{ss:SPEX_matrix} %------------------------------------------------------------------------------- +SPEX operates on matrices stored in any of the 16 different matrix formats: 15 of which are combinations of matrix formats and entry data-types: +$\{$Static Compressed Sparse Column (CSC), triplet, dense$\} \times \{$ \verb|mpz_t|, +\verb|mpq_t|, \verb|mpfr_t|, \verb|int64_t|, or \verb|double|$\}$, and the 16th of which is the dynamic CSC matrix with \verb|mpz_t| entries. Using the SPEX matrix copy function, a matrix of any given form and data-type can be copied and converted into a matrix of any one of the 16 matrix-form and data-type combinations. + +Most routines require the matrix to be in CSC form with \verb|mpz_t| (i.e., arbitrary-sized integer) data +type. This data structure stores the matrix $A$ as a sequence of three arrays: + +\begin{itemize} + \item \verb|A->p|: Column pointers; an array of size \verb|n+1|. The row indices of column $j$ are located in positions \verb|A->p[j]| to \verb|A->p[j+1]-1| of the array \verb|A->i|. Data type: \verb|int64_t|. + + \item \verb|A->i|: Row indices; an array of size equal to the number of entries in the matrix. The entry \verb|A->i[k]| is the row index of the $k$th nonzero in the matrix. Data type: \verb|int64_t|. + + \item \verb|A->x|: Numeric entries. The entry \verb|A->x[k]| is the numeric value of the $k$th nonzero in the matrix. The array \verb|A->x| has a union type and must be accessed via a suffix according to the type of \verb|A|. For details, please refer to Section~\ref{ss:SPEX_matrix}. +\end{itemize} + +An example matrix $A$ with \verb|mpz_t| type is stored as follows (note that indexing is zero based as per the C convention). +\[A = \begin{bmatrix} + 1 & 0 & 0 & 1 \\ + 2 & 0 & 4 & 12 \\ + 7 & 1 & 1 & 1 \\ + 0 & 2 & 3 & 0 \\ +\end{bmatrix}\] -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize \begin{verbatim} - SPEX_info SPEX_finalize - ( - void - ) ; +A->p = [0, 3, 5, 8, 11] +A->i = [0, 1, 2, 2, 3, 1, 2, 3, 0, 1, 2] +A->x.mpz = [1, 2, 7, 1, 2, 4, 1, 3, 1, 12, 1] \end{verbatim} -} \end{mdframed} -\verb|SPEX_finalize| finalizes the working environment for SPEX -library, and frees any internal workspace created by SPEX. It must be -called as the last \verb|SPEX_*| function called, except that a subsequent -call to \verb|SPEX_initialize*| may be used to start another SPEX session. -Returns \verb|SPEX_PANIC| if SPEX has not been initialized, -or \verb|SPEX_OK| if successful. +For example, the last column appears in positions 8 to 10 of \verb|A->i| and \verb|A->x.mpz|, with row indices 0, 1, and 2, and values $a_{03}=1$, $a_{13}=12$, and $a_{23}=1$. + %------------------------------------------------------------------------------- -\section{Memory Management} \label{s:user:memmanag} +%\cprotect\subsection{\verb|SPEX_kind|: enum for matrix formats} +\subsection{\texttt{SPEX\_kind}: enum for matrix formats} \label{ss:SPEX_kind} %------------------------------------------------------------------------------- +The SPEX library provides four available matrix formats: sparse CSC +(compressed sparse column), sparse triplet, dense and sparse dynamic CSC. + +\begin{SizedCenteredTabular}{llp{4in}} \hline + 0 & \verb|SPEX_CSC| & Matrix is in compressed sparse column format. \\ \hline + 1 & \verb|SPEX_TRIPLET| & Matrix is in sparse triplet format. \\ \hline + 2 & \verb|SPEX_DENSE| & Matrix is in dense format.\\ \hline + 3 & \verb|SPEX_DYNAMIC_CSC| & Matrix is in dynamic CSC format. \\ \hline +\end{SizedCenteredTabular} -The routines in this section are used to allocate and free memory for the data -structures used in SPEX. By default, SPEX relies on the SuiteSparse -memory management functions, \verb|SuiteSparse_malloc|, -\verb|SuiteSparse_calloc|, \verb|SuiteSparse_realloc|, and -\verb|SuiteSparse_free|. By default, those functions rely on the ANSI C -\verb|malloc|, \verb|calloc|, \verb|realloc|, and \verb|free|, but this may be -changed by initializing the SPEX environment with -\verb|SPEX_initialize_expert|. %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_calloc|: allocate initialized memory} -\label{ss:SPEX_calloc} +%\cprotect\subsection{\verb|SPEX_type|: enum for data types of matrix entries} +\subsection{\texttt{SPEX\_type}: enum for data types of matrix entries} +\label{ss:SPEX_type} %------------------------------------------------------------------------------- +The SPEX library provides five data types for matrix entries: \verb|mpz_t|, +\verb|mpq_t|, \verb|mpfr_t|, \verb|int64_t| and \verb|double|. -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize -\begin{verbatim} - void *SPEX_calloc - ( - size_t nitems, // number of items to allocate - size_t size // size of each item - ) ; -\end{verbatim} -} \end{mdframed} +\begin{SizedCenteredTabular}{llp{4in}} \hline + 0 & \verb|SPEX_MPZ| & Matrix entries are in \verb|mpz_t| type: an integer + of arbitrary size. \\ \hline + 1 & \verb|SPEX_MPQ| & Matrix entries are in \verb|mpq_t| type: a rational + number with arbitrary-sized integer numerator and + denominator. \\ \hline + 2 & \verb|SPEX_MPFR| & Matrix entries are in \verb|mpfr_t| type: a + floating-point number of arbitrary precision. \\ \hline + 3 & \verb|SPEX_INT64| & Matrix entries are in \verb|int64_t| type. \\ \hline + 4 & \verb|SPEX_FP64| & Matrix entries are in \verb|double| type. \\ \hline +\end{SizedCenteredTabular} -\verb|SPEX_calloc| allocates a block of memory for an array of \verb|nitems| -elements, each of them \verb|size| bytes long, and initializes all its bits to -zero. If any input is less than 1, it is treated as if equal to 1. If the -function failed to allocate the requested block of memory, then a \verb|NULL| -pointer is returned. -Returns \verb|NULL| if SPEX has not been initialized. %------------------------------------------------------------------------------- -\newpage -\cprotect\subsection{\verb|SPEX_malloc|: allocate uninitialized memory} -\label{ss:SPEX_malloc} +%\cprotect\subsection{\verb|SPEX_matrix| structure} +\subsection{\texttt{SPEX\_matrix} structure} %------------------------------------------------------------------------------- +A matrix \verb|SPEX_matrix *A| has the following components: -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize -\begin{verbatim} - void *SPEX_malloc - ( - size_t size // size of memory space to allocate - ) ; -\end{verbatim} -} \end{mdframed} +\begin{itemize} + \item \verb|A->kind|: Indicating the kind of matrix A: CSC, triplet, dense or dynamic CSC. Data Type: \verb|SPEX_kind|. -\verb|SPEX_malloc| allocates a block of \verb|size| bytes of memory, returning -a pointer to the beginning of the block. The content of the newly allocated -block of memory is not initialized, remaining with indeterminate values. -If \verb|size| is less than 1, it is treated as if equal to 1. If the function -fails to allocate the requested block of memory, then a \verb|NULL| pointer is -returned. -Returns \verb|NULL| if SPEX has not been initialized. + \item \verb|A->type|: Indicating the type of entries in matrix A: \verb|mpz_t|, \verb|mpq_t|, \verb|mpfr_t|, \verb|int64_t| or \verb|double|. Data Type: \verb|SPEX_type|. -%------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_realloc|: resize allocated memory} -\label{ss:SPEX_realloc} -%------------------------------------------------------------------------------- + \item \verb|A->m|: Number of rows in the matrix. Data Type: \verb|int64_t|. -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize -\begin{verbatim} - void *SPEX_realloc // pointer to reallocated block, or original block - // if the realloc failed - ( - int64_t nitems_new, // new number of items - int64_t nitems_old, // previous/old number of items - size_t size_of_item, // size of each item - void *p, // pointer to reallocate - bool *ok // true if success, false on failure - ) ; -\end{verbatim} -} \end{mdframed} + \item \verb|A->n|: Number of columns in the matrix. Data Type: \verb|int64_t|. -\verb|SPEX_realloc| is a wrapper for realloc. If \verb|p| is non-\verb|NULL| on -input, it points to a previously allocated array of size \verb|nitems_old| -$\times$ \verb|size_of_item|. The array is reallocated to be of size -\verb|nitems_new| $\times$ \verb|size_of_item|. If \verb|p| is \verb|NULL| on input, -then a new array of that size is allocated. On success, a pointer to the new -array is returned. Returns \verb|ok| as \verb|false| if SPEX has not been -initialized. - -If the reallocation fails, \verb|p| is not modified, and \verb|ok| is returned -as \verb|false| to indicate that the reallocation failed. If the size -decreases or remains the same, then the method always succeeds (\verb|ok| is -returned as \verb|true|), unless SPEX has not been initialized. - -Typical usage: the following code fragment allocates an array of 10 -\verb|int|'s, and then increases the size of the array to 20 \verb|int|'s. If -the \verb|SPEX_malloc| succeeds but the \verb|SPEX_realloc| fails, then the -array remains unmodified, of size 10. - -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize -\begin{verbatim} - int *p ; - p = SPEX_malloc (10 * sizeof (int)) ; - if (p == NULL) { error here ... } - printf ("p points to an array of size 10 * sizeof (int)\n") ; - bool ok ; - p = SPEX_realloc (20, 10, sizeof (int), p, &ok) ; - if (ok) printf ("p has size 20 * sizeof (int)\n") ; - else printf ("realloc failed; p still has size 10 * sizeof (int)\n") ; - SPEX_free (p) ; -\end{verbatim} -} \end{mdframed} - -%------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_free|: free allocated memory} -\label{ss:SPEX_free} -%------------------------------------------------------------------------------- - -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize -\begin{verbatim} - void SPEX_free - ( - void *p // Pointer to memory space to free - ) ; -\end{verbatim} -} \end{mdframed} - -\verb|SPEX_free| deallocates the memory previously allocated by a call to -\verb|SPEX_calloc|, \verb|SPEX_malloc|, or \verb|SPEX_realloc|. If \verb|p| is -\verb|NULL| on input, then no action is taken (this is not an error condition). -To guard against freeing the same memory space twice, the following macro -\verb|SPEX_FREE| is provided, which calls \verb|SPEX_free| and then sets the -freed pointer to \verb|NULL|. - -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize -\begin{verbatim} - #define SPEX_FREE(p) \ - { \ - SPEX_free (p) ; \ - (p) = NULL ; \ - } -\end{verbatim} -} \end{mdframed} + \item \verb|A->scale|: A scaling parameter for matrix of \verb|mpz_t| type. For all matrices whose entries are stored in data type other than \verb|mpz_t|, SPEX assumes and maintains \verb|A->scale = 1|. This is used to ensure that entry can be represented as an integer in an \verb|mpz_t| matrix if these entries are converted from non-integer type data (such as double, variable precision floating point, or rational). Data Type: \verb|mpq_t|. -No action is taken if SPEX has not been initialized. + \item \verb|A->nzmax|: The allocated size of the vectors \verb|A->i|, \verb|A->j| and \verb|A->x|. Note that \verb|A->nzmax| $\geq$ \verb|nnz(A)|, where \verb|nnz(A)| is the return value of \verb|SPEX_matrix_nnz(A,option)|. Data Type: \verb|int64_t|. -%------------------------------------------------------------------------------- -\cprotect\section{The \verb|SPEX_options| structure: -parameter settings for SPEX} \label{ss:SPEX_options} -%------------------------------------------------------------------------------- + \item \verb|A->nz|: The number of nonzeros in the matrix $A$, if $A$ is a triplet matrix (ignored for matrices in CSC, dense or dynamic CSC formats). Data Type: \verb|int64_t|. -The \verb|SPEX_options| structure contains numerous parameters that may be -modified to change the behavior of the SPEX functions. Default values of -these parameters will lead to good performance in most cases. Modifying this -struct provides control of column orderings, pivoting schemes, and other -components of the factorization. + \item \verb|A->p|: An array of size \verb|A->n|$+1$ which contains column pointers of $A$, if $A$ is a CSC matrix (\verb|NULL| for matrices in triplet or dense formats). Data Type: \verb|int64_t*|. -%------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_pivot|: enum for pivoting schemes} -\label{ss:SPEX_pivot} -%------------------------------------------------------------------------------- + \item \verb|A->p_shallow|: A boolean indicating whether \verb|A->p| is shallow. A {\em shallow} pointer is one that refers to a component of another matrix or data structure. If \verb|A->p| is shallow, then it should not be modified as part of the \verb|A| matrix, and it is not freed if \verb|A| is freed. Data Type: \verb|bool|. -There are six available pivoting schemes provided in SPEX that can be -selected with the \verb|SPEX_options| structure. If the matrix is non-singular -(in an exact sense), then the pivot is always nonzero, and is chosen as the -{\em smallest} nonzero entry, with the smallest magnitude. This may seem -counter-intuitive, but selecting a small nonzero pivot leads to smaller growth -in the number of digits in the entries of \verb|L| and \verb|U|. This choice -does not lead to any kind of numerical inaccuracy, since SPEX is guaranteed -to find an exact roundoff-error free factorization of a non-singular matrix -(unless it runs out of memory), for any nonzero pivot choice. + \item \verb|A->i|: An array of size \verb|A->nzmax| which contains the row indices of the nonzeros in $A$, if $A$ is a CSC or triplet matrix (\verb|NULL| for dense matrices). The matrix is zero-based, so row indices are in the range of $[0,$ \verb|A->m|$-1]$. Data Type: \verb|int64_t*|. -The pivot tolerance for two of the pivoting schemes is specified by the -\verb|tol| component in \verb|SPEX_options|. The pivoting schemes are as -follows: + \item \verb|A->i_shallow|: A boolean indicating whether \verb|A->i| is shallow. Data Type: \verb|bool|. -%---------------------------------------- -{\small -\begin{center} -\begin{tabular}{llp{4in}} -\hline -0 & \verb|SPEX_SMALLEST| & The $k$-th pivot is selected as the smallest - entry in the $k$-th column.\\ -\hline -1 & \verb|SPEX_DIAGONAL| & The $k$-th pivot is selected as the diagonal - entry. If the diagonal entry is zero, - this method instead selects the smallest - pivot in the column.\\ -\hline -2 & \verb|SPEX_FIRST_NONZERO| & The $k$-th pivot is selected as the first - eligible nonzero in the column. \\ -\hline -3 & \verb|SPEX_TOL_SMALLEST| & The $k$-th pivot is selected as the diagonal - entry if the diagonal is within a - specified tolerance of the smallest entry in - the column. Otherwise, the smallest - entry in the $k$-th column is selected. - This is the default pivot selection - strategy. \\ -\hline -4 & \verb|SPEX_TOL_LARGEST| & The $k$-th pivot is selected as the diagonal - entry if the diagonal is within a - specified tolerance of the largest entry in - the column. Otherwise, the largest - entry in the $k$-th column is selected. \\ -\hline -5 & \verb|SPEX_LARGEST| & The $k$-th pivot is selected as the largest - entry in the $k$-th column. \\ -\hline -\end{tabular} -\end{center} -} + \item \verb|A->j|: An array of size \verb|A->nzmax| which contains the column indices of the nonzeros in $A$, if $A$ is a triplet matrix (\verb|NULL| for matrices in CSC or dense formats). The matrix is zero-based, so column indices are in the range of $[0,$ \verb|A->n|$-1]$. Data Type: \verb|int64_t*|. -%------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_col_order|: enum for column ordering schemes} -\label{ss:SPEX_col_order} -%------------------------------------------------------------------------------- + \item \verb|A->j_shallow|: A boolean indicating whether \verb|A->j| is shallow. Data Type: \verb|bool|. -The SPEX library provides three column ordering schemes: no pre-ordering, -COLAMD, and AMD, selected via the \verb|order| -component in the \verb|SPEX_options| structure described in Section -\ref{ss:SPEX_options_struct}. + \item \verb|A->x|: An array of size \verb|A->nzmax| which contains the numeric values of the matrix. This array is a union, and must be accessed via one of: \verb|A->x.mpz|, \verb|A->x.mpq|, \verb|A->x.mpfr|, \verb|A->x.int64|, or \verb|A->x.fp64|, depending on the \verb|A->type| parameter. Data Type: \verb|union|. -{\small -\begin{center} -\begin{tabular}{llp{4in}} -\hline -0 & \verb|SPEX_NO_ORDERING| & No pre-ordering is performed on the matrix $A$, - that is $Q = I$. \\ -\hline -1 & \verb|SPEX_COLAMD| & The columns of $A$ are permuted prior to - factorization using the COLAMD - \cite{davis2004algorithmcolamd} ordering. - This is the default ordering. \\ -\hline -2 & \verb|SPEX_AMD| & The nonzero pattern of $A + A^T$ is analyzed and - the columns of $A$ are permuted prior to - factorization based on the AMD - \cite{amestoy2004algorithmamd} ordering of - $A+A^T$. This works well if $A$ has a mostly - symmetric pattern, but tends to be worse - than COLAMD on matrices with unsymmetric pattern. - \cite{davis2004column}.\\ -\hline -\end{tabular} -\label{tab:SPEX_pivot} -\end{center} -} + \item \verb|A->x_shallow|: A boolean indicating whether \verb|A->x| is shallow. Data Type: \verb|bool|. -%------------------------------------------------------------------------------- -\cprotect\subsection{ \verb|SPEX_options| structure} -\label{ss:SPEX_options_struct} -%------------------------------------------------------------------------------- + \item \verb|A->v|: If the matrix is a \verb|SPEX_DYNAMIC_CSC| this is an array of size \verb|A->n|, each of which is a dynamic column vector. Data Type: \verb|SPEX_vector**|. Always NULL in SPEX 3.0 +\end{itemize} -The \verb|SPEX_options| struct stores key command parameters for various -functions used in the SPEX package. The \verb|SPEX_options* option| struct -contains the following components: +Specifically, for different kinds of \verb|A| of size \verb|A->m| $\times$ \verb|A->n| +with \verb|nz| nonzero entries, its components are defined as: \begin{itemize} \item -\verb|option->pivot|: An enum \verb|SPEX_pivot| type (discussed in Section -\ref{ss:SPEX_pivot}) which controls the type of pivoting used. Default value: -\verb|SPEX_TOL_SMALLEST| (3). - -\item -\verb|option->order|: An enum \verb|SPEX_col_order| type (discussed in Section -\ref{ss:SPEX_col_order}) which controls what column ordering is used. Default -value: \verb|SPEX_COLAMD| (1). - -\item -\verb|option->tol|: A \verb|double| tolerance for -the tolerance-based pivoting scheme, i.e., \verb|SPEX_TOL_SMALLEST| or -\verb|SPEX_TOL_LARGEST|. \verb|option->tol| must be in the range of $(0,1]$. -Default value: 1 meaning that the diagonal entry will be selected if it has the -same magnitude as the smallest entry in the $k$ the column. + (0) \verb|SPEX_CSC|: A sparse matrix in CSC (compressed sparse column) format. + \verb|A->p| is an \verb|int64_t| array of size \verb|A->n|+1, \verb|A->i| + is an \verb|int64_t| array of size \verb|A->nzmax| (with $nz$ $\le$ + \verb|A->nzmax|), and \verb|A->x.TYPE| is an array of size + \verb|A->nzmax| of matrix entries (\verb'TYPE' is one of \verb|mpz|, + \verb|mpq|, \verb|mpfr|, \verb|int64|, or \verb|fp64|). The row indices + of column $j$ appear in \verb|A->i [A->p [j] ... A->p [j+1]-1]|, and the + values appear in the same locations in \verb|A->x.TYPE|. The \verb|A->j| + array is \verb|NULL|. \verb|A->nz| is ignored; the number of entries in + \verb|A| is given by \verb|A->p [A->n]|. + Row indices need not be sorted in each column, but duplicates cannot + appear. \item -\verb|option->print_level|: An \verb|int| which controls the amount of -output: -0: print nothing, 1: just errors, 2: terse, with basic stats from -COLAMD/AMD and SPEX, 3: all, with matrices and results. Default value: 0. + (1) \verb|SPEX_TRIPLET|: A sparse matrix in triplet format. \verb|A->i| and + \verb|A->j| are both \verb|int64_t| arrays of size \verb|A->nzmax|, and + \verb|A->x.TYPE| is an array of values of the same size. The $k$th tuple + has row index \verb|A->i [k]|, column index \verb|A->j [k]|, and value + \verb|A->x.TYPE [k]|, with 0 $\le$ $k <$ \verb|A->nz|. + The \verb|A->p| array is \verb|NULL|. + Triplets can be unsorted, but duplicates cannot appear. \item -\verb|option->prec|: An \verb|int32_t| which specifies the precision used -for multiple precision floating point numbers, (i.e., MPFR). This -can be any integer larger than \verb|MPFR_PREC_MIN| (value of 1 in MPFR 4.0.2 -and 2 in some legacy versions) and smaller than \verb|MPFR_PREC_MAX| (usually -the largest possible integer available in your system). Default value: 128 -(quad precision). + (2) \verb|SPEX_DENSE|: A dense matrix. The integer arrays \verb|A->p|, + \verb|A->i|, and \verb|A->j| are all \verb|NULL|. \verb|A->x.TYPE| is a + pointer to an array of size \verb|A->m|*\verb|A->n|, stored in + column-oriented format. The value of $A(i,j)$ is \verb|A->x.TYPE [p]| + with \verb|p| = $i + j*$\verb|A->m|. \verb|A->nz| is ignored; the number + of entries in \verb|A| is \verb|A->m| $\times$ \verb|A->n|. \item -\verb|option->round|: A \verb|mpfr_rnd_t| which determines the type -of MPFR rounding to be used by SPEX. This is a parameter of the MPFR -library. The options for this parameter are: - - \begin{itemize} - \item \verb|MPFR_RNDN|: round to nearest - (roundTiesToEven in IEEE 754-2008) - \item \verb|MPFR_RNDZ|: round toward zero - (roundTowardZero in IEEE 754-2008) - \item \verb|MPFR_RNDU|: round toward plus infinity - (roundTowardPositive in IEEE 754-2008) - \item \verb|MPFR_RNDD|: round toward minus infinity - (roundTowardNegative in IEEE 754-2008) - \item \verb|MPFR_RNDA|: round away from zero - \item \verb|MPFR_RNDF|: faithful rounding. This is not stable. - \end{itemize} + (3) \verb|SPEX_DYNAMIC_CSC|: Currently unused + \update{ + A sparse matrix in dynamic CSC + format with the number of nonzeros in each column changing + independently and dynamically, which is only used in the SPEX update + functions. The matrix is held as an array of \verb|A->n| SPEX vectors, one per + column. Each column is held as a \verb|SPEX_vector|, containing \verb|mpz_t| values + and its own scale factor. For this kind, \verb|A->nzmax|, \verb|A->nz|, \verb|A->p|, \verb|A->i|, + \verb|A->x| and \verb|A->*_shallow| are ignored and pointers \verb|p|, \verb|i| and \verb|x| are remained + as NULL pointers. To access entries in column $j$, \verb|A->v[j]->i[0 ... A->v[j]->nz-1]| + give the row indices of all nonzeros, and the \verb|mpz_t| values + of these entries appear in the same locations in \verb|A->v[j]->x|. + \verb|A->v[j]->nzmax| is the max number of nonzeros allocated for the $j$th column, while \verb|A->v[j]->nz| is the number of existing nonzeros in the $j$th column. Therefore, the total number + of existing nonzeros is computed as $\sum_{j=0}^{n-1}$(\verb|A->v[j]->nz|).} -\noindent Refer to the MPFR User Guide available at -\url{https://www.mpfr.org/mpfr-current/mpfr.pdf} for details on the MPFR -rounding style and any other utilized MPFR convention. Default value: -\verb|MPFR_RNDN|. +\end{itemize} -\item -\verb|option->check|: A \verb|bool| which indicates whether the solution to the -system should be checked. Intended for debugging only; the SPEX library is -guaranteed to return the exact solution. Default value: \verb|false|. +\verb|A| may contain shallow components, \verb|A->p|, \verb|A->i|, \verb|A->j|, +and \verb|A->x|. For example, if \verb|A->p_shallow| is true, then a +non-\verb|NULL| \verb|A->p| is a pointer to a read-only array, and the +\verb|A->p| array is not freed by \verb|SPEX_matrix_free|. If \verb|A->p| is +\verb|NULL| (for a triplet or dense matrix), then \verb|A->p_shallow| has no +effect. -\end{itemize} +%removed +%To simplify the access the entries in \verb|A|, SPEX package provides the +%following macros (Note that the \verb|TYPE| parameter in the macros is one of: +%\verb|mpz|, \verb|mpq|, \verb|mpfr|, \verb|int64| or \verb|fp64|): + +%\begin{itemize} + +%\item +%\verb|SPEX_1D(A,k,TYPE)|: used to access the $k$th entry in +% \verb|SPEX_matrix *A| using 1D linear addressing for +% any matrix kind (CSC, triplet or dense), in any type +% with \verb|TYPE| specified corresponding +% +%\item +%\verb|SPEX_2D(A,i,j,TYPE)|: used to access the $(i,j)$th entry in a dense +% \verb|SPEX_matrix *A|. +% +%\end{itemize} -All SPEX routines except basic memory management routines in Sections -\ref{ss:SPEX_finalize}-\ref{ss:SPEX_calloc} and \verb|SPEX_options| allocation -routine in \ref{ss:create_default_options} require \verb|option| as an input -argument. The construction of the \verb|option| struct can be avoided by -passing \verb|NULL| for the default settings. Otherwise, the following -functions create and destroy a \verb|SPEX_options| structure: - -%---------------------------------------- -\begin{center} -\begin{tabular}{lp{2.5in}l} -\hline -function/macro name & description & section \\ -\hline -\verb|SPEX_create_default_options| - & create and return \verb|SPEX_options| pointer - with default parameters upon successful allocation - & \ref{ss:create_default_options} \\ -\hline -\verb|SPEX_FREE| - & destroy \verb|SPEX_options| structure - & \ref{ss:SPEX_free} \\ -\hline -\end{tabular} -\end{center} - -%------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_create_default_options|: create default \verb|SPEX_options| structure} -\label{ss:create_default_options} -%------------------------------------------------------------------------------- +The SPEX package has a set of functions to allocate, copy(convert), query and +destroy a SPEX matrix, \verb|SPEX_matrix|, as shown in the following table. -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize -\begin{verbatim} - SPEX_options* SPEX_create_default_options - ( - void - ) ; -\end{verbatim} -} \end{mdframed} +\begin{SizedCenteredTabular}{lp{2.5in}l} \hline + Function Name & Description & Section \\ \hline + \verb|SPEX_matrix_allocate| + & allocate a $m$-by-$n$ \verb|SPEX_matrix| + & \ref{s:user:matrix_allocate} \\ \hline + \verb|SPEX_matrix_free| + & destroy a \verb|SPEX_matrix| and free its allocated memory + & \ref{s:user:matrix_free} \\ \hline + \verb|SPEX_matrix_copy| + & make a copy of a matrix, into another kind and/or type + & \ref{s:user:matrix_copy} \\ \hline + \verb|SPEX_matrix_nnz| + & get the number of entries in a matrix + & \ref{s:user:matrix_nnz} \\ \hline + \verb|SPEX_matrix_check| + & check the validity of a matrix and print it + & \ref{s:user:matrix_check} \\ \hline +\end{SizedCenteredTabular} -\verb|SPEX_create_default_options| creates and returns a pointer to a -\verb|SPEX_options| struct with default parameters upon successful allocation, -which are discussed in Section \ref{ss:SPEX_options_struct}. To safely free -the \verb|SPEX_options* option| structure, simply use \newline \verb|SPEX_FREE(option)|. -All functions that require \verb|SPEX_options *option| as an input argument can -have a \verb'NULL' pointer passed instead. In this case, the default value of -the corresponding command option is used. For example, if a \verb'NULL' pointer -is passed to the symbolic analysis routines, COLAMD is used. As a result, -defaults are desired, the \verb|SPEX_options| struct need not be allocated. -Returns \verb|NULL| if SPEX has not been initialized. %------------------------------------------------------------------------------- -\cprotect\section{The \verb|SPEX_matrix| structure} \label{ss:SPEX_matrix} +%\cprotect\section{The \verb|SPEX_symbolic_analysis| struct} \label{s:spex_symbolic_analysis} +\section{The \texttt{SPEX\_symbolic\_analysis} struct} \label{s:spex_symbolic_analysis} %------------------------------------------------------------------------------- +The symbolic analysis structure handles all preorderings and graphical struture information for each factorization within SPEX. First, section \ref{ss:spex_factorization_kind} discusses an enum for the type of factorization and next section \ref{ss:SPEX_symbolic_struct} discusses the components of this data structure. -All matrices for SPEX are stored as a \verb|SPEX_matrix| structure (a pointer -to a \verb'struct'). The matrix can be held in three formats: CSC, triplet or -dense matrix (as discussed in Section \ref{ss:SPEX_kind}) with entries stored -as 5 different types: \verb|mpz_t|, \verb|mpq_t|, \verb|mpfr_t|, \verb|int64_t| -and \verb|double| (as discussed in Section \ref{ss:SPEX_type}). This gives a -total of 15 different combinations of matrix format and entry type. Note that -not all functions accept all 15 matrix types. Indeed, most functions expect the -input matrix $A$ to be a CSC \verb|mpz_t| matrix while vectors (such as $x$ and -$b$) are in dense format. %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_kind|: enum for matrix formats} -\label{ss:SPEX_kind} +%\cprotect\subsection{\verb|SPEX_factorization_kind|: enum for kind of factorization} +\subsection{\texttt{SPEX\_factorization\_kind}: enum for kind of factorization} \label{ss:spex_factorization_kind} %------------------------------------------------------------------------------- -The SPEX library provides three available matrix formats: sparse CSC -(compressed sparse column), sparse triplet and dense. +The SPEX library currently provides two types of factorizations: LU and Cholesky. The value +\verb|SPEX_QR_FACTORIZATION| is reserved for future development. + +\begin{SizedCenteredTabular}{lll} \hline +0 & \verb|SPEX_LU_FACTORIZATION| & LU factorization is being used \\ \hline +1 & \verb|SPEX_CHOLESKY_FACTORIZATION| & Cholesky factorization is being used\\ \hline +2 & \verb|SPEX_QR_FACTORIZATION| & QR factorization is being used \\ + & & (reserved for future use)\\ \hline +\end{SizedCenteredTabular} -{\small -\begin{center} -\begin{tabular}{llp{4in}} -\hline -0 & \verb|SPEX_CSC| & Matrix is in compressed sparse column format. \\ -\hline -1 & \verb|SPEX_TRIPLET| & Matrix is in sparse triplet format. \\ -\hline -2 & \verb|SPEX_DENSE| & Matrix is in dense format.\\ -\hline -\end{tabular} -\label{tab:SPEX_kind} -\end{center} -} %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_type|: enum for data types of matrix entries} -\label{ss:SPEX_type} +%\cprotect\subsection{\verb|SPEX_symbolic_analysis| Data Structure} +\subsection{\texttt{SPEX\_symbolic\_analysis} Data Structure} \label{ss:SPEX_symbolic_struct} %------------------------------------------------------------------------------- +A symbolic analysis \verb|SPEX_symbolic_analysis *S| has the following components: -The SPEX library provides five data types for matrix entries: \verb|mpz_t|, -\verb|mpq_t|, \verb|mpfr_t|, \verb|int64_t| and \verb|double|. +\begin{itemize} +\item \verb|S->kind|: Indicating the kind of factorization either LU or Cholesky. Data type: \verb|SPEX_factorization_kind| -{\small -\begin{center} -\begin{tabular}{llp{4in}} -\hline -0 & \verb|SPEX_MPZ| & Matrix entries are in \verb|mpz_t| type: an integer - of arbitrary size. \\ -\hline -1 & \verb|SPEX_MPQ| & Matrix entries are in \verb|mpq_t| type: a rational - number with arbitrary-sized integer numerator and - denominator. \\ -\hline -2 & \verb|SPEX_MPFR| & Matrix entries are in \verb|mpfr_t| type: a - floating-point number of arbitrary precision. \\ -\hline -3 & \verb|SPEX_INT64| & Matrix entries are in \verb|int64_t| type. \\ -\hline -4 & \verb|SPEX_FP64| & Matrix entries are in \verb|double| type. \\ -\hline -\end{tabular} -\label{tab:SPEX_type} -\end{center} -} +\item \verb|S->P_perm|: Row permutation for Cholesky and LU factorization. Data type: \verb|int64_t*| -%------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_matrix| structure} -%------------------------------------------------------------------------------- +\item \verb|S->Pinv_perm|: Inverse row permutation for Cholesky and LU factorization. Data type: \verb|int64_t*| -A matrix \verb|SPEX_matrix *A| has the following components: +\item \verb|S->Q_perm|: Column permutation for LU factorization. This is always \verb|NULL| and ignored for Cholesky factorization since its row and column permutations are the same. Data type: \verb|int64_t*| -\begin{itemize} -\item \verb|A->m|: Number of rows in the matrix. Data Type: \verb|int64_t|. +\item \verb|S->Qinv_perm|: Inverse column permutation for LU factorization. This is always \verb|NULL| and ignored for Cholesky factorization since its inverse row and column permutations are the same. Data type: \verb|int64_t*| -\item \verb|A->n|: Number of columns in the matrix. Data Type: \verb|int64_t|. +\item \verb|S->lnz|: Approximate number of nonzeros in $L$. In LU factorization, this is a crude estimate based on either AMD or COLAMD. In Cholesky factorization, if AMD is used, this is the exact number of nonzeros in $L$. Data type: \verb|int64_t| -\item \verb|A->nz|: The number of nonzeros in the matrix $A$, if $A$ is -a triplet matrix (ignored for matrices in CSC or dense formats). Data Type: -\verb|int64_t|. +\item \verb|S->unz|: Approximate number of nonzeros in $U$. In LU factorization, this is a crude estimate based on either AMD or COLAMD. In Cholesky factorization this is not used. Data type: \verb|int64_t| -\item \verb|A->nzmax|: The allocated size of the vectors \verb|A->i|, -\verb|A->j| and \verb|A->x|. Note that \verb|A->nzmax| $\geq$ \verb|nnz(A)|, -where \verb|nnz(A)| is the return value of \verb|SPEX_matrix_nnz(A,option)|. -Data Type: \verb|int64_t|. +\item \verb|S->parent|: This is the elimination tree of the input matrix for Cholesky factorization. This is always \verb|NULL| for LU factorization. Data type: \verb|int64_t*| -\item \verb|A->kind|: Indicating the kind of matrix A: CSC, triplet or dense. -Data Type: \verb|SPEX_kind|. +\item \verb|S->cp|: Column pointers of L for Cholesky factorization. This is always \verb|NULL| for LU factorization. Data type: \verb|int64_t*| +\end{itemize} -\item \verb|A->type|: Indicating the type of entries in matrix A: \verb|mpz_t|, -\verb|mpq_t|, \verb|mpfr_t|, \verb|int64_t| or \verb|double|. -Data Type: \verb|SPEX_type|. +This data type is constructed when analysis is called in the appropriate factorizations. See sections \ref{ss:spex_lu_analyze} and \ref{ss:spex_chol_analyze} for further details. To free this data structure, the function \verb|SPEX_symbolic_analysis_free| is used and discussed further in section \ref{s:spex_symbolic_analysis_helper}. -\item \verb|A->p|: An array of size \verb|A->n|$+1$ which contains column pointers -of $A$, if $A$ is a CSC matrix (\verb|NULL| for matrices in triplet or dense -formats). Data Type: \verb|int64_t*|. -\item \verb|A->p_shallow|: A boolean indicating whether \verb|A->p| is shallow. -A {\em shallow} pointer is one that refers to a component of another matrix or -data structure. If \verb|A->p| is shallow, then it should not be modified -as part of the \verb|A| matrix, and it is not freed if \verb|A| is freed. -Data Type: \verb|bool|. +%------------------------------------------------------------------------------- +%\cprotect\section{The \verb|SPEX_factorization| data structure} +\section{The \texttt{SPEX\_factorization} data structure} +%------------------------------------------------------------------------------- +The \verb|SPEX_factorization| object holds an LU or Cholesky numerical factorization. \update{in either non-updatable or updatable form} The introduction of this structure is one of the largest API update for SPEX 2.0, as the components of all factorizations are now held in this structure instead of being carried around by the user. 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. -\item \verb|A->i|: An array of size \verb|A->nzmax| which contains the row -indices of the nonzeros in $A$, if $A$ is a CSC or triplet matrix (\verb|NULL| -for dense matrices). The matrix is zero-based, so row indices are -in the range of $[0,$ \verb|A->m|$-1]$. Data Type: \verb|int64_t*|. +The components of a \verb|SPEX_factorization* F| are as follows: -\item \verb|A->i_shallow|: A boolean indicating whether \verb|A->i| is shallow. -Data Type: \verb|bool|. +\begin{itemize} +\item \verb|F->kind|: Indicating the kind of factorization either LU or Cholesky. Data type: \verb|SPEX_factorization_kind| -\item \verb|A->j|: An array of size \verb|A->nzmax| which contains the column -indices of the nonzeros in $A$, if $A$ is a triplet matrix (\verb|NULL| for -matrices in CSC or dense formats). -The matrix is zero-based, so column indices are -in the range of $[0,$ \verb|A->n|$-1]$. Data Type: \verb|int64_t*|. +\item \verb|F->updatable|: a flag that indicates whether the factorization is in an updatable format. Reserved for future development. Data type: \verb|bool| -\item \verb|A->j_shallow|: A boolean indicating whether \verb|A->j| is shallow. -Data Type: \verb|bool|. +\item \verb|F->scale_for_A|: Scaling factor of the input matrix $A$. As discussed in section \ref{ss:SPEX_matrix}, all matrices in SPEX are integral, thus, if A must be scaled the scaling factor applied is stored here. Data type: \verb|mpq_t| -\item \verb|A->x|: An array of size \verb|A->nzmax| which contains the -numeric values of the matrix. This array is a union, and must be accessed via -one of: \verb|A->x.mpz|, \verb|A->x.mpq|, \verb|A->x.mpfr|, \verb|A->x.int64|, -or \verb|A->x.fp64|, depending on the \verb|A->type| parameter. -Data Type: \verb|union|. +\item \verb|F->L|: The lower triangular matrix for either LU or Cholesky factorization. Data type: \verb|SPEX_matrix*| -\item \verb|A->x_shallow|: A boolean indicating whether \verb|A->x| is -shallow. Data Type: \verb|bool|. +\item \verb|F->U|: The upper triangular matrix for LU factorization. This is always \verb|NULL| for Cholesky factorization. Data type: \verb|SPEX_matrix*| -\item \verb|A->scale|: A scaling parameter for matrix of \verb|mpz_t| type. For -all matrices whose entries are stored in data type other than \verb|mpz_t|, -\verb|A->scale = 1|. This is used to ensure that entry can be represented as an -integer in an \verb|mpz_t| matrix if these entries are converted from non-integer type -data (such as double, variable precision floating point, or rational). Data -Type: \verb|mpq_t|. +\item \verb|F->Q|: The matrix for (future) QR factorization. Provided here so that future versions of SPEX have backward compatibility. Data type: \verb|SPEX_matrix*| -\end{itemize} +\item \verb|F->R|: The right triangular matrix for (future) QR factorization. Provided here so that future versions of SPEX have backward compatibility. Data type: \verb|SPEX_matrix*| -Specifically, for different kinds of \verb|A| of size \verb|A->m| $\times$ \verb|A->n| -with \verb|nz| nonzero entries, its components are defined as: +\item \verb|F->rhos|: An $n \times 1$ dense matrix containing the pivot values used for LU or Cholesky factorization. Data type: \verb|SPEX_matrix*| -\begin{itemize} -\item - (0) \verb|SPEX_CSC|: A sparse matrix in CSC (compressed sparse column) format. - \verb|A->p| is an \verb|int64_t| array of size \verb|A->n|+1, \verb|A->i| - is an \verb|int64_t| array of size \verb|A->nzmax| (with $nz$ $\le$ - \verb|A->nzmax|), and \verb|A->x.TYPE| is an array of size - \verb|A->nzmax| of matrix entries (\verb'TYPE' is one of \verb|mpz|, - \verb|mpq|, \verb|mpfr|, \verb|int64|, or \verb|fp64|). The row indices - of column $j$ appear in \verb|A->i [A->p [j] ... A->p [j+1]-1]|, and the - values appear in the same locations in \verb|A->x.TYPE|. The \verb|A->j| - array is \verb|NULL|. \verb|A->nz| is ignored; the number of entries in - \verb|A| is given by \verb|A->p [A->n]|. - Row indices need not be sorted in each column, but duplicates cannot - appear. +\item \verb|F->P_perm|: Row permutation of the LU or Cholesky factors. Data type: \verb|int64_t*| -\item - (1) \verb|SPEX_TRIPLET|: A sparse matrix in triplet format. \verb|A->i| and - \verb|A->j| are both \verb|int64_t| arrays of size \verb|A->nzmax|, and - \verb|A->x.TYPE| is an array of values of the same size. The $k$th tuple - has row index \verb|A->i [k]|, column index \verb|A->j [k]| , and value - \verb|A->x.TYPE [k]|, with 0 $\le$ $k <$ \verb|A->nz|. - The \verb|A->p| array is \verb|NULL|. - Triplets can be unsorted, but duplicates cannot appear. +\item \verb|F->Pinv_perm|: Inverse row permutation of the LU or Cholesky factors. Data type: \verb|int64_t*| -\item - (2) \verb|SPEX_DENSE|: A dense matrix. The integer arrays \verb|A->p|, - \verb|A->i|, and \verb|A->j| are all \verb|NULL|. \verb|A->x.TYPE| is a - pointer to an array of size \verb|A->m|*\verb|A->n|, stored in - column-oriented format. The value of $A(i,j)$ is \verb|A->x.TYPE [p]| - with \verb|p| = $i + j*$\verb|A->m|. \verb|A->nz| is ignored; the number - of entries in \verb|A| is \verb|A->m| $\times$ \verb|A->n|. +\item \verb|F->Q_perm|: Column permutation of the LU factors. This is \verb|NULL| and ignored for Cholesky factorization. Data type: \verb|int64_t*| +\item \verb|F->Qinv_perm|: Inverse column permutation of the LU factors. This is \verb|NULL| and ignored for Cholesky factorization. Data type: \verb|int64_t*| \end{itemize} -\verb|A| may contain shallow components, \verb|A->p|, \verb|A->i|, \verb|A->j|, -and \verb|A->x|. For example, if \verb|A->p_shallow| is true, then a -non-\verb|NULL| \verb|A->p| is a pointer to a read-only array, and the -\verb|A->p| array is not freed by \verb|SPEX_matrix_free|. If \verb|A->p| is -\verb|NULL| (for a triplet or dense matrix), then \verb|A->p_shallow| has no -effect. +\update{ +As mentioned in the above description, one or more of these components could be \verb|NULL| for certain factorization. For example, \verb|F->U|, \verb|F->Q_perm| and \verb|F->Qinv_perm| are \verb|NULL| for Cholesky factorization. Moreover, \verb|F->Qinv_perm| can be \verb|NULL| for a non-updatable LU factorization with \verb|F->updatable=false|, but it will be generated when the LU factorization converted to the updatable form. -To simplify the access the entries in \verb|A|, SPEX package provides the -following macros (Note that the \verb|TYPE| parameter in the macros is one of: -\verb|mpz|, \verb|mpq|, \verb|mpfr|, \verb|int64| or \verb|fp64|): +Aside from that \verb|Qinv_perm| will be generated for the updatable LU factorization, +the only difference between non-updatable and updatable factorizations is +the way that $L$ (and $U$ if exists) is stored. Specifically, a updatable factorization must meet the following conditions. \begin{itemize} + \item Both \verb|F->L| and \verb|F->U| are \verb|SPEX_DYNAMIC_CSC| matrices. Notably, \verb|F->U| in the updatable + factorization is actually the transpose of $U$ (or equivalently, $U$ is stored + as compressed sparse row (CSR) form instead), since $U$ will be updated one row at a time. + + \item $A = LDU$, which means $L$ and $U$ are properly permuted. (Recall that + $PAQ = LDU$ or $PAP^T = LDL^T$ holds for static factorization). That is, for a + updatable factorization, the rows of $L$ are in the same order as the rows + of $A$, while the $j$-th column of $L$ (\verb|F->L->v[j]|) contains the $j$-th pivot, + which would be \verb|F->L->v[j]->x[0]|, (i.e., \verb|F->L->v[j]->i[0] == F->P_perm[j]|); the columns of $U$ (i.e., the rows of $U^T$) are in the same order + as the columns of $A$, while the $j$-th row of $U$ (i.e., the $j$-th column of $U^T$) + (\verb|F->U->v[j]|) contains the $j$-th pivot, which would be \verb|F->U->v[j]->x[0]|, + (i.e., \verb|F->U->v[j]->i[0] == F->Q_perm[j]|). +\end{itemize} -\item -\verb|SPEX_1D(A,k,TYPE)|: used to access the $k$th entry in - \verb|SPEX_matrix *A| using 1D linear addressing for - any matrix kind (CSC, triplet or dense), in any type - with \verb|TYPE| specified corresponding +Due to these non-trivial conditions, users cannot simply perform +\verb|SPEX_matrix_copy| to obtain \verb|F->L| and/or \verb|F->U| in \verb|SPEX_DYNAMIC_CSC SPEX_MPZ| format and +claim that it is updatable, and vice versa. To correctly convert the +factorization, user should call \verb|SPEX_factorization_convert| to perform in-place conversion for a +given \verb|F| to either updatable or non-updatable as specified. +} -\item -\verb|SPEX_2D(A,i,j,TYPE)|: used to access the $(i,j)$th entry in a dense - \verb|SPEX_matrix *A|. +A \verb|SPEX_factorization| is constructed by the appropriate factorizations (see sections \ref{ss:spex_left_lu_factorize} and \ref{ss:spex_chol_factorize} for further details). To free this data structure, the function \verb|SPEX_factorization_free| is used and discussed further in section \ref{ss:spex_factorization_free}.\update{, and updated by appropriate \verb|SPEX_Update_*| functions (see sections \ref{ss:SPEX_Update_Chol_Rank1} and \ref{ss:SPEX_Update_LU_ColRep} for further details). In addition, the SPEX package has a set of functions to convert, query and +destroy a SPEX factorization, \verb|SPEX_factorization|, as shown in the following table.} +\update{ +\begin{SizedCenteredTabular}{lp{2.5in}l} \hline + Function Name & Description & Section \\ \hline + \verb|SPEX_factorization_check| + & check the validity of a factorization and print it + & \ref{ss:spex_factorization_check} \\ \hline + \verb|SPEX_factorization_convert| + & convert a factorization to non-/updatable as specified + & \ref{ss:spex_factorization_convert} \\ \hline + \verb|SPEX_factorization_free| + & destroy a \verb|SPEX_factorization| and free its allocated memory + & \ref{ss:spex_factorization_free} \\ \hline +\end{SizedCenteredTabular} +} + +\update{It should be noted that all solvers (except +\verb|SPEX_Update_(t)solve|) and functions that create factorization return +non-updatable factorization with \verb|F->L| (and \verb|F->U| if exists) in \verb|SPEX_CSC SPEX_MPZ| form. On the other hand, all \verb|SPEX_Update_*| functions require and output updatable factorization with \verb|F->L| +(and \verb|F->U| if exists) in \verb|SPEX_DYNAMIC_CSC SPEX_MPZ| form. These \verb|SPEX_Update_*| functions check the input factorization, convert it (if not updatable) automatically, and output updatable factorization.} -\end{itemize} -The SPEX package has a set of functions to allocate, copy(convert), query and -destroy a SPEX matrix, \verb|SPEX_matrix|, as shown in the following table. -%---------------------------------------- -{\small -\begin{center} -\begin{tabular}{lp{2.5in}l} -\hline -function name & description & section \\ -\hline -\verb|SPEX_matrix_allocate| - & allocate a $m$-by-$n$ \verb|SPEX_matrix| - & \ref{s:user:matrix_allocate} \\ -\hline -\verb|SPEX_matrix_free| - & destroy a \verb|SPEX_matrix| and free its allocated memory - & \ref{s:user:matrix_free} \\ -\hline -\verb|SPEX_matrix_copy| - & make a copy of a matrix, into another kind and/or type - & \ref{s:user:matrix_copy} \\ -\hline -\verb|SPEX_matrix_nnz| - & get the number of entries in a matrix - & \ref{s:user:matrix_nnz} \\ -\hline -\end{tabular} -\end{center} -} %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_matrix_allocate|: allocate an $m$-by-$n$ -\verb|SPEX_matrix|} -\label{s:user:matrix_allocate} +\chapter{SPEX Utilities}\vspace{-0.75in} \label{ch:Util} +%------------------------------------------------------------------------------- + +%------------------------------------------------------------------------------- +\section{Overview} \label{s:util:overview} +%------------------------------------------------------------------------------- +SPEX Util contains utility and auxiliary functions for the SPEX +factorizations. Additionally, SPEX Util provides a wrapper class for +the GNU Multiple Precision Arithmetic (GMP) \cite{granlund2015gnu} and GNU +Multiple Precision Floating Point Reliable (MPFR) \cite{fousse2007mpfr} +libraries that prevent memory leaks and improve the overall stability of +these external libraries. SPEX Util is written in ANSI C. + + +%------------------------------------------------------------------------------- +\section{Managing the SPEX environment} \label{s:user:setup} %------------------------------------------------------------------------------- +Either \verb|SPEX_initialize| or \verb|SPEX_initialize_expert| (but not both) +must be called prior to using any other SPEX functions. Otherwise, all SPEX user-callable functions would return \verb|SPEX_PANIC|. \verb|SPEX_finalize| +must be called as the last SPEX function. +Note that if a user is working in a multi threaded environment then only one user thread should call the \verb|SPEX_initialize| and \verb|SPEX_finalize| functions. + +Subsequent SPEX sessions can be restarted after a call to +\verb|SPEX_finalize|, by calling either \verb|SPEX_initialize| or +\verb|SPEX_initialize_expert| (but not both), followed by a final call to +\verb|SPEX_finalize| when finished. -\begin{mdframed}[userdefinedwidth=6in] + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_initialize|: initialize the working environment} +\subsection{\texttt{SPEX\_initialize}: initialize the working environment} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} - SPEX_info SPEX_matrix_allocate + SPEX_info SPEX_initialize ( - SPEX_matrix **A_handle, // matrix to allocate - SPEX_kind kind, // CSC, triplet, or dense - SPEX_type type, // mpz, mpq, mpfr, int64, or double (fp64) - int64_t m, // # of rows - int64_t n, // # of columns - int64_t nzmax, // max # of entries - bool shallow, // if true, matrix is shallow. A->p, A->i, - // A->j, A->x are all returned as NULL and must - // be set by the caller. All A->*_shallow are - // returned as true. - bool init, // If true, and the data types are mpz, mpq, or - // mpfr, the entries are initialized (using the - // appropriate SPEX_mp*_init function). If - // false, the mpz, mpq, and mpfr arrays are - // allocated but not initialized. - const SPEX_options *option + void ) ; \end{verbatim} } \end{mdframed} -\verb|SPEX_matrix_allocate| allocates memory space for a $m$-by-$n$ -\verb|SPEX_matrix| whose kind (CSC, triplet or dense) and data type -(\verb|mpz|, \verb|mpq|, \verb|mpfr|, \verb|int64| or \verb|fp64|) is -specified. If \verb|shallow| is true, all components (\verb|A->p|, \verb|A->i|, -\verb|A->j|, \verb|A->x|) are returned as \verb|NULL|, and their shallow flags -are all true. The pointers \verb|A->p|, \verb|A->i|, \verb|A->j|, -and/or \verb|A->x| can then be assigned from arrays in the calling application. - -If \verb|shallow| is false, the appropriate individual arrays are allocated -(via \verb|SPEX_calloc|). The second boolean parameter is used if the entries -are \verb|mpz_t|, \verb|mpq_t|, or \verb|mpfr_t|. Specifically, if \verb|init| -is true, the individual entries within \verb|A->x.TYPE| are initialized using -the appropriate \verb|SPEX_mp*_init|) function. Otherwise, if \verb|init| is -false, the \verb|A->x.TYPE| array is allocated (via \verb|SPEX_calloc|) and -left that way. They are not otherwise initialized, and attempting to access -the values of these uninitialized entries will lead to undefined behavior. -Returns \verb|SPEX_PANIC| if SPEX has not been initialized. +\verb|SPEX_initialize| initializes the working environment for SPEX +functions. SPEX utilizes a specialized memory management scheme in order to +prevent potential memory failures caused by GMP and MPFR libraries. Either +this function or \verb|SPEX_initialize_expert| must be called prior to using +any other function in the library. Returns \verb|SPEX_PANIC| if SPEX has +already been initialized, or \verb|SPEX_OK| if successful. + %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_matrix_free|: free a \verb|SPEX_matrix|} -\label{s:user:matrix_free} +%\cprotect\subsection{\verb|SPEX_initialize_expert|: initialize environment (expert version)}\label{ss:SPEX_initialize_expert} +\subsection{\texttt{SPEX\_initialize\_expert}: initialize environment (expert version)} \label{ss:SPEX_initialize_expert} %------------------------------------------------------------------------------- - -\begin{mdframed}[userdefinedwidth=6in] +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} - SPEX_info SPEX_matrix_free + SPEX_info SPEX_initialize_expert ( - SPEX_matrix **A_handle, // matrix to free - const SPEX_options *option + void* (*MyMalloc) (size_t), // user-defined malloc + void* (*MyCalloc) (size_t, size_t), // user-defined calloc + void* (*MyRealloc) (void *, size_t), // user-defined realloc + void (*MyFree) (void *) // user-defined free ) ; \end{verbatim} } \end{mdframed} -\verb|SPEX_matrix_free| frees the \verb|SPEX_matrix *A|. Note that the input -of the function is the pointer to the pointer of a \verb|SPEX_matrix| -structure. This is because this function internally sets the pointer of a -\verb|SPEX_matrix| to be \verb|NULL| to prevent potential segmentation fault -that could be caused by double \verb|free|. If default settings are desired, -\verb|option| can be input as \verb|NULL|. - -%------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_matrix_copy|: make a copy of a \verb|SPEX_matrix| with a potentially different matrix-format and data-type} -\label{s:user:matrix_copy} -%------------------------------------------------------------------------------- +\verb|SPEX_initialize_expert| is the same as \verb|SPEX_initialize| except that +it allows for a redefinition of custom memory functions that are used for SPEX +and GMP/ MPFR. The four inputs to this function are pointers to four +functions with the same signatures as the ANSI C \verb'malloc', \verb'calloc', +\verb'realloc', and \verb'free' functions. That is: -\begin{mdframed}[userdefinedwidth=6in] +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} - SPEX_info SPEX_matrix_copy - ( - SPEX_matrix **C, // matrix to create (never shallow) - // inputs, not modified: - SPEX_kind kind, // CSC, triplet, or dense - SPEX_type type, // mpz_t, mpq_t, mpfr_t, int64_t, or fp64 - SPEX_matrix *A, // matrix to make a copy of (may be shallow) - const SPEX_options *option - ) ; + #include + void *malloc (size_t size) ; + void *calloc (size_t nmemb, size_t size) ; + void *realloc (void *ptr, size_t size) ; + void free (void *ptr) ; \end{verbatim} } \end{mdframed} -\verb|SPEX_matrix_copy| creates a \verb|SPEX_matrix *C| which is a modified -copy of a \verb|SPEX_matrix *A|. This function can convert between any pair of -the 15 kinds of matrices, so the new matrix \verb|C| can be of any type or kind -different than \verb|A|. On input \verb|C| must be non-\verb|NULL|, and the -value of \verb|*C| is ignored; it is overwritten, output with the matrix -\verb|C|, which is a copy of \verb|A| of kind \verb|kind| and type \verb|type|. +Returns \verb|SPEX_PANIC| if SPEX has already been initialized, +or \verb|SPEX_OK| if successful. -The input matrix is assumed to be valid. It can be checked first with -\verb|SPEX_matrix_check| (Section \ref{s:user:matrix_check}), if desired. -Results are undefined for an invalid input matrix \verb|A|. Returns -\verb|SPEX_PANIC| if SPEX has not been initialized. %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_matrix_nnz|: get the number of entries in a -\verb|SPEX_matrix|} -\label{s:user:matrix_nnz} +%\cprotect\subsection{\verb|SPEX_finalize|: free the working environment} +\subsection{\texttt{SPEX\_finalize}: free the working environment} \label{ss:SPEX_finalize} %------------------------------------------------------------------------------- - -\begin{mdframed}[userdefinedwidth=6in] +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} - SPEX_info SPEX_matrix_nnz // return # of entries in A, or -1 on error + SPEX_info SPEX_finalize ( - int64_t *nnz, - const SPEX_matrix *A, // matrix to query - const SPEX_options *option + void ) ; \end{verbatim} } \end{mdframed} -\verb|SPEX_matrix_nnz| returns an integer, \verb|nnz|, which is equal to the number of entries in a \verb|SPEX_matrix *A|. -For details regarding how the number of entries is obtained for different kinds -of matrices, refer to Section \ref{ss:SPEX_matrix}. -For any matrix with invalid dimension(s), nnz is returned as -1. -If default settings are desired, \verb|option| can be input as \verb|NULL|. -Returns \verb|SPEX_PANIC| if the SPEX working environment has not been initialized (e.g. via \verb|SPEX_initialize|). +\verb|SPEX_finalize| finalizes the working environment for SPEX +library, and frees any internal workspace created by SPEX. It must be +called as the last \verb|SPEX_*| function called, except that a subsequent +call to \verb|SPEX_initialize*| may be used to start another SPEX session. +Returns \verb|SPEX_PANIC| if SPEX has not been initialized, +or \verb|SPEX_OK| if successful. -%------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_matrix_check|: check and optionally print a \verb|SPEX_matrix|} -\label{s:user:matrix_check} -%------------------------------------------------------------------------------- +\subsection{\texttt{SPEX\_thread\_initialize}: initialize working environment for a single thread} -\begin{mdframed}[userdefinedwidth=6in] +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} - SPEX_info SPEX_matrix_check // returns a SPEX status code - ( - const SPEX_matrix *A, // matrix to check - const SPEX_options* option // defines the print level - ) ; + SPEX_info SPEX_thread_initialize + ( + void + ); \end{verbatim} } \end{mdframed} -\verb|SPEX_matrix_check| checks the validity of a \verb|SPEX_matrix *A| in any -of the 15 different matrix types (CSC, triplet, dense) $\times$ (\verb|mpz|, -\verb|mpq|, \verb|mpfr|, \verb|int64|, \verb|fp64|). The print level can be -changed via \verb|option->print_level| (refer to Section \ref{ss:SPEX_options} -for more details). If default settings are desired, \verb|option| can be input -as \verb|NULL|. Returns \verb|SPEX_PANIC| if SPEX has not been initialized. +\verb|SPEX_thread_initialize| initializes the working environment of SPEX for a single +user thread. If the user is working in a multithreaded environment, they must call +this function at the beginning of each user thread. Returns \verb|SPEX_OK| if successful +or \verb|SPEX_PANIC| if SPEX was already initialized. + +This function is only required for a multithreaded user application that +calls SPEX functions from threads other than the primary thread that +called \verb'SPEX_initialize'. + +When the primary thread of the user application starts, it must call +\verb'SPEX_initialize'. When the user application enters a parallel +region (say with OpenMP) or creates its own threads with a threading library, +each user thread must call \verb'SPEX_thread_initialize' when it starts, +and \verb'SPEX_thread_finalize' when it finishes. + +An example usage can be found in the \verb'SPEX/Demo' folder in the +\verb'spex_demo_threaded.c' main program. + +\subsection{\texttt{SPEX\_thread\_finalize}: finalize the working environment for a single thread} + +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_thread_finalize + ( + void + ); +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_thread_finalize| finalizes the working environment and frees any +internal workspace created by SPEX for a single user thread. If the user is working +in a multithreaded environment, they must call this function at the end of each +user thread. Returns \verb|SPEX_OK| if successful or \verb|SPEX_PANIC| if SPEX was not +initialized. %------------------------------------------------------------------------------- -\newpage -\cprotect\subsection{\verb|SPEX_matrix_div|: Divide dense matrix by scalar} +\section{Memory Management} \label{s:user:memmanag} %------------------------------------------------------------------------------- +The routines in this section are used to allocate and free memory for the data +structures used in SPEX. By default, SPEX relies on the SuiteSparse +memory management functions, \verb|SuiteSparse_malloc|, +\verb|SuiteSparse_calloc|, \verb|SuiteSparse_realloc|, and +\verb|SuiteSparse_free|. By default, those functions rely on the ANSI C +\verb|malloc|, \verb|calloc|, \verb|realloc|, and \verb|free|, but this may be +changed by initializing the SPEX environment with +\verb|SPEX_initialize_expert|. + -\begin{mdframed}[userdefinedwidth=6in] +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_calloc|: allocate initialized memory} +\subsection{\texttt{SPEX\_calloc}: allocate initialized memory} \label{ss:SPEX_calloc} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} -SPEX_info SPEX_matrix_div // divides the x matrix by a scalar -( - SPEX_matrix **x2_handle, // x2 = x/scalar - SPEX_matrix* x, // input vector x - const mpz_t scalar, // the scalar - const SPEX_options *option -); + void *SPEX_calloc + ( + size_t nitems, // number of items to allocate + size_t size // size of each item + ) ; \end{verbatim} } \end{mdframed} -This function divides the matrix \verb|x| by the scalar \verb|scalar|. On input, \verb|x2_handle| is NULL and \verb|x| must be \verb|SPEX_DENSE| of \verb|SPEX_MPZ| type. On success, \verb|x2_handle| is returned as \verb|SPEX_DENSE| with \verb|SPEX_MPQ| entries each of which is equal to \verb|x / scalar|. +\verb|SPEX_calloc| allocates a block of memory for an array of \verb|nitems| +elements, each of them \verb|size| bytes long, and initializes all its bits to +zero. If any input is less than 1, it is treated as if equal to 1. If the +function failed to allocate the requested block of memory, then a \verb|NULL| +pointer is returned. +Returns \verb|NULL| if SPEX has not been initialized. + %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_matrix_mul|: Multiply dense matrix by scalar} +\newpage +%\cprotect\subsection{\verb|SPEX_malloc|: allocate uninitialized memory} +\subsection{\texttt{SPEX\_malloc}: allocate uninitialized memory} \label{ss:SPEX_malloc} %------------------------------------------------------------------------------- - -\begin{mdframed}[userdefinedwidth=6in] +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} -SPEX_matrix_mul // multiplies x by a scalar -( - SPEX_matrix *x, // matrix to be multiplied - const mpz_t scalar // scalar to multiply by -); + void *SPEX_malloc + ( + size_t size // size of memory space to allocate + ) ; \end{verbatim} } \end{mdframed} -This function divides the matrix \verb|x| by the scalar \verb|scalar|. On input, \verb|x| must be \verb|SPEX_DENSE| of \verb|SPEX_MPZ| type. On success, \verb|x| is overwritten by \verb|x * scalar|. +\verb|SPEX_malloc| allocates a block of \verb|size| bytes of memory, returning +a pointer to the beginning of the block. The content of the newly allocated +block of memory is not initialized, remaining with indeterminate values. +If \verb|size| is less than 1, it is treated as if equal to 1. If the function +fails to allocate the requested block of memory, then a \verb|NULL| pointer is +returned. +Returns \verb|NULL| if SPEX has not been initialized. %------------------------------------------------------------------------------- -\cprotect\section{\verb|SPEX_LU_analysis| structure} -\label{ss:SPEX_LU_analysis} +%\cprotect\subsection{\verb|SPEX_realloc|: resize allocated memory} +\subsection{\texttt{SPEX\_realloc}: resize allocated memory} \label{ss:SPEX_realloc} %------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + void *SPEX_realloc // pointer to reallocated block, or original block + // if the realloc failed + ( + int64_t nitems_new, // new number of items + int64_t nitems_old, // previous/old number of items + size_t size_of_item, // size of each item + void *p, // pointer to reallocate + bool *ok // true if success, false on failure + ) ; +\end{verbatim} +} \end{mdframed} -The \verb|SPEX_LU_analysis| data structure is used for storing the column -permutation for LU factorization and the estimate of the number of nonzeros -that may appear in $L$ and $U$. This need not be modified or accessed in the -user application; it simply needs to be passed in directly to the other -functions that take it as in input parameter. A \verb|SPEX_LU_analysis| -structure has the following components: +\verb|SPEX_realloc| is a wrapper for realloc. If \verb|p| is non-\verb|NULL| on +input, it points to a previously allocated array of size \verb|nitems_old| +$\times$ \verb|size_of_item|. The array is reallocated to be of size +\verb|nitems_new| $\times$ \verb|size_of_item|. If \verb|p| is \verb|NULL| on input, +then a new array of that size is allocated. On success, a pointer to the new +array is returned. Returns \verb|ok| as \verb|false| if SPEX has not been +initialized. -\begin{itemize} -\item \verb|S->q|: The column permutation stored as a dense \verb|int64_t| -vector of size $n+1$, where $n$ is the number of columns of the analyzed matrix. -Currently this vector is obtained via COLAMD, AMD, or is set to no ordering -(i.e., $[0, 1, \hdots, n-1]$). - -\item \verb|S->lnz|: An \verb|int64_t| which is an estimate of the number of -nonzeros in $L$. \verb|S->lnz| must be in the range of $[n, n^2]$. If -\verb|S->lnz| is too small, the program may waste time performing extra memory -reallocations. This is set during the symbolic analysis. - -\item \verb|S->unz|: An \verb|int64_t| which is an estimate of the number of -nonzeros in $U$. \verb|S->unz| must be in the range of $[n, n^2]$. If -\verb|S->unz| is too small, the program may waste time performing extra memory -reallocations. This is set during the symbolic analysis. -\end{itemize} +If the reallocation fails, \verb|p| is not modified, and \verb|ok| is returned +as \verb|false| to indicate that the reallocation failed. If the size +decreases or remains the same, then the method always succeeds (\verb|ok| is +returned as \verb|true|), unless SPEX has not been initialized. -The SPEX package provides the following functions to create and destroy a -\verb|SPEX_LU_analysis| structure: +Typical usage: the following code fragment allocates an array of 10 +\verb|int|'s, and then increases the size of the array to 20 \verb|int|'s. If +the \verb|SPEX_malloc| succeeds but the \verb|SPEX_realloc| fails, then the +array remains unmodified, of size 10. + +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + int *p ; + p = SPEX_malloc (10 * sizeof (int)) ; + if (p == NULL) { error here ... } + printf ("p points to an array of size 10 * sizeof (int)\n") ; + bool ok ; + p = SPEX_realloc (20, 10, sizeof (int), p, &ok) ; + if (ok) printf ("p has size 20 * sizeof (int)\n") ; + else printf ("realloc failed; p still has size 10 * sizeof (int)\n") ; + SPEX_free (p) ; +\end{verbatim} +} \end{mdframed} -%---------------------------------------- -{\small -\begin{center} -\begin{tabular}{lll} -\hline -function/macro name & description & section \\ -\hline -\verb|SPEX_LU_analyze| - & create \verb|SPEX_LU_analysis| structure - & \ref{s:SPEX_LU_analyze} \\ -\hline -\verb|SPEX_LU_analysis_free| - & destroy \verb|SPEX_LU_analysis| structure - & \ref{ss:LU_analysis_free} \\ -\hline -\end{tabular} -\end{center} -} %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_LU_analyze|: perform symbolic analysis} -\label{s:SPEX_LU_analyze} +%\cprotect\subsection{\verb|SPEX_free|: free allocated memory} +\newpage +\subsection{\texttt{SPEX\_free}: free allocated memory} \label{ss:SPEX_free} %------------------------------------------------------------------------------- - -\begin{mdframed}[userdefinedwidth=6in] +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} - SPEX_info SPEX_LU_analyze + void SPEX_free ( - SPEX_LU_analysis **S, // symbolic analysis (column permutation - // and nnz L,U) - const SPEX_matrix *A, // Input matrix - const SPEX_options *option // Control parameters + void *p // Pointer to memory space to free ) ; \end{verbatim} } \end{mdframed} -\verb|SPEX_LU_analyze| performs the symbolic ordering for any LU factorzation in SPEX package. Currently, -there are three options: no ordering, COLAMD, or AMD, which are passed in by -\verb|SPEX_options| \verb|*option|. For more details, refer to -Section \ref{ss:SPEX_options}. +\verb|SPEX_free| frees the memory previously allocated by a call to +\verb|SPEX_calloc|, \verb|SPEX_malloc|, or \verb|SPEX_realloc|. If \verb|p| is +\verb|NULL| on input, then no action is taken (this is not an error condition). +To guard against freeing the same memory space twice, the following macro +\verb|SPEX_FREE| is provided, which calls \verb|SPEX_free| and then sets the +freed pointer to \verb|NULL|. + +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + #define SPEX_FREE(p) \ + { \ + SPEX_free (p) ; \ + (p) = NULL ; \ + } +\end{verbatim} +} \end{mdframed} -The \verb|SPEX_LU_analysis *S| is created by calling -\verb|SPEX_LU_analyze(&S, A, option)| with \verb|SPEX_matrix *A| properly -initialized as CSC matrix and \verb|option| be \verb|NULL| if default ordering -(COLAMD) is desired. The value of \verb|S| is ignored on input. On output, -\verb|S| is a pointer to the newly created symbolic analysis structure and -\verb|SPEX_OK| is returned upon successful completion, or \verb|S = NULL| with -error status returned if a failure occurred. Returns \verb|SPEX_PANIC| if SPEX -has not been initialized. +No action is taken if SPEX has not been initialized. -The analysis \verb|S| is freed by \verb|SPEX_LU_analysis_free|. %------------------------------------------------------------------------------- -\newpage -\cprotect\subsection{\verb|SPEX_LU_analysis_free|: free \verb|SPEX_LU_analysis| structure} -\label{ss:LU_analysis_free} +%\cprotect\section{\verb|SPEX_options| helper functions} \label{ss:SPEX_options} +\section{\texttt{SPEX\_options} helper function} \label{ss:SPEX_options} %------------------------------------------------------------------------------- +The \verb|SPEX_options| structure contains numerous parameters that may be +modified to change the behavior of the SPEX functions. Default values of +these parameters will lead to good performance in most cases. The following helper functions +are provided. -\begin{mdframed}[userdefinedwidth=6in] + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_create_default_options|: create default \verb|SPEX_options| structure} +\subsection{\texttt{SPEX\_create\_default\_options}: create default \texttt{SPEX\_options} structure} +\label{ss:create_default_options} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} - SPEX_info SPEX_LU_analysis_free + SPEX_options* SPEX_create_default_options ( - SPEX_LU_analysis **S, // Structure to be deleted - const SPEX_options *option + void ) ; \end{verbatim} } \end{mdframed} +\verb|SPEX_create_default_options| creates and returns a pointer to a +\verb|SPEX_options| struct with default parameters upon successful allocation, +which are discussed in Section \ref{ss:SPEX_options_struct}. To safely free +the \verb|SPEX_options* option| structure, simply use \newline \verb|SPEX_FREE(option)|. +All functions that require \verb|SPEX_options *option| as an input argument can +have a \verb'NULL' pointer passed instead. In this case, the default value of +the corresponding command option is used. -\verb|SPEX_LU_analysis_free| frees a \verb|SPEX_LU_analysis| structure. -Note that the input of the function is the pointer to the pointer of a -\verb|SPEX_LU_analysis| structure. This is because this function internally -sets the pointer of a \verb|SPEX_LU_analysis| to be \verb|NULL| to prevent -potential segmentation fault that could be caused by double \verb|free|. -If default settings are desired, \verb|option| can be input as \verb|NULL|. -Returns \verb|SPEX_PANIC| if SPEX has not been initialized. +\update{ +%-------------------------------------------------------------------------------%\cprotect\section{\verb|SPEX_vector| helper functions} \label{s:spex_vector_helper} +\section{\texttt{SPEX\_vector} helper functions} \label{s:spex_vector_helper} +%------------------------------------------------------------------------------- %------------------------------------------------------------------------------- -\section{SPEX wrapper functions for GMP and MPFR} +%\cprotect\subsection{\verb|SPEX_vector_allocate|: Allocate a spex vector} \label{ss:spex_vector_allocate} +\subsection{\texttt{SPEX\_vector\_allocate}: Allocate a SPEX vector} \label{ss:spex_vector_allocate} %------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + 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 + ); +\end{verbatim} +} \end{mdframed} -SPEX provides a wrapper class for all GMP and MPFR functions used by SPEX. -The wrapper class provides error-handling for out-of-memory conditions -that are not handled by the GMP and MPFR libraries. These wrapper functions -are used inside all SPEX functions, wherever any GMP or MPFR functions are -used. These functions may also be called by the end-user application. - -Each wrapped function has the same name as its corresponding GMP/MPFR function -with the added prefix \verb|SPEX_|. For example, the default GMP function -\verb|mpz_mul| is changed to \verb|SPEX_mpz_mul|. Each SPEX GMP/MPFR function -returns \verb|SPEX_OK| if successful or the correct error code if not. The -following table gives a brief list of each currently covered SPEX GMP/MPFR -function. For a detailed description of each function, refer to -\verb|SPEX/SPEX/SPEX_Util/Source/SPEX_gmp.c|. - -If additional GMP and MPFR functions are needed in the end-user application, -this wrapper mechanism can be extended to those functions. Below are -instructions on how to do this. +\verb|SPEX_vector_allocate| creates and initializes a \verb|SPEX_vector| of size \verb|nzmax|. On input, the \verb|SPEX_vector| \verb|*v| that \verb|v_handle| points to is \verb|NULL|. On output, \verb|SPEX_vector| \verb|*v| is allocated with \verb|v->nz|=0, \verb|v->nzmax|=\verb|nzmax|, \verb|v->scale|=1, \verb|v->i| being an \verb|int64_t| array of size \verb|nzmax| and \verb|v->x| being an array containing \verb|nzmax| initialized \verb|mpz_t| entries. -Given a GMP function \verb|void gmpfunc(TYPEa a, TYPEb b, ...)|, where -\verb|TYPEa| and \verb|TYPEb| can be GMP type data (\verb|mpz_t|, -\verb|mpq_t| and \verb|mpfr_t|, for example) or non-GMP type data (\verb|int|, -\verb|double|, for example), and they need not to be the same. -A wrapper for a new GMP or MPFR function can be created by following -this outline: -\newpage -\begin{mdframed}[userdefinedwidth=6in] +%-------------------------------------------------------------------------------%\cprotect\subsection{\verb|SPEX_vector_realloc|: Reallocate a spex vector} \label{ss:spex_vector_realloc} +\subsection{\texttt{SPEX\_vector\_realloc}: Reallocate a SPEX vector} \label{ss:spex_vector_realloc} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} -SPEX_info SPEX_gmpfunc -( - TYPEa a, - TYPEb b, - ... -) -{ - // Start the GMP Wrappter - // uncomment one of the following: - // If this function is not modifying any GMP/MPFR type variable, then use - //SPEX_GMP_WRAPPER_START; - // If this function is modifying mpz_t type (say TYPEa = mpz_t), then use - //SPEX_GMPZ_WRAPPER_START(a) ; - // If this function is modifying mpq_t type (say TYPEa = mpq_t), then use - //SPEX_GMPQ_WRAPPER_START(a) ; - // If this function is modifying mpfr_t type (say TYPEa = mpfr_t), then use - //SPEX_GMPFR_WRAPPER_START(a) ; - - // Call the GMP function - gmpfunc(a,b,...) ; - - //Finish the wrapper and return ok if successful. - SPEX_GMP_WRAPPER_FINISH; - return SPEX_OK; -} + 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 + ); \end{verbatim} } \end{mdframed} -Note that, other than \verb|SPEX_mpfr_fprintf|, \verb|SPEX_gmp_fprintf|, -\verb|SPEX_gmp_printf| and \verb|SPEX_gmp_fscanf|, all of the wrapped GMP/MPFR -functions always return \verb|SPEX_info| to the caller. Therefore, for some -GMP/MPFR functions that have their own return value. For example, for -\verb|int mpq_cmp(const mpq_t a, const mpq_t b)|, the return value becomes a -parameter of the wrapped function. In general, a GMP/MPFR function in the form -of \verb|TYPEr gmpfunc(TYPEa a, TYPEb b, ...)|, the wrapped -function can be constructed as follows: +\verb|SPEX_vector_realloc| either expands or shrinks the given \verb|SPEX_vector *v| of size \verb|v->nzmax| so that its new size is \verb|new_size|. If \verb|new_size > v->nzmax|, all newly allocated \verb|mpz_t| entries are initialized. -\begin{mdframed}[userdefinedwidth=6in] +%-------------------------------------------------------------------------------%\cprotect\subsection{\verb|SPEX_vector_free|: Free a spex vector} \label{ss:spex_vector_free} +\subsection{\texttt{SPEX\_vector\_free}: Free a SPEX vector} \label{ss:spex_vector_free} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} -SPEX_info SPEX_gmpfunc -( - TYPEr *r, // return value of the GMP/MPFR function - TYPEa a, - TYPEb b, - ... -) -{ - // Start the GMP Wrappter - //SPEX_GMP_WRAPPER_START; - - // Call the GMP function - *r = gmpfunc(a,b,...) ; - - //Finish the wrapper and return ok if successful. - SPEX_GMP_WRAPPER_FINISH; - return SPEX_OK; -} + SPEX_info SPEX_vector_free + ( + SPEX_vector **v_handle, // vector to be deleted + const SPEX_options *option + ); \end{verbatim} } \end{mdframed} -% \newpage -\thispagestyle{empty} -{\scriptsize -\begin{center} -\begin{tabular}{|l|l|l|} -\hline -%---------------------------------------- -{\bf MPFR Function} & \verb|SPEX_MPFR| {\bf Function} & {\bf Description} \\ -%---------------------------------------- -\hline\hline -\verb|n = mpfr_asprintf(&buff, fmt, ...)| - & \verb|n = SPEX_mpfr_asprintf(&buff, fmt, ...)| - & Print format to allocated string \\ \hline -\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_set(x, y, rnd)| +\verb|SPEX_vector_free| frees the \verb|SPEX_vector *v| that \verb|v_handle| points to. On output, the memory associated with \verb|v| is freed and \verb|v| is set to \verb|NULL|. +} + +%-------------------------------------------------------------------------------%\cprotect\section{\verb|SPEX_matrix| helper functions} \label{s:spex_matrix_functions} +\newpage +\section{\texttt{SPEX\_matrix} helper functions} \label{s:spex_matrix_functions} +%------------------------------------------------------------------------------- +These functions provide several utilities for a \verb|SPEX_matrix|. + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_matrix_allocate|: allocate an $m$-by-$n$ \verb|SPEX_matrix|} +\subsection{\texttt{SPEX\_matrix\_allocate}: allocate an m-by-n \texttt{SPEX\_matrix}} +\label{s:user:matrix_allocate} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_matrix_allocate + ( + SPEX_matrix **A_handle, // matrix to allocate + SPEX_kind kind, // CSC, triplet, dense or SPEX_DYNAMIC_CSC + SPEX_type type, // mpz, mpq, mpfr, int64, or double + int64_t m, // # of rows + int64_t n, // # of columns + int64_t nzmax, // max # of entries + bool shallow, // if true, matrix is shallow. A->p, A->i, A->j, + // A->x are all returned as NULL and must be set + // by the caller. All A->*_shallow are returned + // as true. Ignored for SPEX_DYNAMIC_CSC + // kind matrix. + bool init, // If true, and the data types are mpz, mpq, or + // mpfr, the entries of A->x are initialized + // (using the proper SPEX_mp*_init function). + // If false, the mpz, mpq, and mpfr arrays are + // allocated but not initialized. Meaningless + // for data types FP64 or INT64. Ignored if kind + // is SPEX_DYNAMIC_CSC or shallow is true. + const SPEX_options *option + ) ; +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_matrix_allocate| allocates memory space for a $m$-by-$n$ +\verb|SPEX_matrix| whose kind (CSC, triplet, dense, or dynamic CSC) and data type +(\verb|mpz|, \verb|mpq|, \verb|mpfr|, \verb|int64| or \verb|fp64|) is +specified. On input, the SPEX matrix that \verb|A_handle| points to is \verb|NULL|. +On output, \verb|A_handle| points to a SPEX matrix of specified type, kind and size. +%Returns SPEX_PANIC if SPEX has not been initialized. + +For a CSC, triplet or dense matrix, if \verb|shallow| is true, all components (\verb|A->p|, \verb|A->i|, +\verb|A->j|, \verb|A->x|) are returned as \verb|NULL|, and their shallow flags +are all true. The pointers \verb|A->p|, \verb|A->i|, \verb|A->j|, +and/or \verb|A->x| can then be assigned from arrays in the calling application. +If \verb|shallow| is false, the appropriate individual arrays are allocated +(via \verb|SPEX_calloc|). The second boolean parameter \verb|init| is used if the entries +are \verb|mpz_t|, \verb|mpq_t|, or \verb|mpfr_t|. Specifically, if \verb|init| +is true, the individual entries within \verb|A->x.TYPE| are initialized using +the appropriate \verb|SPEX_mp*_init| function. Otherwise, if \verb|init| is +false, the \verb|A->x.TYPE| array is allocated (via \verb|SPEX_calloc|) and +left that way. They are not otherwise initialized, and attempting to access +the values of these uninitialized entries will lead to undefined behavior. + +For a \verb|SPEX_DYNAMIC_CSC| matrix, \verb|type|, \verb|shallow| and \verb|init| are ignored (since it only allows \verb|mpz_t| entries). Moreover, each column of the returned \verb|SPEX_DYNAMIC_CSC| matrix will be +allocated as \verb|SPEX_vector| with zero available entry. Additional reallocation +for each column will be needed. + + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_matrix_free|: free a \verb|SPEX_matrix|} +\newpage +\subsection{\texttt{SPEX\_matrix\_free}: free a \texttt{SPEX\_matrix}} \label{s:user:matrix_free} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_matrix_free + ( + SPEX_matrix **A_handle, // matrix to free + const SPEX_options *option + ) ; +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_matrix_free| frees the \verb|SPEX_matrix *A|. Note that the input +of the function is the pointer to the pointer of a \verb|SPEX_matrix| +structure. This is because this function internally sets the pointer of a +\verb|SPEX_matrix| to be \verb|NULL| to prevent potential segmentation fault +that could be caused by double \verb|free|. +%If default settings are desired, +%\verb|option| can be input as \verb|NULL|. + + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_matrix_copy|: make a copy of a \verb|SPEX_matrix| with a potentially different matrix-format and data-type} +\subsection{\texttt{SPEX\_matrix\_copy}: make a copy of a \texttt{SPEX\_matrix} with a potentially different matrix-format and data-type} \label{s:user:matrix_copy} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_matrix_copy + ( + SPEX_matrix **C_handle, // matrix to create (never shallow) + // inputs, not modified: + SPEX_kind C_kind, // C->kind: CSC, triplet, dense, or dynamic + SPEX_type C_type, // C->type: mpz_t, mpq_t, mpfr_t, int64_t, or double + const SPEX_matrix *A, // matrix to make a copy of (may be shallow) + const SPEX_options *option + ) ; +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_matrix_copy| makes a deep copy of a \verb|SPEX_matrix *A| as a new \verb|SPEX_matrix *C|, which can be any of the 16 matrix formats discussed in Section \ref{ss:SPEX_matrix}. That is, the new matrix \verb|C| can be exactly the same as \verb|A| or any other type or kind +different than \verb|A|. On input, the SPEX matrix that \verb|C_handle| points to must be \verb|NULL| and will be ignored, and \verb|A| is a valid matrix that can be potentially shallow. On output, \verb|C_handle| points to the matrix +\verb|C|, which is a copy of \verb|A| of kind \verb|kind| and type \verb|type|. + + +Results are undefined for an invalid input matrix \verb|A|. Though all matrices generated from any SPEX user-callable functions are valid, they could become invalid when user directly modifies their component(s). To check the validity of the input matrix, call +\verb|SPEX_matrix_check| (Section \ref{s:user:matrix_check}). + + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_matrix_nnz|: get the number of entries in a \verb|SPEX_matrix|} +\subsection{\texttt{SPEX\_matrix\_nnz}: get the number of entries in a \texttt{SPEX\_matrix}} +\label{s:user:matrix_nnz} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_matrix_nnz // return # of entries in A, or -1 on error + ( + int64_t *nnz, + const SPEX_matrix *A, // matrix to query + const SPEX_options *option + ) ; +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_matrix_nnz| returns an integer, \verb|nnz|, which is equal to the number of entries in a \verb|SPEX_matrix *A|. +For details regarding how the number of entries is obtained for different kinds +of matrices, refer to Section \ref{ss:SPEX_matrix}. +For any matrix with invalid dimension(s), nnz is returned as -1. +%If default settings are desired, \verb|option| can be input as \verb|NULL|. +%Returns \verb|SPEX_PANIC| if the SPEX working environment has not been initialized (e.g. via %\verb|SPEX_initialize|). + + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_matrix_check|: check and optionally print a \verb|SPEX_matrix|} +\subsection{\texttt{SPEX\_matrix\_check}: check and optionally print a \texttt{SPEX\_matrix}} \label{s:user:matrix_check} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_matrix_check // returns a SPEX status code + ( + const SPEX_matrix *A, // matrix to check + const SPEX_options* option // defines the print level + ) ; +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_matrix_check| checks the validity of a \verb|SPEX_matrix *A| in any +of the 16 matrix formats discussed in Section \ref{ss:SPEX_matrix}. +%the 15 different matrix types (CSC, triplet, dense) $\times$ (\verb|mpz|, +%\verb|mpq|, \verb|mpfr|, \verb|int64|, \verb|fp64|). +In addition, it prints the matrix and any error found with proper print level specified by +\verb|option->print_level|. Specifically, \verb|SPEX_matrix_check| prints nothing for \verb|print_level|=0 (default); or just errors for \verb|print_level|=1; or errors and terse output of the matrix for \verb|print_level|=2; or errors and detailed output of the matrix for \verb|print_level|=3. +%(refer to Section \ref{ss:SPEX_options} for more details). +As mentioned, if default settings are desired, \verb|option| can be input as \verb|NULL|. +% Returns \verb|SPEX_PANIC| if SPEX has not been initialized. + + +%-------------------------------------------------------------------------------%\cprotect\section{\verb|SPEX_symbolic_analysis| helper functions} \label{s:spex_symbolic_analysis_helper} +\section{\texttt{SPEX\_symbolic\_analysis} helper function} \label{s:spex_symbolic_analysis_helper} +%------------------------------------------------------------------------------- + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_symbolic_analysis_free|: free a symbolic analysis struct} +\subsection{\texttt{SPEX\_symbolic\_analysis\_free}: free a symbolic analysis struct} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_symbolic_analysis_free + ( + SPEX_symbolic_analysis **S_handle, // Structure to be deleted + const SPEX_options *option + ); +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_symbolic_analysis_free| frees the memory of the \verb|SPEX_symbolic_analysis| \verb|*S| that \verb|S_handle| points to. On output, the symbolic analysis \verb|S| is set to \verb|NULL|. + + +%-------------------------------------------------------------------------------%\cprotect\section{\verb|SPEX_factorization| helper functions} \label{s:spex_factorization_helper} +\section{\texttt{SPEX\_factorization} helper functions} \label{s:spex_factorization_helper} +%------------------------------------------------------------------------------- +These functions provide several utilities for a \verb|SPEX_factorization| + + +\update{ +%-------------------------------------------------------------------------------%\cprotect\subsection{\verb|SPEX_factorization_check|: check correctness of a factorizations struct} +\subsection{\texttt{SPEX\_factorization\_check}: check correctness of a factorizations struct} \label{ss:spex_factorization_check} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_factorization_check + ( + SPEX_factorization *F, // The factorization to check + const SPEX_options* option + ); +\end{verbatim} +} \end{mdframed} + + +\verb|SPEX_factorization_check| checks if a given factorization \verb|F| is correctly formatted. Specifically, it checks the following 5 conditions: +\begin{enumerate} + \item All required components of \verb|F| are present (e.g., an array was not erroneously freed) + \item The sizes of all matrices match (e.g., \verb|F->L| and \verb|F->U| are square matrices of the same dimension) + \item \verb|F->L| (and \verb|F->U| if exists) is correctly formatted via \verb|SPEX_matrix_check| + \item \verb|F->L|, \verb|F->U|, and \verb|F->rhos| have the correct and same pivot values. Additionally, when \verb|F->updatable=true|, \verb|F->L| (and \verb|F->U| if exists) is of \verb|SPEX_DYNAMIC_CSC|, and the $i$-th pivot is the first entry in the nonzero list of $i$-th vector of \verb|L| (and \verb|U| if exists), i.e., \verb|F->L->v[i]->i[0] == F->P_perm[i]| and \verb|F->U->v[i]->i[0] ==| \verb|F->Q_perm[i]| + \item Each permutation has no repeated indices and maps from $[0..n-1]$ to $[0..n-1]$; \verb|P_perm| and \verb|Pinv_perm| are mutually inverse vectors, same applied to \verb|(Q_perm,| \verb|Qinv_perm)| if exists +\end{enumerate} + + +Similar to \verb|SPEX_matrix_check|, \verb|SPEX_factorization_check| also prints values of the factorization, together with any error found, with proper print level specified by +\verb|option->print_level|. Specifically, \verb|SPEX_factorization_check| prints nothing for \verb|print_level|=0 (default); or just errors for \verb|print_level|=1; or errors and terse output of the factorization for \verb|print_level|=2; or errors and detailed output of the factorization for \verb|print_level|=3. +As mentioned, if default settings are desired, \verb|option| can be input as \verb|NULL|. } + +%-------------------------------------------------------------------------------%\cprotect\subsection{\verb|SPEX_factorization_convert|: Convert between updatable and non updatable} +\update{\subsection{\texttt{SPEX\_factorization\_convert}: Convert between updatable and non-updatable} \label{ss:spex_factorization_convert} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_factorization_convert + ( + SPEX_factorization *F, // The factorization to be converted + bool updatable, // if true, make F updatable. false: make non-updatable + const SPEX_options* option // Command options + ); +\end{verbatim} +} \end{mdframed} + + +\verb|SPEX_factorization_convert| performs in-place conversion between updatable and +non-updatable factorization as specified by the boolean +input argument \verb'updatable'. If \verb|F->updatable == updatable| holds upon input, +this function does nothing. Otherwise, it performs the corresponding +in-place conversion. In case of any error, the returned factorization should be considered as +undefined. + +Upon input, \verb|F->L| (and \verb|F->U| if exists) must be non-shallow \verb|SPEX_CSC SPEX_MPZ| matrix for +non-updatable (static) factorization (i.e., \verb|F->updatalbe == false|), +otherwise, the input format is considered as incorrect and \verb|SPEX_INCORRECT_INPUT| is returned. Likewise, \verb|F->L| (and \verb|F->U| +if exists) must be \verb|SPEX_DYNAMIC_CSC SPEX_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 \verb|F|. +} + + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_factorization_free|: Free a SPEX factorization} \label{ss:spex_factorization_free} +\subsection{\texttt{SPEX\_factorization\_free}: Free a SPEX factorization} \label{ss:spex_factorization_free} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_factorization_free + ( + SPEX_factorization **F_handle, // Structure to be deleted + const SPEX_options *option + ); +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_factorization_free| frees the memory of the \verb|SPEX_factorization *F| that \verb|F_handle| points to, and sets \verb|F| to \verb|NULL|. + +%------------------------------------------------------------------------------- +\newpage +\section{Misc Utilty Functions} +%------------------------------------------------------------------------------- + +%------------------------------------------------------------------------------- +\subsection{\texttt{SPEX\_version}: Return version of the code} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_version + ( + int version [3], // SPEX major, minor, and sub version + char date [128] // date of this version + ) +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_version| returns the library version and date. +The \verb'version' array contains the three version +numbers that are available at compile-time \verb'#define''d values: +\verb'SPEX_VERSION_MAJOR', +\verb'SPEX_VERSION_MINOR', and +\verb'SPEX_VERSION_SUB', in that order. The \verb'SPEX_version' function +allows the user application to check which version of SPEX it has been +linked with. The three \verb'#define''d values allow the user application +to know which version of SPEX was used at compile-time, which might not +be the same version that was linked later on. +The \verb'date' is the string \verb'SPEX_DATE', in the form +\verb'"Mar 31, 2023"' for example. The string is null-terminated. + + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_determine_symmetry|: Determine if a matrix is symmetric} +\subsection{\texttt{SPEX\_determine\_symmetry}: Determine if a matrix is symmetric} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_determine_symmetry + ( + bool *is_symmetric, // true if symmetric + SPEX_matrix* A, // Input matrix to be checked for symmetry + const SPEX_options* option // Command options + ); +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_determine_symmetry| checks if \verb|A| is pattern and numerically symmetric. It first checks for pattern symmetry. If it is pattern symmetric, it is checked for numerical symmetry. If $A$ is a symmetric matrix, \verb|is_symmetric| is returned as \verb|true|. + +% removed +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_scale|: Scale a matrix by a constant} +%\subsection{\texttt{SPEX\_scale}: Scale a matrix by a constant} +%------------------------------------------------------------------------------- +%\begin{mdframed}[userdefinedwidth=\textwidth] +%{\footnotesize +%\begin{verbatim} +% SPEX_info SPEX_scale +% ( +% // Output +% SPEX_matrix* x, +% // Input +% const mpq_t scaling_num, //numerator +% const mpq_t scaling_den, //denominator +% const SPEX_options* option // command options +% ); +%\end{verbatim} +%} \end{mdframed} + +%This function scales the matrix \verb|x| by the term \verb|scaling_num|/\verb|scaling_den|. This is %primarily used during forward and backward solve routines. + + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_transpose|: Transpose a csc mpz matrix} +\subsection{\texttt{SPEX\_transpose}: Transpose a CSC mpz matrix} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_transpose + ( + SPEX_matrix **C_handle, // C = A' + SPEX_matrix *A, // Matrix to be transposed + const SPEX_options *option + ); +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_transpose| sets $C = A^T$. Currently, it is only supported if $A$ is CSC and \verb|mpz_t|. Returns \verb|SPEX_OK| if successful otherwise returns the appropriate error code. + + +%------------------------------------------------------------------------------- +\newpage +\section{\texttt{SPEX\_gmp}: SPEX wrapper functions for GMP/MPFR} +%------------------------------------------------------------------------------- +SPEX provides a wrapper class for all GMP and MPFR functions used by SPEX. +The wrapper class provides error-handling for out-of-memory conditions +that are not handled by the GMP and MPFR libraries. These wrapper functions +are used inside all SPEX functions, wherever any GMP or MPFR functions are +used. These functions may also be called by the end-user application. + +Each wrapped function has the same name as its corresponding GMP/MPFR function +with the added prefix \verb|SPEX_|. For example, the default GMP function +\verb|mpz_mul| is changed to \verb|SPEX_mpz_mul|. Each SPEX GMP/MPFR function +returns \verb|SPEX_OK| if successful or the correct error code if not. The +following table gives a brief list of each currently covered SPEX GMP/MPFR +function. Each function is declared in \verb|SPEX.h| and defined in +\verb|SPEX/SPEX_Util/Source/SPEX_gmp.c|. + + +% \newpage +\thispagestyle{empty} +\begin{SizedCenteredTabular}[\scriptsize]{|l|l|l|} \hline +{\bf MPFR Function} & \verb|SPEX_MPFR| {\bf Function} & {\bf Description} \\ \hline\hline +\verb|n = mpfr_asprintf(&buff, fmt, ...)| + & \verb|n = SPEX_mpfr_asprintf(&buff, fmt, ...)| + & Print format to allocated string \\ \hline +\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_set(x, y, rnd)| & \verb|SPEX_mpfr_set(x, y, rnd)| & $x = y$ \\ \hline \verb|mpfr_set_d(x, y, rnd)| & \verb|SPEX_mpfr_set_d(x, y, rnd)| & $x = y$ (double) \\ \hline +\verb|mpfr_set_si(x, y, rnd)| + & \verb|SPEX_mpfr_set_si(x, y, rnd)| + & $x = y$ (\verb|int64_t|) \\ \hline \verb|mpfr_set_q(x, y, rnd)| & \verb|SPEX_mpfr_set_q(x, y, rnd)| & $x = y$ (\verb|mpq_t|) \\ \hline \verb|mpfr_set_z(x, y, rnd)| & \verb|SPEX_mpfr_set_z(x, y, rnd)| & $x = y$ (\verb|mpz_t|) \\ \hline -\verb|mpfr_get_z(x, y, rnd)| +\verb|r = mpfr_get_z(x, y, rnd)| & \verb|SPEX_mpfr_get_z(x, y, rnd)| & (\verb|mpz_t|) $x = y$\\ \hline +\verb|mpfr_get_q(x, y)| + & \verb|SPEX_mpfr_get_q(x, y, rnd)| + & (\verb|mpq_t|) $x = y$\\ \hline \verb|x = mpfr_get_d(y, rnd)| & \verb|SPEX_mpfr_get_d(x, y, rnd)| & (double) $x = y$\\ \hline +\verb|x = mpfr_get_si(y, rnd)| + & \verb|SPEX_mpfr_get_si(x, y, rnd)| + & (\verb|int64_t|) $x = y$\\ \hline \verb|mpfr_mul(x, y, z, rnd)| & \verb|SPEX_mpfr_mul(x, y, z, rnd)| - & $x = y*z$ \\ \hline + & $x = y*z$ (\verb|mpfr_t|) \\ \hline \verb|mpfr_mul_d(x, y, z, rnd)| & \verb|SPEX_mpfr_mul_d(x, y, z, rnd)| - & $x = y*z$ \\ \hline + & $x = y*z$ (double) \\ \hline \verb|mpfr_div_d(x, y, z, rnd)| & \verb|SPEX_mpfr_div_d(x, y, z, rnd)| - & $x = y/z$ \\ \hline + & $x = y/z$ (double) \\ \hline \verb|mpfr_ui_pow_ui(x, y, z, rnd)| & \verb|SPEX_mpfr_ui_pow_ui(x, y, z, rnd)| - & $x = y^z$ \\ \hline -\verb|mpfr_log2(x, y, rnd)| - & \verb|SPEX_mpfr_log2(x, y, rnd )| - & $x = \log_2 (y)$ \\ \hline + & $x = y^z$ (\verb|uint64_t|) \\ \hline +\verb|sgn = mpfr_sgn(x)| + & \verb|SPEX_mpfr_sgn(sgn, x)| + & $sgn =\text{sgn}(x)$ \\ \hline +%\verb|mpfr_log2(x, y, rnd)| +% & \verb|SPEX_mpfr_log2(x, y, rnd )| +% & $x = \log_2 (y)$ \\ \hline \verb|mpfr_free_cache()| & \verb|SPEX_mpfr_free_cache()| - & Free cache after log2 \\ \hline -\hline -%---------------------------------------- -{\bf GMP Function} & \verb|SPEX_GMP| {\bf Function} & {\bf Description} \\ -%---------------------------------------- -\hline\hline + & Free all caches and pools used by \\&&MPFR internally \\ \hline +\end{SizedCenteredTabular} + +\begin{SizedCenteredTabular}[\scriptsize]{|l|l|l|} \hline +{\bf GMP Function} & \verb|SPEX_GMP| {\bf Function} & {\bf Description} \\ \hline\hline \verb|n = gmp_fscanf(fp, fmt, ...)| & \verb|n = SPEX_gmp_fscanf(fp, fmt, ...)| & Read from file fp \\ \hline @@ -1403,55 +1584,82 @@ \section{SPEX wrapper functions for GMP and MPFR} & $x = y$ (\verb|mpz_t|) \\ \hline \verb|mpz_set_ui(x, y)| & \verb|SPEX_mpz_set_ui(x, y)| - & $x = y$ (signed int) \\ \hline + & $x = y$ (\verb|uint64_t|) \\ \hline \verb|mpz_set_si(x, y)| & \verb|SPEX_mpz_set_si(x, y)| - & $x = y$ (unsigned int) \\ \hline -\verb|mpz_set_d(x, y)| - & \verb|SPEX_mpz_set_d(x, y)| - & $x = y$ (double)\\ \hline + & $x = y$ (\verb|int64_t|) \\ \hline +%\verb|mpz_swap(x, y)| +% & \verb|SPEX_mpz_swap(x, y)| +% & Swap the values of $x$ and $y$ \\ \hline +%\verb|mpz_set_d(x, y)| +% & \verb|SPEX_mpz_set_d(x, y)| +% & $x = y$ (double)\\ \hline +%\verb|mpz_set_q(x, y)| +% & \verb|SPEX_mpz_set_q(x, y)| +% & $x = y$ (\verb|mpz_t|) \\ \hline \verb|x = mpz_get_d(y)| & \verb|SPEX_mpz_get_d(x, y)| - & $x = y$ (double out) \\ \hline -\verb|mpz_set_q(x, y)| - & \verb|SPEX_mpz_set_q(x, y)| - & $x = y$ (\verb|mpz_t|) \\ \hline + & (double) $x = y$\\ \hline +\verb|x = mpz_get_si(y)| + & \verb|SPEX_mpz_get_si(x, y)| + & (\verb|int64_t|) $x = y$ \\ \hline \verb|mpz_mul(x, y, z)| & \verb|SPEX_mpz_mul(x, y, z)| & $x = y*z$ \\ \hline -\verb|mpz_add(x, y, z)| - & \verb|SPEX_mpz_add(x, y, z)| - & $x = y+z$ \\ \hline -\verb|mpz_addmul(x, y, z)| - & \verb|SPEX_mpz_addmul(x, y, z)| - & $x = x+y*z$ \\ \hline +\verb|mpz_mul_si(x, y, z)| + & \verb|SPEX_mpz_mul(x, y, z)| + & $x = y*z (\verb|int64_t|)$ \\ \hline +%\verb|mpz_add(x, y, z)| +% & \verb|SPEX_mpz_add(x, y, z)| +% & $x = y+z$ \\ \hline +%\verb|mpz_addmul(x, y, z)| +% & \verb|SPEX_mpz_addmul(x, y, z)| +% & $x = x+y*z$ \\ \hline +\verb|mpz_sub(x, y, z)| + & \verb|SPEX_mpz_sub(x, y, z)| + & $x = y-z$ \\ \hline \verb|mpz_submul(x, y, z)| & \verb|SPEX_mpz_submul(x, y, z)| & $x = x-y*z$ \\ \hline +%\verb|mpz_fdiv_q(q, x, y)| +% & \verb|SPEX_mpz_fdiv_q(q, x, y)| +% & $q = \text{floor}(x/y)$ \\ \hline +%\verb|mpz_cdiv_q(q, x, y)| +% & \verb|SPEX_mpz_cdiv_q(q, x, y)| +% & $q = \text{ceil}(x/y)$ \\ \hline +\verb|mpz_cdiv_qr(q, r, x, y)| + & \verb|SPEX_mpz_cdiv_qr(q, r, x, y)| + & $q = \text{ceil}(x/y), r = x-q*y$ \\ \hline \verb|mpz_divexact(x, y, z)| & \verb|SPEX_mpz_divexact(x, y, z)| & $x = y/z$ \\ \hline \verb|gcd = mpz_gcd(x, y)| & \verb|SPEX_mpz_gcd(gcd, x, y)| - & $gcd = gcd(x,y)$\\ \hline + & $gcd = \text{gcd}(x,y)$\\ \hline \verb|lcm = mpz_lcm(x, y)| & \verb|SPEX_mpz_lcm(lcm, x, y)| - & $lcm = lcm(x,y)$ \\ \hline + & $lcm = \text{lcm}(x,y)$ \\ \hline +\verb|mpz_neg(x, y)| + & \verb|SPEX_mpz_neg(x, y)| + & $x = -y$ \\ \hline \verb|mpz_abs(x, y)| & \verb|SPEX_mpz_abs(x, y)| & $x = |y|$ \\ \hline \verb|r = mpz_cmp(x, y)| & \verb|SPEX_mpz_cmp(r, x, y)| - & $r = 0$ if $x=y$, $r\neq 0$ if $x\neq y$ \\ \hline -\verb|r = mpz_cmpabs(x, y)| - & \verb|SPEX_mpz_cmpabs(r, x, y)| - & $r = 0$ if $|x|=|y|$, $r\neq 0$ if $|x|\neq |y|$\\ \hline + & $r = \text{sgn}(x-y)$ \\ \hline +%\verb|r = mpz_cmpabs(x, y)| +% & \verb|SPEX_mpz_cmpabs(r, x, y)| +% & $r = \text{sgn}(|x|-|y|)$\\ \hline \verb|r = mpz_cmp_ui(x, y)| & \verb|SPEX_mpz_cmp_ui(r, x, y)| - & $r = 0$ if $x=y$, $r\neq 0$ if $x\neq y$ \\ \hline + & $r = \text{sgn}(x-y)$ (\verb|uint64_t|) \\ \hline +\verb|r = mpz_cmpabs_ui(x, y)| + & \verb|SPEX_mpz_cmpabs_ui(r, x, y)| + & $r = \text{sgn}(|x|-|y|)$ (\verb|uint64_t|) \\ \hline \verb|sgn = mpz_sgn(x)| & \verb|SPEX_mpz_sgn(sgn, x)| - & $sgn = 0$ if $x = 0$ \\ \hline + & $sgn = \text{sgn}(x)$ \\ \hline \verb|size = mpz_sizeinbase(x, base)| & \verb|SPEX_mpz_sizeinbase(size, x, base)| & size of x in base \\ \hline @@ -1469,19 +1677,28 @@ \section{SPEX wrapper functions for GMP and MPFR} & $x=y$ (double) \\ \hline \verb|mpq_set_ui(x, y, z)| & \verb|SPEX_mpq_set_ui(x, y, z)| - & $x = y/z$ (unsigned int) \\ \hline + & $x = y/z$ (\verb|uint64_t|/\verb|uint64_t|) \\ \hline +\verb|mpq_set_si(x, y, z)| + & \verb|SPEX_mpq_set_si(x, y, z)| + & $x = y/z$ (\verb|int64_t|/\verb|uint64_t|) \\ \hline \verb|mpq_set_num(x, y)| & \verb|SPEX_mpq_set_num(x, y)| & $num(x) = y$ \\ \hline \verb|mpq_set_den(x, y)| & \verb|SPEX_mpq_set_den(x, y)| & $den(x) = y$ \\ \hline -\verb|mpq_get_den(x, y)| - & \verb|SPEX_mpq_get_den(x, y)| - & $x = den(y)$ \\ \hline +%\verb|mpq_canonicalize(x)| +% & \verb|SPEX_mpq_canonicalize(x)| +% & Canonicalize x \\ \hline +%\verb|mpq_get_den(x, y)| +% & \verb|SPEX_mpq_get_den(x, y)| +% & $x = den(y)$ \\ \hline \verb|x = mpq_get_d(y)| & \verb|SPEX_mpq_get_d(x, y)| & (double) $x = y$ \\ \hline +\verb|mpq_neg(x, y)| + & \verb|SPEX_mpq_neg(x, y)| + & $x = -y$ \\ \hline \verb|mpq_abs(x, y)| & \verb|SPEX_mpq_abs(x, y)| & $x = |y|$ \\ \hline @@ -1496,115 +1713,585 @@ \section{SPEX wrapper functions for GMP and MPFR} & $x = y/z$ \\ \hline \verb|r = mpq_cmp(x, y)| & \verb|SPEX_mpq_cmp(r, x, y)| - & $r = 0$ if $x=y$, $r\neq 0$ if $x\neq y$ \\ \hline + & $r = \text{sgn}(x-y)$ \\ \hline \verb|r = mpq_cmp_ui(x, n, d)| & \verb|SPEX_mpq_cmp_ui(r, x, n, d)| - & $r = 0$ if $x=n/d$, $r\neq 0$ if $x\neq n/d$ \\ \hline + & $r = \text{sgn}(x-n/d)$ (\verb|uint64_t|/\verb|uint64_t|) \\ \hline +\verb|sgn = mpq_sgn(x)| + & \verb|SPEX_mpq_sgn(sgn, x)| + & $sgn = \text{sgn}(x)$ \\ \hline \verb|r = mpq_equal(x, y)| & \verb|SPEX_mpq_equal(r, x, y)| - & $r = 0$ if $x=y$, $r\neq 0$ if $x\neq y$ \\ \hline -\end{tabular} -\end{center} -} + & $r \neq 0$ if $x=y$, $r= 0$ if $x\neq y$ \\ \hline +\end{SizedCenteredTabular} -\section{Additional Useful SPEX Utility Functions} -\cprotect\subsection{\verb|SPEX_cumsum|: Cumulative sum of a vector} +If additional GMP and MPFR functions are needed in the end-user application, +this wrapper mechanism can be extended to those functions, which \ul{requires user to edit the source files} of the SPEX library, (i.e., both \verb|SPEX.h| and \verb|SPEX_gmp.c|). Below are +instructions on how to do this. -%------------------------------------------------------------------------------- +Given a GMP function \verb|void gmpfunc(TYPEa a, TYPEb b, ...)|, where +\verb|TYPEa| and \verb|TYPEb| can be GMP type data (\verb|mpz_t|, +\verb|mpq_t| and \verb|mpfr_t|, for example) or non-GMP type data (\verb|int|, +\verb|double|, for example), and they need not to be the same. +\pagebreak +A wrapper for a new GMP or MPFR function can be created by following +this outline: + +%\newpage +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_gmpfunc + ( + TYPEa a, + TYPEb b, + ... + ) + { + // Start the GMP Wrappter + // uncomment one of the following: + // If this function is not modifying any GMP/MPFR type variable, use + //SPEX_GMP_WRAPPER_START; + // If this function is modifying mpz_t type (say TYPEa = mpz_t), use + //SPEX_GMPZ_WRAPPER_START(a) ; + // If this function is modifying two variables of mpz_t type (say + // TYPEa = mpz_t, TYPEb = mpz_t), use + //SPEX_GMPZ_WRAPPER_START2(a, b) ; + // If this function is modifying mpq_t type (say TYPEa = mpq_t), use + //SPEX_GMPQ_WRAPPER_START(a) ; + // If this function is modifying mpfr_t type (say TYPEa = mpfr_t), use + //SPEX_GMPFR_WRAPPER_START(a) ; + + // Call the GMP function + gmpfunc(a,b,...) ; + + //Finish the wrapper and return ok if successful. + SPEX_GMP_WRAPPER_FINISH; + return SPEX_OK; + } +\end{verbatim} +} \end{mdframed} + +\newpage +Note that, other than \verb|SPEX_mpfr_fprintf|, \verb|SPEX_gmp_fprintf|, +\verb|SPEX_gmp_printf| and \verb|SPEX_gmp_fscanf|, all of the wrapped GMP/MPFR +functions always return \verb|SPEX_info| to the caller. Therefore, for some +GMP/MPFR functions that have their own return value. For example, for +\verb|int mpq_cmp(const mpq_t a, const mpq_t b)|, the return value becomes a +parameter of the wrapped function. In general, a GMP/MPFR function in the form +of \verb|TYPEr gmpfunc(TYPEa a, TYPEb b, ...)|, the wrapped +function can be constructed as follows: + +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_gmpfunc + ( + TYPEr *r, // return value of the GMP/MPFR function + TYPEa a, + TYPEb b, + ... + ) + { + // Start the GMP Wrappter + //SPEX_GMP_WRAPPER_START; + + // Call the GMP function + *r = gmpfunc(a,b,...) ; + + //Finish the wrapper and return ok if successful. + SPEX_GMP_WRAPPER_FINISH; + return SPEX_OK; + } +\end{verbatim} +} \end{mdframed} + + +%------------------------------------------------------------------------------- +\chapter{SPEX LU}\vspace{-0.75in} \label{ch:LeftLU} +%------------------------------------------------------------------------------- + +%------------------------------------------------------------------------------- +\section{Overview} \label{s:LeftLU:intro} +%------------------------------------------------------------------------------- +SPEX LU is a software package designed to exactly solve unsymmetric sparse +linear systems, $ A x = b$, where $A \in \mathbb{Q}^{n \times +n}$, $b \in \mathbb{Q}^{n \times r}$, and $x \in \mathbb{Q}^{n \times +r}$. This package performs a left-looking, roundoff-error-free (REF) LU +factorization $P A Q = L D U$, where $L$ and $U$ are integer, $D$ is diagonal, +and $P$ and $Q$ are row and column permutations, respectively. +Note that, in order to solve a linear system, the matrix $D$ is never explicitly computed nor needed; thus this +package uses only the matrices $L$ and $U$. The theory associated with this code is the Sparse Left-looking Integer-Preserving (SLIP) LU factorization + \cite{lourenco2019exact}. Aside from +solving sparse linear systems exactly, one of the key goals of this package is +to provide a framework for other solvers to benchmark the reliability and +stability of their linear solvers, as our final solution vector $x$ is +\ul{guaranteed} to be exact. SPEX LU is written in ANSI C and is accompanied by a MATLAB interface. + +Version 1.1.2 of SPEX Left LU was published in ACM TOMS as: +Lourenco, C., Chen, J., Moreno-Centeno, E., \& Davis, T. A. (2022). Algorithm 1021: SPEX Left LU, Exactly Solving Sparse Linear Systems via a Sparse Left-looking Integer-preserving LU Factorization. ACM Transactions on Mathematical Software (TOMS), 48(2), 1-23. + + +%------------------------------------------------------------------------------- +\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.\\ + +\noindent \textbf{Contact Info:} Contact Chris Lourenco, +\href{mailto:chrisjlourenco@gmail.com}{chrisjlourenco@gmail.com}, or Tim Davis, +\href{mailto:timdavis@aldenmath.com}{timdavis@aldenmath.com}, +\href{mailto:davis@tamu.edu}{davis@tamu.edu}, or +\href{DrTimothyAldenDavis@gmail.com}{DrTimothyAldenDavis@gmail.com}\\ + +\noindent \textbf{License:} This software package is dual licensed under the GNU General Public License version 2 or the GNU Lesser General Public License version 3. Details of this license are in \verb|SPEX/License/license.txt|. For alternative licenses, please contact the authors. + + +\section{Factorization and Solve Routines} + +To factorize and solve a linear system $A \mathbf{x} = \mathbf{b}$ via the SPEX Left LU factorization, a user must call analyze, factorize, and solve. The functions are explained below: + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_LU_analyze|: symbolic analysis for LU factorization} \label{ss:spex_lu_analyze} +\subsection{\texttt{SPEX\_lu\_analyze}: symbolic analysis for LU factorization} \label{ss:spex_lu_analyze} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_lu_analyze + ( + SPEX_symbolic_analysis** S_handle, // symbolic analysis including + // column perm. and nnz of L and U + const SPEX_matrix *A, // Input matrix + const SPEX_options *option // Control parameters, if NULL, use default + ) ; +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_lu_analyze| performs symbolic analysis for the REF LU factorization. On input, the \verb|SPEX_symbolic_analysis *S| that \verb|S_handle| points to is undefined; \verb|A| must be a square matrix of \verb|SPEX_CSC| kind; and \verb|option| contains any command parameters (default settings are used if +\verb|option| is input as \verb|NULL|). On output, \verb|S| contains the column preordering of \verb|A| and estimates on the number of nonzeros in $L$ and $U$. The type of ordering can be chosen with \verb|option->order|. It is suggested that COLAMD is used. + + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_Left_LU_factorize|: Compute the LU factorization of A} \label{ss:spex_left_lu_factorize} +\subsection{\texttt{SPEX\_lu\_factorize}: Compute the LU factorization of A} \label{ss:spex_left_lu_factorize} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_lu_factorize + ( + // output: + SPEX_factorization **F_handle, // LU factorization + // input: + const SPEX_matrix *A, // matrix to be factored + const SPEX_symbolic_analysis *S, // symbolic analysis + const SPEX_options* option // command options + ) ; +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_lu_factorize| performs the left-looking LU factorization. On input, the \linebreak +\verb|SPEX_factorization *F| that \verb|F_handle| points to is undefined; \verb|A| must be a square matrix of \verb|SPEX_CSC SPEX_MPZ| format; \verb|S| is obtained from \verb|SPEX_lu_analyze| that contains the column ordering of \verb|A|; and \verb|option| contains any command parameters (default settings are used if +\verb|option| is input as \verb|NULL|). On output, \verb|A|, \verb|S|, and \verb|option| are unmodified and \verb|F| contains the REF LU factorization of \verb|A|. + +%Returns \verb|SPEX_PANIC| if SPEX has not been initialized. Otherwise, if another +If any error occurs, \verb|F| is returned as \verb|NULL|, and an appropriate error code is returned. + + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_Left_LU_solve|: solve the linear system $Ax=b$} +\newpage +\subsection{\texttt{SPEX\_lu\_solve}: solve the linear system} \label{ss:SPEX_Left_LU_solve} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + 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 LU factorization. + // input: + const SPEX_matrix *b, // right hand side vector + const SPEX_options* option // Command options + ) ; +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_lu_solve| obtains the solution of \verb|mpq_t| type to the +linear system $Ax=b$ upon a successful factorization. This function may be +called after a successful return from \linebreak \verb|SPEX_lu_factorize|. + +On input, \verb|SPEX_matrix *x| that \verb|x_handle| points to is undefined; \verb|F| must be a valid LU factorization; and \verb|b| must be a dense \verb|mpz_t| matrix with same number of rows as \verb|F->L|; Default settings are used if +\verb|option| is input as \verb|NULL|. Upon successful completion, the function returns \verb|SPEX_OK|, and \verb|x| contains the solution of \verb|mpq_t| type with dense format to the linear system $Ax=b$. +\update{ +\verb|F| is mathematically unchanged on output. However, if \verb|F| is updatable on input, it is converted to non-updatable. If \verb|F| is already non-updatable, it is not modified.} +In case of failure, \verb|x| is returned as \verb|NULL| and the appropriate error code is returned. + + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_Left_LU_backslash|: solve $Ax=b$} +\subsection{\texttt{SPEX\_lu\_backslash}: solve a linear system} +\label{ss:SPEX_Left_LU_backslash} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_lu_backslash + ( + // Output + SPEX_matrix **X_handle, // Final solution vector + // Input + SPEX_type type, // Type of output desired. Must be + // SPEX_FP64, SPEX_MPFR, or SPEX_MPQ + const SPEX_matrix* A, // Input matrix of SPEX_CSC SPEX_MPZ + const SPEX_matrix* b, // Right hand side vector(s). Must be + // SPEX_DENSE SPEX_MPZ + const SPEX_options* option // Command options (Default if NULL) + ) ; +\end{verbatim} +} \end{mdframed} + +\verb|SPEX_lu_backslash| solves the linear system $Ax=b$ and returns the solution +as a dense matrix of \verb|mpq_t|, \verb|mpfr_t| or \verb|double| entries. This +function performs symbolic analysis, factorization, and solving all in one line. +It can be thought of as an exact version of MATLAB sparse backslash. + +On input, \verb|SPEX_matrix *x| that \verb|X_handle| points to is undefined. \verb|type| must be one of: +\verb|SPEX_MPQ|, \verb|SPEX_MPFR| or \verb|SPEX_FP64| to specify the data type +of the solution entries. \verb|A| should be a square CSC \verb|mpz_t| matrix +while \verb|b| should be a dense \verb|mpz_t| matrix. In addition, \verb|A->m| +should be equal to \verb|b->m|. Default settings are used if +\verb|option| is input as \verb|NULL|. + +Upon successful completion, the function returns \verb|SPEX_OK|, and +\verb|x| contains the solution of data type specified by +\verb|type| to the linear system $Ax=b$. In case of failure, \verb|x| is returned as \verb|NULL| and the appropriate error code is returned. +%Returns \verb|SPEX_PANIC| if SPEX has not been initialized. + + + +\begin{comment} +%------------------------------------------------------------------------------- +\cprotect\section{Using SPEX Left LU in C} \label{s:Using} +%------------------------------------------------------------------------------- +Using SPEX Left LU in C has three steps: + +\begin{enumerate} +\item initialize and populate data structures, +\item perform symbolic analysis, +factorize the matrix $A$ and solve the linear +system for each $b$ vector, and +\item free all used memory and finalize. +\end{enumerate} + +Step 1 is discussed in Section \ref{s:Using:init}. For Step 2, performing +symbolic analysis and factorizing $A$ and solving the linear $A x =b$ can be +done in one of two ways. If only the solution vector $x$ is required, SPEX Left LU +provides a simple interface for this purpose which is discussed in Section +\ref{s:Using:simple}. Alternatively, if the $L$ and $U$ factors are required, +refer to Section \ref{s:Using:expert}. Finally, step 3 is discussed in Section +\ref{s:Using:free}. For the remainder of this section, \verb|n| will indicate +the dimension of $A$ (that is, $A \in \mathbb{Z}^{n \times n}$) and +\verb|numRHS| will indicate the number of right hand side vectors being solved +(that is, if \verb|numRHS|$= r$, then $b \in \mathbb{Z}^{n \times r}$). + +%------------------------------------------------------------------------------- +\cprotect\subsection{SPEX Left LU initialization and population of data structures} +\label{s:Using:init} +%------------------------------------------------------------------------------- +This section discusses how to initialize and populate the global data +structures required for SPEX Left LU. + + +%------------------------------------------------------------------------------- +\subsubsection{Initializing the environment} +%------------------------------------------------------------------------------- +SPEX is built upon the GNU Multiple Precision Arithmetic (GMP) +\cite{granlund2015gnu} and GNU Multiple Precision Floating Point Reliable +(MPFR) \cite{fousse2007mpfr} libraries and provides wrappers to all GMP/MPFR +functions it uses. This allows SPEX to properly handle memory management +failures, which GMP/MPFR does not handle. To enable this mechanism, SPEX +requires initialization. The following must be done before using any other +SPEX function: + +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_initialize ( ) ; + // or SPEX_initialize_expert (...); if custom memory functions are desired +\end{verbatim} +} \end{mdframed} + + +%------------------------------------------------------------------------------- +\subsubsection{Initializing data structures} +\label{ss:init} +%------------------------------------------------------------------------------- +SPEX assumes three specific input options for all functions. These are: + +\begin{itemize} +\item \verb|SPEX_matrix* A| and \verb|SPEX_matrix *b|: \verb|A| contains the +input coefficient matrix, while \verb|b| contains the right hand side vector(s) +of the linear system $Ax=b$. + +\item \verb|SPEX_LU_analysis* S|: \verb|S| contains the column permutation used +for $A$ as well as estimates of the number of nonzeros in $L$ and $U$. + +\item \verb|SPEX_options* option|: \verb|option| contains various control +options for the factorization including column ordering used, pivot selection +scheme, and others. For a full list of the contents of the \verb|SPEX_options| +structure, refer to Section \ref{ss:SPEX_options}. +If default settings are desired, \verb|option| can be set to \verb|NULL|. + +\end{itemize} + + +%------------------------------------------------------------------------------- +\subsubsection{Populating data structures} +\label{ss:populate_Ab} +%------------------------------------------------------------------------------- +Of the three data structures discussed in Section~\ref{ss:init}, \verb|S| is +constructed during symbolic analysis (Section \ref{s:SPEX_LU_analyze}), and +\verb|option| is an optional parameter for selecting non-default parameters. +Refer to Section \ref{ss:SPEX_options} for the contents of \verb|option|. + +SPEX allows the input numerical data for \verb|A| and \verb|b| to come in +one of 5 types: \verb|int64_t|, \verb|double|, \verb|mpfr_t|, \verb|mpq_t|, +and \verb|mpz_t|. Moreover, both \verb|A| and \verb|b| can be stored in +CSC form, sparse triplet form or dense form. CSC form is discussed in Section +\ref{s:util:overview}. The triplet form stores the contents of the matrix $A$ +in three arrays \verb|i|, \verb|j|, and \verb|x| where the $k$th nonzero entry +is stored as $A ( i[k], j[k]) = x[k]$. SPEX stores its dense matrices in +in column-oriented format, that is, the $(i,j)$th entry in \verb|A| +is \verb|A->x.TYPE[p]| with $p = i+j$*\verb|A->m|. + +If the data for matrices are in file format to be read, refer to +\newline \verb|SPEX/SPEX/SPEX_Left_LU/Demo| \verb|/example2.c| on how to read in data and construct +\verb|A| and \verb|b|. If the data for matrices are already stored in vectors +corresponding to CSC form, sparse triplet form or dense form, allocate a +shallow \verb|SPEX_matrix| and assign vectors accordingly, then use +\verb|SPEX_matrix_copy| to get a \verb|SPEX_matrix| in the desired kind and +type. For more details, refer to \verb|SPEX/SPEX/SPEX_Left_LU/Demo/example.c|. In a case when +\verb|A| is available in format other than CSC \verb|mpz|, and/or \verb|b| is +available in format other than dense \verb|mpz|, the following code snippet +shows how to get \verb|A| and \verb|b| in a required format. + +{\small +\begin{verbatim} + /* Get the matrix A. Assume that A1 is stored in CSC form + with mpfr_t entries, while b1 is stored in triplet form + with mpq_t entries. (for A1 and b1 in any other form, + the exact same code will work) */ + + SPEX_matrix *A, *b; + // A is a copy of the A1. A is a CSC matrix with mpz_t entries + SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, A1, option); + // b is a copy of the b1. b is a dense matrix with mpz_t entries. + SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, b1, option); + \end{verbatim} } + + +%------------------------------------------------------------------------------- +\cprotect\subsection{Simple SPEX Left LU routines for solving linear systems} +\label{s:Using:simple} +%------------------------------------------------------------------------------- +After initializing the necessary data structures, SPEX obtains the solution +to $Ax=b$ using the simple interface of SPEX Left LU, \verb|SPEX_Left_LU_backslash|. The +\newline \verb|SPEX_Left_LU_backslash| function can return \verb|x| as \verb|double|, +\verb|mpq_t|, or \verb|mpfr_t| with an associated precision. See Section +\ref{ss:SPEX_Left_LU_backslash} for more details. The following code snippet shows how +to get solution as a dense \verb|mpq_t| matrix. + +{\small +\begin{verbatim} + SPEX_matrix *x; + SPEX_type my_type = SPEX_MPQ; // SPEX_MPQ, SPEX_MPFR, SPEX_FP64 + SPEX_Left_LU_backslash(&x, my_type, A, b, option) ; \end{verbatim} } + +On successful return, this function returns \verb|SPEX_OK| (see Section +\ref{ss:SPEX_info}). + + +%------------------------------------------------------------------------------- +\cprotect\subsection{Expert SPEX Left LU routines} +\label{s:Using:expert} +%------------------------------------------------------------------------------- +If the $L$ and $U$ factors from the SPEX Left LU factorization of the matrix $A$ +are required, the steps performed by \verb|SPEX_Left_LU_backslash| can be done with +a sequence of calls to SPEX functions: + +\begin{enumerate} +\item declare \verb|L|, \verb|U|, the solution matrix \verb|x|, and others, +\item perform symbolic analysis, +\item compute the factorization $PAQ = L D U$, +\item solve the linear system $Ax =b$, and +\item convert the final solution into the final desired form. +\end{enumerate} + +\noindent These steps are discussed below, along with examples. + + +%------------------------------------------------------------------------------- +\subsubsection{Declare workspace} +%------------------------------------------------------------------------------- +Using SPEX in this form requires the intermediate variables be declared, such as \verb|L|, \verb|U|, etc. The following code snippet shows the detailed list. + +{\small +\begin{verbatim} + // A and b are in required type and ready to use + SPEX_matrix *L = NULL; + SPEX_matrix *U = NULL; + SPEX_matrix *x = NULL; + SPEX_matrix *rhos = NULL; + int64_t* pinv = NULL; + SPEX_LU_analysis* S = NULL; + + // option needs no declaration if default setting is desired + // only declare option for further modification on default setting + SPEX_options *option = SPEX_create_default_options(); + \end{verbatim} } + + +%------------------------------------------------------------------------------- +\subsubsection{SPEX Left LU symbolic analysis} +%------------------------------------------------------------------------------- +The symbolic analysis phase of an LU factorization entails computing the symbolic column ordering and estimating the number of nonzeros in $L$ and $U$. This is performed by calling the following function: + +{\small + \begin{verbatim} + SPEX_LU_analyze (&S, A, option) ; \end{verbatim} } + + +%------------------------------------------------------------------------------- +\subsubsection{Computing the factorization} +%------------------------------------------------------------------------------- +The matrices \verb|L| and \verb|U|, the pivot sequence \verb|rhos|, and the row +permutation \verb|pinv| are computed via the \verb|SPEX_Left_LU_factorize| function +(Section \ref{s:LeftLU:SPEX_Left_LU_factorize}). Upon successful completion, this +function returns \verb|SPEX_OK|. + + +%------------------------------------------------------------------------------- +\subsubsection{Solving the linear system} +%------------------------------------------------------------------------------- +After factorization, the next step is to solve the linear system and store the +solution as a dense matrix \verb|x| with entries of rational number +\verb|mpq_t|. This solution is done via the \verb|SPEX_Left_LU_solve| +function (Section \ref{ss:SPEX_Left_LU_solve}). +Upon successful completion, this function returns \verb|SPEX_OK|. + +In this step, \verb|option->check| can be set to \verb|true| to enable the +solution check process as discussed in Section \ref{ss:SPEX_Left_LU_solve}. The +process can verify that the solution vector x satisfies $Ax=b$ in perfect +precision intended for debugging. This step is not needed, since the solution +returned is guaranteed to be exact. It appears here simply as debugging tool, +and as a verification that SPEX is computing its expected result. This test +can fail only if it runs out of memory, or if there is a bug in the code (in +which case, please notify the authors). Also, note that this process can be +quite time consuming; thus it is not recommended to be used in general. + + +%------------------------------------------------------------------------------- +\subsubsection{Converting the solution vector to the final desired form} +%------------------------------------------------------------------------------- +Upon completion of the above routines, the solution to the linear system is in +a dense \verb|mpq_t| matrix. SPEX allows this to be converted into any form +of matrix in the set of (CSC, sparse triplet, dense) $\times$ (\verb|mpfr_t|, +\verb|mpq_t|, \verb|double|) using \verb|SPEX_matrix_copy|. The following code +snippet shows how to get solution as a dense \verb|double| matrix; since this +involves a floating-point representation, the solution \verb|my_x| will no +longer be exact, even though \verb|x| is the exact solution. + +{\small +\begin{verbatim} + SPEX_kind my_kind = SPEX_DENSE; // SPEX_CSC, SPEX_TRIPLET or SPEX_DENSE + SPEX_type my_type = SPEX_FP64; // SPEX_MPQ, SPEX_MPFR, or SPEX_FP64 + SPEX_matrix* my_x = NULL; // New output + // Create copy which is stored as my_kind and my_type: + SPEX_matrix_copy( &my_x, my_kind, my_type, x, option);\end{verbatim} } + + +%------------------------------------------------------------------------------- +\cprotect\subsection{Freeing memory} +\label{s:Using:free} +%------------------------------------------------------------------------------- +As described in Section \ref{s:user:memmanag}, SPEX provides a number +of functions/macros to free SPEX structures: + +\begin{itemize} +\item \verb|SPEX_matrix*|: A \verb|SPEX_matrix* A| data structure can be freed +with a call to \verb|SPEX_matrix_free(&A, NULL) ;| + +\item \verb|SPEX_LU_analysis*|: A \verb|SPEX_LU_analysis* S| data structure can +be freed with a call to \verb|SPEX_LU_analysis_free(&S, NULL) ;| -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize -\begin{verbatim} -SPEX_info SPEX_cumsum -( - int64_t *p, // vector to store the sum of c - int64_t *c, // vector which is summed - int64_t n // size of c -); -\end{verbatim} -} \end{mdframed} +\item All others including \verb|SPEX_options*|: These data structures can be +freed with a call to the macro \verb|SPEX_FREE()|, for example, +\verb|SPEX_FREE(option)| for \newline +\verb|SPEX_options* option|. +\end{itemize} -\verb|SPEX_cumsum| computes the cumulative sum of the array \verb|c| and stores it in the array \verb|p|. Specifically, $p_i = \sum_{j = 1}^i c_j$. This is mainly used for matrix copy and some factorizations. On input, \verb|p| and \verb|c| must not be NULL and \verb|n| must be at least 0. On completion, the contents of \verb|p| are overwritten with the cumulative sum of \verb|c| and \verb|SPEX_OK| is returned. +After all usage of the SPEX routines is finished, \verb|SPEX_finalize()| +must be called (Section \ref{ss:SPEX_finalize}) to finalize usage of the +library. -\cprotect\subsection{\verb|SPEX_check_solution|: Validate solution vector (for debugging)} +%------------------------------------------------------------------------------- +\cprotect\subsection{Examples} +\label{s:Using:Examples} +%------------------------------------------------------------------------------- +The \verb|SPEX/SPEX/SPEX_Left_LU/Demo| folder contains three sample C codes +which utilize SPEX. These files demonstrate the usage of SPEX as +follows: -\begin{mdframed}[userdefinedwidth=6in] -{\footnotesize -\begin{verbatim} -SPEX_info SPEX_check_solution -( - const SPEX_matrix *A, // Input matrix - const SPEX_matrix *x, // Solution vectors - const SPEX_matrix *b, // Right hand side vectors - const SPEX_options* option // Command options -); -\end{verbatim} -} \end{mdframed} +\begin{itemize} +\item \verb|example.c|: This example generates a random dense $50 \times 50$ +matrix and a random dense $50 \times 1$ right hand side vector $b$ and +solves the linear system. In this function, the \verb|SPEX_Left_LU_backslash| +function is used; and the output is given as a double matrix. +\item \verb|example2.c|: This example reads in a matrix stored in triplet +format from the \verb|ExampleMats| folder. Additionally, it reads in a +right hand side vector from this folder and solves the associated linear system +via the \verb|SPEX_Left_LU_backslash| function, and, the solution is given as a matrix +of rational numbers. -Given a solution vector \verb|x|, check the solution of the linear system \verb|Ax = b|. This is done by computing a rational-arthmetic \verb|A*x == b|. Since all routines in SPEX are gauranteed to be exact, this function is for debugging purposes. On input, \verb|A| is \verb|SPEX_CSC| of \verb|SPEX_MPZ| type, \verb|x| is \verb|SPEX_DENSE| of \verb|SPEX_MPQ| type and \verb|b| is \verb|SPEX_DENSE| of \verb|SPEX_MPZ| type. On success, \verb|SPEX_OK| is returned. +\item \verb|spexlu_demo.c|: This example reads in a matrix and right hand side +vector from a file and solves the linear system $A x = b$ +using the techniques discussed in Section \ref{s:Using:expert}. This file also +allows command line arguments (discussed in \verb|README.md|) and can be used +to replicate the results from \cite{lourenco2019exact}. +\end{itemize} +\end{comment} -\chapter{SPEX Left LU} \label{ch:LeftLU} %------------------------------------------------------------------------------- -\section{Overview} \label{s:LeftLU:intro} +\chapter{SPEX Cholesky}\vspace{-0.75in} \label{ch:Chol} %------------------------------------------------------------------------------- -SPEX Left LU is a software package designed to exactly solve unsymmetric sparse -linear systems, $ A x = b$, where $A \in \mathbb{Q}^{n \times +%------------------------------------------------------------------------------- +\section{Overview} \label{s:Chol:intro} +%------------------------------------------------------------------------------- +SPEX Cholesky is a software package designed to exactly solve symmetric positive definite +linear systems, $A x = b$ where $A \in \mathbb{Q}^{n \times n}$, $b \in \mathbb{Q}^{n \times r}$, and $x \in \mathbb{Q}^{n \times -r}$. This package performs a left-looking, roundoff-error-free (REF) LU -factorization $P A Q = L D U$, where $L$ and $U$ are integer, $D$ is diagonal, -and $P$ and $Q$ are row and column permutations, respectively. -Note that, in order to solve a linear system, the matrix $D$ is never explicitly computed nor needed; thus this -package uses only the matrices $L$ and $U$. The theory associated with this code is the Sparse Left-looking Integer-Preserving (SLIP) LU factorization - \cite{lourenco2019exact}. Aside from -solving sparse linear systems exactly, one of the key goals of this package is -to provide a framework for other solvers to benchmark the reliability and -stability of their linear solvers, as our final solution vector $x$ is -\ul{guaranteed} to be exact. SPEX Left LU is written in ANSI C and is accompanied by a MATLAB interface. - -For all primary computational routines in Section \ref{s:LeftLU:SPEX_Left_LU_factorize}, the input -argument $A$ must be stored in a compressed sparse column (CSC) matrix with -entries in \verb|mpz_t| type (referred to as CSC \verb|mpz_t| matrix henceforth), while $b$ must be stored as a dense \verb|mpz_t| matrix (i.e., a -dense matrix with entries in \verb|mpz_t| type). However, the original data type of entries in the input matrix $A$ and right hand side (RHS) vectors $b$ can be any one of: \verb|double|, \verb|int64_t|, \verb|mpq_t|, -\verb|mpz_t|, or \verb|mpfr_t|, and their format(s) are allowed to be -CSC, sparse triplet, or dense. Section \ref{ss:populate_Ab} discusses the \verb|SPEX_matrix| structure, the allowed matrix formats and types, and how to perform conversions across different formats/types. - -The matrices $L$ and $U$ are computed using integer-preserving -routines with the arbitrary-sized integer (\verb|mpz_t|) data type from the GMP Library -\cite{granlund2015gnu}. The matrices $L$ and $U$ are computed in a left-looking fashion: one column at a -time via the sparse REF triangular solve -detailed in \cite{lourenco2019exact}. All divisions performed in the algorithm -are \textit{guaranteed} to be exact (i.e., with zero reminder); therefore, no greatest common -divisor algorithms are needed. - -The permutation matrices $P$ and $Q$ define the pivot ordering; $Q$ is a given -fill-reducing column ordering, and $P$ is determined dynamically during the -factorization. For the matrix $P$, the default option is to use a partial -pivoting scheme in which the (non-zero) entry with the smallest magnitude in column $k$ is selected as pivot; where ties are broken in favor of the diagonal entry (and arbitrarily otherwise). In addition to this scheme, -the code allows diagonal pivoting, partial pivoting selecting the entry with largest magnitude, or various tolerance-based diagonal pivoting schemes. For the matrix -$Q$, the default ordering is obtained via the Column Approximate Minimum Degree (COLAMD) -algorithm \cite{davis2004algorithmcolamd,davis2004column}. Other approaches -include using the Approximate Minimum Degree (AMD) ordering -\cite{amestoy1996approximate,amestoy2004algorithmamd}, or no ordering ($Q=I$). Section \ref{s:SPEX_LU_analyze} discusses how to select the desired column ordering prior to factorization. - -Once the factorization $L D U = P A Q$ is computed, the solution vector -$x$ is computed via the sparse REF forward and backward substitution algorithms \cite{lourenco2019exact}. -Forward substitution is a variant of the sparse REF triangular solve discussed above. Backward substitution is a typical column-oriented sparse backward substitution. Both of these routines require $b$ to be given as a dense \verb|mpz_t| matrix. At the conclusion of the forward and -backward substitution routines, the final solution vector(s) $x$ are guaranteed to be exact. The solution $x$ is returned as a dense \verb|mpq_t| matrix. - -A key advantage of utilizing SPEX Left LU with floating-point output is that the solution is guaranteed to be exact until the final (and only) rational-to-floating point conversion. Note that this final conversion is done in higher precision. Thus, the solution $x$ output in \verb|double| precision are accurate to machine roundoff (approximately $10^{-16}$). In addition, the returned solution can also be accurate to any user-specified precision by using MPFR output. +r}$. This package performs either a left-looking or up-looking sparse +roundoff-error-free Cholesky factorization $P A P^T = L D L^T$ where $L$ is integer, +and $P$ is the symmetric permutation. +Note that, in order to solve a linear system, the matrix $D$ is never explicitly computed nor needed; thus this package uses only the matrix $L$. The theory associated with this code can be found at + \cite{lourenco2022exactly}. SPEX Cholesky is written in ANSI C and is accompanied by MATLAB and Python interfaces. + + %------------------------------------------------------------------------------- -\section{Licensing} \label{s:LeftLU:licensing} +\section{Licensing} \label{s:Chol: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, 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, @@ -1614,195 +2301,127 @@ \section{Licensing} \label{s:LeftLU:licensing} \noindent \textbf{License:} This software package is dual licensed under the GNU General Public License version 2 or the GNU Lesser General Public License version 3. Details of this license are in \verb|SPEX/License/license.txt|. For alternative licenses, please contact the authors. +\section{Factorization and Solve Routines} -%------------------------------------------------------------------------------- -\section{Installation} \label{s:install} -%------------------------------------------------------------------------------- - -Installation of SPEX requires cmake. An optional top-level \verb'Makefile' -is provided to simplify its use (just do \verb'make ; make install'). - -To run the statement coverage tests (Linux required), go to the \verb|Tcov| folder and -type \verb|make|. The last line of output should read: - -\begin{verbatim} - statements not yet tested: 0 -\end{verbatim} - -If you want to use SPEX Left LU within MATLAB, -\verb|cd| in MATLAB to the folder \verb|SPEX/SPEX/SPEX_Left_LU/MATLAB| then type -\newline \verb|SPEX_Left_LU_install|. This compiles the necessary code so that you can use -the \verb|SPEX_Left_LU_backslash| function within MATLAB. Note that -\newline \verb|SPEX_Left_LU_install| does not add the correct directory to your path; therefore, -if you want to use \verb|SPEX_Left_LU_backslash| in future sessions, type -\verb|pathtool| and save your path for future MATLAB sessions. If you cannot -save your path because of file permissions, edit your \verb|startup.m| by -adding \verb|addpath| commands (for more information on how this is done, -please type \verb|doc startup| and \verb|doc addpath|). +To factorize and solve a linear system $A \mathbf{x} = \mathbf{b}$ via the SPEX Cholesky factorization, a user must call analyze, factorize, and solve. The functions are explained below: -\newpage %------------------------------------------------------------------------------- -% \cprotect\section{\verb|SPEX_Left_LU_VERSION|: the software package version} +%\cprotect\subsection{\verb|SPEX_Chol_analyze|: symbolic analysis for Cholesky factorization} \label{ss:spex_chol_analyze} +\newpage +\subsection{\texttt{SPEX\_cholesky\_analyze}: symbolic analysis for Cholesky factorization} \label{ss:spex_chol_analyze} %------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_cholesky_analyze + ( + // Output + SPEX_symbolic_analysis** S_handle, // Symbolic analysis data structure + // Input + const SPEX_matrix* A, // Input matrix of SPEX_CSC + const SPEX_options* option // Command options (Default if NULL) + ); + \end{verbatim} +} \end{mdframed} -% SPEX Left LU defines the following strings with \verb|#define|. Refer to -% the \verb|SPEX_Left_LU.h| file for details. +\verb|SPEX_cholesky_analyze| performs symbolic analysis for the REF Cholesky factorization. On input, the \verb|SPEX_symbolic_analysis *S| that \verb|S_handle| points to is undefined; \verb|A| must be an SPD matrix of \verb|SPEX_CSC| kind; and \verb|option| contains any command parameters (default settings are used if +\verb|option| is input as \verb|NULL|). On output, \verb|S| contains the row and column ordering of \verb|A|, the exact number of nonzeros in $L$, the elimination tree of \verb|A|, and the column pointers of $L$. The type of ordering can be chosen with \verb|option->order|. It is suggested that AMD is used. -%---------------------------------------- -% \begin{center} -% \begin{tabular}{ll} -% \hline -% Macro & purpose \\ -% \hline -% \verb|SPEX_Left_LU_VERSION| & current version of the code (as a string)\\ -% \verb|SPEX_Left_LU_VERSION_MAJOR| & major version of the code\\ -% \verb|SPEX_Left_LU_VERSION_MINOR| & minor version of the code \\ -% \verb|SPEX_Left_LU_VERSION_SUB| & sub version of the code\\ -% \hline -% \end{tabular} -% \end{center} -\section{Factorization and Solve Routines} %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_Left_LU_factorize|: perform LU factorization} -\label{s:LeftLU:SPEX_Left_LU_factorize} +%\cprotect\subsection{\verb|SPEX_Chol_factorize|: Compute the Cholesky factorization of A} \label{ss:spex_chol_factorize} +\subsection{\texttt{SPEX\_cholesky\_factorize}: Compute the Cholesky factorization of A} \label{ss:spex_chol_factorize} %------------------------------------------------------------------------------- - -\begin{mdframed}[userdefinedwidth=6in] +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} - SPEX_info SPEX_Left_LU_factorize + SPEX_info SPEX_cholesky_factorize ( - // output: - SPEX_matrix **L_handle, // lower triangular matrix - SPEX_matrix **U_handle, // upper triangular matrix - SPEX_matrix **rhos_handle, // sequence of pivots - int64_t **pinv_handle, // inverse row permutation - // input: - const SPEX_matrix *A, // matrix to be factored - const SPEX_LU_analysis *S, // column permutation and estimates - // of nnz in L and U - const SPEX_options* option - ) ; + // Output + SPEX_factorization **F_handle, // Cholesky factorization struct + //Input + const SPEX_matrix* A, // CSC MPZ Matrix to be factored + const SPEX_symbolic_analysis* S,// Symbolic analysis struct from + // SPEX_Chol_analyze. + const SPEX_options* option // command options, option->chol_type can be + // either CHOL_UP (default) or CHOL_LEFT. + ); \end{verbatim} } \end{mdframed} -\verb|SPEX_Left_LU_factorize| performs the SPEX Left-looking LU factorization. -This factorization is done via $n$ (number of rows or columns of the square -matrix $A$) iterations of the sparse REF triangular solve function. The overall -factorization is $PAQ = LDU$. This routine allows the factorization and solve -to be split into separate phases. For example codes, refer to either -\verb|SPEX/SPEX/SPEX_Left_LU/Demos/spexlu_denmo.c| or Section \ref{s:Using:expert}. - -On input, \verb|L|, \verb|U|, \verb|rhos|, and \verb|pinv| are undefined and -ignored. \verb|A| must be a CSC \verb|mpz| matrix. Default settings are used -if \verb|option| is input as \verb|NULL|. - -Upon successful completion, the function returns \verb|SPEX_OK|, and \verb|L| -and \verb|U| are lower and upper triangular matrices, respectively, which are -CSC matrices of type \verb|mpz|. \verb|rhos| contains the sequence of pivots -as an \verb|n|-by-1 dense vector of type \verb|mpz|. - -After factorizing the matrix, the determinant of $A$ can be obtained from -\verb|rhos[n-1]| and \verb|A->scale| as follows: - -\begin{verbatim} - mpq_t determinant ; - SPEX_mpq_init (determinant) ; - SPEX_mpq_set_z (determinant, rhos->x.mpz[rhos->n-1]) ; - SPEX_mpq_div (determinant, determinant, A->scale) ; -\end{verbatim} +\verb|SPEX_cholesky_factorize| performs the REF Cholesky factorization via either the up-looking (default) or left-looking manner (specified by \verb|option->chol_type|). On input, the \verb|SPEX_factorization *F| that \verb|F_handle| points to is undefined; \verb|A| must be an SPD matrix of \verb|SPEX_CSC SPEX_MPZ| format; \verb|S| is obtained from \verb|SPEX_Chol_analyze| that contains the column/row ordering of \verb|A|; and \verb|option| contains any command parameters (default settings are used if +\verb|option| is input as \verb|NULL|). On output, \verb|A|, \verb|S|, and \verb|option| are unmodified and \verb|F| contains the REF Cholesky factorization of \verb|A|. -The output array \verb|pinv| contains the inverse row permutation (that is, the -row index in the permuted matrix $PA$. For the $i$th row in $A$, \verb|pinv[i]| -gives the row index in $PA$). -Returns \verb|SPEX_PANIC| if SPEX has not been initialized. Otherwise, if -another error occurs, \verb|L|, \verb|U|, \verb|rhos|, and \verb|pinv| are all -returned as \verb|NULL|, and an error code will be returned correspondingly. +%Returns \verb|SPEX_PANIC| if SPEX has not been initialized. Otherwise, if another +If error occurs, \verb|F| is returned as \verb|NULL|, and an appropriate error code is returned. %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_Left_LU_solve|: solve the linear system $Ax=b$} -\label{ss:SPEX_Left_LU_solve} +%\cprotect\subsection{\verb|SPEX_Chol_solve|: solve the linear system $Ax=b$} +\newpage +\subsection{\texttt{SPEX\_cholesky\_solve}: solve the linear system} \label{ss:SPEX_Chol_solve} %------------------------------------------------------------------------------- - -\begin{mdframed}[userdefinedwidth=6in] +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} - SPEX_info SPEX_Left_LU_solve // solves the linear system LD^(-1)U x = b + SPEX_info SPEX_cholesky_solve // solves the linear system LD^(-1)L^T x = b ( // Output - SPEX_matrix **X_handle, // rational solution to the system + SPEX_matrix** x_handle, // rational solution to the system. + // input/output: + SPEX_factorization *F, // The non-updatable Cholesky factorization. // input: - const SPEX_matrix *b, // right hand side vector - const SPEX_matrix *A, // Input matrix - const SPEX_matrix *L, // lower triangular matrix - const SPEX_matrix *U, // upper triangular matrix - const SPEX_matrix *rhos, // sequence of pivots - const SPEX_LU_analysis *S, // symbolic analysis struct - const int64_t *pinv, // inverse row permutation - const SPEX_options* option - ) ; + const SPEX_matrix* b, // Right hand side vector + const SPEX_options* option // command options + ); \end{verbatim} } \end{mdframed} -\verb|SPEX_Left_LU_solve| obtains the solution of \verb|mpq_t| type to the +\verb|SPEX_cholesky_solve| obtains the solution of \verb|mpq_t| type to the linear system $Ax=b$ upon a successful factorization. This function may be -called after a successful return from \verb|SPEX_Left_LU_factorize|, which -computes \verb|L|, \verb|U|, \verb|rhos|, and \verb|pinv|. - -On input, \verb|SPEX_matrix *x| is undefined. \verb|A|, \verb|L| and \verb|U| -must be CSC \verb|mpz_t| matrices while \verb|b| and \verb|rhos| must be dense -\verb|mpz_t| matrices. All matrices must have matched dimensions: the matrices -\verb|L| and \verb|U| must be square lower and upper triangular matrices the -same size as \verb|A|, and \verb|rhos| must be a dense \verb|n|-by-1 vector. -The input matrix \verb|b| must have same number of rows as \verb|A|. Default -settings are used if \verb|option| is input as \verb|NULL|. - -Upon successful completion, the function returns \verb|SPEX_OK|, and \verb|x| +called after a successful return from \verb|SPEX_Chol_factorize|. + +On input, \verb|SPEX_matrix *x| that \verb|x_handle| points to is undefined; \verb|F| must be a valid Cholesky factorization and \verb|b| must be dense \verb|mpz_t| with same number of rows as \verb|F->L|. Default settings are used if +\verb|option| is input as \verb|NULL|. Upon successful completion, the function returns \verb|SPEX_OK|, and \verb|x| contains the solution of \verb|mpq_t| type with dense format to the linear -system $Ax=b$. If desired, \verb|option->check| can be set to \verb|true| to -enable a post-check of the solution of this function. However, this is -intended for debugging only; the SPEX library is guaranteed to return the -exact solution. Otherwise (in case of error occurred), the function returns -corresponding error code. +system $Ax=b$. +\update{ +\verb|F| is mathematically unchanged on output. However, if \verb|F| is updatable on input, it is converted to non-updatable. If \verb|F| is already non-updatable, it is not modified.} +In case of failure, \verb|x| is returned as \verb|NULL| and the appropriate error code is returned. -This function is primarily for applications that require intermediate results. -For additional information, refer to either \verb|SPEX/SPEX/SPEX_Left_LU/Demos/spexlu_demo.c| or -Section \ref{s:Using:expert}. Returns \verb|SPEX_PANIC| if SPEX has not -been initialized. %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_Left_LU_backslash|: solve $Ax=b$} -\label{ss:SPEX_Left_LU_backslash} +%\cprotect\subsection{\verb|SPEX_Chol_backslash|: solve $Ax=b$} +\subsection{\texttt{SPEX\_cholesky\_backslash}: solve a linear system} +\label{ss:SPEX_Chol_backslash} %------------------------------------------------------------------------------- - -\begin{mdframed}[userdefinedwidth=6in] +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} - SPEX_info SPEX_Left_LU_backslash + SPEX_info SPEX_cholesky_backslash ( // Output - SPEX_matrix **X_handle, // Final solution vector + SPEX_matrix** x_handle, // Final solution vector(s) // Input - SPEX_type type, // Type of output desired: - // Must be SPEX_MPQ, SPEX_MPFR, - // or SPEX_FP64 - const SPEX_matrix *A, // Input matrix - const SPEX_matrix *b, // Right hand side vector(s) - const SPEX_options* option - ) ; + SPEX_type type, // Type of output desired. Must be + // SPEX_FP64, SPEX_MPFR, or SPEX_MPQ + const SPEX_matrix* A, // Input matrix of SPEX_CSC SPEX_MPZ + const SPEX_matrix* b, // Right hand side vector(s). Must be + // SPEX_DENSE SPEX_MPZ + const SPEX_options* option // Command options (Default if NULL) + ); \end{verbatim} } \end{mdframed} -\verb|SPEX_Left_LU_backslash| solves the linear system $Ax=b$ and returns the solution -as a dense matrix of \verb|mpq_t|, \verb|mpfr_t| or \verb|double| numbers. This +\verb|SPEX_cholesky_backslash| solves the linear system $Ax=b$ and returns the solution +as a dense matrix of \verb|mpq_t|, \verb|mpfr_t| or \verb|double| entries. This function performs symbolic analysis, factorization, and solving all in one line. -It can be thought of as an exact version of MATLAB sparse backslash. +It can be thought of as an exact version of MATLAB sparse backslash for SPD matrices. +If $A$ is not SPD, this function will not work and LU factorization must be used. -On input, \verb|SPEX_matrix *x| is undefined. \verb|type| must be one of: +On input, \verb|SPEX_matrix *x| that \verb|x_handle| points to is undefined. \verb|type| must be one of: \verb|SPEX_MPQ|, \verb|SPEX_MPFR| or \verb|SPEX_FP64| to specify the data type of the solution entries. \verb|A| should be a square CSC \verb|mpz_t| matrix while \verb|b| should be a dense \verb|mpz_t| matrix. In addition, \verb|A->m| @@ -1811,349 +2430,310 @@ \section{Factorization and Solve Routines} Upon successful completion, the function returns \verb|SPEX_OK|, and \verb|x| contains the solution of data type specified by -\verb|type| to the linear system $Ax=b$. If desired, \verb|option->check| can -be set to \verb|true| to enable solution checking process in this function. -However, this is intended for debugging only; SPEX library is guaranteed to -return the exact solution. Otherwise (in case of error occurred), the function -returns corresponding error code. - -Returns \verb|SPEX_PANIC| if SPEX has not been initialized. +\verb|type| to the linear system $Ax=b$. In case of failure, \verb|x| is returned as \verb|NULL| and the appropriate error code is returned. +%Returns \verb|SPEX_PANIC| if SPEX has not been initialized. -For a complete example, refer to \verb|SPEX/SPEX/SPEX_Left_LU/Demos/example.c|, \\ -\verb|SPEX/SPEX/SPEX_Left_LU/Demos/example2.c|, or Section \ref{s:Using:simple}. %------------------------------------------------------------------------------- -\cprotect\section{Using SPEX Left LU in C} \label{s:Using} +\chapter{SPEX Backslash}\vspace{-0.75in} \label{ch:Backslash} %------------------------------------------------------------------------------- -Using SPEX Left LU in C has three steps: - -\begin{enumerate} -\item initialize and populate data structures, -\item perform symbolic analysis, -factorize the matrix $A$ and solve the linear -system for each $b$ vector, and -\item free all used memory and finalize. -\end{enumerate} - -Step 1 is discussed in Section \ref{s:Using:init}. For Step 2, performing -symbolic analysis and factorizing $A$ and solving the linear $A x =b$ can be -done in one of two ways. If only the solution vector $x$ is required, SPEX Left LU -provides a simple interface for this purpose which is discussed in Section -\ref{s:Using:simple}. Alternatively, if the $L$ and $U$ factors are required, -refer to Section \ref{s:Using:expert}. Finally, step 3 is discussed in Section -\ref{s:Using:free}. For the remainder of this section, \verb|n| will indicate -the dimension of $A$ (that is, $A \in \mathbb{Z}^{n \times n}$) and -\verb|numRHS| will indicate the number of right hand side vectors being solved -(that is, if \verb|numRHS|$= r$, then $b \in \mathbb{Z}^{n \times r}$). - %------------------------------------------------------------------------------- -\cprotect\subsection{SPEX Left LU initialization and population of data structures} -\label{s:Using:init} +\section{Overview} \label{s:Backslash:intro} %------------------------------------------------------------------------------- +SPEX Backslash is a software package designed to exactly solve sparse +linear systems, $A x = b$ where $A \in \mathbb{Q}^{n \times +n}$, $b \in \mathbb{Q}^{n \times r}$, and $x \in \mathbb{Q}^{n \times +r}$. This package determines the appropraite factorization to apply based on the +structure of the input matrix. -This section discusses how to initialize and populate the global data -structures required for SPEX Left LU. +SPEX Backslash is written in ANSI C and is accompanied by MATLAB and Python interfaces. + %------------------------------------------------------------------------------- -\subsubsection{Initializing the environment} +\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.\\ -SPEX is built upon the GNU Multiple Precision Arithmetic (GMP) -\cite{granlund2015gnu} and GNU Multiple Precision Floating Point Reliable -(MPFR) \cite{fousse2007mpfr} libraries and provides wrappers to all GMP/MPFR -functions it uses. This allows SPEX to properly handle memory management -failures, which GMP/MPFR does not handle. To enable this mechanism, SPEX -requires initialization. The following must be done before using any other -SPEX function: +\noindent \textbf{Contact Info:} Contact Chris Lourenco, +\href{mailto:chrisjlourenco@gmail.com}{chrisjlourenco@gmail.com}, or Tim Davis, +\href{mailto:timdavis@aldenmath.com}{timdavis@aldenmath.com}, +\href{mailto:davis@tamu.edu}{davis@tamu.edu}, or +\href{DrTimothyAldenDavis@gmail.com}{DrTimothyAldenDavis@gmail.com}\\ -\begin{mdframed}[userdefinedwidth=6in] +\noindent \textbf{License:} This software package is dual licensed under the GNU General Public License version 2 or the GNU Lesser General Public License version 3. Details of this license are in \verb|SPEX/License/license.txt|. For alternative licenses, please contact the authors. + +%------------------------------------------------------------------------------- +%\cprotect\section{\verb|SPEX_Backslash|: Exactly solve sparse linear systems} +\newpage +\section{\texttt{SPEX\_backslash}: Exactly solve sparse linear systems} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] {\footnotesize \begin{verbatim} - SPEX_initialize ( ) ; - // or SPEX_initialize_expert (...); if custom memory functions are desired + SPEX_info SPEX_backslash + ( + // Output + SPEX_matrix **X_handle, // On output: Final solution vector + // On input: undefined + // Input + SPEX_type type, // Type of output desired. Must be + // SPEX_FP64, SPEX_MPFR, or SPEX_MPQ + const SPEX_matrix* A, // Input matrix of SPEX_CSC SPEX_MPZ + const SPEX_matrix* b, // Right hand side vector(s). Must be + // SPEX_DENSE SPEX_MPZ + const SPEX_options* option // Command options (Default if NULL) + ); \end{verbatim} } \end{mdframed} -%------------------------------------------------------------------------------- -\subsubsection{Initializing data structures} -\label{ss:init} -%------------------------------------------------------------------------------- +\verb|SPEX_backslash| exactly solves the linear system $A \mathbf{x} = \mathbf{b}$ using the appropriate factorization. On input, \verb|SPEX_matrix *x| that \verb|X_handle| points to is undefined. \verb|type| must be one of: +\verb|SPEX_MPQ|, \verb|SPEX_MPFR| or \verb|SPEX_FP64| to specify the data type +of the solution entries. \verb|A| should be a square CSC \verb|mpz_t| matrix +while \verb|b| should be a dense \verb|mpz_t| matrix. In addition, \verb|A->m| +should be equal to \verb|b->m|. Default settings are used if +\verb|option| is input as \verb|NULL|. -SPEX assumes three specific input options for all functions. These are: -\begin{itemize} -\item \verb|SPEX_matrix* A| and \verb|SPEX_matrix *b|: \verb|A| contains the -input coefficient matrix, while \verb|b| contains the right hand side vector(s) -of the linear system $Ax=b$. +This function first checks the symmetry of \verb|A|. If \verb|A| is numerically and pattern symmetric, SPEX Cholesky factorization is attempted. If the Cholesky factorization is successful, it is used to solve $A x = b$. Otherwise, LU factorization is used. -\item \verb|SPEX_LU_analysis* S|: \verb|S| contains the column permutation used -for $A$ as well as estimates of the number of nonzeros in $L$ and $U$. +Upon successful completion, the function returns \verb|SPEX_OK|, and +\verb|x| contains the solution of data type specified by +\verb|type| to the linear system $Ax=b$. If an error occurs, \verb|x| is freed and the appropriate error code is returned. -\item \verb|SPEX_options* option|: \verb|option| contains various control -options for the factorization including column ordering used, pivot selection -scheme, and others. For a full list of the contents of the \verb|SPEX_options| -structure, refer to Section \ref{ss:SPEX_options}. -If default settings are desired, \verb|option| can be set to \verb|NULL|. +\update{ +\chapter{SPEX Update}\vspace{-0.75in} \label{ch:Update} -\end{itemize} %------------------------------------------------------------------------------- -\subsubsection{Populating data structures} -\label{ss:populate_Ab} +\section{Overview} \label{s:Update:intro} %------------------------------------------------------------------------------- +SPEX Update is a software package designed to exactly update +an available REF LU/Cholesky factorization for the sparse matrix $A$ when a low-rank modification is performed on $A$. The low-rank modification could be either column/row replacement or rank-1 update/downdate. Currently, SPEX provides functions for column-replacement LU update and rank-1 Cholesky update/downdate. The theoretical basis for this code is to be submitted as +\begin{itemize} + \item J. Chen, T. A. Davis, “Sparse Exact LU +Update for Column Replacement,” SIAM Journal on Matrix Analysis and Applications. + \item J. Chen, T. A. Davis, “Sparse Exact Rank-1 +Cholesky Update,” SIAM Journal on Matrix Analysis and Applications. +\end{itemize} +SPEX Update is written in ANSI C. -Of the three data structures discussed in Section~\ref{ss:init}, \verb|S| is -constructed during symbolic analysis (Section \ref{s:SPEX_LU_analyze}), and -\verb|option| is an optional parameter for selecting non-default parameters. -Refer to Section \ref{ss:SPEX_options} for the contents of \verb|option|. - -SPEX allows the input numerical data for \verb|A| and \verb|b| to come in -one of 5 types: \verb|int64_t|, \verb|double|, \verb|mpfr_t|, \verb|mpq_t|, -and \verb|mpz_t|. Moreover, both \verb|A| and \verb|b| can be stored in -CSC form, sparse triplet form or dense form. CSC form is discussed in Section -\ref{s:util:overview}. The triplet form stores the contents of the matrix $A$ -in three arrays \verb|i|, \verb|j|, and \verb|x| where the $k$th nonzero entry -is stored as $A ( i[k], j[k]) = x[k]$. SPEX stores its dense matrices in -in column-oriented format, that is, the $(i,j)$th entry in \verb|A| -is \verb|A->x.TYPE[p]| with $p = i+j$*\verb|A->m|. - -If the data for matrices are in file format to be read, refer to -\newline \verb|SPEX/SPEX/SPEX_Left_LU/Demo| \verb|/example2.c| on how to read in data and construct -\verb|A| and \verb|b|. If the data for matrices are already stored in vectors -corresponding to CSC form, sparse triplet form or dense form, allocate a -shallow \verb|SPEX_matrix| and assign vectors accordingly, then use -\verb|SPEX_matrix_copy| to get a \verb|SPEX_matrix| in the desired kind and -type. For more details, refer to \verb|SPEX/SPEX/SPEX_Left_LU/Demo/example.c|. In a case when -\verb|A| is available in format other than CSC \verb|mpz|, and/or \verb|b| is -available in format other than dense \verb|mpz|, the following code snippet -shows how to get \verb|A| and \verb|b| in a required format. - -{\small -\begin{verbatim} - - /* Get the matrix A. Assume that A1 is stored in CSC form - with mpfr_t entries, while b1 is stored in triplet form - with mpq_t entries. (for A1 and b1 in any other form, - the exact same code will work) */ - - SPEX_matrix *A, *b; - // A is a copy of the A1. A is a CSC matrix with mpz_t entries - SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, A1, option); - // b is a copy of the b1. b is a dense matrix with mpz_t entries. - SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, b1, option); - \end{verbatim} } - + %------------------------------------------------------------------------------- -\cprotect\subsection{Simple SPEX Left LU routines for solving linear systems} -\label{s:Using:simple} +\section{Licensing} \label{s:Update:licensing} %------------------------------------------------------------------------------- +\textbf{Copyright:} The copyright of this software is held by Jinhao Chen, Christopher Lourenco, Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis.\\ -After initializing the necessary data structures, SPEX obtains the solution -to $Ax=b$ using the simple interface of SPEX Left LU, \verb|SPEX_Left_LU_backslash|. The -\newline \verb|SPEX_Left_LU_backslash| function can return \verb|x| as \verb|double|, -\verb|mpq_t|, or \verb|mpfr_t| with an associated precision. See Section -\ref{ss:SPEX_Left_LU_backslash} for more details. The following code snippet shows how -to get solution as a dense \verb|mpq_t| matrix. +\noindent \textbf{Contact Info:} Contact Jinhao Chen +\href{mailto:cjh10644@hotmail.com}{cjh10644@hotmail.com}, or Chris Lourenco, +\href{mailto:chrisjlourenco@gmail.com}{chrisjlourenco@gmail.com}, or Tim Davis, +\href{mailto:timdavis@aldenmath.com}{timdavis@aldenmath.com}, +\href{mailto:davis@tamu.edu}{davis@tamu.edu}, or +\href{DrTimothyAldenDavis@gmail.com}{DrTimothyAldenDavis@gmail.com}\\ -{\small -\begin{verbatim} - SPEX_matrix *x; - SPEX_type my_type = SPEX_MPQ; // SPEX_MPQ, SPEX_MPFR, SPEX_FP64 - SPEX_Left_LU_backslash(&x, my_type, A, b, option) ; \end{verbatim} } +\noindent \textbf{License:} This software package is dual licensed under the GNU General Public License version 2 or the GNU Lesser General Public License version 3. Details of this license are in \verb|SPEX/License/license.txt|. For alternative licenses, please contact the authors. -On successful return, this function returns \verb|SPEX_OK| (see Section -\ref{ss:SPEX_info}). %------------------------------------------------------------------------------- -\cprotect\subsection{Expert SPEX Left LU routines} -\label{s:Using:expert} +\section{SPEX Factorization Update Functions} %------------------------------------------------------------------------------- +SPEX update provides the following functions to perform factorization updates. -If the $L$ and $U$ factors from the SPEX Left LU factorization of the matrix $A$ -are required, the steps performed by \verb|SPEX_Left_LU_backslash| can be done with -a sequence of calls to SPEX functions: - -\begin{enumerate} -\item declare \verb|L|, \verb|U|, the solution matrix \verb|x|, and others, -\item perform symbolic analysis, -\item compute the factorization $PAQ = L D U$, -\item solve the linear system $Ax =b$, and -\item convert the final solution into the final desired form. -\end{enumerate} +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_Update_Chol_Rank1|: rank 1 update to REF Cholesky} +\subsection{\texttt{SPEX\_Update\_Chol\_Rank1}: rank-1 REF Cholesky update/downdate}\label{ss:SPEX_Update_Chol_Rank1} +%------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_Update_Chol_Rank1 + ( + // input/output + SPEX_factorization *F, // The SPEX Cholesky factorization of A. + SPEX_matrix *w, // a n-by-1 SPEX_DYNAMIC_CSC matrix that + // contains the vector to modify the original + // matrix A, the resulting A is A+sigma*w*w^T. + // input + 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 + ); +\end{verbatim} +} \end{mdframed} -\noindent These steps are discussed below, along with examples. +\verb|SPEX_Update_Chol_Rank1| performs the rank-1 REF Cholesky update/downdate for a $n$-by-$n$ sparse matrix $A$. On input, \verb|F| contains the valid Cholesky factorization to be updated that consists of \verb|L|, \verb|rhos|, \verb|P_perm| and \verb|Pinv_perm|; \verb|w| must be a $n$-by-$1$ matrix of \verb|SPEX_DYNAMIC_CSC| kind; \verb|sigma| is a nonzero scalar, where \verb|sigma > 0| indicates update and \verb|sigma < 0| indicates downdate; and \verb|option| contains command options (default settings are used if \verb|option| is input as \verb|NULL|). -%------------------------------------------------------------------------------- -\subsubsection{Declare workspace} -%------------------------------------------------------------------------------- +This function requires that the rows of \verb|w| are in the same order as that of $A$ (and \verb|F->L| if \verb|F| is updatable). In addition, \verb|w| and \verb|SPEX_matrix *A| that contains $A$ are scaled with same factor, i.e., \verb|w->scale = A->scale|, while \verb|w->v[0]->scale = 1|. (Users can refer to section \ref{ss:SPEX_matrix} for the difference between \verb|w->scale| and \verb|w->v[0]->scale|.) As for \verb|F|, if it is input in a non-updatable format, it is first converted to updatable format. -Using SPEX in this form requires the intermediate variables be declared, such as \verb|L|, \verb|U|, etc. The following code snippet shows the detailed list. +On success \verb|SPEX_OK| is returned, and \verb|F| contains the updatable REF Cholesky factorization of $A + \sigma w w^T$, and \verb|w| contains the solution $w_{out}$ to $LD^{-1}w_{out} = w_{in}$, where $A=LD^{-1}L^T$ and $w_{in}$ is the input matrix \verb|w|. It should be noted that $w_{out}$ is also the solution to $\bar{L}\bar{D}^{-1}w_{out} = w_{in}$, where $A+ \sigma w w^T=\bar{L}\bar{D}^{-1}\bar{L}^T$. Otherwise, if this function fails for any reason, the appropriate error code is returned and \verb|F| is undefined on output (since the modification for the factorization is done in place during the update process). -{\small -\begin{verbatim} - // A and b are in required type and ready to use - SPEX_matrix *L = NULL; - SPEX_matrix *U = NULL; - SPEX_matrix *x = NULL; - SPEX_matrix *rhos = NULL; - int64_t* pinv = NULL; - SPEX_LU_analysis* S = NULL; - // option needs no declaration if default setting is desired - // only declare option for further modification on default setting - SPEX_options *option = SPEX_create_default_options(); - \end{verbatim} } +This function does not require/use/modify the original matrix $A$. Therefore, if the updated matrix $\bar{A}$ is needed, users should implement it by their own {\bf BEFORE} using this function (since \verb|w| will be modified by this function). + %------------------------------------------------------------------------------- -\subsubsection{SPEX Left LU symbolic analysis} +%\cprotect\subsection{\verb|SPEX_Update_LU_ColRep|: Column replacement update for REF LU} +\subsection{\texttt{SPEX\_Update\_LU\_ColRep}: Column-replacement REF LU update}\label{ss:SPEX_Update_LU_ColRep} %------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_Update_LU_ColRep + ( + // input/output + SPEX_factorization* F, // The SPEX LU factorization of A. + // input + SPEX_matrix *vk, // a n-by-1 SPEX_DYNAMIC_CSC matrix that + // contains the column to be inserted. + int64_t k, // The column index that vk will be inserted + const SPEX_options *option// Command parameters + ); +\end{verbatim} +} \end{mdframed} -The symbolic analysis phase of an LU factorization entails computing the symbolic column ordering and estimating the number of nonzeros in $L$ and $U$. This is performed by calling the following function: +\verb|SPEX_Update_LU_ColRep| exactly updates the REF LU factorization of a $n$-by-$n$ sparse matrix $A$ when one column of $A$ is replaced. On input \verb|F| contains the valid LU factorization to be updated that consists of \verb|L, U, rhos, P_perm, Pinv_perm| and \verb|Q_perm| (and \verb|Qinv_perm| for an updatable \verb|F|); \verb|vk| is a $n$-by-$1$ \verb|SPEX_DYNAMIC_CSC| matrix that contains the column to be inserted; \verb|k| is the index of the column of $A$ to be replaced and thus must be in the range of $[0,n-1]$; and option contains command parameters (default settings are used if \verb|option| is input as \verb|NULL|). -{\small - \begin{verbatim} - SPEX_LU_analyze (&S, A, option) ; \end{verbatim} } +This function requires that the rows of \verb|vk| are in the same order as that of $A$ (and \verb|F->L| if \verb|F| is updatable). In addition, \verb|vk| and \verb|SPEX_matrix *A| that contains $A$ are scaled with same factor, i.e., \verb|vk->scale = A->scale|, while \verb|vk->v[0]->scale = 1|. (Users can refer to section \ref{ss:SPEX_matrix} for the difference between \verb|vk->scale| and \verb|vk->v[0]->scale|.) As for \verb|F|, if it is input in a non-updatable format, it is first converted to updatable format. -%------------------------------------------------------------------------------- -\subsubsection{Computing the factorization} -%------------------------------------------------------------------------------- +On success \verb|SPEX_OK| is returned, and \verb|F| contains the updatable REF LU factorization of $\bar{A}$ which is obtained by replacing column $k$ of $A$ with \verb|vk|, while \verb|vk| is unmodified. +Otherwise, if this function fails for any reason, the appropriate error code is returned and \verb|F| is undefined on output (since the modification for the factorization is done in place during the update process). + +This function does not require/use/modify the original matrix $A$. Therefore, if the updated matrix $\bar{A}$ is needed, users should call \verb|SPEX_Update_matrix_colrep| {\bf AFTER} using this function (since \verb|vk| will be modified by \verb|SPEX_Update_matrix_colrep|). -The matrices \verb|L| and \verb|U|, the pivot sequence \verb|rhos|, and the row -permutation \verb|pinv| are computed via the \verb|SPEX_Left_LU_factorize| function -(Section \ref{s:LeftLU:SPEX_Left_LU_factorize}). Upon successful completion, this -function returns \verb|SPEX_OK|. %------------------------------------------------------------------------------- -\subsubsection{Solving the linear system} +\section{SPEX Update Solve Routines} %------------------------------------------------------------------------------- +When factorization is updated iteratively, it should not be converted back and forth between updatable and non-updatable formats. However, this happens when users use the default LU/Cholesky solves (i.e., \verb|SPEX_Left_LU_solve| or \verb|SPEX_Chol_solve|) after using either \verb|SPEX_Update_Chol_Rank1| or \verb|SPEX_Update_LU_ColRep|, since the default LU/Cholesky solves always convert factorization to non-updatable format while the SPEX Update functions require and output updatable factorization. To avoid this, SPEX Update provides functions to solve the linear equation $Ax=b$ based on the updatable LU/Cholesky factorization of $A$. In particular, both a normal solve and a transpose solve using the updatable factorizations are provided. -After factorization, the next step is to solve the linear system and store the -solution as a dense matrix \verb|x| with entries of rational number -\verb|mpq_t|. This solution is done via the \verb|SPEX_Left_LU_solve| -function (Section \ref{ss:SPEX_Left_LU_solve}). -Upon successful completion, this function returns \verb|SPEX_OK|. - -In this step, \verb|option->check| can be set to \verb|true| to enable the -solution check process as discussed in Section \ref{ss:SPEX_Left_LU_solve}. The -process can verify that the solution vector x satisfies $Ax=b$ in perfect -precision intended for debugging. This step is not needed, since the solution -returned is guaranteed to be exact. It appears here simply as debugging tool, -and as a verification that SPEX is computing its expected result. This test -can fail only if it runs out of memory, or if there is a bug in the code (in -which case, please notify the authors). Also, note that this process can be -quite time consuming; thus it is not recommended to be used in general. %------------------------------------------------------------------------------- -\subsubsection{Converting the solution vector to the final desired form} +%\cprotect\subsection{\verb|SPEX_Update_solve|: Solve $Ax=b$ with the updatable factorization} +\subsection{\texttt{SPEX\_Update\_solve}: Solve linear system with the updatable factorization}\label{ss:SPEX_Update_solve} %------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_Update_solve // solves Ax = b + ( + // Output + SPEX_matrix **x_handle, // rational solution to the system + // input/output + SPEX_factorization *F, // The updatable LU/Cholesky factorization of A + // input: + const SPEX_matrix *b, // Right hand side vector + const SPEX_options* option // Command options + ); +\end{verbatim} +} \end{mdframed} -Upon completion of the above routines, the solution to the linear system is in -a dense \verb|mpq_t| matrix. SPEX allows this to be converted into any form -of matrix in the set of (CSC, sparse triplet, dense) $\times$ (\verb|mpfr_t|, -\verb|mpq_t|, \verb|double|) using \verb|SPEX_matrix_copy|. The following code -snippet shows how to get solution as a dense \verb|double| matrix; since this -involves a floating-point representation, the solution \verb|my_x| will no -longer be exact, even though \verb|x| is the exact solution. +\verb|SPEX_Update_solve| obtains the solution of \verb|mpq_t| type to the +linear system $Ax=b$ upon a valid LU/Cholesky factorization of $A$. + +On input, \verb|SPEX_matrix *x| that \verb|x_handle| points to is undefined; \verb|F| must be a valid LU/Cholesky factorization; \verb|b| must be dense \verb|mpz_t| with same number of rows as \verb|F->L|; and default settings are used if +\verb|option| is input as \verb|NULL|. Upon successful completion, the function returns \verb|SPEX_OK|, and the dense \verb|mpq_t| matrix \verb|x| +contains the solution to the linear +system $Ax=b$. \verb|F| is mathematically unchanged on output. However, if \verb|F| is non-updatable on input, it is converted to updatable. If \verb|F| is already updatable, it is not modified. +In case of failure, \verb|x| is returned as \verb|NULL| and the appropriate error code is returned. -{\small -\begin{verbatim} - SPEX_kind my_kind = SPEX_DENSE; // SPEX_CSC, SPEX_TRIPLET or SPEX_DENSE - SPEX_type my_type = SPEX_FP64; // SPEX_MPQ, SPEX_MPFR, or SPEX_FP64 - SPEX_matrix* my_x = NULL; // New output - // Create copy which is stored as my_kind and my_type: - SPEX_matrix_copy( &my_x, my_kind, my_type, x, option);\end{verbatim} } %------------------------------------------------------------------------------- -\cprotect\subsection{Freeing memory} -\label{s:Using:free} +%\cprotect\subsection{\verb|SPEX_Update_tsolve|: Solve $A^Tx=b$ with the updatable factorization} +\subsection{\texttt{SPEX\_Update\_tsolve}: Solve transposed linear system with the updatable factorization} \label{ss:SPEX_Update_tsolve} %------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_Update_tsolve // solves A^T x = b + ( + // Output + SPEX_matrix **x_handle, // rational solution to the system + // input/output + SPEX_factorization *F, // The updatable LU/Cholesky factorization of A + // input: + const SPEX_matrix *b, // Right hand side vector + const SPEX_options* option // Command options + ); +\end{verbatim} +} \end{mdframed} -As described in Section \ref{s:user:memmanag}, SPEX provides a number -of functions/macros to free SPEX structures: - -\begin{itemize} -\item \verb|SPEX_matrix*|: A \verb|SPEX_matrix* A| data structure can be freed -with a call to \verb|SPEX_matrix_free(&A, NULL) ;| -\item \verb|SPEX_LU_analysis*|: A \verb|SPEX_LU_analysis* S| data structure can -be freed with a call to \verb|SPEX_LU_analysis_free(&S, NULL) ;| +\verb|SPEX_Update_tsolve| obtains the solution of \verb|mpq_t| type to the +linear system $A^Tx=b$ upon a valid LU/Cholesky factorization of $A$. -\item All others including \verb|SPEX_options*|: These data structures can be -freed with a call to the macro \verb|SPEX_FREE()|, for example, -\verb|SPEX_FREE(option)| for \newline -\verb|SPEX_options* option|. +On input, \verb|SPEX_matrix *x| that \verb|x_handle| points to is undefined; \verb|F| must be a valid LU/Cholesky factorization; \verb|b| must be dense \verb|mpz_t| with same number of rows as \verb|F->L|; and default settings are used if +\verb|option| is input as \verb|NULL|. Upon successful completion, the function returns \verb|SPEX_OK|, and the dense \verb|mpq_t| matrix \verb|x| +contains the solution to the linear +system $A^Tx=b$. \verb|F| is mathematically unchanged on output. However, if \verb|F| is non-updatable on input, it is converted to updatable. If \verb|F| is already updatable, it is not modified. +In case of failure, \verb|x| is returned as \verb|NULL| and the appropriate error code is returned. -\end{itemize} -After all usage of the SPEX routines is finished, \verb|SPEX_finalize()| -must be called (Section \ref{ss:SPEX_finalize}) to finalize usage of the -library. +%------------------------------------------------------------------------------- +\section {SPEX Update Helper Functions} +%------------------------------------------------------------------------------- %------------------------------------------------------------------------------- -\cprotect\subsection{Examples} -\label{s:Using:Examples} +\subsection{\texttt{SPEX\_Update\_matrix\_colrep}: Swap the columns of a matrix} \label{ss:SPEX_Update_matrix_colrep} %------------------------------------------------------------------------------- +\begin{mdframed}[userdefinedwidth=\textwidth] +{\footnotesize +\begin{verbatim} + SPEX_info SPEX_Update_matrix_colrep// performs column replacement + ( + // input/output + SPEX_matrix *A, // m-by-n target matrix of SPEX_DYNAMIC_CSC + SPEX_matrix *vk, // m-by-1 SPEX_DYNAMIC_CSC matrix that contains + // the column vector to replace the k-th column + // of A + // input + int64_t k, // The column index that vk will be inserted + const SPEX_options *option// Command parameters + ); +\end{verbatim} +} \end{mdframed} -The \verb|SPEX/SPEX/SPEX_Left_LU/Demo| folder contains three sample C codes -which utilize SPEX. These files demonstrate the usage of SPEX as -follows: +\verb|SPEX_Update_matrix_colrep| simply serves as a helper function in the column-replacement scenario where users wish to obtain the matrix after one of its columns is replaced. It should be noted that this does {\bf NOT} update the factorization of \verb|A|, and thus users should call \verb|SPEX_Update_LU_ColRep| to update the REF LU factorization for column replacement. To be more specific, this function swaps column \verb|k| of the matrix \verb|A| with column of \verb|vk| (i.e., swaps \verb|A->v[k]| and \verb|vk->v[0]|). Therefore, both \verb|A| and \verb|vk| are modified by this function, which requires users to call this function {\bf BEFORE} using \verb|SPEX_Update_LU_ColRep|. -\begin{itemize} -\item \verb|example.c|: This example generates a random dense $50 \times 50$ -matrix and a random dense $50 \times 1$ right hand side vector $b$ and -solves the linear system. In this function, the \verb|SPEX_Left_LU_backslash| -function is used; and the output is given as a double matrix. +On input, \verb|A| and \verb|vk| must be matrices of \verb|SPEX_DYNAMIC_CSC| kind with the same number of rows $m$; \verb|k| is the index of the column of $A$ to be replaced and thus must be in the range of $[0,m-1]$; and option contains command parameters (default settings are used if \verb|option| is input as \verb|NULL|). -\item \verb|example2.c|: This example reads in a matrix stored in triplet -format from the \verb|ExampleMats| folder. Additionally, it reads in a -right hand side vector from this folder and solves the associated linear system -via the \verb|SPEX_Left_LU_backslash| function, and, the solution is given as a matrix -of rational numbers. +This function requires that the rows of \verb|vk| are in the same order as that of \verb|A|. In addition, \verb|vk| and \verb|A| are scaled with the same factor, i.e., \verb|vk->scale = A->scale|, while \verb|vk->v[0]->scale = 1|. (Users can refer to section \ref{ss:SPEX_matrix} for the difference between \verb|vk->scale| and \verb|vk->v[0]->scale|.) Different from \verb|SPEX_Update_LU_ColRep|, this function does not require \verb|A| to be a square matrix, as long as it has the same number of rows as \verb|vk|. -\item \verb|spexlu_demo.c|: This example reads in a matrix and right hand side -vector from a file and solves the linear system $A x = b$ -using the techniques discussed in Section \ref{s:Using:expert}. This file also -allows command line arguments (discussed in \verb|README.md|) and can be used -to replicate the results from \cite{lourenco2019exact}. +On output, \verb|A->v[k]| and \verb|vk->v[0]| are simply swapped. +} -\end{itemize} %------------------------------------------------------------------------------- -\cprotect\section{Using SPEX Left LU in MATLAB} -\label{s:Use:MATLAB} +\chapter{Using SPEX in MATLAB}\vspace{-0.75in} \label{s:Use:MATLAB} %------------------------------------------------------------------------------- - -After following the installation steps discussed in Section \ref{s:install}, -using the SPEX Left LU factorization within MATLAB can be done via the -\verb|SPEX_Left_LU_backslash.m| function. First, this section describes the +The MATLAB interface of SPEX can be installed by navigating to the \verb|MATLAB| folder and typing \verb|spex_mex_install|. +Doing so installs SPEX and allows the use of 3 mex functions \verb|spex_lu_backslash.m|, \verb|spex_cholesky_backslash.m|, and \verb|spex_backslash.m|. First, this section describes the \verb|option| struct in Section \ref{s:Use:MATLAB:setup}. The use of the factorization is discussed in Section \ref{s:Use:MATLAB:factor}. -The \verb|SPEX/SPEX/SPEX_Left_LU/MATLAB| folder must be in your MATLAB path. +The \verb|SPEX/SPEX/MATLAB| folder must be in your MATLAB path. + %------------------------------------------------------------------------------- -\cprotect\subsection{Optional parameter settings} -\label{s:Use:MATLAB:setup} +\section{Optional parameter settings} \label{s:Use:MATLAB:setup} %------------------------------------------------------------------------------- - -The SPEX Left LU MATLAB interface includes an \verb|option| struct as in optional +The SPEX MATLAB interface includes an \verb|option| struct as in optional input parameter that modifies behavior. If this parameter is not provided, default parameter settings are used. The elements of the \verb'option' struct are listed below. Any fields not present in the struct are treated as their default values. \begin{itemize} - \item \verb|option.pivot|: This parameter is a string that controls the pivoting scheme used. When selecting a pivot entry in a given column, the -factorization method uses one of the following pivoting strategies: +factorization method uses one of the following pivoting strategies. Note that +importantly this is only valid for LU factorization: \begin{itemize} - \item \verb|'smallest'|: smallest pivot, + \item \verb|'smallest'|: (default) smallest pivot, \item \verb|'diagonal'|: diagonal pivot if possible, otherwise smallest pivot, \item \verb|'first'|: first nonzero pivot in each column, - \item \verb|'tol smallest'|: (default) diagonal pivot with a tolerance (\verb|option.tol|) + \item \verb|'tol smallest'|: diagonal pivot with a tolerance (\verb|option.tol|) for the smallest pivot, \item \verb|'tol largest'|: diagonal pivot with a tolerance (\verb|option.tol|) for the largest pivot, @@ -2161,21 +2741,19 @@ \subsubsection{Converting the solution vector to the final desired form} \end{itemize} \item \verb|option.order|: This parameter is a string controls the -fill-reducing column preordering used. +fill-reducing column preordering used. This is valid for either LU +or Cholesky as Backslash will choose its own ordering. \begin{itemize} \item \verb|'none'|: no column ordering; factorize \verb'A' as-is. - \item \verb|'colamd'|: COLAMD ordering (default) - \item \verb|'amd'|: AMD ordering + \item \verb|'colamd'|: COLAMD ordering (default for LU) + \item \verb|'amd'|: AMD ordering (default for Cholesky) \end{itemize} -The \verb|'colamd'| is recommended for most cases. The \verb|'AMD'| ordering -is suitable if the nonzero pattern of \verb'A' is mostly symmetric. In this -case, \verb|option.pivot = 'diagonal'| is a useful option. - \item \verb|option.tol|: This parameter determines the tolerance used if one of the threshold pivoting schemes is chosen. The default value is 1 and this -parameter can take any value in the range $(0,1]$. +parameter can take any value in the range $(0,1]$. This is only valid +for LU factorization. \item \verb|option.solution|: a string determining how \verb|x| is to be returned: @@ -2204,31 +2782,101 @@ \subsubsection{Converting the solution vector to the final desired form} \item \verb|option.print|: display the inputs and outputs (0: nothing (default), 1: just errors, 2: terse, 3: all). +\end{itemize} + + +%------------------------------------------------------------------------------- +\section{SPEX m files for use} \label{s:Use:MATLAB:factor} +%------------------------------------------------------------------------------- + +%------------------------------------------------------------------------------- +%\cprotect\subsection{\verb|SPEX_Left_LU_backslash.m|} +\subsection{\texttt{spex\_lu\_backslash.m}} +%------------------------------------------------------------------------------- +The \verb|spex_lu_backslash.m| function solves the linear system $A x = b$ where +$A \in \mathtt{R}^{n \times n}$, $x \in \mathtt{R}^{n \times m}$ and $b \in +\mathtt{R}^{n \times m}$. The final solution vector(s) obtained via this +function are exact prior to their conversion to double precision. + +This function expects as input a sparse matrix $A$ and dense set of +right hand side vectors $b$. Optionally, \verb|option| struct can be passed in. +Currently, there are 2 ways to use this function outlined below: + +\begin{itemize} + +\item \verb|x = spex_lu_backslash(A,b)| returns the solution to $A x = +b$ using default settings. The solution vectors are more accurate than +the solution obtained via \verb|x = A \ b|. The solution \verb|x| is +returned as a MATLAB double matrix. + +\item \verb|x = spex_lu_backslash(A,b,option)| returns the solution to $A x = +b$ using non-default settings from the \verb|option| struct. \end{itemize} +If the result \verb|x| is held as a MATLAB double matrix, in conventional +floating-point representation (\verb|double|), it is guaranteed to be exact +only if the exact solution can be held in \verb|double| without modification. + +The solution \verb|x| may also be returned as a MATLAB \verb|vpa| array, or as +a cell array of strings; See Section \ref{s:Use:MATLAB:setup} for details. + + %------------------------------------------------------------------------------- -\cprotect\subsection{\verb|SPEX_Left_LU_backslash.m|} -\label{s:Use:MATLAB:factor} +\subsection{\texttt{spex\_cholesky\_backslash.m}} %------------------------------------------------------------------------------- +The \verb|spex_cholesky_backslash.m| function solves the linear system $A x = b$ where +$A \in \mathtt{R}^{n \times n}$, $x \in \mathtt{R}^{n \times m}$ and $b \in +\mathtt{R}^{n \times m}$. The final solution vector(s) obtained via this +function are exact prior to their conversion to double precision. Note that +A must be SPD otherwise this function returns an error. + +This function expects as input a sparse matrix $A$ and dense set of +right hand side vectors $b$. Optionally, \verb|option| struct can be passed in. +Currently, there are 2 ways to use this function outlined below: + +\begin{itemize} + +\item \verb|x = spex_cholesky_backslash(A,b)| returns the solution to $A x = +b$ using default settings. The solution vectors are more accurate than +the solution obtained via \verb|x = A \ b|. The solution \verb|x| is +returned as a MATLAB double matrix. + +\item \verb|x = spex_cholesky_backslash(A,b,option)| returns the solution to $A x = +b$ using non-default settings from the \verb|option| struct. + +\end{itemize} + +If the result \verb|x| is held as a MATLAB double matrix, in conventional +floating-point representation (\verb|double|), it is guaranteed to be exact +only if the exact solution can be held in \verb|double| without modification. + +The solution \verb|x| may also be returned as a MATLAB \verb|vpa| array, or as +a cell array of strings; See Section \ref{s:Use:MATLAB:setup} for details. -The \verb|SPEX_Left_LU_backslash.m| function solves the linear system $A x = b$ where + +%------------------------------------------------------------------------------- +\subsection{\texttt{spex\_backslash.m}} +%------------------------------------------------------------------------------- +The \verb|spex_backslash.m| function solves the linear system $A x = b$ where $A \in \mathtt{R}^{n \times n}$, $x \in \mathtt{R}^{n \times m}$ and $b \in \mathtt{R}^{n \times m}$. The final solution vector(s) obtained via this function are exact prior to their conversion to double precision. -The SPEX Left LU function expects as input a sparse matrix $A$ and dense set of +This function expects as input a sparse matrix $A$ and dense set of right hand side vectors $b$. Optionally, \verb|option| struct can be passed in. +If A is numerically symmetric, it attempts a Cholesky factorization. If the Cholesky +fails or if the matrix is not numerically symmetric it performs an LU factorization. Currently, there are 2 ways to use this function outlined below: \begin{itemize} -\item \verb|x = SPEX_Left_LU_backslash(A,b)| returns the solution to $A x = +\item \verb|x = spex_backslash(A,b)| returns the solution to $A x = b$ using default settings. The solution vectors are more accurate than the solution obtained via \verb|x = A \ b|. The solution \verb|x| is returned as a MATLAB double matrix. -\item \verb|x = SPEX_Left_LU_backslash(A,b,option)| returns the solution to $A x = +\item \verb|x = spex_backslash(A,b,option)| returns the solution to $A x = b$ using non-default settings from the \verb|option| struct. \end{itemize} @@ -2240,10 +2888,114 @@ \subsubsection{Converting the solution vector to the final desired form} The solution \verb|x| may also be returned as a MATLAB \verb|vpa| array, or as a cell array of strings; See Section \ref{s:Use:MATLAB:setup} for details. + +%------------------------------------------------------------------------------- +\subsection{\texttt{spex\_mex\_demo.m}} +%------------------------------------------------------------------------------- +This function provides a demo of the SPEX library. It shows the usage for an exact +solution as well as error checking and tuning the parameters. The typical output +of this function may be seen in the provided \verb|MATLAB/html| folder. + + + +%------------------------------------------------------------------------------- +\chapter{Using SPEX in Python}\vspace{-0.75in} +%------------------------------------------------------------------------------- +The Python interface of SPEX can be installed by navigating to the Python folder and typing make. Doing so allows the use of the Python SPEX library. First, this section describes the \verb|Option| object in Section \ref{s:Python:option}. The use of SPEX to solve $Ax=b$ is discussed in Section \ref{s:Python:Funcs}. + + +%------------------------------------------------------------------------------- +\section{Optional parameter settings}\label{s:Python:option} +%------------------------------------------------------------------------------- +The SPEX Python interface includes an object as an optional input parameter that modifies behaviour. If this is not provided, default parameter settings are used. +\begin{itemize} + \item output: This parameter is a string that determines how the solution is to be returned + \begin{itemize} + \item \verb|'double'|: \verb|x| is converted to a 64-bit + floating-point approximate solution. This is the default. + \item \verb|'string'|: \verb|x| is returned as an array of strings. + \end{itemize} + \item ordering: This parameter is a string that controls the fill-reducing column preordering used. By default it is initialized as None, if this option is chosen, the solve functions use the appropriate default ordering (AMD for Cholesky and COLAMD for Left LU). + \begin{itemize} + \item \verb|'none'|: no column ordering; factorize $A$ as-is. + \item \verb|'colamd'|: COLAMD ordering + \item \verb|'amd'|: AMD ordering + \end{itemize} +\end{itemize} + + +%------------------------------------------------------------------------------- +\section{Functions in Python SPEX}\label{s:Python:Funcs} +%------------------------------------------------------------------------------- + +%------------------------------------------------------------------------------- +\subsection{\texttt{lu\_backslash}} +%------------------------------------------------------------------------------- +The \verb|lu_backslash| function solves the linear system $Ax=b$ where$A \in \mathtt{R}^{n \times n}$, $x \in \mathtt{R}^{n \times 1}$ and $b \in \mathtt{R}^{n \times 1}$. The final solution vector(s) obtained via this function are exact prior to their conversion to double precision. + +The LU function expects as input a \verb|scipy| sparse matrix $A$ and a right hand side vector $b$. Optionally, \verb|option| object can be passed in. +Currently, there are 2 ways to use this function outlined below: + +\begin{itemize} + \item \verb|x=SPEX.lu_backslash(A,b)| returns the solution to $A x = b$ using default settings. The solution \verb|x| is returned as a \verb|numpy| double array. + \item \verb|x=SPEX.lu_backslash(A,b,options)| returns the solution to $A x = b$ using non-default settings from the \verb|option| object. +\end{itemize} + +If the result \verb|x| is held as a \verb|numpu| double array, in conventional floating-point representation (\verb|double|), it is guaranteed to be exact only if the exact solution can be held in \verb|double| without modification. + +The solution \verb|x| may also be returned as a list of strings; See Section \ref{s:Python:option} for details. + + +%------------------------------------------------------------------------------- +\subsection{\texttt{cholesky\_backslash}} +%------------------------------------------------------------------------------- +The \verb|cholesky_backslash| function solves the linear system $Ax=b$ where$A \in \mathtt{R}^{n \times n}$, $x \in \mathtt{R}^{n \times 1}$ and $b \in \mathtt{R}^{n \times 1}$. The final solution vector(s) obtained via this function are exact prior to their conversion to double precision. Note that $A$ must be symmetric positive definite. + +The Cholesky function expects as input a \verb|scipy| sparse matrix $A$ and a right hand side vector $b$. Optionally, \verb|option| object can be passed in. +Currently, there are 2 ways to use this function outlined below: + +\begin{itemize} + \item \verb|x=SPEX.cholesky_backslash(A,b)| returns the solution to $A x = b$ using default settings. The solution \verb|x| is returned as a \verb|numpy| double array. + \item \verb|x=SPEX.cholesky_backslash(A,b,options)| returns the solution to $A x = b$ using non-default settings from the \verb|option| object. +\end{itemize} + +If the result \verb|x| is held as a \verb|numpu| double array, in conventional floating-point representation (\verb|double|), it is guaranteed to be exact only if the exact solution can be held in \verb|double| without modification. + +The solution \verb|x| may also be returned as a list of strings; See Section \ref{s:Python:option} for details. + + +%------------------------------------------------------------------------------- +\subsection{\texttt{backslash}} +%------------------------------------------------------------------------------- +The \verb|backslash| function solves the linear system $Ax=b$ where$A \in \mathtt{R}^{n \times n}$, $x \in \mathtt{R}^{n \times 1}$ and $b \in \mathtt{R}^{n \times 1}$. The final solution vector(s) obtained via this function are exact prior to their conversion to double precision. Note that $A$ must be symmetric positive definite. + +The Backslash function expects as input a \verb|scipy| sparse matrix $A$ and a right hand side vector $b$. Optionally, \verb|option| object can be passed in. If A is numerically symmetric, it attempts a Cholesky factorization. If the Cholesky fails or if the matrix is not numerically symmetric it performs an LU factorization. +Currently, there are 2 ways to use this function outlined below: + +\begin{itemize} + \item \verb|x=SPEX.backslash(A,b)| returns the solution to $A x = b$ using default settings. The solution \verb|x| is returned as a \verb|numpy| double array. + \item \verb|x=SPEX.backslash(A,b,options)| returns the solution to $A x = b$ using non-default settings from the \verb|option| object. +\end{itemize} + +If the result \verb|x| is held as a \verb|numpu| double array, in conventional floating-point representation (\verb|double|), it is guaranteed to be exact only if the exact solution can be held in \verb|double| without modification. + +The solution \verb|x| may also be returned as a list of strings; See Section \ref{s:Python:option} for details. + + +%------------------------------------------------------------------------------- +\section{Demo} +%------------------------------------------------------------------------------- +There is a file that provides a demo of the SPEX library in Python \verb|demo.py|. It shows the usage for an exact +solution as well as tuning the parameters. + + %------------------------------------------------------------------------------- % References %------------------------------------------------------------------------------- + + + \bibliographystyle{siam} \bibliography{SPEX_UserGuide.bib} \end{document} diff --git a/SPEX/Doc/SPEX_version.tex b/SPEX/Doc/SPEX_version.tex index 041cc55a18..7120d15bd7 100644 --- a/SPEX/Doc/SPEX_version.tex +++ b/SPEX/Doc/SPEX_version.tex @@ -1,2 +1,2 @@ % version of SuiteSparse/SPEX -VERSION 2.3.2, Jan 20, 2024 +VERSION 3.1.0, Feb XX, 2024 diff --git a/SPEX/Doc/appendix_A.pdf b/SPEX/Doc/appendix_A.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2781a79dd7525dec1985cfd5c0cf198bf87278e6 GIT binary patch literal 100257 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
i;3{=i`?*oe!J#7U4yX>?xnqtFn5 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
hL6k9UzqC=wD2s>Ub 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 literal 0 HcmV?d00001 diff --git a/SPEX/Doc/appendix_A.tex b/SPEX/Doc/appendix_A.tex new file mode 100644 index 0000000000..59559da2ed --- /dev/null +++ b/SPEX/Doc/appendix_A.tex @@ -0,0 +1,426 @@ +\documentclass[10pt]{article} +\usepackage{longtable} +\usepackage{xcolor} + +\newcommand{\blu}{ + \color{blue} + } + +\newcommand{\red}{ + \color{red} + } + +\begin{document} + +\appendix + +\section{Comprehensive Computational Results} \label{s:ResultsALL} + +Tables \ref{supptab:all_large}, \ref{supptab:all_medium}, \ref{supptab:all_small}, and \ref{supptab:all_tiny} present exhaustive computational results for large (those requiring $\geq1$ hour of run time), medium (those requiring between 1 hour and 1 minute of run time), small (those requiring between 1 minute and $0.1$ seconds of run time) and tiny (those requiring less than $0.1$ seconds) instances, respectively. In each table, the first five columns give the name (or index from SJ database), dimension, number of nonzeros, MATLAB estimated condition number, and MATLAB estimated sparse norm in each matrix. Column 6 gives the run time of SPEX Left LU using the selected pivoting scheme tol 0. Lastly, columns 7 and 8 give the relative run time of Wiedemann and Lanczos, respectively. Note that those instances in which these algorithms seg-fault are indicated with {\bf \red SF} and those instances whose solutions were incorrect are indicated with bold red text. + +\begin{longtable}{|l|r|r|r|r|r|r|r|} +\hline +& & & & & & \multicolumn{2}{c|}{Relative Run Time} \\ \hline +\multicolumn{1}{|c|}{Matrix Name} & \multicolumn{1}{c|}{n} & \multicolumn{1}{c|}{nnz} & \multicolumn{1}{c|}{Cond} & \multicolumn{1}{c|}{norm} & \multicolumn{1}{c|}{SPEX time (hr)} & \multicolumn{1}{c|}{Wiedemann} & \multicolumn{1}{c|}{Lanczos} \\ \hline \endhead +350 & 6774 & 33744 & 7.68E+13 & 1.26E+06 & 10.40 & 0.01 & 0.01 \\ +367 & 7337 & 156508 & 7.64E+13 & 1.83E+01 & 10.12 & 0.04 & 0.04 \\ +696 & 14454 & 147972 & 4.44E+12 & 5.31E+03 & 9.78 & {\bf \red SF} & {\bf \red SF} \\ +695 & 14454 & 147972 & 3.10E+12 & 5.31E+03 & 9.67 & {\bf \red SF} & {\bf \red SF} \\ +213 & 3402 & 130371 & 2.67E+16 & 3.98E+14 & 8.31 & 0.02 & 0.02 \\ +352 & 5773 & 71701 & 8.77E+12 & 1.29E+08 & 8.09 & 0.03 & 0.03 \\ +119 & 3251 & 65875 & 2.62E+16 & 1.27E+07 & 7.54 & 0.01 & 0.01 \\ +344 & 3363 & 99471 & 4.08E+13 & 3.79E+09 & 7.37 & 0.02 & 0.02 \\ +337 & 5321 & 65693 & 2.10E+13 & 4.68E+06 & 6.74 & 0.02 & 0.02 \\ +117 & 3973 & 79077 & 1.49E+19 & 1.28E+02 & 6.51 & 0.02 & 0.02 \\ +346 & 7055 & 30082 & 1.65E+12 & 4.02E+02 & 6.35 & 0.03 & 0.03 \\ +347 & 7055 & 30082 & 6.34E+17 & 4.02E+02 & 6.09 & {\bf \red *0.02} & {\bf \red *0.02} \\ +140 & 3937 & 25407 & 1.04E+17 & 3.27E+11 & 5.06 & 0.01 & 0.01 \\ +221 & 4257 & 37465 & 2.52E+16 & 1.46E+02 & 4.50 & {\bf \red *0.01} & {\bf \red *0.01} \\ +222 & 4257 & 37465 & 2.52E+16 & 1.46E+02 & 4.49 & {\bf \red *0.01} & {\bf \red *0.01} \\ +223 & 4257 & 37465 & 1.21E+19 & 1.46E+02 & 4.49 & {\bf \red *0.01} & {\bf \red *0.01} \\ +142 & 3937 & 25407 & 1.04E+17 & 3.27E+11 & 4.41 & 0.01 & 0.01 \\ +341 & 2880 & 18229 & 9.74E+13 & 1.39E+04 & 4.25 & 0.01 & 0.01 \\ +349 & 4101 & 82682 & 1.44E+13 & 1.34E+01 & 3.54 & 0.03 & 0.04 \\ +pilot87.pre & 1540 & 30916 & Inf & Inf & 2.70 & 0.01 & 0.01 \\ +118 & 2568 & 75628 & 4.01E+15 & 1.26E+10 & 2.18 & 0.04 & 0.04 \\ +pilot87 & 1625 & 31396 & Inf & Inf & 1.85 & 0.01 & 0.01 \\ +gen4 & 375 & 8919 & 8.43E+236 & Inf & 1.25 & 0.01 & 0.01 \\ +217 & 4720 & 20042 & 3.51E+48 & 1.89E+02 & 1.16 & 0.06 & 0.06 \\ +self & 924 & 157411 & 1.20E+07 & 1.57E+11 & 1.15 & 0.02 & 0.02 \\ +gen4.pre & 367 & 9322 & Inf & Inf & 1.12 & 0.01 & 0.01 \\ +\hline +\caption{Comprehensive Results: Large Instances} +\small +\centering +\label{supptab:all_large} +\end{longtable} + + +\begin{longtable}{|l|r|r|r|r|r|r|r|} +\hline +& & & & & & \multicolumn{2}{c|}{Relative Run Time} \\ \hline +\multicolumn{1}{|c|}{Matrix Name} & \multicolumn{1}{c|}{n} & \multicolumn{1}{c|}{nnz} & \multicolumn{1}{c|}{Cond} & \multicolumn{1}{c|}{Norm} & \multicolumn{1}{c|}{SPEX time (min)} & \multicolumn{1}{c|}{Wiedemann} & \multicolumn{1}{c|}{Lanczos} \\ \hline \endhead +slptsk & 2315 & 34430 & 4.35E+185 & NaN & 54.85 & 0.19 & 0.19 \\ +gen1 & 329 & 11016 & Inf & Inf & 44.42 & 0.03 & 0.03 \\ +207 & 1919 & 32399 & 3.73E+18 & 2.92E+00 & 33.82 & 0.04 & 0.04 \\ +335 & 6747 & 29195 & 2.22E+18 & 5.41E+08 & 32.89 & 0.21 & 0.21 \\ +87 & 2500 & 12349 & 4.35E+17 & 9.83E+03 & 26.86 & 0.05 & 0.05 \\ +pla8\_sig185 & 39835 & 196256 & 4.29E+09 & 1.04E+03 & 17.17 & 0.16 & 0.17 \\ +355 & 1409 & 42760 & 2.28E+13 & 2.67E+05 & 13.90 & 0.08 & 0.08 \\ +159 & 1050 & 26198 & 9.00E+15 & 2.10E+07 & 12.37 & 0.04 & 0.04 \\ +pilot & 1132 & 16624 & 1.12E+175 & NaN & 10.04 & 0.03 & 0.03 \\ +maros-r7 & 1350 & 31923 & 7.43E+06 & 3.99E+10 & 8.62 & 0.03 & 0.03 \\ +320 & 1733 & 22189 & 1.20E+13 & 1.18E+11 & 8.30 & 0.14 & 0.15 \\ +stat96v4 & 3139 & 23752 & 9.62E+17 & 1.63E+21 & 6.47 & 0.17 & 0.17 \\ +pla85900.nov21 & 40304 & 230558 & 5.46E+08 & 9.76E+02 & 6.17 & 0.49 & 0.50 \\ +153 & 765 & 24382 & 1.67E+14 & 1.35E+17 & 5.68 & 0.08 & 0.08 \\ +58 & 3083 & 11767 & 2.30E+21 & 1.21E+09 & 5.62 & 0.23 & 0.23 \\ +momentum3 & 3254 & 15159 & Inf & Inf & 5.36 & 0.31 & 0.31 \\ +jendrec1 & 1779 & 34196 & 9.54E+217 & NaN & 4.12 & 3.64 & 3.64 \\ +296 & 1258 & 7682 & 1.03E+13 & 2.05E+07 & 3.99 & 0.07 & 0.06 \\ +brd14051 & 16360 & 180847 & 2.96E+08 & 2.74E+02 & 3.07 & 0.41 & 0.41 \\ +fome13 & 24884 & 70839 & 7.99E+15 & 4.02E+11 & 3.07 & 0.34 & 0.34 \\ +240 & 1000 & 1000000 & 1.61E+21 & 6.46E+00 & 2.69 & {\bf \red *6.22} & {\bf \red *6.09} \\ +236 & 1000 & 1000000 & 3.25E+19 & 3.23E+00 & 2.38 & {\bf \red *6.53} & {\bf \red *6.73} \\ +mod2.pre & 4422 & 12914 & 3.72E+246 & NaN & 2.29 & 1.48 & 1.48 \\ +260 & 1000 & 1000000 & 1.15E+14 & 5.36E-01 & 2.23 & {\bf \red *7.04} & {\bf \red *7.03} \\ +world & 4261 & 12190 & 5.65E+241 & NaN & 2.18 & 1.26 & 1.27 \\ +l30 & 2492 & 12653 & 1.73E+08 & 2.61E+09 & 2.15 & 0.21 & 0.22 \\ +340 & 8765 & 42471 & 6.15E+14 & 1.00E+15 & 1.82 & 11.26 & 11.13 \\ +cont11\_l & 58936 & 179556 & 3.65E+26 & 7.37E+00 & 1.80 & 9.68 & 9.67 \\ +mod2 & 4435 & 12985 & 1.38E+223 & NaN & 1.74 & 1.77 & 1.79 \\ +309 & 2837 & 10967 & 5.85E+12 & 7.41E+05 & 1.58 & 0.82 & 0.81 \\ +314 & 2836 & 10965 & 5.85E+12 & 7.41E+05 & 1.58 & 0.81 & 0.83 \\ +232 & 1000 & 1000000 & 1.85E+21 & 8.11E-01 & 1.44 & {\bf \red *10.48} & {\bf \red *10.32} \\ +gen2 & 328 & 8894 & 1.84E+11 & 4.51E+18 & 1.35 & 0.04 & 0.04 \\ +scfxm1-2r-256 & 11812 & 44985 & 3.12E+12 & 2.84E+08 & 1.11 & 2.95 & 2.94 \\ +\hline +\caption{Comprehensive Results: Medium Instances} +\small +\centering +\label{supptab:all_medium} +\end{longtable} + + + + + + +\begin{longtable}{|l|r|r|r|r|r|r|r|} +\hline +& & & & & & \multicolumn{2}{c|}{Relative Run Time} \\ \hline +\multicolumn{1}{|c|}{Matrix Name} & \multicolumn{1}{c|}{n} & \multicolumn{1}{c|}{nnz} & \multicolumn{1}{c|}{Cond} & \multicolumn{1}{c|}{Norm} & \multicolumn{1}{c|}{SPEX time (s)} & \multicolumn{1}{c|}{Wiedemann} & \multicolumn{1}{c|}{Lanczos} \\ \hline \endhead +nemswrld & 2205 & 13323 & NaN & Inf & 53.50 & 0.34 & 0.34 \\ +cont4 & 2802 & 11862 & 3.85E+05 & 3.98E+03 & 44.81 & 0.28 & 0.29 \\ +rat5 & 902 & 12026 & 4.19E+06 & 7.48E+05 & 40.77 & 0.10 & 0.10 \\ +nug30 & 14681 & 45627 & 1.06E+06 & 7.88E+00 & 37.07 & 0.68 & 0.63 \\ +nug20 & 7733 & 31455 & 8.84E+07 & 7.26E+00 & 35.20 & 0.26 & 0.28 \\ +stat96v1 & 5013 & 20325 & 6.35E+32 & 8.22E+20 & 34.16 & 0.45 & 0.44 \\ +stat96v2 & 12928 & 48009 & 1.06E+13 & 1.32E+10 & 32.85 & 1.07 & 1.08 \\ +210 & 1484 & 6110 & 5.57E+17 & 1.26E+16 & 29.97 & 0.95 & 0.96 \\ +pla33810 & 18940 & 123445 & 1.05E+08 & 2.20E+02 & 29.57 & 1.64 & 1.61 \\ +stat96v3 & 13485 & 49917 & 3.93E+12 & 6.98E+09 & 27.62 & 1.29 & 1.31 \\ +nug15 & 5486 & 24736 & 2.41E+07 & 7.73E+00 & 26.99 & 0.19 & 0.17 \\ +pilot.ja & 567 & 3781 & Inf & Inf & 25.13 & 0.32 & 0.31 \\ +model10 & 1341 & 6403 & 1.71E+164 & Inf & 24.62 & 0.50 & 0.50 \\ +rat7a & 641 & 10542 & 1.38E+20 & 5.06E+05 & 18.88 & 0.12 & 0.13 \\ +d2q06c & 1047 & 5717 & 1.82E+188 & Inf & 18.27 & 0.48 & 0.48 \\ +128 & 760 & 5739 & 1.12E+16 & 3.10E+08 & 18.26 & 0.29 & 0.29 \\ +d15112 & 9197 & 47335 & 2.33E+18 & 2.25E+11 & 17.95 & 2.21 & 2.23 \\ +141 & 511 & 2796 & 6.37E+15 & 4.21E+10 & 16.60 & 0.17 & 0.16 \\ +144 & 511 & 2796 & 6.37E+15 & 4.21E+10 & 16.49 & 0.17 & 0.17 \\ +progas & 1167 & 6500 & 8.15E+103 & 6.78E+100 & 14.19 & 0.91 & 0.91 \\ +co9 & 2287 & 13481 & 2.32E+49 & 1.56E+42 & 13.06 & 0.98 & 0.99 \\ +stat96v5 & 812 & 3795 & 1.42E+63 & 3.93E+64 & 13.00 & 1.11 & 1.11 \\ +l30.pre & 1199 & 6030 & 1.79E+06 & 2.61E+09 & 12.56 & 0.24 & 0.24 \\ +scfxm1-2b-64 & 5966 & 22682 & 1.30E+12 & 2.84E+08 & 12.11 & 3.96 & 3.94 \\ +158 & 416 & 8562 & 2.41E+25 & 2.54E+03 & 12.08 & 0.24 & 0.25 \\ +scfxm1-2r-128 & 5671 & 21943 & 1.64E+12 & 2.84E+08 & 11.80 & 3.89 & 3.85 \\ +332 & 4101 & 36879 & 6.72E+20 & 2.02E+06 & 11.67 & 12.63 & 12.65 \\ +NSR8K & 5387 & 46157 & 2.64E+07 & 2.06E+03 & 11.62 & 0.66 & 0.66 \\ +qap12 & 2740 & 12014 & 2.46E+07 & 6.84E+00 & 10.96 & 0.11 & 0.11 \\ +newman2 & 468 & 7917 & 1.39E+225 & Inf & 10.85 & 0.23 & 0.23 \\ +watson\_1 & 5729 & 14544 & 7.98E+58 & 9.72E+55 & 9.00 & 10.75 & 10.84 \\ +209 & 415 & 2779 & 1.04E+18 & 6.47E+00 & 8.66 & 0.23 & 0.25 \\ +pilotnov & 549 & 3337 & 2.82E+264 & NaN & 8.64 & 0.54 & 0.54 \\ +239 & 500 & 250000 & 3.27E+20 & 6.46E+00 & 8.38 & {\bf \red *15.04} & {\bf \red *15.55} \\ +momentum2 & 2113 & 6516 & 2.52E+39 & 1.88E+37 & 8.35 & 1.10 & 1.08 \\ +238 & 200 & 40000 & 8.07E+19 & 6.46E+00 & 8.32 & 0.68 & 0.68 \\ +pilot4 & 289 & 2805 & Inf & Inf & 7.75 & 0.57 & 0.57 \\ +235 & 500 & 250000 & 1.01E+19 & 3.23E+00 & 7.52 & {\bf \red *16.55} & {\bf \red *16.30} \\ +231 & 500 & 250000 & 8.95E+20 & 8.11E-01 & 7.43 & {\bf \red *15.82} & {\bf \red *16.21} \\ +dbic1 & 4795 & 23403 & 1.04E+11 & 4.53E+06 & 7.18 & 1.05 & 1.04 \\ +perold & 440 & 2584 & 4.45E+256 & NaN & 7.13 & 0.56 & 0.56 \\ +259 & 500 & 250000 & 1.65E+14 & 5.36E-01 & 7.12 & {\bf \red *16.58} & {\bf \red *16.49} \\ +watson\_1.pre & 4642 & 12991 & 3.44E+58 & 9.72E+55 & 7.05 & 10.03 & 9.87 \\ +cont1\_l & 1070 & 4649 & 1.22E+09 & 2.51E+05 & 6.23 & 0.47 & 0.46 \\ +scfxm1-2r-96 & 4504 & 17205 & 1.35E+12 & 2.84E+08 & 6.22 & 4.32 & 4.30 \\ +126 & 1220 & 5884 & 1.06E+14 & 9.34E+00 & 5.99 & 2.16 & 2.19 \\ +291 & 1220 & 5860 & 1.80E+13 & 8.78E+00 & 5.91 & 2.14 & 2.16 \\ +212 & 882 & 3354 & 7.98E+16 & 6.69E+12 & 5.87 & 1.52 & 1.51 \\ +125 & 1220 & 5892 & 1.58E+17 & 2.88E+00 & 5.69 & 2.25 & 2.24 \\ +nug12 & 2736 & 12037 & 2.25E+07 & 6.97E+00 & 5.62 & 0.22 & 0.23 \\ +288 & 1220 & 5852 & 2.74E+13 & 1.23E+01 & 5.55 & 2.35 & 2.29 \\ +pcb3038 & 3588 & 46560 & 2.00E+06 & 1.55E+02 & 5.41 & 0.72 & 0.72 \\ +127 & 1220 & 5855 & 6.25E+14 & 3.70E+02 & 5.39 & 2.36 & 2.38 \\ +model11 & 2039 & 7606 & 1.40E+32 & 3.38E+29 & 5.28 & 1.11 & 1.10 \\ +294 & 1220 & 5892 & 2.74E+13 & 1.23E+01 & 5.20 & 2.49 & 2.43 \\ +287 & 1220 & 5888 & 4.14E+13 & 1.63E+01 & 4.65 & 2.78 & 2.79 \\ +289 & 1220 & 5884 & 1.42E+13 & 4.95E+00 & 4.39 & 2.87 & 2.86 \\ +292 & 1220 & 5888 & 3.45E+13 & 2.02E+01 & 4.29 & 2.94 & 2.93 \\ +nemspmm2 & 949 & 6478 & 2.61E+222 & Inf & 4.24 & 1.02 & 1.02 \\ +211 & 768 & 2934 & 1.29E+17 & 1.36E+13 & 4.01 & 1.69 & 1.67 \\ +293 & 1220 & 5892 & 1.58E+13 & 8.37E+00 & 3.40 & 3.65 & 3.69 \\ +stormg2\_1000.pre & 13926 & 32547 & 2.13E+11 & 2.59E+05 & 3.27 & 31.02 & 31.19 \\ +124 & 1220 & 5892 & 2.24E+34 & 2.87E+00 & 2.91 & 3.98 & 3.92 \\ +stormg2\_1000 & 14075 & 32597 & 3.77E+09 & 1.05E+04 & 2.90 & 32.90 & 32.98 \\ +152 & 180 & 2659 & 3.59E+17 & 2.04E+19 & 2.60 & 0.32 & 0.32 \\ +fome12 & 12652 & 35969 & 8.93E+05 & 4.65E+01 & 2.53 & 4.63 & 4.58 \\ +nl & 890 & 2919 & 5.83E+293 & Inf & 2.46 & 3.32 & 3.33 \\ +fnl4461 & 5044 & 46977 & 4.12E+06 & 2.35E+02 & 2.36 & 2.28 & 2.31 \\ +model6 & 790 & 3425 & 5.17E+63 & 4.11E+61 & 2.35 & 1.22 & 1.21 \\ +scfxm1-2r-64 & 1870 & 11122 & 8.23E+11 & 2.84E+08 & 2.31 & 4.92 & 4.93 \\ +co5 & 928 & 6173 & 3.86E+185 & Inf & 2.26 & 2.21 & 2.20 \\ +pla7397 & 5059 & 42683 & 8.55E+06 & 3.36E+02 & 2.17 & 2.11 & 2.13 \\ +nemspmm1 & 982 & 5023 & 4.94E+23 & 1.59E+20 & 2.12 & 1.30 & 1.30 \\ +315 & 2053 & 18447 & 6.71E+16 & 2.03E+04 & 2.09 & 16.27 & 16.18 \\ +rl11849 & 6769 & 40885 & 1.21E+08 & 1.92E+02 & 2.09 & 3.40 & 3.36 \\ +d18512 & 10815 & 55880 & 8.61E+05 & 2.09E+02 & 1.99 & 7.06 & 7.00 \\ +cq9 & 1187 & 5786 & 4.94E+165 & Inf & 1.52 & 3.14 & 3.13 \\ +qap10 & 1510 & 6381 & 4.45E+06 & 6.13E+00 & 1.49 & 0.21 & 0.20 \\ +de080285 & 368 & 1493 & 1.06E+78 & 1.36E+79 & 1.41 & 1.12 & 1.11 \\ +rail4284 & 2463 & 11802 & 3.58E+04 & 7.23E+00 & 1.37 & 0.63 & 0.63 \\ +pilot.we & 554 & 2367 & 5.11E+137 & 4.03E+133 & 1.27 & 2.60 & 2.63 \\ +newman & 334 & 2156 & 6.20E+233 & Inf & 1.24 & 0.97 & 0.98 \\ +ge & 1675 & 4758 & 3.29E+130 & 7.56E+127 & 1.14 & 7.58 & 7.65 \\ +rat1 & 452 & 2893 & 3.93E+27 & 2.26E+30 & 1.10 & 0.70 & 0.68 \\ +dano3mip.pre & 1091 & 5239 & 3.46E+10 & 1.36E+05 & 1.08 & 0.41 & 0.41 \\ +342 & 10001 & 49999 & 4.17E+18 & 5.00E+03 & 0.98 & {\bf \red *846.53} & {\bf \red *845.32} \\ +t0331-4l & 520 & 5034 & 2.75E+04 & 1.10E+01 & 0.91 & 0.25 & 0.25 \\ +132 & 216 & 812 & 8.10E+14 & 1.39E+00 & 0.89 & 0.48 & 0.44 \\ +model5 & 492 & 2247 & 7.35E+109 & 1.03E+108 & 0.88 & 2.13 & 2.09 \\ +dano3mip & 1135 & 5390 & 2.47E+10 & 1.36E+05 & 0.85 & 0.55 & 0.52 \\ +grow22 & 434 & 4711 & 2.09E+17 & 4.39E+16 & 0.85 & 1.29 & 1.30 \\ +rl5915 & 3853 & 28829 & 3.43E+06 & 1.03E+02 & 0.82 & 3.22 & 3.24 \\ +model9 & 902 & 4361 & 3.90E+23 & 6.53E+20 & 0.75 & 2.31 & 2.31 \\ +siena1 & 1265 & 11573 & 6.40E+05 & 7.85E+02 & 0.67 & 0.63 & 0.62 \\ +fome11 & 6226 & 17749 & 6.31E+05 & 5.09E+01 & 0.64 & 4.35 & 4.28 \\ +model7 & 646 & 2850 & 2.89E+137 & 2.87E+134 & 0.64 & 2.59 & 2.61 \\ +rl5934 & 3773 & 23917 & 2.94E+06 & 1.11E+02 & 0.63 & 3.26 & 3.21 \\ +nesm & 279 & 895 & 1.01E+127 & 1.12E+125 & 0.63 & 3.20 & 3.22 \\ +model4 & 409 & 1898 & 9.08E+213 & NaN & 0.57 & 2.61 & 2.59 \\ +de063155 & 313 & 1233 & 1.09E+95 & 6.12E+69 & 0.54 & 2.33 & 2.30 \\ +lp22.pre & 1811 & 13146 & 3.89E+05 & 1.27E+01 & 0.52 & 1.44 & 1.36 \\ +orna1 & 810 & 2842 & 2.66E+13 & 2.55E+15 & 0.51 & 3.36 & 3.38 \\ +lp22 & 1796 & 13076 & 1.32E+05 & 1.29E+01 & 0.49 & 1.60 & 1.55 \\ +scfxm1-2r-32 & 1447 & 5658 & 2.93E+11 & 2.84E+08 & 0.46 & 6.37 & 6.50 \\ +233 & 100 & 10000 & 1.69E+20 & 3.23E+00 & 0.44 & 1.66 & 1.71 \\ +van & 7417 & 21681 & 4.24E+04 & 7.23E+00 & 0.44 & 7.33 & 7.27 \\ +usa13509 & 3595 & 19919 & 2.89E+08 & 1.70E+02 & 0.43 & 6.23 & 6.11 \\ +237 & 100 & 10000 & 1.08E+19 & 6.46E+00 & 0.40 & 1.92 & 1.85 \\ +arki001 & 160 & 893 & 4.46E+299 & Inf & 0.37 & 4.08 & 4.07 \\ +230 & 200 & 40000 & 9.06E+19 & 8.11E-01 & 0.37 & {\bf \red *15.47} & {\bf \red *15.07} \\ +greenbeb & 713 & 3278 & 1.17E+25 & 9.16E+21 & 0.36 & 3.26 & 3.27 \\ +234 & 200 & 40000 & 1.74E+18 & 3.23E+00 & 0.35 & {\bf \red *15.54} & {\bf \red *16.51} \\ +280 & 430 & 1544 & 2.91E+13 & 2.00E+06 & 0.35 & 4.89 & 4.87 \\ +258 & 200 & 40000 & 1.40E+14 & 5.36E-01 & 0.35 & {\bf \red *15.23} & {\bf \red *15.24} \\ +grow15 & 297 & 3614 & 1.65E+13 & 4.24E+16 & 0.34 & 1.62 & 1.60 \\ +complex & 327 & 10738 & 9.05E+04 & 5.39E+01 & 0.33 & 0.44 & 0.43 \\ +scfxm1-2r-27 & 1222 & 4753 & 5.08E+10 & 2.84E+08 & 0.33 & 6.63 & 6.65 \\ +newman3 & 369 & 3662 & 1.58E+23 & 3.91E+19 & 0.30 & 1.45 & 1.47 \\ +momentum1 & 932 & 2792 & 1.18E+146 & 2.49E+141 & 0.30 & 7.92 & 7.89 \\ +dfl001 & 3271 & 9276 & 4.54E+05 & 4.33E+01 & 0.27 & 2.82 & 2.81 \\ +dfl001.pre & 2097 & 6501 & 4.10E+05 & 3.99E+01 & 0.27 & 1.33 & 1.31 \\ +stair & 324 & 3431 & 1.27E+19 & 4.02E+15 & 0.27 & 1.18 & 1.15 \\ +stocfor3 & 1782 & 4562 & 2.03E+31 & 3.50E+27 & 0.26 & 23.01 & 22.94 \\ +large000 & 823 & 2282 & 1.39E+31 & 1.02E+34 & 0.25 & 14.33 & 14.49 \\ +ulevimin & 697 & 1879 & 8.89E+103 & 5.41E+96 & 0.24 & 5.86 & 5.95 \\ +t1717 & 549 & 3657 & 1.89E+04 & 7.40E+00 & 0.24 & 0.40 & 0.44 \\ +de063157 & 282 & 1102 & 1.10E+97 & 6.45E+77 & 0.24 & 4.26 & 4.30 \\ +car4 & 122 & 4384 & 1.30E+14 & 4.51E+15 & 0.22 & 1.35 & 1.35 \\ +greenbea & 664 & 2706 & 2.17E+38 & 2.38E+32 & 0.21 & 4.38 & 4.46 \\ +pcb3000 & 3058 & 27446 & 5.01E+04 & 6.24E+01 & 0.21 & 6.87 & 6.91 \\ +25fv47 & 416 & 2061 & 1.42E+35 & 7.33E+32 & 0.21 & 2.01 & 1.94 \\ +277 & 183 & 1069 & 2.69E+13 & 1.15E+09 & 0.20 & {\bf \red *1.46} & {\bf \red *1.45} \\ +stp3d & 10642 & 25936 & 4.12E+05 & 4.28E+00 & 0.20 & 28.09 & 27.93 \\ +trento1 & 1070 & 10010 & 1.54E+05 & 6.57E+02 & 0.19 & 1.23 & 1.23 \\ +cq5 & 570 & 2615 & 1.05E+164 & Inf & 0.19 & 5.51 & 5.48 \\ +dc1l & 851 & 5171 & 1.68E+05 & 9.70E+02 & 0.18 & 0.72 & 0.72 \\ +gran & 284 & 1958 & 7.38E+32 & 1.25E+27 & 0.17 & 3.00 & 3.00 \\ +dg012142 & 892 & 3627 & 9.32E+07 & 2.13E+04 & 0.15 & 2.51 & 2.42 \\ +nug08 & 732 & 3004 & 2.49E+05 & 5.71E+00 & 0.15 & 0.42 & 0.43 \\ +watson\_2 & 1011 & 2703 & 7.02E+42 & 1.78E+40 & 0.15 & 10.16 & 10.25 \\ +dc1c & 808 & 4698 & 1.26E+06 & 9.63E+02 & 0.14 & 0.79 & 0.81 \\ +scfxm1-2r-16 & 752 & 2962 & 1.94E+10 & 2.84E+08 & 0.13 & 5.99 & 6.02 \\ +air04 & 630 & 4187 & 1.29E+04 & 8.67E+00 & 0.12 & 0.55 & 0.55 \\ +aa01 & 630 & 4187 & 1.29E+04 & 8.67E+00 & 0.12 & 0.57 & 0.56 \\ +nemsemm2 & 789 & 2440 & 1.78E+124 & 1.79E+123 & 0.12 & 16.53 & 16.46 \\ +scfxm1-2b-16 & 784 & 2975 & 3.37E+10 & 2.84E+08 & 0.12 & 6.69 & 6.76 \\ +pf2177 & 406 & 1772 & 9.40E+03 & 4.65E+00 & 0.12 & 0.27 & 0.28 \\ +dolom1 & 806 & 5681 & 3.47E+05 & 2.27E+03 & 0.11 & 1.11 & 1.13 \\ +model3 & 310 & 1417 & 3.11E+95 & 6.44E+93 & 0.10 & 3.27 & 3.25 \\ +\hline +\caption{Comprehensive Results: Small Instances} +\small +\centering +\label{supptab:all_small} +\end{longtable} + + + +\begin{longtable}{|l|r|r|r|r|r|r|r|} +\hline +& & & & & & \multicolumn{2}{c|}{Relative Run Time} \\ \hline +\multicolumn{1}{|c|}{Matrix Name} & \multicolumn{1}{c|}{n} & \multicolumn{1}{c|}{nnz} & \multicolumn{1}{c|}{Cond} & \multicolumn{1}{c|}{Norm} & \multicolumn{1}{c|}{SPEX Left LU time (ms)} & \multicolumn{1}{c|}{Wiedemann} & \multicolumn{1}{c|}{Lanczos} \\ \hline \endhead +ds & 647 & 12193 & 1.01E+04 & 2.08E+01 & 9.85 & 2.83 & 2.68 \\ +ch & 393 & 1304 & 4.36E+110 & 3.12E+106 & 9.21 & 8.74 & 8.84 \\ +nug07 & 450 & 1780 & 5.45E+04 & 5.28E+00 & 8.92 & 0.80 & 0.31 \\ +229 & 100 & 10000 & 6.48E+18 & 8.11E-01 & 8.51 & {\bf \red *8.37} & {\bf \red *8.24} \\ +cr42 & 304 & 608 & 1.52E+35 & 1.86E+84 & 8.10 & 40.60 & 40.68 \\ +143 & 131 & 536 & 1.49E+15 & 9.77E+09 & 8.05 & 2.95 & 1.90 \\ +delf000 & 593 & 1606 & 1.27E+18 & 1.44E+20 & 7.23 & 18.52 & 18.91 \\ +257 & 100 & 10000 & 3.09E+14 & 5.36E-01 & 6.99 & {\bf \red *9.84} & {\bf \red *10.18} \\ +air06 & 562 & 3420 & 1.07E+04 & 9.00E+00 & 6.79 & 0.60 & 0.61 \\ +protfold & 574 & 2562 & 8.36E+03 & 6.50E+00 & 6.71 & 0.66 & 0.65 \\ +pldd000b & 537 & 1448 & 9.92E+18 & 1.27E+22 & 6.59 & 16.57 & 16.59 \\ +279 & 261 & 2319 & 7.54E+16 & 2.03E+04 & 6.46 & 9.95 & 9.87 \\ +msc98-ip & 2897 & 10006 & 1.63E+07 & 4.26E+02 & 6.32 & 21.45 & 21.58 \\ +l9 & 241 & 1381 & 7.65E+21 & 1.74E+19 & 6.18 & 2.44 & 2.44 \\ +model2 & 149 & 757 & 1.15E+112 & 4.60E+108 & 6.16 & 2.54 & 2.56 \\ +pcb1000 & 1156 & 9955 & 2.28E+04 & 4.37E+01 & 6.15 & 3.06 & 3.11 \\ +aa03 & 562 & 3420 & 1.07E+04 & 9.00E+00 & 5.79 & 0.72 & 0.71 \\ +lpl1 & 2692 & 7211 & 8.18E+08 & 1.02E+04 & 5.16 & 16.99 & 17.30 \\ +biella1 & 813 & 5726 & 2.72E+04 & 1.18E+01 & 5.03 & 2.78 & 2.76 \\ +grow7 & 138 & 1744 & 8.45E+12 & 3.53E+16 & 4.91 & 2.86 & 2.83 \\ +bg512142 & 560 & 2140 & 6.92E+06 & 1.95E+03 & 4.71 & 3.18 & 3.20 \\ +139 & 131 & 536 & 1.49E+15 & 9.77E+09 & 4.53 & 3.45 & 3.40 \\ +rosen10 & 989 & 6916 & 2.01E+03 & 1.35E+03 & 4.23 & 10.79 & 10.86 \\ +stormg2-125.pre & 1780 & 4138 & 1.96E+09 & 5.43E+04 & 4.04 & 35.78 & 35.58 \\ +df2177 & 414 & 1825 & 4.61E+03 & 4.74E+00 & 3.96 & 1.99 & 0.60 \\ +stormg2-125 & 1886 & 4372 & 2.63E+07 & 2.26E+03 & 3.94 & 39.34 & 39.82 \\ +rosen2 & 431 & 4143 & 7.85E+02 & 3.19E+02 & 3.63 & 3.88 & 3.87 \\ +degen3 & 744 & 5431 & 1.66E+04 & 2.00E+01 & 3.52 & 1.70 & 1.71 \\ +10teams & 177 & 885 & 1.12E+03 & 5.63E+00 & 3.50 & 0.87 & 0.81 \\ +scsd8 & 247 & 655 & 9.59E+18 & 1.58E+17 & 3.44 & 5.35 & 5.26 \\ +pds-80 & 9225 & 19432 & 1.12E+04 & 5.66E+00 & 3.36 & 115.71 & 115.40 \\ +bas1lp & 502 & 6651 & 9.77E+04 & 9.80E+01 & 3.28 & 3.22 & 3.12 \\ +pilot4i & 134 & 1220 & 1.50E+33 & 4.19E+28 & 3.15 & 4.41 & 4.41 \\ +cycle & 284 & 878 & 1.46E+79 & 3.19E+75 & 2.99 & 6.23 & 5.80 \\ +pds-100 & 8377 & 17555 & 1.79E+04 & 5.48E+00 & 2.97 & 109.88 & 108.16 \\ +scfxm1-2r-8 & 403 & 1608 & 7.45E+09 & 2.84E+08 & 2.94 & 7.89 & 7.92 \\ +air05 & 323 & 1789 & 2.79E+04 & 6.94E+00 & 2.87 & 1.90 & 0.62 \\ +pds-60 & 7586 & 16067 & 8.18E+03 & 4.48E+00 & 2.56 & 104.72 & 104.84 \\ +gosh & 379 & 1379 & 8.05E+27 & 4.51E+24 & 2.49 & 12.14 & 12.47 \\ +pds-90 & 7914 & 16673 & 1.48E+04 & 4.13E+00 & 2.43 & 114.84 & 117.41 \\ +pds-70 & 7822 & 16545 & 1.11E+04 & 5.84E+00 & 2.14 & 132.65 & 133.20 \\ +maros & 289 & 1143 & 2.76E+14 & 2.54E+11 & 2.13 & 4.07 & 4.08 \\ +ganges & 344 & 1123 & 4.19E+26 & 3.03E+25 & 2.01 & 10.46 & 9.90 \\ +fast0507 & 401 & 1908 & 3.72E+03 & 6.99E+00 & 1.94 & 3.54 & 1.26 \\ +bandm & 122 & 609 & 1.12E+27 & 1.05E+26 & 1.94 & 3.02 & 3.03 \\ +pds-50 & 5962 & 12592 & 1.04E+04 & 3.49E+00 & 1.87 & 81.12 & 81.91 \\ +rail507 & 413 & 2005 & 5.39E+03 & 6.85E+00 & 1.87 & 3.09 & 1.44 \\ +30\_70\_4.5\_0.95\_100 & 2754 & 8381 & 6.12E+03 & 4.34E+00 & 1.83 & 36.49 & 30.40 \\ +baxter.pre & 470 & 1274 & 3.55E+94 & 8.48E+88 & 1.61 & 13.78 & 13.99 \\ +modszk1 & 263 & 765 & 1.52E+21 & 1.25E+20 & 1.59 & 9.74 & 9.81 \\ +30\_70\_4.5\_0.95\_98 & 2451 & 7364 & 7.84E+03 & 4.35E+00 & 1.54 & 28.46 & 26.87 \\ +30\_70\_4.5\_0.5\_100 & 2098 & 6197 & 1.98E+03 & 4.28E+00 & 1.48 & 21.62 & 21.47 \\ +d6cube & 223 & 1424 & 9.56E+05 & 4.24E+02 & 1.47 & 2.78 & 2.44 \\ +rentacar & 327 & 1080 & 3.64E+05 & 1.01E+03 & 1.41 & 2.27 & 1.70 \\ +qiulp & 603 & 1717 & 8.25E+10 & 1.31E+09 & 1.38 & 9.67 & 9.95 \\ +nug06 & 267 & 1007 & 1.04E+04 & 4.81E+00 & 1.35 & 2.36 & 2.46 \\ +qiu & 603 & 1717 & 5.99E+10 & 1.31E+09 & 1.33 & 10.16 & 9.95 \\ +scfxm1-2c-4 & 233 & 965 & 5.92E+09 & 2.84E+08 & 1.23 & 6.22 & 6.34 \\ +rosen1 & 217 & 2528 & 1.23E+03 & 5.80E+02 & 1.15 & 3.85 & 3.82 \\ +pds-40 & 4028 & 8478 & 6.64E+03 & 3.02E+00 & 1.10 & 50.46 & 50.21 \\ +bnl2 & 459 & 1488 & 1.22E+15 & 1.10E+12 & 1.07 & 20.38 & 20.21 \\ +mitre & 801 & 2466 & 4.18E+05 & 2.81E+03 & 1.07 & 37.24 & 36.80 \\ +pds-30 & 2643 & 5641 & 3.27E+03 & 3.04E+00 & 1.07 & 30.21 & 30.34 \\ +rail516 & 268 & 936 & 1.31E+03 & 5.64E+00 & 0.98 & 4.05 & 3.70 \\ +fome21 & 3291 & 7240 & 9.21E+03 & 3.18E+00 & 0.98 & 48.53 & 48.54 \\ +south31 & 112 & 460 & 1.68E+265 & Inf & 0.95 & 12.15 & 11.65 \\ +rail582 & 384 & 1387 & 4.55E+03 & 5.10E+00 & 0.93 & 7.41 & 1.87 \\ +seymour & 537 & 1881 & 5.24E+03 & 5.81E+00 & 0.92 & 4.72 & 3.52 \\ +scfxm1-2b-4 & 233 & 965 & 5.92E+09 & 2.84E+08 & 0.84 & 9.50 & 9.27 \\ +sp97ar & 271 & 2400 & 2.40E+04 & 3.93E+01 & 0.82 & 5.84 & 3.53 \\ +neos6 & 174 & 1580 & 3.33E+03 & 7.20E+01 & 0.82 & 4.64 & 5.31 \\ +neos & 2342 & 5098 & 3.29E+04 & 5.88E+00 & 0.77 & 25.92 & 27.98 \\ +r05 & 919 & 2717 & 4.06E+04 & 3.06E+01 & 0.75 & 12.87 & 12.91 \\ +manna81 & 1392 & 2784 & 3.00E+00 & 2.00E+00 & 0.73 & 11.09 & 11.15 \\ +p05 & 919 & 2717 & 4.06E+04 & 3.06E+01 & 0.67 & 14.18 & 14.56 \\ +scfxm1-2r-4 & 233 & 965 & 5.92E+09 & 2.84E+08 & 0.65 & 12.17 & 12.22 \\ +bnl1 & 223 & 824 & 3.34E+23 & 2.35E+20 & 0.65 & 13.63 & 13.63 \\ +rosen8 & 264 & 1850 & 2.53E+02 & 8.87E+01 & 0.57 & 6.49 & 6.40 \\ +scagr7-2r-864 & 680 & 1697 & 6.99E+06 & 3.42E+03 & 0.57 & 49.66 & 48.56 \\ +sp98ar & 223 & 1782 & 1.69E+04 & 4.43E+01 & 0.55 & 10.46 & 4.20 \\ +fome20 & 1718 & 3811 & 5.39E+03 & 3.14E+00 & 0.55 & 27.11 & 26.91 \\ +scrs8-2r-512 & 992 & 1984 & 1.92E+01 & 9.13E+00 & 0.54 & 29.88 & 29.67 \\ +disctom & 192 & 565 & 5.92E+02 & 3.41E+00 & 0.52 & 3.41 & 3.34 \\ +scfxm3 & 262 & 1005 & 1.67E+17 & 7.58E+13 & 0.52 & 18.62 & 18.57 \\ +danoint & 196 & 790 & 2.11E+07 & 6.31E+03 & 0.51 & 9.36 & 4.55 \\ +mzzv11 & 1098 & 3189 & 8.92E+05 & 2.46E+02 & 0.47 & 27.67 & 28.68 \\ +80bau3b & 154 & 396 & 3.31E+46 & 1.75E+45 & 0.46 & 17.53 & 17.59 \\ +dbir2.pre & 281 & 1879 & 5.86E+06 & 1.10E+05 & 0.43 & 8.86 & 8.28 \\ +capri & 138 & 507 & 3.72E+68 & 3.01E+65 & 0.43 & 23.65 & 23.64 \\ +p010 & 839 & 2486 & 3.96E+04 & 3.06E+01 & 0.41 & 19.48 & 19.82 \\ +degen2 & 217 & 1138 & 2.58E+03 & 1.15E+01 & 0.40 & 4.24 & 4.93 \\ +scfxm2 & 178 & 658 & 1.67E+17 & 7.58E+13 & 0.37 & 12.38 & 12.29 \\ +baxter & 256 & 697 & 3.06E+21 & 6.81E+15 & 0.37 & 15.96 & 15.58 \\ +dbir1 & 154 & 845 & 4.54E+06 & 1.42E+06 & 0.35 & 17.05 & 17.36 \\ +small000 & 140 & 383 & 6.77E+19 & 5.59E+23 & 0.34 & 29.03 & 29.08 \\ +stormg2-27 & 449 & 1019 & 3.67E+06 & 1.77E+03 & 0.34 & 21.32 & 21.95 \\ +roll3000 & 177 & 1101 & 2.19E+06 & 1.47E+03 & 0.34 & 18.49 & 15.37 \\ +woodw & 168 & 589 & 1.44E+12 & 3.80E+10 & 0.32 & 19.94 & 20.28 \\ +route & 339 & 1290 & 7.27E+08 & 2.03E+07 & 0.32 & 22.68 & 8.86 \\ +nsct1 & 120 & 595 & 4.25E+06 & 7.67E+05 & 0.31 & 16.26 & 12.14 \\ +neos.pre & 2080 & 4578 & 1.60E+04 & 5.86E+00 & 0.29 & 56.91 & 56.44 \\ +mzzv42z & 787 & 2124 & 5.68E+05 & 2.01E+02 & 0.27 & 24.22 & 24.24 \\ +crew1 & 127 & 861 & 7.82E+02 & 8.18E+00 & 0.27 & 7.76 & 11.03 \\ +neos7 & 590 & 1434 & 1.46E+08 & 1.00E+06 & 0.26 & 54.87 & 55.02 \\ +sgpf5y6 & 787 & 1870 & 6.24E+02 & 3.37E+00 & 0.22 & 34.46 & 12.04 \\ +neos1 & 309 & 944 & 8.24E+02 & 4.83E+00 & 0.22 & 8.65 & 14.13 \\ +neos11 & 365 & 1116 & 3.06E+03 & 5.06E+00 & 0.22 & 23.94 & 24.55 \\ +nsct2.pre & 156 & 1140 & 3.84E+06 & 3.22E+05 & 0.21 & 18.44 & 7.87 \\ +stocfor2 & 224 & 576 & 3.54E+26 & 1.50E+24 & 0.21 & 46.90 & 46.41 \\ +scrs8-2r-256 & 416 & 832 & 1.92E+01 & 9.13E+00 & 0.20 & 38.34 & 12.82 \\ +neos4 & 454 & 944 & 2.63E+08 & 5.59E+06 & 0.20 & 38.63 & 9.84 \\ +blp-ar98 & 148 & 876 & 3.94E+03 & 9.40E+01 & 0.19 & 25.82 & 27.74 \\ +dsbmip & 220 & 568 & 3.06E+46 & 2.19E+41 & 0.19 & 31.23 & 31.43 \\ +sgpf5y6.pre & 755 & 1744 & 1.20E+02 & 3.22E+00 & 0.18 & 42.42 & 14.08 \\ +neos823206 & 220 & 547 & 3.15E+05 & 2.24E+03 & 0.15 & 24.58 & 26.84 \\ +sc205 & 184 & 487 & 1.18E+04 & 2.10E+01 & 0.15 & 21.46 & 21.34 \\ +rosen7 & 127 & 649 & 8.23E+01 & 5.75E+01 & 0.14 & 39.64 & 14.59 \\ +scrs8-2r-64 & 256 & 512 & 1.60E+05 & 1.41E+05 & 0.14 & 54.87 & 20.84 \\ +pp08aCUTS & 131 & 332 & 1.44E+04 & 4.27E+02 & 0.13 & 14.12 & 12.34 \\ +scorpion & 131 & 507 & 7.19E+06 & 2.00E+05 & 0.13 & 39.44 & 35.93 \\ +lpl3 & 212 & 461 & 3.06E+02 & 2.61E+00 & 0.13 & 4.52 & 8.85 \\ +p19 & 117 & 555 & 4.13E+05 & 4.37E+04 & 0.12 & 64.73 & 20.09 \\ +iiasa & 113 & 262 & 6.06E+18 & 6.37E+17 & 0.12 & 28.25 & 28.10 \\ +pds-20.pre & 370 & 851 & 1.07E+03 & 3.38E+00 & 0.12 & 25.30 & 23.88 \\ +rd-rplusc-21 & 148 & 454 & 7.35E+16 & 4.38E+13 & 0.11 & 58.47 & 22.21 \\ +neos19 & 228 & 487 & 7.19E+04 & 5.23E+01 & 0.11 & 59.49 & 35.86 \\ +gesa2\_o & 102 & 214 & 6.47E+09 & 4.13E+08 & 0.11 & 51.49 & 38.52 \\ +boeing1 & 122 & 415 & 7.36E+10 & 6.29E+07 & 0.11 & 46.04 & 47.62 \\ +gesa3\_o & 148 & 365 & 1.73E+29 & 1.19E+26 & 0.10 & 52.90 & 32.00 \\ +gesa3 & 134 & 336 & 1.73E+29 & 1.19E+26 & 0.10 & 69.71 & 27.82 \\ +UMTS & 268 & 828 & 4.40E+20 & 3.24E+18 & 0.10 & 67.24 & 38.74 \\ +scrs8 & 109 & 280 & 2.97E+27 & 8.93E+24 & 0.10 & 81.52 & 24.12 \\ +scrs8-2r-128 & 192 & 384 & 1.92E+01 & 9.13E+00 & 0.10 & 19.11 & 24.55 \\ +scrs8-2c-64 & 168 & 336 & 4.80E+01 & 2.66E+01 & 0.09 & 35.05 & 38.88 \\ +ceria3d & 130 & 647 & 2.40E+04 & 1.09E+01 & 0.09 & 11.93 & 10.00 \\ +stormg2-8 & 117 & 263 & 4.82E+05 & 1.77E+03 & 0.09 & 24.41 & 35.78 \\ +nsct2 & 107 & 544 & 2.74E+06 & 2.40E+05 & 0.09 & 20.69 & 24.29 \\ +mkc & 106 & 250 & 1.27E+06 & 2.89E+04 & 0.09 & 16.57 & 13.55 \\ +scrs8-2r-32 & 128 & 256 & 4.16E+01 & 3.54E+01 & 0.09 & 26.58 & 46.92 \\ +dbir2 & 157 & 784 & 1.71E+06 & 7.27E+04 & 0.09 & 30.31 & 33.46 \\ +neos818918 & 265 & 678 & 4.29E+02 & 3.22E+00 & 0.09 & 26.79 & 25.53 \\ +mkc1 & 106 & 250 & 1.27E+06 & 2.89E+04 & 0.08 & 13.77 & 15.81 \\ +bienst1 & 102 & 253 & 7.61E+02 & 6.09E+00 & 0.06 & 11.97 & 9.59 \\ +nug05 & 107 & 362 & 1.14E+03 & 4.15E+00 & 0.06 & 5.53 & 11.20 \\ +dcmulti & 120 & 303 & 7.03E+03 & 6.26E+02 & 0.05 & 35.72 & 38.40 \\ +\hline +\caption{Comprehensive Results: Tiny Instances} +\small +\centering +\label{supptab:all_tiny} +\end{longtable} +\end{document} \ No newline at end of file diff --git a/SPEX/SPEX_Left_LU/ExampleMats/10teams_mat.txt b/SPEX/ExampleMats/10teams.mat.txt similarity index 100% rename from SPEX/SPEX_Left_LU/ExampleMats/10teams_mat.txt rename to SPEX/ExampleMats/10teams.mat.txt diff --git a/SPEX/SPEX_Left_LU/ExampleMats/10teams_v.txt b/SPEX/ExampleMats/10teams.rhs.txt similarity index 100% rename from SPEX/SPEX_Left_LU/ExampleMats/10teams_v.txt rename to SPEX/ExampleMats/10teams.rhs.txt diff --git a/SPEX/ExampleMats/494_bus.mat.txt b/SPEX/ExampleMats/494_bus.mat.txt new file mode 100644 index 0000000000..7b31f77ca0 --- /dev/null +++ b/SPEX/ExampleMats/494_bus.mat.txt @@ -0,0 +1,1667 @@ +494 494 1666 +1 1 2220.874000 +16 1 -9.960159 +46 1 -8.196721 +267 1 -4.051864 +2 2 5.410670 +4 2 -5.410670 +3 3 13.570860 +52 3 -5.665723 +186 3 -7.905138 +2 4 -5.410670 +4 4 618.396800 +8 4 -91.996320 +120 4 -100.000000 +158 4 -294.117600 +429 4 -53.504550 +432 4 -73.367570 +5 5 8.000000 +115 5 -8.000000 +6 6 5.251112 +150 6 -1.526718 +433 6 -3.724395 +7 7 12.509810 +18 7 -0.500000 +165 7 -2.619172 +367 7 -3.603604 +426 7 -5.787037 +4 8 -91.996320 +8 8 91.996320 +9 9 10.214500 +422 9 -10.214500 +10 10 277.376600 +205 10 -127.226500 +277 10 -150.150100 +11 11 79.800340 +412 11 -50.301810 +436 11 -29.498530 +12 12 13.015570 +13 12 -1.333333 +14 12 -2.158429 +16 12 -9.523809 +12 13 -1.333333 +13 13 1.333333 +12 14 -2.158429 +14 14 2.158429 +15 15 7.012623 +16 15 -7.012623 +1 16 -9.960159 +12 16 -9.523809 +15 16 -7.012623 +16 16 60.125760 +17 16 -21.786490 +19 16 -7.037297 +57 16 -4.805382 +16 17 -21.786490 +17 17 100.122400 +20 17 -17.605630 +21 17 -17.605630 +281 17 -14.306150 +334 17 -28.818450 +7 18 -0.500000 +18 18 0.500000 +16 19 -7.037297 +19 19 7.037297 +17 20 -17.605630 +20 20 17.605630 +17 21 -17.605630 +21 21 17.605630 +22 22 105.806600 +23 22 -37.313430 +140 22 -68.493150 +22 23 -37.313430 +23 23 238.159600 +140 23 -81.967220 +155 23 -108.695600 +197 23 -10.183300 +24 24 7.806402 +25 24 -7.806402 +24 25 -7.806402 +25 25 25.047990 +157 25 -4.741584 +170 25 -12.500000 +26 26 72.584360 +99 26 -42.372880 +425 26 -30.211480 +27 27 423.728800 +28 27 -423.728800 +27 28 -423.728800 +28 28 1022.734000 +85 28 -3.767472 +173 28 -595.238100 +29 29 7.613696 +307 29 -4.387889 +316 29 -3.225806 +30 30 5.428882 +31 30 -5.428882 +30 31 -5.428882 +31 31 28.912680 +182 31 -17.094020 +186 31 -6.389777 +32 32 16.376570 +376 32 -5.000000 +444 32 -11.376560 +33 33 106.164700 +34 33 -62.111800 +239 33 -44.052860 +33 34 -62.111800 +34 34 62.111800 +35 35 13.605440 +222 35 -13.605440 +36 36 1122.904000 +325 36 -1111.111000 +419 36 -11.792450 +37 37 208.561600 +147 37 -8.561644 +262 37 -200.000000 +38 38 19.286960 +39 38 -11.049720 +398 38 -8.237232 +38 39 -11.049720 +39 39 50.429810 +40 39 -22.573360 +281 39 -16.806720 +39 40 -22.573360 +40 40 107.319100 +417 40 -84.745760 +41 41 1125.308000 +47 41 -11.655010 +328 41 -1111.111000 +413 41 -2.541942 +42 42 40.630240 +172 42 -34.843200 +328 42 -5.787037 +43 43 32.258060 +175 43 -32.258060 +44 44 50.451940 +102 44 -11.990410 +286 44 -38.461540 +45 45 21.890110 +174 45 -6.293266 +203 45 -4.997501 +264 45 -5.336179 +285 45 -5.263158 +1 46 -8.196721 +46 46 14.953480 +253 46 -6.756757 +41 47 -11.655010 +47 47 29.279530 +153 47 -3.419973 +285 47 -14.204550 +48 48 1682.986000 +205 48 -114.025100 +271 48 -1333.333000 +283 48 -180.180200 +306 48 -55.447740 +49 49 65.393370 +50 49 -47.619050 +114 49 -6.009615 +455 49 -11.764710 +49 50 -47.619050 +50 50 168.412500 +238 50 -111.111100 +331 50 -5.076142 +442 50 -4.606173 +51 51 39.446350 +82 51 -24.271840 +409 51 -15.174510 +3 52 -5.665723 +52 52 10.485000 +397 52 -4.819277 +53 53 89.160840 +271 53 -37.878790 +310 53 -51.282050 +54 54 14.702950 +162 54 -6.896552 +406 54 -7.806402 +55 55 40.845950 +269 55 -21.978020 +363 55 -18.867930 +56 56 20.844680 +124 56 -9.633911 +224 56 -11.210760 +16 57 -4.805382 +57 57 19.214610 +84 57 -14.409220 +58 58 8.290816 +59 58 -6.250000 +60 58 -2.040816 +58 59 -6.250000 +59 59 63.998540 +347 59 -13.888890 +377 59 -43.859650 +58 60 -2.040816 +60 60 2.040816 +61 61 25.706270 +332 61 -18.181820 +418 61 -7.524455 +62 62 8.084074 +438 62 -8.084074 +63 63 17.001380 +64 63 -0.670241 +89 63 -3.341130 +190 63 -9.523809 +394 63 -3.466204 +63 64 -0.670241 +64 64 0.670241 +65 65 68.635110 +66 65 -56.179780 +428 65 -5.643341 +436 65 -6.811989 +65 66 -56.179780 +66 66 56.179780 +67 67 794.435900 +69 67 -9.727627 +70 67 -714.285800 +71 67 -70.422530 +68 68 63.740790 +70 68 -23.419200 +72 68 -15.076140 +73 68 -10.752690 +214 68 -14.492750 +67 69 -9.727627 +69 69 9.727627 +67 70 -714.285800 +68 70 -23.419200 +70 70 898.173600 +71 70 -64.102570 +72 70 -8.467401 +142 70 -49.627790 +311 70 -15.015010 +320 70 -23.255810 +67 71 -70.422530 +70 71 -64.102570 +71 71 309.751400 +74 71 -22.522520 +75 71 -22.522520 +76 71 -27.027030 +91 71 -57.471260 +353 71 -45.682960 +68 72 -15.076140 +70 72 -8.467401 +72 72 44.659610 +212 72 -8.291874 +213 72 -8.424600 +440 72 -2.173913 +464 72 -2.225684 +68 73 -10.752690 +73 73 10.752690 +71 74 -22.522520 +74 74 22.522520 +71 75 -22.522520 +75 75 22.522520 +71 76 -27.027030 +76 76 27.027030 +77 77 43.256960 +78 77 -11.627910 +187 77 -25.641030 +264 77 -5.988024 +77 78 -11.627910 +78 78 14.954860 +123 78 -1.324152 +265 78 -2.002804 +79 79 59.783590 +80 79 -18.993350 +214 79 -18.518520 +421 79 -22.271720 +79 80 -18.993350 +80 80 76.989320 +147 80 -9.765625 +252 80 -3.332223 +355 80 -9.661836 +393 80 -33.333340 +437 80 -1.902950 +81 81 54.865130 +396 81 -34.246570 +457 81 -20.618560 +51 82 -24.271840 +82 82 130.654800 +287 82 -106.383000 +83 83 8.651169 +387 83 -4.880430 +423 83 -3.770739 +57 84 -14.409220 +84 84 18.529540 +173 84 -4.120313 +28 85 -3.767472 +85 85 318.494700 +88 85 -294.117600 +116 85 -14.025250 +275 85 -3.544842 +454 85 -3.039514 +86 86 11.614400 +88 86 -11.614400 +87 87 55.873020 +88 87 -40.000000 +236 87 -15.873020 +85 88 -294.117600 +86 88 -11.614400 +87 88 -40.000000 +88 88 345.732100 +63 89 -3.341130 +89 89 8.151134 +326 89 -4.810005 +90 90 215.090100 +91 90 -125.000000 +386 90 -90.090100 +71 91 -57.471260 +90 91 -125.000000 +91 91 295.428500 +93 91 -38.759690 +94 91 -38.910510 +95 91 -11.534030 +371 91 -23.752970 +92 92 79.781510 +95 92 -74.626870 +387 92 -5.154639 +91 93 -38.759690 +93 93 38.759690 +91 94 -38.910510 +94 94 38.910510 +91 95 -11.534030 +92 95 -74.626870 +95 95 94.053560 +96 95 -7.892660 +95 96 -7.892660 +96 96 7.892660 +97 97 17.551330 +326 97 -10.799140 +422 97 -6.752194 +98 98 15.573290 +150 98 -5.892752 +156 98 -9.680542 +26 99 -42.372880 +99 99 76.271190 +224 99 -33.898300 +100 100 1230.337000 +158 100 -116.279100 +220 100 -769.230800 +391 100 -344.827600 +101 101 26.041670 +102 101 -26.041670 +44 102 -11.990410 +101 102 -26.041670 +102 102 79.669890 +178 102 -22.471910 +233 102 -10.000000 +286 102 -9.165903 +103 103 104.405000 +306 103 -55.648300 +429 103 -48.756710 +104 104 85.535790 +105 104 -4.716981 +191 104 -17.793590 +257 104 -18.382350 +263 104 -44.642860 +104 105 -4.716981 +105 105 4.716981 +106 106 14.409220 +255 106 -14.409220 +107 107 41.132950 +246 107 -20.080320 +334 107 -21.052630 +108 108 91.694530 +191 108 -72.463770 +380 108 -19.230770 +109 109 9.784736 +112 109 -9.784736 +110 110 1.029866 +112 110 -1.029866 +111 111 2.164502 +112 111 -2.164502 +109 112 -9.784736 +110 112 -1.029866 +111 112 -2.164502 +112 112 26.689960 +123 112 -3.492840 +179 112 -6.802721 +298 112 -3.415300 +113 113 140.110500 +263 113 -36.764710 +337 113 -37.313430 +378 113 -46.948360 +416 113 -19.083970 +49 114 -6.009615 +114 114 14.010440 +115 114 -2.604167 +285 114 -5.396654 +5 115 -8.000000 +114 115 -2.604167 +115 115 13.984830 +354 115 -3.380663 +85 116 -14.025250 +116 116 32.240180 +117 116 -18.214940 +116 117 -18.214940 +117 117 36.767810 +119 117 -18.552880 +118 118 29.756330 +124 118 -19.083970 +346 118 -10.672360 +117 119 -18.552880 +119 119 28.715480 +346 119 -10.162600 +4 120 -100.000000 +120 120 176.923100 +429 120 -76.923070 +121 121 16.949150 +123 121 -16.949150 +122 122 33.941960 +123 122 -5.783690 +187 122 -12.903230 +264 122 -9.633911 +297 122 -5.621135 +78 123 -1.324152 +112 123 -3.492840 +121 123 -16.949150 +122 123 -5.783690 +123 123 38.087050 +179 123 -7.518797 +265 123 -3.018412 +56 124 -9.633911 +118 124 -19.083970 +124 124 28.717880 +125 125 3.294893 +126 125 -3.294893 +125 126 -3.294893 +126 126 10.283010 +385 126 -6.988121 +127 127 39.109090 +129 127 -19.841270 +226 127 -19.267820 +128 128 56.252830 +225 128 -18.939390 +438 128 -37.313430 +127 129 -19.841270 +129 129 19.841270 +130 130 15.974440 +141 130 -15.974440 +131 131 15.974440 +141 131 -15.974440 +132 132 18.382350 +141 132 -18.382350 +133 133 62.111800 +142 133 -62.111800 +134 134 54.347820 +143 134 -54.347820 +135 135 22.573360 +140 135 -22.573360 +136 136 405.785200 +141 136 -333.333300 +142 136 -59.171600 +144 136 -13.280210 +137 137 444.034100 +141 137 -370.370400 +142 137 -60.240960 +145 137 -13.422820 +138 138 125.490200 +199 138 -58.823520 +340 138 -66.666670 +139 139 13.568520 +147 139 -13.568520 +22 140 -68.493150 +23 140 -81.967220 +135 140 -22.573360 +140 140 173.033700 +130 141 -15.974440 +131 141 -15.974440 +132 141 -18.382350 +136 141 -333.333300 +137 141 -370.370400 +141 141 754.034900 +70 142 -49.627790 +133 142 -62.111800 +136 142 -59.171600 +137 142 -60.240960 +142 142 643.315400 +143 142 -188.679200 +473 142 -188.679200 +478 142 -12.180270 +487 142 -22.624440 +134 143 -54.347820 +142 143 -188.679200 +143 143 274.582800 +242 143 -31.555690 +136 144 -13.280210 +144 144 13.280210 +137 145 -13.422820 +145 145 13.422820 +146 146 86.175740 +183 146 -8.576329 +245 146 -6.878052 +339 146 -70.721360 +37 147 -8.561644 +80 147 -9.765625 +139 147 -13.568520 +147 147 31.895790 +148 148 19.607840 +434 148 -9.803922 +443 148 -9.803922 +149 149 36.061350 +150 149 -20.607790 +217 149 -15.453560 +6 150 -1.526718 +98 150 -5.892752 +149 150 -20.607790 +150 150 38.128270 +397 150 -10.101010 +151 151 52.868480 +153 151 -5.371435 +154 151 -2.452002 +155 151 -45.045050 +152 152 55.509490 +153 152 -5.443658 +154 152 -2.446783 +155 152 -47.619050 +47 153 -3.419973 +151 153 -5.371435 +152 153 -5.443658 +153 153 29.860070 +203 153 -15.625000 +151 154 -2.452002 +152 154 -2.446783 +154 154 4.898785 +23 155 -108.695600 +151 155 -45.045050 +152 155 -47.619050 +155 155 218.720900 +241 155 -17.361110 +98 156 -9.680542 +156 156 10009.680000 +157 156 -10000.000000 +25 157 -4.741584 +156 157 -10000.000000 +157 157 10004.740000 +4 158 -294.117600 +100 158 -116.279100 +158 158 410.396700 +159 159 95.742790 +160 159 -40.734680 +183 159 -10.023050 +248 159 -21.168500 +388 159 -16.463620 +392 159 -7.352941 +159 160 -40.734680 +160 160 202.015000 +369 160 -19.436350 +399 160 -141.844000 +161 161 2.209945 +410 161 -2.209945 +54 162 -6.896552 +162 162 8.668659 +355 162 -1.772107 +163 163 132.412600 +167 163 -22.522520 +246 163 -109.890100 +164 164 1076.971000 +167 164 -999.999900 +231 164 -15.598190 +417 164 -27.359780 +470 164 -34.013600 +7 165 -2.619172 +165 165 2.619172 +166 166 11.866090 +341 166 -8.071025 +423 166 -3.795066 +163 167 -22.522520 +164 167 -999.999900 +167 167 1022.522000 +168 168 66.800270 +169 168 -66.800270 +168 169 -66.800270 +169 169 77.049900 +344 169 -4.973145 +400 169 -5.276488 +25 170 -12.500000 +170 170 179.166700 +325 170 -166.666700 +171 171 76.923070 +172 171 -76.923070 +42 172 -34.843200 +171 172 -76.923070 +172 172 111.766300 +28 173 -595.238100 +84 173 -4.120313 +173 173 618.791000 +202 173 -19.432570 +45 174 -6.293266 +174 174 41.110850 +175 174 -9.242133 +285 174 -25.575450 +43 175 -32.258060 +174 175 -9.242133 +175 175 41.500200 +176 176 3.676470 +464 176 -3.676470 +177 177 5.420054 +226 177 -5.420054 +102 178 -22.471910 +178 178 36.943690 +340 178 -14.471780 +112 179 -6.802721 +123 179 -7.518797 +179 179 14.321520 +180 180 14.641290 +181 180 -14.641290 +180 181 -14.641290 +181 181 89.829260 +233 181 -75.187970 +31 182 -17.094020 +182 182 17.094020 +146 183 -8.576329 +159 183 -10.023050 +183 183 48.701150 +184 183 -3.319943 +185 183 -10.176050 +248 183 -16.605780 +183 184 -3.319943 +184 184 3.319943 +183 185 -10.176050 +185 185 10.176050 +3 186 -7.905138 +31 186 -6.389777 +186 186 14.294920 +77 187 -25.641030 +122 187 -12.903230 +187 187 38.544250 +188 188 4.097813 +198 188 -2.428363 +212 188 -1.669449 +189 189 0.170358 +190 189 -0.170358 +63 190 -9.523809 +189 190 -0.170358 +190 190 12.439160 +401 190 -2.744990 +104 191 -17.793590 +108 191 -72.463770 +191 191 209.335800 +192 191 -8.000000 +195 191 -12.014900 +196 191 -17.844400 +374 191 -30.487800 +380 191 -14.168320 +416 191 -36.563070 +191 192 -8.000000 +192 192 29.547830 +193 192 -10.200960 +194 192 -11.346870 +192 193 -10.200960 +193 193 10.200960 +192 194 -11.346870 +194 194 11.346870 +191 195 -12.014900 +195 195 12.014900 +191 196 -17.844400 +196 196 17.844400 +23 197 -10.183300 +197 197 28.498320 +465 197 -18.315020 +188 198 -2.428363 +198 198 10.611670 +201 198 -8.183307 +138 199 -58.823520 +199 199 101.376700 +364 199 -42.553190 +200 200 4.805382 +280 200 -4.805382 +198 201 -8.183307 +201 201 8.183307 +173 202 -19.432570 +202 202 40.313760 +247 202 -20.881190 +45 203 -4.997501 +153 203 -15.625000 +203 203 124.789200 +297 203 -104.166700 +204 204 1214.533000 +205 204 -1123.595000 +206 204 -5.758379 +207 204 -85.178880 +10 205 -127.226500 +48 205 -114.025100 +204 205 -1123.595000 +205 205 1543.608000 +208 205 -15.498710 +283 205 -93.283580 +357 205 -53.106750 +369 205 -16.871940 +204 206 -5.758379 +206 206 5.758379 +204 207 -85.178880 +207 207 149.570400 +278 207 -64.391490 +205 208 -15.498710 +208 208 21.777360 +209 208 -6.278646 +208 209 -6.278646 +209 209 6.278646 +210 210 8.795074 +211 210 -8.795074 +210 211 -8.795074 +211 211 45.570150 +457 211 -20.876830 +465 211 -15.898250 +72 212 -8.291874 +188 212 -1.669449 +212 212 9.961323 +72 213 -8.424600 +213 213 16.737150 +444 213 -8.312551 +68 214 -14.492750 +79 214 -18.518520 +214 214 33.011270 +215 215 10.294730 +390 215 -5.701254 +440 215 -4.593477 +216 216 243.995100 +217 216 -181.818200 +218 216 -11.415530 +219 216 -50.761420 +149 217 -15.453560 +216 217 -181.818200 +217 217 278.138400 +277 217 -46.663560 +286 217 -5.467469 +429 217 -28.735630 +216 218 -11.415530 +218 218 11.415530 +216 219 -50.761420 +219 219 77.571080 +235 219 -26.809650 +100 220 -769.230800 +220 220 978.008300 +271 220 -59.523810 +449 220 -149.253700 +221 221 14.175270 +367 221 -10.504200 +464 221 -3.671072 +35 222 -13.605440 +222 222 24.752130 +240 222 -3.993610 +436 222 -7.153076 +223 223 27.514140 +345 223 -14.705880 +398 223 -5.711022 +407 223 -7.097232 +56 224 -11.210760 +99 224 -33.898300 +224 224 74.144000 +377 224 -24.390240 +454 224 -4.644682 +128 225 -18.939390 +225 225 238.167400 +226 225 -200.000000 +282 225 -8.116883 +377 225 -11.111110 +127 226 -19.267820 +177 226 -5.420054 +225 226 -200.000000 +226 226 224.687900 +227 227 15.243900 +228 227 -15.243900 +227 228 -15.243900 +228 228 19.758580 +420 228 -4.514673 +229 229 36.496350 +230 229 -36.496350 +229 230 -36.496350 +230 230 95.454160 +315 230 -55.248620 +436 230 -3.709199 +164 231 -15.598190 +231 231 100.692700 +386 231 -19.305020 +473 231 -65.789470 +232 232 329.623100 +233 232 -200.000000 +234 232 -11.976050 +235 232 -117.647000 +102 233 -10.000000 +181 233 -75.187970 +232 233 -200.000000 +233 233 285.188000 +232 234 -11.976050 +234 234 11.976050 +219 235 -26.809650 +232 235 -117.647000 +235 235 144.456700 +87 236 -15.873020 +236 236 165.723800 +301 236 -62.208400 +399 236 -87.642420 +237 237 82.188440 +300 237 -58.004640 +308 237 -24.183800 +50 238 -111.111100 +238 238 151.433700 +294 238 -40.322580 +33 239 -44.052860 +239 239 48.515160 +322 239 -4.462294 +222 240 -3.993610 +240 240 8.230898 +422 240 -4.237288 +155 241 -17.361110 +241 241 26.750780 +329 241 -9.389671 +143 242 -31.555690 +242 242 329.219400 +258 242 -186.567200 +431 242 -38.580250 +480 242 -72.516310 +243 243 28.624240 +244 243 -27.173910 +309 243 -1.450326 +243 244 -27.173910 +244 244 27.173910 +146 245 -6.878052 +245 245 36.980400 +300 245 -30.102350 +107 246 -20.080320 +163 246 -109.890100 +246 246 129.970400 +202 247 -20.881190 +247 247 99.006190 +333 247 -78.125000 +159 248 -21.168500 +183 248 -16.605780 +248 248 45.486760 +249 248 -7.712479 +248 249 -7.712479 +249 249 20007.710000 +250 249 -10000.000000 +251 249 -10000.000000 +249 250 -10000.000000 +250 250 10000.000000 +249 251 -10000.000000 +251 251 10000.000000 +80 252 -3.332223 +252 252 10.845370 +363 252 -7.513148 +46 253 -6.756757 +253 253 14.756760 +256 253 -8.000000 +254 254 1.459854 +256 254 -1.459854 +106 255 -14.409220 +255 255 103.428800 +256 255 -40.000000 +385 255 -49.019610 +253 256 -8.000000 +254 256 -1.459854 +255 256 -40.000000 +256 256 49.459850 +104 257 -18.382350 +257 257 141.792300 +266 257 -10.967320 +336 257 -22.271720 +402 257 -48.154090 +427 257 -42.016810 +242 258 -186.567200 +258 258 545.168400 +259 258 -90.744100 +260 258 -90.009000 +261 258 -89.126560 +431 258 -28.661510 +466 258 -60.060060 +258 259 -90.744100 +259 259 90.744100 +258 260 -90.009000 +260 260 90.009000 +258 261 -89.126560 +261 261 89.126560 +37 262 -200.000000 +262 262 204.904400 +443 262 -4.904365 +104 263 -44.642860 +113 263 -36.764710 +263 263 172.726200 +336 263 -63.694270 +378 263 -27.624310 +45 264 -5.336179 +77 264 -5.988024 +122 264 -9.633911 +264 264 26.741800 +265 264 -5.783690 +78 265 -2.002804 +123 265 -3.018412 +264 265 -5.783690 +265 265 10.804910 +257 266 -10.967320 +266 266 10.967320 +1 267 -4.051864 +267 267 12.330010 +407 267 -8.278146 +268 268 6.802721 +269 268 -6.802721 +55 269 -21.978020 +268 269 -6.802721 +269 269 33.414660 +422 269 -4.633920 +270 270 146.164200 +372 270 -72.254330 +404 270 -73.909830 +48 271 -1333.333000 +53 271 -37.878790 +220 271 -59.523810 +271 271 1493.041000 +272 271 -17.241380 +310 271 -26.881720 +377 271 -18.181820 +271 272 -17.241380 +272 272 43.925950 +273 272 -13.315580 +274 272 -13.368980 +272 273 -13.315580 +273 273 13.315580 +272 274 -13.368980 +274 274 13.368980 +85 275 -3.544842 +275 275 27.820970 +345 275 -9.541985 +375 275 -8.340283 +407 275 -6.393862 +276 276 12.322530 +315 276 -4.677269 +394 276 -7.645260 +10 277 -150.150100 +217 277 -46.663560 +277 277 278.513100 +432 277 -81.699350 +207 278 -64.391490 +278 278 273.046600 +279 278 -86.206890 +431 278 -104.166700 +479 278 -18.281540 +278 279 -86.206890 +279 279 86.206890 +200 280 -4.805382 +280 280 15.758280 +281 280 -10.952900 +17 281 -14.306150 +39 281 -16.806720 +280 281 -10.952900 +281 281 42.065780 +225 282 -8.116883 +282 282 8.116883 +48 283 -180.180200 +205 283 -93.283580 +283 283 273.463800 +284 284 39.028030 +285 284 -3.492840 +287 284 -18.083180 +288 284 -17.452010 +45 285 -5.263158 +47 285 -14.204550 +114 285 -5.396654 +174 285 -25.575450 +284 285 -3.492840 +285 285 151.971900 +289 285 -49.019610 +290 285 -49.019610 +44 286 -38.461540 +102 286 -9.165903 +217 286 -5.467469 +286 286 65.028080 +289 286 -5.966587 +290 286 -5.966587 +82 287 -106.383000 +284 287 -18.083180 +287 287 124.466200 +284 288 -17.452010 +288 288 17.452010 +285 289 -49.019610 +286 289 -5.966587 +289 289 59.067830 +291 289 -4.081633 +285 290 -49.019610 +286 290 -5.966587 +290 290 59.067830 +292 290 -4.081633 +289 291 -4.081633 +291 291 4.081633 +290 292 -4.081633 +292 292 4.081633 +293 293 10.799140 +294 293 -10.799140 +238 294 -40.322580 +293 294 -10.799140 +294 294 81.424740 +419 294 -30.303030 +295 295 39.062500 +447 295 -39.062500 +296 296 507.685800 +297 296 -5.681818 +298 296 -500.000000 +299 296 -2.004008 +122 297 -5.621135 +203 297 -104.166700 +296 297 -5.681818 +297 297 328.235600 +456 297 -212.766000 +112 298 -3.415300 +296 298 -500.000000 +298 298 503.415300 +296 299 -2.004008 +299 299 2.004008 +237 300 -58.004640 +245 300 -30.102350 +300 300 100.909400 +372 300 -12.802460 +236 301 -62.208400 +301 301 5112.385000 +302 301 -2000.000000 +304 301 -2000.000000 +306 301 -500.000000 +310 301 -500.000000 +323 301 -8.510638 +429 301 -41.666670 +301 302 -2000.000000 +302 302 2077.786000 +303 302 -11.560690 +493 302 -66.225170 +302 303 -11.560690 +303 303 11.560690 +301 304 -2000.000000 +304 304 2077.786000 +305 304 -11.560690 +494 304 -66.225170 +304 305 -11.560690 +305 305 11.560690 +48 306 -55.447740 +103 306 -55.648300 +301 306 -500.000000 +306 306 1166.652000 +310 306 -555.555500 +29 307 -4.387889 +307 307 17.597930 +434 307 -13.210040 +237 308 -24.183800 +308 308 57.285420 +373 308 -33.101620 +243 309 -1.450326 +309 309 46.699200 +409 309 -45.248870 +53 310 -51.282050 +271 310 -26.881720 +301 310 -500.000000 +306 310 -555.555500 +310 310 2286.153000 +317 310 -370.370400 +318 310 -370.370400 +319 310 -370.370400 +391 310 -41.322320 +70 311 -15.015010 +311 311 238.110800 +317 311 -60.240960 +318 311 -60.240960 +319 311 -60.240960 +320 311 -42.372880 +312 312 13.422820 +317 312 -13.422820 +313 313 13.422820 +318 313 -13.422820 +314 314 13.422820 +319 314 -13.422820 +230 315 -55.248620 +276 315 -4.677269 +315 315 59.925880 +29 316 -3.225806 +316 316 9.660813 +428 316 -6.435007 +310 317 -370.370400 +311 317 -60.240960 +312 317 -13.422820 +317 317 444.034100 +310 318 -370.370400 +311 318 -60.240960 +313 318 -13.422820 +318 318 444.034100 +310 319 -370.370400 +311 319 -60.240960 +314 319 -13.422820 +319 319 444.034100 +70 320 -23.255810 +311 320 -42.372880 +320 320 69.474850 +321 320 -3.846154 +320 321 -3.846154 +321 321 13.564330 +401 321 -9.718173 +239 322 -4.462294 +322 322 16.510490 +323 322 -12.048190 +301 323 -8.510638 +322 323 -12.048190 +323 323 10029.630000 +340 323 -9.074409 +435 323 -10000.000000 +324 324 18.181820 +325 324 -18.181820 +36 325 -1111.111000 +170 325 -166.666700 +324 325 -18.181820 +325 325 1295.959000 +89 326 -4.810005 +97 326 -10.799140 +326 326 15.609140 +327 327 3.105590 +328 327 -3.105590 +41 328 -1111.111000 +42 328 -5.787037 +327 328 -3.105590 +328 328 1120.004000 +241 329 -9.389671 +329 329 74.324740 +396 329 -64.935070 +330 330 4.587156 +331 330 -4.587156 +50 331 -5.076142 +330 331 -4.587156 +331 331 9.663299 +61 332 -18.181820 +332 332 23.896100 +335 332 -5.714286 +247 333 -78.125000 +333 333 92.809290 +392 333 -14.684290 +17 334 -28.818450 +107 334 -21.052630 +334 334 49.871080 +332 335 -5.714286 +335 335 12.233190 +434 335 -6.518905 +257 336 -22.271720 +263 336 -63.694270 +336 336 85.965990 +113 337 -37.313430 +337 337 81.956300 +343 337 -44.642860 +338 338 2.164502 +394 338 -2.164502 +146 339 -70.721360 +339 339 74.335910 +342 339 -3.614545 +138 340 -66.666670 +178 340 -14.471780 +323 340 -9.074409 +340 340 90.212860 +166 341 -8.071025 +341 341 10.469110 +423 341 -2.398082 +339 342 -3.614545 +342 342 3.614545 +337 343 -44.642860 +343 343 63.836720 +416 343 -19.193860 +169 344 -4.973145 +344 344 4.973145 +223 345 -14.705880 +275 345 -9.541985 +345 345 90.858520 +348 345 -3.620565 +350 345 -12.033690 +352 345 -29.069770 +353 345 -21.886630 +118 346 -10.672360 +119 346 -10.162600 +346 346 86.783690 +347 346 -24.213080 +349 346 -3.810976 +351 346 -12.195120 +353 346 -21.739130 +375 346 -3.990423 +59 347 -13.888890 +346 347 -24.213080 +347 347 38.101970 +345 348 -3.620565 +348 348 3.620565 +346 349 -3.810976 +349 349 3.810976 +345 350 -12.033690 +350 350 12.033690 +346 351 -12.195120 +351 351 12.195120 +345 352 -29.069770 +352 352 49.903100 +395 352 -20.833330 +71 353 -45.682960 +345 353 -21.886630 +346 353 -21.739130 +353 353 10089.310000 +403 353 -10000.000000 +115 354 -3.380663 +354 354 9.430269 +420 354 -6.049607 +80 355 -9.661836 +162 355 -1.772107 +355 355 11.433940 +356 356 192.307700 +385 356 -192.307700 +205 357 -53.106750 +357 357 141.234600 +358 357 -15.785320 +359 357 -7.358893 +361 357 -7.873395 +399 357 -57.110220 +357 358 -15.785320 +358 358 32.048440 +360 358 -8.167265 +362 358 -8.095855 +357 359 -7.358893 +359 359 7.358893 +358 360 -8.167265 +360 360 8.167265 +357 361 -7.873395 +361 361 7.873395 +358 362 -8.095855 +362 362 8.095855 +55 363 -18.867930 +252 363 -7.513148 +363 363 26.381070 +199 364 -42.553190 +364 364 42.553190 +365 365 21.231420 +438 365 -21.231420 +366 366 1.169727 +367 366 -1.169727 +7 367 -3.603604 +221 367 -10.504200 +366 367 -1.169727 +367 367 30.373970 +376 367 -3.522367 +426 367 -11.574070 +368 368 262.983900 +369 368 -188.679200 +370 368 -13.698630 +371 368 -60.606060 +160 369 -19.436350 +205 369 -16.871940 +368 369 -188.679200 +369 369 277.779400 +372 369 -26.308860 +373 369 -26.483050 +368 370 -13.698630 +370 370 13.698630 +91 371 -23.752970 +368 371 -60.606060 +371 371 84.359030 +270 372 -72.254330 +300 372 -12.802460 +369 372 -26.308860 +372 372 111.365700 +308 373 -33.101620 +369 373 -26.483050 +373 373 108.604300 +392 373 -49.019610 +191 374 -30.487800 +374 374 123.080400 +408 374 -92.592590 +275 375 -8.340283 +346 375 -3.990423 +375 375 12.330710 +32 376 -5.000000 +367 376 -3.522367 +376 376 8.522367 +59 377 -43.859650 +224 377 -24.390240 +225 377 -11.111110 +271 377 -18.181820 +377 377 121.017000 +395 377 -23.474180 +113 378 -46.948360 +263 378 -27.624310 +378 378 74.572670 +379 379 127.641200 +380 379 -35.211270 +381 379 -84.033620 +383 379 -8.396306 +108 380 -19.230770 +191 380 -14.168320 +379 380 -35.211270 +380 380 78.423900 +384 380 -9.813543 +379 381 -84.033620 +381 381 249.754800 +417 381 -153.846100 +430 381 -11.875070 +382 382 123.456800 +384 382 -123.456800 +379 383 -8.396306 +383 383 8.396306 +380 384 -9.813543 +382 384 -123.456800 +384 384 133.270300 +126 385 -6.988121 +255 385 -49.019610 +356 385 -192.307700 +385 385 248.315400 +90 386 -90.090100 +231 386 -19.305020 +386 386 109.395100 +83 387 -4.880430 +92 387 -5.154639 +387 387 10.035070 +159 388 -16.463620 +388 388 18.112910 +389 388 -1.649294 +388 389 -1.649294 +389 389 1.649294 +215 390 -5.701254 +390 390 8.220146 +439 390 -2.518892 +100 391 -344.827600 +310 391 -41.322320 +391 391 386.149900 +159 392 -7.352941 +333 392 -14.684290 +373 392 -49.019610 +392 392 209.369400 +404 392 -138.312600 +80 393 -33.333340 +393 393 38.333340 +439 393 -5.000000 +63 394 -3.466204 +276 394 -7.645260 +338 394 -2.164502 +394 394 13.275970 +352 395 -20.833330 +377 395 -23.474180 +395 395 44.307510 +81 396 -34.246570 +329 396 -64.935070 +396 396 133.293100 +457 396 -10.582010 +465 396 -23.529410 +52 397 -4.819277 +150 397 -10.101010 +397 397 14.920290 +38 398 -8.237232 +223 398 -5.711022 +398 398 13.948250 +160 399 -141.844000 +236 399 -87.642420 +357 399 -57.110220 +399 399 286.596600 +169 400 -5.276488 +400 400 19.088640 +442 400 -13.812150 +190 401 -2.744990 +321 401 -9.718173 +401 401 12.463160 +257 402 -48.154090 +402 402 85.607280 +403 402 -37.453190 +353 403 -10000.000000 +402 403 -37.453190 +403 403 10037.450000 +270 404 -73.909830 +392 404 -138.312600 +404 404 212.222400 +405 405 4.235493 +406 405 -4.235493 +54 406 -7.806402 +405 406 -4.235493 +406 406 12.041890 +223 407 -7.097232 +267 407 -8.278146 +275 407 -6.393862 +407 407 21.769240 +374 408 -92.592590 +408 408 117.284000 +427 408 -24.691360 +51 409 -15.174510 +309 409 -45.248870 +409 409 60.423380 +161 410 -2.209945 +410 410 12.372550 +418 410 -10.162600 +411 411 31.565660 +412 411 -31.565660 +11 412 -50.301810 +411 412 -31.565660 +412 412 83.281910 +437 412 -1.414447 +41 413 -2.541942 +413 413 2.541942 +414 414 119.866300 +415 414 -8.333334 +416 414 -34.013600 +417 414 -77.519380 +414 415 -8.333334 +415 415 8.333334 +113 416 -19.083970 +191 416 -36.563070 +343 416 -19.193860 +414 416 -34.013600 +416 416 108.854500 +40 417 -84.745760 +164 417 -27.359780 +381 417 -153.846100 +414 417 -77.519380 +417 417 343.471100 +61 418 -7.524455 +410 418 -10.162600 +418 418 17.687060 +36 419 -11.792450 +294 419 -30.303030 +419 419 42.095480 +228 420 -4.514673 +354 420 -6.049607 +420 420 19.046040 +424 420 -8.481764 +79 421 -22.271720 +421 421 51.322930 +422 421 -6.779501 +435 421 -22.271720 +9 422 -10.214500 +97 422 -6.752194 +240 422 -4.237288 +269 422 -4.633920 +421 422 -6.779501 +422 422 32.617410 +83 423 -3.770739 +166 423 -3.795066 +341 423 -2.398082 +423 423 9.963887 +420 424 -8.481764 +424 424 8.481764 +26 425 -30.211480 +425 425 30.211480 +7 426 -5.787037 +367 426 -11.574070 +426 426 17.361110 +257 427 -42.016810 +408 427 -24.691360 +427 427 66.708170 +65 428 -5.643341 +316 428 -6.435007 +428 428 12.078350 +4 429 -53.504550 +103 429 -48.756710 +120 429 -76.923070 +217 429 -28.735630 +301 429 -41.666670 +429 429 490.550500 +431 429 -240.963900 +381 430 -11.875070 +430 430 91.875080 +431 430 -80.000000 +242 431 -38.580250 +258 431 -28.661510 +278 431 -104.166700 +429 431 -240.963900 +430 431 -80.000000 +431 431 492.372300 +4 432 -73.367570 +277 432 -81.699350 +432 432 155.066900 +6 433 -3.724395 +433 433 3.724395 +148 434 -9.803922 +307 434 -13.210040 +335 434 -6.518905 +434 434 39.502960 +437 434 -9.970090 +323 435 -10000.000000 +421 435 -22.271720 +435 435 10032.620000 +436 435 -10.344850 +11 436 -29.498530 +65 436 -6.811989 +222 436 -7.153076 +230 436 -3.709199 +435 436 -10.344850 +436 436 57.517640 +80 437 -1.902950 +412 437 -1.414447 +434 437 -9.970090 +437 437 13.287490 +62 438 -8.084074 +128 438 -37.313430 +365 438 -21.231420 +438 438 66.628940 +390 439 -2.518892 +393 439 -5.000000 +439 439 7.518892 +72 440 -2.173913 +215 440 -4.593477 +440 440 6.767390 +441 441 7.757952 +442 441 -7.757952 +50 442 -4.606173 +400 442 -13.812150 +441 442 -7.757952 +442 442 26.176280 +148 443 -9.803922 +262 443 -4.904365 +443 443 14.708290 +32 444 -11.376560 +213 444 -8.312551 +444 444 19.689120 +445 445 69.858070 +446 445 -27.247960 +447 445 -26.455030 +449 445 -16.155090 +445 446 -27.247960 +446 446 83.551830 +450 446 -39.062500 +455 446 -17.241380 +295 447 -39.062500 +445 447 -26.455030 +447 447 82.758900 +455 447 -17.241380 +448 448 10000.000000 +450 448 -10000.000000 +220 449 -149.253700 +445 449 -16.155090 +449 449 185.103200 +451 449 -6.622517 +452 449 -6.535948 +453 449 -6.535948 +446 450 -39.062500 +448 450 -10000.000000 +450 450 10039.060000 +449 451 -6.622517 +451 451 6.622517 +449 452 -6.535948 +452 452 6.535948 +449 453 -6.535948 +453 453 6.535948 +85 454 -3.039514 +224 454 -4.644682 +454 454 73.473670 +455 454 -65.789470 +49 455 -11.764710 +446 455 -17.241380 +447 455 -17.241380 +454 455 -65.789470 +455 455 112.036900 +297 456 -212.766000 +456 456 10219.710000 +457 456 -6.944445 +458 456 -10000.000000 +81 457 -20.618560 +211 457 -20.876830 +396 457 -10.582010 +456 457 -6.944445 +457 457 80.496800 +459 457 -9.259259 +460 457 -2.272727 +461 457 -2.272727 +462 457 -3.780719 +463 457 -3.889537 +456 458 -10000.000000 +458 458 10000.000000 +457 459 -9.259259 +459 459 9.259259 +457 460 -2.272727 +460 460 2.272727 +457 461 -2.272727 +461 461 2.272727 +457 462 -3.780719 +462 462 3.780719 +457 463 -3.889537 +463 463 3.889537 +72 464 -2.225684 +176 464 -3.676470 +221 464 -3.671072 +464 464 9.573227 +197 465 -18.315020 +211 465 -15.898250 +396 465 -23.529410 +465 465 57.742680 +258 466 -60.060060 +466 466 6796.340000 +467 466 -69.613650 +480 466 -6666.667000 +466 467 -69.613650 +467 467 313.516100 +481 467 -243.902400 +468 468 78.336490 +472 468 -68.027210 +478 468 -10.309280 +469 469 56.028910 +473 469 -11.976050 +478 469 -44.052860 +164 470 -34.013600 +470 470 69.984830 +471 470 -35.971230 +470 471 -35.971230 +471 471 60.125820 +472 471 -24.154590 +468 472 -68.027210 +471 472 -24.154590 +472 472 92.181790 +142 473 -188.679200 +231 473 -65.789470 +469 473 -11.976050 +473 473 418.993900 +474 473 -33.898300 +475 473 -29.761910 +476 473 -44.444440 +477 473 -44.444440 +473 474 -33.898300 +474 474 33.898300 +473 475 -29.761910 +475 475 29.761910 +473 476 -44.444440 +476 476 44.444440 +473 477 -44.444440 +477 477 44.444440 +142 478 -12.180270 +468 478 -10.309280 +469 478 -44.052860 +478 478 66.542410 +278 479 -18.281540 +479 479 18.281540 +242 480 -72.516310 +466 480 -6666.667000 +480 480 6841.905000 +481 480 -32.051280 +483 480 -70.671380 +467 481 -243.902400 +480 481 -32.051280 +481 481 662.705000 +482 481 -265.604200 +483 481 -32.258060 +486 481 -88.888890 +481 482 -265.604200 +482 482 318.880800 +486 482 -53.276500 +480 483 -70.671380 +481 483 -32.258060 +483 483 204.970300 +484 483 -51.020410 +485 483 -51.020410 +483 484 -51.020410 +484 484 51.020410 +483 485 -51.020410 +485 485 51.020410 +481 486 -88.888890 +482 486 -53.276500 +486 486 142.165400 +142 487 -22.624440 +487 487 22.624440 +488 488 162.303800 +490 488 -72.167850 +493 488 -45.413260 +494 488 -44.722720 +489 489 64.799750 +490 489 -44.052860 +491 489 -20.746890 +488 490 -72.167850 +489 490 -44.052860 +490 490 170.274800 +492 490 -54.054050 +489 491 -20.746890 +491 491 20.746890 +490 492 -54.054050 +492 492 54.054050 +302 493 -66.225170 +488 493 -45.413260 +493 493 111.638400 +304 494 -66.225170 +488 494 -44.722720 +494 494 110.947900 \ No newline at end of file diff --git a/SPEX/ExampleMats/494_bus.rhs.txt b/SPEX/ExampleMats/494_bus.rhs.txt new file mode 100644 index 0000000000..3407b3cb27 --- /dev/null +++ b/SPEX/ExampleMats/494_bus.rhs.txt @@ -0,0 +1,495 @@ +494 1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 diff --git a/SPEX/ExampleMats/LF10.mat.txt b/SPEX/ExampleMats/LF10.mat.txt new file mode 100644 index 0000000000..f0c6d62dcc --- /dev/null +++ b/SPEX/ExampleMats/LF10.mat.txt @@ -0,0 +1,83 @@ +18 18 82 +1 1 3.53448 +2 1 -477.1548 +3 1 1.76724 +1 2 -477.1548 +2 2 171775.728 +4 2 -85887.864 +5 2 477.1548 +1 3 1.76724 +3 3 7.06896 +4 3 -477.1548 +5 3 1.76724 +2 4 -85887.864 +3 4 -477.1548 +4 4 171775.728 +6 4 -85887.864 +7 4 477.1548 +2 5 477.1548 +3 5 1.76724 +5 5 7.06896 +6 5 -477.1548 +7 5 1.76724 +4 6 -85887.864 +5 6 -477.1548 +6 6 171775.728 +8 6 -85887.864 +9 6 477.1548 +4 7 477.1548 +5 7 1.76724 +7 7 7.06896 +8 7 -477.1548 +9 7 1.76724 +6 8 -85887.864 +7 8 -477.1548 +8 8 171775.728 +10 8 -85887.864 +11 8 477.1548 +6 9 477.1548 +7 9 1.76724 +9 9 7.06896 +10 9 -477.1548 +11 9 1.76724 +8 10 -85887.864 +9 10 -477.1548 +10 10 171775.728 +12 10 -85887.864 +13 10 477.1548 +8 11 477.1548 +9 11 1.76724 +11 11 7.06896 +12 11 -477.1548 +13 11 1.76724 +10 12 -85887.864 +11 12 -477.1548 +12 12 171775.728 +14 12 -85887.864 +15 12 477.1548 +10 13 477.1548 +11 13 1.76724 +13 13 7.06896 +14 13 -477.1548 +15 13 1.76724 +12 14 -85887.864 +13 14 -477.1548 +14 14 171775.728 +16 14 -85887.864 +17 14 477.1548 +12 15 477.1548 +13 15 1.76724 +15 15 7.06896 +16 15 -477.1548 +17 15 1.76724 +14 16 -85887.864 +15 16 -477.1548 +16 16 171775.728 +18 16 477.1548 +14 17 477.1548 +15 17 1.76724 +17 17 7.06896 +18 17 1.76724 +16 18 477.1548 +17 18 1.76724 +18 18 3.53448 diff --git a/SPEX/ExampleMats/LFAT5.mat.txt b/SPEX/ExampleMats/LFAT5.mat.txt new file mode 100644 index 0000000000..ef2c9bf284 --- /dev/null +++ b/SPEX/ExampleMats/LFAT5.mat.txt @@ -0,0 +1,47 @@ +14 14 46 +1 1 1.57088 +4 1 -94.2528 +5 1 0.78544 +2 2 12566400 +6 2 -6283200 +3 3 0.608806201550388 +7 3 -0.304403100775194 +1 4 -94.2528 +4 4 15080.448 +8 4 -7540.224 +9 4 94.2528 +1 5 0.78544 +5 5 3.14176 +8 5 -94.2528 +9 5 0.78544 +2 6 -6283200 +6 6 12566400 +10 6 -6283200 +3 7 -0.304403100775194 +7 7 0.608806201550388 +11 7 -0.304403100775194 +4 8 -7540.224 +5 8 -94.2528 +8 8 15080.448 +12 8 -7540.224 +13 8 94.2528 +4 9 94.2528 +5 9 0.78544 +9 9 3.14176 +12 9 -94.2528 +13 9 0.78544 +6 10 -6283200 +10 10 12566400 +7 11 -0.304403100775194 +11 11 0.608806201550388 +8 12 -7540.224 +9 12 -94.2528 +12 12 15080.448 +14 12 94.2528 +8 13 94.2528 +9 13 0.78544 +13 13 3.14176 +14 13 0.78544 +12 14 94.2528 +13 14 0.78544 +14 14 1.57088 diff --git a/SPEX/SPEX_Left_LU/ExampleMats/NSR8K_mat.txt b/SPEX/ExampleMats/NSR8K.mat.txt similarity index 100% rename from SPEX/SPEX_Left_LU/ExampleMats/NSR8K_mat.txt rename to SPEX/ExampleMats/NSR8K.mat.txt diff --git a/SPEX/SPEX_Left_LU/ExampleMats/NSR8K_v.txt b/SPEX/ExampleMats/NSR8K.rhs.txt similarity index 100% rename from SPEX/SPEX_Left_LU/ExampleMats/NSR8K_v.txt rename to SPEX/ExampleMats/NSR8K.rhs.txt diff --git a/SPEX/ExampleMats/README.txt b/SPEX/ExampleMats/README.txt new file mode 100644 index 0000000000..f8bc054175 --- /dev/null +++ b/SPEX/ExampleMats/README.txt @@ -0,0 +1,49 @@ +Example matrices for SPEX demos and testing. + +All these matrices 1-based. + +Files: + + README.txt + + matrix right-hand-side description + ------ --------------- ----------- + 10teams.mat.txt 10teams.rhs.txt Basislib matrix + tomography.mat tomography.mat.rhs Earth science matrix from + MathWorks + LF10.mat.txt LF10.rhs.txt SPD linear 1D beam matrix + from Oberwolfach model + reduction benchmark collection + (collected from the SuiteSparse + Matrix Collection) + LFAT5.mat.txt LFAT5.rhs.txt SPD linear 1D beam matrix + from Oberwolfach model + reduction benchmark collection + (collected from the SuiteSparse + Matrix Collection) + Trefethen_500.mat.txt Trefethen_500.rhs.txt Diagonal matrix with primes + (collected from the SuiteSparse + Matrix Collection) + 494_bus.mat.txt 494_bus.rhs.txt SPD matrix from the Harwell + -Boeing collection (collected + from the SuiteSparse Matrix + Collection) + mesh1e1.mat.txt mesh1e1.rhs.txt SPD matrix from NASA + (collected from the SuiteSparse + Matrix Collection) + example.mat.txt example.rhs.txt Integer matrix + NSR8K.mat.txt NSR8K.rhs.txt Matrix from a real-world + mixed integer program + (collected from MIPLIB) + test1.mat.txt test1.rhs.txt Unsymmetric double matrix + created to test SPEX Cholesky + test2.mat.txt test2.rhs.txt Unsymmetric integer matrix + created to test SPEX Cholesky + test3.mat.txt test3.rhs.txt Unsymmetric matrix created + to test SPEX Cholesky + test4.mat.txt test4.rhs.txt Symmetric indefinite matrix + created to test SPEX Cholesky + test5.mat.txt test5.rhs.txt Small rectangular matrix + created to test SPEX + test.mat.txt test.rhs.txt Integer matrix to test SPEX LU + diff --git a/SPEX/ExampleMats/Trefethen_500.mat.txt b/SPEX/ExampleMats/Trefethen_500.mat.txt new file mode 100644 index 0000000000..2a389e324e --- /dev/null +++ b/SPEX/ExampleMats/Trefethen_500.mat.txt @@ -0,0 +1,8479 @@ +500 500 8478 +1 1 2 +2 1 1 +3 1 1 +5 1 1 +9 1 1 +17 1 1 +33 1 1 +65 1 1 +129 1 1 +257 1 1 +1 2 1 +2 2 3 +3 2 1 +4 2 1 +6 2 1 +10 2 1 +18 2 1 +34 2 1 +66 2 1 +130 2 1 +258 2 1 +1 3 1 +2 3 1 +3 3 5 +4 3 1 +5 3 1 +7 3 1 +11 3 1 +19 3 1 +35 3 1 +67 3 1 +131 3 1 +259 3 1 +2 4 1 +3 4 1 +4 4 7 +5 4 1 +6 4 1 +8 4 1 +12 4 1 +20 4 1 +36 4 1 +68 4 1 +132 4 1 +260 4 1 +1 5 1 +3 5 1 +4 5 1 +5 5 11 +6 5 1 +7 5 1 +9 5 1 +13 5 1 +21 5 1 +37 5 1 +69 5 1 +133 5 1 +261 5 1 +2 6 1 +4 6 1 +5 6 1 +6 6 13 +7 6 1 +8 6 1 +10 6 1 +14 6 1 +22 6 1 +38 6 1 +70 6 1 +134 6 1 +262 6 1 +3 7 1 +5 7 1 +6 7 1 +7 7 17 +8 7 1 +9 7 1 +11 7 1 +15 7 1 +23 7 1 +39 7 1 +71 7 1 +135 7 1 +263 7 1 +4 8 1 +6 8 1 +7 8 1 +8 8 19 +9 8 1 +10 8 1 +12 8 1 +16 8 1 +24 8 1 +40 8 1 +72 8 1 +136 8 1 +264 8 1 +1 9 1 +5 9 1 +7 9 1 +8 9 1 +9 9 23 +10 9 1 +11 9 1 +13 9 1 +17 9 1 +25 9 1 +41 9 1 +73 9 1 +137 9 1 +265 9 1 +2 10 1 +6 10 1 +8 10 1 +9 10 1 +10 10 29 +11 10 1 +12 10 1 +14 10 1 +18 10 1 +26 10 1 +42 10 1 +74 10 1 +138 10 1 +266 10 1 +3 11 1 +7 11 1 +9 11 1 +10 11 1 +11 11 31 +12 11 1 +13 11 1 +15 11 1 +19 11 1 +27 11 1 +43 11 1 +75 11 1 +139 11 1 +267 11 1 +4 12 1 +8 12 1 +10 12 1 +11 12 1 +12 12 37 +13 12 1 +14 12 1 +16 12 1 +20 12 1 +28 12 1 +44 12 1 +76 12 1 +140 12 1 +268 12 1 +5 13 1 +9 13 1 +11 13 1 +12 13 1 +13 13 41 +14 13 1 +15 13 1 +17 13 1 +21 13 1 +29 13 1 +45 13 1 +77 13 1 +141 13 1 +269 13 1 +6 14 1 +10 14 1 +12 14 1 +13 14 1 +14 14 43 +15 14 1 +16 14 1 +18 14 1 +22 14 1 +30 14 1 +46 14 1 +78 14 1 +142 14 1 +270 14 1 +7 15 1 +11 15 1 +13 15 1 +14 15 1 +15 15 47 +16 15 1 +17 15 1 +19 15 1 +23 15 1 +31 15 1 +47 15 1 +79 15 1 +143 15 1 +271 15 1 +8 16 1 +12 16 1 +14 16 1 +15 16 1 +16 16 53 +17 16 1 +18 16 1 +20 16 1 +24 16 1 +32 16 1 +48 16 1 +80 16 1 +144 16 1 +272 16 1 +1 17 1 +9 17 1 +13 17 1 +15 17 1 +16 17 1 +17 17 59 +18 17 1 +19 17 1 +21 17 1 +25 17 1 +33 17 1 +49 17 1 +81 17 1 +145 17 1 +273 17 1 +2 18 1 +10 18 1 +14 18 1 +16 18 1 +17 18 1 +18 18 61 +19 18 1 +20 18 1 +22 18 1 +26 18 1 +34 18 1 +50 18 1 +82 18 1 +146 18 1 +274 18 1 +3 19 1 +11 19 1 +15 19 1 +17 19 1 +18 19 1 +19 19 67 +20 19 1 +21 19 1 +23 19 1 +27 19 1 +35 19 1 +51 19 1 +83 19 1 +147 19 1 +275 19 1 +4 20 1 +12 20 1 +16 20 1 +18 20 1 +19 20 1 +20 20 71 +21 20 1 +22 20 1 +24 20 1 +28 20 1 +36 20 1 +52 20 1 +84 20 1 +148 20 1 +276 20 1 +5 21 1 +13 21 1 +17 21 1 +19 21 1 +20 21 1 +21 21 73 +22 21 1 +23 21 1 +25 21 1 +29 21 1 +37 21 1 +53 21 1 +85 21 1 +149 21 1 +277 21 1 +6 22 1 +14 22 1 +18 22 1 +20 22 1 +21 22 1 +22 22 79 +23 22 1 +24 22 1 +26 22 1 +30 22 1 +38 22 1 +54 22 1 +86 22 1 +150 22 1 +278 22 1 +7 23 1 +15 23 1 +19 23 1 +21 23 1 +22 23 1 +23 23 83 +24 23 1 +25 23 1 +27 23 1 +31 23 1 +39 23 1 +55 23 1 +87 23 1 +151 23 1 +279 23 1 +8 24 1 +16 24 1 +20 24 1 +22 24 1 +23 24 1 +24 24 89 +25 24 1 +26 24 1 +28 24 1 +32 24 1 +40 24 1 +56 24 1 +88 24 1 +152 24 1 +280 24 1 +9 25 1 +17 25 1 +21 25 1 +23 25 1 +24 25 1 +25 25 97 +26 25 1 +27 25 1 +29 25 1 +33 25 1 +41 25 1 +57 25 1 +89 25 1 +153 25 1 +281 25 1 +10 26 1 +18 26 1 +22 26 1 +24 26 1 +25 26 1 +26 26 101 +27 26 1 +28 26 1 +30 26 1 +34 26 1 +42 26 1 +58 26 1 +90 26 1 +154 26 1 +282 26 1 +11 27 1 +19 27 1 +23 27 1 +25 27 1 +26 27 1 +27 27 103 +28 27 1 +29 27 1 +31 27 1 +35 27 1 +43 27 1 +59 27 1 +91 27 1 +155 27 1 +283 27 1 +12 28 1 +20 28 1 +24 28 1 +26 28 1 +27 28 1 +28 28 107 +29 28 1 +30 28 1 +32 28 1 +36 28 1 +44 28 1 +60 28 1 +92 28 1 +156 28 1 +284 28 1 +13 29 1 +21 29 1 +25 29 1 +27 29 1 +28 29 1 +29 29 109 +30 29 1 +31 29 1 +33 29 1 +37 29 1 +45 29 1 +61 29 1 +93 29 1 +157 29 1 +285 29 1 +14 30 1 +22 30 1 +26 30 1 +28 30 1 +29 30 1 +30 30 113 +31 30 1 +32 30 1 +34 30 1 +38 30 1 +46 30 1 +62 30 1 +94 30 1 +158 30 1 +286 30 1 +15 31 1 +23 31 1 +27 31 1 +29 31 1 +30 31 1 +31 31 127 +32 31 1 +33 31 1 +35 31 1 +39 31 1 +47 31 1 +63 31 1 +95 31 1 +159 31 1 +287 31 1 +16 32 1 +24 32 1 +28 32 1 +30 32 1 +31 32 1 +32 32 131 +33 32 1 +34 32 1 +36 32 1 +40 32 1 +48 32 1 +64 32 1 +96 32 1 +160 32 1 +288 32 1 +1 33 1 +17 33 1 +25 33 1 +29 33 1 +31 33 1 +32 33 1 +33 33 137 +34 33 1 +35 33 1 +37 33 1 +41 33 1 +49 33 1 +65 33 1 +97 33 1 +161 33 1 +289 33 1 +2 34 1 +18 34 1 +26 34 1 +30 34 1 +32 34 1 +33 34 1 +34 34 139 +35 34 1 +36 34 1 +38 34 1 +42 34 1 +50 34 1 +66 34 1 +98 34 1 +162 34 1 +290 34 1 +3 35 1 +19 35 1 +27 35 1 +31 35 1 +33 35 1 +34 35 1 +35 35 149 +36 35 1 +37 35 1 +39 35 1 +43 35 1 +51 35 1 +67 35 1 +99 35 1 +163 35 1 +291 35 1 +4 36 1 +20 36 1 +28 36 1 +32 36 1 +34 36 1 +35 36 1 +36 36 151 +37 36 1 +38 36 1 +40 36 1 +44 36 1 +52 36 1 +68 36 1 +100 36 1 +164 36 1 +292 36 1 +5 37 1 +21 37 1 +29 37 1 +33 37 1 +35 37 1 +36 37 1 +37 37 157 +38 37 1 +39 37 1 +41 37 1 +45 37 1 +53 37 1 +69 37 1 +101 37 1 +165 37 1 +293 37 1 +6 38 1 +22 38 1 +30 38 1 +34 38 1 +36 38 1 +37 38 1 +38 38 163 +39 38 1 +40 38 1 +42 38 1 +46 38 1 +54 38 1 +70 38 1 +102 38 1 +166 38 1 +294 38 1 +7 39 1 +23 39 1 +31 39 1 +35 39 1 +37 39 1 +38 39 1 +39 39 167 +40 39 1 +41 39 1 +43 39 1 +47 39 1 +55 39 1 +71 39 1 +103 39 1 +167 39 1 +295 39 1 +8 40 1 +24 40 1 +32 40 1 +36 40 1 +38 40 1 +39 40 1 +40 40 173 +41 40 1 +42 40 1 +44 40 1 +48 40 1 +56 40 1 +72 40 1 +104 40 1 +168 40 1 +296 40 1 +9 41 1 +25 41 1 +33 41 1 +37 41 1 +39 41 1 +40 41 1 +41 41 179 +42 41 1 +43 41 1 +45 41 1 +49 41 1 +57 41 1 +73 41 1 +105 41 1 +169 41 1 +297 41 1 +10 42 1 +26 42 1 +34 42 1 +38 42 1 +40 42 1 +41 42 1 +42 42 181 +43 42 1 +44 42 1 +46 42 1 +50 42 1 +58 42 1 +74 42 1 +106 42 1 +170 42 1 +298 42 1 +11 43 1 +27 43 1 +35 43 1 +39 43 1 +41 43 1 +42 43 1 +43 43 191 +44 43 1 +45 43 1 +47 43 1 +51 43 1 +59 43 1 +75 43 1 +107 43 1 +171 43 1 +299 43 1 +12 44 1 +28 44 1 +36 44 1 +40 44 1 +42 44 1 +43 44 1 +44 44 193 +45 44 1 +46 44 1 +48 44 1 +52 44 1 +60 44 1 +76 44 1 +108 44 1 +172 44 1 +300 44 1 +13 45 1 +29 45 1 +37 45 1 +41 45 1 +43 45 1 +44 45 1 +45 45 197 +46 45 1 +47 45 1 +49 45 1 +53 45 1 +61 45 1 +77 45 1 +109 45 1 +173 45 1 +301 45 1 +14 46 1 +30 46 1 +38 46 1 +42 46 1 +44 46 1 +45 46 1 +46 46 199 +47 46 1 +48 46 1 +50 46 1 +54 46 1 +62 46 1 +78 46 1 +110 46 1 +174 46 1 +302 46 1 +15 47 1 +31 47 1 +39 47 1 +43 47 1 +45 47 1 +46 47 1 +47 47 211 +48 47 1 +49 47 1 +51 47 1 +55 47 1 +63 47 1 +79 47 1 +111 47 1 +175 47 1 +303 47 1 +16 48 1 +32 48 1 +40 48 1 +44 48 1 +46 48 1 +47 48 1 +48 48 223 +49 48 1 +50 48 1 +52 48 1 +56 48 1 +64 48 1 +80 48 1 +112 48 1 +176 48 1 +304 48 1 +17 49 1 +33 49 1 +41 49 1 +45 49 1 +47 49 1 +48 49 1 +49 49 227 +50 49 1 +51 49 1 +53 49 1 +57 49 1 +65 49 1 +81 49 1 +113 49 1 +177 49 1 +305 49 1 +18 50 1 +34 50 1 +42 50 1 +46 50 1 +48 50 1 +49 50 1 +50 50 229 +51 50 1 +52 50 1 +54 50 1 +58 50 1 +66 50 1 +82 50 1 +114 50 1 +178 50 1 +306 50 1 +19 51 1 +35 51 1 +43 51 1 +47 51 1 +49 51 1 +50 51 1 +51 51 233 +52 51 1 +53 51 1 +55 51 1 +59 51 1 +67 51 1 +83 51 1 +115 51 1 +179 51 1 +307 51 1 +20 52 1 +36 52 1 +44 52 1 +48 52 1 +50 52 1 +51 52 1 +52 52 239 +53 52 1 +54 52 1 +56 52 1 +60 52 1 +68 52 1 +84 52 1 +116 52 1 +180 52 1 +308 52 1 +21 53 1 +37 53 1 +45 53 1 +49 53 1 +51 53 1 +52 53 1 +53 53 241 +54 53 1 +55 53 1 +57 53 1 +61 53 1 +69 53 1 +85 53 1 +117 53 1 +181 53 1 +309 53 1 +22 54 1 +38 54 1 +46 54 1 +50 54 1 +52 54 1 +53 54 1 +54 54 251 +55 54 1 +56 54 1 +58 54 1 +62 54 1 +70 54 1 +86 54 1 +118 54 1 +182 54 1 +310 54 1 +23 55 1 +39 55 1 +47 55 1 +51 55 1 +53 55 1 +54 55 1 +55 55 257 +56 55 1 +57 55 1 +59 55 1 +63 55 1 +71 55 1 +87 55 1 +119 55 1 +183 55 1 +311 55 1 +24 56 1 +40 56 1 +48 56 1 +52 56 1 +54 56 1 +55 56 1 +56 56 263 +57 56 1 +58 56 1 +60 56 1 +64 56 1 +72 56 1 +88 56 1 +120 56 1 +184 56 1 +312 56 1 +25 57 1 +41 57 1 +49 57 1 +53 57 1 +55 57 1 +56 57 1 +57 57 269 +58 57 1 +59 57 1 +61 57 1 +65 57 1 +73 57 1 +89 57 1 +121 57 1 +185 57 1 +313 57 1 +26 58 1 +42 58 1 +50 58 1 +54 58 1 +56 58 1 +57 58 1 +58 58 271 +59 58 1 +60 58 1 +62 58 1 +66 58 1 +74 58 1 +90 58 1 +122 58 1 +186 58 1 +314 58 1 +27 59 1 +43 59 1 +51 59 1 +55 59 1 +57 59 1 +58 59 1 +59 59 277 +60 59 1 +61 59 1 +63 59 1 +67 59 1 +75 59 1 +91 59 1 +123 59 1 +187 59 1 +315 59 1 +28 60 1 +44 60 1 +52 60 1 +56 60 1 +58 60 1 +59 60 1 +60 60 281 +61 60 1 +62 60 1 +64 60 1 +68 60 1 +76 60 1 +92 60 1 +124 60 1 +188 60 1 +316 60 1 +29 61 1 +45 61 1 +53 61 1 +57 61 1 +59 61 1 +60 61 1 +61 61 283 +62 61 1 +63 61 1 +65 61 1 +69 61 1 +77 61 1 +93 61 1 +125 61 1 +189 61 1 +317 61 1 +30 62 1 +46 62 1 +54 62 1 +58 62 1 +60 62 1 +61 62 1 +62 62 293 +63 62 1 +64 62 1 +66 62 1 +70 62 1 +78 62 1 +94 62 1 +126 62 1 +190 62 1 +318 62 1 +31 63 1 +47 63 1 +55 63 1 +59 63 1 +61 63 1 +62 63 1 +63 63 307 +64 63 1 +65 63 1 +67 63 1 +71 63 1 +79 63 1 +95 63 1 +127 63 1 +191 63 1 +319 63 1 +32 64 1 +48 64 1 +56 64 1 +60 64 1 +62 64 1 +63 64 1 +64 64 311 +65 64 1 +66 64 1 +68 64 1 +72 64 1 +80 64 1 +96 64 1 +128 64 1 +192 64 1 +320 64 1 +1 65 1 +33 65 1 +49 65 1 +57 65 1 +61 65 1 +63 65 1 +64 65 1 +65 65 313 +66 65 1 +67 65 1 +69 65 1 +73 65 1 +81 65 1 +97 65 1 +129 65 1 +193 65 1 +321 65 1 +2 66 1 +34 66 1 +50 66 1 +58 66 1 +62 66 1 +64 66 1 +65 66 1 +66 66 317 +67 66 1 +68 66 1 +70 66 1 +74 66 1 +82 66 1 +98 66 1 +130 66 1 +194 66 1 +322 66 1 +3 67 1 +35 67 1 +51 67 1 +59 67 1 +63 67 1 +65 67 1 +66 67 1 +67 67 331 +68 67 1 +69 67 1 +71 67 1 +75 67 1 +83 67 1 +99 67 1 +131 67 1 +195 67 1 +323 67 1 +4 68 1 +36 68 1 +52 68 1 +60 68 1 +64 68 1 +66 68 1 +67 68 1 +68 68 337 +69 68 1 +70 68 1 +72 68 1 +76 68 1 +84 68 1 +100 68 1 +132 68 1 +196 68 1 +324 68 1 +5 69 1 +37 69 1 +53 69 1 +61 69 1 +65 69 1 +67 69 1 +68 69 1 +69 69 347 +70 69 1 +71 69 1 +73 69 1 +77 69 1 +85 69 1 +101 69 1 +133 69 1 +197 69 1 +325 69 1 +6 70 1 +38 70 1 +54 70 1 +62 70 1 +66 70 1 +68 70 1 +69 70 1 +70 70 349 +71 70 1 +72 70 1 +74 70 1 +78 70 1 +86 70 1 +102 70 1 +134 70 1 +198 70 1 +326 70 1 +7 71 1 +39 71 1 +55 71 1 +63 71 1 +67 71 1 +69 71 1 +70 71 1 +71 71 353 +72 71 1 +73 71 1 +75 71 1 +79 71 1 +87 71 1 +103 71 1 +135 71 1 +199 71 1 +327 71 1 +8 72 1 +40 72 1 +56 72 1 +64 72 1 +68 72 1 +70 72 1 +71 72 1 +72 72 359 +73 72 1 +74 72 1 +76 72 1 +80 72 1 +88 72 1 +104 72 1 +136 72 1 +200 72 1 +328 72 1 +9 73 1 +41 73 1 +57 73 1 +65 73 1 +69 73 1 +71 73 1 +72 73 1 +73 73 367 +74 73 1 +75 73 1 +77 73 1 +81 73 1 +89 73 1 +105 73 1 +137 73 1 +201 73 1 +329 73 1 +10 74 1 +42 74 1 +58 74 1 +66 74 1 +70 74 1 +72 74 1 +73 74 1 +74 74 373 +75 74 1 +76 74 1 +78 74 1 +82 74 1 +90 74 1 +106 74 1 +138 74 1 +202 74 1 +330 74 1 +11 75 1 +43 75 1 +59 75 1 +67 75 1 +71 75 1 +73 75 1 +74 75 1 +75 75 379 +76 75 1 +77 75 1 +79 75 1 +83 75 1 +91 75 1 +107 75 1 +139 75 1 +203 75 1 +331 75 1 +12 76 1 +44 76 1 +60 76 1 +68 76 1 +72 76 1 +74 76 1 +75 76 1 +76 76 383 +77 76 1 +78 76 1 +80 76 1 +84 76 1 +92 76 1 +108 76 1 +140 76 1 +204 76 1 +332 76 1 +13 77 1 +45 77 1 +61 77 1 +69 77 1 +73 77 1 +75 77 1 +76 77 1 +77 77 389 +78 77 1 +79 77 1 +81 77 1 +85 77 1 +93 77 1 +109 77 1 +141 77 1 +205 77 1 +333 77 1 +14 78 1 +46 78 1 +62 78 1 +70 78 1 +74 78 1 +76 78 1 +77 78 1 +78 78 397 +79 78 1 +80 78 1 +82 78 1 +86 78 1 +94 78 1 +110 78 1 +142 78 1 +206 78 1 +334 78 1 +15 79 1 +47 79 1 +63 79 1 +71 79 1 +75 79 1 +77 79 1 +78 79 1 +79 79 401 +80 79 1 +81 79 1 +83 79 1 +87 79 1 +95 79 1 +111 79 1 +143 79 1 +207 79 1 +335 79 1 +16 80 1 +48 80 1 +64 80 1 +72 80 1 +76 80 1 +78 80 1 +79 80 1 +80 80 409 +81 80 1 +82 80 1 +84 80 1 +88 80 1 +96 80 1 +112 80 1 +144 80 1 +208 80 1 +336 80 1 +17 81 1 +49 81 1 +65 81 1 +73 81 1 +77 81 1 +79 81 1 +80 81 1 +81 81 419 +82 81 1 +83 81 1 +85 81 1 +89 81 1 +97 81 1 +113 81 1 +145 81 1 +209 81 1 +337 81 1 +18 82 1 +50 82 1 +66 82 1 +74 82 1 +78 82 1 +80 82 1 +81 82 1 +82 82 421 +83 82 1 +84 82 1 +86 82 1 +90 82 1 +98 82 1 +114 82 1 +146 82 1 +210 82 1 +338 82 1 +19 83 1 +51 83 1 +67 83 1 +75 83 1 +79 83 1 +81 83 1 +82 83 1 +83 83 431 +84 83 1 +85 83 1 +87 83 1 +91 83 1 +99 83 1 +115 83 1 +147 83 1 +211 83 1 +339 83 1 +20 84 1 +52 84 1 +68 84 1 +76 84 1 +80 84 1 +82 84 1 +83 84 1 +84 84 433 +85 84 1 +86 84 1 +88 84 1 +92 84 1 +100 84 1 +116 84 1 +148 84 1 +212 84 1 +340 84 1 +21 85 1 +53 85 1 +69 85 1 +77 85 1 +81 85 1 +83 85 1 +84 85 1 +85 85 439 +86 85 1 +87 85 1 +89 85 1 +93 85 1 +101 85 1 +117 85 1 +149 85 1 +213 85 1 +341 85 1 +22 86 1 +54 86 1 +70 86 1 +78 86 1 +82 86 1 +84 86 1 +85 86 1 +86 86 443 +87 86 1 +88 86 1 +90 86 1 +94 86 1 +102 86 1 +118 86 1 +150 86 1 +214 86 1 +342 86 1 +23 87 1 +55 87 1 +71 87 1 +79 87 1 +83 87 1 +85 87 1 +86 87 1 +87 87 449 +88 87 1 +89 87 1 +91 87 1 +95 87 1 +103 87 1 +119 87 1 +151 87 1 +215 87 1 +343 87 1 +24 88 1 +56 88 1 +72 88 1 +80 88 1 +84 88 1 +86 88 1 +87 88 1 +88 88 457 +89 88 1 +90 88 1 +92 88 1 +96 88 1 +104 88 1 +120 88 1 +152 88 1 +216 88 1 +344 88 1 +25 89 1 +57 89 1 +73 89 1 +81 89 1 +85 89 1 +87 89 1 +88 89 1 +89 89 461 +90 89 1 +91 89 1 +93 89 1 +97 89 1 +105 89 1 +121 89 1 +153 89 1 +217 89 1 +345 89 1 +26 90 1 +58 90 1 +74 90 1 +82 90 1 +86 90 1 +88 90 1 +89 90 1 +90 90 463 +91 90 1 +92 90 1 +94 90 1 +98 90 1 +106 90 1 +122 90 1 +154 90 1 +218 90 1 +346 90 1 +27 91 1 +59 91 1 +75 91 1 +83 91 1 +87 91 1 +89 91 1 +90 91 1 +91 91 467 +92 91 1 +93 91 1 +95 91 1 +99 91 1 +107 91 1 +123 91 1 +155 91 1 +219 91 1 +347 91 1 +28 92 1 +60 92 1 +76 92 1 +84 92 1 +88 92 1 +90 92 1 +91 92 1 +92 92 479 +93 92 1 +94 92 1 +96 92 1 +100 92 1 +108 92 1 +124 92 1 +156 92 1 +220 92 1 +348 92 1 +29 93 1 +61 93 1 +77 93 1 +85 93 1 +89 93 1 +91 93 1 +92 93 1 +93 93 487 +94 93 1 +95 93 1 +97 93 1 +101 93 1 +109 93 1 +125 93 1 +157 93 1 +221 93 1 +349 93 1 +30 94 1 +62 94 1 +78 94 1 +86 94 1 +90 94 1 +92 94 1 +93 94 1 +94 94 491 +95 94 1 +96 94 1 +98 94 1 +102 94 1 +110 94 1 +126 94 1 +158 94 1 +222 94 1 +350 94 1 +31 95 1 +63 95 1 +79 95 1 +87 95 1 +91 95 1 +93 95 1 +94 95 1 +95 95 499 +96 95 1 +97 95 1 +99 95 1 +103 95 1 +111 95 1 +127 95 1 +159 95 1 +223 95 1 +351 95 1 +32 96 1 +64 96 1 +80 96 1 +88 96 1 +92 96 1 +94 96 1 +95 96 1 +96 96 503 +97 96 1 +98 96 1 +100 96 1 +104 96 1 +112 96 1 +128 96 1 +160 96 1 +224 96 1 +352 96 1 +33 97 1 +65 97 1 +81 97 1 +89 97 1 +93 97 1 +95 97 1 +96 97 1 +97 97 509 +98 97 1 +99 97 1 +101 97 1 +105 97 1 +113 97 1 +129 97 1 +161 97 1 +225 97 1 +353 97 1 +34 98 1 +66 98 1 +82 98 1 +90 98 1 +94 98 1 +96 98 1 +97 98 1 +98 98 521 +99 98 1 +100 98 1 +102 98 1 +106 98 1 +114 98 1 +130 98 1 +162 98 1 +226 98 1 +354 98 1 +35 99 1 +67 99 1 +83 99 1 +91 99 1 +95 99 1 +97 99 1 +98 99 1 +99 99 523 +100 99 1 +101 99 1 +103 99 1 +107 99 1 +115 99 1 +131 99 1 +163 99 1 +227 99 1 +355 99 1 +36 100 1 +68 100 1 +84 100 1 +92 100 1 +96 100 1 +98 100 1 +99 100 1 +100 100 541 +101 100 1 +102 100 1 +104 100 1 +108 100 1 +116 100 1 +132 100 1 +164 100 1 +228 100 1 +356 100 1 +37 101 1 +69 101 1 +85 101 1 +93 101 1 +97 101 1 +99 101 1 +100 101 1 +101 101 547 +102 101 1 +103 101 1 +105 101 1 +109 101 1 +117 101 1 +133 101 1 +165 101 1 +229 101 1 +357 101 1 +38 102 1 +70 102 1 +86 102 1 +94 102 1 +98 102 1 +100 102 1 +101 102 1 +102 102 557 +103 102 1 +104 102 1 +106 102 1 +110 102 1 +118 102 1 +134 102 1 +166 102 1 +230 102 1 +358 102 1 +39 103 1 +71 103 1 +87 103 1 +95 103 1 +99 103 1 +101 103 1 +102 103 1 +103 103 563 +104 103 1 +105 103 1 +107 103 1 +111 103 1 +119 103 1 +135 103 1 +167 103 1 +231 103 1 +359 103 1 +40 104 1 +72 104 1 +88 104 1 +96 104 1 +100 104 1 +102 104 1 +103 104 1 +104 104 569 +105 104 1 +106 104 1 +108 104 1 +112 104 1 +120 104 1 +136 104 1 +168 104 1 +232 104 1 +360 104 1 +41 105 1 +73 105 1 +89 105 1 +97 105 1 +101 105 1 +103 105 1 +104 105 1 +105 105 571 +106 105 1 +107 105 1 +109 105 1 +113 105 1 +121 105 1 +137 105 1 +169 105 1 +233 105 1 +361 105 1 +42 106 1 +74 106 1 +90 106 1 +98 106 1 +102 106 1 +104 106 1 +105 106 1 +106 106 577 +107 106 1 +108 106 1 +110 106 1 +114 106 1 +122 106 1 +138 106 1 +170 106 1 +234 106 1 +362 106 1 +43 107 1 +75 107 1 +91 107 1 +99 107 1 +103 107 1 +105 107 1 +106 107 1 +107 107 587 +108 107 1 +109 107 1 +111 107 1 +115 107 1 +123 107 1 +139 107 1 +171 107 1 +235 107 1 +363 107 1 +44 108 1 +76 108 1 +92 108 1 +100 108 1 +104 108 1 +106 108 1 +107 108 1 +108 108 593 +109 108 1 +110 108 1 +112 108 1 +116 108 1 +124 108 1 +140 108 1 +172 108 1 +236 108 1 +364 108 1 +45 109 1 +77 109 1 +93 109 1 +101 109 1 +105 109 1 +107 109 1 +108 109 1 +109 109 599 +110 109 1 +111 109 1 +113 109 1 +117 109 1 +125 109 1 +141 109 1 +173 109 1 +237 109 1 +365 109 1 +46 110 1 +78 110 1 +94 110 1 +102 110 1 +106 110 1 +108 110 1 +109 110 1 +110 110 601 +111 110 1 +112 110 1 +114 110 1 +118 110 1 +126 110 1 +142 110 1 +174 110 1 +238 110 1 +366 110 1 +47 111 1 +79 111 1 +95 111 1 +103 111 1 +107 111 1 +109 111 1 +110 111 1 +111 111 607 +112 111 1 +113 111 1 +115 111 1 +119 111 1 +127 111 1 +143 111 1 +175 111 1 +239 111 1 +367 111 1 +48 112 1 +80 112 1 +96 112 1 +104 112 1 +108 112 1 +110 112 1 +111 112 1 +112 112 613 +113 112 1 +114 112 1 +116 112 1 +120 112 1 +128 112 1 +144 112 1 +176 112 1 +240 112 1 +368 112 1 +49 113 1 +81 113 1 +97 113 1 +105 113 1 +109 113 1 +111 113 1 +112 113 1 +113 113 617 +114 113 1 +115 113 1 +117 113 1 +121 113 1 +129 113 1 +145 113 1 +177 113 1 +241 113 1 +369 113 1 +50 114 1 +82 114 1 +98 114 1 +106 114 1 +110 114 1 +112 114 1 +113 114 1 +114 114 619 +115 114 1 +116 114 1 +118 114 1 +122 114 1 +130 114 1 +146 114 1 +178 114 1 +242 114 1 +370 114 1 +51 115 1 +83 115 1 +99 115 1 +107 115 1 +111 115 1 +113 115 1 +114 115 1 +115 115 631 +116 115 1 +117 115 1 +119 115 1 +123 115 1 +131 115 1 +147 115 1 +179 115 1 +243 115 1 +371 115 1 +52 116 1 +84 116 1 +100 116 1 +108 116 1 +112 116 1 +114 116 1 +115 116 1 +116 116 641 +117 116 1 +118 116 1 +120 116 1 +124 116 1 +132 116 1 +148 116 1 +180 116 1 +244 116 1 +372 116 1 +53 117 1 +85 117 1 +101 117 1 +109 117 1 +113 117 1 +115 117 1 +116 117 1 +117 117 643 +118 117 1 +119 117 1 +121 117 1 +125 117 1 +133 117 1 +149 117 1 +181 117 1 +245 117 1 +373 117 1 +54 118 1 +86 118 1 +102 118 1 +110 118 1 +114 118 1 +116 118 1 +117 118 1 +118 118 647 +119 118 1 +120 118 1 +122 118 1 +126 118 1 +134 118 1 +150 118 1 +182 118 1 +246 118 1 +374 118 1 +55 119 1 +87 119 1 +103 119 1 +111 119 1 +115 119 1 +117 119 1 +118 119 1 +119 119 653 +120 119 1 +121 119 1 +123 119 1 +127 119 1 +135 119 1 +151 119 1 +183 119 1 +247 119 1 +375 119 1 +56 120 1 +88 120 1 +104 120 1 +112 120 1 +116 120 1 +118 120 1 +119 120 1 +120 120 659 +121 120 1 +122 120 1 +124 120 1 +128 120 1 +136 120 1 +152 120 1 +184 120 1 +248 120 1 +376 120 1 +57 121 1 +89 121 1 +105 121 1 +113 121 1 +117 121 1 +119 121 1 +120 121 1 +121 121 661 +122 121 1 +123 121 1 +125 121 1 +129 121 1 +137 121 1 +153 121 1 +185 121 1 +249 121 1 +377 121 1 +58 122 1 +90 122 1 +106 122 1 +114 122 1 +118 122 1 +120 122 1 +121 122 1 +122 122 673 +123 122 1 +124 122 1 +126 122 1 +130 122 1 +138 122 1 +154 122 1 +186 122 1 +250 122 1 +378 122 1 +59 123 1 +91 123 1 +107 123 1 +115 123 1 +119 123 1 +121 123 1 +122 123 1 +123 123 677 +124 123 1 +125 123 1 +127 123 1 +131 123 1 +139 123 1 +155 123 1 +187 123 1 +251 123 1 +379 123 1 +60 124 1 +92 124 1 +108 124 1 +116 124 1 +120 124 1 +122 124 1 +123 124 1 +124 124 683 +125 124 1 +126 124 1 +128 124 1 +132 124 1 +140 124 1 +156 124 1 +188 124 1 +252 124 1 +380 124 1 +61 125 1 +93 125 1 +109 125 1 +117 125 1 +121 125 1 +123 125 1 +124 125 1 +125 125 691 +126 125 1 +127 125 1 +129 125 1 +133 125 1 +141 125 1 +157 125 1 +189 125 1 +253 125 1 +381 125 1 +62 126 1 +94 126 1 +110 126 1 +118 126 1 +122 126 1 +124 126 1 +125 126 1 +126 126 701 +127 126 1 +128 126 1 +130 126 1 +134 126 1 +142 126 1 +158 126 1 +190 126 1 +254 126 1 +382 126 1 +63 127 1 +95 127 1 +111 127 1 +119 127 1 +123 127 1 +125 127 1 +126 127 1 +127 127 709 +128 127 1 +129 127 1 +131 127 1 +135 127 1 +143 127 1 +159 127 1 +191 127 1 +255 127 1 +383 127 1 +64 128 1 +96 128 1 +112 128 1 +120 128 1 +124 128 1 +126 128 1 +127 128 1 +128 128 719 +129 128 1 +130 128 1 +132 128 1 +136 128 1 +144 128 1 +160 128 1 +192 128 1 +256 128 1 +384 128 1 +1 129 1 +65 129 1 +97 129 1 +113 129 1 +121 129 1 +125 129 1 +127 129 1 +128 129 1 +129 129 727 +130 129 1 +131 129 1 +133 129 1 +137 129 1 +145 129 1 +161 129 1 +193 129 1 +257 129 1 +385 129 1 +2 130 1 +66 130 1 +98 130 1 +114 130 1 +122 130 1 +126 130 1 +128 130 1 +129 130 1 +130 130 733 +131 130 1 +132 130 1 +134 130 1 +138 130 1 +146 130 1 +162 130 1 +194 130 1 +258 130 1 +386 130 1 +3 131 1 +67 131 1 +99 131 1 +115 131 1 +123 131 1 +127 131 1 +129 131 1 +130 131 1 +131 131 739 +132 131 1 +133 131 1 +135 131 1 +139 131 1 +147 131 1 +163 131 1 +195 131 1 +259 131 1 +387 131 1 +4 132 1 +68 132 1 +100 132 1 +116 132 1 +124 132 1 +128 132 1 +130 132 1 +131 132 1 +132 132 743 +133 132 1 +134 132 1 +136 132 1 +140 132 1 +148 132 1 +164 132 1 +196 132 1 +260 132 1 +388 132 1 +5 133 1 +69 133 1 +101 133 1 +117 133 1 +125 133 1 +129 133 1 +131 133 1 +132 133 1 +133 133 751 +134 133 1 +135 133 1 +137 133 1 +141 133 1 +149 133 1 +165 133 1 +197 133 1 +261 133 1 +389 133 1 +6 134 1 +70 134 1 +102 134 1 +118 134 1 +126 134 1 +130 134 1 +132 134 1 +133 134 1 +134 134 757 +135 134 1 +136 134 1 +138 134 1 +142 134 1 +150 134 1 +166 134 1 +198 134 1 +262 134 1 +390 134 1 +7 135 1 +71 135 1 +103 135 1 +119 135 1 +127 135 1 +131 135 1 +133 135 1 +134 135 1 +135 135 761 +136 135 1 +137 135 1 +139 135 1 +143 135 1 +151 135 1 +167 135 1 +199 135 1 +263 135 1 +391 135 1 +8 136 1 +72 136 1 +104 136 1 +120 136 1 +128 136 1 +132 136 1 +134 136 1 +135 136 1 +136 136 769 +137 136 1 +138 136 1 +140 136 1 +144 136 1 +152 136 1 +168 136 1 +200 136 1 +264 136 1 +392 136 1 +9 137 1 +73 137 1 +105 137 1 +121 137 1 +129 137 1 +133 137 1 +135 137 1 +136 137 1 +137 137 773 +138 137 1 +139 137 1 +141 137 1 +145 137 1 +153 137 1 +169 137 1 +201 137 1 +265 137 1 +393 137 1 +10 138 1 +74 138 1 +106 138 1 +122 138 1 +130 138 1 +134 138 1 +136 138 1 +137 138 1 +138 138 787 +139 138 1 +140 138 1 +142 138 1 +146 138 1 +154 138 1 +170 138 1 +202 138 1 +266 138 1 +394 138 1 +11 139 1 +75 139 1 +107 139 1 +123 139 1 +131 139 1 +135 139 1 +137 139 1 +138 139 1 +139 139 797 +140 139 1 +141 139 1 +143 139 1 +147 139 1 +155 139 1 +171 139 1 +203 139 1 +267 139 1 +395 139 1 +12 140 1 +76 140 1 +108 140 1 +124 140 1 +132 140 1 +136 140 1 +138 140 1 +139 140 1 +140 140 809 +141 140 1 +142 140 1 +144 140 1 +148 140 1 +156 140 1 +172 140 1 +204 140 1 +268 140 1 +396 140 1 +13 141 1 +77 141 1 +109 141 1 +125 141 1 +133 141 1 +137 141 1 +139 141 1 +140 141 1 +141 141 811 +142 141 1 +143 141 1 +145 141 1 +149 141 1 +157 141 1 +173 141 1 +205 141 1 +269 141 1 +397 141 1 +14 142 1 +78 142 1 +110 142 1 +126 142 1 +134 142 1 +138 142 1 +140 142 1 +141 142 1 +142 142 821 +143 142 1 +144 142 1 +146 142 1 +150 142 1 +158 142 1 +174 142 1 +206 142 1 +270 142 1 +398 142 1 +15 143 1 +79 143 1 +111 143 1 +127 143 1 +135 143 1 +139 143 1 +141 143 1 +142 143 1 +143 143 823 +144 143 1 +145 143 1 +147 143 1 +151 143 1 +159 143 1 +175 143 1 +207 143 1 +271 143 1 +399 143 1 +16 144 1 +80 144 1 +112 144 1 +128 144 1 +136 144 1 +140 144 1 +142 144 1 +143 144 1 +144 144 827 +145 144 1 +146 144 1 +148 144 1 +152 144 1 +160 144 1 +176 144 1 +208 144 1 +272 144 1 +400 144 1 +17 145 1 +81 145 1 +113 145 1 +129 145 1 +137 145 1 +141 145 1 +143 145 1 +144 145 1 +145 145 829 +146 145 1 +147 145 1 +149 145 1 +153 145 1 +161 145 1 +177 145 1 +209 145 1 +273 145 1 +401 145 1 +18 146 1 +82 146 1 +114 146 1 +130 146 1 +138 146 1 +142 146 1 +144 146 1 +145 146 1 +146 146 839 +147 146 1 +148 146 1 +150 146 1 +154 146 1 +162 146 1 +178 146 1 +210 146 1 +274 146 1 +402 146 1 +19 147 1 +83 147 1 +115 147 1 +131 147 1 +139 147 1 +143 147 1 +145 147 1 +146 147 1 +147 147 853 +148 147 1 +149 147 1 +151 147 1 +155 147 1 +163 147 1 +179 147 1 +211 147 1 +275 147 1 +403 147 1 +20 148 1 +84 148 1 +116 148 1 +132 148 1 +140 148 1 +144 148 1 +146 148 1 +147 148 1 +148 148 857 +149 148 1 +150 148 1 +152 148 1 +156 148 1 +164 148 1 +180 148 1 +212 148 1 +276 148 1 +404 148 1 +21 149 1 +85 149 1 +117 149 1 +133 149 1 +141 149 1 +145 149 1 +147 149 1 +148 149 1 +149 149 859 +150 149 1 +151 149 1 +153 149 1 +157 149 1 +165 149 1 +181 149 1 +213 149 1 +277 149 1 +405 149 1 +22 150 1 +86 150 1 +118 150 1 +134 150 1 +142 150 1 +146 150 1 +148 150 1 +149 150 1 +150 150 863 +151 150 1 +152 150 1 +154 150 1 +158 150 1 +166 150 1 +182 150 1 +214 150 1 +278 150 1 +406 150 1 +23 151 1 +87 151 1 +119 151 1 +135 151 1 +143 151 1 +147 151 1 +149 151 1 +150 151 1 +151 151 877 +152 151 1 +153 151 1 +155 151 1 +159 151 1 +167 151 1 +183 151 1 +215 151 1 +279 151 1 +407 151 1 +24 152 1 +88 152 1 +120 152 1 +136 152 1 +144 152 1 +148 152 1 +150 152 1 +151 152 1 +152 152 881 +153 152 1 +154 152 1 +156 152 1 +160 152 1 +168 152 1 +184 152 1 +216 152 1 +280 152 1 +408 152 1 +25 153 1 +89 153 1 +121 153 1 +137 153 1 +145 153 1 +149 153 1 +151 153 1 +152 153 1 +153 153 883 +154 153 1 +155 153 1 +157 153 1 +161 153 1 +169 153 1 +185 153 1 +217 153 1 +281 153 1 +409 153 1 +26 154 1 +90 154 1 +122 154 1 +138 154 1 +146 154 1 +150 154 1 +152 154 1 +153 154 1 +154 154 887 +155 154 1 +156 154 1 +158 154 1 +162 154 1 +170 154 1 +186 154 1 +218 154 1 +282 154 1 +410 154 1 +27 155 1 +91 155 1 +123 155 1 +139 155 1 +147 155 1 +151 155 1 +153 155 1 +154 155 1 +155 155 907 +156 155 1 +157 155 1 +159 155 1 +163 155 1 +171 155 1 +187 155 1 +219 155 1 +283 155 1 +411 155 1 +28 156 1 +92 156 1 +124 156 1 +140 156 1 +148 156 1 +152 156 1 +154 156 1 +155 156 1 +156 156 911 +157 156 1 +158 156 1 +160 156 1 +164 156 1 +172 156 1 +188 156 1 +220 156 1 +284 156 1 +412 156 1 +29 157 1 +93 157 1 +125 157 1 +141 157 1 +149 157 1 +153 157 1 +155 157 1 +156 157 1 +157 157 919 +158 157 1 +159 157 1 +161 157 1 +165 157 1 +173 157 1 +189 157 1 +221 157 1 +285 157 1 +413 157 1 +30 158 1 +94 158 1 +126 158 1 +142 158 1 +150 158 1 +154 158 1 +156 158 1 +157 158 1 +158 158 929 +159 158 1 +160 158 1 +162 158 1 +166 158 1 +174 158 1 +190 158 1 +222 158 1 +286 158 1 +414 158 1 +31 159 1 +95 159 1 +127 159 1 +143 159 1 +151 159 1 +155 159 1 +157 159 1 +158 159 1 +159 159 937 +160 159 1 +161 159 1 +163 159 1 +167 159 1 +175 159 1 +191 159 1 +223 159 1 +287 159 1 +415 159 1 +32 160 1 +96 160 1 +128 160 1 +144 160 1 +152 160 1 +156 160 1 +158 160 1 +159 160 1 +160 160 941 +161 160 1 +162 160 1 +164 160 1 +168 160 1 +176 160 1 +192 160 1 +224 160 1 +288 160 1 +416 160 1 +33 161 1 +97 161 1 +129 161 1 +145 161 1 +153 161 1 +157 161 1 +159 161 1 +160 161 1 +161 161 947 +162 161 1 +163 161 1 +165 161 1 +169 161 1 +177 161 1 +193 161 1 +225 161 1 +289 161 1 +417 161 1 +34 162 1 +98 162 1 +130 162 1 +146 162 1 +154 162 1 +158 162 1 +160 162 1 +161 162 1 +162 162 953 +163 162 1 +164 162 1 +166 162 1 +170 162 1 +178 162 1 +194 162 1 +226 162 1 +290 162 1 +418 162 1 +35 163 1 +99 163 1 +131 163 1 +147 163 1 +155 163 1 +159 163 1 +161 163 1 +162 163 1 +163 163 967 +164 163 1 +165 163 1 +167 163 1 +171 163 1 +179 163 1 +195 163 1 +227 163 1 +291 163 1 +419 163 1 +36 164 1 +100 164 1 +132 164 1 +148 164 1 +156 164 1 +160 164 1 +162 164 1 +163 164 1 +164 164 971 +165 164 1 +166 164 1 +168 164 1 +172 164 1 +180 164 1 +196 164 1 +228 164 1 +292 164 1 +420 164 1 +37 165 1 +101 165 1 +133 165 1 +149 165 1 +157 165 1 +161 165 1 +163 165 1 +164 165 1 +165 165 977 +166 165 1 +167 165 1 +169 165 1 +173 165 1 +181 165 1 +197 165 1 +229 165 1 +293 165 1 +421 165 1 +38 166 1 +102 166 1 +134 166 1 +150 166 1 +158 166 1 +162 166 1 +164 166 1 +165 166 1 +166 166 983 +167 166 1 +168 166 1 +170 166 1 +174 166 1 +182 166 1 +198 166 1 +230 166 1 +294 166 1 +422 166 1 +39 167 1 +103 167 1 +135 167 1 +151 167 1 +159 167 1 +163 167 1 +165 167 1 +166 167 1 +167 167 991 +168 167 1 +169 167 1 +171 167 1 +175 167 1 +183 167 1 +199 167 1 +231 167 1 +295 167 1 +423 167 1 +40 168 1 +104 168 1 +136 168 1 +152 168 1 +160 168 1 +164 168 1 +166 168 1 +167 168 1 +168 168 997 +169 168 1 +170 168 1 +172 168 1 +176 168 1 +184 168 1 +200 168 1 +232 168 1 +296 168 1 +424 168 1 +41 169 1 +105 169 1 +137 169 1 +153 169 1 +161 169 1 +165 169 1 +167 169 1 +168 169 1 +169 169 1009 +170 169 1 +171 169 1 +173 169 1 +177 169 1 +185 169 1 +201 169 1 +233 169 1 +297 169 1 +425 169 1 +42 170 1 +106 170 1 +138 170 1 +154 170 1 +162 170 1 +166 170 1 +168 170 1 +169 170 1 +170 170 1013 +171 170 1 +172 170 1 +174 170 1 +178 170 1 +186 170 1 +202 170 1 +234 170 1 +298 170 1 +426 170 1 +43 171 1 +107 171 1 +139 171 1 +155 171 1 +163 171 1 +167 171 1 +169 171 1 +170 171 1 +171 171 1019 +172 171 1 +173 171 1 +175 171 1 +179 171 1 +187 171 1 +203 171 1 +235 171 1 +299 171 1 +427 171 1 +44 172 1 +108 172 1 +140 172 1 +156 172 1 +164 172 1 +168 172 1 +170 172 1 +171 172 1 +172 172 1021 +173 172 1 +174 172 1 +176 172 1 +180 172 1 +188 172 1 +204 172 1 +236 172 1 +300 172 1 +428 172 1 +45 173 1 +109 173 1 +141 173 1 +157 173 1 +165 173 1 +169 173 1 +171 173 1 +172 173 1 +173 173 1031 +174 173 1 +175 173 1 +177 173 1 +181 173 1 +189 173 1 +205 173 1 +237 173 1 +301 173 1 +429 173 1 +46 174 1 +110 174 1 +142 174 1 +158 174 1 +166 174 1 +170 174 1 +172 174 1 +173 174 1 +174 174 1033 +175 174 1 +176 174 1 +178 174 1 +182 174 1 +190 174 1 +206 174 1 +238 174 1 +302 174 1 +430 174 1 +47 175 1 +111 175 1 +143 175 1 +159 175 1 +167 175 1 +171 175 1 +173 175 1 +174 175 1 +175 175 1039 +176 175 1 +177 175 1 +179 175 1 +183 175 1 +191 175 1 +207 175 1 +239 175 1 +303 175 1 +431 175 1 +48 176 1 +112 176 1 +144 176 1 +160 176 1 +168 176 1 +172 176 1 +174 176 1 +175 176 1 +176 176 1049 +177 176 1 +178 176 1 +180 176 1 +184 176 1 +192 176 1 +208 176 1 +240 176 1 +304 176 1 +432 176 1 +49 177 1 +113 177 1 +145 177 1 +161 177 1 +169 177 1 +173 177 1 +175 177 1 +176 177 1 +177 177 1051 +178 177 1 +179 177 1 +181 177 1 +185 177 1 +193 177 1 +209 177 1 +241 177 1 +305 177 1 +433 177 1 +50 178 1 +114 178 1 +146 178 1 +162 178 1 +170 178 1 +174 178 1 +176 178 1 +177 178 1 +178 178 1061 +179 178 1 +180 178 1 +182 178 1 +186 178 1 +194 178 1 +210 178 1 +242 178 1 +306 178 1 +434 178 1 +51 179 1 +115 179 1 +147 179 1 +163 179 1 +171 179 1 +175 179 1 +177 179 1 +178 179 1 +179 179 1063 +180 179 1 +181 179 1 +183 179 1 +187 179 1 +195 179 1 +211 179 1 +243 179 1 +307 179 1 +435 179 1 +52 180 1 +116 180 1 +148 180 1 +164 180 1 +172 180 1 +176 180 1 +178 180 1 +179 180 1 +180 180 1069 +181 180 1 +182 180 1 +184 180 1 +188 180 1 +196 180 1 +212 180 1 +244 180 1 +308 180 1 +436 180 1 +53 181 1 +117 181 1 +149 181 1 +165 181 1 +173 181 1 +177 181 1 +179 181 1 +180 181 1 +181 181 1087 +182 181 1 +183 181 1 +185 181 1 +189 181 1 +197 181 1 +213 181 1 +245 181 1 +309 181 1 +437 181 1 +54 182 1 +118 182 1 +150 182 1 +166 182 1 +174 182 1 +178 182 1 +180 182 1 +181 182 1 +182 182 1091 +183 182 1 +184 182 1 +186 182 1 +190 182 1 +198 182 1 +214 182 1 +246 182 1 +310 182 1 +438 182 1 +55 183 1 +119 183 1 +151 183 1 +167 183 1 +175 183 1 +179 183 1 +181 183 1 +182 183 1 +183 183 1093 +184 183 1 +185 183 1 +187 183 1 +191 183 1 +199 183 1 +215 183 1 +247 183 1 +311 183 1 +439 183 1 +56 184 1 +120 184 1 +152 184 1 +168 184 1 +176 184 1 +180 184 1 +182 184 1 +183 184 1 +184 184 1097 +185 184 1 +186 184 1 +188 184 1 +192 184 1 +200 184 1 +216 184 1 +248 184 1 +312 184 1 +440 184 1 +57 185 1 +121 185 1 +153 185 1 +169 185 1 +177 185 1 +181 185 1 +183 185 1 +184 185 1 +185 185 1103 +186 185 1 +187 185 1 +189 185 1 +193 185 1 +201 185 1 +217 185 1 +249 185 1 +313 185 1 +441 185 1 +58 186 1 +122 186 1 +154 186 1 +170 186 1 +178 186 1 +182 186 1 +184 186 1 +185 186 1 +186 186 1109 +187 186 1 +188 186 1 +190 186 1 +194 186 1 +202 186 1 +218 186 1 +250 186 1 +314 186 1 +442 186 1 +59 187 1 +123 187 1 +155 187 1 +171 187 1 +179 187 1 +183 187 1 +185 187 1 +186 187 1 +187 187 1117 +188 187 1 +189 187 1 +191 187 1 +195 187 1 +203 187 1 +219 187 1 +251 187 1 +315 187 1 +443 187 1 +60 188 1 +124 188 1 +156 188 1 +172 188 1 +180 188 1 +184 188 1 +186 188 1 +187 188 1 +188 188 1123 +189 188 1 +190 188 1 +192 188 1 +196 188 1 +204 188 1 +220 188 1 +252 188 1 +316 188 1 +444 188 1 +61 189 1 +125 189 1 +157 189 1 +173 189 1 +181 189 1 +185 189 1 +187 189 1 +188 189 1 +189 189 1129 +190 189 1 +191 189 1 +193 189 1 +197 189 1 +205 189 1 +221 189 1 +253 189 1 +317 189 1 +445 189 1 +62 190 1 +126 190 1 +158 190 1 +174 190 1 +182 190 1 +186 190 1 +188 190 1 +189 190 1 +190 190 1151 +191 190 1 +192 190 1 +194 190 1 +198 190 1 +206 190 1 +222 190 1 +254 190 1 +318 190 1 +446 190 1 +63 191 1 +127 191 1 +159 191 1 +175 191 1 +183 191 1 +187 191 1 +189 191 1 +190 191 1 +191 191 1153 +192 191 1 +193 191 1 +195 191 1 +199 191 1 +207 191 1 +223 191 1 +255 191 1 +319 191 1 +447 191 1 +64 192 1 +128 192 1 +160 192 1 +176 192 1 +184 192 1 +188 192 1 +190 192 1 +191 192 1 +192 192 1163 +193 192 1 +194 192 1 +196 192 1 +200 192 1 +208 192 1 +224 192 1 +256 192 1 +320 192 1 +448 192 1 +65 193 1 +129 193 1 +161 193 1 +177 193 1 +185 193 1 +189 193 1 +191 193 1 +192 193 1 +193 193 1171 +194 193 1 +195 193 1 +197 193 1 +201 193 1 +209 193 1 +225 193 1 +257 193 1 +321 193 1 +449 193 1 +66 194 1 +130 194 1 +162 194 1 +178 194 1 +186 194 1 +190 194 1 +192 194 1 +193 194 1 +194 194 1181 +195 194 1 +196 194 1 +198 194 1 +202 194 1 +210 194 1 +226 194 1 +258 194 1 +322 194 1 +450 194 1 +67 195 1 +131 195 1 +163 195 1 +179 195 1 +187 195 1 +191 195 1 +193 195 1 +194 195 1 +195 195 1187 +196 195 1 +197 195 1 +199 195 1 +203 195 1 +211 195 1 +227 195 1 +259 195 1 +323 195 1 +451 195 1 +68 196 1 +132 196 1 +164 196 1 +180 196 1 +188 196 1 +192 196 1 +194 196 1 +195 196 1 +196 196 1193 +197 196 1 +198 196 1 +200 196 1 +204 196 1 +212 196 1 +228 196 1 +260 196 1 +324 196 1 +452 196 1 +69 197 1 +133 197 1 +165 197 1 +181 197 1 +189 197 1 +193 197 1 +195 197 1 +196 197 1 +197 197 1201 +198 197 1 +199 197 1 +201 197 1 +205 197 1 +213 197 1 +229 197 1 +261 197 1 +325 197 1 +453 197 1 +70 198 1 +134 198 1 +166 198 1 +182 198 1 +190 198 1 +194 198 1 +196 198 1 +197 198 1 +198 198 1213 +199 198 1 +200 198 1 +202 198 1 +206 198 1 +214 198 1 +230 198 1 +262 198 1 +326 198 1 +454 198 1 +71 199 1 +135 199 1 +167 199 1 +183 199 1 +191 199 1 +195 199 1 +197 199 1 +198 199 1 +199 199 1217 +200 199 1 +201 199 1 +203 199 1 +207 199 1 +215 199 1 +231 199 1 +263 199 1 +327 199 1 +455 199 1 +72 200 1 +136 200 1 +168 200 1 +184 200 1 +192 200 1 +196 200 1 +198 200 1 +199 200 1 +200 200 1223 +201 200 1 +202 200 1 +204 200 1 +208 200 1 +216 200 1 +232 200 1 +264 200 1 +328 200 1 +456 200 1 +73 201 1 +137 201 1 +169 201 1 +185 201 1 +193 201 1 +197 201 1 +199 201 1 +200 201 1 +201 201 1229 +202 201 1 +203 201 1 +205 201 1 +209 201 1 +217 201 1 +233 201 1 +265 201 1 +329 201 1 +457 201 1 +74 202 1 +138 202 1 +170 202 1 +186 202 1 +194 202 1 +198 202 1 +200 202 1 +201 202 1 +202 202 1231 +203 202 1 +204 202 1 +206 202 1 +210 202 1 +218 202 1 +234 202 1 +266 202 1 +330 202 1 +458 202 1 +75 203 1 +139 203 1 +171 203 1 +187 203 1 +195 203 1 +199 203 1 +201 203 1 +202 203 1 +203 203 1237 +204 203 1 +205 203 1 +207 203 1 +211 203 1 +219 203 1 +235 203 1 +267 203 1 +331 203 1 +459 203 1 +76 204 1 +140 204 1 +172 204 1 +188 204 1 +196 204 1 +200 204 1 +202 204 1 +203 204 1 +204 204 1249 +205 204 1 +206 204 1 +208 204 1 +212 204 1 +220 204 1 +236 204 1 +268 204 1 +332 204 1 +460 204 1 +77 205 1 +141 205 1 +173 205 1 +189 205 1 +197 205 1 +201 205 1 +203 205 1 +204 205 1 +205 205 1259 +206 205 1 +207 205 1 +209 205 1 +213 205 1 +221 205 1 +237 205 1 +269 205 1 +333 205 1 +461 205 1 +78 206 1 +142 206 1 +174 206 1 +190 206 1 +198 206 1 +202 206 1 +204 206 1 +205 206 1 +206 206 1277 +207 206 1 +208 206 1 +210 206 1 +214 206 1 +222 206 1 +238 206 1 +270 206 1 +334 206 1 +462 206 1 +79 207 1 +143 207 1 +175 207 1 +191 207 1 +199 207 1 +203 207 1 +205 207 1 +206 207 1 +207 207 1279 +208 207 1 +209 207 1 +211 207 1 +215 207 1 +223 207 1 +239 207 1 +271 207 1 +335 207 1 +463 207 1 +80 208 1 +144 208 1 +176 208 1 +192 208 1 +200 208 1 +204 208 1 +206 208 1 +207 208 1 +208 208 1283 +209 208 1 +210 208 1 +212 208 1 +216 208 1 +224 208 1 +240 208 1 +272 208 1 +336 208 1 +464 208 1 +81 209 1 +145 209 1 +177 209 1 +193 209 1 +201 209 1 +205 209 1 +207 209 1 +208 209 1 +209 209 1289 +210 209 1 +211 209 1 +213 209 1 +217 209 1 +225 209 1 +241 209 1 +273 209 1 +337 209 1 +465 209 1 +82 210 1 +146 210 1 +178 210 1 +194 210 1 +202 210 1 +206 210 1 +208 210 1 +209 210 1 +210 210 1291 +211 210 1 +212 210 1 +214 210 1 +218 210 1 +226 210 1 +242 210 1 +274 210 1 +338 210 1 +466 210 1 +83 211 1 +147 211 1 +179 211 1 +195 211 1 +203 211 1 +207 211 1 +209 211 1 +210 211 1 +211 211 1297 +212 211 1 +213 211 1 +215 211 1 +219 211 1 +227 211 1 +243 211 1 +275 211 1 +339 211 1 +467 211 1 +84 212 1 +148 212 1 +180 212 1 +196 212 1 +204 212 1 +208 212 1 +210 212 1 +211 212 1 +212 212 1301 +213 212 1 +214 212 1 +216 212 1 +220 212 1 +228 212 1 +244 212 1 +276 212 1 +340 212 1 +468 212 1 +85 213 1 +149 213 1 +181 213 1 +197 213 1 +205 213 1 +209 213 1 +211 213 1 +212 213 1 +213 213 1303 +214 213 1 +215 213 1 +217 213 1 +221 213 1 +229 213 1 +245 213 1 +277 213 1 +341 213 1 +469 213 1 +86 214 1 +150 214 1 +182 214 1 +198 214 1 +206 214 1 +210 214 1 +212 214 1 +213 214 1 +214 214 1307 +215 214 1 +216 214 1 +218 214 1 +222 214 1 +230 214 1 +246 214 1 +278 214 1 +342 214 1 +470 214 1 +87 215 1 +151 215 1 +183 215 1 +199 215 1 +207 215 1 +211 215 1 +213 215 1 +214 215 1 +215 215 1319 +216 215 1 +217 215 1 +219 215 1 +223 215 1 +231 215 1 +247 215 1 +279 215 1 +343 215 1 +471 215 1 +88 216 1 +152 216 1 +184 216 1 +200 216 1 +208 216 1 +212 216 1 +214 216 1 +215 216 1 +216 216 1321 +217 216 1 +218 216 1 +220 216 1 +224 216 1 +232 216 1 +248 216 1 +280 216 1 +344 216 1 +472 216 1 +89 217 1 +153 217 1 +185 217 1 +201 217 1 +209 217 1 +213 217 1 +215 217 1 +216 217 1 +217 217 1327 +218 217 1 +219 217 1 +221 217 1 +225 217 1 +233 217 1 +249 217 1 +281 217 1 +345 217 1 +473 217 1 +90 218 1 +154 218 1 +186 218 1 +202 218 1 +210 218 1 +214 218 1 +216 218 1 +217 218 1 +218 218 1361 +219 218 1 +220 218 1 +222 218 1 +226 218 1 +234 218 1 +250 218 1 +282 218 1 +346 218 1 +474 218 1 +91 219 1 +155 219 1 +187 219 1 +203 219 1 +211 219 1 +215 219 1 +217 219 1 +218 219 1 +219 219 1367 +220 219 1 +221 219 1 +223 219 1 +227 219 1 +235 219 1 +251 219 1 +283 219 1 +347 219 1 +475 219 1 +92 220 1 +156 220 1 +188 220 1 +204 220 1 +212 220 1 +216 220 1 +218 220 1 +219 220 1 +220 220 1373 +221 220 1 +222 220 1 +224 220 1 +228 220 1 +236 220 1 +252 220 1 +284 220 1 +348 220 1 +476 220 1 +93 221 1 +157 221 1 +189 221 1 +205 221 1 +213 221 1 +217 221 1 +219 221 1 +220 221 1 +221 221 1381 +222 221 1 +223 221 1 +225 221 1 +229 221 1 +237 221 1 +253 221 1 +285 221 1 +349 221 1 +477 221 1 +94 222 1 +158 222 1 +190 222 1 +206 222 1 +214 222 1 +218 222 1 +220 222 1 +221 222 1 +222 222 1399 +223 222 1 +224 222 1 +226 222 1 +230 222 1 +238 222 1 +254 222 1 +286 222 1 +350 222 1 +478 222 1 +95 223 1 +159 223 1 +191 223 1 +207 223 1 +215 223 1 +219 223 1 +221 223 1 +222 223 1 +223 223 1409 +224 223 1 +225 223 1 +227 223 1 +231 223 1 +239 223 1 +255 223 1 +287 223 1 +351 223 1 +479 223 1 +96 224 1 +160 224 1 +192 224 1 +208 224 1 +216 224 1 +220 224 1 +222 224 1 +223 224 1 +224 224 1423 +225 224 1 +226 224 1 +228 224 1 +232 224 1 +240 224 1 +256 224 1 +288 224 1 +352 224 1 +480 224 1 +97 225 1 +161 225 1 +193 225 1 +209 225 1 +217 225 1 +221 225 1 +223 225 1 +224 225 1 +225 225 1427 +226 225 1 +227 225 1 +229 225 1 +233 225 1 +241 225 1 +257 225 1 +289 225 1 +353 225 1 +481 225 1 +98 226 1 +162 226 1 +194 226 1 +210 226 1 +218 226 1 +222 226 1 +224 226 1 +225 226 1 +226 226 1429 +227 226 1 +228 226 1 +230 226 1 +234 226 1 +242 226 1 +258 226 1 +290 226 1 +354 226 1 +482 226 1 +99 227 1 +163 227 1 +195 227 1 +211 227 1 +219 227 1 +223 227 1 +225 227 1 +226 227 1 +227 227 1433 +228 227 1 +229 227 1 +231 227 1 +235 227 1 +243 227 1 +259 227 1 +291 227 1 +355 227 1 +483 227 1 +100 228 1 +164 228 1 +196 228 1 +212 228 1 +220 228 1 +224 228 1 +226 228 1 +227 228 1 +228 228 1439 +229 228 1 +230 228 1 +232 228 1 +236 228 1 +244 228 1 +260 228 1 +292 228 1 +356 228 1 +484 228 1 +101 229 1 +165 229 1 +197 229 1 +213 229 1 +221 229 1 +225 229 1 +227 229 1 +228 229 1 +229 229 1447 +230 229 1 +231 229 1 +233 229 1 +237 229 1 +245 229 1 +261 229 1 +293 229 1 +357 229 1 +485 229 1 +102 230 1 +166 230 1 +198 230 1 +214 230 1 +222 230 1 +226 230 1 +228 230 1 +229 230 1 +230 230 1451 +231 230 1 +232 230 1 +234 230 1 +238 230 1 +246 230 1 +262 230 1 +294 230 1 +358 230 1 +486 230 1 +103 231 1 +167 231 1 +199 231 1 +215 231 1 +223 231 1 +227 231 1 +229 231 1 +230 231 1 +231 231 1453 +232 231 1 +233 231 1 +235 231 1 +239 231 1 +247 231 1 +263 231 1 +295 231 1 +359 231 1 +487 231 1 +104 232 1 +168 232 1 +200 232 1 +216 232 1 +224 232 1 +228 232 1 +230 232 1 +231 232 1 +232 232 1459 +233 232 1 +234 232 1 +236 232 1 +240 232 1 +248 232 1 +264 232 1 +296 232 1 +360 232 1 +488 232 1 +105 233 1 +169 233 1 +201 233 1 +217 233 1 +225 233 1 +229 233 1 +231 233 1 +232 233 1 +233 233 1471 +234 233 1 +235 233 1 +237 233 1 +241 233 1 +249 233 1 +265 233 1 +297 233 1 +361 233 1 +489 233 1 +106 234 1 +170 234 1 +202 234 1 +218 234 1 +226 234 1 +230 234 1 +232 234 1 +233 234 1 +234 234 1481 +235 234 1 +236 234 1 +238 234 1 +242 234 1 +250 234 1 +266 234 1 +298 234 1 +362 234 1 +490 234 1 +107 235 1 +171 235 1 +203 235 1 +219 235 1 +227 235 1 +231 235 1 +233 235 1 +234 235 1 +235 235 1483 +236 235 1 +237 235 1 +239 235 1 +243 235 1 +251 235 1 +267 235 1 +299 235 1 +363 235 1 +491 235 1 +108 236 1 +172 236 1 +204 236 1 +220 236 1 +228 236 1 +232 236 1 +234 236 1 +235 236 1 +236 236 1487 +237 236 1 +238 236 1 +240 236 1 +244 236 1 +252 236 1 +268 236 1 +300 236 1 +364 236 1 +492 236 1 +109 237 1 +173 237 1 +205 237 1 +221 237 1 +229 237 1 +233 237 1 +235 237 1 +236 237 1 +237 237 1489 +238 237 1 +239 237 1 +241 237 1 +245 237 1 +253 237 1 +269 237 1 +301 237 1 +365 237 1 +493 237 1 +110 238 1 +174 238 1 +206 238 1 +222 238 1 +230 238 1 +234 238 1 +236 238 1 +237 238 1 +238 238 1493 +239 238 1 +240 238 1 +242 238 1 +246 238 1 +254 238 1 +270 238 1 +302 238 1 +366 238 1 +494 238 1 +111 239 1 +175 239 1 +207 239 1 +223 239 1 +231 239 1 +235 239 1 +237 239 1 +238 239 1 +239 239 1499 +240 239 1 +241 239 1 +243 239 1 +247 239 1 +255 239 1 +271 239 1 +303 239 1 +367 239 1 +495 239 1 +112 240 1 +176 240 1 +208 240 1 +224 240 1 +232 240 1 +236 240 1 +238 240 1 +239 240 1 +240 240 1511 +241 240 1 +242 240 1 +244 240 1 +248 240 1 +256 240 1 +272 240 1 +304 240 1 +368 240 1 +496 240 1 +113 241 1 +177 241 1 +209 241 1 +225 241 1 +233 241 1 +237 241 1 +239 241 1 +240 241 1 +241 241 1523 +242 241 1 +243 241 1 +245 241 1 +249 241 1 +257 241 1 +273 241 1 +305 241 1 +369 241 1 +497 241 1 +114 242 1 +178 242 1 +210 242 1 +226 242 1 +234 242 1 +238 242 1 +240 242 1 +241 242 1 +242 242 1531 +243 242 1 +244 242 1 +246 242 1 +250 242 1 +258 242 1 +274 242 1 +306 242 1 +370 242 1 +498 242 1 +115 243 1 +179 243 1 +211 243 1 +227 243 1 +235 243 1 +239 243 1 +241 243 1 +242 243 1 +243 243 1543 +244 243 1 +245 243 1 +247 243 1 +251 243 1 +259 243 1 +275 243 1 +307 243 1 +371 243 1 +499 243 1 +116 244 1 +180 244 1 +212 244 1 +228 244 1 +236 244 1 +240 244 1 +242 244 1 +243 244 1 +244 244 1549 +245 244 1 +246 244 1 +248 244 1 +252 244 1 +260 244 1 +276 244 1 +308 244 1 +372 244 1 +500 244 1 +117 245 1 +181 245 1 +213 245 1 +229 245 1 +237 245 1 +241 245 1 +243 245 1 +244 245 1 +245 245 1553 +246 245 1 +247 245 1 +249 245 1 +253 245 1 +261 245 1 +277 245 1 +309 245 1 +373 245 1 +118 246 1 +182 246 1 +214 246 1 +230 246 1 +238 246 1 +242 246 1 +244 246 1 +245 246 1 +246 246 1559 +247 246 1 +248 246 1 +250 246 1 +254 246 1 +262 246 1 +278 246 1 +310 246 1 +374 246 1 +119 247 1 +183 247 1 +215 247 1 +231 247 1 +239 247 1 +243 247 1 +245 247 1 +246 247 1 +247 247 1567 +248 247 1 +249 247 1 +251 247 1 +255 247 1 +263 247 1 +279 247 1 +311 247 1 +375 247 1 +120 248 1 +184 248 1 +216 248 1 +232 248 1 +240 248 1 +244 248 1 +246 248 1 +247 248 1 +248 248 1571 +249 248 1 +250 248 1 +252 248 1 +256 248 1 +264 248 1 +280 248 1 +312 248 1 +376 248 1 +121 249 1 +185 249 1 +217 249 1 +233 249 1 +241 249 1 +245 249 1 +247 249 1 +248 249 1 +249 249 1579 +250 249 1 +251 249 1 +253 249 1 +257 249 1 +265 249 1 +281 249 1 +313 249 1 +377 249 1 +122 250 1 +186 250 1 +218 250 1 +234 250 1 +242 250 1 +246 250 1 +248 250 1 +249 250 1 +250 250 1583 +251 250 1 +252 250 1 +254 250 1 +258 250 1 +266 250 1 +282 250 1 +314 250 1 +378 250 1 +123 251 1 +187 251 1 +219 251 1 +235 251 1 +243 251 1 +247 251 1 +249 251 1 +250 251 1 +251 251 1597 +252 251 1 +253 251 1 +255 251 1 +259 251 1 +267 251 1 +283 251 1 +315 251 1 +379 251 1 +124 252 1 +188 252 1 +220 252 1 +236 252 1 +244 252 1 +248 252 1 +250 252 1 +251 252 1 +252 252 1601 +253 252 1 +254 252 1 +256 252 1 +260 252 1 +268 252 1 +284 252 1 +316 252 1 +380 252 1 +125 253 1 +189 253 1 +221 253 1 +237 253 1 +245 253 1 +249 253 1 +251 253 1 +252 253 1 +253 253 1607 +254 253 1 +255 253 1 +257 253 1 +261 253 1 +269 253 1 +285 253 1 +317 253 1 +381 253 1 +126 254 1 +190 254 1 +222 254 1 +238 254 1 +246 254 1 +250 254 1 +252 254 1 +253 254 1 +254 254 1609 +255 254 1 +256 254 1 +258 254 1 +262 254 1 +270 254 1 +286 254 1 +318 254 1 +382 254 1 +127 255 1 +191 255 1 +223 255 1 +239 255 1 +247 255 1 +251 255 1 +253 255 1 +254 255 1 +255 255 1613 +256 255 1 +257 255 1 +259 255 1 +263 255 1 +271 255 1 +287 255 1 +319 255 1 +383 255 1 +128 256 1 +192 256 1 +224 256 1 +240 256 1 +248 256 1 +252 256 1 +254 256 1 +255 256 1 +256 256 1619 +257 256 1 +258 256 1 +260 256 1 +264 256 1 +272 256 1 +288 256 1 +320 256 1 +384 256 1 +1 257 1 +129 257 1 +193 257 1 +225 257 1 +241 257 1 +249 257 1 +253 257 1 +255 257 1 +256 257 1 +257 257 1621 +258 257 1 +259 257 1 +261 257 1 +265 257 1 +273 257 1 +289 257 1 +321 257 1 +385 257 1 +2 258 1 +130 258 1 +194 258 1 +226 258 1 +242 258 1 +250 258 1 +254 258 1 +256 258 1 +257 258 1 +258 258 1627 +259 258 1 +260 258 1 +262 258 1 +266 258 1 +274 258 1 +290 258 1 +322 258 1 +386 258 1 +3 259 1 +131 259 1 +195 259 1 +227 259 1 +243 259 1 +251 259 1 +255 259 1 +257 259 1 +258 259 1 +259 259 1637 +260 259 1 +261 259 1 +263 259 1 +267 259 1 +275 259 1 +291 259 1 +323 259 1 +387 259 1 +4 260 1 +132 260 1 +196 260 1 +228 260 1 +244 260 1 +252 260 1 +256 260 1 +258 260 1 +259 260 1 +260 260 1657 +261 260 1 +262 260 1 +264 260 1 +268 260 1 +276 260 1 +292 260 1 +324 260 1 +388 260 1 +5 261 1 +133 261 1 +197 261 1 +229 261 1 +245 261 1 +253 261 1 +257 261 1 +259 261 1 +260 261 1 +261 261 1663 +262 261 1 +263 261 1 +265 261 1 +269 261 1 +277 261 1 +293 261 1 +325 261 1 +389 261 1 +6 262 1 +134 262 1 +198 262 1 +230 262 1 +246 262 1 +254 262 1 +258 262 1 +260 262 1 +261 262 1 +262 262 1667 +263 262 1 +264 262 1 +266 262 1 +270 262 1 +278 262 1 +294 262 1 +326 262 1 +390 262 1 +7 263 1 +135 263 1 +199 263 1 +231 263 1 +247 263 1 +255 263 1 +259 263 1 +261 263 1 +262 263 1 +263 263 1669 +264 263 1 +265 263 1 +267 263 1 +271 263 1 +279 263 1 +295 263 1 +327 263 1 +391 263 1 +8 264 1 +136 264 1 +200 264 1 +232 264 1 +248 264 1 +256 264 1 +260 264 1 +262 264 1 +263 264 1 +264 264 1693 +265 264 1 +266 264 1 +268 264 1 +272 264 1 +280 264 1 +296 264 1 +328 264 1 +392 264 1 +9 265 1 +137 265 1 +201 265 1 +233 265 1 +249 265 1 +257 265 1 +261 265 1 +263 265 1 +264 265 1 +265 265 1697 +266 265 1 +267 265 1 +269 265 1 +273 265 1 +281 265 1 +297 265 1 +329 265 1 +393 265 1 +10 266 1 +138 266 1 +202 266 1 +234 266 1 +250 266 1 +258 266 1 +262 266 1 +264 266 1 +265 266 1 +266 266 1699 +267 266 1 +268 266 1 +270 266 1 +274 266 1 +282 266 1 +298 266 1 +330 266 1 +394 266 1 +11 267 1 +139 267 1 +203 267 1 +235 267 1 +251 267 1 +259 267 1 +263 267 1 +265 267 1 +266 267 1 +267 267 1709 +268 267 1 +269 267 1 +271 267 1 +275 267 1 +283 267 1 +299 267 1 +331 267 1 +395 267 1 +12 268 1 +140 268 1 +204 268 1 +236 268 1 +252 268 1 +260 268 1 +264 268 1 +266 268 1 +267 268 1 +268 268 1721 +269 268 1 +270 268 1 +272 268 1 +276 268 1 +284 268 1 +300 268 1 +332 268 1 +396 268 1 +13 269 1 +141 269 1 +205 269 1 +237 269 1 +253 269 1 +261 269 1 +265 269 1 +267 269 1 +268 269 1 +269 269 1723 +270 269 1 +271 269 1 +273 269 1 +277 269 1 +285 269 1 +301 269 1 +333 269 1 +397 269 1 +14 270 1 +142 270 1 +206 270 1 +238 270 1 +254 270 1 +262 270 1 +266 270 1 +268 270 1 +269 270 1 +270 270 1733 +271 270 1 +272 270 1 +274 270 1 +278 270 1 +286 270 1 +302 270 1 +334 270 1 +398 270 1 +15 271 1 +143 271 1 +207 271 1 +239 271 1 +255 271 1 +263 271 1 +267 271 1 +269 271 1 +270 271 1 +271 271 1741 +272 271 1 +273 271 1 +275 271 1 +279 271 1 +287 271 1 +303 271 1 +335 271 1 +399 271 1 +16 272 1 +144 272 1 +208 272 1 +240 272 1 +256 272 1 +264 272 1 +268 272 1 +270 272 1 +271 272 1 +272 272 1747 +273 272 1 +274 272 1 +276 272 1 +280 272 1 +288 272 1 +304 272 1 +336 272 1 +400 272 1 +17 273 1 +145 273 1 +209 273 1 +241 273 1 +257 273 1 +265 273 1 +269 273 1 +271 273 1 +272 273 1 +273 273 1753 +274 273 1 +275 273 1 +277 273 1 +281 273 1 +289 273 1 +305 273 1 +337 273 1 +401 273 1 +18 274 1 +146 274 1 +210 274 1 +242 274 1 +258 274 1 +266 274 1 +270 274 1 +272 274 1 +273 274 1 +274 274 1759 +275 274 1 +276 274 1 +278 274 1 +282 274 1 +290 274 1 +306 274 1 +338 274 1 +402 274 1 +19 275 1 +147 275 1 +211 275 1 +243 275 1 +259 275 1 +267 275 1 +271 275 1 +273 275 1 +274 275 1 +275 275 1777 +276 275 1 +277 275 1 +279 275 1 +283 275 1 +291 275 1 +307 275 1 +339 275 1 +403 275 1 +20 276 1 +148 276 1 +212 276 1 +244 276 1 +260 276 1 +268 276 1 +272 276 1 +274 276 1 +275 276 1 +276 276 1783 +277 276 1 +278 276 1 +280 276 1 +284 276 1 +292 276 1 +308 276 1 +340 276 1 +404 276 1 +21 277 1 +149 277 1 +213 277 1 +245 277 1 +261 277 1 +269 277 1 +273 277 1 +275 277 1 +276 277 1 +277 277 1787 +278 277 1 +279 277 1 +281 277 1 +285 277 1 +293 277 1 +309 277 1 +341 277 1 +405 277 1 +22 278 1 +150 278 1 +214 278 1 +246 278 1 +262 278 1 +270 278 1 +274 278 1 +276 278 1 +277 278 1 +278 278 1789 +279 278 1 +280 278 1 +282 278 1 +286 278 1 +294 278 1 +310 278 1 +342 278 1 +406 278 1 +23 279 1 +151 279 1 +215 279 1 +247 279 1 +263 279 1 +271 279 1 +275 279 1 +277 279 1 +278 279 1 +279 279 1801 +280 279 1 +281 279 1 +283 279 1 +287 279 1 +295 279 1 +311 279 1 +343 279 1 +407 279 1 +24 280 1 +152 280 1 +216 280 1 +248 280 1 +264 280 1 +272 280 1 +276 280 1 +278 280 1 +279 280 1 +280 280 1811 +281 280 1 +282 280 1 +284 280 1 +288 280 1 +296 280 1 +312 280 1 +344 280 1 +408 280 1 +25 281 1 +153 281 1 +217 281 1 +249 281 1 +265 281 1 +273 281 1 +277 281 1 +279 281 1 +280 281 1 +281 281 1823 +282 281 1 +283 281 1 +285 281 1 +289 281 1 +297 281 1 +313 281 1 +345 281 1 +409 281 1 +26 282 1 +154 282 1 +218 282 1 +250 282 1 +266 282 1 +274 282 1 +278 282 1 +280 282 1 +281 282 1 +282 282 1831 +283 282 1 +284 282 1 +286 282 1 +290 282 1 +298 282 1 +314 282 1 +346 282 1 +410 282 1 +27 283 1 +155 283 1 +219 283 1 +251 283 1 +267 283 1 +275 283 1 +279 283 1 +281 283 1 +282 283 1 +283 283 1847 +284 283 1 +285 283 1 +287 283 1 +291 283 1 +299 283 1 +315 283 1 +347 283 1 +411 283 1 +28 284 1 +156 284 1 +220 284 1 +252 284 1 +268 284 1 +276 284 1 +280 284 1 +282 284 1 +283 284 1 +284 284 1861 +285 284 1 +286 284 1 +288 284 1 +292 284 1 +300 284 1 +316 284 1 +348 284 1 +412 284 1 +29 285 1 +157 285 1 +221 285 1 +253 285 1 +269 285 1 +277 285 1 +281 285 1 +283 285 1 +284 285 1 +285 285 1867 +286 285 1 +287 285 1 +289 285 1 +293 285 1 +301 285 1 +317 285 1 +349 285 1 +413 285 1 +30 286 1 +158 286 1 +222 286 1 +254 286 1 +270 286 1 +278 286 1 +282 286 1 +284 286 1 +285 286 1 +286 286 1871 +287 286 1 +288 286 1 +290 286 1 +294 286 1 +302 286 1 +318 286 1 +350 286 1 +414 286 1 +31 287 1 +159 287 1 +223 287 1 +255 287 1 +271 287 1 +279 287 1 +283 287 1 +285 287 1 +286 287 1 +287 287 1873 +288 287 1 +289 287 1 +291 287 1 +295 287 1 +303 287 1 +319 287 1 +351 287 1 +415 287 1 +32 288 1 +160 288 1 +224 288 1 +256 288 1 +272 288 1 +280 288 1 +284 288 1 +286 288 1 +287 288 1 +288 288 1877 +289 288 1 +290 288 1 +292 288 1 +296 288 1 +304 288 1 +320 288 1 +352 288 1 +416 288 1 +33 289 1 +161 289 1 +225 289 1 +257 289 1 +273 289 1 +281 289 1 +285 289 1 +287 289 1 +288 289 1 +289 289 1879 +290 289 1 +291 289 1 +293 289 1 +297 289 1 +305 289 1 +321 289 1 +353 289 1 +417 289 1 +34 290 1 +162 290 1 +226 290 1 +258 290 1 +274 290 1 +282 290 1 +286 290 1 +288 290 1 +289 290 1 +290 290 1889 +291 290 1 +292 290 1 +294 290 1 +298 290 1 +306 290 1 +322 290 1 +354 290 1 +418 290 1 +35 291 1 +163 291 1 +227 291 1 +259 291 1 +275 291 1 +283 291 1 +287 291 1 +289 291 1 +290 291 1 +291 291 1901 +292 291 1 +293 291 1 +295 291 1 +299 291 1 +307 291 1 +323 291 1 +355 291 1 +419 291 1 +36 292 1 +164 292 1 +228 292 1 +260 292 1 +276 292 1 +284 292 1 +288 292 1 +290 292 1 +291 292 1 +292 292 1907 +293 292 1 +294 292 1 +296 292 1 +300 292 1 +308 292 1 +324 292 1 +356 292 1 +420 292 1 +37 293 1 +165 293 1 +229 293 1 +261 293 1 +277 293 1 +285 293 1 +289 293 1 +291 293 1 +292 293 1 +293 293 1913 +294 293 1 +295 293 1 +297 293 1 +301 293 1 +309 293 1 +325 293 1 +357 293 1 +421 293 1 +38 294 1 +166 294 1 +230 294 1 +262 294 1 +278 294 1 +286 294 1 +290 294 1 +292 294 1 +293 294 1 +294 294 1931 +295 294 1 +296 294 1 +298 294 1 +302 294 1 +310 294 1 +326 294 1 +358 294 1 +422 294 1 +39 295 1 +167 295 1 +231 295 1 +263 295 1 +279 295 1 +287 295 1 +291 295 1 +293 295 1 +294 295 1 +295 295 1933 +296 295 1 +297 295 1 +299 295 1 +303 295 1 +311 295 1 +327 295 1 +359 295 1 +423 295 1 +40 296 1 +168 296 1 +232 296 1 +264 296 1 +280 296 1 +288 296 1 +292 296 1 +294 296 1 +295 296 1 +296 296 1949 +297 296 1 +298 296 1 +300 296 1 +304 296 1 +312 296 1 +328 296 1 +360 296 1 +424 296 1 +41 297 1 +169 297 1 +233 297 1 +265 297 1 +281 297 1 +289 297 1 +293 297 1 +295 297 1 +296 297 1 +297 297 1951 +298 297 1 +299 297 1 +301 297 1 +305 297 1 +313 297 1 +329 297 1 +361 297 1 +425 297 1 +42 298 1 +170 298 1 +234 298 1 +266 298 1 +282 298 1 +290 298 1 +294 298 1 +296 298 1 +297 298 1 +298 298 1973 +299 298 1 +300 298 1 +302 298 1 +306 298 1 +314 298 1 +330 298 1 +362 298 1 +426 298 1 +43 299 1 +171 299 1 +235 299 1 +267 299 1 +283 299 1 +291 299 1 +295 299 1 +297 299 1 +298 299 1 +299 299 1979 +300 299 1 +301 299 1 +303 299 1 +307 299 1 +315 299 1 +331 299 1 +363 299 1 +427 299 1 +44 300 1 +172 300 1 +236 300 1 +268 300 1 +284 300 1 +292 300 1 +296 300 1 +298 300 1 +299 300 1 +300 300 1987 +301 300 1 +302 300 1 +304 300 1 +308 300 1 +316 300 1 +332 300 1 +364 300 1 +428 300 1 +45 301 1 +173 301 1 +237 301 1 +269 301 1 +285 301 1 +293 301 1 +297 301 1 +299 301 1 +300 301 1 +301 301 1993 +302 301 1 +303 301 1 +305 301 1 +309 301 1 +317 301 1 +333 301 1 +365 301 1 +429 301 1 +46 302 1 +174 302 1 +238 302 1 +270 302 1 +286 302 1 +294 302 1 +298 302 1 +300 302 1 +301 302 1 +302 302 1997 +303 302 1 +304 302 1 +306 302 1 +310 302 1 +318 302 1 +334 302 1 +366 302 1 +430 302 1 +47 303 1 +175 303 1 +239 303 1 +271 303 1 +287 303 1 +295 303 1 +299 303 1 +301 303 1 +302 303 1 +303 303 1999 +304 303 1 +305 303 1 +307 303 1 +311 303 1 +319 303 1 +335 303 1 +367 303 1 +431 303 1 +48 304 1 +176 304 1 +240 304 1 +272 304 1 +288 304 1 +296 304 1 +300 304 1 +302 304 1 +303 304 1 +304 304 2003 +305 304 1 +306 304 1 +308 304 1 +312 304 1 +320 304 1 +336 304 1 +368 304 1 +432 304 1 +49 305 1 +177 305 1 +241 305 1 +273 305 1 +289 305 1 +297 305 1 +301 305 1 +303 305 1 +304 305 1 +305 305 2011 +306 305 1 +307 305 1 +309 305 1 +313 305 1 +321 305 1 +337 305 1 +369 305 1 +433 305 1 +50 306 1 +178 306 1 +242 306 1 +274 306 1 +290 306 1 +298 306 1 +302 306 1 +304 306 1 +305 306 1 +306 306 2017 +307 306 1 +308 306 1 +310 306 1 +314 306 1 +322 306 1 +338 306 1 +370 306 1 +434 306 1 +51 307 1 +179 307 1 +243 307 1 +275 307 1 +291 307 1 +299 307 1 +303 307 1 +305 307 1 +306 307 1 +307 307 2027 +308 307 1 +309 307 1 +311 307 1 +315 307 1 +323 307 1 +339 307 1 +371 307 1 +435 307 1 +52 308 1 +180 308 1 +244 308 1 +276 308 1 +292 308 1 +300 308 1 +304 308 1 +306 308 1 +307 308 1 +308 308 2029 +309 308 1 +310 308 1 +312 308 1 +316 308 1 +324 308 1 +340 308 1 +372 308 1 +436 308 1 +53 309 1 +181 309 1 +245 309 1 +277 309 1 +293 309 1 +301 309 1 +305 309 1 +307 309 1 +308 309 1 +309 309 2039 +310 309 1 +311 309 1 +313 309 1 +317 309 1 +325 309 1 +341 309 1 +373 309 1 +437 309 1 +54 310 1 +182 310 1 +246 310 1 +278 310 1 +294 310 1 +302 310 1 +306 310 1 +308 310 1 +309 310 1 +310 310 2053 +311 310 1 +312 310 1 +314 310 1 +318 310 1 +326 310 1 +342 310 1 +374 310 1 +438 310 1 +55 311 1 +183 311 1 +247 311 1 +279 311 1 +295 311 1 +303 311 1 +307 311 1 +309 311 1 +310 311 1 +311 311 2063 +312 311 1 +313 311 1 +315 311 1 +319 311 1 +327 311 1 +343 311 1 +375 311 1 +439 311 1 +56 312 1 +184 312 1 +248 312 1 +280 312 1 +296 312 1 +304 312 1 +308 312 1 +310 312 1 +311 312 1 +312 312 2069 +313 312 1 +314 312 1 +316 312 1 +320 312 1 +328 312 1 +344 312 1 +376 312 1 +440 312 1 +57 313 1 +185 313 1 +249 313 1 +281 313 1 +297 313 1 +305 313 1 +309 313 1 +311 313 1 +312 313 1 +313 313 2081 +314 313 1 +315 313 1 +317 313 1 +321 313 1 +329 313 1 +345 313 1 +377 313 1 +441 313 1 +58 314 1 +186 314 1 +250 314 1 +282 314 1 +298 314 1 +306 314 1 +310 314 1 +312 314 1 +313 314 1 +314 314 2083 +315 314 1 +316 314 1 +318 314 1 +322 314 1 +330 314 1 +346 314 1 +378 314 1 +442 314 1 +59 315 1 +187 315 1 +251 315 1 +283 315 1 +299 315 1 +307 315 1 +311 315 1 +313 315 1 +314 315 1 +315 315 2087 +316 315 1 +317 315 1 +319 315 1 +323 315 1 +331 315 1 +347 315 1 +379 315 1 +443 315 1 +60 316 1 +188 316 1 +252 316 1 +284 316 1 +300 316 1 +308 316 1 +312 316 1 +314 316 1 +315 316 1 +316 316 2089 +317 316 1 +318 316 1 +320 316 1 +324 316 1 +332 316 1 +348 316 1 +380 316 1 +444 316 1 +61 317 1 +189 317 1 +253 317 1 +285 317 1 +301 317 1 +309 317 1 +313 317 1 +315 317 1 +316 317 1 +317 317 2099 +318 317 1 +319 317 1 +321 317 1 +325 317 1 +333 317 1 +349 317 1 +381 317 1 +445 317 1 +62 318 1 +190 318 1 +254 318 1 +286 318 1 +302 318 1 +310 318 1 +314 318 1 +316 318 1 +317 318 1 +318 318 2111 +319 318 1 +320 318 1 +322 318 1 +326 318 1 +334 318 1 +350 318 1 +382 318 1 +446 318 1 +63 319 1 +191 319 1 +255 319 1 +287 319 1 +303 319 1 +311 319 1 +315 319 1 +317 319 1 +318 319 1 +319 319 2113 +320 319 1 +321 319 1 +323 319 1 +327 319 1 +335 319 1 +351 319 1 +383 319 1 +447 319 1 +64 320 1 +192 320 1 +256 320 1 +288 320 1 +304 320 1 +312 320 1 +316 320 1 +318 320 1 +319 320 1 +320 320 2129 +321 320 1 +322 320 1 +324 320 1 +328 320 1 +336 320 1 +352 320 1 +384 320 1 +448 320 1 +65 321 1 +193 321 1 +257 321 1 +289 321 1 +305 321 1 +313 321 1 +317 321 1 +319 321 1 +320 321 1 +321 321 2131 +322 321 1 +323 321 1 +325 321 1 +329 321 1 +337 321 1 +353 321 1 +385 321 1 +449 321 1 +66 322 1 +194 322 1 +258 322 1 +290 322 1 +306 322 1 +314 322 1 +318 322 1 +320 322 1 +321 322 1 +322 322 2137 +323 322 1 +324 322 1 +326 322 1 +330 322 1 +338 322 1 +354 322 1 +386 322 1 +450 322 1 +67 323 1 +195 323 1 +259 323 1 +291 323 1 +307 323 1 +315 323 1 +319 323 1 +321 323 1 +322 323 1 +323 323 2141 +324 323 1 +325 323 1 +327 323 1 +331 323 1 +339 323 1 +355 323 1 +387 323 1 +451 323 1 +68 324 1 +196 324 1 +260 324 1 +292 324 1 +308 324 1 +316 324 1 +320 324 1 +322 324 1 +323 324 1 +324 324 2143 +325 324 1 +326 324 1 +328 324 1 +332 324 1 +340 324 1 +356 324 1 +388 324 1 +452 324 1 +69 325 1 +197 325 1 +261 325 1 +293 325 1 +309 325 1 +317 325 1 +321 325 1 +323 325 1 +324 325 1 +325 325 2153 +326 325 1 +327 325 1 +329 325 1 +333 325 1 +341 325 1 +357 325 1 +389 325 1 +453 325 1 +70 326 1 +198 326 1 +262 326 1 +294 326 1 +310 326 1 +318 326 1 +322 326 1 +324 326 1 +325 326 1 +326 326 2161 +327 326 1 +328 326 1 +330 326 1 +334 326 1 +342 326 1 +358 326 1 +390 326 1 +454 326 1 +71 327 1 +199 327 1 +263 327 1 +295 327 1 +311 327 1 +319 327 1 +323 327 1 +325 327 1 +326 327 1 +327 327 2179 +328 327 1 +329 327 1 +331 327 1 +335 327 1 +343 327 1 +359 327 1 +391 327 1 +455 327 1 +72 328 1 +200 328 1 +264 328 1 +296 328 1 +312 328 1 +320 328 1 +324 328 1 +326 328 1 +327 328 1 +328 328 2203 +329 328 1 +330 328 1 +332 328 1 +336 328 1 +344 328 1 +360 328 1 +392 328 1 +456 328 1 +73 329 1 +201 329 1 +265 329 1 +297 329 1 +313 329 1 +321 329 1 +325 329 1 +327 329 1 +328 329 1 +329 329 2207 +330 329 1 +331 329 1 +333 329 1 +337 329 1 +345 329 1 +361 329 1 +393 329 1 +457 329 1 +74 330 1 +202 330 1 +266 330 1 +298 330 1 +314 330 1 +322 330 1 +326 330 1 +328 330 1 +329 330 1 +330 330 2213 +331 330 1 +332 330 1 +334 330 1 +338 330 1 +346 330 1 +362 330 1 +394 330 1 +458 330 1 +75 331 1 +203 331 1 +267 331 1 +299 331 1 +315 331 1 +323 331 1 +327 331 1 +329 331 1 +330 331 1 +331 331 2221 +332 331 1 +333 331 1 +335 331 1 +339 331 1 +347 331 1 +363 331 1 +395 331 1 +459 331 1 +76 332 1 +204 332 1 +268 332 1 +300 332 1 +316 332 1 +324 332 1 +328 332 1 +330 332 1 +331 332 1 +332 332 2237 +333 332 1 +334 332 1 +336 332 1 +340 332 1 +348 332 1 +364 332 1 +396 332 1 +460 332 1 +77 333 1 +205 333 1 +269 333 1 +301 333 1 +317 333 1 +325 333 1 +329 333 1 +331 333 1 +332 333 1 +333 333 2239 +334 333 1 +335 333 1 +337 333 1 +341 333 1 +349 333 1 +365 333 1 +397 333 1 +461 333 1 +78 334 1 +206 334 1 +270 334 1 +302 334 1 +318 334 1 +326 334 1 +330 334 1 +332 334 1 +333 334 1 +334 334 2243 +335 334 1 +336 334 1 +338 334 1 +342 334 1 +350 334 1 +366 334 1 +398 334 1 +462 334 1 +79 335 1 +207 335 1 +271 335 1 +303 335 1 +319 335 1 +327 335 1 +331 335 1 +333 335 1 +334 335 1 +335 335 2251 +336 335 1 +337 335 1 +339 335 1 +343 335 1 +351 335 1 +367 335 1 +399 335 1 +463 335 1 +80 336 1 +208 336 1 +272 336 1 +304 336 1 +320 336 1 +328 336 1 +332 336 1 +334 336 1 +335 336 1 +336 336 2267 +337 336 1 +338 336 1 +340 336 1 +344 336 1 +352 336 1 +368 336 1 +400 336 1 +464 336 1 +81 337 1 +209 337 1 +273 337 1 +305 337 1 +321 337 1 +329 337 1 +333 337 1 +335 337 1 +336 337 1 +337 337 2269 +338 337 1 +339 337 1 +341 337 1 +345 337 1 +353 337 1 +369 337 1 +401 337 1 +465 337 1 +82 338 1 +210 338 1 +274 338 1 +306 338 1 +322 338 1 +330 338 1 +334 338 1 +336 338 1 +337 338 1 +338 338 2273 +339 338 1 +340 338 1 +342 338 1 +346 338 1 +354 338 1 +370 338 1 +402 338 1 +466 338 1 +83 339 1 +211 339 1 +275 339 1 +307 339 1 +323 339 1 +331 339 1 +335 339 1 +337 339 1 +338 339 1 +339 339 2281 +340 339 1 +341 339 1 +343 339 1 +347 339 1 +355 339 1 +371 339 1 +403 339 1 +467 339 1 +84 340 1 +212 340 1 +276 340 1 +308 340 1 +324 340 1 +332 340 1 +336 340 1 +338 340 1 +339 340 1 +340 340 2287 +341 340 1 +342 340 1 +344 340 1 +348 340 1 +356 340 1 +372 340 1 +404 340 1 +468 340 1 +85 341 1 +213 341 1 +277 341 1 +309 341 1 +325 341 1 +333 341 1 +337 341 1 +339 341 1 +340 341 1 +341 341 2293 +342 341 1 +343 341 1 +345 341 1 +349 341 1 +357 341 1 +373 341 1 +405 341 1 +469 341 1 +86 342 1 +214 342 1 +278 342 1 +310 342 1 +326 342 1 +334 342 1 +338 342 1 +340 342 1 +341 342 1 +342 342 2297 +343 342 1 +344 342 1 +346 342 1 +350 342 1 +358 342 1 +374 342 1 +406 342 1 +470 342 1 +87 343 1 +215 343 1 +279 343 1 +311 343 1 +327 343 1 +335 343 1 +339 343 1 +341 343 1 +342 343 1 +343 343 2309 +344 343 1 +345 343 1 +347 343 1 +351 343 1 +359 343 1 +375 343 1 +407 343 1 +471 343 1 +88 344 1 +216 344 1 +280 344 1 +312 344 1 +328 344 1 +336 344 1 +340 344 1 +342 344 1 +343 344 1 +344 344 2311 +345 344 1 +346 344 1 +348 344 1 +352 344 1 +360 344 1 +376 344 1 +408 344 1 +472 344 1 +89 345 1 +217 345 1 +281 345 1 +313 345 1 +329 345 1 +337 345 1 +341 345 1 +343 345 1 +344 345 1 +345 345 2333 +346 345 1 +347 345 1 +349 345 1 +353 345 1 +361 345 1 +377 345 1 +409 345 1 +473 345 1 +90 346 1 +218 346 1 +282 346 1 +314 346 1 +330 346 1 +338 346 1 +342 346 1 +344 346 1 +345 346 1 +346 346 2339 +347 346 1 +348 346 1 +350 346 1 +354 346 1 +362 346 1 +378 346 1 +410 346 1 +474 346 1 +91 347 1 +219 347 1 +283 347 1 +315 347 1 +331 347 1 +339 347 1 +343 347 1 +345 347 1 +346 347 1 +347 347 2341 +348 347 1 +349 347 1 +351 347 1 +355 347 1 +363 347 1 +379 347 1 +411 347 1 +475 347 1 +92 348 1 +220 348 1 +284 348 1 +316 348 1 +332 348 1 +340 348 1 +344 348 1 +346 348 1 +347 348 1 +348 348 2347 +349 348 1 +350 348 1 +352 348 1 +356 348 1 +364 348 1 +380 348 1 +412 348 1 +476 348 1 +93 349 1 +221 349 1 +285 349 1 +317 349 1 +333 349 1 +341 349 1 +345 349 1 +347 349 1 +348 349 1 +349 349 2351 +350 349 1 +351 349 1 +353 349 1 +357 349 1 +365 349 1 +381 349 1 +413 349 1 +477 349 1 +94 350 1 +222 350 1 +286 350 1 +318 350 1 +334 350 1 +342 350 1 +346 350 1 +348 350 1 +349 350 1 +350 350 2357 +351 350 1 +352 350 1 +354 350 1 +358 350 1 +366 350 1 +382 350 1 +414 350 1 +478 350 1 +95 351 1 +223 351 1 +287 351 1 +319 351 1 +335 351 1 +343 351 1 +347 351 1 +349 351 1 +350 351 1 +351 351 2371 +352 351 1 +353 351 1 +355 351 1 +359 351 1 +367 351 1 +383 351 1 +415 351 1 +479 351 1 +96 352 1 +224 352 1 +288 352 1 +320 352 1 +336 352 1 +344 352 1 +348 352 1 +350 352 1 +351 352 1 +352 352 2377 +353 352 1 +354 352 1 +356 352 1 +360 352 1 +368 352 1 +384 352 1 +416 352 1 +480 352 1 +97 353 1 +225 353 1 +289 353 1 +321 353 1 +337 353 1 +345 353 1 +349 353 1 +351 353 1 +352 353 1 +353 353 2381 +354 353 1 +355 353 1 +357 353 1 +361 353 1 +369 353 1 +385 353 1 +417 353 1 +481 353 1 +98 354 1 +226 354 1 +290 354 1 +322 354 1 +338 354 1 +346 354 1 +350 354 1 +352 354 1 +353 354 1 +354 354 2383 +355 354 1 +356 354 1 +358 354 1 +362 354 1 +370 354 1 +386 354 1 +418 354 1 +482 354 1 +99 355 1 +227 355 1 +291 355 1 +323 355 1 +339 355 1 +347 355 1 +351 355 1 +353 355 1 +354 355 1 +355 355 2389 +356 355 1 +357 355 1 +359 355 1 +363 355 1 +371 355 1 +387 355 1 +419 355 1 +483 355 1 +100 356 1 +228 356 1 +292 356 1 +324 356 1 +340 356 1 +348 356 1 +352 356 1 +354 356 1 +355 356 1 +356 356 2393 +357 356 1 +358 356 1 +360 356 1 +364 356 1 +372 356 1 +388 356 1 +420 356 1 +484 356 1 +101 357 1 +229 357 1 +293 357 1 +325 357 1 +341 357 1 +349 357 1 +353 357 1 +355 357 1 +356 357 1 +357 357 2399 +358 357 1 +359 357 1 +361 357 1 +365 357 1 +373 357 1 +389 357 1 +421 357 1 +485 357 1 +102 358 1 +230 358 1 +294 358 1 +326 358 1 +342 358 1 +350 358 1 +354 358 1 +356 358 1 +357 358 1 +358 358 2411 +359 358 1 +360 358 1 +362 358 1 +366 358 1 +374 358 1 +390 358 1 +422 358 1 +486 358 1 +103 359 1 +231 359 1 +295 359 1 +327 359 1 +343 359 1 +351 359 1 +355 359 1 +357 359 1 +358 359 1 +359 359 2417 +360 359 1 +361 359 1 +363 359 1 +367 359 1 +375 359 1 +391 359 1 +423 359 1 +487 359 1 +104 360 1 +232 360 1 +296 360 1 +328 360 1 +344 360 1 +352 360 1 +356 360 1 +358 360 1 +359 360 1 +360 360 2423 +361 360 1 +362 360 1 +364 360 1 +368 360 1 +376 360 1 +392 360 1 +424 360 1 +488 360 1 +105 361 1 +233 361 1 +297 361 1 +329 361 1 +345 361 1 +353 361 1 +357 361 1 +359 361 1 +360 361 1 +361 361 2437 +362 361 1 +363 361 1 +365 361 1 +369 361 1 +377 361 1 +393 361 1 +425 361 1 +489 361 1 +106 362 1 +234 362 1 +298 362 1 +330 362 1 +346 362 1 +354 362 1 +358 362 1 +360 362 1 +361 362 1 +362 362 2441 +363 362 1 +364 362 1 +366 362 1 +370 362 1 +378 362 1 +394 362 1 +426 362 1 +490 362 1 +107 363 1 +235 363 1 +299 363 1 +331 363 1 +347 363 1 +355 363 1 +359 363 1 +361 363 1 +362 363 1 +363 363 2447 +364 363 1 +365 363 1 +367 363 1 +371 363 1 +379 363 1 +395 363 1 +427 363 1 +491 363 1 +108 364 1 +236 364 1 +300 364 1 +332 364 1 +348 364 1 +356 364 1 +360 364 1 +362 364 1 +363 364 1 +364 364 2459 +365 364 1 +366 364 1 +368 364 1 +372 364 1 +380 364 1 +396 364 1 +428 364 1 +492 364 1 +109 365 1 +237 365 1 +301 365 1 +333 365 1 +349 365 1 +357 365 1 +361 365 1 +363 365 1 +364 365 1 +365 365 2467 +366 365 1 +367 365 1 +369 365 1 +373 365 1 +381 365 1 +397 365 1 +429 365 1 +493 365 1 +110 366 1 +238 366 1 +302 366 1 +334 366 1 +350 366 1 +358 366 1 +362 366 1 +364 366 1 +365 366 1 +366 366 2473 +367 366 1 +368 366 1 +370 366 1 +374 366 1 +382 366 1 +398 366 1 +430 366 1 +494 366 1 +111 367 1 +239 367 1 +303 367 1 +335 367 1 +351 367 1 +359 367 1 +363 367 1 +365 367 1 +366 367 1 +367 367 2477 +368 367 1 +369 367 1 +371 367 1 +375 367 1 +383 367 1 +399 367 1 +431 367 1 +495 367 1 +112 368 1 +240 368 1 +304 368 1 +336 368 1 +352 368 1 +360 368 1 +364 368 1 +366 368 1 +367 368 1 +368 368 2503 +369 368 1 +370 368 1 +372 368 1 +376 368 1 +384 368 1 +400 368 1 +432 368 1 +496 368 1 +113 369 1 +241 369 1 +305 369 1 +337 369 1 +353 369 1 +361 369 1 +365 369 1 +367 369 1 +368 369 1 +369 369 2521 +370 369 1 +371 369 1 +373 369 1 +377 369 1 +385 369 1 +401 369 1 +433 369 1 +497 369 1 +114 370 1 +242 370 1 +306 370 1 +338 370 1 +354 370 1 +362 370 1 +366 370 1 +368 370 1 +369 370 1 +370 370 2531 +371 370 1 +372 370 1 +374 370 1 +378 370 1 +386 370 1 +402 370 1 +434 370 1 +498 370 1 +115 371 1 +243 371 1 +307 371 1 +339 371 1 +355 371 1 +363 371 1 +367 371 1 +369 371 1 +370 371 1 +371 371 2539 +372 371 1 +373 371 1 +375 371 1 +379 371 1 +387 371 1 +403 371 1 +435 371 1 +499 371 1 +116 372 1 +244 372 1 +308 372 1 +340 372 1 +356 372 1 +364 372 1 +368 372 1 +370 372 1 +371 372 1 +372 372 2543 +373 372 1 +374 372 1 +376 372 1 +380 372 1 +388 372 1 +404 372 1 +436 372 1 +500 372 1 +117 373 1 +245 373 1 +309 373 1 +341 373 1 +357 373 1 +365 373 1 +369 373 1 +371 373 1 +372 373 1 +373 373 2549 +374 373 1 +375 373 1 +377 373 1 +381 373 1 +389 373 1 +405 373 1 +437 373 1 +118 374 1 +246 374 1 +310 374 1 +342 374 1 +358 374 1 +366 374 1 +370 374 1 +372 374 1 +373 374 1 +374 374 2551 +375 374 1 +376 374 1 +378 374 1 +382 374 1 +390 374 1 +406 374 1 +438 374 1 +119 375 1 +247 375 1 +311 375 1 +343 375 1 +359 375 1 +367 375 1 +371 375 1 +373 375 1 +374 375 1 +375 375 2557 +376 375 1 +377 375 1 +379 375 1 +383 375 1 +391 375 1 +407 375 1 +439 375 1 +120 376 1 +248 376 1 +312 376 1 +344 376 1 +360 376 1 +368 376 1 +372 376 1 +374 376 1 +375 376 1 +376 376 2579 +377 376 1 +378 376 1 +380 376 1 +384 376 1 +392 376 1 +408 376 1 +440 376 1 +121 377 1 +249 377 1 +313 377 1 +345 377 1 +361 377 1 +369 377 1 +373 377 1 +375 377 1 +376 377 1 +377 377 2591 +378 377 1 +379 377 1 +381 377 1 +385 377 1 +393 377 1 +409 377 1 +441 377 1 +122 378 1 +250 378 1 +314 378 1 +346 378 1 +362 378 1 +370 378 1 +374 378 1 +376 378 1 +377 378 1 +378 378 2593 +379 378 1 +380 378 1 +382 378 1 +386 378 1 +394 378 1 +410 378 1 +442 378 1 +123 379 1 +251 379 1 +315 379 1 +347 379 1 +363 379 1 +371 379 1 +375 379 1 +377 379 1 +378 379 1 +379 379 2609 +380 379 1 +381 379 1 +383 379 1 +387 379 1 +395 379 1 +411 379 1 +443 379 1 +124 380 1 +252 380 1 +316 380 1 +348 380 1 +364 380 1 +372 380 1 +376 380 1 +378 380 1 +379 380 1 +380 380 2617 +381 380 1 +382 380 1 +384 380 1 +388 380 1 +396 380 1 +412 380 1 +444 380 1 +125 381 1 +253 381 1 +317 381 1 +349 381 1 +365 381 1 +373 381 1 +377 381 1 +379 381 1 +380 381 1 +381 381 2621 +382 381 1 +383 381 1 +385 381 1 +389 381 1 +397 381 1 +413 381 1 +445 381 1 +126 382 1 +254 382 1 +318 382 1 +350 382 1 +366 382 1 +374 382 1 +378 382 1 +380 382 1 +381 382 1 +382 382 2633 +383 382 1 +384 382 1 +386 382 1 +390 382 1 +398 382 1 +414 382 1 +446 382 1 +127 383 1 +255 383 1 +319 383 1 +351 383 1 +367 383 1 +375 383 1 +379 383 1 +381 383 1 +382 383 1 +383 383 2647 +384 383 1 +385 383 1 +387 383 1 +391 383 1 +399 383 1 +415 383 1 +447 383 1 +128 384 1 +256 384 1 +320 384 1 +352 384 1 +368 384 1 +376 384 1 +380 384 1 +382 384 1 +383 384 1 +384 384 2657 +385 384 1 +386 384 1 +388 384 1 +392 384 1 +400 384 1 +416 384 1 +448 384 1 +129 385 1 +257 385 1 +321 385 1 +353 385 1 +369 385 1 +377 385 1 +381 385 1 +383 385 1 +384 385 1 +385 385 2659 +386 385 1 +387 385 1 +389 385 1 +393 385 1 +401 385 1 +417 385 1 +449 385 1 +130 386 1 +258 386 1 +322 386 1 +354 386 1 +370 386 1 +378 386 1 +382 386 1 +384 386 1 +385 386 1 +386 386 2663 +387 386 1 +388 386 1 +390 386 1 +394 386 1 +402 386 1 +418 386 1 +450 386 1 +131 387 1 +259 387 1 +323 387 1 +355 387 1 +371 387 1 +379 387 1 +383 387 1 +385 387 1 +386 387 1 +387 387 2671 +388 387 1 +389 387 1 +391 387 1 +395 387 1 +403 387 1 +419 387 1 +451 387 1 +132 388 1 +260 388 1 +324 388 1 +356 388 1 +372 388 1 +380 388 1 +384 388 1 +386 388 1 +387 388 1 +388 388 2677 +389 388 1 +390 388 1 +392 388 1 +396 388 1 +404 388 1 +420 388 1 +452 388 1 +133 389 1 +261 389 1 +325 389 1 +357 389 1 +373 389 1 +381 389 1 +385 389 1 +387 389 1 +388 389 1 +389 389 2683 +390 389 1 +391 389 1 +393 389 1 +397 389 1 +405 389 1 +421 389 1 +453 389 1 +134 390 1 +262 390 1 +326 390 1 +358 390 1 +374 390 1 +382 390 1 +386 390 1 +388 390 1 +389 390 1 +390 390 2687 +391 390 1 +392 390 1 +394 390 1 +398 390 1 +406 390 1 +422 390 1 +454 390 1 +135 391 1 +263 391 1 +327 391 1 +359 391 1 +375 391 1 +383 391 1 +387 391 1 +389 391 1 +390 391 1 +391 391 2689 +392 391 1 +393 391 1 +395 391 1 +399 391 1 +407 391 1 +423 391 1 +455 391 1 +136 392 1 +264 392 1 +328 392 1 +360 392 1 +376 392 1 +384 392 1 +388 392 1 +390 392 1 +391 392 1 +392 392 2693 +393 392 1 +394 392 1 +396 392 1 +400 392 1 +408 392 1 +424 392 1 +456 392 1 +137 393 1 +265 393 1 +329 393 1 +361 393 1 +377 393 1 +385 393 1 +389 393 1 +391 393 1 +392 393 1 +393 393 2699 +394 393 1 +395 393 1 +397 393 1 +401 393 1 +409 393 1 +425 393 1 +457 393 1 +138 394 1 +266 394 1 +330 394 1 +362 394 1 +378 394 1 +386 394 1 +390 394 1 +392 394 1 +393 394 1 +394 394 2707 +395 394 1 +396 394 1 +398 394 1 +402 394 1 +410 394 1 +426 394 1 +458 394 1 +139 395 1 +267 395 1 +331 395 1 +363 395 1 +379 395 1 +387 395 1 +391 395 1 +393 395 1 +394 395 1 +395 395 2711 +396 395 1 +397 395 1 +399 395 1 +403 395 1 +411 395 1 +427 395 1 +459 395 1 +140 396 1 +268 396 1 +332 396 1 +364 396 1 +380 396 1 +388 396 1 +392 396 1 +394 396 1 +395 396 1 +396 396 2713 +397 396 1 +398 396 1 +400 396 1 +404 396 1 +412 396 1 +428 396 1 +460 396 1 +141 397 1 +269 397 1 +333 397 1 +365 397 1 +381 397 1 +389 397 1 +393 397 1 +395 397 1 +396 397 1 +397 397 2719 +398 397 1 +399 397 1 +401 397 1 +405 397 1 +413 397 1 +429 397 1 +461 397 1 +142 398 1 +270 398 1 +334 398 1 +366 398 1 +382 398 1 +390 398 1 +394 398 1 +396 398 1 +397 398 1 +398 398 2729 +399 398 1 +400 398 1 +402 398 1 +406 398 1 +414 398 1 +430 398 1 +462 398 1 +143 399 1 +271 399 1 +335 399 1 +367 399 1 +383 399 1 +391 399 1 +395 399 1 +397 399 1 +398 399 1 +399 399 2731 +400 399 1 +401 399 1 +403 399 1 +407 399 1 +415 399 1 +431 399 1 +463 399 1 +144 400 1 +272 400 1 +336 400 1 +368 400 1 +384 400 1 +392 400 1 +396 400 1 +398 400 1 +399 400 1 +400 400 2741 +401 400 1 +402 400 1 +404 400 1 +408 400 1 +416 400 1 +432 400 1 +464 400 1 +145 401 1 +273 401 1 +337 401 1 +369 401 1 +385 401 1 +393 401 1 +397 401 1 +399 401 1 +400 401 1 +401 401 2749 +402 401 1 +403 401 1 +405 401 1 +409 401 1 +417 401 1 +433 401 1 +465 401 1 +146 402 1 +274 402 1 +338 402 1 +370 402 1 +386 402 1 +394 402 1 +398 402 1 +400 402 1 +401 402 1 +402 402 2753 +403 402 1 +404 402 1 +406 402 1 +410 402 1 +418 402 1 +434 402 1 +466 402 1 +147 403 1 +275 403 1 +339 403 1 +371 403 1 +387 403 1 +395 403 1 +399 403 1 +401 403 1 +402 403 1 +403 403 2767 +404 403 1 +405 403 1 +407 403 1 +411 403 1 +419 403 1 +435 403 1 +467 403 1 +148 404 1 +276 404 1 +340 404 1 +372 404 1 +388 404 1 +396 404 1 +400 404 1 +402 404 1 +403 404 1 +404 404 2777 +405 404 1 +406 404 1 +408 404 1 +412 404 1 +420 404 1 +436 404 1 +468 404 1 +149 405 1 +277 405 1 +341 405 1 +373 405 1 +389 405 1 +397 405 1 +401 405 1 +403 405 1 +404 405 1 +405 405 2789 +406 405 1 +407 405 1 +409 405 1 +413 405 1 +421 405 1 +437 405 1 +469 405 1 +150 406 1 +278 406 1 +342 406 1 +374 406 1 +390 406 1 +398 406 1 +402 406 1 +404 406 1 +405 406 1 +406 406 2791 +407 406 1 +408 406 1 +410 406 1 +414 406 1 +422 406 1 +438 406 1 +470 406 1 +151 407 1 +279 407 1 +343 407 1 +375 407 1 +391 407 1 +399 407 1 +403 407 1 +405 407 1 +406 407 1 +407 407 2797 +408 407 1 +409 407 1 +411 407 1 +415 407 1 +423 407 1 +439 407 1 +471 407 1 +152 408 1 +280 408 1 +344 408 1 +376 408 1 +392 408 1 +400 408 1 +404 408 1 +406 408 1 +407 408 1 +408 408 2801 +409 408 1 +410 408 1 +412 408 1 +416 408 1 +424 408 1 +440 408 1 +472 408 1 +153 409 1 +281 409 1 +345 409 1 +377 409 1 +393 409 1 +401 409 1 +405 409 1 +407 409 1 +408 409 1 +409 409 2803 +410 409 1 +411 409 1 +413 409 1 +417 409 1 +425 409 1 +441 409 1 +473 409 1 +154 410 1 +282 410 1 +346 410 1 +378 410 1 +394 410 1 +402 410 1 +406 410 1 +408 410 1 +409 410 1 +410 410 2819 +411 410 1 +412 410 1 +414 410 1 +418 410 1 +426 410 1 +442 410 1 +474 410 1 +155 411 1 +283 411 1 +347 411 1 +379 411 1 +395 411 1 +403 411 1 +407 411 1 +409 411 1 +410 411 1 +411 411 2833 +412 411 1 +413 411 1 +415 411 1 +419 411 1 +427 411 1 +443 411 1 +475 411 1 +156 412 1 +284 412 1 +348 412 1 +380 412 1 +396 412 1 +404 412 1 +408 412 1 +410 412 1 +411 412 1 +412 412 2837 +413 412 1 +414 412 1 +416 412 1 +420 412 1 +428 412 1 +444 412 1 +476 412 1 +157 413 1 +285 413 1 +349 413 1 +381 413 1 +397 413 1 +405 413 1 +409 413 1 +411 413 1 +412 413 1 +413 413 2843 +414 413 1 +415 413 1 +417 413 1 +421 413 1 +429 413 1 +445 413 1 +477 413 1 +158 414 1 +286 414 1 +350 414 1 +382 414 1 +398 414 1 +406 414 1 +410 414 1 +412 414 1 +413 414 1 +414 414 2851 +415 414 1 +416 414 1 +418 414 1 +422 414 1 +430 414 1 +446 414 1 +478 414 1 +159 415 1 +287 415 1 +351 415 1 +383 415 1 +399 415 1 +407 415 1 +411 415 1 +413 415 1 +414 415 1 +415 415 2857 +416 415 1 +417 415 1 +419 415 1 +423 415 1 +431 415 1 +447 415 1 +479 415 1 +160 416 1 +288 416 1 +352 416 1 +384 416 1 +400 416 1 +408 416 1 +412 416 1 +414 416 1 +415 416 1 +416 416 2861 +417 416 1 +418 416 1 +420 416 1 +424 416 1 +432 416 1 +448 416 1 +480 416 1 +161 417 1 +289 417 1 +353 417 1 +385 417 1 +401 417 1 +409 417 1 +413 417 1 +415 417 1 +416 417 1 +417 417 2879 +418 417 1 +419 417 1 +421 417 1 +425 417 1 +433 417 1 +449 417 1 +481 417 1 +162 418 1 +290 418 1 +354 418 1 +386 418 1 +402 418 1 +410 418 1 +414 418 1 +416 418 1 +417 418 1 +418 418 2887 +419 418 1 +420 418 1 +422 418 1 +426 418 1 +434 418 1 +450 418 1 +482 418 1 +163 419 1 +291 419 1 +355 419 1 +387 419 1 +403 419 1 +411 419 1 +415 419 1 +417 419 1 +418 419 1 +419 419 2897 +420 419 1 +421 419 1 +423 419 1 +427 419 1 +435 419 1 +451 419 1 +483 419 1 +164 420 1 +292 420 1 +356 420 1 +388 420 1 +404 420 1 +412 420 1 +416 420 1 +418 420 1 +419 420 1 +420 420 2903 +421 420 1 +422 420 1 +424 420 1 +428 420 1 +436 420 1 +452 420 1 +484 420 1 +165 421 1 +293 421 1 +357 421 1 +389 421 1 +405 421 1 +413 421 1 +417 421 1 +419 421 1 +420 421 1 +421 421 2909 +422 421 1 +423 421 1 +425 421 1 +429 421 1 +437 421 1 +453 421 1 +485 421 1 +166 422 1 +294 422 1 +358 422 1 +390 422 1 +406 422 1 +414 422 1 +418 422 1 +420 422 1 +421 422 1 +422 422 2917 +423 422 1 +424 422 1 +426 422 1 +430 422 1 +438 422 1 +454 422 1 +486 422 1 +167 423 1 +295 423 1 +359 423 1 +391 423 1 +407 423 1 +415 423 1 +419 423 1 +421 423 1 +422 423 1 +423 423 2927 +424 423 1 +425 423 1 +427 423 1 +431 423 1 +439 423 1 +455 423 1 +487 423 1 +168 424 1 +296 424 1 +360 424 1 +392 424 1 +408 424 1 +416 424 1 +420 424 1 +422 424 1 +423 424 1 +424 424 2939 +425 424 1 +426 424 1 +428 424 1 +432 424 1 +440 424 1 +456 424 1 +488 424 1 +169 425 1 +297 425 1 +361 425 1 +393 425 1 +409 425 1 +417 425 1 +421 425 1 +423 425 1 +424 425 1 +425 425 2953 +426 425 1 +427 425 1 +429 425 1 +433 425 1 +441 425 1 +457 425 1 +489 425 1 +170 426 1 +298 426 1 +362 426 1 +394 426 1 +410 426 1 +418 426 1 +422 426 1 +424 426 1 +425 426 1 +426 426 2957 +427 426 1 +428 426 1 +430 426 1 +434 426 1 +442 426 1 +458 426 1 +490 426 1 +171 427 1 +299 427 1 +363 427 1 +395 427 1 +411 427 1 +419 427 1 +423 427 1 +425 427 1 +426 427 1 +427 427 2963 +428 427 1 +429 427 1 +431 427 1 +435 427 1 +443 427 1 +459 427 1 +491 427 1 +172 428 1 +300 428 1 +364 428 1 +396 428 1 +412 428 1 +420 428 1 +424 428 1 +426 428 1 +427 428 1 +428 428 2969 +429 428 1 +430 428 1 +432 428 1 +436 428 1 +444 428 1 +460 428 1 +492 428 1 +173 429 1 +301 429 1 +365 429 1 +397 429 1 +413 429 1 +421 429 1 +425 429 1 +427 429 1 +428 429 1 +429 429 2971 +430 429 1 +431 429 1 +433 429 1 +437 429 1 +445 429 1 +461 429 1 +493 429 1 +174 430 1 +302 430 1 +366 430 1 +398 430 1 +414 430 1 +422 430 1 +426 430 1 +428 430 1 +429 430 1 +430 430 2999 +431 430 1 +432 430 1 +434 430 1 +438 430 1 +446 430 1 +462 430 1 +494 430 1 +175 431 1 +303 431 1 +367 431 1 +399 431 1 +415 431 1 +423 431 1 +427 431 1 +429 431 1 +430 431 1 +431 431 3001 +432 431 1 +433 431 1 +435 431 1 +439 431 1 +447 431 1 +463 431 1 +495 431 1 +176 432 1 +304 432 1 +368 432 1 +400 432 1 +416 432 1 +424 432 1 +428 432 1 +430 432 1 +431 432 1 +432 432 3011 +433 432 1 +434 432 1 +436 432 1 +440 432 1 +448 432 1 +464 432 1 +496 432 1 +177 433 1 +305 433 1 +369 433 1 +401 433 1 +417 433 1 +425 433 1 +429 433 1 +431 433 1 +432 433 1 +433 433 3019 +434 433 1 +435 433 1 +437 433 1 +441 433 1 +449 433 1 +465 433 1 +497 433 1 +178 434 1 +306 434 1 +370 434 1 +402 434 1 +418 434 1 +426 434 1 +430 434 1 +432 434 1 +433 434 1 +434 434 3023 +435 434 1 +436 434 1 +438 434 1 +442 434 1 +450 434 1 +466 434 1 +498 434 1 +179 435 1 +307 435 1 +371 435 1 +403 435 1 +419 435 1 +427 435 1 +431 435 1 +433 435 1 +434 435 1 +435 435 3037 +436 435 1 +437 435 1 +439 435 1 +443 435 1 +451 435 1 +467 435 1 +499 435 1 +180 436 1 +308 436 1 +372 436 1 +404 436 1 +420 436 1 +428 436 1 +432 436 1 +434 436 1 +435 436 1 +436 436 3041 +437 436 1 +438 436 1 +440 436 1 +444 436 1 +452 436 1 +468 436 1 +500 436 1 +181 437 1 +309 437 1 +373 437 1 +405 437 1 +421 437 1 +429 437 1 +433 437 1 +435 437 1 +436 437 1 +437 437 3049 +438 437 1 +439 437 1 +441 437 1 +445 437 1 +453 437 1 +469 437 1 +182 438 1 +310 438 1 +374 438 1 +406 438 1 +422 438 1 +430 438 1 +434 438 1 +436 438 1 +437 438 1 +438 438 3061 +439 438 1 +440 438 1 +442 438 1 +446 438 1 +454 438 1 +470 438 1 +183 439 1 +311 439 1 +375 439 1 +407 439 1 +423 439 1 +431 439 1 +435 439 1 +437 439 1 +438 439 1 +439 439 3067 +440 439 1 +441 439 1 +443 439 1 +447 439 1 +455 439 1 +471 439 1 +184 440 1 +312 440 1 +376 440 1 +408 440 1 +424 440 1 +432 440 1 +436 440 1 +438 440 1 +439 440 1 +440 440 3079 +441 440 1 +442 440 1 +444 440 1 +448 440 1 +456 440 1 +472 440 1 +185 441 1 +313 441 1 +377 441 1 +409 441 1 +425 441 1 +433 441 1 +437 441 1 +439 441 1 +440 441 1 +441 441 3083 +442 441 1 +443 441 1 +445 441 1 +449 441 1 +457 441 1 +473 441 1 +186 442 1 +314 442 1 +378 442 1 +410 442 1 +426 442 1 +434 442 1 +438 442 1 +440 442 1 +441 442 1 +442 442 3089 +443 442 1 +444 442 1 +446 442 1 +450 442 1 +458 442 1 +474 442 1 +187 443 1 +315 443 1 +379 443 1 +411 443 1 +427 443 1 +435 443 1 +439 443 1 +441 443 1 +442 443 1 +443 443 3109 +444 443 1 +445 443 1 +447 443 1 +451 443 1 +459 443 1 +475 443 1 +188 444 1 +316 444 1 +380 444 1 +412 444 1 +428 444 1 +436 444 1 +440 444 1 +442 444 1 +443 444 1 +444 444 3119 +445 444 1 +446 444 1 +448 444 1 +452 444 1 +460 444 1 +476 444 1 +189 445 1 +317 445 1 +381 445 1 +413 445 1 +429 445 1 +437 445 1 +441 445 1 +443 445 1 +444 445 1 +445 445 3121 +446 445 1 +447 445 1 +449 445 1 +453 445 1 +461 445 1 +477 445 1 +190 446 1 +318 446 1 +382 446 1 +414 446 1 +430 446 1 +438 446 1 +442 446 1 +444 446 1 +445 446 1 +446 446 3137 +447 446 1 +448 446 1 +450 446 1 +454 446 1 +462 446 1 +478 446 1 +191 447 1 +319 447 1 +383 447 1 +415 447 1 +431 447 1 +439 447 1 +443 447 1 +445 447 1 +446 447 1 +447 447 3163 +448 447 1 +449 447 1 +451 447 1 +455 447 1 +463 447 1 +479 447 1 +192 448 1 +320 448 1 +384 448 1 +416 448 1 +432 448 1 +440 448 1 +444 448 1 +446 448 1 +447 448 1 +448 448 3167 +449 448 1 +450 448 1 +452 448 1 +456 448 1 +464 448 1 +480 448 1 +193 449 1 +321 449 1 +385 449 1 +417 449 1 +433 449 1 +441 449 1 +445 449 1 +447 449 1 +448 449 1 +449 449 3169 +450 449 1 +451 449 1 +453 449 1 +457 449 1 +465 449 1 +481 449 1 +194 450 1 +322 450 1 +386 450 1 +418 450 1 +434 450 1 +442 450 1 +446 450 1 +448 450 1 +449 450 1 +450 450 3181 +451 450 1 +452 450 1 +454 450 1 +458 450 1 +466 450 1 +482 450 1 +195 451 1 +323 451 1 +387 451 1 +419 451 1 +435 451 1 +443 451 1 +447 451 1 +449 451 1 +450 451 1 +451 451 3187 +452 451 1 +453 451 1 +455 451 1 +459 451 1 +467 451 1 +483 451 1 +196 452 1 +324 452 1 +388 452 1 +420 452 1 +436 452 1 +444 452 1 +448 452 1 +450 452 1 +451 452 1 +452 452 3191 +453 452 1 +454 452 1 +456 452 1 +460 452 1 +468 452 1 +484 452 1 +197 453 1 +325 453 1 +389 453 1 +421 453 1 +437 453 1 +445 453 1 +449 453 1 +451 453 1 +452 453 1 +453 453 3203 +454 453 1 +455 453 1 +457 453 1 +461 453 1 +469 453 1 +485 453 1 +198 454 1 +326 454 1 +390 454 1 +422 454 1 +438 454 1 +446 454 1 +450 454 1 +452 454 1 +453 454 1 +454 454 3209 +455 454 1 +456 454 1 +458 454 1 +462 454 1 +470 454 1 +486 454 1 +199 455 1 +327 455 1 +391 455 1 +423 455 1 +439 455 1 +447 455 1 +451 455 1 +453 455 1 +454 455 1 +455 455 3217 +456 455 1 +457 455 1 +459 455 1 +463 455 1 +471 455 1 +487 455 1 +200 456 1 +328 456 1 +392 456 1 +424 456 1 +440 456 1 +448 456 1 +452 456 1 +454 456 1 +455 456 1 +456 456 3221 +457 456 1 +458 456 1 +460 456 1 +464 456 1 +472 456 1 +488 456 1 +201 457 1 +329 457 1 +393 457 1 +425 457 1 +441 457 1 +449 457 1 +453 457 1 +455 457 1 +456 457 1 +457 457 3229 +458 457 1 +459 457 1 +461 457 1 +465 457 1 +473 457 1 +489 457 1 +202 458 1 +330 458 1 +394 458 1 +426 458 1 +442 458 1 +450 458 1 +454 458 1 +456 458 1 +457 458 1 +458 458 3251 +459 458 1 +460 458 1 +462 458 1 +466 458 1 +474 458 1 +490 458 1 +203 459 1 +331 459 1 +395 459 1 +427 459 1 +443 459 1 +451 459 1 +455 459 1 +457 459 1 +458 459 1 +459 459 3253 +460 459 1 +461 459 1 +463 459 1 +467 459 1 +475 459 1 +491 459 1 +204 460 1 +332 460 1 +396 460 1 +428 460 1 +444 460 1 +452 460 1 +456 460 1 +458 460 1 +459 460 1 +460 460 3257 +461 460 1 +462 460 1 +464 460 1 +468 460 1 +476 460 1 +492 460 1 +205 461 1 +333 461 1 +397 461 1 +429 461 1 +445 461 1 +453 461 1 +457 461 1 +459 461 1 +460 461 1 +461 461 3259 +462 461 1 +463 461 1 +465 461 1 +469 461 1 +477 461 1 +493 461 1 +206 462 1 +334 462 1 +398 462 1 +430 462 1 +446 462 1 +454 462 1 +458 462 1 +460 462 1 +461 462 1 +462 462 3271 +463 462 1 +464 462 1 +466 462 1 +470 462 1 +478 462 1 +494 462 1 +207 463 1 +335 463 1 +399 463 1 +431 463 1 +447 463 1 +455 463 1 +459 463 1 +461 463 1 +462 463 1 +463 463 3299 +464 463 1 +465 463 1 +467 463 1 +471 463 1 +479 463 1 +495 463 1 +208 464 1 +336 464 1 +400 464 1 +432 464 1 +448 464 1 +456 464 1 +460 464 1 +462 464 1 +463 464 1 +464 464 3301 +465 464 1 +466 464 1 +468 464 1 +472 464 1 +480 464 1 +496 464 1 +209 465 1 +337 465 1 +401 465 1 +433 465 1 +449 465 1 +457 465 1 +461 465 1 +463 465 1 +464 465 1 +465 465 3307 +466 465 1 +467 465 1 +469 465 1 +473 465 1 +481 465 1 +497 465 1 +210 466 1 +338 466 1 +402 466 1 +434 466 1 +450 466 1 +458 466 1 +462 466 1 +464 466 1 +465 466 1 +466 466 3313 +467 466 1 +468 466 1 +470 466 1 +474 466 1 +482 466 1 +498 466 1 +211 467 1 +339 467 1 +403 467 1 +435 467 1 +451 467 1 +459 467 1 +463 467 1 +465 467 1 +466 467 1 +467 467 3319 +468 467 1 +469 467 1 +471 467 1 +475 467 1 +483 467 1 +499 467 1 +212 468 1 +340 468 1 +404 468 1 +436 468 1 +452 468 1 +460 468 1 +464 468 1 +466 468 1 +467 468 1 +468 468 3323 +469 468 1 +470 468 1 +472 468 1 +476 468 1 +484 468 1 +500 468 1 +213 469 1 +341 469 1 +405 469 1 +437 469 1 +453 469 1 +461 469 1 +465 469 1 +467 469 1 +468 469 1 +469 469 3329 +470 469 1 +471 469 1 +473 469 1 +477 469 1 +485 469 1 +214 470 1 +342 470 1 +406 470 1 +438 470 1 +454 470 1 +462 470 1 +466 470 1 +468 470 1 +469 470 1 +470 470 3331 +471 470 1 +472 470 1 +474 470 1 +478 470 1 +486 470 1 +215 471 1 +343 471 1 +407 471 1 +439 471 1 +455 471 1 +463 471 1 +467 471 1 +469 471 1 +470 471 1 +471 471 3343 +472 471 1 +473 471 1 +475 471 1 +479 471 1 +487 471 1 +216 472 1 +344 472 1 +408 472 1 +440 472 1 +456 472 1 +464 472 1 +468 472 1 +470 472 1 +471 472 1 +472 472 3347 +473 472 1 +474 472 1 +476 472 1 +480 472 1 +488 472 1 +217 473 1 +345 473 1 +409 473 1 +441 473 1 +457 473 1 +465 473 1 +469 473 1 +471 473 1 +472 473 1 +473 473 3359 +474 473 1 +475 473 1 +477 473 1 +481 473 1 +489 473 1 +218 474 1 +346 474 1 +410 474 1 +442 474 1 +458 474 1 +466 474 1 +470 474 1 +472 474 1 +473 474 1 +474 474 3361 +475 474 1 +476 474 1 +478 474 1 +482 474 1 +490 474 1 +219 475 1 +347 475 1 +411 475 1 +443 475 1 +459 475 1 +467 475 1 +471 475 1 +473 475 1 +474 475 1 +475 475 3371 +476 475 1 +477 475 1 +479 475 1 +483 475 1 +491 475 1 +220 476 1 +348 476 1 +412 476 1 +444 476 1 +460 476 1 +468 476 1 +472 476 1 +474 476 1 +475 476 1 +476 476 3373 +477 476 1 +478 476 1 +480 476 1 +484 476 1 +492 476 1 +221 477 1 +349 477 1 +413 477 1 +445 477 1 +461 477 1 +469 477 1 +473 477 1 +475 477 1 +476 477 1 +477 477 3389 +478 477 1 +479 477 1 +481 477 1 +485 477 1 +493 477 1 +222 478 1 +350 478 1 +414 478 1 +446 478 1 +462 478 1 +470 478 1 +474 478 1 +476 478 1 +477 478 1 +478 478 3391 +479 478 1 +480 478 1 +482 478 1 +486 478 1 +494 478 1 +223 479 1 +351 479 1 +415 479 1 +447 479 1 +463 479 1 +471 479 1 +475 479 1 +477 479 1 +478 479 1 +479 479 3407 +480 479 1 +481 479 1 +483 479 1 +487 479 1 +495 479 1 +224 480 1 +352 480 1 +416 480 1 +448 480 1 +464 480 1 +472 480 1 +476 480 1 +478 480 1 +479 480 1 +480 480 3413 +481 480 1 +482 480 1 +484 480 1 +488 480 1 +496 480 1 +225 481 1 +353 481 1 +417 481 1 +449 481 1 +465 481 1 +473 481 1 +477 481 1 +479 481 1 +480 481 1 +481 481 3433 +482 481 1 +483 481 1 +485 481 1 +489 481 1 +497 481 1 +226 482 1 +354 482 1 +418 482 1 +450 482 1 +466 482 1 +474 482 1 +478 482 1 +480 482 1 +481 482 1 +482 482 3449 +483 482 1 +484 482 1 +486 482 1 +490 482 1 +498 482 1 +227 483 1 +355 483 1 +419 483 1 +451 483 1 +467 483 1 +475 483 1 +479 483 1 +481 483 1 +482 483 1 +483 483 3457 +484 483 1 +485 483 1 +487 483 1 +491 483 1 +499 483 1 +228 484 1 +356 484 1 +420 484 1 +452 484 1 +468 484 1 +476 484 1 +480 484 1 +482 484 1 +483 484 1 +484 484 3461 +485 484 1 +486 484 1 +488 484 1 +492 484 1 +500 484 1 +229 485 1 +357 485 1 +421 485 1 +453 485 1 +469 485 1 +477 485 1 +481 485 1 +483 485 1 +484 485 1 +485 485 3463 +486 485 1 +487 485 1 +489 485 1 +493 485 1 +230 486 1 +358 486 1 +422 486 1 +454 486 1 +470 486 1 +478 486 1 +482 486 1 +484 486 1 +485 486 1 +486 486 3467 +487 486 1 +488 486 1 +490 486 1 +494 486 1 +231 487 1 +359 487 1 +423 487 1 +455 487 1 +471 487 1 +479 487 1 +483 487 1 +485 487 1 +486 487 1 +487 487 3469 +488 487 1 +489 487 1 +491 487 1 +495 487 1 +232 488 1 +360 488 1 +424 488 1 +456 488 1 +472 488 1 +480 488 1 +484 488 1 +486 488 1 +487 488 1 +488 488 3491 +489 488 1 +490 488 1 +492 488 1 +496 488 1 +233 489 1 +361 489 1 +425 489 1 +457 489 1 +473 489 1 +481 489 1 +485 489 1 +487 489 1 +488 489 1 +489 489 3499 +490 489 1 +491 489 1 +493 489 1 +497 489 1 +234 490 1 +362 490 1 +426 490 1 +458 490 1 +474 490 1 +482 490 1 +486 490 1 +488 490 1 +489 490 1 +490 490 3511 +491 490 1 +492 490 1 +494 490 1 +498 490 1 +235 491 1 +363 491 1 +427 491 1 +459 491 1 +475 491 1 +483 491 1 +487 491 1 +489 491 1 +490 491 1 +491 491 3517 +492 491 1 +493 491 1 +495 491 1 +499 491 1 +236 492 1 +364 492 1 +428 492 1 +460 492 1 +476 492 1 +484 492 1 +488 492 1 +490 492 1 +491 492 1 +492 492 3527 +493 492 1 +494 492 1 +496 492 1 +500 492 1 +237 493 1 +365 493 1 +429 493 1 +461 493 1 +477 493 1 +485 493 1 +489 493 1 +491 493 1 +492 493 1 +493 493 3529 +494 493 1 +495 493 1 +497 493 1 +238 494 1 +366 494 1 +430 494 1 +462 494 1 +478 494 1 +486 494 1 +490 494 1 +492 494 1 +493 494 1 +494 494 3533 +495 494 1 +496 494 1 +498 494 1 +239 495 1 +367 495 1 +431 495 1 +463 495 1 +479 495 1 +487 495 1 +491 495 1 +493 495 1 +494 495 1 +495 495 3539 +496 495 1 +497 495 1 +499 495 1 +240 496 1 +368 496 1 +432 496 1 +464 496 1 +480 496 1 +488 496 1 +492 496 1 +494 496 1 +495 496 1 +496 496 3541 +497 496 1 +498 496 1 +500 496 1 +241 497 1 +369 497 1 +433 497 1 +465 497 1 +481 497 1 +489 497 1 +493 497 1 +495 497 1 +496 497 1 +497 497 3547 +498 497 1 +499 497 1 +242 498 1 +370 498 1 +434 498 1 +466 498 1 +482 498 1 +490 498 1 +494 498 1 +496 498 1 +497 498 1 +498 498 3557 +499 498 1 +500 498 1 +243 499 1 +371 499 1 +435 499 1 +467 499 1 +483 499 1 +491 499 1 +495 499 1 +497 499 1 +498 499 1 +499 499 3559 +500 499 1 +244 500 1 +372 500 1 +436 500 1 +468 500 1 +484 500 1 +492 500 1 +496 500 1 +498 500 1 +499 500 1 +500 500 3571 diff --git a/SPEX/ExampleMats/Trefethen_500.rhs.txt b/SPEX/ExampleMats/Trefethen_500.rhs.txt new file mode 100644 index 0000000000..d776bc42cb --- /dev/null +++ b/SPEX/ExampleMats/Trefethen_500.rhs.txt @@ -0,0 +1,501 @@ +500 1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 diff --git a/SPEX/ExampleMats/example.mat.txt b/SPEX/ExampleMats/example.mat.txt new file mode 100644 index 0000000000..ec5a50dca9 --- /dev/null +++ b/SPEX/ExampleMats/example.mat.txt @@ -0,0 +1,9 @@ +4 4 8 +1 1 2 +4 1 -3 +2 2 5 +1 2 -1 +2 3 -1 +3 3 2 +1 4 -3 +4 4 5 diff --git a/SPEX/ExampleMats/example.rhs.txt b/SPEX/ExampleMats/example.rhs.txt new file mode 100644 index 0000000000..208faa80da --- /dev/null +++ b/SPEX/ExampleMats/example.rhs.txt @@ -0,0 +1,9 @@ +8 1 +1 +1 +1 +1 +1 +1 +1 +1 diff --git a/SPEX/ExampleMats/mesh1e1.mat.txt b/SPEX/ExampleMats/mesh1e1.mat.txt new file mode 100644 index 0000000000..9fa0f0b2ec --- /dev/null +++ b/SPEX/ExampleMats/mesh1e1.mat.txt @@ -0,0 +1,307 @@ +48 48 306 +1 1 2.977568 +2 1 -0.405002 +8 1 0.156027 +45 1 0.210025 +48 1 1.206514 +1 2 -0.405002 +2 2 4.058510 +3 2 0.216812 +42 2 0.182615 +43 2 0.638841 +46 2 0.334952 +48 2 1.280289 +2 3 0.216812 +3 3 2.124108 +4 3 -0.080115 +46 3 0.827181 +3 4 -0.080115 +4 4 3.031396 +5 4 0.225935 +37 4 0.586120 +44 4 0.508613 +46 4 0.630613 +4 5 0.225935 +5 5 2.107705 +6 5 -0.076779 +44 5 0.804992 +5 6 -0.076779 +6 6 3.078530 +7 6 0.205580 +41 6 0.712866 +44 6 0.564706 +47 6 0.518599 +6 7 0.205580 +7 7 2.094885 +8 7 -0.068234 +47 7 0.821071 +1 8 0.156027 +7 8 -0.068234 +8 8 3.126347 +35 8 0.648631 +45 8 0.785688 +47 8 0.467767 +9 9 3.713649 +10 9 0.080448 +15 9 0.031980 +18 9 0.576484 +23 9 0.745579 +30 9 0.652559 +31 9 0.626599 +9 10 0.080448 +10 10 3.000242 +11 10 0.277821 +21 10 1.210132 +23 10 0.431840 +10 11 0.277821 +11 11 4.943567 +12 11 -0.342455 +21 11 0.309926 +24 11 0.729180 +25 11 1.175784 +27 11 1.108401 +11 12 -0.342455 +12 12 5.015323 +13 12 0.382281 +27 12 0.830750 +34 12 0.126147 +36 12 1.103006 +38 12 1.230685 +12 13 0.382281 +13 13 2.840558 +14 13 0.139618 +19 13 0.405272 +34 13 0.913387 +13 14 0.139618 +14 14 4.112784 +15 14 0.564372 +16 14 0.231253 +17 14 0.686969 +19 14 1.490573 +9 15 0.031980 +14 15 0.564372 +15 15 3.090884 +16 15 1.033551 +18 15 0.460981 +14 16 0.231253 +15 16 1.033551 +16 16 5.176547 +17 16 1.431193 +18 16 0.931275 +20 16 0.549274 +14 17 0.686969 +16 17 1.431193 +17 17 5.374872 +19 17 0.680945 +20 17 0.538425 +22 17 1.037339 +9 18 0.576484 +15 18 0.460981 +16 18 0.931275 +18 18 4.713440 +20 18 0.473941 +31 18 0.694966 +40 18 0.575795 +13 19 0.405272 +14 19 1.490573 +17 19 0.680945 +19 19 5.539172 +22 19 0.776290 +34 19 1.186091 +16 20 0.549274 +17 20 0.538425 +18 20 0.473941 +20 20 5.005990 +22 20 0.434392 +40 20 1.030750 +42 20 0.197977 +43 20 0.781231 +10 21 1.210132 +11 21 0.309926 +21 21 4.962782 +23 21 0.575195 +24 21 1.128118 +28 21 0.739411 +17 22 1.037339 +19 22 0.776290 +20 22 0.434392 +22 22 5.319452 +34 22 0.340036 +37 22 0.579572 +43 22 0.462808 +46 22 0.689014 +9 23 0.745579 +10 23 0.431840 +21 23 0.575195 +23 23 4.774714 +28 23 0.928992 +30 23 0.725312 +33 23 0.367796 +11 24 0.729180 +21 24 1.128118 +24 24 5.100276 +25 24 0.727205 +26 24 0.958298 +28 24 0.557475 +11 25 1.175784 +24 25 0.727205 +25 25 5.381007 +26 25 0.822331 +27 25 0.541164 +29 25 1.114524 +24 26 0.958298 +25 26 0.822331 +26 26 5.383416 +28 26 0.746836 +29 26 0.232295 +35 26 0.301369 +41 26 0.586612 +47 26 0.735675 +11 27 1.108401 +12 27 0.830750 +25 27 0.541164 +27 27 5.419806 +29 27 1.068270 +38 27 0.871223 +21 28 0.739411 +23 28 0.928992 +24 28 0.557475 +26 28 0.746836 +28 28 5.210912 +33 28 0.469623 +35 28 0.768575 +25 29 1.114524 +26 29 0.232295 +27 29 1.068270 +29 29 5.401751 +38 29 0.587584 +39 29 0.468280 +41 29 0.930797 +9 30 0.652559 +23 30 0.725312 +30 30 4.836357 +31 30 1.060914 +32 30 0.492282 +33 30 0.905290 +9 31 0.626599 +18 31 0.694966 +30 31 1.060914 +31 31 4.778445 +32 31 0.506239 +40 31 0.889729 +30 32 0.492282 +31 32 0.506239 +32 32 5.173274 +33 32 0.988156 +40 32 0.911091 +42 32 0.667618 +45 32 0.607887 +23 33 0.367796 +28 33 0.469623 +30 33 0.905290 +32 33 0.988156 +33 33 5.162946 +35 33 1.048019 +45 33 0.384062 +12 34 0.126147 +13 34 0.913387 +19 34 1.186091 +22 34 0.340036 +34 34 5.312636 +36 34 1.009800 +37 34 0.737174 +8 35 0.648631 +26 35 0.301369 +28 35 0.768575 +33 35 1.048019 +35 35 5.257402 +45 35 0.587907 +47 35 0.902901 +12 36 1.103006 +34 36 1.009800 +36 36 5.427940 +37 36 0.751991 +38 36 0.351124 +39 36 1.212018 +4 37 0.586120 +22 37 0.579572 +34 37 0.737174 +36 37 0.751991 +37 37 5.210871 +39 37 0.292738 +44 37 0.699639 +46 37 0.563635 +12 38 1.230685 +27 38 0.871223 +29 38 0.587584 +36 38 0.351124 +38 38 5.131964 +39 38 1.091347 +29 39 0.468280 +36 39 1.212018 +37 39 0.292738 +38 39 1.091347 +39 39 5.533580 +41 39 0.587688 +44 39 0.881508 +18 40 0.575795 +20 40 1.030750 +31 40 0.889729 +32 40 0.911091 +40 40 5.095706 +42 40 0.688341 +6 41 0.712866 +26 41 0.586612 +29 41 0.930797 +39 41 0.587688 +41 41 5.133159 +44 41 0.659520 +47 41 0.655675 +2 42 0.182615 +20 42 0.197977 +32 42 0.667618 +40 42 0.688341 +42 42 5.211102 +43 42 1.175215 +45 42 0.168889 +48 42 1.130447 +2 43 0.638841 +20 43 0.781231 +22 43 0.462808 +42 43 1.175215 +43 43 5.243415 +46 43 1.185322 +4 44 0.508613 +5 44 0.804992 +6 44 0.564706 +37 44 0.699639 +39 44 0.881508 +41 44 0.659520 +44 44 5.118978 +1 45 0.210025 +8 45 0.785688 +32 45 0.607887 +33 45 0.384062 +35 45 0.587907 +42 45 0.168889 +45 45 5.095647 +48 45 1.351190 +2 46 0.334952 +3 46 0.827181 +4 46 0.630613 +22 46 0.689014 +37 46 0.563635 +43 46 1.185322 +46 46 5.230717 +6 47 0.518599 +7 47 0.821071 +8 47 0.467767 +26 47 0.735675 +35 47 0.902901 +41 47 0.655675 +47 47 5.101689 +1 48 1.206514 +2 48 1.280289 +42 48 1.130447 +45 48 1.351190 +48 48 5.968440 \ No newline at end of file diff --git a/SPEX/ExampleMats/mesh1e1.rhs.txt b/SPEX/ExampleMats/mesh1e1.rhs.txt new file mode 100644 index 0000000000..e31e55a135 --- /dev/null +++ b/SPEX/ExampleMats/mesh1e1.rhs.txt @@ -0,0 +1,49 @@ +48 1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 diff --git a/SPEX/SPEX_Left_LU/ExampleMats/test_mat.txt b/SPEX/ExampleMats/test.mat.txt similarity index 100% rename from SPEX/SPEX_Left_LU/ExampleMats/test_mat.txt rename to SPEX/ExampleMats/test.mat.txt diff --git a/SPEX/SPEX_Left_LU/ExampleMats/test_rhs.txt b/SPEX/ExampleMats/test.rhs.txt similarity index 100% rename from SPEX/SPEX_Left_LU/ExampleMats/test_rhs.txt rename to SPEX/ExampleMats/test.rhs.txt diff --git a/SPEX/ExampleMats/test1.mat.txt b/SPEX/ExampleMats/test1.mat.txt new file mode 100644 index 0000000000..75ca102575 --- /dev/null +++ b/SPEX/ExampleMats/test1.mat.txt @@ -0,0 +1,2 @@ +2 2 1 +1 2 3.14159 diff --git a/SPEX/ExampleMats/test2.mat.txt b/SPEX/ExampleMats/test2.mat.txt new file mode 100644 index 0000000000..dbb85ea23a --- /dev/null +++ b/SPEX/ExampleMats/test2.mat.txt @@ -0,0 +1,4 @@ +3 3 3 +2 1 1 +1 3 1 +3 2 1 diff --git a/SPEX/ExampleMats/test3.mat.txt b/SPEX/ExampleMats/test3.mat.txt new file mode 100644 index 0000000000..e4a20685cd --- /dev/null +++ b/SPEX/ExampleMats/test3.mat.txt @@ -0,0 +1,3 @@ +2 2 2 +1 2 3.14158 +2 1 3 diff --git a/SPEX/ExampleMats/test4.mat.txt b/SPEX/ExampleMats/test4.mat.txt new file mode 100644 index 0000000000..4715271504 --- /dev/null +++ b/SPEX/ExampleMats/test4.mat.txt @@ -0,0 +1,3 @@ +2 2 2 +1 2 1 +2 1 1 diff --git a/SPEX/ExampleMats/test5.mat.txt b/SPEX/ExampleMats/test5.mat.txt new file mode 100644 index 0000000000..4bec2e4e9d --- /dev/null +++ b/SPEX/ExampleMats/test5.mat.txt @@ -0,0 +1,2 @@ +2 1 1 +1 1 3.14159 diff --git a/SPEX/ExampleMats/tomography.mat b/SPEX/ExampleMats/tomography.mat new file mode 100644 index 0000000000..a69d1d3abb --- /dev/null +++ b/SPEX/ExampleMats/tomography.mat @@ -0,0 +1,28727 @@ +500 500 28726 +1 1 1.252630 +319 1 0.147929 +320 1 0.065746 +322 1 0.147929 +323 1 0.147929 +324 1 0.065746 +333 1 0.065746 +337 1 0.147929 +338 1 0.065746 +342 1 0.147929 +377 1 -4.451226 +402 1 -12.176466 +406 1 -18.602982 +427 1 -12.190485 +431 1 -24.917577 +452 1 -12.213604 +456 1 -25.187298 +477 1 -12.245813 +481 1 -25.487253 +2 2 0.940335 +319 2 0.065746 +321 2 0.065746 +322 2 0.065746 +329 2 0.065746 +332 2 0.065746 +333 2 0.147929 +335 2 0.147929 +336 2 0.065746 +361 2 -8.324114 +362 2 -0.784650 +377 2 -10.336360 +386 2 -10.985199 +402 2 -28.458070 +406 2 -9.167910 +410 2 -5.057559 +411 2 -6.366862 +426 2 -25.500777 +427 2 -3.257855 +431 2 -12.443869 +435 2 -11.902031 +451 2 -29.080771 +455 2 -9.113298 +456 2 -3.655776 +459 2 -5.672320 +460 2 -6.748318 +476 2 -29.424106 +480 2 -13.114869 +484 2 -12.982873 +500 2 -4.747824 +3 3 5.115220 +319 3 0.065746 +320 3 0.147929 +321 3 0.065746 +322 3 0.591716 +323 3 0.591716 +324 3 0.591716 +327 3 0.591716 +330 3 0.591716 +332 3 0.591716 +333 3 0.147929 +337 3 0.591716 +338 3 0.147929 +342 3 0.147929 +361 3 -4.407671 +362 3 -3.223390 +377 3 -10.106363 +386 3 -8.958698 +402 3 -27.539594 +406 3 -8.104303 +411 3 -9.049106 +427 3 -27.415523 +431 3 -10.779999 +436 3 -9.154717 +452 3 -27.312571 +456 3 -10.810839 +461 3 -9.276005 +477 3 -27.230770 +481 3 -10.853813 +486 3 -9.413512 +4 4 1.712853 +319 4 0.065746 +320 4 0.147929 +322 4 0.147929 +323 4 0.147929 +329 4 0.147929 +330 4 0.147929 +332 4 0.147929 +333 4 0.147929 +335 4 0.147929 +336 4 0.065746 +338 4 0.147929 +377 4 -10.242783 +402 4 -28.170308 +406 4 -8.737519 +426 4 -18.027776 +427 4 -10.396084 +431 4 -11.799299 +451 4 -28.698650 +455 4 -1.645017 +456 4 -10.392946 +476 4 -28.994403 +480 4 -12.293683 +5 5 3.619494 +319 5 0.065746 +321 5 0.147929 +322 5 0.065746 +323 5 0.147929 +324 5 0.065746 +327 5 0.591716 +333 5 0.065746 +334 5 0.147929 +336 5 0.591716 +337 5 0.147929 +338 5 0.591716 +339 5 0.147929 +342 5 0.591716 +361 5 -25.168329 +362 5 -1.271566 +377 5 -4.620854 +385 5 -14.866842 +386 5 -17.866260 +401 5 -0.023504 +402 5 -12.706425 +406 5 -10.797896 +409 5 -8.074397 +410 5 -26.954536 +426 5 -12.875755 +430 5 -7.485991 +431 5 -7.378833 +433 5 -4.776742 +434 5 -32.785398 +451 5 -13.031269 +454 5 -1.536498 +455 5 -13.961056 +457 5 -5.044059 +458 5 -35.305093 +476 5 -13.196266 +479 5 -16.166555 +481 5 -9.004540 +482 5 -34.397955 +500 5 -6.580751 +6 6 0.956772 +321 6 0.147929 +322 6 0.065746 +324 6 0.065746 +329 6 0.065746 +337 6 0.147929 +338 6 0.147929 +342 6 0.065746 +354 6 -4.130753 +355 6 -81.469571 +356 6 -32.918233 +357 6 -32.919603 +358 6 -32.921175 +359 6 -32.922987 +360 6 -32.925089 +361 6 -32.927542 +362 6 -0.956586 +379 6 -26.396467 +380 6 -79.295276 +381 6 -12.251710 +403 6 -4.496474 +404 6 -22.570360 +405 6 -21.205188 +406 6 -58.798166 +407 6 -8.386655 +428 6 -21.277207 +429 6 -6.495940 +431 6 -62.350037 +432 6 -18.115157 +433 6 -4.967501 +452 6 -9.221660 +453 6 -19.292844 +456 6 -37.130185 +457 6 -30.586221 +458 6 -14.793105 +459 6 -0.162442 +476 6 -0.876754 +477 6 -18.374785 +478 6 -10.037946 +481 6 -9.366111 +482 6 -51.471789 +483 6 -5.099449 +484 6 -14.165294 +7 7 2.238823 +321 7 0.591716 +322 7 0.147929 +324 7 0.147929 +329 7 0.591716 +336 7 0.065746 +337 7 0.147929 +338 7 0.147929 +342 7 0.147929 +357 7 -41.208517 +358 7 -132.578704 +359 7 -132.656444 +360 7 -132.746754 +361 7 -132.852373 +362 7 -3.861121 +380 7 -77.742411 +381 7 -253.881930 +382 7 -91.302873 +405 7 -158.762222 +406 7 -95.275320 +407 7 -31.016068 +429 7 -92.967984 +430 7 -75.560732 +431 7 -32.959927 +432 7 -63.879431 +433 7 -20.299512 +453 7 -13.726877 +454 7 -148.635861 +455 7 -11.306722 +457 7 -80.047474 +458 7 -24.189262 +459 7 -8.951231 +477 7 -0.479330 +478 7 -130.760401 +479 7 -36.433050 +480 7 -11.407530 +482 7 -52.354808 +483 7 -25.768197 +484 7 -31.404320 +8 8 5.049474 +319 8 0.147929 +321 8 0.147929 +322 8 0.591716 +323 8 0.591716 +324 8 0.065746 +327 8 0.591716 +330 8 0.591716 +333 8 0.147929 +334 8 0.591716 +337 8 0.591716 +338 8 0.591716 +339 8 0.147929 +361 8 -14.474784 +362 8 -3.353131 +377 8 -10.014716 +386 8 -21.112615 +402 8 -27.388614 +406 8 -18.575118 +411 8 -21.527227 +427 8 -27.409980 +431 8 -24.872344 +436 8 -21.985096 +452 8 -27.451829 +456 8 -25.132492 +460 8 -6.424869 +461 8 -16.063496 +477 8 -27.514143 +481 8 -25.422662 +485 8 -23.039351 +9 9 0.792406 +321 9 0.065746 +323 9 0.065746 +324 9 0.065746 +332 9 0.147929 +337 9 0.065746 +338 9 0.065746 +342 9 0.065746 +361 9 -4.864458 +362 9 -2.793026 +386 9 -8.999830 +411 9 -9.101684 +436 9 -9.219110 +461 9 -9.352637 +486 9 -9.502861 +10 10 1.614234 +320 10 0.147929 +322 10 0.591716 +323 10 0.065746 +324 10 0.065746 +327 10 0.065746 +329 10 0.065746 +333 10 0.065746 +337 10 0.147929 +338 10 0.147929 +377 10 -4.461743 +402 10 -12.224284 +427 10 -12.266240 +452 10 -12.317314 +476 10 -5.943525 +477 10 -6.433955 +11 11 1.433432 +322 11 0.147929 +323 11 0.591716 +324 11 0.147929 +337 11 0.147929 +342 11 0.147929 +12 12 2.370316 +322 12 0.591716 +323 12 0.065746 +324 12 0.147929 +327 12 0.147929 +333 12 0.065746 +334 12 0.591716 +335 12 0.147929 +336 12 0.147929 +337 12 0.147929 +342 12 0.065746 +377 12 -4.577713 +402 12 -12.598368 +426 12 -10.201625 +427 12 -2.522512 +451 12 -12.859438 +476 12 -13.004119 +13 13 1.121137 +319 13 0.147929 +322 13 0.147929 +323 13 0.065746 +324 13 0.147929 +327 13 0.065746 +334 13 0.147929 +342 13 0.147929 +406 13 -18.530332 +431 13 -24.799023 +456 13 -25.043083 +481 13 -25.316823 +14 14 4.539941 +319 14 0.147929 +320 14 0.591716 +322 14 0.147929 +323 14 0.147929 +324 14 0.147929 +327 14 0.591716 +330 14 0.591716 +332 14 0.591716 +333 14 0.147929 +337 14 0.591716 +342 14 0.591716 +377 14 -10.014792 +402 14 -27.385346 +406 14 -18.546347 +427 14 -27.401624 +431 14 -24.825336 +452 14 -27.438391 +456 14 -25.075256 +477 14 -27.495631 +481 14 -25.354980 +15 15 3.866042 +319 15 0.147929 +320 15 0.591716 +323 15 0.591716 +324 15 0.147929 +327 15 0.147929 +328 15 0.065746 +330 15 0.591716 +333 15 0.147929 +337 15 0.591716 +342 15 0.591716 +377 15 -10.014809 +402 15 -27.385097 +406 15 -18.545704 +427 15 -27.400943 +431 15 -24.824281 +452 15 -27.437278 +456 15 -25.073969 +460 15 -6.936143 +477 15 -27.494088 +481 15 -25.353454 +485 15 -10.250668 +16 16 2.534681 +319 16 0.147929 +321 16 0.147929 +322 16 0.591716 +323 16 0.147929 +324 16 0.147929 +330 16 0.147929 +334 16 0.147929 +335 16 0.591716 +337 16 0.065746 +342 16 0.147929 +361 16 -15.128925 +362 16 -2.951903 +386 16 -21.462625 +406 16 -18.797762 +411 16 -21.939985 +431 16 -25.227961 +436 16 -22.464168 +456 16 -25.557973 +460 16 -16.943933 +461 16 -6.093737 +481 16 -25.919695 +485 16 -23.663163 +17 17 2.600427 +319 17 0.147929 +320 17 0.147929 +321 17 0.147929 +323 17 0.065746 +324 17 0.591716 +328 17 0.147929 +333 17 0.065746 +336 17 0.147929 +337 17 0.591716 +338 17 0.147929 +342 17 0.147929 +361 17 -20.443097 +362 17 -1.546924 +377 17 -4.620256 +386 17 -26.719061 +402 17 -12.728116 +406 17 -21.553636 +410 17 -23.747794 +411 17 -4.266741 +426 17 -12.867891 +427 17 -0.005789 +430 17 -0.660260 +431 17 -28.715079 +434 17 -4.571338 +435 17 -24.855356 +451 17 -13.028927 +455 17 -30.282510 +459 17 -30.963781 +460 17 -21.525191 +476 17 -13.193657 +479 17 -4.542362 +480 17 -26.701773 +483 17 -21.647505 +484 17 -27.348116 +485 17 -16.452989 +500 17 -6.489718 +18 18 2.386752 +320 18 0.147929 +321 18 0.147929 +322 18 0.147929 +323 18 0.147929 +329 18 0.591716 +330 18 0.147929 +332 18 0.147929 +333 18 0.147929 +336 18 0.065746 +337 18 0.147929 +338 18 0.147929 +342 18 0.147929 +361 18 -20.622716 +362 18 -1.529765 +377 18 -16.270124 +386 18 -26.936927 +402 18 -11.873459 +403 18 -31.108445 +410 18 -24.907327 +411 18 -3.359047 +428 18 -11.150583 +429 18 -29.696707 +434 18 -6.416043 +435 18 -23.300048 +454 18 -13.325335 +455 18 -25.492342 +459 18 -31.294592 +480 18 -18.448030 +481 18 -18.453074 +483 18 -24.520030 +484 18 -8.490021 +19 19 1.696417 +319 19 0.147929 +321 19 0.065746 +322 19 0.065746 +323 19 0.591716 +327 19 0.147929 +330 19 0.147929 +333 19 0.147929 +337 19 0.065746 +338 19 0.065746 +361 19 -6.819240 +362 19 -1.259830 +377 19 -10.062830 +386 19 -9.598189 +402 19 -27.590889 +406 19 -18.936740 +411 19 -9.820563 +427 19 -27.715929 +431 19 -25.445191 +436 19 -10.064365 +451 19 -4.938707 +452 19 -22.922856 +456 19 -25.813406 +460 19 -9.048967 +461 19 -1.281799 +476 19 -28.027701 +480 19 -5.102938 +481 19 -21.111450 +485 19 -10.621010 +20 20 1.137574 +320 20 0.065746 +321 20 0.065746 +323 20 0.065746 +324 20 0.147929 +328 20 0.065746 +330 20 0.065746 +334 20 0.065746 +336 20 0.065746 +338 20 0.065746 +339 20 0.147929 +342 20 0.065746 +361 20 -10.640544 +362 20 -0.586045 +385 20 -4.697569 +386 20 -9.136824 +409 20 -0.296058 +410 20 -14.433768 +434 20 -15.714433 +458 20 -14.179447 +459 20 -2.615057 +460 20 -12.182791 +482 20 -13.934504 +483 20 -4.040770 +484 20 -16.385829 +485 20 -2.610146 +21 21 3.405819 +319 21 0.147929 +320 21 0.591716 +321 21 0.065746 +322 21 0.147929 +323 21 0.147929 +324 21 0.591716 +328 21 0.065746 +333 21 0.065746 +337 21 0.591716 +338 21 0.591716 +342 21 0.147929 +361 21 -6.232026 +362 21 -1.629572 +377 21 -4.451239 +386 21 -9.296669 +402 21 -12.169701 +406 21 -18.504980 +411 21 -9.464494 +427 21 -12.173765 +431 21 -24.757126 +436 21 -9.650686 +452 21 -12.186939 +456 21 -24.991629 +460 21 -6.887534 +461 21 -9.856108 +477 21 -12.209219 +481 21 -25.255620 +485 21 -19.906323 +486 21 -0.345037 +22 22 3.126397 +319 22 0.147929 +321 22 0.147929 +322 22 0.147929 +323 22 0.147929 +324 22 0.147929 +327 22 0.591716 +328 22 0.147929 +329 22 0.147929 +330 22 0.147929 +332 22 0.065746 +333 22 0.147929 +334 22 0.147929 +338 22 0.591716 +342 22 0.147929 +361 22 -14.792665 +362 22 -3.150153 +377 22 -10.018871 +386 22 -21.272193 +402 22 -27.420235 +406 22 -18.674362 +411 22 -21.715905 +427 22 -27.471265 +431 22 -25.032363 +436 22 -22.204484 +452 22 -27.542767 +456 22 -25.325364 +460 22 -27.370905 +461 22 -11.200097 +477 22 -27.634705 +481 22 -25.649140 +485 22 -46.762196 +23 23 4.293393 +320 23 0.147929 +321 23 0.147929 +322 23 0.147929 +323 23 0.591716 +324 23 0.147929 +327 23 0.065746 +328 23 0.065746 +329 23 0.591716 +330 23 0.591716 +333 23 0.065746 +334 23 0.591716 +335 23 0.147929 +341 23 0.591716 +342 23 0.147929 +361 23 -15.879580 +362 23 -2.572260 +377 23 -4.493346 +386 23 -21.969840 +402 23 -12.333145 +411 23 -22.532709 +427 23 -12.408069 +435 23 -4.899363 +436 23 -18.248440 +451 23 -10.810604 +452 23 -1.681615 +460 23 -31.148411 +476 23 -12.585534 +485 23 -35.448594 +24 24 1.630671 +320 24 0.147929 +321 24 0.147929 +322 24 0.147929 +323 24 0.147929 +324 24 0.147929 +329 24 0.147929 +330 24 0.147929 +332 24 0.065746 +336 24 0.147929 +341 24 0.065746 +342 24 0.065746 +361 24 -6.527524 +362 24 -10.545096 +386 24 -19.996850 +411 24 -20.148642 +436 24 -20.333237 +461 24 -20.551460 +486 24 -20.804282 +25 25 5.542571 +319 25 0.147929 +320 25 0.591716 +321 25 0.065746 +322 25 0.591716 +323 25 0.147929 +324 25 0.591716 +327 25 0.591716 +329 25 0.591716 +330 25 0.591716 +332 25 0.065746 +334 25 0.065746 +338 25 0.591716 +339 25 0.065746 +342 25 0.591716 +361 25 -6.366946 +362 25 -1.534821 +386 25 -9.353025 +406 25 -18.535979 +411 25 -9.531627 +431 25 -24.808314 +436 25 -9.729152 +456 25 -25.054454 +460 25 -1.793941 +461 25 -8.152579 +481 25 -25.330318 +485 25 -10.184732 +26 26 1.630671 +319 26 0.065746 +322 26 0.147929 +323 26 0.147929 +324 26 0.147929 +330 26 0.065746 +333 26 0.065746 +335 26 0.147929 +342 26 0.591716 +377 26 -4.456632 +402 26 -12.204115 +406 26 -8.336205 +427 26 -12.236984 +431 26 -11.183481 +452 26 -12.278957 +456 26 -11.324818 +477 26 -12.330014 +481 26 -11.480109 +27 27 5.723373 +319 27 0.591716 +322 27 0.147929 +323 27 0.147929 +324 27 0.591716 +328 27 0.147929 +329 27 0.147929 +330 27 0.591716 +332 27 0.591716 +333 27 0.591716 +336 27 0.591716 +339 27 0.591716 +341 27 0.147929 +342 27 0.591716 +377 27 -61.152282 +402 27 -56.332726 +403 27 -105.783558 +406 27 -40.913384 +407 27 -47.742027 +428 27 -71.178365 +429 27 -83.705917 +432 27 -114.369260 +454 27 -97.256782 +455 27 -50.732475 +457 27 -74.233878 +458 27 -36.523970 +460 27 -14.746031 +480 27 -135.118354 +481 27 -6.336597 +483 27 -107.389832 +485 27 -5.601739 +486 27 -15.550997 +28 28 1.236193 +319 28 0.147929 +322 28 0.065746 +323 28 0.065746 +324 28 0.147929 +328 28 0.065746 +329 28 0.065746 +332 28 0.147929 +337 28 0.065746 +339 28 0.065746 +342 28 0.147929 +406 28 -18.561522 +431 28 -24.850170 +456 28 -25.105531 +460 28 -7.939394 +481 28 -25.390810 +485 28 -11.901131 +29 29 0.660914 +323 29 0.065746 +324 29 0.065746 +330 29 0.147929 +341 29 0.065746 +342 29 0.065746 +30 30 1.482742 +319 30 0.065746 +323 30 0.147929 +324 30 0.147929 +329 30 0.065746 +330 30 0.147929 +335 30 0.065746 +336 30 0.147929 +337 30 0.147929 +341 30 0.147929 +342 30 0.147929 +406 30 -10.340295 +430 30 -5.220300 +431 30 -8.964578 +455 30 -14.730485 +479 30 -12.645940 +480 30 -2.661649 +31 31 1.778600 +321 31 0.147929 +324 31 0.147929 +326 31 0.065746 +327 31 0.147929 +329 31 0.065746 +332 31 0.147929 +333 31 0.147929 +335 31 0.065746 +336 31 0.147929 +337 31 0.147929 +338 31 0.147929 +339 31 0.147929 +361 31 -16.148300 +362 31 -2.456990 +377 31 -10.351824 +386 31 -22.178191 +402 31 -28.114022 +411 31 -22.774947 +427 31 -27.849393 +435 31 -8.632562 +436 31 -14.793666 +452 31 -27.607448 +460 31 -24.135238 +477 31 -3.960713 +478 31 -23.427575 +485 31 -24.905360 +32 32 2.008711 +319 32 0.065746 +320 32 0.591716 +321 32 0.147929 +324 32 0.147929 +326 32 0.147929 +327 32 0.065746 +328 32 0.147929 +332 32 0.147929 +334 32 0.147929 +342 32 0.147929 +361 32 -9.411513 +362 32 -7.736438 +386 32 -20.122125 +406 32 -8.100875 +411 32 -20.315179 +431 32 -10.769090 +436 32 -20.542130 +456 32 -10.792652 +460 32 -14.747022 +461 32 -20.803997 +481 32 -10.828309 +485 32 -21.604097 +486 32 -21.101946 +33 33 1.400559 +320 33 0.147929 +321 33 0.065746 +322 33 0.147929 +323 33 0.065746 +324 33 0.065746 +326 33 0.147929 +329 33 0.147929 +332 33 0.147929 +333 33 0.065746 +342 33 0.147929 +361 33 -4.013758 +362 33 -3.601260 +377 33 -4.505587 +386 33 -8.933010 +402 33 -12.270600 +411 33 -9.015698 +427 33 -12.205057 +436 33 -9.113361 +452 33 -12.148988 +461 33 -9.226439 +477 33 -12.102409 +486 33 -9.355433 +34 34 1.400559 +319 34 0.065746 +321 34 0.065746 +322 34 0.065746 +324 34 0.147929 +327 34 0.065746 +328 34 0.147929 +329 34 0.147929 +337 34 0.147929 +338 34 0.147929 +342 34 0.147929 +361 34 -5.043728 +362 34 -2.627440 +386 34 -9.020703 +406 34 -8.099589 +411 34 -9.128025 +431 34 -10.751085 +436 34 -9.251108 +456 34 -10.756038 +460 34 -14.869824 +461 34 -9.390506 +481 34 -10.773038 +485 34 -21.819119 +486 34 -9.546845 +35 35 2.074458 +320 35 0.147929 +323 35 0.147929 +324 35 0.591716 +326 35 0.591716 +329 35 0.065746 +330 35 0.065746 +337 35 0.065746 +341 35 0.147929 +481 35 -67.791057 +36 36 1.778600 +320 36 0.065746 +321 36 0.147929 +322 36 0.065746 +324 36 0.147929 +328 36 0.147929 +336 36 0.147929 +337 36 0.591716 +339 36 0.147929 +341 36 0.065746 +356 36 -17.195725 +357 36 -33.051273 +358 36 -33.062455 +359 36 -33.075362 +360 36 -33.090347 +361 36 -33.107859 +362 36 -0.962075 +380 36 -49.510780 +381 36 -226.463786 +382 36 -21.608644 +404 36 -3.255058 +405 36 -47.290752 +406 36 -174.872860 +407 36 -22.762807 +408 36 -36.230486 +409 36 -4.453979 +429 36 -14.833117 +430 36 -36.420267 +431 36 -50.489970 +432 36 -127.818852 +434 36 -32.080403 +435 36 -17.333106 +453 36 -10.314909 +454 36 -5.050658 +455 36 -36.660328 +456 36 -36.025557 +457 36 -137.656732 +460 36 -14.288346 +477 36 -3.944144 +478 36 -11.978916 +480 36 -36.939436 +481 36 -31.189397 +482 36 -36.281011 +483 36 -101.912482 +37 37 5.345332 +319 37 0.147929 +320 37 0.591716 +321 37 0.147929 +322 37 0.591716 +323 37 0.591716 +324 37 0.591716 +326 37 0.147929 +328 37 0.147929 +329 37 0.591716 +332 37 0.147929 +333 37 0.065746 +337 37 0.591716 +339 37 0.147929 +341 37 0.591716 +361 37 -8.066180 +362 37 -9.038622 +377 37 -4.503474 +386 37 -20.051608 +402 37 -12.265852 +406 37 -18.223794 +411 37 -20.222362 +427 37 -12.201807 +431 37 -24.216354 +436 37 -20.426396 +452 37 -12.147222 +456 37 -24.258069 +460 37 -14.685008 +461 37 -20.664620 +477 37 -12.102114 +481 37 -24.326953 +485 37 -21.493667 +486 37 -20.938095 +38 38 1.696417 +319 38 0.147929 +320 38 0.147929 +321 38 0.147929 +326 38 0.065746 +328 38 0.147929 +330 38 0.065746 +332 38 0.147929 +333 38 0.065746 +334 38 0.147929 +337 38 0.065746 +341 38 0.147929 +342 38 0.147929 +361 38 -19.731781 +362 38 -1.624135 +377 38 -4.514441 +386 38 -25.869457 +402 38 -12.401189 +406 38 -20.699218 +410 38 -18.932009 +411 38 -8.101620 +426 38 -3.024245 +427 38 -9.467112 +431 38 -28.105110 +435 38 -28.301048 +451 38 -12.590825 +455 38 -21.440253 +456 38 -7.410322 +459 38 -26.571090 +460 38 -23.792087 +476 38 -12.699513 +480 38 -29.642978 +483 38 -9.830409 +484 38 -34.176393 +485 38 -18.588203 +39 39 1.499178 +321 39 0.591716 +322 39 0.147929 +333 39 0.147929 +337 39 0.147929 +341 39 0.065746 +342 39 0.147929 +361 39 -110.279685 +362 39 -4.817527 +377 39 -20.734382 +385 39 -90.337375 +386 39 -53.407407 +402 39 -4.576064 +403 39 -37.753811 +404 39 -11.639795 +409 39 -85.540701 +410 39 -69.764831 +429 39 -26.441754 +430 39 -23.702301 +433 39 -96.479364 +434 39 -71.670516 +455 39 -14.761797 +456 39 -31.803827 +457 39 -123.999913 +458 39 -58.360781 +481 39 -50.680972 +482 39 -84.947374 +40 40 5.641190 +320 40 0.065746 +321 40 0.147929 +322 40 0.147929 +323 40 0.147929 +326 40 0.591716 +327 40 0.591716 +328 40 0.147929 +329 40 0.147929 +330 40 0.591716 +332 40 0.591716 +333 40 0.591716 +335 40 0.147929 +338 40 0.591716 +339 40 0.147929 +341 40 0.591716 +342 40 0.147929 +362 40 -18.482491 +377 40 -63.421393 +387 40 -21.049684 +402 40 -51.040100 +403 40 -116.749562 +412 40 -20.581967 +428 40 -55.323594 +429 40 -104.487007 +437 40 -20.159220 +454 40 -70.987705 +455 40 -81.227147 +460 40 -10.019620 +461 40 -6.124387 +462 40 -7.670096 +463 40 -12.109049 +480 40 -98.364707 +481 40 -46.666176 +486 40 -22.859938 +488 40 -19.439670 +41 41 2.304569 +319 41 0.147929 +322 41 0.147929 +323 41 0.591716 +324 41 0.065746 +333 41 0.065746 +336 41 0.147929 +337 41 0.591716 +341 41 0.147929 +342 41 0.147929 +377 41 -4.505089 +402 41 -12.269479 +406 41 -19.159891 +427 41 -12.204287 +431 41 -25.789474 +452 41 -12.148565 +456 41 -26.213901 +477 41 -12.102331 +480 41 -15.536908 +481 41 -11.135896 +42 42 5.427515 +319 42 0.147929 +320 42 0.591716 +321 42 0.147929 +322 42 0.591716 +323 42 0.591716 +327 42 0.591716 +328 42 0.147929 +329 42 0.591716 +330 42 0.591716 +337 42 0.591716 +341 42 0.591716 +361 42 -14.519357 +362 42 -3.323787 +386 42 -21.133828 +406 42 -18.588927 +411 42 -21.552363 +431 42 -24.894795 +436 42 -22.014367 +456 42 -25.159726 +460 42 -22.839353 +461 42 -15.381330 +481 42 -25.454783 +485 42 -46.295135 +43 43 6.084977 +319 43 0.065746 +320 43 0.591716 +321 43 0.147929 +322 43 0.591716 +323 43 0.591716 +324 43 0.591716 +328 43 0.591716 +329 43 0.147929 +330 43 0.591716 +337 43 0.591716 +339 43 0.591716 +341 43 0.591716 +342 43 0.147929 +361 43 -10.201485 +362 43 -6.982595 +386 43 -20.179427 +406 43 -8.106022 +411 43 -20.389275 +431 43 -10.784684 +436 43 -20.633530 +456 43 -10.818276 +460 43 -59.215500 +461 43 -20.913289 +481 43 -10.864019 +485 43 -86.816621 +486 43 -21.229800 +44 44 6.019231 +319 44 0.591716 +320 44 0.147929 +321 44 0.147929 +322 44 0.591716 +323 44 0.591716 +324 44 0.147929 +327 44 0.591716 +328 44 0.147929 +329 44 0.591716 +330 44 0.591716 +335 44 0.147929 +337 44 0.147929 +339 44 0.591716 +341 44 0.591716 +342 44 0.147929 +361 44 -15.770933 +362 44 -2.621876 +386 44 -21.889499 +406 44 -76.494962 +411 44 -22.439137 +431 44 -102.935979 +435 44 -3.356098 +436 44 -19.684029 +456 44 -104.598601 +460 44 -40.112588 +480 44 -56.184500 +481 44 -50.213511 +485 44 -48.812055 +45 45 1.647107 +320 45 0.065746 +322 45 0.147929 +324 45 0.147929 +329 45 0.147929 +336 45 0.147929 +337 45 0.147929 +338 45 0.147929 +339 45 0.147929 +341 45 0.147929 +342 45 0.147929 +379 45 -98.773841 +403 45 -12.720175 +404 45 -189.623080 +405 45 -89.127183 +428 45 -61.255581 +429 45 -63.678114 +430 45 -123.270081 +431 45 -38.599475 +452 45 -22.981646 +453 45 -40.893243 +454 45 -52.134496 +455 45 -85.950130 +456 45 -51.073977 +457 45 -29.610458 +476 45 -3.902438 +477 45 -48.199866 +478 45 -13.459352 +479 45 -52.300952 +480 45 -11.535572 +481 45 -100.756870 +482 45 -27.072676 +483 45 -21.760883 +46 46 1.071828 +320 46 0.065746 +321 46 0.065746 +322 46 0.065746 +324 46 0.147929 +329 46 0.065746 +337 46 0.147929 +338 46 0.065746 +339 46 0.065746 +341 46 0.065746 +342 46 0.065746 +360 46 -5.300417 +361 46 -15.703519 +362 46 -0.457851 +383 46 -2.733954 +384 46 -15.521635 +385 46 -10.304363 +406 46 -4.957611 +407 46 -15.390490 +408 46 -12.717033 +429 46 -19.816396 +430 46 -15.293127 +431 46 -10.380728 +453 46 -14.792027 +454 46 -137.433488 +455 46 -17.287376 +477 46 -2.746153 +478 46 -27.426484 +479 46 -33.357521 +480 46 -93.817949 +481 46 -8.368114 +47 47 4.819362 +320 47 0.147929 +321 47 0.591716 +322 47 0.591716 +323 47 0.591716 +324 47 0.147929 +329 47 0.591716 +330 47 0.591716 +333 47 0.065746 +336 47 0.065746 +337 47 0.591716 +342 47 0.591716 +361 47 -79.634950 +362 47 -6.413653 +377 47 -6.846513 +386 47 -104.314764 +402 47 -6.133039 +403 47 -12.009546 +410 47 -80.665512 +411 47 -28.434643 +428 47 -7.532416 +429 47 -9.789751 +435 47 -114.311458 +454 47 -10.181533 +455 47 -6.358668 +459 47 -115.429887 +460 47 -4.548613 +480 47 -14.136051 +481 47 -1.663387 +483 47 -51.365148 +484 47 -74.765363 +48 48 1.121137 +320 48 0.147929 +322 48 0.065746 +324 48 0.147929 +329 48 0.147929 +337 48 0.065746 +341 48 0.147929 +342 48 0.147929 +431 48 -46.733912 +455 48 -35.415755 +456 48 -117.551111 +457 48 -26.048194 +479 48 -21.940921 +480 48 -31.275797 +481 48 -55.921830 +482 48 -53.332503 +483 48 -15.707034 +49 49 1.055391 +319 49 0.147929 +320 49 0.147929 +322 49 0.065746 +324 49 0.147929 +326 49 0.147929 +337 49 0.147929 +406 49 -19.034662 +431 49 -25.596835 +456 49 -25.990362 +480 49 -10.070856 +481 49 -16.346546 +50 50 2.156640 +319 50 0.147929 +320 50 0.147929 +324 50 0.147929 +326 50 0.065746 +328 50 0.065746 +332 50 0.591716 +334 50 0.147929 +335 50 0.147929 +336 50 0.147929 +337 50 0.147929 +339 50 0.147929 +406 50 -20.799257 +431 50 -28.254075 +455 50 -22.705328 +456 50 -6.313395 +460 50 -9.495067 +480 50 -29.831163 +484 50 -6.980270 +485 50 -7.485079 +51 51 1.055391 +319 51 0.065746 +321 51 0.147929 +325 51 0.147929 +326 51 0.147929 +340 51 0.147929 +341 51 0.147929 +361 51 -20.228518 +362 51 -1.568580 +386 51 -26.460454 +406 51 -9.276369 +410 51 -22.334460 +411 51 -5.381311 +431 51 -12.605374 +434 51 -2.320426 +435 51 -26.763167 +444 51 -25.951377 +455 51 -15.960022 +456 51 -8.534256 +459 51 -30.571842 +469 51 -27.896355 +470 51 -7.601628 +480 51 -43.460308 +483 51 -18.160139 +484 51 -14.028071 +495 51 -35.061679 +52 52 1.860782 +319 52 0.147929 +320 52 0.147929 +321 52 0.147929 +324 52 0.065746 +326 52 0.147929 +328 52 0.147929 +330 52 0.147929 +333 52 0.147929 +335 52 0.147929 +337 52 0.147929 +339 52 0.065746 +341 52 0.147929 +361 52 -20.145268 +362 52 -1.577341 +377 52 -10.124081 +386 52 -26.360636 +402 52 -27.795374 +406 52 -20.793876 +410 52 -21.777414 +411 52 -5.823086 +427 52 -27.974791 +431 52 -28.246065 +434 52 -1.432575 +435 52 -27.518702 +451 52 -28.077937 +452 52 -0.097080 +455 52 -22.638554 +456 52 -6.371129 +459 52 -30.420765 +460 52 -21.331865 +476 52 -28.395900 +480 52 -29.821048 +483 52 -16.789944 +484 52 -30.800801 +485 52 -16.919676 +53 53 3.685240 +319 53 0.147929 +320 53 0.591716 +321 53 0.147929 +322 53 0.065746 +323 53 0.147929 +324 53 0.147929 +326 53 0.147929 +327 53 0.065746 +329 53 0.065746 +330 53 0.065746 +332 53 0.065746 +333 53 0.147929 +337 53 0.591716 +338 53 0.147929 +339 53 0.147929 +341 53 0.147929 +342 53 0.591716 +361 53 -14.313914 +362 53 -3.461349 +377 53 -10.014786 +386 53 -21.039114 +402 53 -27.385437 +406 53 -18.547622 +411 53 -21.439990 +427 53 -27.401874 +431 53 -24.827427 +436 53 -21.883390 +452 53 -27.438798 +456 53 -25.077809 +460 53 -3.849293 +461 53 -18.522090 +477 53 -27.496196 +481 53 -25.358003 +485 53 -22.906210 +54 54 5.706936 +319 54 0.591716 +320 54 0.591716 +321 54 0.147929 +322 54 0.065746 +323 54 0.147929 +324 54 0.147929 +326 54 0.147929 +327 54 0.147929 +328 54 0.065746 +329 54 0.591716 +330 54 0.591716 +332 54 0.147929 +333 54 0.147929 +338 54 0.591716 +339 54 0.147929 +341 54 0.591716 +342 54 0.591716 +361 54 -14.320749 +362 54 -3.456679 +377 54 -10.014750 +386 54 -21.042140 +402 54 -27.386135 +406 54 -74.201620 +411 54 -21.443587 +427 54 -27.403736 +431 54 -99.327946 +436 54 -21.887587 +452 54 -27.441824 +456 54 -100.333489 +460 54 -10.897401 +461 54 -18.417792 +477 54 -27.500383 +481 54 -101.458367 +485 54 -33.167098 +55 55 2.781229 +319 55 0.065746 +320 55 0.147929 +321 55 0.065746 +322 55 0.065746 +323 55 0.065746 +324 55 0.591716 +326 55 0.591716 +329 55 0.065746 +332 55 0.065746 +333 55 0.065746 +336 55 0.147929 +338 55 0.591716 +361 55 -6.254351 +362 55 -1.613529 +377 55 -8.199372 +386 55 -9.305509 +402 55 -3.531790 +403 55 -17.541360 +404 55 -0.428142 +406 55 -4.513915 +407 55 -5.371182 +411 55 -9.475048 +429 55 -17.325341 +430 55 -2.879626 +432 55 -12.748149 +436 55 -9.663040 +455 55 -15.124218 +456 55 -3.857234 +457 55 -7.931850 +458 55 -4.409279 +460 55 -0.006368 +461 55 -9.863991 +481 55 -14.444965 +482 55 -3.391800 +483 55 -11.961533 +485 55 -10.097953 +56 56 1.860782 +320 56 0.147929 +322 56 0.147929 +323 56 0.147929 +324 56 0.147929 +326 56 0.147929 +327 56 0.147929 +329 56 0.147929 +332 56 0.147929 +336 56 0.065746 +337 56 0.147929 +341 56 0.065746 +342 56 0.147929 +430 56 -205.426508 +431 56 -5.726831 +454 56 -70.905286 +455 56 -165.919726 +456 56 -83.641404 +457 56 -2.763457 +478 56 -28.820964 +479 56 -71.170527 +480 56 -99.558918 +481 56 -78.678543 +482 56 -43.564410 +57 57 5.641190 +319 57 0.147929 +320 57 0.591716 +322 57 0.065746 +323 57 0.147929 +324 57 0.147929 +326 57 0.147929 +327 57 0.591716 +329 57 0.591716 +330 57 0.591716 +332 57 0.147929 +333 57 0.147929 +337 57 0.591716 +338 57 0.591716 +339 57 0.147929 +341 57 0.591716 +342 57 0.147929 +377 57 -10.014828 +402 57 -27.384852 +406 57 -18.545059 +427 57 -27.400265 +431 57 -24.823224 +452 57 -27.436168 +456 57 -25.072678 +477 57 -27.492546 +481 57 -25.351925 +58 58 2.518245 +319 58 0.147929 +320 58 0.065746 +322 58 0.065746 +324 58 0.147929 +326 58 0.591716 +328 58 0.591716 +329 58 0.147929 +338 58 0.147929 +339 58 0.147929 +341 58 0.065746 +342 58 0.147929 +376 58 -222.657604 +377 58 -106.117424 +378 58 -32.984077 +379 58 -12.016942 +400 58 -8.070001 +401 58 -270.024618 +402 58 -138.475361 +403 58 -133.752017 +404 58 -154.843657 +405 58 -167.002305 +406 58 -122.370814 +425 58 -13.910080 +426 58 -160.645139 +427 58 -106.206667 +428 58 -63.089901 +429 58 -3.079225 +431 58 -38.836316 +432 58 -134.342669 +433 58 -134.548526 +434 58 -133.487308 +449 58 -1.282085 +450 58 -12.856128 +451 58 -40.824591 +452 58 -143.159985 +453 58 -76.000687 +454 58 -56.840889 +455 58 -7.272287 +459 58 -1.299752 +460 58 -115.826749 +474 58 -14.374296 +475 58 -8.780397 +476 58 -29.199747 +477 58 -131.320148 +478 58 -50.669460 +479 58 -40.611079 +480 58 -46.824378 +481 58 -8.241846 +499 58 -14.617538 +500 58 -28.466389 +59 59 1.729290 +319 59 0.147929 +320 59 0.147929 +323 59 0.147929 +324 59 0.147929 +335 59 0.147929 +337 59 0.147929 +338 59 0.147929 +339 59 0.147929 +341 59 0.147929 +342 59 0.147929 +406 59 -19.284057 +431 59 -25.979335 +456 59 -26.433110 +480 59 -20.211682 +481 59 -6.710637 +60 60 3.833169 +319 60 0.147929 +320 60 0.147929 +321 60 0.065746 +322 60 0.147929 +323 60 0.591716 +324 60 0.065746 +326 60 0.147929 +327 60 0.591716 +328 60 0.147929 +329 60 0.147929 +333 60 0.065746 +334 60 0.591716 +335 60 0.065746 +337 60 0.147929 +338 60 0.147929 +339 60 0.147929 +341 60 0.147929 +342 60 0.065746 +361 60 -7.266940 +362 60 -1.056421 +377 60 -4.531172 +386 60 -9.930565 +402 60 -12.454076 +406 60 -19.471928 +411 60 -10.207594 +426 60 -5.583511 +427 60 -6.971240 +431 60 -26.264939 +435 60 -5.048813 +436 60 -5.460870 +451 60 -12.664788 +456 60 -26.761233 +460 60 -27.683659 +476 60 -12.784088 +480 60 -26.248698 +481 60 -1.045727 +485 60 -36.302550 +61 61 4.687870 +320 61 0.591716 +322 61 0.591716 +323 61 0.147929 +324 61 0.591716 +326 61 0.591716 +328 61 0.591716 +329 61 0.147929 +337 61 0.147929 +338 61 0.147929 +339 61 0.147929 +341 61 0.591716 +342 61 0.147929 +460 61 -59.195636 +485 61 -86.781814 +62 62 1.910092 +319 62 0.147929 +322 62 0.147929 +323 62 0.147929 +324 62 0.065746 +326 62 0.065746 +328 62 0.065746 +329 62 0.147929 +332 62 0.147929 +334 62 0.147929 +335 62 0.147929 +336 62 0.147929 +337 62 0.065746 +339 62 0.065746 +342 62 0.147929 +406 62 -18.356880 +431 62 -24.257259 +456 62 -9.858349 +457 62 -14.286437 +460 62 -6.578521 +482 62 -24.060070 +485 62 -9.644576 +63 63 3.257890 +319 63 0.147929 +320 63 0.591716 +322 63 0.147929 +323 63 0.147929 +324 63 0.065746 +327 63 0.147929 +328 63 0.065746 +330 63 0.147929 +334 63 0.147929 +335 63 0.065746 +337 63 0.591716 +338 63 0.591716 +341 63 0.147929 +406 63 -18.883705 +431 63 -25.362607 +456 63 -25.716598 +460 63 -7.153144 +480 63 -2.088591 +481 63 -24.014362 +485 63 -10.610042 +64 64 1.466305 +319 64 0.147929 +320 64 0.065746 +324 64 0.147929 +327 64 0.147929 +332 64 0.065746 +334 64 0.065746 +335 64 0.065746 +336 64 0.147929 +337 64 0.065746 +338 64 0.147929 +339 64 0.147929 +406 64 -18.297963 +431 64 -24.393933 +456 64 -24.526376 +481 64 -24.686684 +65 65 6.084977 +319 65 0.065746 +320 65 0.591716 +322 65 0.591716 +323 65 0.591716 +324 65 0.591716 +325 65 0.147929 +327 65 0.591716 +329 65 0.147929 +332 65 0.591716 +333 65 0.147929 +334 65 0.147929 +337 65 0.591716 +338 65 0.147929 +339 65 0.147929 +341 65 0.591716 +342 65 0.147929 +377 65 -10.103789 +402 65 -27.533988 +406 65 -8.104770 +427 65 -27.412003 +431 65 -10.781306 +444 65 -24.345457 +452 65 -27.311119 +456 65 -10.812932 +469 65 -33.409349 +477 65 -27.231371 +481 65 -10.856697 +494 65 -15.284216 +495 65 -17.847314 +66 66 2.896285 +319 66 0.065746 +320 66 0.147929 +321 66 0.065746 +323 66 0.147929 +324 66 0.147929 +327 66 0.147929 +329 66 0.147929 +339 66 0.591716 +341 66 0.591716 +342 66 0.591716 +361 66 -6.086518 +362 66 -1.737442 +386 66 -9.243464 +406 66 -8.194424 +411 66 -9.400764 +431 66 -10.952775 +436 66 -9.575913 +456 66 -11.044782 +461 66 -9.769719 +481 66 -11.149664 +485 66 -7.379346 +486 66 -2.603719 +67 67 1.630671 +319 67 0.147929 +320 67 0.147929 +321 67 0.065746 +322 67 0.147929 +324 67 0.147929 +327 67 0.147929 +328 67 0.065746 +329 67 0.065746 +339 67 0.147929 +341 67 0.147929 +342 67 0.147929 +361 67 -6.105527 +362 67 -1.723038 +386 67 -9.249996 +406 67 -18.442142 +411 67 -9.408609 +431 67 -24.651715 +436 67 -9.585134 +456 67 -24.860753 +460 67 -6.842637 +461 67 -9.780387 +481 67 -25.098796 +485 67 -17.777734 +486 67 -2.312124 +68 68 1.252630 +320 68 0.065746 +321 68 0.065746 +322 68 0.147929 +323 68 0.147929 +324 68 0.065746 +327 68 0.147929 +330 68 0.065746 +333 68 0.147929 +341 68 0.147929 +361 68 -11.062230 +362 68 -0.569468 +377 68 -10.298574 +385 68 -6.185843 +386 68 -8.199440 +402 68 -28.342398 +409 68 -2.861670 +410 68 -12.515057 +426 68 -22.857023 +427 68 -5.767723 +433 68 -1.073923 +434 68 -15.395892 +451 68 -28.928535 +457 68 -0.845954 +458 68 -16.825666 +476 68 -29.253428 +481 68 -2.227964 +482 68 -16.759690 +69 69 1.482742 +319 69 0.065746 +320 69 0.147929 +321 69 0.147929 +323 69 0.147929 +324 69 0.065746 +333 69 0.065746 +336 69 0.147929 +339 69 0.147929 +341 69 0.147929 +342 69 0.147929 +361 69 -28.104345 +362 69 -1.192626 +377 69 -4.547179 +385 69 -24.213197 +386 69 -12.445225 +402 69 -12.504086 +406 69 -11.510742 +409 69 -24.196563 +410 69 -15.492393 +426 69 -7.481691 +427 69 -5.132259 +430 69 -10.496468 +431 69 -5.430674 +433 69 -28.234771 +434 69 -14.826366 +451 69 -12.733235 +454 69 -7.054273 +455 69 -9.645606 +457 69 -36.569625 +458 69 -10.226924 +476 69 -12.861824 +478 69 -4.908989 +479 69 -12.607878 +480 69 -11.881770 +481 69 -37.600215 +482 69 -1.424479 +70 70 1.696417 +319 70 0.147929 +320 70 0.147929 +321 70 0.065746 +322 70 0.147929 +323 70 0.147929 +324 70 0.065746 +327 70 0.147929 +336 70 0.147929 +338 70 0.065746 +339 70 0.147929 +341 70 0.065746 +342 70 0.147929 +361 70 -12.561094 +362 70 -0.528588 +385 70 -10.973466 +386 70 -5.414406 +406 70 -26.123297 +409 70 -11.120106 +410 70 -6.633377 +430 70 -24.486476 +431 70 -11.684420 +433 70 -13.085441 +434 70 -6.188294 +454 70 -17.453589 +455 70 -20.501083 +456 70 -0.122685 +457 70 -16.858210 +458 70 -3.977437 +478 70 -13.346608 +479 70 -26.494032 +480 70 -6.249131 +481 70 -16.563038 +71 71 1.236193 +320 71 0.065746 +324 71 0.147929 +328 71 0.065746 +333 71 0.065746 +336 71 0.065746 +337 71 0.065746 +338 71 0.147929 +339 71 0.065746 +341 71 0.147929 +342 71 0.147929 +377 71 -4.663173 +401 71 -1.810557 +402 71 -11.047210 +426 71 -13.021485 +451 71 -13.195041 +460 71 -11.579610 +476 71 -13.378176 +484 71 -14.447269 +485 71 -3.519299 +500 71 -12.295657 +72 72 4.293393 +319 72 0.065746 +320 72 0.147929 +322 72 0.065746 +324 72 0.147929 +327 72 0.591716 +329 72 0.147929 +330 72 0.591716 +332 72 0.591716 +333 72 0.065746 +334 72 0.591716 +337 72 0.147929 +338 72 0.147929 +341 72 0.147929 +342 72 0.591716 +377 72 -4.451576 +402 72 -12.168821 +406 72 -8.226189 +427 72 -12.170251 +431 72 -11.006074 +452 72 -12.180796 +456 72 -11.110969 +477 72 -12.200451 +481 72 -11.228983 +73 73 1.482742 +319 73 0.147929 +320 73 0.147929 +322 73 0.065746 +324 73 0.065746 +327 73 0.147929 +337 73 0.147929 +338 73 0.147929 +339 73 0.147929 +341 73 0.065746 +342 73 0.147929 +406 73 -25.890662 +430 73 -23.583745 +431 73 -12.239619 +454 73 -15.811472 +455 73 -21.748841 +478 73 -10.957009 +479 73 -28.439723 +74 74 0.611604 +322 74 0.065746 +324 74 0.147929 +330 74 0.147929 +75 75 7.350592 +319 75 0.147929 +320 75 0.591716 +322 75 0.591716 +323 75 0.591716 +324 75 0.591716 +325 75 0.591716 +327 75 0.591716 +329 75 0.591716 +330 75 0.591716 +334 75 0.591716 +337 75 0.591716 +338 75 0.147929 +339 75 0.147929 +341 75 0.591716 +342 75 0.147929 +406 75 -18.532036 +431 75 -24.801828 +444 75 -94.696177 +456 75 -25.046517 +469 75 -130.179284 +481 75 -25.320900 +494 75 -129.372245 +76 76 0.907462 +323 76 0.065746 +334 76 0.591716 +77 77 1.532051 +319 77 0.065746 +321 77 0.065746 +322 77 0.065746 +323 77 0.065746 +324 77 0.065746 +327 77 0.147929 +333 77 0.065746 +337 77 0.147929 +338 77 0.147929 +339 77 0.147929 +341 77 0.147929 +342 77 0.147929 +361 77 -6.713366 +362 77 -1.317953 +377 77 -4.459245 +386 77 -9.532609 +402 77 -12.214667 +406 77 -8.354574 +411 77 -9.743665 +427 77 -12.252534 +431 77 -11.212447 +436 77 -9.975465 +452 77 -12.299513 +456 77 -11.359123 +460 77 -7.360903 +461 77 -2.868210 +476 77 -2.777152 +477 77 -9.578427 +481 77 -11.519892 +485 77 -10.505790 +78 78 2.731920 +319 78 0.065746 +320 78 0.147929 +322 78 0.147929 +323 78 0.065746 +324 78 0.147929 +327 78 0.147929 +329 78 0.147929 +330 78 0.147929 +332 78 0.065746 +333 78 0.065746 +337 78 0.147929 +339 78 0.591716 +341 78 0.591716 +377 78 -4.453740 +402 78 -12.168661 +406 78 -8.194165 +427 78 -12.161205 +431 78 -10.952333 +452 78 -12.162885 +456 78 -11.044228 +477 78 -12.173700 +481 78 -11.148995 +79 79 1.564924 +320 79 0.065746 +321 79 0.147929 +324 79 0.065746 +330 79 0.147929 +333 79 0.147929 +335 79 0.147929 +337 79 0.147929 +338 79 0.147929 +339 79 0.147929 +341 79 0.147929 +361 79 -20.177721 +362 79 -1.573901 +377 79 -10.126945 +386 79 -26.399513 +402 79 -27.804652 +410 79 -21.995163 +411 79 -5.650229 +426 79 -0.586813 +427 79 -27.399384 +434 79 -1.779679 +435 79 -27.223124 +451 79 -28.188562 +459 79 -30.479592 +476 79 -28.411591 +483 79 -17.325258 +484 79 -14.758132 +80 80 1.926529 +319 80 0.065746 +320 80 0.147929 +321 80 0.147929 +323 80 0.147929 +327 80 0.147929 +329 80 0.147929 +330 80 0.147929 +332 80 0.147929 +337 80 0.065746 +338 80 0.065746 +339 80 0.147929 +341 80 0.147929 +342 80 0.147929 +361 80 -10.485294 +362 80 -6.714544 +386 80 -20.204042 +406 80 -8.099141 +411 80 -20.420808 +431 80 -10.760771 +436 80 -20.672201 +456 80 -10.777455 +461 80 -20.959350 +481 80 -10.806209 +486 80 -21.283539 +81 81 3.915352 +320 81 0.591716 +321 81 0.065746 +323 81 0.591716 +326 81 0.591716 +327 81 0.147929 +329 81 0.065746 +330 81 0.147929 +332 81 0.147929 +334 81 0.147929 +335 81 0.147929 +337 81 0.147929 +338 81 0.147929 +339 81 0.065746 +341 81 0.591716 +342 81 0.065746 +361 81 -11.786325 +362 81 -0.546902 +385 81 -8.576971 +386 81 -6.767877 +409 81 -6.984844 +410 81 -9.525732 +433 81 -7.045641 +434 81 -10.756186 +457 81 -8.826667 +458 81 -10.400333 +481 81 -12.416688 +482 81 -8.375015 +82 82 6.594510 +320 82 0.147929 +321 82 0.591716 +323 82 0.065746 +324 82 0.147929 +326 82 0.147929 +327 82 0.147929 +330 82 0.591716 +331 82 0.591716 +332 82 0.147929 +333 82 0.065746 +335 82 0.591716 +336 82 0.147929 +337 82 0.591716 +338 82 0.591716 +339 82 0.591716 +341 82 0.591716 +342 82 0.591716 +361 82 -105.589094 +362 82 -4.935439 +377 82 -4.864080 +385 82 -75.634190 +386 82 -61.818108 +401 82 -6.564811 +402 82 -6.891763 +409 82 -60.175500 +410 82 -87.647191 +426 82 -13.693394 +433 82 -59.501985 +434 82 -99.803727 +450 82 -0.442688 +451 82 -13.498040 +457 82 -74.190929 +458 82 -97.785142 +475 82 -14.197990 +481 82 -105.015906 +482 82 -80.868478 +483 82 -2.491844 +500 82 -14.464465 +83 83 1.614234 +321 83 0.591716 +323 83 0.147929 +324 83 0.065746 +330 83 0.065746 +331 83 0.065746 +337 83 0.147929 +338 83 0.065746 +339 83 0.065746 +342 83 0.147929 +360 83 -63.067907 +361 83 -140.023035 +362 83 -4.080440 +383 83 -63.781125 +384 83 -138.622540 +385 83 -76.195679 +406 83 -114.298733 +407 83 -137.608559 +408 83 -74.295615 +428 83 -85.529550 +429 83 -136.547532 +430 83 -136.853521 +431 83 -22.905643 +453 83 -187.765065 +454 83 -30.730196 +455 83 -15.057012 +456 83 -3.306633 +478 83 -50.259639 +479 83 -102.283702 +480 83 -16.631856 +481 83 -11.778975 +482 83 -15.118480 +483 83 -13.699633 +84 84 2.403189 +319 84 0.147929 +320 84 0.147929 +321 84 0.147929 +322 84 0.147929 +324 84 0.065746 +326 84 0.065746 +329 84 0.065746 +330 84 0.147929 +331 84 0.147929 +332 84 0.147929 +333 84 0.065746 +335 84 0.591716 +337 84 0.065746 +338 84 0.065746 +339 84 0.065746 +342 84 0.065746 +361 84 -16.328849 +362 84 -2.385289 +377 84 -4.527996 +386 84 -22.325610 +402 84 -12.444092 +406 84 -19.452418 +411 84 -22.946025 +426 84 -5.150994 +427 84 -7.391859 +431 84 -26.235361 +435 84 -11.069962 +436 84 -12.552659 +451 84 -12.650964 +456 84 -26.727328 +460 84 -24.358748 +476 84 -12.768330 +480 84 -25.669579 +481 84 -1.586463 +483 84 -0.301054 +485 84 -25.157934 +85 85 2.370316 +320 85 0.147929 +321 85 0.147929 +322 85 0.147929 +324 85 0.147929 +326 85 0.147929 +327 85 0.065746 +329 85 0.147929 +331 85 0.065746 +332 85 0.147929 +335 85 0.147929 +336 85 0.147929 +337 85 0.147929 +338 85 0.147929 +339 85 0.147929 +341 85 0.147929 +342 85 0.065746 +360 85 -22.404288 +361 85 -34.576637 +362 85 -1.006945 +383 85 -33.084470 +384 85 -34.302102 +385 85 -12.023690 +405 85 -25.555455 +406 85 -34.022353 +407 85 -34.102262 +408 85 -1.110175 +429 85 -283.788842 +430 85 -69.941616 +431 85 -0.894851 +453 85 -39.083258 +454 85 -155.618295 +455 85 -174.511192 +456 85 -25.083768 +457 85 -9.221498 +477 85 -11.380801 +478 85 -67.864269 +479 85 -79.406139 +480 85 -154.406313 +481 85 -54.330830 +482 85 -15.262597 +483 85 -14.912926 +86 86 4.819362 +319 86 0.065746 +320 86 0.591716 +322 86 0.591716 +323 86 0.591716 +327 86 0.591716 +329 86 0.591716 +331 86 0.591716 +337 86 0.591716 +339 86 0.147929 +341 86 0.147929 +342 86 0.065746 +406 86 -8.251877 +431 86 -11.048294 +456 86 -11.162606 +481 86 -11.290233 +483 86 -1.114169 +87 87 2.370316 +319 87 0.065746 +320 87 0.591716 +321 87 0.065746 +322 87 0.147929 +327 87 0.147929 +331 87 0.147929 +332 87 0.065746 +335 87 0.147929 +337 87 0.147929 +338 87 0.147929 +339 87 0.147929 +341 87 0.147929 +342 87 0.147929 +361 87 -7.267212 +362 87 -1.056317 +386 87 -9.930792 +406 87 -8.652119 +411 87 -10.207857 +431 87 -11.670166 +435 87 -5.052427 +436 87 -5.457558 +456 87 -11.890283 +460 87 -10.838673 +480 87 -11.604996 +481 87 -0.521786 +483 87 -0.301397 +485 87 -11.195498 +88 88 0.743097 +324 88 0.065746 +332 88 0.147929 +337 88 0.065746 +338 88 0.147929 +342 88 0.065746 +89 89 3.948225 +319 89 0.147929 +320 89 0.591716 +321 89 0.147929 +322 89 0.147929 +324 89 0.591716 +326 89 0.591716 +327 89 0.147929 +332 89 0.147929 +337 89 0.147929 +338 89 0.591716 +339 89 0.147929 +341 89 0.147929 +342 89 0.147929 +361 89 -12.053246 +362 89 -5.275103 +386 89 -20.398930 +406 89 -18.312098 +411 89 -20.665816 +431 89 -24.421019 +436 89 -20.969100 +456 89 -24.563042 +461 89 -21.310155 +481 89 -24.733045 +486 89 -21.690513 +90 90 2.534681 +319 90 0.147929 +320 90 0.147929 +321 90 0.147929 +322 90 0.147929 +323 90 0.147929 +324 90 0.147929 +325 90 0.147929 +326 90 0.147929 +327 90 0.065746 +329 90 0.147929 +335 90 0.147929 +336 90 0.147929 +337 90 0.147929 +339 90 0.147929 +340 90 0.147929 +342 90 0.147929 +360 90 -11.928220 +361 90 -35.332702 +362 90 -1.030157 +383 90 -6.157187 +384 90 -34.923503 +385 90 -23.182341 +405 90 -20.179128 +406 90 -40.319393 +407 90 -34.628453 +408 90 -28.607372 +428 90 -21.803225 +429 90 -63.698519 +430 90 -49.646208 +431 90 -23.346266 +444 90 -26.291328 +445 90 -33.224205 +446 90 -33.233208 +447 90 -33.243457 +448 90 -29.070125 +451 90 -57.457501 +452 90 -72.130662 +453 90 -80.610646 +454 90 -38.934588 +455 90 -33.059122 +456 90 -3.289917 +473 90 -4.184959 +474 90 -33.268244 +475 90 -330.188720 +476 90 -117.167831 +477 90 -33.178349 +499 90 -29.741488 +500 90 -173.244201 +91 91 1.416995 +319 91 0.147929 +320 91 0.147929 +321 91 0.065746 +322 91 0.147929 +324 91 0.147929 +326 91 0.147929 +327 91 0.065746 +332 91 0.147929 +342 91 0.147929 +361 91 -6.259095 +362 91 -1.610138 +386 91 -9.307412 +406 91 -18.495422 +411 91 -9.477318 +431 91 -24.741245 +436 91 -9.665697 +456 91 -24.972050 +460 91 -0.081185 +461 91 -9.792238 +481 91 -25.232269 +485 91 -10.101446 +92 92 2.140204 +321 92 0.065746 +322 92 0.065746 +323 92 0.147929 +324 92 0.147929 +325 92 0.147929 +326 92 0.147929 +327 92 0.065746 +329 92 0.147929 +332 92 0.147929 +335 92 0.147929 +336 92 0.147929 +337 92 0.147929 +339 92 0.065746 +341 92 0.147929 +342 92 0.147929 +359 92 -3.232121 +360 92 -15.025366 +361 92 -15.063457 +362 92 -0.438230 +381 92 -6.952400 +382 92 -14.941191 +383 92 -14.965166 +384 92 -11.760831 +401 92 -1.881657 +402 92 -33.325654 +403 92 -33.347538 +404 92 -33.372370 +405 92 -130.204014 +406 92 -186.463857 +421 92 -31.557225 +422 92 -33.248935 +423 92 -33.260749 +424 92 -33.274121 +425 92 -33.289240 +426 92 -31.424671 +429 92 -4.437851 +430 92 -132.552892 +431 92 -148.595331 +432 92 -31.766655 +444 92 -26.295328 +445 92 -33.229372 +446 92 -1.681295 +454 92 -51.060901 +455 92 -110.836573 +456 92 -77.679153 +457 92 -54.569660 +458 92 -21.120072 +478 92 -26.464970 +479 92 -36.382168 +480 92 -101.779294 +481 92 -46.263531 +482 92 -68.610553 +483 92 -24.294658 +484 92 -9.939892 +93 93 7.712196 +319 93 0.147929 +320 93 0.147929 +322 93 0.591716 +323 93 0.591716 +324 93 0.147929 +325 93 0.591716 +327 93 0.591716 +329 93 0.591716 +330 93 0.147929 +332 93 0.591716 +333 93 0.065746 +334 93 0.147929 +337 93 0.591716 +338 93 0.591716 +339 93 0.591716 +340 93 0.147929 +341 93 0.591716 +342 93 0.591716 +377 93 -4.519639 +402 93 -12.302592 +406 93 -18.222762 +427 93 -12.227692 +431 93 -24.195086 +444 93 -98.650379 +452 93 -12.162353 +456 93 -33.893291 +469 93 -135.281367 +477 93 -12.106598 +481 93 -49.029173 +494 93 -35.074263 +495 93 -98.964117 +94 94 4.441321 +319 94 0.147929 +320 94 0.591716 +322 94 0.147929 +323 94 0.591716 +324 94 0.147929 +326 94 0.147929 +327 94 0.591716 +330 94 0.591716 +332 94 0.147929 +333 94 0.065746 +334 94 0.147929 +335 94 0.065746 +337 94 0.147929 +338 94 0.147929 +339 94 0.147929 +340 94 0.147929 +341 94 0.147929 +342 94 0.065746 +377 94 -4.471931 +402 94 -12.261090 +406 94 -18.954366 +427 94 -12.316179 +431 94 -25.472563 +451 94 -1.930619 +452 94 -10.449801 +456 94 -36.034300 +476 94 -12.453772 +480 94 -31.965161 +481 94 -20.623106 +95 95 2.830539 +320 95 0.147929 +321 95 0.591716 +322 95 0.147929 +323 95 0.147929 +325 95 0.147929 +327 95 0.147929 +329 95 0.147929 +332 95 0.147929 +335 95 0.065746 +336 95 0.147929 +338 95 0.147929 +341 95 0.591716 +360 95 -53.421193 +361 95 -140.811938 +362 95 -4.104676 +383 95 -39.143528 +384 95 -139.269511 +385 95 -86.553776 +406 95 -70.372840 +407 95 -138.155538 +408 95 -99.526073 +423 95 -10.748523 +424 95 -32.957510 +425 95 -32.959869 +426 95 -32.962533 +427 95 -32.965541 +428 95 -32.968943 +429 95 -40.925332 +430 95 -275.827678 +431 95 -67.339298 +444 95 -26.079432 +445 95 -32.950509 +446 95 -32.951942 +447 95 -32.953572 +448 95 -22.206897 +454 95 -92.958537 +455 95 -250.441858 +478 95 -42.221314 +479 95 -92.622103 +480 95 -183.066746 +481 95 -27.870242 +96 96 3.044214 +321 96 0.591716 +324 96 0.147929 +325 96 0.591716 +326 96 0.147929 +332 96 0.147929 +335 96 0.065746 +336 96 0.147929 +337 96 0.147929 +338 96 0.147929 +341 96 0.591716 +342 96 0.065746 +360 96 -43.153435 +361 96 -141.776352 +362 96 -4.134335 +383 96 -13.068223 +384 96 -140.057874 +385 96 -97.689660 +406 96 -24.268532 +407 96 -138.820523 +408 96 -126.322907 +425 96 -120.807368 +426 96 -131.734316 +427 96 -131.740949 +428 96 -131.748448 +429 96 -131.756940 +430 96 -227.359359 +431 96 -114.060353 +444 96 -104.244744 +445 96 -131.707797 +446 96 -131.710958 +447 96 -131.714554 +448 96 -131.718630 +449 96 -131.723238 +450 96 -10.921074 +455 96 -292.810901 +456 96 -10.617923 +479 96 -25.281350 +480 96 -198.998426 +481 96 -68.210616 +482 96 -6.716299 +97 97 3.109961 +320 97 0.147929 +321 97 0.065746 +322 97 0.147929 +324 97 0.591716 +325 97 0.147929 +326 97 0.591716 +327 97 0.147929 +332 97 0.591716 +337 97 0.065746 +338 97 0.147929 +341 97 0.065746 +342 97 0.147929 +361 97 -8.476947 +362 97 -0.760826 +386 97 -11.157861 +410 97 -6.261445 +411 97 -5.361901 +435 97 -12.129668 +444 97 -32.518999 +445 97 -5.167278 +459 97 -7.856989 +460 97 -4.822646 +470 97 -36.172943 +471 97 -14.555938 +484 97 -13.276053 +496 97 -27.113529 +497 97 -21.955064 +98 98 1.729290 +320 98 0.147929 +321 98 0.591716 +326 98 0.147929 +328 98 0.147929 +332 98 0.147929 +335 98 0.147929 +341 98 0.147929 +360 98 -59.137274 +361 98 -140.331983 +362 98 -4.089929 +383 98 -53.725544 +384 98 -138.876129 +385 98 -80.405035 +406 98 -96.328763 +407 98 -137.823089 +408 98 -84.583654 +430 98 -210.374305 +431 98 -74.151345 +432 98 -33.088664 +433 98 -33.102598 +434 98 -4.682540 +455 98 -130.148369 +459 98 -28.436145 +460 98 -28.420668 +480 98 -122.653711 +481 98 -6.578216 +99 99 3.044214 +319 99 0.147929 +320 99 0.147929 +322 99 0.147929 +323 99 0.591716 +324 99 0.147929 +326 99 0.147929 +327 99 0.147929 +329 99 0.147929 +331 99 0.065746 +332 99 0.147929 +334 99 0.147929 +335 99 0.147929 +337 99 0.065746 +338 99 0.147929 +340 99 0.147929 +341 99 0.147929 +342 99 0.147929 +406 99 -19.108783 +431 99 -25.711011 +455 99 -0.529976 +456 99 -35.883730 +480 99 -40.037364 +481 99 -13.159236 +483 99 -0.130433 +100 100 4.359139 +320 100 0.147929 +321 100 0.065746 +322 100 0.591716 +324 100 0.147929 +325 100 0.065746 +326 100 0.147929 +327 100 0.147929 +328 100 0.065746 +329 100 0.591716 +332 100 0.147929 +334 100 0.065746 +335 100 0.147929 +337 100 0.147929 +338 100 0.147929 +339 100 0.147929 +340 100 0.591716 +341 100 0.591716 +342 100 0.147929 +361 100 -7.174775 +362 100 -1.092917 +386 100 -9.855176 +411 100 -10.120111 +435 100 -3.805990 +436 100 -6.603269 +444 100 -10.162595 +455 100 -5.944152 +456 100 -35.745603 +460 100 -18.140293 +469 100 -14.016751 +480 100 -108.004609 +485 100 -22.108970 +494 100 -13.984932 +101 101 2.419625 +319 101 0.147929 +320 101 0.065746 +321 101 0.065746 +322 101 0.065746 +324 101 0.147929 +325 101 0.147929 +326 101 0.147929 +327 101 0.147929 +328 101 0.065746 +332 101 0.147929 +335 101 0.147929 +336 101 0.147929 +337 101 0.065746 +338 101 0.147929 +339 101 0.147929 +340 101 0.147929 +341 101 0.147929 +342 101 0.065746 +361 101 -13.992050 +362 101 -0.504729 +385 101 -15.128502 +386 101 -3.223544 +406 101 -27.403435 +408 101 -1.579275 +409 101 -16.726444 +410 101 -1.818414 +430 101 -29.199821 +431 101 -8.887809 +432 101 -7.151022 +433 101 -14.963797 +444 101 -27.428456 +445 101 -34.695541 +446 101 -8.715563 +454 101 -25.980944 +455 101 -30.596440 +456 101 -18.844015 +457 101 -9.237813 +459 101 -11.435994 +460 101 -13.038565 +471 101 -26.033028 +472 101 -34.809230 +473 101 -30.827601 +478 101 -25.779904 +479 101 -59.659007 +480 101 -37.171710 +481 101 -8.938682 +482 101 -15.082077 +483 101 -15.117140 +484 101 -3.721880 +498 101 -4.050738 +499 101 -34.956970 +500 101 -35.046396 +102 102 1.942965 +320 102 0.147929 +321 102 0.147929 +322 102 0.147929 +324 102 0.591716 +328 102 0.147929 +329 102 0.065746 +337 102 0.147929 +339 102 0.147929 +342 102 0.147929 +361 102 -8.615201 +362 102 -8.505016 +386 102 -20.077115 +411 102 -20.256176 +436 102 -20.468739 +460 102 -14.704658 +461 102 -20.715754 +485 102 -21.528825 +486 102 -20.998322 +103 103 1.614234 +320 103 0.147929 +321 103 0.147929 +324 103 0.147929 +327 103 0.065746 +328 103 0.065746 +329 103 0.147929 +335 103 0.065746 +336 103 0.147929 +337 103 0.065746 +339 103 0.147929 +341 103 0.147929 +342 103 0.065746 +360 103 -13.146001 +361 103 -35.221367 +362 103 -1.026734 +383 103 -9.252961 +384 103 -34.832430 +385 103 -21.864303 +406 103 -16.647193 +407 103 -34.551595 +408 103 -25.428223 +429 103 -0.788458 +430 103 -147.823276 +431 103 -32.480901 +432 103 -14.692807 +433 103 -14.349499 +454 103 -42.658560 +455 103 -161.761600 +456 103 -19.732245 +458 103 -0.348524 +459 103 -14.704044 +460 103 -12.617186 +478 103 -12.746831 +479 103 -42.258308 +480 103 -85.523979 +481 103 -70.178803 +482 103 -11.782938 +104 104 1.170447 +320 104 0.065746 +321 104 0.065746 +324 104 0.065746 +327 104 0.065746 +329 104 0.065746 +336 104 0.147929 +339 104 0.147929 +341 104 0.147929 +342 104 0.147929 +360 104 -6.148771 +361 104 -15.627409 +362 104 -0.455511 +383 104 -4.892270 +384 104 -15.459349 +385 104 -9.387456 +406 104 -8.784202 +407 104 -15.337909 +408 104 -10.501686 +429 104 -1.103903 +430 104 -104.065284 +431 104 -6.505356 +454 104 -25.418606 +455 104 -114.433477 +456 104 -31.918344 +478 104 -6.225577 +479 104 -32.558510 +480 104 -55.704473 +481 104 -47.262110 +482 104 -27.595647 +105 105 2.518245 +319 105 0.147929 +323 105 0.147929 +324 105 0.147929 +326 105 0.065746 +327 105 0.591716 +329 105 0.147929 +332 105 0.065746 +334 105 0.147929 +335 105 0.147929 +338 105 0.065746 +342 105 0.591716 +406 105 -19.173624 +431 105 -25.810524 +456 105 -26.238255 +480 105 -16.086648 +481 105 -10.613920 +106 106 2.978468 +319 106 0.147929 +320 106 0.147929 +321 106 0.147929 +322 106 0.065746 +323 106 0.147929 +324 106 0.147929 +326 106 0.147929 +328 106 0.147929 +329 106 0.147929 +332 106 0.147929 +334 106 0.147929 +337 106 0.147929 +338 106 0.147929 +339 106 0.147929 +341 106 0.591716 +342 106 0.147929 +361 106 -10.916201 +362 106 -6.311126 +386 106 -20.246528 +406 106 -18.260069 +411 106 -20.474874 +431 106 -24.316468 +436 106 -20.738229 +456 106 -24.417693 +460 106 -14.870580 +461 106 -21.037778 +481 106 -24.546460 +485 106 -21.820431 +486 106 -21.374862 +107 107 2.600427 +320 107 0.147929 +321 107 0.591716 +323 107 0.065746 +324 107 0.147929 +326 107 0.147929 +328 107 0.147929 +329 107 0.147929 +332 107 0.147929 +336 107 0.147929 +337 107 0.147929 +338 107 0.147929 +339 107 0.147929 +341 107 0.147929 +342 107 0.065746 +360 107 -54.583739 +361 107 -140.711236 +362 107 -4.101582 +383 107 -42.105342 +384 107 -139.187031 +385 107 -85.300486 +406 107 -75.634908 +407 107 -138.085868 +408 107 -96.488713 +429 107 -1.928475 +430 107 -290.353375 +431 107 -95.072261 +432 107 -33.070658 +433 107 -33.083266 +434 107 -1.560574 +454 107 -32.350824 +455 107 -251.007456 +456 107 -28.432548 +459 107 -31.537246 +460 107 -28.401363 +478 107 -13.594778 +479 107 -37.164455 +480 107 -123.037922 +481 107 -121.755376 +482 107 -12.182699 +108 108 2.731920 +319 108 0.147929 +320 108 0.065746 +321 108 0.147929 +322 108 0.065746 +323 108 0.147929 +324 108 0.147929 +326 108 0.147929 +327 108 0.065746 +328 108 0.147929 +329 108 0.147929 +332 108 0.591716 +337 108 0.147929 +338 108 0.065746 +339 108 0.147929 +341 108 0.147929 +342 108 0.147929 +361 108 -10.850546 +362 108 -6.372285 +386 108 -20.239614 +406 108 -18.258378 +411 108 -20.466105 +431 108 -24.312747 +436 108 -20.727542 +456 108 -24.412278 +460 108 -14.864124 +461 108 -21.025102 +481 108 -24.539337 +485 108 -21.809222 +486 108 -21.360116 +109 109 2.748356 +319 109 0.147929 +320 109 0.147929 +321 109 0.591716 +323 109 0.147929 +324 109 0.147929 +326 109 0.147929 +328 109 0.147929 +329 109 0.147929 +332 109 0.147929 +334 109 0.065746 +337 109 0.147929 +338 109 0.147929 +339 109 0.147929 +341 109 0.147929 +342 109 0.065746 +361 109 -43.639901 +362 109 -25.267681 +386 109 -80.983459 +406 109 -18.259669 +411 109 -81.896136 +431 109 -24.315590 +436 109 -82.948822 +456 109 -24.416418 +460 109 -14.869853 +461 109 -84.146257 +481 109 -24.544784 +485 109 -21.819169 +486 109 -85.493798 +110 110 2.501808 +320 110 0.147929 +321 110 0.591716 +323 110 0.147929 +324 110 0.147929 +326 110 0.147929 +328 110 0.065746 +329 110 0.065746 +332 110 0.147929 +335 110 0.065746 +336 110 0.147929 +337 110 0.065746 +338 110 0.147929 +339 110 0.147929 +341 110 0.065746 +342 110 0.147929 +360 110 -56.583492 +361 110 -140.541756 +362 110 -4.096374 +383 110 -47.204744 +384 110 -139.048149 +385 110 -83.147971 +406 110 -84.706601 +407 110 -137.968516 +408 110 -91.262083 +429 110 -1.821787 +430 110 -287.033244 +431 110 -67.527954 +432 110 -14.701052 +433 110 -14.706875 +434 110 -1.235865 +454 110 -14.345885 +455 110 -257.775982 +456 110 -37.440272 +459 110 -13.477733 +460 110 -12.626025 +478 110 -6.758754 +479 110 -45.375155 +480 110 -119.855031 +481 110 -105.314430 +482 110 -27.090474 +111 111 5.723373 +319 111 0.147929 +320 111 0.591716 +322 111 0.147929 +323 111 0.591716 +324 111 0.591716 +326 111 0.591716 +327 111 0.147929 +329 111 0.591716 +332 111 0.147929 +337 111 0.591716 +338 111 0.591716 +341 111 0.591716 +342 111 0.147929 +406 111 -18.608251 +431 111 -24.926101 +456 111 -25.197600 +481 111 -25.499371 +112 112 2.962032 +320 112 0.065746 +321 112 0.591716 +323 112 0.147929 +324 112 0.147929 +326 112 0.065746 +327 112 0.147929 +328 112 0.147929 +329 112 0.591716 +332 112 0.147929 +335 112 0.065746 +337 112 0.147929 +338 112 0.147929 +339 112 0.147929 +342 112 0.147929 +360 112 -51.814392 +361 112 -140.953826 +362 112 -4.109038 +383 112 -35.053119 +384 112 -139.385673 +385 112 -88.288404 +406 112 -63.114064 +407 112 -138.253626 +408 112 -103.722858 +430 112 -322.263917 +431 112 -107.741585 +432 112 -33.062985 +433 112 -33.075028 +434 112 -0.071338 +454 112 -144.358273 +455 112 -212.266451 +456 112 -48.916755 +459 112 -33.017592 +460 112 -28.393138 +478 112 -44.456501 +479 112 -128.626094 +480 112 -68.005167 +481 112 -135.078315 +482 112 -28.248128 +113 113 1.416995 +320 113 0.147929 +322 113 0.065746 +324 113 0.147929 +326 113 0.147929 +327 113 0.147929 +328 113 0.065746 +332 113 0.147929 +337 113 0.147929 +338 113 0.147929 +460 113 -6.710316 +485 113 -9.871530 +114 114 4.161900 +320 114 0.591716 +322 114 0.147929 +323 114 0.591716 +324 114 0.147929 +327 114 0.147929 +329 114 0.147929 +332 114 0.147929 +334 114 0.065746 +337 114 0.591716 +338 114 0.591716 +341 114 0.591716 +342 114 0.147929 +115 115 1.416995 +320 115 0.065746 +321 115 0.065746 +324 115 0.147929 +326 115 0.147929 +335 115 0.147929 +336 115 0.147929 +337 115 0.147929 +338 115 0.147929 +342 115 0.147929 +361 115 -11.815759 +362 115 -0.546110 +385 115 -8.670667 +386 115 -6.713515 +409 115 -7.146451 +410 115 -9.410798 +433 115 -7.280746 +434 115 -10.576131 +457 115 -9.142565 +458 115 -10.148951 +481 115 -12.822203 +482 115 -8.044566 +116 116 3.340072 +319 116 0.147929 +320 116 0.147929 +321 116 0.147929 +322 116 0.147929 +324 116 0.591716 +328 116 0.065746 +329 116 0.147929 +332 116 0.147929 +333 116 0.591716 +335 116 0.591716 +336 116 0.147929 +339 116 0.147929 +342 116 0.065746 +360 116 -24.915028 +361 116 -34.448139 +362 116 -1.003008 +376 116 -28.573144 +377 116 -49.918981 +382 116 -5.546531 +383 116 -34.096916 +384 116 -34.195809 +385 116 -9.396534 +400 116 -99.997629 +401 116 -124.087524 +404 116 -17.237002 +405 116 -67.837901 +406 116 -61.823416 +407 116 -28.465306 +423 116 -35.844346 +424 116 -150.654118 +425 116 -51.589203 +426 116 -50.493393 +427 116 -67.527293 +428 116 -67.617738 +429 116 -50.483589 +447 116 -202.708924 +448 116 -195.888136 +449 116 -81.945418 +450 116 -82.007938 +451 116 -31.585316 +452 116 -14.631589 +453 116 -14.632105 +454 116 -14.632691 +455 116 -14.633355 +456 116 -14.634111 +457 116 -14.634975 +458 116 -14.635967 +459 116 -14.637111 +460 116 -12.555299 +471 116 -22.763848 +472 116 -509.420199 +473 116 -63.363767 +474 116 -34.178023 +475 116 -7.116825 +496 116 -30.974488 +497 116 -202.461642 +498 116 -229.662502 +499 116 -39.255919 +500 116 -33.097775 +117 117 6.150723 +319 117 0.147929 +320 117 0.591716 +321 117 0.065746 +322 117 0.591716 +323 117 0.591716 +324 117 0.591716 +326 117 0.147929 +328 117 0.147929 +329 117 0.065746 +330 117 0.147929 +332 117 0.147929 +334 117 0.591716 +335 117 0.147929 +338 117 0.147929 +339 117 0.591716 +341 117 0.591716 +342 117 0.591716 +361 117 -6.962447 +362 117 -1.187431 +386 117 -9.694996 +406 117 -19.071312 +411 117 -9.933693 +431 117 -25.653350 +435 117 -0.818295 +436 117 -9.376554 +456 117 -26.056074 +460 117 -26.825364 +480 117 -11.762163 +481 117 -14.730431 +485 117 -35.075960 +118 118 2.321006 +320 118 0.147929 +321 118 0.147929 +324 118 0.147929 +326 118 0.147929 +328 118 0.147929 +331 118 0.147929 +332 118 0.591716 +335 118 0.147929 +338 118 0.147929 +339 118 0.147929 +342 118 0.147929 +360 118 -12.068987 +361 118 -35.319439 +362 118 -1.029749 +383 118 -6.514607 +384 118 -34.912661 +385 118 -23.029635 +406 118 -11.796667 +407 118 -34.619309 +408 118 -28.240030 +429 118 -29.413706 +430 118 -34.401495 +431 118 -22.705977 +454 118 -392.323491 +455 118 -73.300638 +456 118 -55.749545 +457 118 -32.912484 +458 118 -32.913540 +459 118 -32.914757 +460 118 -28.232103 +479 118 -247.097298 +480 118 -79.305219 +481 118 -18.693237 +482 118 -34.448445 +483 118 -31.244931 +119 119 6.463018 +319 119 0.147929 +320 119 0.591716 +321 119 0.591716 +322 119 0.147929 +323 119 0.591716 +324 119 0.147929 +326 119 0.591716 +327 119 0.147929 +328 119 0.591716 +329 119 0.591716 +331 119 0.147929 +332 119 0.147929 +333 119 0.147929 +334 119 0.591716 +338 119 0.147929 +339 119 0.147929 +341 119 0.591716 +342 119 0.147929 +361 119 -37.739875 +362 119 -30.855665 +377 119 -10.102085 +386 119 -80.494495 +402 119 -27.530287 +406 119 -18.233076 +411 119 -81.268521 +427 119 -27.409698 +431 119 -24.250380 +436 119 -82.178192 +452 119 -27.310200 +456 119 -24.316919 +460 119 -59.017420 +461 119 -83.227584 +477 119 -27.231826 +481 119 -24.410745 +483 119 -0.263809 +485 119 -86.468238 +486 119 -84.421375 +120 120 1.384122 +319 120 0.147929 +321 120 0.065746 +322 120 0.065746 +323 120 0.065746 +324 120 0.065746 +326 120 0.147929 +327 120 0.065746 +328 120 0.065746 +331 120 0.147929 +339 120 0.147929 +341 120 0.147929 +361 120 -4.245638 +362 120 -3.378223 +386 120 -8.947251 +406 120 -18.233727 +411 120 -9.034281 +431 120 -24.252273 +436 120 -9.136413 +456 120 -24.319991 +460 120 -6.560504 +461 120 -9.254105 +481 120 -24.415002 +483 120 -0.263896 +485 120 -9.612901 +486 120 -9.387882 +121 121 5.624753 +320 121 0.591716 +321 121 0.065746 +322 121 0.591716 +323 121 0.591716 +324 121 0.591716 +326 121 0.065746 +327 121 0.591716 +329 121 0.147929 +331 121 0.591716 +332 121 0.147929 +334 121 0.147929 +338 121 0.591716 +341 121 0.591716 +342 121 0.065746 +361 121 -5.814899 +362 121 -1.952331 +386 121 -9.162315 +411 121 -9.302732 +436 121 -9.460223 +461 121 -9.635507 +483 121 -1.084877 +485 121 -3.199042 +486 121 -6.630337 +122 122 3.997535 +319 122 0.147929 +320 122 0.591716 +321 122 0.147929 +322 122 0.147929 +323 122 0.065746 +324 122 0.591716 +327 122 0.065746 +329 122 0.147929 +332 122 0.591716 +333 122 0.147929 +335 122 0.147929 +338 122 0.591716 +339 122 0.065746 +341 122 0.147929 +342 122 0.147929 +361 122 -15.014271 +362 122 -3.017555 +377 122 -10.028460 +386 122 -21.395146 +402 122 -27.463558 +406 122 -18.761968 +411 122 -21.860702 +427 122 -27.539659 +431 122 -25.171533 +436 122 -22.372383 +452 122 -27.636248 +456 122 -25.491160 +460 122 -15.105622 +461 122 -7.826996 +477 122 -27.753277 +481 122 -25.842227 +485 122 -23.544010 +123 123 2.764793 +320 123 0.147929 +321 123 0.591716 +324 123 0.591716 +329 123 0.147929 +332 123 0.591716 +338 123 0.147929 +339 123 0.147929 +341 123 0.147929 +360 123 -56.740716 +361 123 -140.528628 +362 123 -4.095970 +383 123 -47.605918 +384 123 -139.037387 +385 123 -82.978912 +406 123 -85.420915 +407 123 -137.959420 +408 123 -90.851049 +429 123 -3.331775 +430 123 -307.609215 +431 123 -52.109215 +454 123 -32.303745 +455 123 -335.580835 +478 123 -14.637544 +479 123 -18.743788 +480 123 -133.087214 +481 123 -195.668268 +124 124 4.753616 +319 124 0.147929 +320 124 0.147929 +321 124 0.147929 +322 124 0.147929 +323 124 0.591716 +324 124 0.147929 +326 124 0.591716 +327 124 0.591716 +331 124 0.147929 +332 124 0.147929 +333 124 0.065746 +334 124 0.591716 +335 124 0.147929 +339 124 0.147929 +340 124 0.147929 +342 124 0.591716 +361 124 -15.669176 +362 124 -2.669956 +377 124 -4.482619 +386 124 -21.816342 +402 124 -12.297606 +406 124 -19.066783 +411 124 -22.353844 +427 124 -12.363407 +431 124 -25.646373 +435 124 -1.894197 +436 124 -21.047710 +451 124 -7.178413 +452 124 -5.259982 +455 124 -0.298955 +456 124 -36.012643 +460 124 -23.583377 +476 124 -12.522521 +480 124 -38.108061 +481 124 -14.925726 +483 124 -0.291761 +485 124 -24.281280 +125 125 2.403189 +319 125 0.065746 +320 125 0.147929 +321 125 0.065746 +322 125 0.147929 +323 125 0.147929 +324 125 0.147929 +326 125 0.147929 +327 125 0.591716 +329 125 0.065746 +331 125 0.065746 +332 125 0.147929 +333 125 0.147929 +338 125 0.065746 +339 125 0.065746 +340 125 0.065746 +341 125 0.065746 +361 125 -6.637592 +362 125 -1.361945 +377 125 -10.020722 +386 125 -9.488802 +402 125 -27.429514 +406 125 -8.315003 +411 125 -9.692159 +427 125 -27.486728 +431 125 -11.149867 +436 125 -9.915809 +452 125 -27.564413 +456 125 -15.739567 +460 125 -6.144375 +461 125 -4.016436 +477 125 -27.662535 +480 125 -10.283870 +481 125 -12.642856 +483 125 -0.125767 +485 125 -10.428302 +126 126 1.877219 +319 126 0.147929 +320 126 0.591716 +321 126 0.147929 +323 126 0.147929 +326 126 0.147929 +332 126 0.147929 +333 126 0.147929 +335 126 0.147929 +361 126 -26.196649 +362 126 -1.239487 +377 126 -11.008015 +385 126 -18.263456 +386 126 -15.832163 +401 126 -15.758813 +402 126 -14.707389 +406 126 -26.062998 +409 126 -13.931320 +410 126 -22.707398 +426 126 -31.020298 +430 126 -24.254058 +431 126 -11.826735 +433 126 -13.259031 +434 126 -26.194010 +450 126 -4.230330 +451 126 -27.367921 +454 126 -17.031090 +455 126 -20.821313 +457 126 -16.379131 +458 126 -26.177770 +475 126 -32.198627 +478 126 -12.731636 +479 126 -26.993859 +481 126 -23.474551 +482 126 -22.488435 +499 126 -0.648692 +500 126 -32.170967 +127 127 1.778600 +319 127 0.147929 +320 127 0.147929 +322 127 0.147929 +323 127 0.065746 +324 127 0.147929 +326 127 0.147929 +335 127 0.147929 +336 127 0.065746 +338 127 0.147929 +339 127 0.065746 +341 127 0.147929 +342 127 0.147929 +406 127 -20.671065 +431 127 -28.063172 +455 127 -21.074883 +456 127 -7.728339 +480 127 -29.589968 +128 128 1.269066 +320 128 0.591716 +322 128 0.065746 +324 128 0.147929 +329 128 0.065746 +338 128 0.147929 +353 128 -44.010555 +354 128 -78.103469 +378 128 -26.069634 +379 128 -171.807944 +402 128 -7.977695 +403 128 -18.596553 +404 128 -133.522879 +405 128 -35.113590 +427 128 -17.229942 +428 128 -9.875790 +429 128 -106.989705 +430 128 -58.680074 +451 128 -9.426390 +452 128 -18.236829 +454 128 -92.249552 +455 128 -48.200839 +456 128 -22.456902 +476 128 -15.058625 +477 128 -13.186892 +480 128 -104.629081 +481 128 -55.718449 +500 128 -13.800869 +129 129 5.641190 +319 129 0.147929 +320 129 0.591716 +321 129 0.147929 +322 129 0.147929 +323 129 0.147929 +324 129 0.591716 +326 129 0.147929 +327 129 0.591716 +329 129 0.147929 +330 129 0.591716 +331 129 0.591716 +334 129 0.065746 +338 129 0.147929 +339 129 0.591716 +341 129 0.591716 +342 129 0.147929 +361 129 -12.831573 +362 129 -4.601784 +386 129 -20.553090 +406 129 -18.354936 +411 129 -20.855465 +431 129 -24.499850 +436 129 -21.195671 +456 129 -24.667185 +461 129 -21.575259 +481 129 -24.862844 +483 129 -1.081069 +485 129 -3.536868 +486 129 -18.459075 +130 130 0.792406 +319 130 0.065746 +322 130 0.065746 +324 130 0.065746 +326 130 0.065746 +329 130 0.065746 +332 130 0.147929 +342 130 0.065746 +406 130 -8.388668 +431 130 -11.265885 +456 130 -11.422099 +480 130 -0.683851 +481 130 -10.908815 +131 131 1.992275 +319 131 0.065746 +320 131 0.065746 +321 131 0.147929 +322 131 0.147929 +323 131 0.147929 +324 131 0.147929 +326 131 0.065746 +329 131 0.147929 +332 131 0.065746 +335 131 0.147929 +338 131 0.147929 +339 131 0.147929 +341 131 0.147929 +342 131 0.147929 +361 131 -15.360405 +362 131 -2.825561 +386 131 -21.606970 +406 131 -8.386909 +411 131 -22.109196 +431 131 -11.263137 +436 131 -22.659754 +456 131 -11.418869 +460 131 -20.631474 +461 131 -2.629810 +480 131 -0.577539 +481 131 -11.011402 +485 131 -23.916601 +132 132 4.671433 +319 132 0.065746 +320 132 0.147929 +321 132 0.591716 +322 132 0.147929 +324 132 0.147929 +325 132 0.065746 +326 132 0.147929 +327 132 0.147929 +332 132 0.147929 +334 132 0.147929 +335 132 0.147929 +337 132 0.591716 +338 132 0.591716 +339 132 0.591716 +341 132 0.591716 +342 132 0.147929 +361 132 -62.511822 +362 132 -10.759524 +386 132 -87.149156 +406 132 -8.464343 +411 132 -89.279780 +431 132 -11.383305 +435 132 -5.190608 +436 132 -86.420793 +444 132 -10.221224 +456 132 -11.559339 +460 132 -94.155289 +469 132 -14.086615 +480 132 -4.686963 +481 132 -7.063340 +485 132 -96.923428 +494 132 -14.041663 +133 133 3.323636 +320 133 0.591716 +322 133 0.065746 +325 133 0.065746 +327 133 0.147929 +328 133 0.147929 +329 133 0.147929 +331 133 0.591716 +332 133 0.147929 +336 133 0.065746 +337 133 0.147929 +338 133 0.147929 +339 133 0.591716 +341 133 0.147929 +342 133 0.065746 +444 133 -11.624988 +445 133 -14.688747 +446 133 -14.690593 +447 133 -14.692694 +448 133 -14.695075 +449 133 -14.697770 +450 133 -12.292172 +456 133 -25.709945 +457 133 -33.057434 +458 133 -33.069070 +459 133 -33.082500 +460 133 -28.387189 +475 133 -2.408641 +476 133 -14.704251 +477 133 -17.033846 +478 133 -433.373629 +479 133 -208.424191 +480 133 -165.127459 +481 133 -139.457705 +482 133 -132.156169 +483 133 -119.504415 +134 134 2.534681 +321 134 0.147929 +324 134 0.147929 +325 134 0.147929 +328 134 0.591716 +329 134 0.147929 +335 134 0.065746 +338 134 0.147929 +339 134 0.591716 +341 134 0.147929 +342 134 0.147929 +360 134 -14.417279 +361 134 -35.112921 +362 134 -1.023402 +383 134 -12.493894 +384 134 -34.743576 +385 134 -20.495284 +406 134 -22.410533 +407 134 -34.476524 +408 134 -22.105897 +423 134 -23.183010 +424 134 -32.969827 +425 134 -32.972676 +426 134 -32.975892 +427 134 -32.979525 +428 134 -32.983632 +429 134 -36.111509 +430 134 -293.795204 +431 134 -144.278404 +432 134 -132.368165 +433 134 -132.424898 +434 134 -20.870304 +444 134 -26.087847 +445 134 -32.961376 +446 134 -32.963106 +447 134 -32.965074 +448 134 -9.784294 +454 134 -32.310706 +455 134 -216.039291 +456 134 -33.852644 +459 134 -111.620097 +460 134 -113.697163 +478 134 -14.482645 +479 134 -18.906985 +480 134 -45.447923 +481 134 -168.481867 +482 134 -29.366413 +135 135 4.753616 +319 135 0.147929 +321 135 0.591716 +322 135 0.147929 +324 135 0.591716 +325 135 0.147929 +326 135 0.147929 +327 135 0.591716 +328 135 0.591716 +329 135 0.147929 +335 135 0.591716 +336 135 0.065746 +339 135 0.147929 +342 135 0.591716 +361 135 -49.321790 +362 135 -20.124430 +386 135 -81.792231 +406 135 -18.344573 +411 135 -82.906296 +431 135 -24.246772 +436 135 -84.167763 +444 135 -34.123158 +445 135 -0.850407 +456 135 -13.559641 +457 135 -10.581264 +460 135 -59.764766 +461 135 -85.582361 +470 135 -42.605447 +471 135 -4.628685 +482 135 -24.062723 +485 135 -87.769855 +486 135 -87.156457 +496 135 -39.273899 +497 135 -6.617766 +136 136 2.222387 +319 136 0.147929 +320 136 0.147929 +321 136 0.147929 +325 136 0.147929 +326 136 0.147929 +332 136 0.147929 +333 136 0.065746 +335 136 0.065746 +336 136 0.065746 +338 136 0.147929 +339 136 0.147929 +341 136 0.591716 +361 136 -20.240205 +362 136 -1.567366 +377 136 -4.506690 +386 136 -26.474491 +402 136 -12.376404 +406 136 -20.885809 +410 136 -22.412265 +411 136 -5.319718 +426 136 -1.544303 +427 136 -10.916983 +431 136 -28.382891 +434 136 -2.444406 +435 136 -26.657800 +444 136 -25.918611 +451 136 -12.555441 +455 136 -23.760726 +456 136 -5.403338 +459 136 -30.593096 +469 136 -28.157955 +470 136 -7.297292 +476 136 -12.658796 +480 136 -29.993776 +483 136 -18.351716 +484 136 -13.860647 +495 136 -35.022046 +137 137 1.926529 +319 137 0.065746 +321 137 0.147929 +322 137 0.147929 +324 137 0.147929 +325 137 0.147929 +327 137 0.147929 +328 137 0.147929 +332 137 0.147929 +335 137 0.065746 +336 137 0.065746 +338 137 0.147929 +339 137 0.147929 +341 137 0.147929 +361 137 -33.455593 +362 137 -1.112009 +384 137 -2.062011 +385 137 -37.465753 +386 137 -4.522131 +406 137 -13.981223 +408 137 -13.671586 +409 137 -34.981150 +429 137 -1.047397 +430 137 -17.796699 +431 137 -0.805626 +432 137 -30.832536 +433 137 -23.018401 +444 137 -29.254558 +445 137 -20.025958 +453 137 -4.443458 +454 137 -16.518136 +455 137 -17.972335 +456 137 -36.137659 +457 137 -5.559205 +459 137 -27.235697 +460 137 -29.280798 +470 137 -17.041858 +471 137 -37.204349 +472 137 -11.186745 +477 137 -9.423991 +478 137 -25.338804 +479 137 -35.731263 +480 137 -17.947256 +481 137 -22.056239 +482 137 -33.883454 +483 137 -33.958265 +484 137 -6.809445 +497 137 -26.174758 +498 137 -35.942145 +138 138 2.436062 +320 138 0.591716 +321 138 0.147929 +322 138 0.147929 +324 138 0.147929 +325 138 0.147929 +326 138 0.065746 +327 138 0.065746 +328 138 0.147929 +331 138 0.147929 +332 138 0.147929 +333 138 0.065746 +334 138 0.147929 +338 138 0.147929 +342 138 0.065746 +361 138 -25.598859 +362 138 -1.257433 +377 138 -4.527006 +385 138 -16.308504 +386 138 -16.993297 +402 138 -12.319598 +409 138 -10.560135 +410 138 -25.139716 +427 138 -12.240140 +433 138 -8.371026 +434 138 -29.978078 +444 138 -28.138827 +445 138 -30.879114 +452 138 -12.170289 +457 138 -9.837939 +458 138 -31.428842 +459 138 -3.976926 +460 138 -31.078569 +470 138 -4.737842 +471 138 -35.700555 +472 138 -35.796367 +473 138 -1.233446 +477 138 -12.110069 +481 138 -15.112248 +482 138 -29.353292 +483 138 -24.858508 +484 138 -31.984341 +498 138 -34.672444 +499 138 -36.030936 +500 138 -1.668796 +139 139 2.222387 +320 139 0.147929 +322 139 0.147929 +324 139 0.147929 +325 139 0.147929 +326 139 0.147929 +328 139 0.065746 +332 139 0.591716 +335 139 0.065746 +338 139 0.147929 +339 139 0.147929 +341 139 0.065746 +342 139 0.147929 +444 139 -29.094472 +445 139 -21.234640 +459 139 -1.117761 +460 139 -13.917346 +470 139 -15.624725 +471 139 -36.987921 +472 139 -14.130518 +483 139 -8.992867 +484 139 -14.975642 +497 139 -23.005282 +498 139 -37.305557 +499 139 -2.941873 +140 140 2.501808 +320 140 0.065746 +321 140 0.147929 +323 140 0.147929 +324 140 0.147929 +328 140 0.591716 +330 140 0.065746 +331 140 0.591716 +332 140 0.065746 +334 140 0.065746 +335 140 0.065746 +341 140 0.147929 +342 140 0.147929 +361 140 -27.442755 +362 140 -1.207322 +385 140 -22.192822 +386 140 -13.571995 +409 140 -20.709556 +410 140 -17.912490 +433 140 -23.132456 +434 140 -18.662900 +457 140 -29.665948 +458 140 -15.639301 +459 140 -9.429725 +460 140 -125.363753 +480 140 -2.704457 +481 140 -37.852783 +482 140 -8.606555 +483 140 -81.910622 +484 140 -135.524557 +141 141 2.436062 +319 141 0.147929 +320 141 0.147929 +321 141 0.147929 +322 141 0.065746 +323 141 0.147929 +324 141 0.591716 +325 141 0.065746 +326 141 0.147929 +327 141 0.065746 +329 141 0.147929 +331 141 0.065746 +332 141 0.147929 +339 141 0.147929 +341 141 0.147929 +361 141 -11.018799 +362 141 -6.215797 +386 141 -20.257677 +406 141 -18.263055 +411 141 -20.488993 +431 141 -24.322957 +436 141 -20.755418 +444 141 -10.688108 +456 141 -24.427082 +461 141 -21.058153 +469 141 -14.677975 +481 141 -24.558776 +483 141 -0.118151 +486 141 -21.398551 +494 141 -10.377315 +495 141 -4.191539 +142 142 1.614234 +323 142 0.065746 +325 142 0.147929 +326 142 0.065746 +328 142 0.147929 +332 142 0.065746 +336 142 0.147929 +339 142 0.591716 +341 142 0.065746 +342 142 0.065746 +444 142 -25.727823 +460 142 -25.523333 +469 142 -29.761171 +470 142 -5.445293 +484 142 -30.761709 +485 142 -8.761813 +495 142 -34.791388 +143 143 2.271696 +321 143 0.147929 +322 143 0.147929 +325 143 0.147929 +326 143 0.147929 +328 143 0.065746 +329 143 0.065746 +330 143 0.065746 +332 143 0.591716 +333 143 0.065746 +334 143 0.147929 +335 143 0.147929 +336 143 0.065746 +339 143 0.065746 +342 143 0.147929 +361 143 -4.872717 +362 143 -12.176920 +377 143 -4.899497 +386 143 -19.956011 +402 143 -13.235814 +411 143 -20.092392 +427 143 -6.030894 +428 143 -6.977509 +436 143 -20.261226 +444 143 -31.935527 +453 143 -12.793241 +460 143 -6.455462 +461 143 -20.463267 +469 143 -4.978916 +470 143 -38.319533 +478 143 -12.590500 +485 143 -9.421332 +486 143 -20.699412 +495 143 -8.845403 +496 143 -33.437974 +144 144 2.156640 +320 144 0.591716 +322 144 0.147929 +324 144 0.147929 +325 144 0.591716 +326 144 0.147929 +331 144 0.065746 +332 144 0.147929 +342 144 0.065746 +444 144 -93.770742 +469 144 -129.000379 +483 144 -0.125800 +494 144 -128.312744 +145 145 2.797666 +320 145 0.147929 +321 145 0.147929 +323 145 0.147929 +324 145 0.147929 +326 145 0.065746 +327 145 0.147929 +329 145 0.065746 +331 145 0.591716 +332 145 0.591716 +335 145 0.065746 +336 145 0.065746 +339 145 0.147929 +341 145 0.147929 +342 145 0.065746 +353 145 -30.196345 +354 145 -497.489896 +355 145 -34.015438 +356 145 -32.898931 +357 145 -32.899000 +358 145 -32.899079 +359 145 -32.899170 +360 145 -32.899276 +361 145 -32.899399 +362 145 -0.955730 +378 145 -40.275963 +379 145 -292.425666 +380 145 -173.072035 +381 145 -1.015134 +403 145 -72.952052 +404 145 -125.429209 +405 145 -150.841873 +406 145 -144.324131 +427 145 -2.572125 +428 145 -76.497090 +429 145 -76.063745 +430 145 -168.260459 +431 145 -50.734863 +432 145 -107.143126 +452 145 -30.473500 +453 145 -49.316214 +454 145 -43.679604 +455 145 -155.147806 +456 145 -42.008423 +457 145 -93.688419 +458 145 -55.644298 +477 145 -42.150461 +478 145 -38.430513 +479 145 -37.657709 +480 145 -61.681714 +481 145 -137.673691 +483 145 -133.623081 +484 145 -6.944770 +146 146 2.353879 +320 146 0.065746 +321 146 0.591716 +322 146 0.065746 +324 146 0.147929 +327 146 0.065746 +328 146 0.591716 +329 146 0.065746 +330 146 0.065746 +332 146 0.147929 +338 146 0.147929 +341 146 0.147929 +360 146 -55.788466 +361 146 -140.608576 +362 146 -4.098427 +383 146 -45.176711 +384 146 -139.102915 +385 146 -84.003231 +406 146 -81.096986 +407 146 -138.014798 +408 146 -93.340290 +430 146 -249.068382 +431 146 -188.951543 +432 146 -132.526560 +433 146 -132.594996 +434 146 -42.290785 +454 146 -31.311557 +455 146 -113.610868 +456 146 -30.140585 +459 146 -90.383251 +460 146 -113.867119 +478 146 -12.656017 +479 146 -31.790216 +480 146 -47.958567 +481 146 -82.211560 +147 147 2.156640 +320 147 0.065746 +322 147 0.147929 +323 147 0.591716 +324 147 0.147929 +330 147 0.065746 +334 147 0.147929 +335 147 0.591716 +341 147 0.147929 +148 148 4.161900 +319 148 0.147929 +320 148 0.147929 +321 148 0.147929 +322 148 0.147929 +323 148 0.591716 +324 148 0.147929 +326 148 0.147929 +327 148 0.147929 +329 148 0.147929 +331 148 0.065746 +332 148 0.147929 +333 148 0.147929 +334 148 0.147929 +335 148 0.147929 +337 148 0.147929 +338 148 0.147929 +339 148 0.591716 +341 148 0.591716 +361 148 -15.800475 +362 148 -2.608210 +377 148 -10.099426 +386 148 -21.911118 +402 148 -27.714686 +406 148 -19.129899 +411 148 -22.464326 +427 148 -27.874590 +431 148 -25.743452 +435 148 -3.777566 +436 148 -19.291554 +451 148 -21.052884 +452 148 -7.002329 +456 148 -26.160610 +460 148 -23.728441 +476 148 -28.256432 +480 148 -14.304694 +481 148 -12.307318 +483 148 -0.130415 +485 148 -24.445405 +149 149 4.013971 +319 149 0.147929 +320 149 0.147929 +322 149 0.591716 +323 149 0.147929 +324 149 0.591716 +326 149 0.591716 +327 149 0.147929 +329 149 0.147929 +332 149 0.591716 +334 149 0.147929 +335 149 0.147929 +337 149 0.147929 +338 149 0.147929 +341 149 0.065746 +406 149 -18.507288 +431 149 -24.760953 +456 149 -24.996342 +481 149 -25.261235 +150 150 3.060651 +319 150 0.147929 +320 150 0.147929 +321 150 0.147929 +322 150 0.147929 +323 150 0.147929 +324 150 0.147929 +326 150 0.591716 +327 150 0.147929 +330 150 0.147929 +332 150 0.147929 +334 150 0.147929 +335 150 0.147929 +337 150 0.147929 +338 150 0.147929 +339 150 0.147929 +341 150 0.147929 +361 150 -15.687744 +362 150 -2.661066 +386 150 -21.829540 +406 150 -19.069193 +411 150 -22.369237 +431 150 -25.650086 +435 150 -2.162108 +436 150 -20.797530 +456 150 -26.052283 +460 150 -23.603602 +480 150 -11.666624 +481 150 -14.821634 +485 150 -24.304167 +151 151 3.340072 +319 151 0.065746 +320 151 0.147929 +322 151 0.591716 +324 151 0.147929 +326 151 0.147929 +327 151 0.147929 +332 151 0.591716 +334 151 0.147929 +335 151 0.147929 +337 151 0.147929 +338 151 0.065746 +339 151 0.591716 +341 151 0.147929 +406 151 -8.226389 +431 151 -11.006405 +456 151 -11.111377 +481 151 -11.229469 +152 152 1.910092 +319 152 0.147929 +320 152 0.147929 +321 152 0.065746 +322 152 0.065746 +323 152 0.147929 +324 152 0.147929 +326 152 0.147929 +327 152 0.065746 +328 152 0.147929 +332 152 0.065746 +335 152 0.147929 +337 152 0.147929 +338 152 0.147929 +339 152 0.065746 +361 152 -6.898881 +362 152 -1.218689 +386 152 -9.650883 +406 152 -18.977980 +411 152 -9.882193 +431 152 -25.509180 +436 152 -10.135490 +456 152 -25.888194 +460 152 -26.556988 +461 152 -0.106483 +480 152 -7.281580 +481 152 -19.018710 +485 152 -34.844256 +153 153 4.227646 +319 153 0.065746 +320 153 0.147929 +322 153 0.591716 +323 153 0.147929 +324 153 0.591716 +326 153 0.591716 +327 153 0.147929 +328 153 0.065746 +329 153 0.147929 +331 153 0.147929 +332 153 0.591716 +334 153 0.147929 +335 153 0.147929 +338 153 0.147929 +341 153 0.147929 +342 153 0.147929 +406 153 -8.232314 +431 153 -11.016202 +456 153 -11.123412 +460 153 -6.862536 +481 153 -11.243788 +483 153 -0.275554 +485 153 -10.127899 +154 154 2.074458 +320 154 0.147929 +321 154 0.147929 +322 154 0.065746 +323 154 0.147929 +324 154 0.147929 +326 154 0.147929 +327 154 0.147929 +328 154 0.147929 +331 154 0.147929 +335 154 0.065746 +336 154 0.065746 +337 154 0.147929 +338 154 0.147929 +339 154 0.147929 +360 154 -6.769186 +361 154 -35.901065 +362 154 -1.047659 +384 154 -28.517347 +385 154 -28.851785 +407 154 -23.366239 +408 154 -35.187240 +409 154 -6.868757 +430 154 -28.191167 +431 154 -34.871474 +432 154 -11.651220 +453 154 -6.006920 +454 154 -242.347168 +455 154 -73.263187 +456 154 -36.521500 +457 154 -32.900137 +458 154 -32.900298 +459 154 -32.900484 +460 154 -28.218916 +478 154 -45.317134 +479 154 -188.984705 +480 154 -49.732630 +481 154 -30.247406 +482 154 -33.937412 +483 154 -30.747171 +155 155 3.192143 +320 155 0.147929 +321 155 0.147929 +322 155 0.065746 +323 155 0.147929 +324 155 0.147929 +327 155 0.591716 +328 155 0.591716 +329 155 0.147929 +335 155 0.147929 +336 155 0.147929 +337 155 0.147929 +338 155 0.147929 +339 155 0.065746 +341 155 0.147929 +342 155 0.147929 +360 155 -19.966522 +361 155 -34.717550 +362 155 -1.011265 +383 155 -26.756500 +384 155 -34.418437 +385 155 -14.588984 +405 155 -1.590496 +406 155 -191.305280 +407 155 -34.201090 +408 155 -7.545027 +430 155 -182.463437 +431 155 -267.637555 +432 155 -141.300714 +433 155 -134.583516 +434 155 -134.250054 +454 155 -23.249928 +455 155 -215.922603 +456 155 -130.414554 +457 155 -52.554446 +458 155 -0.211963 +459 155 -0.574920 +460 155 -115.861980 +478 155 -5.187860 +479 155 -116.560714 +480 155 -135.704366 +481 155 -62.686237 +482 155 -68.872267 +483 155 -34.400065 +156 156 2.748356 +320 156 0.147929 +321 156 0.147929 +322 156 0.147929 +323 156 0.147929 +324 156 0.147929 +326 156 0.147929 +327 156 0.147929 +328 156 0.147929 +329 156 0.147929 +330 156 0.065746 +331 156 0.147929 +335 156 0.147929 +336 156 0.147929 +337 156 0.065746 +338 156 0.147929 +339 156 0.147929 +341 156 0.147929 +342 156 0.147929 +353 156 -62.655499 +354 156 -424.926759 +355 156 -66.770476 +356 156 -32.898732 +357 156 -32.898787 +358 156 -32.898851 +359 156 -32.898925 +360 156 -32.899010 +361 156 -32.899109 +362 156 -0.955721 +378 156 -86.131021 +379 156 -262.453495 +380 156 -96.717255 +381 156 -38.170417 +382 156 -21.419569 +402 156 -19.908188 +403 156 -97.541069 +404 156 -142.051201 +405 156 -106.035316 +406 156 -71.218159 +407 156 -14.545566 +408 156 -36.221890 +409 156 -4.357923 +427 156 -36.928717 +428 156 -105.006552 +429 156 -116.846569 +430 156 -85.093083 +431 156 -28.263065 +432 156 -58.687722 +434 156 -32.166959 +435 156 -17.307800 +451 156 -22.838253 +452 156 -55.545552 +453 156 -65.383414 +454 156 -71.601323 +455 156 -64.552204 +456 156 -73.680736 +457 156 -33.773559 +458 156 -38.215304 +460 156 -14.304633 +476 156 -33.856212 +477 156 -58.658612 +478 156 -53.212283 +479 156 -63.653194 +480 156 -51.936790 +481 156 -82.098061 +482 156 -12.941768 +483 156 -48.586212 +484 156 -15.735326 +500 156 -32.385821 +157 157 1.795036 +321 157 0.147929 +322 157 0.147929 +323 157 0.147929 +324 157 0.147929 +327 157 0.065746 +328 157 0.147929 +329 157 0.147929 +331 157 0.147929 +336 157 0.147929 +341 157 0.147929 +342 157 0.147929 +353 157 -25.885883 +354 157 -256.317245 +355 157 -63.984932 +356 157 -32.897909 +357 157 -32.897909 +358 157 -32.897909 +359 157 -32.897909 +360 157 -32.897909 +361 157 -32.897909 +362 157 -0.955684 +378 157 -70.916761 +379 157 -103.217647 +380 157 -91.037075 +381 157 -37.779189 +382 157 -19.877240 +402 157 -12.611396 +403 157 -59.626654 +404 157 -78.640309 +405 157 -35.047625 +406 157 -70.783058 +407 157 -16.024907 +408 157 -36.152900 +409 157 -3.574929 +427 157 -32.285847 +428 157 -49.187287 +429 157 -70.909723 +430 157 -25.844474 +431 157 -16.736086 +432 157 -58.391757 +434 157 -32.873731 +435 157 -17.102274 +451 157 -16.759505 +452 157 -47.041717 +453 157 -64.188615 +454 157 -26.039820 +456 157 -28.260238 +457 157 -30.247103 +458 157 -37.938071 +460 157 -14.437821 +476 157 -33.953290 +477 157 -42.681471 +478 157 -53.140149 +479 157 -26.041091 +481 157 -27.547830 +483 157 -48.861887 +484 157 -15.475564 +500 157 -27.402382 +158 158 2.304569 +320 158 0.147929 +322 158 0.065746 +323 158 0.147929 +324 158 0.147929 +326 158 0.147929 +327 158 0.147929 +329 158 0.065746 +332 158 0.147929 +336 158 0.147929 +338 158 0.591716 +341 158 0.147929 +342 158 0.147929 +431 158 -19.535649 +455 158 -40.770595 +456 158 -340.393980 +457 158 -7.653971 +479 158 -15.853835 +480 158 -88.488242 +481 158 -242.818413 +482 158 -37.279813 +483 158 -1.231453 +159 159 4.145464 +319 159 0.147929 +320 159 0.147929 +321 159 0.147929 +322 159 0.147929 +323 159 0.591716 +324 159 0.147929 +326 159 0.147929 +328 159 0.065746 +329 159 0.065746 +331 159 0.147929 +333 159 0.065746 +334 159 0.591716 +335 159 0.147929 +338 159 0.591716 +341 159 0.591716 +342 159 0.147929 +361 159 -15.669481 +362 159 -2.669810 +377 159 -4.482901 +386 159 -21.816559 +402 159 -12.298553 +406 159 -19.068369 +411 159 -22.354096 +427 159 -12.364611 +431 159 -25.648816 +435 159 -1.898604 +436 159 -21.043594 +451 159 -7.290365 +452 159 -5.149492 +456 159 -26.050807 +460 159 -30.849608 +476 159 -12.524242 +480 159 -11.629367 +481 159 -14.857204 +483 159 -0.291777 +485 159 -35.077490 +160 160 5.559007 +320 160 0.591716 +321 160 0.147929 +323 160 0.591716 +324 160 0.591716 +326 160 0.591716 +327 160 0.065746 +328 160 0.147929 +329 160 0.147929 +331 160 0.147929 +332 160 0.591716 +333 160 0.065746 +337 160 0.147929 +338 160 0.147929 +339 160 0.591716 +340 160 0.147929 +341 160 0.591716 +361 160 -8.477152 +362 160 -8.638941 +377 160 -4.503935 +386 160 -20.070329 +402 160 -12.266888 +411 160 -20.247209 +427 160 -12.202514 +436 160 -20.457531 +452 160 -12.147601 +456 160 -9.684839 +460 160 -14.701254 +461 160 -20.702236 +477 160 -12.102170 +481 160 -24.802035 +483 160 -0.262891 +485 160 -21.522746 +486 160 -20.982414 +161 161 3.635930 +320 161 0.591716 +321 161 0.147929 +322 161 0.591716 +323 161 0.147929 +324 161 0.147929 +326 161 0.147929 +327 161 0.147929 +328 161 0.591716 +329 161 0.147929 +332 161 0.065746 +333 161 0.065746 +335 161 0.147929 +336 161 0.147929 +338 161 0.147929 +341 161 0.147929 +361 161 -30.411228 +362 161 -1.151026 +377 161 -8.187104 +385 161 -30.995333 +386 161 -8.815437 +402 161 -3.551467 +403 161 -17.553113 +404 161 -0.366502 +409 161 -35.917113 +410 161 -7.564412 +429 161 -17.399826 +430 161 -2.779564 +432 161 -7.932809 +433 161 -37.562594 +434 161 -2.097479 +455 161 -15.238459 +456 161 -57.779269 +457 161 -161.630990 +458 161 -132.438042 +459 161 -132.504588 +460 161 -113.710292 +480 161 -132.349274 +481 161 -417.141728 +162 162 2.896285 +320 162 0.147929 +321 162 0.147929 +322 162 0.147929 +323 162 0.147929 +324 162 0.147929 +326 162 0.147929 +329 162 0.147929 +331 162 0.591716 +332 162 0.147929 +335 162 0.065746 +336 162 0.147929 +337 162 0.147929 +338 162 0.065746 +339 162 0.147929 +341 162 0.147929 +342 162 0.147929 +353 162 -30.173738 +354 162 -499.269171 +355 162 -40.602761 +356 162 -32.898401 +357 162 -32.898435 +358 162 -32.898473 +359 162 -32.898517 +360 162 -32.898568 +361 162 -32.898627 +362 162 -0.955706 +378 162 -58.697747 +379 162 -245.733338 +380 162 -226.994318 +381 162 -4.322659 +402 162 -15.149652 +403 162 -44.706144 +404 162 -148.945790 +405 162 -138.977601 +406 162 -173.596643 +407 162 -0.848221 +427 162 -32.265118 +428 162 -47.012030 +429 162 -116.956151 +430 162 -101.430421 +431 162 -80.740041 +432 162 -131.369038 +451 162 -18.877039 +452 162 -43.332486 +453 162 -53.049139 +454 162 -37.601197 +455 162 -92.389469 +456 162 -74.802447 +457 162 -104.207733 +458 162 -74.129125 +476 162 -33.919102 +477 162 -29.770788 +478 162 -53.152471 +479 162 -37.590904 +480 162 -52.682208 +481 162 -92.494848 +482 162 -29.019123 +483 162 -140.783753 +484 162 -17.215236 +500 162 -29.140105 +163 163 5.246713 +319 163 0.147929 +320 163 0.591716 +321 163 0.147929 +322 163 0.147929 +323 163 0.591716 +324 163 0.147929 +325 163 0.065746 +326 163 0.147929 +327 163 0.147929 +329 163 0.065746 +330 163 0.591716 +332 163 0.591716 +333 163 0.147929 +334 163 0.591716 +335 163 0.065746 +337 163 0.147929 +338 163 0.147929 +339 163 0.147929 +340 163 0.147929 +341 163 0.147929 +342 163 0.065746 +361 163 -15.473049 +362 163 -2.767089 +377 163 -10.064452 +386 163 -21.681134 +402 163 -27.596530 +406 163 -18.968424 +411 163 -22.195954 +427 163 -27.723341 +431 163 -25.494369 +436 163 -22.759890 +444 163 -10.250301 +451 163 -5.892227 +452 163 -21.978525 +456 163 -36.069106 +460 163 -22.410503 +461 163 -0.965153 +469 163 -14.122150 +476 163 -28.038671 +480 163 -32.827540 +481 163 -19.816666 +485 163 -24.046141 +494 163 -14.071707 +164 164 3.192143 +320 164 0.591716 +321 164 0.147929 +322 164 0.147929 +323 164 0.147929 +324 164 0.147929 +325 164 0.147929 +326 164 0.147929 +327 164 0.147929 +328 164 0.065746 +329 164 0.147929 +331 164 0.065746 +332 164 0.147929 +337 164 0.147929 +338 164 0.147929 +339 164 0.147929 +340 164 0.147929 +341 164 0.147929 +342 164 0.147929 +361 164 -14.220324 +362 164 -3.525934 +386 164 -20.998505 +411 164 -21.391690 +436 164 -21.826997 +444 164 -23.579761 +456 164 -9.915848 +460 164 -9.279849 +461 164 -19.948178 +469 164 -32.424422 +480 164 -20.269629 +481 164 -5.275353 +483 164 -0.123267 +485 164 -33.058670 +494 164 -32.234492 +165 165 2.600427 +320 165 0.591716 +322 165 0.147929 +323 165 0.065746 +324 165 0.147929 +326 165 0.147929 +327 165 0.147929 +332 165 0.147929 +335 165 0.065746 +337 165 0.591716 +338 165 0.147929 +342 165 0.147929 +166 166 2.485371 +319 166 0.147929 +320 166 0.147929 +321 166 0.065746 +322 166 0.147929 +323 166 0.065746 +324 166 0.065746 +325 166 0.065746 +326 166 0.065746 +327 166 0.147929 +328 166 0.065746 +329 166 0.147929 +331 166 0.147929 +332 166 0.147929 +333 166 0.147929 +334 166 0.065746 +337 166 0.147929 +338 166 0.147929 +340 166 0.147929 +342 166 0.147929 +361 166 -6.615280 +362 166 -1.375276 +377 166 -10.018176 +386 166 -9.476397 +402 166 -27.416509 +406 166 -18.682772 +411 166 -9.677551 +427 166 -27.464867 +431 166 -25.045798 +436 166 -9.898871 +444 166 -10.472564 +452 166 -27.533695 +456 166 -35.346715 +460 166 -12.841648 +461 166 -4.356045 +469 166 -14.401511 +477 166 -27.622962 +480 166 -22.745956 +481 166 -28.729499 +483 166 -0.282385 +485 166 -20.856285 +494 166 -14.318037 +167 167 2.994905 +319 167 0.147929 +320 167 0.065746 +321 167 0.147929 +322 167 0.065746 +323 167 0.147929 +326 167 0.147929 +327 167 0.065746 +328 167 0.147929 +331 167 0.591716 +332 167 0.065746 +335 167 0.065746 +336 167 0.065746 +337 167 0.147929 +338 167 0.065746 +339 167 0.147929 +340 167 0.591716 +342 167 0.065746 +361 167 -28.144177 +362 167 -1.191786 +385 167 -24.333584 +386 167 -12.378795 +406 167 -25.940604 +409 167 -24.404391 +410 167 -15.349100 +430 167 -23.778941 +431 167 -12.119012 +433 167 -28.539358 +434 167 -14.598472 +454 167 -16.166794 +455 167 -71.943440 +456 167 -16.176955 +457 167 -36.982530 +458 167 -9.904513 +459 167 -8.388852 +460 167 -30.501458 +478 167 -11.473934 +479 167 -95.396713 +480 167 -123.199989 +481 167 -37.585664 +482 167 -1.914852 +483 167 -38.467805 +484 167 -26.960342 +168 168 3.553748 +319 168 0.065746 +321 168 0.147929 +322 168 0.147929 +323 168 0.147929 +326 168 0.147929 +327 168 0.065746 +328 168 0.147929 +331 168 0.591716 +332 168 0.147929 +335 168 0.065746 +336 168 0.147929 +337 168 0.147929 +339 168 0.591716 +340 168 0.591716 +342 168 0.147929 +361 168 -27.945913 +362 168 -1.196013 +385 168 -23.733002 +386 168 -12.710982 +406 168 -11.411567 +409 168 -23.367643 +410 168 -16.064958 +430 168 -10.104757 +431 168 -5.674321 +433 168 -27.020471 +434 168 -15.736160 +454 168 -6.340509 +455 168 -59.512572 +456 168 -16.308483 +457 168 -34.924367 +458 168 -11.513040 +459 168 -7.936738 +460 168 -30.552656 +478 168 -3.871003 +479 168 -75.561890 +480 168 -122.854039 +481 168 -37.658804 +482 168 -3.134275 +483 168 -38.104034 +484 168 -27.466873 +169 169 3.455128 +319 169 0.147929 +320 169 0.147929 +321 169 0.065746 +322 169 0.591716 +323 169 0.591716 +324 169 0.147929 +326 169 0.147929 +327 169 0.147929 +328 169 0.147929 +329 169 0.065746 +331 169 0.065746 +332 169 0.147929 +333 169 0.065746 +334 169 0.147929 +335 169 0.065746 +337 169 0.147929 +340 169 0.147929 +341 169 0.065746 +342 169 0.147929 +361 169 -6.679475 +362 169 -1.337384 +377 169 -4.459661 +386 169 -9.512694 +402 169 -12.216295 +406 169 -18.787991 +411 169 -9.720265 +427 169 -12.254881 +431 169 -25.212580 +436 169 -9.948374 +452 169 -12.302581 +456 169 -35.617832 +460 169 -22.774828 +461 169 -3.380689 +476 169 -3.355050 +477 169 -9.004318 +480 169 -24.205738 +481 169 -27.711479 +483 169 -0.126400 +485 169 -34.116712 +170 170 1.663544 +320 170 0.591716 +322 170 0.065746 +323 170 0.065746 +324 170 0.147929 +328 170 0.065746 +332 170 0.065746 +335 170 0.065746 +336 170 0.065746 +337 170 0.147929 +338 170 0.065746 +341 170 0.065746 +458 170 -1.862591 +459 170 -14.989121 +460 170 -12.881515 +481 170 -75.342715 +482 170 -14.937910 +483 170 -13.099039 +171 171 2.649737 +320 171 0.147929 +322 171 0.147929 +323 171 0.065746 +324 171 0.147929 +325 171 0.147929 +326 171 0.147929 +327 171 0.065746 +329 171 0.147929 +332 171 0.591716 +335 171 0.065746 +336 171 0.147929 +337 171 0.065746 +338 171 0.147929 +339 171 0.065746 +341 171 0.147929 +342 171 0.147929 +423 171 -9.956765 +424 171 -32.956830 +425 171 -32.959163 +426 171 -32.961796 +427 171 -32.964770 +428 171 -32.968133 +429 171 -35.875105 +430 171 -228.828920 +444 171 -26.078967 +445 171 -32.949910 +446 171 -32.951326 +447 171 -32.952938 +448 171 -22.998000 +454 171 -77.318229 +455 171 -326.191936 +456 171 -37.665332 +478 171 -38.133598 +479 171 -56.893662 +480 171 -187.077873 +481 171 -127.990523 +482 171 -27.030699 +172 172 1.597798 +320 172 0.147929 +321 172 0.065746 +322 172 0.147929 +323 172 0.065746 +325 172 0.065746 +326 172 0.147929 +327 172 0.147929 +329 172 0.147929 +332 172 0.065746 +336 172 0.147929 +339 172 0.065746 +340 172 0.065746 +342 172 0.065746 +361 172 -7.438858 +362 172 -0.995088 +386 172 -10.079897 +411 172 -10.380524 +435 172 -7.273732 +436 172 -3.434198 +444 172 -10.107556 +455 172 -1.256096 +456 172 -3.488899 +460 172 -11.063762 +469 172 -13.957224 +480 172 -12.318488 +484 172 -2.298902 +485 172 -9.150843 +494 172 -13.944742 +173 173 3.405819 +319 173 0.147929 +320 173 0.147929 +321 173 0.591716 +323 173 0.147929 +324 173 0.147929 +326 173 0.065746 +327 173 0.147929 +331 173 0.147929 +332 173 0.147929 +335 173 0.147929 +336 173 0.147929 +337 173 0.147929 +338 173 0.147929 +339 173 0.147929 +340 173 0.591716 +341 173 0.065746 +342 173 0.065746 +361 173 -113.029461 +362 173 -4.757713 +385 173 -98.699809 +386 173 -48.763388 +406 173 -26.056128 +409 173 -99.974975 +410 173 -59.773284 +430 173 -24.227510 +431 173 -11.843019 +433 173 -117.613559 +434 173 -55.810714 +454 173 -16.982817 +455 173 -71.889333 +456 173 -17.000079 +457 173 -151.731949 +458 173 -35.961307 +478 173 -12.661379 +479 173 -97.021443 +480 173 -165.574377 +481 173 -149.293556 +483 173 -0.837887 +174 174 1.663544 +320 174 0.065746 +321 174 0.147929 +322 174 0.065746 +323 174 0.147929 +324 174 0.065746 +325 174 0.065746 +326 174 0.147929 +327 174 0.065746 +332 174 0.147929 +336 174 0.065746 +337 174 0.065746 +338 174 0.147929 +341 174 0.147929 +342 174 0.065746 +360 174 -10.285883 +361 174 -35.495541 +362 174 -1.035167 +383 174 -1.995285 +384 174 -35.056438 +385 174 -24.971152 +406 174 -3.830251 +407 174 -34.740478 +408 174 -32.890877 +424 174 -1.811931 +425 174 -14.637737 +426 174 -14.638443 +427 174 -14.639241 +428 174 -14.640142 +429 174 -14.641163 +430 174 -104.530798 +431 174 -30.784734 +444 174 -11.583567 +445 174 -14.635255 +446 174 -14.635635 +447 174 -14.636068 +448 174 -14.636558 +449 174 -12.825180 +454 174 -19.956124 +455 174 -193.760606 +456 174 -16.675798 +478 174 -8.508257 +479 174 -24.969552 +480 174 -121.295930 +481 174 -63.449926 +482 174 -9.997076 +175 175 2.271696 +319 175 0.147929 +320 175 0.065746 +321 175 0.147929 +323 175 0.147929 +325 175 0.065746 +326 175 0.065746 +330 175 0.065746 +332 175 0.147929 +335 175 0.147929 +336 175 0.147929 +338 175 0.065746 +339 175 0.147929 +340 175 0.591716 +342 175 0.065746 +361 175 -28.128883 +362 175 -1.192108 +385 175 -24.287376 +386 175 -12.404284 +406 175 -25.904054 +409 175 -24.324620 +410 175 -15.404088 +430 175 -23.636164 +431 175 -12.207200 +433 175 -28.422441 +434 175 -14.685935 +444 175 -13.773527 +445 175 -4.698308 +454 175 -15.906907 +455 175 -72.013985 +456 175 -16.191204 +457 175 -36.824025 +458 175 -10.028262 +470 175 -12.783648 +471 175 -11.966067 +478 175 -11.095840 +479 175 -95.120215 +480 175 -123.251741 +481 175 -37.591243 +482 175 -1.160199 +496 175 -5.618848 +497 175 -17.704271 +498 175 -0.467063 +176 176 1.466305 +321 176 0.147929 +322 176 0.065746 +323 176 0.065746 +324 176 0.147929 +325 176 0.147929 +326 176 0.147929 +327 176 0.147929 +329 176 0.065746 +332 176 0.147929 +338 176 0.065746 +342 176 0.065746 +360 176 -11.200418 +361 176 -35.402985 +362 176 -1.032319 +383 176 -4.311007 +384 176 -34.980918 +385 176 -23.973387 +406 176 -7.906202 +407 176 -34.676861 +408 176 -30.506087 +424 176 -15.790012 +425 176 -32.940528 +426 176 -32.942358 +427 176 -32.944426 +428 176 -32.946763 +429 176 -32.949410 +430 176 -102.410099 +431 176 -26.649811 +444 176 -26.066719 +445 176 -32.934094 +446 176 -32.935079 +447 176 -32.936200 +448 176 -32.937470 +449 176 -17.148894 +454 176 -48.114559 +455 176 -124.342246 +456 176 -11.444095 +478 176 -14.548901 +479 176 -52.096958 +480 176 -62.590279 +481 176 -43.976367 +482 176 -9.707151 +177 177 3.866042 +319 177 0.147929 +320 177 0.147929 +322 177 0.591716 +323 177 0.147929 +324 177 0.147929 +325 177 0.147929 +326 177 0.591716 +327 177 0.147929 +329 177 0.147929 +330 177 0.147929 +331 177 0.147929 +332 177 0.591716 +337 177 0.147929 +339 177 0.147929 +340 177 0.065746 +341 177 0.147929 +406 177 -18.497856 +431 177 -24.745293 +444 177 -23.721568 +456 177 -29.369083 +469 177 -32.605634 +480 177 -8.443088 +481 177 -28.103824 +483 177 -0.275948 +494 177 -32.398058 +178 178 3.077087 +319 178 0.147929 +321 178 0.147929 +322 178 0.065746 +324 178 0.147929 +325 178 0.147929 +326 178 0.591716 +331 178 0.065746 +332 178 0.065746 +333 178 0.065746 +335 178 0.591716 +336 178 0.591716 +339 178 0.065746 +340 178 0.065746 +341 178 0.065746 +362 178 -16.998817 +377 178 -5.525106 +386 178 -15.455634 +387 178 -4.399097 +402 178 -11.212420 +403 178 -3.602932 +406 178 -17.544736 +407 178 -1.753651 +411 178 -19.945201 +428 178 -14.400069 +432 178 -25.260375 +436 178 -20.067275 +444 178 -30.889452 +445 178 -10.996936 +453 178 -7.856485 +454 178 -6.146518 +456 178 -4.684414 +457 178 -24.872290 +461 178 -20.221499 +470 178 -28.205288 +471 178 -27.895137 +479 178 -13.624835 +481 178 -11.817540 +482 178 -24.518468 +483 178 -0.115999 +486 178 -20.408557 +496 178 -11.532764 +497 178 -39.689408 +498 178 -2.675062 +179 179 5.328895 +319 179 0.065746 +321 179 0.147929 +322 179 0.147929 +323 179 0.591716 +324 179 0.147929 +325 179 0.147929 +326 179 0.065746 +327 179 0.147929 +330 179 0.591716 +331 179 0.591716 +335 179 0.147929 +336 179 0.147929 +337 179 0.591716 +338 179 0.591716 +339 179 0.591716 +340 179 0.065746 +341 179 0.147929 +342 179 0.147929 +361 179 -24.643333 +362 179 -1.290361 +385 179 -13.065321 +386 179 -18.977929 +406 179 -10.595182 +409 179 -4.968479 +410 179 -29.248487 +430 179 -6.524408 +431 179 -8.039049 +433 179 -0.297751 +434 179 -36.314108 +444 179 -29.787700 +455 179 -19.399921 +456 179 -2.016943 +458 179 -39.243388 +469 179 -10.333722 +470 179 -30.170131 +479 179 -16.362342 +480 179 -15.978150 +481 179 -1.443525 +482 179 -39.769974 +483 179 -3.128442 +495 179 -21.303851 +496 179 -18.400188 +180 180 2.271696 +320 180 0.147929 +321 180 0.147929 +322 180 0.065746 +323 180 0.065746 +324 180 0.147929 +325 180 0.147929 +327 180 0.147929 +331 180 0.147929 +332 180 0.147929 +335 180 0.065746 +336 180 0.147929 +337 180 0.065746 +338 180 0.065746 +339 180 0.147929 +340 180 0.147929 +341 180 0.147929 +342 180 0.065746 +361 180 -28.334028 +362 180 -1.187853 +385 180 -24.905558 +386 180 -12.064232 +409 180 -25.391901 +410 180 -14.669654 +433 180 -29.987362 +434 180 -13.516771 +444 180 -31.155205 +445 180 -9.898932 +455 180 -12.876500 +456 180 -5.059893 +457 180 -37.902806 +458 180 -8.372798 +470 180 -29.651228 +471 180 -25.388758 +479 180 -18.033723 +480 180 -42.209231 +481 180 -36.473427 +483 180 -0.841401 +496 180 -14.402935 +497 180 -38.546470 +181 181 1.893655 +319 181 0.147929 +320 181 0.065746 +324 181 0.065746 +326 181 0.065746 +330 181 0.147929 +332 181 0.065746 +336 181 0.065746 +337 181 0.147929 +338 181 0.591716 +340 181 0.147929 +341 181 0.065746 +342 181 0.065746 +406 181 -20.627782 +431 181 -27.998680 +455 181 -25.547101 +456 181 -14.543581 +480 181 -59.140008 +182 182 2.321006 +319 182 0.065746 +320 182 0.065746 +321 182 0.147929 +323 182 0.065746 +325 182 0.065746 +326 182 0.065746 +331 182 0.591716 +336 182 0.065746 +337 182 0.065746 +338 182 0.065746 +339 182 0.065746 +340 182 0.591716 +342 182 0.147929 +361 182 -27.928142 +362 182 -1.196398 +385 182 -23.679003 +386 182 -12.740946 +406 182 -11.436428 +409 182 -23.274433 +410 182 -16.129446 +430 182 -10.203635 +431 182 -5.612550 +433 182 -26.883981 +434 182 -15.838549 +444 182 -13.831121 +445 182 -4.462328 +454 182 -6.520800 +455 182 -59.472052 +456 182 -16.296932 +457 182 -34.739523 +458 182 -11.657678 +470 182 -13.095041 +471 182 -11.427321 +478 182 -4.133123 +479 182 -75.799325 +480 182 -122.401003 +481 182 -37.665449 +482 182 -3.326438 +483 182 -3.241410 +496 182 -6.236453 +497 182 -17.350442 +183 183 4.441321 +319 183 0.147929 +320 183 0.591716 +321 183 0.065746 +322 183 0.147929 +323 183 0.591716 +324 183 0.591716 +325 183 0.147929 +327 183 0.591716 +331 183 0.065746 +332 183 0.147929 +337 183 0.147929 +338 183 0.591716 +339 183 0.147929 +340 183 0.147929 +342 183 0.065746 +361 183 -6.875801 +362 183 -1.230384 +386 183 -9.635316 +406 183 -18.969356 +411 183 -9.864000 +431 183 -25.495814 +436 183 -10.114505 +444 183 -23.058078 +456 183 -36.071471 +460 183 -9.942751 +461 183 -0.445285 +469 183 -31.768573 +480 183 -32.884864 +481 183 -19.763214 +483 183 -0.128572 +485 183 -10.685878 +494 183 -31.656001 +184 184 5.131657 +320 184 0.147929 +322 184 0.147929 +323 184 0.591716 +324 184 0.147929 +325 184 0.147929 +326 184 0.591716 +327 184 0.147929 +331 184 0.147929 +332 184 0.147929 +335 184 0.147929 +337 184 0.591716 +338 184 0.591716 +339 184 0.591716 +340 184 0.147929 +342 184 0.591716 +444 184 -22.974929 +455 184 -0.299228 +456 184 -9.964432 +469 184 -31.667236 +480 184 -26.550552 +483 184 -0.291717 +494 184 -31.570685 +185 185 6.084977 +319 185 0.147929 +321 185 0.147929 +322 185 0.147929 +323 185 0.591716 +325 185 0.147929 +326 185 0.591716 +327 185 0.591716 +329 185 0.147929 +330 185 0.147929 +331 185 0.591716 +332 185 0.591716 +337 185 0.591716 +338 185 0.591716 +339 185 0.065746 +340 185 0.147929 +341 185 0.591716 +361 185 -14.993966 +362 185 -3.029393 +386 185 -21.383472 +406 185 -18.733148 +411 185 -21.846973 +431 185 -25.125929 +436 185 -22.356479 +444 185 -23.437582 +456 185 -35.476682 +460 185 -14.779471 +461 185 -8.134936 +469 185 -32.243624 +480 185 -23.480583 +481 185 -28.206263 +483 185 -1.134445 +485 185 -23.523349 +494 185 -32.072408 +186 186 3.241453 +319 186 0.147929 +320 186 0.065746 +321 186 0.147929 +325 186 0.147929 +329 186 0.147929 +330 186 0.591716 +331 186 0.147929 +332 186 0.065746 +333 186 0.065746 +335 186 0.065746 +336 186 0.065746 +337 186 0.147929 +338 186 0.591716 +340 186 0.591716 +361 186 -19.855896 +362 186 -1.609488 +377 186 -4.492621 +386 186 -26.016054 +402 186 -12.330770 +406 186 -20.612571 +410 186 -19.800478 +411 186 -7.402281 +427 186 -12.405115 +431 186 -27.976011 +435 186 -28.494970 +444 186 -25.975225 +451 186 -10.599234 +452 186 -1.889449 +455 186 -40.360808 +456 186 -33.740789 +459 186 -28.178901 +460 186 -1.721167 +469 186 -27.708322 +470 186 -7.820767 +476 186 -12.581415 +480 186 -147.882189 +483 186 -12.318989 +484 186 -19.477852 +495 186 -35.090527 +187 187 1.975838 +319 187 0.147929 +321 187 0.065746 +322 187 0.591716 +323 187 0.147929 +327 187 0.147929 +329 187 0.147929 +331 187 0.147929 +332 187 0.065746 +333 187 0.065746 +337 187 0.065746 +338 187 0.065746 +341 187 0.065746 +361 187 -6.056819 +362 187 -1.760127 +377 187 -4.451030 +386 187 -9.233498 +402 187 -12.171097 +406 187 -18.479934 +411 187 -9.388782 +427 187 -12.178040 +431 187 -24.715405 +436 187 -9.561820 +452 187 -12.194089 +456 187 -24.940093 +461 187 -9.753409 +477 187 -12.219238 +481 187 -25.194077 +483 187 -0.274252 +485 187 -6.907424 +486 187 -3.056995 +188 188 3.323636 +319 188 0.065746 +320 188 0.591716 +321 188 0.147929 +323 188 0.147929 +324 188 0.147929 +325 188 0.065746 +326 188 0.147929 +327 188 0.147929 +329 188 0.147929 +332 188 0.147929 +335 188 0.591716 +336 188 0.065746 +337 188 0.147929 +338 188 0.147929 +340 188 0.065746 +341 188 0.147929 +342 188 0.147929 +361 188 -12.113669 +362 188 -5.221569 +386 188 -20.409156 +406 188 -4.311207 +407 188 -5.821023 +411 188 -20.678490 +432 188 -13.037946 +436 188 -20.984316 +444 188 -11.870484 +445 188 -15.006041 +446 188 -15.016925 +447 188 -2.041939 +456 188 -6.950007 +457 188 -5.880152 +458 188 -6.709643 +461 188 -21.328020 +472 188 -12.987394 +473 188 -15.043433 +474 188 -15.059422 +475 188 -11.764092 +481 188 -9.840208 +482 188 -7.221465 +483 188 -12.171883 +486 188 -21.711146 +500 188 -3.313445 +189 189 2.436062 +319 189 0.147929 +320 189 0.147929 +322 189 0.065746 +324 189 0.147929 +325 189 0.147929 +327 189 0.591716 +332 189 0.065746 +333 189 0.147929 +335 189 0.065746 +337 189 0.147929 +338 189 0.147929 +339 189 0.065746 +340 189 0.147929 +342 189 0.147929 +377 189 -10.065138 +402 189 -27.598912 +406 189 -18.986406 +427 189 -27.726465 +431 189 -25.522230 +444 189 -23.082399 +451 189 -6.286503 +452 189 -21.588116 +456 189 -36.113148 +469 189 -31.798491 +476 189 -28.043283 +480 189 -33.899766 +481 189 -18.814687 +494 189 -31.681555 +190 190 2.567554 +319 190 0.065746 +320 190 0.591716 +321 190 0.147929 +322 190 0.147929 +324 190 0.147929 +325 190 0.065746 +327 190 0.065746 +330 190 0.147929 +331 190 0.147929 +332 190 0.065746 +337 190 0.147929 +338 190 0.065746 +339 190 0.147929 +340 190 0.147929 +341 190 0.147929 +342 190 0.065746 +361 190 -9.777062 +362 190 -7.386346 +386 190 -20.146802 +406 190 -8.102647 +411 190 -20.347215 +431 190 -10.775101 +436 190 -20.581745 +444 190 -10.883892 +456 190 -20.494566 +461 190 -20.851443 +469 190 -14.931073 +481 190 -35.675040 +483 190 -0.263878 +486 190 -21.157512 +494 190 -5.392037 +495 190 -9.408876 +191 191 1.400559 +321 191 0.065746 +328 191 0.065746 +332 191 0.147929 +336 191 0.147929 +339 191 0.591716 +340 191 0.065746 +342 191 0.065746 +362 191 -7.546078 +387 191 -8.779243 +412 191 -8.781986 +437 191 -8.798433 +456 191 -4.556974 +460 191 -6.386667 +461 191 -6.263009 +462 191 -2.565649 +481 191 -11.526292 +485 191 -9.260638 +486 191 -8.872796 +192 192 6.315089 +321 192 0.147929 +322 192 0.591716 +324 192 0.591716 +325 192 0.147929 +327 192 0.147929 +329 192 0.591716 +330 192 0.591716 +332 192 0.591716 +333 192 0.147929 +335 192 0.591716 +336 192 0.147929 +337 192 0.591716 +341 192 0.591716 +342 192 0.591716 +361 192 -19.648767 +362 192 -1.634240 +377 192 -12.671234 +386 192 -25.771831 +402 192 -23.710530 +403 192 -10.230277 +410 192 -18.343829 +411 192 -8.577192 +428 192 -32.936114 +435 192 -28.171970 +444 192 -27.275733 +445 192 -34.497676 +446 192 -12.882125 +453 192 -12.794925 +454 192 -19.180243 +459 192 -25.484436 +460 192 -4.047331 +471 192 -21.662342 +472 192 -34.597923 +473 192 -34.658806 +474 192 -5.235777 +479 192 -31.059767 +483 192 -8.400291 +484 192 -22.607117 +499 192 -29.492252 +500 192 -34.806691 +193 193 2.666174 +320 193 0.147929 +321 193 0.147929 +322 193 0.147929 +324 193 0.147929 +325 193 0.147929 +328 193 0.065746 +329 193 0.065746 +330 193 0.147929 +331 193 0.147929 +332 193 0.147929 +333 193 0.065746 +334 193 0.147929 +335 193 0.147929 +337 193 0.147929 +338 193 0.147929 +339 193 0.147929 +340 193 0.147929 +342 193 0.147929 +361 193 -15.631605 +362 193 -2.688106 +377 193 -4.480890 +386 193 -21.789848 +402 193 -12.291791 +411 193 -22.322931 +427 193 -12.355992 +435 193 -1.350568 +436 193 -21.555723 +444 193 -22.991199 +451 193 -6.468600 +452 193 -5.960775 +455 193 -0.191729 +456 193 -10.059884 +460 193 -30.797422 +469 193 -31.686931 +476 193 -12.511890 +480 193 -26.516227 +483 193 -0.291289 +485 193 -35.012657 +494 193 -31.587090 +194 194 2.748356 +319 194 0.147929 +320 194 0.147929 +321 194 0.147929 +323 194 0.147929 +324 194 0.147929 +325 194 0.147929 +328 194 0.147929 +331 194 0.147929 +332 194 0.147929 +333 194 0.147929 +335 194 0.147929 +336 194 0.147929 +337 194 0.147929 +338 194 0.065746 +339 194 0.065746 +340 194 0.147929 +341 194 0.147929 +342 194 0.147929 +361 194 -25.952218 +362 194 -1.246604 +377 194 -11.057138 +385 194 -17.470249 +386 194 -16.300214 +401 194 -16.471481 +402 194 -14.139957 +406 194 -25.964583 +409 194 -12.563420 +410 194 -23.690394 +426 194 -31.181685 +430 194 -23.872385 +431 194 -12.061384 +433 194 -11.273821 +434 194 -27.726264 +444 194 -24.977458 +450 194 -6.567345 +451 194 -25.208599 +454 194 -16.336845 +455 194 -32.846764 +456 194 -4.185427 +457 194 -13.719504 +458 194 -28.307643 +460 194 -30.904257 +469 194 -34.229349 +475 194 -32.392681 +478 194 -11.721353 +479 194 -39.430807 +480 194 -30.147194 +481 194 -20.070568 +482 194 -25.277128 +483 194 -11.302285 +484 194 -36.954998 +485 194 -1.117197 +494 194 -3.639276 +495 194 -30.247713 +499 194 -4.369629 +500 194 -28.660383 +195 195 7.777942 +319 195 0.147929 +320 195 0.591716 +321 195 0.065746 +322 195 0.147929 +323 195 0.591716 +324 195 0.591716 +326 195 0.065746 +327 195 0.591716 +328 195 0.147929 +329 195 0.591716 +330 195 0.591716 +331 195 0.591716 +332 195 0.591716 +333 195 0.147929 +337 195 0.591716 +338 195 0.591716 +339 195 0.147929 +341 195 0.591716 +342 195 0.147929 +361 195 -6.302385 +362 195 -1.579494 +377 195 -10.015071 +386 195 -9.325172 +402 195 -27.382868 +406 195 -18.524839 +411 195 -9.498491 +427 195 -27.394406 +431 195 -24.789971 +436 195 -9.690457 +452 195 -27.426438 +456 195 -25.031989 +460 195 -16.322124 +461 195 -9.135872 +477 195 -27.478953 +481 195 -25.303647 +483 195 -1.107584 +485 195 -33.114241 +196 196 2.041584 +319 196 0.065746 +320 196 0.147929 +321 196 0.065746 +322 196 0.147929 +323 196 0.147929 +324 196 0.065746 +325 196 0.147929 +327 196 0.147929 +331 196 0.065746 +333 196 0.065746 +335 196 0.147929 +336 196 0.147929 +339 196 0.147929 +340 196 0.147929 +341 196 0.065746 +342 196 0.065746 +362 196 -7.630802 +377 196 -6.578050 +387 196 -8.818201 +402 196 -6.822316 +403 196 -10.647542 +406 196 -4.724066 +407 196 -4.953089 +412 196 -8.757410 +428 196 -9.578516 +429 196 -7.157330 +432 196 -12.504333 +437 196 -8.710806 +444 196 -28.841879 +445 196 -23.329349 +454 196 -13.587853 +455 196 -2.447378 +456 196 -12.434062 +457 196 -9.979604 +458 196 -2.152468 +462 196 -8.678173 +470 196 -13.201302 +471 196 -36.646884 +472 196 -19.188510 +480 196 -15.370233 +481 196 -30.988883 +483 196 -11.913310 +487 196 -8.659360 +497 196 -17.591945 +498 196 -36.933613 +499 196 -10.704232 +197 197 2.863412 +319 197 0.065746 +322 197 0.147929 +325 197 0.065746 +327 197 0.065746 +328 197 0.065746 +329 197 0.147929 +332 197 0.591716 +333 197 0.065746 +335 197 0.591716 +337 197 0.591716 +339 197 0.147929 +340 197 0.065746 +377 197 -4.903187 +402 197 -13.245077 +406 197 -8.221907 +427 197 -5.925675 +428 197 -7.090803 +431 197 -6.972126 +432 197 -3.868412 +444 197 -14.189898 +453 197 -12.800156 +456 197 -4.385309 +457 197 -10.762978 +460 197 -6.451495 +469 197 -2.220876 +470 197 -17.018112 +478 197 -12.596288 +481 197 -11.146222 +482 197 -10.698144 +485 197 -9.413688 +495 197 -3.949898 +496 197 -14.838326 +198 198 1.630671 +320 198 0.147929 +322 198 0.147929 +323 198 0.147929 +324 198 0.147929 +325 198 0.065746 +328 198 0.147929 +329 198 0.147929 +335 198 0.065746 +338 198 0.065746 +341 198 0.147929 +342 198 0.147929 +444 198 -11.670203 +445 198 -14.747152 +446 198 -14.750618 +447 198 -14.754563 +448 198 -14.759038 +449 198 -2.850105 +459 198 -16.404406 +460 198 -29.810110 +474 198 -11.913997 +475 198 -14.769826 +476 198 -14.776294 +477 198 -14.783608 +478 198 -14.791888 +479 198 -12.257399 +482 198 -23.965650 +483 198 -34.479334 +484 198 -18.207771 +199 199 2.501808 +319 199 0.065746 +321 199 0.065746 +323 199 0.147929 +325 199 0.065746 +326 199 0.591716 +327 199 0.147929 +330 199 0.147929 +332 199 0.147929 +335 199 0.591716 +336 199 0.147929 +339 199 0.065746 +341 199 0.065746 +362 199 -8.131908 +387 199 -9.275233 +406 199 -3.908519 +407 199 -6.926304 +412 199 -9.083542 +432 199 -13.860607 +437 199 -8.910924 +444 199 -12.723687 +445 199 -11.251220 +457 199 -1.410199 +458 199 -11.884810 +462 199 -6.953640 +463 199 -1.802820 +470 199 -4.861174 +471 199 -16.159532 +472 199 -10.638581 +483 199 -11.443251 +484 199 -1.325345 +488 199 -8.619327 +497 199 -5.575077 +498 199 -16.275661 +499 199 -7.975875 +200 200 1.548488 +322 200 0.147929 +323 200 0.065746 +324 200 0.147929 +327 200 0.591716 +329 200 0.147929 +332 200 0.065746 +333 200 0.065746 +341 200 0.065746 +377 200 -4.523869 +402 200 -12.312339 +427 200 -12.234797 +452 200 -12.166842 +477 200 -12.108498 +201 201 3.077087 +319 201 0.147929 +320 201 0.147929 +321 201 0.147929 +323 201 0.065746 +324 201 0.147929 +326 201 0.147929 +327 201 0.065746 +328 201 0.065746 +329 201 0.591716 +330 201 0.147929 +331 201 0.147929 +332 201 0.147929 +335 201 0.065746 +336 201 0.147929 +337 201 0.065746 +338 201 0.147929 +339 201 0.147929 +340 201 0.065746 +341 201 0.147929 +342 201 0.065746 +360 201 -17.127859 +361 201 -34.905313 +362 201 -1.017026 +383 201 -19.436537 +384 201 -34.573081 +385 201 -17.597355 +405 201 -29.446783 +406 201 -62.792401 +407 201 -34.332236 +408 201 -15.006935 +427 201 -10.531149 +428 201 -65.784402 +429 201 -68.703808 +430 201 -39.438831 +450 201 -173.003373 +451 201 -149.686028 +452 201 -120.233645 +453 201 -32.022137 +454 201 -29.249476 +455 201 -29.249877 +456 201 -16.082386 +457 201 -14.627822 +458 201 -14.628295 +459 201 -14.628840 +460 201 -12.547656 +475 201 -238.116776 +476 201 -228.943175 +477 201 -52.887351 +478 201 -37.898732 +479 201 -33.133533 +480 201 -33.147403 +481 201 -33.163215 +482 201 -33.181307 +483 201 -30.013713 +500 201 -169.306615 +202 202 3.241453 +319 202 0.147929 +320 202 0.147929 +321 202 0.147929 +323 202 0.065746 +324 202 0.147929 +325 202 0.147929 +328 202 0.147929 +330 202 0.147929 +332 202 0.065746 +335 202 0.065746 +336 202 0.147929 +337 202 0.591716 +338 202 0.147929 +339 202 0.065746 +340 202 0.591716 +341 202 0.147929 +342 202 0.065746 +361 202 -25.258473 +362 202 -1.268516 +385 202 -15.171218 +386 202 -17.680741 +406 202 -25.008320 +409 202 -8.599189 +410 202 -26.569848 +430 202 -19.991356 +431 202 -14.515924 +433 202 -5.534864 +434 202 -32.191482 +444 202 -26.258241 +454 202 -9.247317 +455 202 -69.277789 +456 202 -17.301063 +457 202 -6.054058 +458 202 -34.486422 +460 202 -29.869548 +469 202 -25.616198 +470 202 -10.282129 +478 202 -1.421954 +479 202 -65.534425 +480 202 -129.394190 +481 202 -10.289852 +482 202 -33.334147 +483 202 -7.227588 +484 202 -37.285444 +485 202 -2.467110 +495 202 -35.433068 +203 203 2.863412 +320 203 0.591716 +321 203 0.065746 +322 203 0.065746 +323 203 0.065746 +324 203 0.147929 +325 203 0.147929 +326 203 0.065746 +327 203 0.147929 +328 203 0.147929 +331 203 0.147929 +332 203 0.147929 +335 203 0.147929 +336 203 0.147929 +337 203 0.147929 +338 203 0.147929 +339 203 0.065746 +341 203 0.065746 +342 203 0.147929 +357 203 -2.526895 +358 203 -14.737150 +359 203 -14.746281 +360 203 -14.756889 +361 203 -14.769298 +362 203 -0.429255 +377 203 -11.324749 +378 203 -172.714663 +379 203 -102.732824 +380 203 -18.772268 +381 203 -14.722364 +382 203 -12.202349 +399 203 -24.925051 +400 203 -33.901634 +401 203 -33.946738 +402 203 -22.673133 +403 203 -126.646328 +404 203 -306.602168 +405 203 -71.900787 +406 203 -34.043741 +407 203 -30.760694 +420 203 -21.367282 +421 203 -33.768405 +422 203 -33.795683 +423 203 -33.826676 +424 203 -8.936769 +427 203 -10.131458 +428 203 -87.034684 +429 203 -227.029717 +430 203 -91.403795 +431 203 -48.556454 +432 203 -3.364559 +433 203 -34.219503 +434 203 -34.329150 +435 203 -7.570422 +444 203 -26.693810 +445 203 -12.377196 +452 203 -18.624694 +453 203 -63.140545 +454 203 -167.932564 +455 203 -109.085035 +456 203 -46.795154 +457 203 -48.378220 +460 203 -21.975213 +476 203 -14.355894 +477 203 -29.866197 +478 203 -38.538210 +479 203 -155.758802 +480 203 -85.307117 +481 203 -44.887469 +482 203 -34.307071 +483 203 -41.177786 +500 203 -5.311735 +204 204 4.753616 +319 204 0.147929 +320 204 0.147929 +321 204 0.147929 +322 204 0.591716 +323 204 0.591716 +324 204 0.147929 +327 204 0.147929 +328 204 0.147929 +329 204 0.065746 +331 204 0.147929 +334 204 0.147929 +337 204 0.147929 +338 204 0.147929 +339 204 0.591716 +340 204 0.591716 +341 204 0.591716 +361 204 -16.651092 +362 204 -2.268117 +386 204 -22.602665 +406 204 -19.658966 +411 204 -23.266973 +431 204 -26.547743 +435 204 -15.272454 +436 204 -8.718180 +455 204 -14.606765 +456 204 -55.095876 +460 204 -41.867037 +480 204 -138.281843 +483 204 -0.306060 +484 204 -3.378760 +485 204 -47.760450 +205 205 2.814103 +319 205 0.147929 +321 205 0.147929 +322 205 0.065746 +323 205 0.591716 +327 205 0.147929 +328 205 0.065746 +331 205 0.065746 +332 205 0.591716 +335 205 0.591716 +341 205 0.147929 +362 205 -18.248030 +387 205 -20.822116 +406 205 -8.829422 +407 205 -15.470811 +412 205 -20.400615 +432 205 -31.095052 +437 205 -20.021496 +457 205 -3.596850 +458 205 -26.238771 +460 205 -4.556026 +461 205 -2.576765 +462 205 -18.139283 +463 205 -1.543471 +483 205 -26.668236 +484 205 -2.140555 +486 205 -10.106896 +488 205 -19.382595 +206 206 2.337442 +319 206 0.147929 +320 206 0.065746 +321 206 0.065746 +322 206 0.065746 +324 206 0.147929 +325 206 0.147929 +327 206 0.147929 +328 206 0.065746 +331 206 0.147929 +332 206 0.147929 +334 206 0.065746 +336 206 0.147929 +337 206 0.065746 +338 206 0.147929 +339 206 0.065746 +340 206 0.147929 +341 206 0.147929 +342 206 0.147929 +361 206 -9.534104 +362 206 -0.649070 +385 206 -0.253352 +386 206 -12.171982 +406 206 -20.522991 +410 206 -13.087746 +431 206 -27.842462 +434 206 -6.453976 +435 206 -7.357436 +444 206 -33.438036 +445 206 -2.573196 +455 206 -24.102658 +456 206 -15.803889 +458 206 -1.115856 +459 206 -13.484842 +460 206 -10.692101 +470 206 -39.977721 +471 206 -8.595491 +480 206 -58.921014 +483 206 -15.889956 +484 206 -11.462287 +485 206 -5.003207 +496 206 -34.350017 +497 206 -12.762101 +207 207 1.038955 +320 207 0.065746 +321 207 0.147929 +323 207 0.065746 +332 207 0.147929 +335 207 0.147929 +336 207 0.147929 +341 207 0.065746 +362 207 -18.244548 +387 207 -20.818753 +412 207 -20.397955 +437 207 -20.019503 +462 207 -18.325244 +463 207 -1.356151 +488 207 -19.381840 +208 208 3.849606 +319 208 0.147929 +320 208 0.591716 +321 208 0.147929 +322 208 0.065746 +323 208 0.147929 +327 208 0.147929 +328 208 0.065746 +329 208 0.065746 +331 208 0.147929 +332 208 0.591716 +335 208 0.591716 +336 208 0.591716 +339 208 0.147929 +341 208 0.147929 +362 208 -18.248913 +387 208 -20.822970 +406 208 -8.840398 +407 208 -15.435861 +412 208 -20.401290 +432 208 -31.067024 +437 208 -20.022002 +457 208 -3.728128 +458 208 -26.083502 +460 208 -4.562002 +461 208 -2.568442 +462 208 -18.092260 +463 208 -1.590840 +483 208 -27.090311 +484 208 -1.879696 +486 208 -10.103955 +488 208 -19.382788 +209 209 0.743097 +321 209 0.147929 +322 209 0.065746 +325 209 0.065746 +329 209 0.065746 +335 209 0.147929 +352 209 -8.217393 +353 209 -51.684967 +354 209 -32.904776 +355 209 -32.905176 +356 209 -32.905631 +357 209 -32.906151 +358 209 -32.906748 +359 209 -32.907436 +360 209 -32.908234 +361 209 -32.909165 +362 209 -0.956027 +375 209 -12.197711 +376 209 -15.629348 +377 209 -7.961272 +378 209 -52.111372 +397 209 -4.302801 +398 209 -15.508394 +399 209 -15.543640 +400 209 -3.386017 +402 209 -13.951385 +403 209 -39.014250 +419 209 -0.019589 +420 209 -15.426463 +421 209 -15.450239 +422 209 -11.174617 +426 209 -0.165961 +427 209 -24.854092 +428 209 -28.351373 +444 209 -12.175638 +451 209 -14.622039 +452 209 -12.895086 +453 209 -10.301726 +454 209 -16.006333 +475 209 -2.837448 +476 209 -12.139043 +477 209 -13.088161 +479 209 -26.261093 +500 209 -15.342116 +210 210 2.830539 +324 210 0.147929 +326 210 0.591716 +327 210 0.065746 +329 210 0.591716 +330 210 0.147929 +332 210 0.147929 +334 210 0.147929 +337 210 0.147929 +342 210 0.591716 +211 211 1.679980 +320 211 0.147929 +321 211 0.147929 +322 211 0.147929 +324 211 0.065746 +325 211 0.065746 +327 211 0.065746 +328 211 0.147929 +329 211 0.147929 +332 211 0.147929 +335 211 0.065746 +337 211 0.065746 +339 211 0.065746 +341 211 0.147929 +357 211 -14.252876 +358 211 -33.133721 +359 211 -33.152283 +360 211 -33.173845 +361 211 -33.199059 +362 211 -0.964853 +377 211 -1.477177 +378 211 -15.103848 +379 211 -150.102115 +380 211 -68.556355 +381 211 -37.074515 +382 211 -18.864771 +399 211 -8.767050 +400 211 -15.039715 +401 211 -15.058463 +402 211 -13.602539 +403 211 -11.191981 +404 211 -137.687923 +405 211 -57.728153 +406 211 -30.482148 +407 211 -34.565797 +408 211 -13.229371 +420 211 -8.922973 +421 211 -14.984309 +422 211 -14.995657 +423 211 -15.008548 +424 211 -6.256112 +428 211 -61.026042 +429 211 -51.063171 +430 211 -86.493554 +431 211 -7.600657 +433 211 -21.467216 +434 211 -34.849250 +435 211 -11.075792 +444 211 -11.845983 +445 211 -6.051382 +452 211 -21.671134 +453 211 -55.027848 +454 211 -37.229940 +455 211 -63.455410 +456 211 -28.636978 +460 211 -18.956281 +476 211 -2.770129 +477 211 -46.570327 +478 211 -29.290608 +479 211 -37.259814 +480 211 -30.103702 +481 211 -49.156653 +482 211 -10.965956 +212 212 3.027778 +320 212 0.591716 +321 212 0.147929 +322 212 0.147929 +323 212 0.065746 +324 212 0.147929 +325 212 0.147929 +327 212 0.147929 +328 212 0.147929 +329 212 0.065746 +332 212 0.147929 +335 212 0.591716 +336 212 0.065746 +337 212 0.065746 +339 212 0.147929 +341 212 0.147929 +356 212 -16.986900 +357 212 -33.051556 +358 212 -33.062759 +359 212 -33.075690 +360 212 -33.090703 +361 212 -33.108248 +362 212 -0.962087 +377 212 -30.170222 +378 212 -46.478778 +379 212 -372.068729 +380 212 -67.377967 +381 212 -19.288447 +398 212 -3.036386 +399 212 -34.023372 +400 212 -34.070207 +401 212 -34.123301 +402 212 -4.013326 +403 212 -71.142945 +404 212 -349.202937 +405 212 -19.497370 +406 212 -31.208220 +407 212 -34.553683 +408 212 -12.862376 +420 212 -24.364007 +421 212 -33.913592 +422 212 -33.945632 +423 212 -30.945667 +427 212 -14.790475 +428 212 -58.845964 +429 212 -268.684623 +430 212 -93.089757 +431 212 -1.421591 +433 212 -21.821072 +434 212 -34.834902 +435 212 -10.996415 +444 212 -26.802830 +445 212 -9.521492 +452 212 -36.892373 +453 212 -48.037554 +454 212 -233.500490 +455 212 -99.815151 +456 212 -16.069167 +460 212 -19.022213 +476 212 -25.579510 +477 212 -37.639442 +478 212 -37.221232 +479 212 -130.087387 +480 212 -133.291827 +481 212 -62.770258 +482 212 -5.696139 +500 212 -6.270051 +213 213 1.910092 +319 213 0.147929 +320 213 0.065746 +321 213 0.147929 +323 213 0.147929 +324 213 0.065746 +326 213 0.147929 +327 213 0.065746 +328 213 0.065746 +331 213 0.147929 +332 213 0.147929 +333 213 0.147929 +335 213 0.147929 +336 213 0.065746 +341 213 0.147929 +361 213 -24.257999 +362 213 -1.305384 +377 213 -10.811077 +385 213 -11.708847 +386 213 -19.830761 +402 213 -29.247655 +406 213 -20.252745 +409 213 -2.630050 +410 213 -30.995406 +427 213 -20.858367 +428 213 -7.948102 +431 213 -27.438973 +434 213 -35.921052 +453 213 -28.391196 +455 213 -15.063190 +456 213 -13.034239 +458 213 -35.375702 +459 213 -3.659495 +460 213 -14.010260 +478 213 -28.002119 +480 213 -28.799069 +482 213 -35.830900 +483 213 -13.644293 +484 213 -15.597376 +214 214 2.452498 +319 214 0.147929 +320 214 0.065746 +321 214 0.065746 +323 214 0.147929 +324 214 0.065746 +327 214 0.147929 +328 214 0.147929 +329 214 0.065746 +330 214 0.065746 +331 214 0.065746 +332 214 0.591716 +333 214 0.147929 +335 214 0.147929 +336 214 0.065746 +339 214 0.065746 +340 214 0.065746 +341 214 0.065746 +342 214 0.065746 +361 214 -11.491066 +362 214 -0.555343 +377 214 -11.720944 +385 214 -7.623161 +386 214 -7.328492 +401 214 -23.661057 +402 214 -8.905852 +406 214 -26.768499 +409 214 -5.339918 +410 214 -10.704949 +426 214 -33.345011 +430 214 -26.910902 +431 214 -10.225105 +433 214 -4.657042 +434 214 -12.596443 +450 214 -30.088058 +451 214 -4.060952 +454 214 -21.849379 +455 214 -22.497549 +456 214 -1.834952 +457 214 -5.624414 +458 214 -12.960956 +460 214 -29.839779 +474 214 -6.857175 +475 214 -28.118555 +478 214 -19.750981 +479 214 -27.365546 +480 214 -12.974802 +481 214 -8.315352 +482 214 -11.730813 +483 214 -7.378220 +484 214 -37.295592 +485 214 -2.506573 +499 214 -35.821302 +215 215 4.145464 +319 215 0.147929 +321 215 0.147929 +322 215 0.147929 +323 215 0.591716 +324 215 0.591716 +327 215 0.147929 +328 215 0.065746 +329 215 0.065746 +331 215 0.147929 +332 215 0.147929 +333 215 0.065746 +334 215 0.591716 +335 215 0.147929 +339 215 0.591716 +340 215 0.147929 +342 215 0.147929 +361 215 -15.673740 +362 215 -2.667766 +377 215 -4.482458 +386 215 -21.819580 +402 215 -12.297065 +406 215 -19.066989 +411 215 -22.357621 +427 215 -12.362718 +431 215 -25.646690 +435 215 -1.960099 +436 215 -20.986159 +451 215 -7.114015 +452 215 -5.323543 +455 215 -0.299744 +456 215 -36.012312 +460 215 -30.855502 +476 215 -12.521536 +480 215 -38.117645 +481 215 -14.916820 +483 215 -0.291802 +485 215 -35.084808 +216 216 4.079717 +320 216 0.591716 +321 216 0.065746 +322 216 0.147929 +323 216 0.591716 +327 216 0.147929 +329 216 0.147929 +331 216 0.147929 +332 216 0.147929 +333 216 0.065746 +335 216 0.147929 +337 216 0.147929 +338 216 0.591716 +339 216 0.147929 +340 216 0.147929 +341 216 0.591716 +362 216 -8.523449 +377 216 -7.117774 +387 216 -9.659085 +402 216 -5.516266 +403 216 -13.304107 +412 216 -9.394566 +428 216 -5.679960 +429 216 -12.230076 +437 216 -4.281804 +438 216 -4.871875 +454 216 -7.116158 +455 216 -9.927669 +456 216 -13.822449 +463 216 -8.935004 +480 216 -9.855923 +481 216 -34.239677 +482 216 -6.340307 +483 216 -0.332543 +488 216 -8.737248 +217 217 2.156640 +319 217 0.147929 +320 217 0.147929 +321 217 0.065746 +322 217 0.147929 +323 217 0.147929 +324 217 0.147929 +327 217 0.147929 +328 217 0.147929 +329 217 0.147929 +331 217 0.147929 +339 217 0.147929 +340 217 0.065746 +341 217 0.147929 +342 217 0.147929 +361 217 -6.607830 +362 217 -1.379765 +386 217 -9.472304 +406 217 -18.715121 +411 217 -9.672730 +431 217 -25.097317 +436 217 -9.893279 +456 217 -29.860105 +460 217 -21.535762 +461 217 -4.469567 +480 217 -10.335175 +481 217 -26.904673 +483 217 -0.282635 +485 217 -33.901067 +218 218 3.553748 +321 218 0.065746 +322 218 0.147929 +323 218 0.591716 +324 218 0.065746 +326 218 0.147929 +327 218 0.147929 +329 218 0.591716 +330 218 0.147929 +331 218 0.065746 +332 218 0.591716 +333 218 0.147929 +341 218 0.591716 +361 218 -6.591341 +362 218 -1.389768 +377 218 -10.017737 +386 218 -9.463335 +402 218 -27.414059 +411 218 -9.662158 +427 218 -27.460587 +436 218 -9.881014 +452 218 -27.527585 +460 218 -5.399914 +461 218 -4.721022 +477 218 -27.615023 +483 218 -0.125303 +485 218 -10.383035 +219 219 3.570184 +319 219 0.147929 +320 219 0.591716 +322 219 0.147929 +323 219 0.065746 +324 219 0.147929 +331 219 0.147929 +332 219 0.591716 +337 219 0.591716 +338 219 0.591716 +339 219 0.147929 +341 219 0.147929 +406 219 -18.605470 +431 219 -24.921604 +456 219 -25.192166 +481 219 -25.492980 +483 219 -0.279994 +220 220 5.493261 +319 220 0.147929 +320 220 0.147929 +322 220 0.147929 +323 220 0.591716 +324 220 0.147929 +326 220 0.591716 +327 220 0.065746 +328 220 0.147929 +329 220 0.147929 +330 220 0.591716 +331 220 0.591716 +332 220 0.591716 +333 220 0.147929 +334 220 0.147929 +337 220 0.147929 +338 220 0.147929 +339 220 0.147929 +341 220 0.591716 +377 220 -10.015775 +402 220 -27.401450 +406 220 -18.630564 +427 220 -27.437368 +431 220 -24.962105 +452 220 -27.493757 +456 220 -25.241019 +460 220 -15.780598 +477 220 -27.570594 +481 220 -25.550375 +483 220 -1.122766 +485 220 -23.353430 +221 221 5.575444 +319 221 0.147929 +320 221 0.591716 +322 221 0.147929 +323 221 0.147929 +324 221 0.147929 +326 221 0.591716 +327 221 0.147929 +328 221 0.147929 +329 221 0.147929 +330 221 0.591716 +331 221 0.147929 +332 221 0.147929 +333 221 0.147929 +334 221 0.147929 +337 221 0.591716 +338 221 0.591716 +339 221 0.147929 +341 221 0.591716 +377 221 -10.016153 +402 221 -27.404218 +406 221 -18.639575 +427 221 -27.442675 +431 221 -24.976602 +452 221 -27.501603 +456 221 -25.258463 +460 221 -15.795159 +477 221 -27.580976 +481 221 -25.570835 +483 221 -0.280960 +485 221 -23.377566 +222 222 5.854865 +319 222 0.147929 +320 222 0.591716 +322 222 0.591716 +323 222 0.591716 +324 222 0.147929 +327 222 0.147929 +328 222 0.147929 +329 222 0.591716 +331 222 0.591716 +333 222 0.147929 +337 222 0.591716 +338 222 0.591716 +339 222 0.065746 +340 222 0.065746 +341 222 0.591716 +377 222 -10.016369 +402 222 -27.405699 +406 222 -18.644586 +427 222 -27.445458 +431 222 -24.984655 +452 222 -27.505688 +456 222 -29.703642 +460 222 -15.803861 +477 222 -27.586362 +480 222 -9.839629 +481 222 -27.179606 +483 222 -1.124467 +485 222 -23.391986 +223 223 4.589250 +319 223 0.591716 +321 223 0.065746 +322 223 0.147929 +323 223 0.591716 +327 223 0.147929 +328 223 0.147929 +329 223 0.591716 +331 223 0.147929 +332 223 0.591716 +337 223 0.065746 +338 223 0.065746 +339 223 0.591716 +341 223 0.591716 +361 223 -6.511205 +362 223 -1.439684 +386 223 -9.421456 +406 223 -74.476209 +411 223 -9.612721 +431 223 -99.774197 +436 223 -9.823595 +456 223 -100.874635 +460 223 -19.868655 +461 223 -5.945891 +481 223 -102.096496 +483 223 -0.280318 +485 223 -33.626621 +224 224 4.293393 +319 224 0.147929 +320 224 0.591716 +321 224 0.065746 +322 224 0.147929 +323 224 0.147929 +324 224 0.147929 +326 224 0.147929 +327 224 0.147929 +328 224 0.147929 +329 224 0.065746 +331 224 0.147929 +332 224 0.147929 +333 224 0.065746 +337 224 0.591716 +338 224 0.591716 +339 224 0.147929 +341 224 0.591716 +361 224 -6.543806 +362 224 -1.419118 +377 224 -4.451716 +386 224 -9.438153 +402 224 -12.180282 +406 224 -18.641999 +411 224 -9.632448 +427 224 -12.197929 +431 224 -24.980498 +436 224 -9.846519 +452 224 -12.224673 +456 224 -25.263147 +460 224 -20.429595 +461 224 -5.447143 +477 224 -12.260504 +481 224 -25.576326 +483 224 -0.280988 +485 224 -33.716005 +225 225 0.381492 +333 225 0.065746 +337 225 0.065746 +377 225 -4.451447 +402 225 -12.178354 +427 225 -12.194254 +452 225 -12.219252 +477 225 -12.253338 +226 226 0.759533 +322 226 0.147929 +331 226 0.147929 +341 226 0.065746 +342 226 0.147929 +483 226 -0.281270 +227 227 5.115220 +319 227 0.147929 +320 227 0.591716 +321 227 0.065746 +322 227 0.147929 +323 227 0.147929 +324 227 0.147929 +327 227 0.591716 +328 227 0.065746 +329 227 0.591716 +331 227 0.591716 +337 227 0.591716 +341 227 0.591716 +342 227 0.591716 +361 227 -6.335723 +362 227 -1.556270 +386 227 -9.339348 +406 227 -18.538195 +411 227 -9.515365 +431 227 -24.811957 +436 227 -9.710170 +456 227 -25.058910 +460 227 -8.223048 +461 227 -8.628683 +481 227 -25.335604 +483 227 -1.109574 +485 227 -20.395399 +228 228 4.161900 +319 228 0.147929 +320 228 0.147929 +321 228 0.147929 +323 228 0.591716 +324 228 0.147929 +327 228 0.147929 +328 228 0.147929 +330 228 0.147929 +331 228 0.147929 +335 228 0.591716 +337 228 0.147929 +339 228 0.065746 +340 228 0.147929 +341 228 0.591716 +342 228 0.591716 +361 228 -26.205243 +362 228 -1.239242 +385 228 -18.291200 +386 228 -15.815866 +406 228 -25.508661 +409 228 -13.979167 +410 228 -22.673111 +430 228 -22.063601 +431 228 -13.189592 +433 228 -13.328516 +434 228 -26.140492 +454 228 -13.039558 +455 228 -35.200407 +456 228 -4.210445 +457 228 -16.472295 +458 228 -26.103290 +459 228 -0.505696 +460 228 -31.681825 +478 228 -6.927093 +479 228 -42.532732 +480 228 -30.555349 +481 228 -23.593884 +482 228 -22.390812 +483 228 -15.564130 +484 228 -36.092262 +229 229 7.350592 +319 229 0.147929 +320 229 0.591716 +322 229 0.147929 +323 229 0.591716 +324 229 0.147929 +326 229 0.147929 +327 229 0.591716 +328 229 0.591716 +329 229 0.591716 +330 229 0.591716 +331 229 0.591716 +332 229 0.147929 +337 229 0.591716 +338 229 0.591716 +339 229 0.147929 +340 229 0.147929 +341 229 0.591716 +342 229 0.147929 +406 229 -18.637928 +431 229 -24.973954 +456 229 -35.230862 +460 229 -63.144609 +480 229 -22.030419 +481 229 -29.257509 +483 229 -1.123343 +485 229 -93.450551 +230 230 5.854865 +319 230 0.147929 +320 230 0.591716 +321 230 0.065746 +322 230 0.147929 +323 230 0.147929 +324 230 0.147929 +326 230 0.591716 +327 230 0.147929 +328 230 0.065746 +329 230 0.147929 +331 230 0.591716 +332 230 0.591716 +337 230 0.591716 +338 230 0.591716 +339 230 0.147929 +340 230 0.147929 +341 230 0.147929 +342 230 0.591716 +361 230 -6.340072 +362 230 -1.553264 +386 230 -9.341229 +406 230 -18.546388 +411 230 -9.517604 +431 230 -24.825404 +436 230 -9.712784 +456 230 -34.990318 +460 230 -8.294403 +461 230 -8.562422 +480 230 -20.239871 +481 230 -30.657612 +483 230 -1.110167 +485 230 -20.402296 +231 231 2.600427 +319 231 0.147929 +320 231 0.147929 +321 231 0.147929 +323 231 0.147929 +324 231 0.147929 +327 231 0.147929 +328 231 0.147929 +330 231 0.147929 +331 231 0.147929 +332 231 0.147929 +333 231 0.065746 +337 231 0.147929 +338 231 0.147929 +339 231 0.147929 +340 231 0.065746 +341 231 0.147929 +342 231 0.147929 +361 231 -14.938298 +362 231 -3.062172 +377 231 -4.452715 +386 231 -21.351890 +402 231 -12.186154 +406 231 -18.694558 +411 231 -21.809813 +427 231 -12.208399 +431 231 -25.064596 +436 231 -22.313417 +452 231 -12.239741 +456 231 -29.814102 +460 231 -29.789474 +461 231 -8.980484 +477 231 -12.280167 +480 231 -10.185618 +481 231 -26.988463 +483 231 -0.282846 +485 231 -47.026598 +232 232 3.915352 +320 232 0.591716 +321 232 0.147929 +322 232 0.147929 +324 232 0.147929 +326 232 0.065746 +328 232 0.065746 +330 232 0.147929 +331 232 0.147929 +332 232 0.147929 +334 232 0.065746 +337 232 0.591716 +338 232 0.591716 +339 232 0.147929 +341 232 0.591716 +342 232 0.065746 +361 232 -14.940585 +362 232 -3.060816 +386 232 -21.353175 +411 232 -21.811326 +436 232 -22.315170 +460 232 -20.990759 +461 232 -8.945715 +483 232 -0.282869 +485 232 -33.941329 +233 233 2.583991 +319 233 0.147929 +320 233 0.591716 +324 233 0.591716 +326 233 0.065746 +329 233 0.065746 +332 233 0.147929 +333 233 0.065746 +337 233 0.147929 +338 233 0.147929 +339 233 0.147929 +341 233 0.147929 +342 233 0.065746 +377 233 -4.451023 +402 233 -12.173922 +406 233 -18.587043 +427 233 -12.185026 +431 233 -24.891736 +452 233 -12.205232 +456 233 -25.156019 +477 233 -12.234532 +481 233 -25.450414 +234 234 4.013971 +319 234 0.147929 +321 234 0.147929 +322 234 0.147929 +325 234 0.591716 +326 234 0.147929 +327 234 0.147929 +332 234 0.591716 +335 234 0.591716 +337 234 0.591716 +338 234 0.591716 +340 234 0.065746 +361 234 -8.758491 +362 234 -8.366201 +386 234 -20.084449 +406 234 -18.368674 +411 234 -20.265845 +431 234 -24.267542 +436 234 -20.480807 +444 234 -124.725118 +456 234 -11.317790 +457 234 -17.177802 +461 234 -20.730297 +469 234 -26.789011 +470 234 -142.483421 +481 234 -11.066680 +482 234 -24.058295 +486 234 -21.015426 +495 234 -51.335606 +496 234 -114.184482 +235 235 8.665516 +319 235 0.147929 +320 235 0.591716 +321 235 0.065746 +322 235 0.591716 +323 235 0.591716 +324 235 0.591716 +326 235 0.591716 +327 235 0.591716 +328 235 0.147929 +330 235 0.591716 +332 235 0.591716 +333 235 0.591716 +334 235 0.147929 +337 235 0.591716 +338 235 0.591716 +339 235 0.147929 +340 235 0.065746 +341 235 0.591716 +342 235 0.591716 +361 235 -6.525440 +362 235 -1.430661 +377 235 -40.066280 +386 235 -9.428689 +402 235 -109.628086 +406 235 -18.638524 +411 235 -9.621270 +427 235 -109.791658 +431 235 -24.974913 +436 235 -9.833531 +452 235 -110.037112 +456 235 -29.690353 +460 235 -20.114195 +461 235 -5.728073 +477 235 -110.364338 +480 235 -9.799697 +481 235 -27.201196 +485 235 -33.666638 +236 236 1.712853 +320 236 0.147929 +323 236 0.065746 +337 236 0.591716 +338 236 0.591716 +341 236 0.065746 +237 237 1.236193 +321 237 0.147929 +322 237 0.065746 +324 237 0.147929 +325 237 0.065746 +327 237 0.065746 +329 237 0.065746 +333 237 0.065746 +337 237 0.065746 +341 237 0.147929 +342 237 0.147929 +360 237 -8.218552 +361 237 -35.723726 +362 237 -1.042194 +377 237 -10.173730 +378 237 -7.663248 +384 237 -32.019071 +385 237 -27.243414 +403 237 -7.435919 +404 237 -15.126351 +405 237 -15.157385 +406 237 -6.023210 +407 237 -29.589403 +408 237 -35.055885 +409 237 -3.223111 +422 237 -0.775205 +423 237 -14.658555 +424 237 -14.659911 +425 237 -14.661441 +426 237 -14.663170 +427 237 -14.665122 +428 237 -14.667330 +429 237 -14.669830 +430 237 -14.672670 +431 237 -107.029130 +432 237 -44.640496 +444 237 -11.599144 +445 237 -14.655370 +446 237 -14.656299 +447 237 -13.882151 +455 237 -23.443598 +456 237 -45.656960 +457 237 -58.853086 +458 237 -15.726848 +479 237 -14.683324 +480 237 -31.622710 +481 237 -24.878485 +482 237 -33.252302 +483 237 -33.531038 +484 237 -4.876676 +238 238 2.600427 +319 238 0.147929 +320 238 0.147929 +322 238 0.147929 +323 238 0.147929 +324 238 0.591716 +328 238 0.065746 +330 238 0.147929 +333 238 0.147929 +335 238 0.147929 +337 238 0.147929 +338 238 0.147929 +339 238 0.147929 +341 238 0.147929 +342 238 0.065746 +377 238 -10.232123 +402 238 -28.137206 +406 238 -19.622551 +426 238 -16.936314 +427 238 -11.448622 +431 238 -26.492785 +451 238 -28.653865 +455 238 -2.826354 +456 238 -24.195536 +460 238 -7.584859 +476 238 -28.943731 +480 238 -27.589081 +485 238 -11.319741 +239 239 1.597798 +319 239 0.147929 +320 239 0.065746 +321 239 0.147929 +323 239 0.147929 +325 239 0.147929 +326 239 0.065746 +328 239 0.065746 +329 239 0.065746 +332 239 0.065746 +333 239 0.065746 +335 239 0.065746 +339 239 0.147929 +341 239 0.147929 +362 239 -18.254076 +377 239 -7.258185 +387 239 -20.827958 +402 239 -5.221509 +403 239 -13.948863 +406 239 -8.821424 +407 239 -15.496383 +412 239 -20.405235 +428 239 -4.787048 +429 239 -13.425391 +432 239 -31.115596 +437 239 -20.024960 +444 239 -28.622397 +445 239 -25.373296 +454 239 -5.644504 +455 239 -11.657290 +457 239 -3.500976 +458 239 -26.352228 +460 239 -4.546437 +461 239 -2.590146 +462 239 -17.818981 +463 239 -1.866140 +470 239 -10.871922 +471 239 -36.351001 +472 239 -24.074964 +480 239 -7.814269 +481 239 -8.627802 +483 239 -26.347167 +484 239 -2.330983 +486 239 -10.111648 +488 239 -19.383915 +497 239 -12.397498 +498 239 -36.611598 +499 239 -18.155779 +240 240 5.115220 +320 240 0.147929 +321 240 0.065746 +323 240 0.591716 +324 240 0.147929 +327 240 0.591716 +328 240 0.065746 +329 240 0.591716 +335 240 0.147929 +337 240 0.147929 +339 240 0.591716 +340 240 0.591716 +341 240 0.591716 +342 240 0.591716 +361 240 -7.185802 +362 240 -1.088411 +386 240 -9.864016 +411 240 -10.130376 +435 240 -3.956479 +436 240 -6.464569 +455 240 -6.202927 +456 240 -35.527686 +460 240 -18.162060 +480 240 -108.120171 +485 240 -22.137847 +241 241 2.288133 +319 241 0.147929 +320 241 0.147929 +321 241 0.147929 +322 241 0.147929 +323 241 0.147929 +324 241 0.065746 +325 241 0.147929 +326 241 0.065746 +332 241 0.147929 +333 241 0.147929 +335 241 0.147929 +337 241 0.065746 +339 241 0.147929 +340 241 0.147929 +341 241 0.065746 +342 241 0.147929 +361 241 -22.499515 +362 241 -1.390975 +377 241 -10.014716 +385 241 -5.045863 +386 241 -24.228727 +402 241 -27.388673 +406 241 -21.246049 +410 241 -30.978222 +427 241 -27.410123 +431 241 -28.918505 +434 241 -23.992439 +435 241 -8.851800 +444 241 -33.206706 +445 241 -3.192256 +452 241 -27.452055 +455 241 -34.167593 +456 241 -7.566357 +458 241 -15.423586 +459 241 -19.460642 +470 241 -39.053574 +471 241 -10.019279 +477 241 -27.514452 +480 241 -61.991282 +482 241 -10.202861 +483 241 -26.905704 +496 241 -32.604207 +497 241 -14.962299 +242 242 3.372945 +319 242 0.147929 +320 242 0.065746 +321 242 0.147929 +322 242 0.147929 +323 242 0.591716 +324 242 0.065746 +325 242 0.147929 +326 242 0.147929 +327 242 0.147929 +329 242 0.147929 +332 242 0.147929 +333 242 0.065746 +335 242 0.065746 +336 242 0.147929 +337 242 0.065746 +339 242 0.591716 +340 242 0.065746 +341 242 0.147929 +342 242 0.065746 +361 242 -16.628786 +362 242 -2.275802 +377 242 -4.544371 +386 242 -22.582937 +402 242 -12.495347 +406 242 -19.612373 +411 242 -23.244140 +426 242 -7.178318 +427 242 -5.425332 +431 242 -26.477415 +435 242 -14.987720 +436 242 -8.976748 +444 242 -22.761510 +451 242 -12.721363 +455 242 -3.730084 +456 242 -27.995963 +460 242 -24.747532 +469 242 -31.422513 +476 242 -12.848372 +480 242 -39.822274 +484 242 -2.912622 +485 242 -22.684491 +494 242 -31.384867 +243 243 0.545858 +324 243 0.147929 +341 243 0.147929 +244 244 1.679980 +319 244 0.147929 +320 244 0.147929 +321 244 0.147929 +324 244 0.065746 +325 244 0.147929 +326 244 0.147929 +330 244 0.065746 +332 244 0.147929 +335 244 0.147929 +338 244 0.065746 +339 244 0.065746 +340 244 0.065746 +342 244 0.065746 +361 244 -20.338013 +362 244 -1.557366 +386 244 -26.592184 +406 244 -21.133605 +410 244 -23.059613 +411 244 -4.808321 +431 244 -28.751401 +434 244 -3.475644 +435 244 -25.782664 +444 244 -25.003070 +455 244 -29.213797 +456 244 -5.576772 +459 244 -30.771391 +469 244 -34.262652 +480 244 -44.080175 +483 244 -19.947499 +484 244 -12.467510 +494 244 -3.265720 +495 244 -30.652038 +245 245 1.121137 +319 245 0.065746 +320 245 0.065746 +321 245 0.147929 +330 245 0.591716 +361 245 -20.377238 +362 245 -1.553433 +386 245 -26.639492 +406 245 -9.402967 +410 245 -23.317364 +411 245 -4.605227 +431 245 -12.793641 +434 245 -3.886098 +435 245 -25.434983 +455 245 -11.937226 +456 245 -1.226435 +459 245 -30.843105 +480 245 -13.556306 +483 245 -20.583792 +484 245 -11.912744 +246 246 1.055391 +323 246 0.065746 +325 246 0.147929 +326 246 0.147929 +332 246 0.147929 +335 246 0.147929 +336 246 0.147929 +444 246 -23.029021 +469 246 -31.732979 +494 246 -31.625796 +247 247 1.252630 +319 247 0.147929 +321 247 0.065746 +323 247 0.065746 +325 247 0.147929 +331 247 0.065746 +332 247 0.147929 +335 247 0.065746 +337 247 0.147929 +339 247 0.147929 +361 247 -9.457191 +362 247 -0.654970 +386 247 -12.329888 +406 247 -20.844626 +410 247 -12.880223 +411 247 -0.096891 +431 247 -28.321606 +434 247 -5.724482 +435 247 -7.959424 +444 247 -31.593402 +455 247 -23.262883 +456 247 -5.832040 +458 247 -0.123988 +459 247 -14.330514 +469 247 -5.740521 +470 247 -37.113396 +480 247 -29.916425 +483 247 -15.479420 +495 247 -10.612178 +496 247 -31.261786 +248 248 1.926529 +320 248 0.065746 +321 248 0.147929 +323 248 0.147929 +324 248 0.147929 +325 248 0.065746 +326 248 0.147929 +331 248 0.147929 +335 248 0.065746 +336 248 0.147929 +337 248 0.147929 +338 248 0.147929 +341 248 0.147929 +342 248 0.147929 +361 248 -22.103746 +362 248 -1.415196 +385 248 -3.409779 +386 248 -25.363867 +410 248 -30.395473 +434 248 -20.501223 +435 248 -11.668869 +444 248 -12.407125 +445 248 -15.139286 +458 248 -10.656892 +459 248 -23.451516 +470 248 -0.561949 +471 248 -15.734017 +472 248 -15.771557 +473 248 -3.963092 +482 248 -4.120394 +483 248 -32.594103 +498 248 -11.851336 +499 248 -15.863321 +500 248 -5.778708 +249 249 0.397929 +338 249 0.147929 +250 250 2.666174 +319 250 0.147929 +321 250 0.147929 +325 250 0.147929 +327 250 0.591716 +328 250 0.147929 +329 250 0.147929 +330 250 0.591716 +331 250 0.147929 +332 250 0.065746 +339 250 0.147929 +340 250 0.065746 +342 250 0.065746 +361 250 -14.847766 +362 250 -3.116488 +386 250 -21.301852 +406 250 -18.676164 +411 250 -21.750876 +431 250 -25.035243 +436 250 -22.245068 +444 250 -23.552415 +456 250 -29.773728 +460 250 -28.285474 +461 250 -10.359193 +469 250 -32.389572 +480 250 -10.066405 +481 250 -27.051319 +483 250 -0.282092 +485 250 -46.859966 +494 250 -32.203153 +251 251 1.975838 +319 251 0.065746 +321 251 0.147929 +322 251 0.147929 +324 251 0.147929 +327 251 0.591716 +328 251 0.147929 +329 251 0.147929 +337 251 0.065746 +338 251 0.065746 +339 251 0.065746 +340 251 0.065746 +341 251 0.065746 +355 251 -31.740294 +356 251 -32.997430 +357 251 -33.004162 +358 251 -33.011892 +359 251 -33.020811 +360 251 -33.031161 +361 251 -33.043252 +362 251 -0.960108 +369 251 -150.689183 +370 251 -68.126067 +371 251 -47.587695 +372 251 -47.589762 +373 251 -47.592105 +374 251 -47.245191 +375 251 -32.971093 +376 251 -32.974241 +377 251 -32.977796 +378 251 -32.981816 +379 251 -32.986370 +380 251 -1.251247 +394 251 -288.479340 +395 251 -89.893967 +396 251 -63.291247 +397 251 -47.945210 +398 251 -47.959585 +399 251 -45.847839 +400 251 -47.719094 +401 251 -47.727740 +402 251 -47.737510 +403 251 -38.831762 +404 251 -14.627770 +405 251 -14.628147 +406 251 -11.988084 +419 251 -169.658110 +420 251 -83.317518 +421 251 -57.993145 +422 251 -29.089986 +423 251 -15.812605 +424 251 -3.639379 +425 251 -14.901820 +426 251 -14.914209 +427 251 -14.928234 +428 251 -23.237705 +429 251 -33.133320 +430 251 -33.147178 +431 251 -33.162975 +432 251 -33.181051 +433 251 -33.201827 +434 251 -15.571398 +444 251 -95.527129 +445 251 -92.311585 +446 251 -51.946603 +447 251 -48.910816 +448 251 -20.841932 +449 251 -21.053150 +450 251 -15.917074 +451 251 -1.914922 +453 251 -0.623230 +454 251 -14.962200 +455 251 -14.982785 +456 251 -1.492022 +459 251 -17.654432 +460 251 -28.519850 +469 251 -31.454989 +470 251 -131.175656 +471 251 -37.873822 +472 251 -33.079098 +473 251 -43.483248 +474 251 -18.123949 +475 251 -14.560368 +476 251 -14.065681 +477 251 -15.884693 +494 251 -31.390962 +495 251 -130.112415 +496 251 -9.167953 +497 251 -42.624923 +498 251 -16.725730 +499 251 -39.893546 +500 251 -12.473217 +252 252 3.668803 +319 252 0.147929 +320 252 0.147929 +321 252 0.065746 +322 252 0.065746 +324 252 0.147929 +325 252 0.591716 +326 252 0.147929 +328 252 0.147929 +331 252 0.147929 +332 252 0.147929 +335 252 0.065746 +336 252 0.065746 +337 252 0.147929 +338 252 0.591716 +339 252 0.065746 +340 252 0.065746 +341 252 0.065746 +342 252 0.591716 +361 252 -9.080641 +362 252 -0.688030 +386 252 -11.868874 +406 252 -20.022150 +410 252 -10.520812 +411 252 -1.922853 +431 252 -27.093788 +434 252 -1.977964 +435 252 -11.092251 +444 252 -136.643170 +455 252 -12.857986 +456 252 -19.710776 +459 252 -13.752178 +460 252 -22.247784 +469 252 -2.311271 +470 252 -177.082228 +471 252 -5.340000 +480 252 -41.008288 +483 252 -9.929534 +484 252 -24.158492 +485 252 -14.814235 +496 252 -173.726831 +497 252 -5.998548 +253 253 3.750986 +319 253 0.147929 +321 253 0.147929 +322 253 0.147929 +323 253 0.591716 +324 253 0.591716 +325 253 0.147929 +326 253 0.591716 +327 253 0.147929 +328 253 0.065746 +329 253 0.147929 +331 253 0.065746 +332 253 0.147929 +337 253 0.065746 +338 253 0.065746 +339 253 0.065746 +340 253 0.147929 +341 253 0.065746 +342 253 0.147929 +361 253 -12.828356 +362 253 -4.604485 +386 253 -20.552340 +406 253 -18.371361 +411 253 -20.854549 +431 253 -24.529151 +436 253 -21.194582 +444 253 -23.675888 +456 253 -34.503372 +460 253 -6.737413 +461 253 -21.573989 +469 253 -32.547179 +480 253 -14.072997 +481 253 -36.026362 +483 253 -0.120240 +485 253 -13.408485 +486 253 -18.503492 +494 253 -32.345192 +254 254 3.997535 +320 254 0.147929 +321 254 0.147929 +322 254 0.065746 +323 254 0.591716 +324 254 0.147929 +326 254 0.147929 +327 254 0.065746 +328 254 0.147929 +330 254 0.147929 +331 254 0.065746 +332 254 0.147929 +335 254 0.591716 +336 254 0.591716 +341 254 0.591716 +342 254 0.147929 +362 254 -17.182336 +387 254 -19.850813 +412 254 -19.708437 +437 254 -19.598084 +460 254 -14.723361 +462 254 -19.519242 +483 254 -0.128650 +485 254 -6.265401 +486 254 -14.861728 +487 254 -19.471548 +255 255 0.693787 +321 255 0.147929 +328 255 0.147929 +342 255 0.147929 +361 255 -16.119020 +362 255 -2.469046 +386 255 -22.154837 +411 255 -22.747822 +435 255 -8.231816 +436 255 -15.163256 +460 255 -40.765255 +485 255 -49.677418 +256 256 1.285503 +320 256 0.065746 +321 256 0.065746 +322 256 0.065746 +323 256 0.065746 +324 256 0.147929 +325 256 0.065746 +329 256 0.065746 +332 256 0.147929 +337 256 0.065746 +338 256 0.147929 +341 256 0.065746 +342 256 0.065746 +360 256 -2.371717 +361 256 -16.040947 +362 256 -0.468246 +384 256 -11.145665 +385 256 -13.535851 +407 256 -7.677250 +408 256 -15.701435 +409 256 -4.650220 +424 256 -11.228781 +425 256 -14.642663 +426 256 -14.643581 +427 256 -14.644618 +428 256 -14.645790 +429 256 -14.647118 +430 256 -14.648625 +431 256 -104.776668 +432 256 -8.259327 +444 256 -11.586805 +445 256 -14.639436 +446 256 -14.639930 +447 256 -14.640492 +448 256 -14.641129 +449 256 -3.413068 +455 256 -23.975891 +456 256 -109.793507 +457 256 -39.815235 +479 256 -15.874843 +480 256 -17.020968 +481 256 -34.959214 +482 256 -91.449174 +483 256 -12.949253 +257 257 6.660256 +319 257 0.147929 +320 257 0.591716 +321 257 0.065746 +322 257 0.591716 +323 257 0.591716 +324 257 0.591716 +325 257 0.147929 +326 257 0.147929 +328 257 0.065746 +329 257 0.591716 +331 257 0.591716 +332 257 0.147929 +337 257 0.591716 +338 257 0.591716 +339 257 0.147929 +340 257 0.065746 +341 257 0.591716 +342 257 0.147929 +361 257 -6.506019 +362 257 -1.442988 +386 257 -9.418843 +406 257 -18.622248 +411 257 -9.609632 +431 257 -24.948705 +436 257 -9.820003 +444 257 -23.599609 +456 257 -29.653846 +460 257 -11.027653 +461 257 -6.025260 +469 257 -32.449738 +480 257 -9.670315 +481 257 -27.279047 +483 257 -1.121172 +485 257 -20.663539 +494 257 -32.257283 +258 258 2.041584 +319 258 0.147929 +320 258 0.065746 +321 258 0.147929 +322 258 0.147929 +323 258 0.065746 +324 258 0.147929 +325 258 0.065746 +327 258 0.147929 +328 258 0.147929 +329 258 0.065746 +332 258 0.065746 +337 258 0.147929 +338 258 0.147929 +339 258 0.147929 +340 258 0.065746 +342 258 0.065746 +361 258 -6.460086 +362 258 -10.611405 +386 258 -19.994884 +406 258 -18.223978 +411 258 -20.145962 +431 258 -24.190201 +436 258 -20.329826 +444 258 -11.033644 +456 258 -28.503358 +460 258 -14.626479 +461 258 -20.547298 +469 258 -15.125385 +481 258 -35.245466 +485 258 -21.387812 +486 258 -20.799345 +494 258 -2.657070 +495 258 -12.322878 +259 259 1.449869 +319 259 0.065746 +320 259 0.065746 +321 259 0.147929 +322 259 0.065746 +323 259 0.147929 +327 259 0.147929 +328 259 0.147929 +329 259 0.065746 +337 259 0.065746 +338 259 0.065746 +339 259 0.147929 +341 259 0.065746 +361 259 -6.300585 +362 259 -10.768313 +386 259 -19.990352 +406 259 -8.099752 +411 259 -20.139774 +431 259 -10.750686 +436 259 -20.321943 +456 259 -10.754937 +460 259 -14.622006 +461 259 -20.537673 +481 259 -10.771234 +485 259 -21.379641 +486 259 -20.787924 +260 260 0.397929 +326 260 0.147929 +261 261 3.471565 +319 261 0.065746 +320 261 0.591716 +321 261 0.591716 +322 261 0.065746 +323 261 0.147929 +327 261 0.065746 +328 261 0.147929 +329 261 0.065746 +337 261 0.147929 +338 261 0.591716 +339 261 0.591716 +341 261 0.147929 +361 261 -45.316380 +362 261 -23.717758 +386 261 -81.176664 +406 261 -8.124182 +411 261 -82.140074 +431 261 -10.825392 +436 261 -83.245241 +456 261 -10.878034 +460 261 -14.917712 +461 261 -84.497151 +481 261 -10.942991 +485 261 -21.901992 +486 261 -85.901412 +262 262 3.159270 +319 262 0.065746 +321 262 0.591716 +322 262 0.147929 +323 262 0.065746 +324 262 0.591716 +325 262 0.147929 +326 262 0.147929 +327 262 0.147929 +328 262 0.065746 +329 262 0.065746 +332 262 0.591716 +339 262 0.147929 +340 262 0.065746 +341 262 0.065746 +362 262 -70.302862 +387 262 -80.750291 +406 262 -3.496322 +407 262 -8.637194 +412 262 -79.673921 +432 262 -11.035207 +433 262 -4.335844 +437 262 -78.739611 +444 262 -26.956371 +445 262 -34.084176 +446 262 -24.489465 +456 262 -7.929980 +458 262 -14.580496 +460 262 -4.429956 +461 262 -2.755236 +462 262 -77.942812 +471 262 -9.628763 +472 262 -34.157086 +473 262 -34.201285 +474 262 -30.675241 +481 262 -7.742676 +482 262 -11.546698 +483 262 -1.360179 +484 262 -12.489367 +486 262 -10.172622 +487 262 -77.279634 +499 262 -3.576222 +500 262 -34.308385 +263 263 2.173077 +319 263 0.147929 +320 263 0.147929 +321 263 0.065746 +322 263 0.065746 +323 263 0.147929 +325 263 0.065746 +326 263 0.065746 +327 263 0.065746 +328 263 0.065746 +329 263 0.147929 +331 263 0.147929 +332 263 0.147929 +337 263 0.147929 +338 263 0.147929 +339 263 0.065746 +340 263 0.065746 +341 263 0.147929 +342 263 0.065746 +361 263 -6.204815 +362 263 -1.649314 +386 263 -9.286145 +406 263 -18.511853 +411 263 -9.451917 +431 263 -24.768515 +436 263 -9.635953 +444 263 -10.461289 +456 263 -29.402662 +460 263 -6.878698 +461 263 -9.839106 +469 263 -14.387150 +480 263 -8.643612 +481 263 -27.952242 +483 263 -0.275844 +485 263 -19.445449 +486 263 -0.771763 +494 263 -14.305133 +264 264 2.058021 +319 264 0.147929 +320 264 0.147929 +323 264 0.065746 +324 264 0.147929 +325 264 0.147929 +327 264 0.147929 +331 264 0.065746 +332 264 0.147929 +335 264 0.147929 +336 264 0.147929 +337 264 0.065746 +338 264 0.065746 +340 264 0.147929 +341 264 0.065746 +342 264 0.147929 +406 264 -19.994049 +431 264 -27.051654 +444 264 -29.425887 +445 264 -18.819621 +455 264 -14.509953 +456 264 -24.099074 +470 264 -18.471391 +471 264 -37.436227 +472 264 -8.228815 +480 264 -56.792581 +483 264 -0.209114 +497 264 -29.374675 +498 264 -31.613784 +265 265 6.742439 +319 265 0.147929 +320 265 0.065746 +321 265 0.147929 +322 265 0.591716 +323 265 0.591716 +324 265 0.147929 +325 265 0.147929 +327 265 0.591716 +328 265 0.065746 +331 265 0.147929 +332 265 0.147929 +335 265 0.147929 +337 265 0.591716 +338 265 0.591716 +339 265 0.591716 +340 265 0.591716 +341 265 0.591716 +342 265 0.591716 +361 265 -15.671613 +362 265 -2.668787 +386 265 -21.818070 +406 265 -19.067681 +411 265 -22.355860 +431 265 -25.647756 +435 265 -1.929382 +436 265 -21.014847 +444 265 -22.979141 +455 265 -1.216507 +456 265 -65.889938 +460 265 -30.852557 +469 265 -31.672327 +480 265 -117.806802 +481 265 -14.886915 +483 265 -0.291790 +485 265 -35.081151 +494 265 -31.574916 +266 266 7.416338 +319 266 0.147929 +320 266 0.591716 +321 266 0.147929 +322 266 0.591716 +323 266 0.147929 +324 266 0.147929 +325 266 0.591716 +327 266 0.591716 +328 266 0.065746 +329 266 0.591716 +331 266 0.591716 +332 266 0.591716 +337 266 0.591716 +338 266 0.591716 +341 266 0.591716 +342 266 0.591716 +361 266 -14.216848 +362 266 -3.528355 +386 266 -20.997027 +406 266 -18.529734 +411 266 -21.389930 +431 266 -24.798038 +436 266 -21.824941 +444 266 -94.778176 +456 266 -25.041876 +460 266 -9.223135 +461 266 -20.001064 +469 266 -130.284174 +481 266 -25.315390 +483 266 -1.108464 +485 266 -33.053539 +494 266 -129.467054 +267 267 3.307199 +319 267 0.147929 +320 267 0.147929 +321 267 0.147929 +322 267 0.065746 +323 267 0.591716 +324 267 0.065746 +325 267 0.065746 +327 267 0.591716 +328 267 0.147929 +329 267 0.147929 +331 267 0.147929 +335 267 0.065746 +337 267 0.147929 +338 267 0.147929 +339 267 0.147929 +340 267 0.147929 +341 267 0.065746 +342 267 0.065746 +361 267 -16.063149 +362 267 -2.492388 +386 267 -22.110710 +406 267 -19.291731 +411 267 -22.696552 +431 267 -25.991038 +435 267 -7.462954 +436 267 -15.873216 +444 267 -10.149880 +455 267 -1.422958 +456 267 -35.436285 +460 267 -40.658584 +469 267 -14.002131 +480 267 -47.454010 +481 267 -6.457090 +483 267 -0.297161 +485 267 -49.536550 +494 267 -13.973775 +268 268 2.863412 +319 268 0.147929 +320 268 0.147929 +321 268 0.065746 +322 268 0.147929 +323 268 0.065746 +324 268 0.065746 +325 268 0.147929 +326 268 0.147929 +327 268 0.147929 +329 268 0.591716 +332 268 0.147929 +335 268 0.065746 +336 268 0.147929 +337 268 0.147929 +338 268 0.065746 +339 268 0.147929 +340 268 0.065746 +341 268 0.147929 +346 268 -21.644266 +347 268 -503.505592 +348 268 -104.139686 +349 268 -52.241573 +350 268 -48.024509 +351 268 -38.975399 +352 268 -14.621303 +353 268 -14.621304 +354 268 -14.621305 +355 268 -14.621305 +356 268 -14.621306 +357 268 -14.621307 +358 268 -14.621308 +359 268 -14.621309 +360 268 -14.621311 +361 268 -14.621313 +362 268 -0.424749 +370 268 -5.184834 +371 268 -33.198576 +372 268 -323.163421 +373 268 -143.916151 +374 268 -78.624139 +375 268 -15.784458 +376 268 -15.583011 +377 268 -33.450490 +378 268 -33.478929 +379 268 -33.511219 +380 268 -30.929773 +395 268 -39.119927 +396 268 -12.719789 +397 268 -124.397016 +398 268 -234.878441 +399 268 -63.032502 +400 268 -77.314441 +401 268 -20.189071 +402 268 -15.904993 +403 268 -5.705533 +405 268 -2.618208 +406 268 -27.523618 +419 268 -30.546915 +420 268 -9.290342 +421 268 -30.552973 +422 268 -60.580129 +423 268 -215.097633 +424 268 -77.544901 +425 268 -36.854219 +426 268 -69.781336 +427 268 -21.980013 +428 268 -10.273050 +429 268 -16.063157 +430 268 -1.864978 +444 268 -11.138219 +446 268 -30.659402 +447 268 -45.984819 +448 268 -180.942478 +449 268 -89.431488 +450 268 -36.389134 +451 268 -27.475803 +452 268 -59.621362 +453 268 -31.376740 +455 268 -14.295820 +456 268 -1.613915 +471 268 -30.776261 +472 268 -30.014863 +473 268 -91.722725 +474 268 -152.763400 +475 268 -60.912201 +476 268 -20.900137 +477 268 -18.459623 +478 268 -51.352768 +479 268 -34.853875 +496 268 -30.903204 +497 268 -26.890160 +498 268 -40.210303 +499 268 -174.846976 +500 268 -61.839990 +269 269 2.551118 +319 269 0.147929 +320 269 0.147929 +321 269 0.147929 +322 269 0.065746 +323 269 0.065746 +324 269 0.065746 +325 269 0.147929 +326 269 0.147929 +327 269 0.065746 +328 269 0.147929 +329 269 0.147929 +332 269 0.147929 +335 269 0.065746 +336 269 0.147929 +337 269 0.147929 +338 269 0.065746 +339 269 0.147929 +340 269 0.065746 +341 269 0.065746 +342 269 0.147929 +346 269 -14.642524 +347 269 -394.775476 +348 269 -157.304509 +349 269 -100.287895 +350 269 -84.942951 +351 269 -43.667779 +352 269 -32.898420 +353 269 -32.898445 +354 269 -32.898474 +355 269 -32.898507 +356 269 -32.898545 +357 269 -32.898588 +358 269 -32.898637 +359 269 -32.898694 +360 269 -32.898760 +361 269 -32.898837 +362 269 -0.955712 +370 269 -0.637631 +371 269 -38.402329 +372 269 -184.876022 +373 269 -168.649330 +374 269 -105.976971 +375 269 -30.607666 +376 269 -60.210690 +377 269 -67.035944 +378 269 -67.100063 +379 269 -46.692806 +380 269 -28.706800 +395 269 -39.833008 +397 269 -81.875539 +398 269 -147.516590 +399 269 -72.594748 +400 269 -109.202168 +401 269 -32.070734 +402 269 -15.836238 +403 269 -4.270030 +404 269 -20.480093 +405 269 -38.549071 +406 269 -61.300335 +407 269 -18.931630 +419 269 -29.118527 +420 269 -11.485343 +421 269 -13.295850 +422 269 -44.061159 +423 269 -107.061582 +424 269 -74.943001 +425 269 -40.033927 +426 269 -96.080792 +427 269 -43.331491 +428 269 -11.635372 +429 269 -15.984823 +430 269 -1.365822 +432 269 -14.982110 +433 269 -33.990962 +434 269 -34.080659 +435 269 -5.204100 +444 269 -11.359115 +446 269 -13.626012 +447 269 -26.710695 +448 269 -82.511903 +449 269 -82.240297 +450 269 -36.669012 +451 269 -27.321293 +452 269 -77.208159 +453 269 -60.176875 +455 269 -14.710604 +456 269 -1.605150 +460 269 -24.109787 +471 269 -13.679620 +472 269 -13.334917 +473 269 -65.607098 +474 269 -71.186204 +475 269 -61.579545 +476 269 -21.043155 +477 269 -15.659078 +478 269 -61.886120 +479 269 -69.651792 +480 269 -0.948834 +496 269 -13.737725 +497 269 -9.524906 +498 269 -41.041342 +499 269 -67.862442 +500 269 -59.994051 +270 270 1.154011 +319 270 0.065746 +320 270 0.065746 +321 270 0.147929 +322 270 0.065746 +324 270 0.065746 +327 270 0.065746 +328 270 0.065746 +329 270 0.147929 +338 270 0.065746 +341 270 0.147929 +347 270 -175.197476 +348 270 -62.620339 +349 270 -62.638190 +350 270 -57.934315 +351 270 -39.657769 +352 270 -32.898011 +353 270 -32.898016 +354 270 -32.898022 +355 270 -32.898028 +356 270 -32.898036 +357 270 -32.898045 +358 270 -32.898055 +359 270 -32.898066 +360 270 -32.898079 +361 270 -32.898095 +362 270 -0.955690 +371 270 -2.124525 +372 270 -102.864523 +373 270 -42.377369 +375 270 -4.724072 +376 270 -23.023463 +377 270 -29.809083 +378 270 -29.838393 +379 270 -21.875156 +380 270 -13.079281 +396 270 -13.542107 +397 270 -35.167764 +398 270 -62.606192 +399 270 -33.609564 +404 270 -7.996535 +405 270 -16.830345 +406 270 -27.261777 +407 270 -8.941742 +421 270 -13.582325 +422 270 -13.455590 +423 270 -69.214644 +424 270 -17.165304 +425 270 -29.107423 +432 270 -6.139308 +433 270 -15.116031 +434 270 -15.156669 +435 270 -2.417457 +446 270 -13.627279 +447 270 -13.406534 +448 270 -53.552177 +449 270 -24.693723 +450 270 -12.316914 +451 270 -22.586090 +460 270 -10.619985 +471 270 -13.676840 +472 270 -13.362921 +473 270 -14.705420 +474 270 -50.879146 +475 270 -11.602055 +476 270 -19.766796 +477 270 -13.919152 +496 270 -13.730860 +497 270 -13.324858 +499 270 -61.727969 +500 270 -14.436067 +271 271 7.334155 +319 271 0.147929 +320 271 0.065746 +321 271 0.065746 +322 271 0.591716 +323 271 0.591716 +324 271 0.147929 +325 271 0.591716 +326 271 0.591716 +327 271 0.147929 +328 271 0.147929 +329 271 0.591716 +331 271 0.591716 +332 271 0.591716 +337 271 0.591716 +338 271 0.147929 +339 271 0.591716 +340 271 0.147929 +341 271 0.591716 +342 271 0.147929 +361 271 -5.930967 +362 271 -1.858547 +386 271 -9.194349 +406 271 -18.413037 +411 271 -9.341567 +431 271 -24.601926 +436 271 -9.506163 +444 271 -94.859309 +456 271 -34.623941 +460 271 -15.282600 +461 271 -9.688892 +469 271 -130.388016 +480 271 -16.103067 +481 271 -34.194756 +483 271 -1.089789 +485 271 -27.469368 +486 271 -4.943849 +494 271 -129.560987 +272 272 6.232906 +319 272 0.147929 +320 272 0.591716 +321 272 0.065746 +322 272 0.591716 +323 272 0.591716 +324 272 0.591716 +326 272 0.147929 +327 272 0.147929 +328 272 0.147929 +329 272 0.147929 +331 272 0.591716 +332 272 0.147929 +337 272 0.147929 +338 272 0.591716 +339 272 0.591716 +341 272 0.591716 +342 272 0.147929 +361 272 -5.919850 +362 272 -1.867410 +386 272 -9.191119 +406 272 -18.410703 +411 272 -9.337660 +431 272 -24.597900 +436 272 -9.501548 +456 272 -24.792970 +460 272 -15.275931 +461 272 -9.683535 +481 272 -25.016801 +483 272 -1.089373 +485 272 -27.288152 +486 272 -5.107704 +273 273 4.211210 +319 273 0.065746 +320 273 0.591716 +322 273 0.147929 +323 273 0.147929 +324 273 0.147929 +325 273 0.065746 +326 273 0.591716 +327 273 0.065746 +329 273 0.147929 +331 273 0.147929 +332 273 0.591716 +335 273 0.147929 +337 273 0.147929 +338 273 0.147929 +339 273 0.147929 +340 273 0.065746 +342 273 0.591716 +406 273 -8.377635 +431 273 -11.248636 +444 273 -10.271509 +456 273 -15.899579 +469 273 -14.148300 +480 273 -11.076118 +481 273 -12.110663 +483 273 -0.285704 +494 273 -14.094121 +274 274 3.685240 +319 274 0.147929 +320 274 0.147929 +321 274 0.147929 +322 274 0.147929 +324 274 0.065746 +325 274 0.591716 +326 274 0.147929 +327 274 0.065746 +328 274 0.591716 +329 274 0.065746 +331 274 0.147929 +332 274 0.147929 +334 274 0.147929 +335 274 0.147929 +336 274 0.065746 +337 274 0.147929 +339 274 0.147929 +340 274 0.147929 +341 274 0.147929 +342 274 0.065746 +346 274 -82.400919 +347 274 -606.579193 +348 274 -338.914351 +349 274 -241.588712 +350 274 -201.017777 +351 274 -105.933614 +352 274 -32.898321 +353 274 -32.898342 +354 274 -32.898365 +355 274 -32.898392 +356 274 -32.898422 +357 274 -32.898457 +358 274 -32.898496 +359 274 -32.898542 +360 274 -32.898595 +361 274 -32.898657 +362 274 -0.955707 +370 274 -18.036465 +371 274 -135.872251 +372 274 -178.463280 +373 274 -143.663269 +374 274 -121.958169 +375 274 -79.106603 +376 274 -148.377902 +377 274 -168.463052 +378 274 -168.670019 +379 274 -145.603045 +380 274 -32.305181 +395 274 -156.886875 +397 274 -92.423583 +398 274 -156.195102 +399 274 -46.608843 +400 274 -88.884698 +401 274 -46.180060 +402 274 -71.302666 +403 274 -51.074955 +404 274 -23.303126 +405 274 -136.868391 +406 274 -163.402632 +407 274 -103.855117 +419 274 -121.327779 +420 274 -38.458817 +421 274 -26.905108 +422 274 -60.704181 +423 274 -94.249252 +424 274 -86.015515 +425 274 -17.288943 +426 274 -69.898656 +427 274 -47.376742 +428 274 -20.541886 +429 274 -71.976844 +430 274 -34.891840 +432 274 -32.273296 +433 274 -136.475253 +434 274 -136.878476 +435 274 -26.418077 +444 274 -44.678937 +446 274 -30.658376 +447 274 -43.633693 +448 274 -65.115739 +449 274 -84.692859 +450 274 -45.100095 +451 274 -12.500929 +452 274 -51.949607 +453 274 -56.376405 +454 274 -2.751777 +455 274 -37.502223 +456 274 -39.722955 +457 274 -16.801658 +460 274 -91.355649 +471 274 -30.779911 +472 274 -43.588355 +473 274 -32.810327 +474 274 -82.820765 +475 274 -60.140597 +476 274 -21.216713 +477 274 -7.015387 +478 274 -44.292513 +479 274 -56.063319 +480 274 -4.777030 +482 274 -19.520487 +483 274 -33.084600 +496 274 -30.911571 +497 274 -32.480346 +498 274 -24.421197 +499 274 -74.654632 +500 274 -60.579567 +275 275 1.910092 +319 275 0.065746 +320 275 0.065746 +321 275 0.147929 +322 275 0.147929 +324 275 0.147929 +325 275 0.147929 +328 275 0.147929 +331 275 0.147929 +335 275 0.147929 +337 275 0.065746 +338 275 0.147929 +339 275 0.065746 +340 275 0.147929 +342 275 0.065746 +361 275 -19.113197 +362 275 -1.705990 +386 275 -25.150959 +406 275 -8.857600 +410 275 -14.395244 +411 275 -11.810027 +431 275 -11.979979 +435 275 -27.352130 +444 275 -27.406111 +455 275 -7.723220 +456 275 -15.374146 +459 275 -18.237990 +460 275 -30.348597 +469 275 -19.036504 +470 275 -18.360266 +480 275 -40.740009 +483 275 -0.351667 +484 275 -39.618031 +485 275 -20.602288 +495 275 -36.823929 +276 276 1.729290 +322 276 0.591716 +323 276 0.591716 +327 276 0.147929 +341 276 0.147929 +277 277 2.123767 +319 277 0.065746 +320 277 0.065746 +321 277 0.147929 +322 277 0.065746 +323 277 0.147929 +324 277 0.147929 +325 277 0.147929 +326 277 0.147929 +327 277 0.065746 +328 277 0.065746 +329 277 0.147929 +332 277 0.147929 +334 277 0.065746 +336 277 0.147929 +341 277 0.147929 +342 277 0.147929 +361 277 -14.007868 +362 277 -3.676791 +386 277 -20.911962 +406 277 -7.710082 +407 277 -0.878983 +411 277 -21.288490 +432 277 -11.240431 +436 277 -21.706288 +444 277 -27.889460 +445 277 -34.479223 +457 277 -11.065363 +460 277 -6.775376 +461 277 -22.167296 +470 277 -0.814079 +471 277 -35.365904 +472 277 -35.449035 +473 277 -9.911027 +482 277 -10.905614 +485 277 -31.656003 +486 277 -0.999234 +498 277 -25.632933 +499 277 -35.652207 +500 277 -14.463080 +278 278 6.315089 +319 278 0.147929 +320 278 0.591716 +322 278 0.591716 +323 278 0.147929 +324 278 0.591716 +326 278 0.591716 +327 278 0.147929 +328 278 0.147929 +329 278 0.147929 +331 278 0.591716 +332 278 0.591716 +334 278 0.147929 +337 278 0.591716 +339 278 0.591716 +340 278 0.147929 +341 278 0.147929 +342 278 0.147929 +406 278 -18.629187 +431 278 -24.959887 +456 278 -35.207846 +460 278 -15.778111 +480 278 -21.872635 +481 278 -29.377611 +483 278 -1.122589 +485 278 -23.349307 +279 279 1.844346 +319 279 0.147929 +321 279 0.147929 +323 279 0.147929 +325 279 0.147929 +328 279 0.147929 +331 279 0.147929 +332 279 0.147929 +334 279 0.147929 +336 279 0.065746 +337 279 0.147929 +339 279 0.065746 +341 279 0.065746 +342 279 0.065746 +361 279 -25.711040 +362 279 -1.253923 +385 279 -16.679327 +386 279 -16.771078 +406 279 -25.622690 +409 279 -11.199553 +410 279 -24.675844 +430 279 -22.522584 +431 279 -12.900746 +433 279 -9.296965 +434 279 -29.258311 +444 279 -25.422050 +454 279 -13.877381 +455 279 -23.229338 +457 279 -11.075130 +458 279 -30.432340 +460 279 -30.551856 +469 279 -32.662933 +470 279 -2.145051 +478 279 -8.144640 +479 279 -30.741836 +481 279 -16.691392 +482 279 -28.053263 +483 279 -10.116187 +484 279 -37.062875 +485 279 -1.572407 +495 279 -34.422210 +280 280 2.962032 +320 280 0.065746 +321 280 0.147929 +322 280 0.147929 +323 280 0.591716 +324 280 0.147929 +325 280 0.147929 +326 280 0.147929 +327 280 0.147929 +329 280 0.065746 +337 280 0.147929 +338 280 0.147929 +339 280 0.147929 +341 280 0.591716 +342 280 0.065746 +361 280 -8.297826 +362 280 -8.813166 +386 280 -20.061898 +411 280 -20.236040 +436 280 -20.443550 +444 280 -24.608831 +461 280 -20.685357 +469 280 -33.750588 +486 280 -20.962536 +494 280 -9.761564 +495 280 -23.683772 +281 281 3.027778 +319 281 0.147929 +320 281 0.065746 +321 281 0.147929 +322 281 0.591716 +324 281 0.147929 +326 281 0.147929 +327 281 0.065746 +328 281 0.147929 +331 281 0.591716 +332 281 0.147929 +334 281 0.065746 +337 281 0.147929 +338 281 0.147929 +339 281 0.147929 +342 281 0.065746 +361 281 -26.654078 +362 281 -1.226923 +385 281 -19.726869 +386 281 -14.979293 +406 281 -22.944307 +409 281 -16.455308 +410 281 -20.907413 +430 281 -9.972680 +431 281 -21.466286 +433 281 -16.928560 +434 281 -23.377913 +455 281 -32.606126 +457 281 -21.305887 +458 281 -22.250668 +459 281 -7.167887 +460 281 -30.643527 +479 281 -24.550334 +480 281 -9.290604 +481 281 -29.794000 +482 281 -17.331545 +483 281 -36.026780 +484 281 -28.332251 +282 282 5.082347 +319 282 0.147929 +320 282 0.065746 +321 282 0.147929 +322 282 0.065746 +323 282 0.591716 +324 282 0.591716 +325 282 0.065746 +327 282 0.591716 +328 282 0.147929 +329 282 0.065746 +331 282 0.065746 +332 282 0.147929 +335 282 0.591716 +337 282 0.147929 +338 282 0.591716 +339 282 0.147929 +341 282 0.591716 +342 282 0.065746 +361 282 -15.723082 +362 282 -2.644290 +386 282 -21.854844 +406 282 -19.098370 +411 282 -22.398744 +431 282 -25.694999 +435 282 -2.670578 +436 282 -20.323042 +444 282 -10.200322 +456 282 -26.104429 +460 282 -40.026821 +469 282 -14.061370 +480 282 -12.959816 +481 282 -13.588046 +483 282 -0.129995 +485 282 -48.698200 +494 282 -14.020708 +283 283 2.879849 +319 283 0.065746 +320 283 0.147929 +321 283 0.147929 +325 283 0.147929 +326 283 0.147929 +328 283 0.065746 +331 283 0.065746 +332 283 0.147929 +335 283 0.065746 +336 283 0.147929 +337 283 0.591716 +338 283 0.591716 +341 283 0.147929 +342 283 0.147929 +361 283 -21.645950 +362 283 -1.446182 +385 283 -1.436455 +386 283 -26.762595 +406 283 -9.845316 +410 283 -29.728180 +430 283 -2.252883 +431 283 -11.197473 +434 283 -16.335106 +435 283 -15.064376 +444 283 -24.878345 +455 283 -13.903231 +458 283 -4.978867 +459 283 -28.244228 +460 283 -10.416139 +469 283 -34.100517 +479 283 -6.181867 +480 283 -8.200898 +483 283 -35.396999 +484 283 -10.488068 +485 283 -5.513894 +494 283 -5.141353 +495 283 -28.626662 +284 284 5.772682 +319 284 0.147929 +320 284 0.591716 +321 284 0.065746 +322 284 0.147929 +323 284 0.591716 +324 284 0.591716 +325 284 0.065746 +326 284 0.147929 +327 284 0.147929 +328 284 0.147929 +329 284 0.591716 +331 284 0.147929 +332 284 0.147929 +334 284 0.065746 +335 284 0.147929 +337 284 0.147929 +338 284 0.147929 +339 284 0.591716 +340 284 0.147929 +341 284 0.591716 +342 284 0.147929 +361 284 -7.074984 +362 284 -1.135475 +386 284 -9.777483 +406 284 -19.187190 +411 284 -10.029795 +431 284 -25.831305 +435 284 -2.422491 +436 284 -7.882970 +444 284 -10.186085 +455 284 -0.941084 +456 284 -35.664405 +460 284 -27.126943 +469 284 -14.044361 +480 284 -43.397822 +481 284 -10.106803 +483 284 -0.294978 +485 284 -35.507238 +494 284 -14.006839 +285 285 8.090237 +319 285 0.147929 +322 285 0.591716 +323 285 0.591716 +324 285 0.591716 +325 285 0.147929 +326 285 0.591716 +327 285 0.591716 +328 285 0.591716 +331 285 0.147929 +332 285 0.147929 +334 285 0.591716 +337 285 0.591716 +338 285 0.591716 +339 285 0.591716 +340 285 0.147929 +341 285 0.591716 +342 285 0.591716 +406 285 -18.238361 +431 285 -24.265042 +444 285 -24.323662 +456 285 -34.039123 +460 285 -59.202654 +469 285 -33.381150 +481 285 -49.303301 +483 285 -0.264421 +485 285 -86.794114 +494 285 -15.799203 +495 285 -17.306442 +286 286 0.611604 +324 286 0.065746 +328 286 0.147929 +339 286 0.147929 +460 286 -20.785870 +484 286 -13.274229 +485 286 -18.314620 +287 287 4.375575 +319 287 0.065746 +320 287 0.591716 +322 287 0.147929 +323 287 0.147929 +324 287 0.147929 +326 287 0.147929 +327 287 0.147929 +328 287 0.147929 +329 287 0.591716 +331 287 0.065746 +332 287 0.147929 +334 287 0.147929 +337 287 0.147929 +338 287 0.147929 +339 287 0.591716 +341 287 0.591716 +342 287 0.147929 +406 287 -8.223891 +431 287 -11.002262 +456 287 -11.106277 +460 287 -15.492301 +481 287 -11.223392 +483 287 -0.122632 +485 287 -22.873972 +288 288 0.463675 +321 288 0.065746 +328 288 0.147929 +361 288 -6.336169 +362 288 -1.555962 +386 288 -9.339540 +411 288 -9.515594 +436 288 -9.710437 +460 288 -16.888048 +461 288 -8.621894 +485 288 -33.188649 +289 289 3.044214 +319 289 0.147929 +321 289 0.147929 +322 289 0.065746 +323 289 0.065746 +324 289 0.147929 +326 289 0.147929 +327 289 0.147929 +328 289 0.147929 +331 289 0.147929 +332 289 0.591716 +334 289 0.591716 +339 289 0.147929 +341 289 0.147929 +342 289 0.147929 +361 289 -14.871210 +362 289 -3.102303 +386 289 -21.314653 +406 289 -18.691350 +411 289 -21.765961 +431 289 -25.059483 +436 289 -22.262568 +456 289 -25.357798 +460 289 -28.675632 +461 289 -10.001786 +481 289 -25.687016 +483 289 -0.282400 +485 289 -46.903748 +290 290 4.375575 +319 290 0.147929 +320 290 0.591716 +321 290 0.147929 +322 290 0.065746 +323 290 0.147929 +324 290 0.147929 +326 290 0.065746 +327 290 0.147929 +328 290 0.147929 +329 290 0.147929 +331 290 0.147929 +332 290 0.147929 +337 290 0.591716 +338 290 0.591716 +339 290 0.147929 +341 290 0.591716 +342 290 0.147929 +361 290 -14.830562 +362 290 -3.126950 +386 290 -21.292527 +406 290 -18.680294 +411 290 -21.739884 +431 290 -25.041841 +436 290 -22.232314 +456 290 -25.336707 +460 290 -28.000208 +461 290 -10.621618 +481 290 -25.662392 +483 290 -0.282036 +485 290 -46.829755 +291 291 1.647107 +324 291 0.147929 +325 291 0.147929 +327 291 0.147929 +331 291 0.065746 +332 291 0.147929 +337 291 0.591716 +342 291 0.147929 +444 291 -24.505319 +469 291 -33.616377 +483 291 -0.116627 +494 291 -11.791595 +495 291 -21.530202 +292 292 3.981098 +319 292 0.065746 +320 292 0.065746 +321 292 0.147929 +322 292 0.147929 +325 292 0.591716 +326 292 0.065746 +327 292 0.147929 +328 292 0.147929 +331 292 0.065746 +332 292 0.591716 +334 292 0.147929 +335 292 0.147929 +337 292 0.591716 +339 292 0.065746 +341 292 0.147929 +342 292 0.591716 +361 292 -20.276883 +362 292 -1.563584 +386 292 -26.518579 +406 292 -8.850210 +410 292 -22.655801 +411 292 -5.127105 +431 292 -11.968885 +434 292 -2.832425 +435 292 -26.328246 +444 292 -137.298235 +455 292 -4.044847 +456 292 -8.186263 +459 292 -30.659867 +460 292 -22.011297 +469 292 -1.135003 +470 292 -176.391714 +471 292 -8.054180 +480 292 -12.511294 +483 292 -19.123574 +484 292 -31.626217 +485 292 -15.333645 +496 292 -170.279454 +497 292 -10.221126 +293 293 3.635930 +319 293 0.147929 +320 293 0.591716 +321 293 0.147929 +323 293 0.147929 +324 293 0.147929 +325 293 0.065746 +326 293 0.147929 +327 293 0.147929 +328 293 0.147929 +329 293 0.147929 +331 293 0.147929 +332 293 0.065746 +334 293 0.147929 +337 293 0.147929 +338 293 0.591716 +339 293 0.147929 +341 293 0.147929 +342 293 0.147929 +361 293 -12.360321 +362 293 -5.005067 +386 293 -20.453704 +406 293 -18.314680 +411 293 -20.733537 +431 293 -24.425897 +436 293 -21.050272 +444 293 -10.665273 +456 293 -24.569589 +460 293 -15.061926 +461 293 -21.405349 +469 293 -14.648554 +481 293 -24.741283 +483 293 -0.268643 +485 293 -22.149196 +486 293 -21.800365 +494 293 -11.120902 +495 293 -3.421095 +294 294 3.635930 +319 294 0.147929 +320 294 0.591716 +321 294 0.147929 +323 294 0.147929 +324 294 0.147929 +325 294 0.147929 +326 294 0.065746 +327 294 0.147929 +328 294 0.147929 +329 294 0.591716 +331 294 0.147929 +332 294 0.147929 +334 294 0.147929 +337 294 0.065746 +338 294 0.147929 +339 294 0.147929 +341 294 0.147929 +342 294 0.147929 +361 294 -12.394734 +362 294 -4.975135 +386 294 -20.460299 +406 294 -18.317926 +411 294 -20.741663 +431 294 -24.432003 +436 294 -21.059991 +444 294 -23.976641 +456 294 -24.577763 +460 294 -15.068383 +461 294 -21.416730 +469 294 -32.933204 +481 294 -24.751552 +483 294 -0.268764 +485 294 -22.160196 +486 294 -21.813485 +494 294 -25.709028 +495 294 -6.986711 +295 295 1.827909 +320 295 0.065746 +323 295 0.147929 +325 295 0.147929 +326 295 0.065746 +327 295 0.065746 +329 295 0.147929 +332 295 0.065746 +334 295 0.147929 +335 295 0.065746 +337 295 0.147929 +338 295 0.065746 +339 295 0.147929 +341 295 0.147929 +342 295 0.147929 +356 295 -9.210141 +357 295 -34.050566 +358 295 -103.650835 +359 295 -151.194403 +378 295 -13.213366 +379 295 -33.849886 +380 295 -33.907873 +381 295 -24.764109 +382 295 -3.453508 +383 295 -140.183265 +384 295 -82.891660 +385 295 -16.327151 +399 295 -4.010399 +400 295 -33.680130 +401 295 -33.714919 +402 295 -33.754329 +403 295 -20.585677 +407 295 -39.770240 +408 295 -112.349420 +409 295 -63.255599 +410 295 -28.694098 +420 295 -16.147473 +421 295 -33.577188 +422 295 -33.598286 +423 295 -33.622245 +424 295 -29.638997 +431 295 -21.696862 +432 295 -52.561205 +433 295 -81.693301 +434 295 -52.438108 +435 295 -13.093591 +436 295 -24.328443 +444 295 -26.550118 +445 295 -17.411199 +455 295 -10.858252 +456 295 -28.146748 +457 295 -44.268571 +458 295 -76.822699 +459 295 -39.447237 +460 295 -22.469339 +461 295 -26.065857 +479 295 -3.044941 +480 295 -34.182279 +481 295 -42.567563 +482 295 -25.986529 +483 295 -58.778914 +484 295 -30.567963 +485 295 -30.821732 +486 295 -0.277585 +487 295 -24.638552 +296 296 3.109961 +319 296 0.147929 +320 296 0.147929 +321 296 0.147929 +323 296 0.147929 +324 296 0.147929 +325 296 0.065746 +326 296 0.591716 +327 296 0.065746 +328 296 0.147929 +329 296 0.147929 +332 296 0.065746 +337 296 0.147929 +338 296 0.147929 +339 296 0.147929 +341 296 0.591716 +361 296 -11.006256 +362 296 -6.227435 +386 296 -20.256291 +406 296 -18.262576 +411 296 -20.487239 +431 296 -24.321924 +436 296 -20.753284 +444 296 -10.689890 +456 296 -24.425592 +460 296 -14.879728 +461 296 -21.055624 +469 296 -14.680273 +481 296 -24.556824 +485 296 -21.836296 +486 296 -21.395611 +494 296 -10.321116 +495 296 -4.249836 +297 297 2.814103 +320 297 0.147929 +321 297 0.147929 +323 297 0.065746 +324 297 0.147929 +325 297 0.147929 +326 297 0.147929 +327 297 0.147929 +328 297 0.147929 +329 297 0.065746 +332 297 0.147929 +334 297 0.591716 +335 297 0.147929 +337 297 0.147929 +338 297 0.065746 +339 297 0.147929 +341 297 0.147929 +355 297 -12.521241 +356 297 -33.012000 +357 297 -33.019723 +358 297 -33.028592 +359 297 -33.038826 +360 297 -33.050704 +361 297 -33.064581 +362 297 -0.960757 +377 297 -24.763562 +378 297 -34.191743 +379 297 -286.720433 +380 297 -176.245514 +381 297 -30.883805 +399 297 -33.593898 +400 297 -34.018412 +401 297 -34.069039 +402 297 -9.362910 +404 297 -215.377749 +405 297 -176.627547 +406 297 -10.469577 +407 297 -35.120745 +408 297 -26.834863 +420 297 -23.510137 +421 297 -33.869014 +422 297 -33.899585 +423 297 -33.934332 +424 297 -0.379847 +428 297 -21.175998 +429 297 -187.274166 +430 297 -134.288950 +431 297 -54.431840 +433 297 -8.464801 +434 297 -35.509398 +435 297 -14.090017 +444 297 -26.769364 +445 297 -10.332068 +453 297 -155.877628 +454 297 -39.731606 +455 297 -80.307997 +456 297 -107.300813 +457 297 -13.232175 +460 297 -16.562230 +477 297 -4.369451 +478 297 -157.084700 +479 297 -45.877215 +480 297 -68.033042 +481 297 -88.534260 +482 297 -32.325863 +298 298 3.652367 +319 298 0.591716 +320 298 0.147929 +321 298 0.147929 +322 298 0.591716 +325 298 0.147929 +328 298 0.147929 +329 298 0.147929 +331 298 0.147929 +337 298 0.591716 +339 298 0.591716 +342 298 0.147929 +359 298 -13.309785 +360 298 -33.690235 +361 298 -33.764501 +362 298 -0.982099 +381 298 -32.164039 +382 298 -33.525861 +383 298 -33.572715 +384 298 -20.317197 +401 298 -17.073792 +402 298 -265.291279 +403 298 -170.035795 +404 298 -165.722420 +405 298 -165.795301 +406 298 -109.813589 +420 298 -2.333197 +421 298 -33.288909 +422 298 -33.300892 +423 298 -33.314489 +424 298 -33.329880 +425 298 -33.347285 +426 298 -135.540120 +427 298 -361.218234 +428 298 -177.955999 +429 298 -65.135342 +430 298 -33.117562 +431 298 -33.131463 +432 298 -33.147365 +433 298 -33.165639 +434 298 -12.327302 +444 298 -26.333261 +445 298 -30.945188 +451 298 -158.826227 +452 298 -29.253568 +453 298 -269.374787 +454 298 -105.543401 +455 298 -34.817862 +456 298 -34.949561 +457 298 -2.179332 +459 298 -20.859445 +460 298 -28.483663 +475 298 -113.219681 +476 298 -48.761741 +477 298 -12.626959 +478 298 -16.176317 +479 298 -288.466534 +480 298 -65.529022 +482 298 -32.922545 +483 298 -31.883842 +499 298 -4.197998 +500 298 -132.124922 +299 299 2.353879 +319 299 0.065746 +323 299 0.065746 +325 299 0.147929 +327 299 0.591716 +328 299 0.065746 +329 299 0.147929 +331 299 0.591716 +339 299 0.147929 +340 299 0.065746 +341 299 0.065746 +342 299 0.147929 +406 299 -8.103049 +431 299 -10.776337 +444 299 -24.553857 +456 299 -15.112589 +460 299 -6.572154 +469 299 -33.679296 +481 299 -21.883263 +483 299 -1.056244 +485 299 -9.633407 +494 299 -10.819309 +495 299 -22.560386 +300 300 1.104701 +319 300 0.065746 +321 300 0.147929 +326 300 0.147929 +331 300 0.065746 +337 300 0.147929 +338 300 0.147929 +340 300 0.065746 +342 300 0.065746 +361 300 -29.376481 +362 300 -1.168062 +385 300 -27.996993 +386 300 -10.393048 +406 300 -13.453460 +409 300 -30.732091 +410 300 -11.034579 +430 300 -17.208010 +431 300 -1.640548 +433 300 -37.838766 +434 300 -7.698845 +453 300 -1.235945 +454 300 -17.873356 +455 300 -7.796256 +456 300 -13.801599 +457 300 -37.519499 +458 300 -0.095897 +477 300 -4.880475 +478 300 -16.415025 +479 300 -13.074732 +480 300 -39.313470 +481 300 -25.057727 +483 300 -0.328750 +301 301 1.499178 +325 301 0.591716 +326 301 0.147929 +332 301 0.147929 +337 301 0.065746 +338 301 0.147929 +342 301 0.147929 +444 301 -101.880331 +469 301 -128.704845 +470 301 -10.777381 +495 301 -137.920621 +302 302 1.449869 +319 302 0.147929 +321 302 0.065746 +323 302 0.147929 +324 302 0.065746 +325 302 0.065746 +327 302 0.065746 +329 302 0.147929 +331 302 0.065746 +334 302 0.065746 +339 302 0.147929 +340 302 0.065746 +342 302 0.147929 +361 302 -6.206450 +362 302 -1.648122 +386 302 -9.286769 +406 302 -18.475032 +411 302 -9.452664 +431 302 -24.707197 +436 302 -9.636828 +444 302 -10.587732 +456 302 -29.314807 +461 302 -9.840116 +469 302 -14.548846 +480 302 -8.128347 +481 302 -28.340811 +483 302 -0.122381 +485 302 -9.317276 +486 302 -0.746180 +494 302 -14.032214 +495 302 -0.419015 +303 303 0.381492 +324 303 0.065746 +332 303 0.065746 +304 304 4.063281 +319 304 0.147929 +321 304 0.147929 +322 304 0.147929 +323 304 0.147929 +324 304 0.147929 +325 304 0.591716 +327 304 0.147929 +328 304 0.147929 +331 304 0.591716 +332 304 0.591716 +334 304 0.065746 +336 304 0.147929 +337 304 0.065746 +339 304 0.591716 +340 304 0.065746 +342 304 0.065746 +361 304 -20.118425 +362 304 -1.580211 +386 304 -26.328514 +406 304 -19.342743 +410 304 -21.596720 +411 304 -5.966691 +431 304 -26.068745 +434 304 -1.144497 +435 304 -27.764213 +444 304 -124.866672 +445 304 -38.619583 +455 304 -0.629022 +456 304 -30.534321 +459 304 -30.372171 +460 304 -22.068640 +470 304 -119.903098 +471 304 -99.325267 +480 304 -34.202297 +481 304 -4.823615 +483 304 -17.879526 +484 304 -34.127840 +485 304 -15.206282 +496 304 -60.178440 +497 304 -150.785070 +305 305 1.400559 +319 305 0.147929 +320 305 0.065746 +321 305 0.065746 +325 305 0.147929 +327 305 0.147929 +334 305 0.065746 +335 305 0.147929 +336 305 0.147929 +340 305 0.065746 +341 305 0.147929 +361 305 -8.939816 +362 305 -0.702499 +386 305 -11.699521 +406 305 -19.335293 +410 305 -9.587038 +411 305 -2.661011 +431 305 -26.057406 +434 305 -0.490322 +435 305 -12.355289 +444 305 -31.186911 +445 305 -9.772601 +455 305 -0.611870 +456 305 -30.535814 +459 305 -13.495656 +470 305 -29.819089 +471 305 -25.100204 +480 305 -33.946988 +481 305 -5.056712 +483 305 -7.236640 +484 305 -6.964901 +496 305 -14.734937 +497 305 -38.106419 +306 306 4.671433 +319 306 0.147929 +321 306 0.147929 +322 306 0.065746 +323 306 0.591716 +324 306 0.591716 +325 306 0.065746 +327 306 0.147929 +328 306 0.147929 +332 306 0.591716 +337 306 0.147929 +339 306 0.591716 +341 306 0.591716 +342 306 0.591716 +361 306 -13.013008 +362 306 -4.450737 +386 306 -20.597127 +406 306 -18.367935 +411 306 -20.909154 +431 306 -24.523075 +436 306 -21.259426 +444 306 -10.607093 +456 306 -24.697295 +460 306 -15.196468 +461 306 -21.649545 +469 306 -14.573710 +481 306 -24.899942 +485 306 -28.537247 +486 306 -15.921451 +494 306 -13.241447 +495 306 -1.232377 +307 307 2.370316 +319 307 0.065746 +321 307 0.065746 +322 307 0.147929 +323 307 0.147929 +325 307 0.147929 +327 307 0.147929 +328 307 0.065746 +329 307 0.591716 +332 307 0.147929 +337 307 0.147929 +339 307 0.147929 +341 307 0.147929 +342 307 0.147929 +361 307 -6.062402 +362 307 -1.755846 +386 307 -9.235349 +406 307 -8.209937 +411 307 -9.391009 +431 307 -10.978983 +436 307 -9.564440 +444 307 -23.506619 +456 307 -11.077488 +460 307 -6.832005 +461 307 -9.756442 +469 307 -32.331285 +481 307 -11.188988 +485 307 -17.072663 +486 307 -2.972012 +494 307 -32.150835 +308 308 2.912722 +319 308 0.147929 +320 308 0.147929 +321 308 0.147929 +322 308 0.147929 +324 308 0.147929 +325 308 0.591716 +327 308 0.147929 +328 308 0.147929 +335 308 0.147929 +336 308 0.147929 +337 308 0.147929 +339 308 0.147929 +340 308 0.147929 +341 308 0.147929 +342 308 0.147929 +360 308 -6.715741 +361 308 -35.907901 +362 308 -1.047870 +384 308 -28.388649 +385 308 -28.911355 +405 308 -12.395799 +406 308 -30.017667 +407 308 -23.137921 +408 308 -35.192294 +409 308 -7.002995 +428 308 -1.037446 +429 308 -36.174533 +430 308 -51.842021 +431 308 -34.875772 +432 308 -11.884183 +444 308 -106.879151 +445 308 -135.112313 +446 308 -135.211970 +447 308 -15.200862 +452 308 -41.212812 +453 308 -69.487663 +454 308 -51.705289 +455 308 -40.383715 +456 308 -3.332774 +457 308 -32.168504 +458 308 -33.135265 +459 308 -33.153951 +460 308 -28.453304 +472 308 -120.124734 +473 308 -135.454715 +474 308 -135.601142 +475 308 -190.636210 +476 308 -136.476802 +477 308 -95.513847 +478 308 -66.486793 +479 308 -49.458756 +480 308 -33.092691 +481 308 -33.105002 +482 308 -0.950581 +499 308 -18.406507 +500 308 -242.050488 +309 309 2.978468 +319 309 0.147929 +320 309 0.065746 +321 309 0.147929 +322 309 0.147929 +324 309 0.147929 +327 309 0.147929 +328 309 0.147929 +335 309 0.147929 +336 309 0.147929 +337 309 0.147929 +339 309 0.147929 +341 309 0.591716 +342 309 0.591716 +360 309 -6.799763 +361 309 -35.897164 +362 309 -1.047539 +384 309 -28.590992 +385 309 -28.817713 +405 309 -12.561416 +406 309 -29.994653 +407 309 -23.496901 +408 309 -35.184356 +409 309 -6.791950 +428 309 -1.479113 +429 309 -36.150334 +430 309 -52.200793 +431 309 -34.869021 +432 309 -11.517906 +452 309 -42.735784 +453 309 -69.017868 +454 309 -34.633244 +455 309 -6.351361 +457 309 -32.476949 +458 309 -33.134267 +459 309 -33.152873 +460 309 -28.452307 +475 309 -159.887679 +476 309 -103.084195 +477 309 -60.574527 +478 309 -33.071646 +479 309 -33.081116 +480 309 -33.091874 +481 309 -33.104133 +482 309 -0.641207 +499 309 -20.191387 +500 309 -377.327094 +310 310 4.161900 +319 310 0.591716 +320 310 0.065746 +321 310 0.147929 +322 310 0.147929 +323 310 0.147929 +324 310 0.591716 +325 310 0.147929 +327 310 0.147929 +328 310 0.147929 +332 310 0.591716 +334 310 0.147929 +336 310 0.147929 +337 310 0.147929 +340 310 0.591716 +341 310 0.147929 +361 310 -21.524946 +362 310 -1.454965 +385 310 -0.898821 +386 310 -27.149296 +406 310 -78.964649 +410 310 -29.553091 +431 310 -106.686559 +434 310 -15.208562 +435 310 -15.988953 +444 310 -29.627558 +445 310 -17.500626 +455 310 -34.466907 +456 310 -117.364309 +458 310 -3.445495 +459 310 -29.545836 +460 310 -24.909524 +470 310 -20.053252 +471 310 -37.709507 +472 310 -4.970407 +480 310 -222.768531 +483 310 -34.943798 +484 310 -28.710477 +485 310 -9.774016 +497 310 -32.918503 +498 310 -26.843607 +311 311 3.767423 +319 311 0.147929 +320 311 0.147929 +321 311 0.147929 +322 311 0.065746 +323 311 0.147929 +324 311 0.147929 +325 311 0.147929 +327 311 0.065746 +328 311 0.065746 +332 311 0.591716 +334 311 0.065746 +335 311 0.147929 +336 311 0.591716 +337 311 0.591716 +339 311 0.147929 +340 311 0.147929 +341 311 0.147929 +361 311 -20.061351 +362 311 -1.586387 +386 311 -26.260321 +406 311 -19.354853 +410 311 -21.210744 +411 311 -6.273937 +431 311 -26.087171 +434 311 -0.529014 +435 311 -28.289349 +444 311 -31.451081 +445 311 -8.755310 +455 311 -1.481548 +456 311 -35.497395 +459 311 -30.269047 +460 311 -9.753308 +470 311 -31.182557 +471 311 -22.775225 +480 311 -49.613880 +481 311 -4.448511 +483 311 -15.398623 +484 311 -24.459212 +485 311 -6.880977 +496 311 -17.422295 +497 311 -34.557034 +312 312 1.564924 +319 312 0.147929 +320 312 0.065746 +321 312 0.065746 +322 312 0.065746 +324 312 0.065746 +327 312 0.065746 +328 312 0.065746 +329 312 0.065746 +331 312 0.065746 +332 312 0.147929 +334 312 0.065746 +335 312 0.147929 +337 312 0.065746 +339 312 0.147929 +341 312 0.065746 +361 312 -7.077980 +362 312 -1.134150 +386 312 -9.779754 +406 312 -19.169950 +411 312 -10.032437 +431 312 -25.804894 +435 312 -2.464575 +436 312 -7.843926 +456 312 -26.231743 +460 312 -17.954275 +480 312 -15.940440 +481 312 -10.752705 +483 312 -0.131071 +485 312 -21.862147 +313 313 2.994905 +319 313 0.065746 +320 313 0.065746 +321 313 0.065746 +322 313 0.147929 +323 313 0.591716 +324 313 0.147929 +327 313 0.065746 +328 313 0.065746 +331 313 0.147929 +334 313 0.065746 +335 313 0.065746 +336 313 0.591716 +337 313 0.591716 +340 313 0.065746 +361 313 -9.175145 +362 313 -0.679013 +386 313 -11.983518 +406 313 -8.674851 +410 313 -11.130603 +411 313 -1.445585 +431 313 -11.704601 +434 313 -2.948056 +435 313 -10.274449 +455 313 -1.073973 +456 313 -15.543854 +459 313 -13.926264 +460 313 -10.241165 +480 313 -24.329772 +483 313 -11.452063 +484 313 -13.498014 +485 313 -5.853516 +314 314 4.539941 +319 314 0.147929 +320 314 0.147929 +321 314 0.147929 +322 314 0.591716 +323 314 0.591716 +327 314 0.591716 +328 314 0.147929 +329 314 0.147929 +331 314 0.591716 +334 314 0.147929 +337 314 0.147929 +339 314 0.147929 +340 314 0.147929 +341 314 0.591716 +361 314 -8.005351 +362 314 -9.097895 +386 314 -20.049011 +406 314 -18.222995 +411 314 -20.218903 +431 314 -24.211188 +436 314 -20.422051 +456 314 -33.930890 +460 314 -14.680859 +461 314 -20.659363 +481 314 -49.103542 +483 314 -1.050309 +485 314 -21.486221 +486 314 -20.931896 +315 315 4.079717 +319 315 0.147929 +320 315 0.591716 +321 315 0.147929 +323 315 0.147929 +324 315 0.147929 +325 315 0.065746 +327 315 0.065746 +329 315 0.147929 +331 315 0.147929 +332 315 0.591716 +334 315 0.147929 +337 315 0.591716 +339 315 0.147929 +340 315 0.147929 +341 315 0.591716 +361 315 -14.199111 +362 315 -3.540734 +386 315 -20.989516 +406 315 -18.531977 +411 315 -21.380988 +431 315 -24.801731 +436 315 -21.814493 +444 315 -10.514433 +456 315 -34.951643 +460 315 -2.021233 +461 315 -20.270817 +469 315 -14.454949 +480 315 -19.896840 +481 315 -30.937450 +483 315 -0.277069 +485 315 -22.815847 +494 315 -14.366190 +316 316 2.863412 +319 316 0.147929 +320 316 0.065746 +321 316 0.147929 +323 316 0.065746 +325 316 0.065746 +327 316 0.147929 +328 316 0.065746 +329 316 0.147929 +331 316 0.065746 +332 316 0.147929 +337 316 0.591716 +338 316 0.591716 +339 316 0.065746 +340 316 0.147929 +341 316 0.147929 +361 316 -14.179176 +362 316 -3.554697 +386 316 -20.981140 +406 316 -18.525668 +411 316 -21.371013 +431 316 -24.791338 +436 316 -21.802836 +444 316 -10.524183 +456 316 -34.934524 +460 316 -8.618487 +461 316 -20.573772 +469 316 -14.467416 +480 316 -19.735930 +481 316 -31.070207 +483 316 -0.123067 +485 316 -33.013740 +494 316 -14.377451 +317 317 1.252630 +319 317 0.147929 +321 317 0.065746 +323 317 0.147929 +324 317 0.065746 +325 317 0.065746 +329 317 0.147929 +332 317 0.065746 +339 317 0.147929 +340 317 0.147929 +361 317 -6.285408 +362 317 -1.591447 +386 317 -9.318121 +406 317 -18.518498 +411 317 -9.490090 +431 317 -24.779504 +436 317 -9.680635 +444 317 -10.528216 +456 317 -34.915187 +460 317 -0.497042 +461 317 -9.393602 +469 317 -14.472574 +480 317 -19.554272 +481 317 -31.220269 +485 317 -10.121079 +494 317 -14.382113 +318 318 4.079717 +319 318 0.147929 +320 318 0.147929 +321 318 0.591716 +324 318 0.591716 +325 318 0.065746 +327 318 0.147929 +329 318 0.065746 +331 318 0.147929 +337 318 0.591716 +338 318 0.591716 +339 318 0.147929 +341 318 0.591716 +361 318 -50.970807 +362 318 -18.706724 +386 318 -82.131047 +406 318 -18.365360 +411 318 -83.322463 +431 318 -24.518494 +436 318 -84.664438 +444 318 -10.520691 +456 318 -24.691374 +461 318 -86.163088 +469 318 -14.462950 +481 318 -24.892660 +483 318 -0.270264 +485 318 -9.110637 +486 318 -78.714539 +494 318 -14.373415 +1 319 0.147929 +2 319 0.065746 +3 319 0.065746 +4 319 0.065746 +5 319 0.065746 +8 319 0.147929 +13 319 0.147929 +14 319 0.147929 +15 319 0.147929 +16 319 0.147929 +17 319 0.147929 +19 319 0.147929 +21 319 0.147929 +22 319 0.147929 +25 319 0.147929 +26 319 0.065746 +27 319 0.591716 +28 319 0.147929 +30 319 0.065746 +32 319 0.065746 +34 319 0.065746 +37 319 0.147929 +38 319 0.147929 +41 319 0.147929 +42 319 0.147929 +43 319 0.065746 +44 319 0.591716 +49 319 0.147929 +50 319 0.147929 +51 319 0.065746 +52 319 0.147929 +53 319 0.147929 +54 319 0.591716 +55 319 0.065746 +57 319 0.147929 +58 319 0.147929 +59 319 0.147929 +60 319 0.147929 +62 319 0.147929 +63 319 0.147929 +64 319 0.147929 +65 319 0.065746 +66 319 0.065746 +67 319 0.147929 +69 319 0.065746 +70 319 0.147929 +72 319 0.065746 +73 319 0.147929 +75 319 0.147929 +77 319 0.065746 +78 319 0.065746 +80 319 0.065746 +84 319 0.147929 +86 319 0.065746 +87 319 0.065746 +89 319 0.147929 +90 319 0.147929 +91 319 0.147929 +93 319 0.147929 +94 319 0.147929 +99 319 0.147929 +101 319 0.147929 +105 319 0.147929 +106 319 0.147929 +108 319 0.147929 +109 319 0.147929 +111 319 0.147929 +116 319 0.147929 +117 319 0.147929 +119 319 0.147929 +120 319 0.147929 +122 319 0.147929 +124 319 0.147929 +125 319 0.065746 +126 319 0.147929 +127 319 0.147929 +129 319 0.147929 +130 319 0.065746 +131 319 0.065746 +132 319 0.065746 +135 319 0.147929 +136 319 0.147929 +137 319 0.065746 +141 319 0.147929 +148 319 0.147929 +149 319 0.147929 +150 319 0.147929 +151 319 0.065746 +152 319 0.147929 +153 319 0.065746 +159 319 0.147929 +163 319 0.147929 +166 319 0.147929 +167 319 0.147929 +168 319 0.065746 +169 319 0.147929 +173 319 0.147929 +175 319 0.147929 +177 319 0.147929 +178 319 0.147929 +179 319 0.065746 +181 319 0.147929 +182 319 0.065746 +183 319 0.147929 +185 319 0.147929 +186 319 0.147929 +187 319 0.147929 +188 319 0.065746 +189 319 0.147929 +190 319 0.065746 +194 319 0.147929 +195 319 0.147929 +196 319 0.065746 +197 319 0.065746 +199 319 0.065746 +201 319 0.147929 +202 319 0.147929 +204 319 0.147929 +205 319 0.147929 +206 319 0.147929 +208 319 0.147929 +213 319 0.147929 +214 319 0.147929 +215 319 0.147929 +217 319 0.147929 +219 319 0.147929 +220 319 0.147929 +221 319 0.147929 +222 319 0.147929 +223 319 0.591716 +224 319 0.147929 +227 319 0.147929 +228 319 0.147929 +229 319 0.147929 +230 319 0.147929 +231 319 0.147929 +233 319 0.147929 +234 319 0.147929 +235 319 0.147929 +238 319 0.147929 +239 319 0.147929 +241 319 0.147929 +242 319 0.147929 +244 319 0.147929 +245 319 0.065746 +247 319 0.147929 +250 319 0.147929 +251 319 0.065746 +252 319 0.147929 +253 319 0.147929 +257 319 0.147929 +258 319 0.147929 +259 319 0.065746 +261 319 0.065746 +262 319 0.065746 +263 319 0.147929 +264 319 0.147929 +265 319 0.147929 +266 319 0.147929 +267 319 0.147929 +268 319 0.147929 +269 319 0.147929 +270 319 0.065746 +271 319 0.147929 +272 319 0.147929 +273 319 0.065746 +274 319 0.147929 +275 319 0.065746 +277 319 0.065746 +278 319 0.147929 +279 319 0.147929 +281 319 0.147929 +282 319 0.147929 +283 319 0.065746 +284 319 0.147929 +285 319 0.147929 +287 319 0.065746 +289 319 0.147929 +290 319 0.147929 +292 319 0.065746 +293 319 0.147929 +294 319 0.147929 +296 319 0.147929 +298 319 0.591716 +299 319 0.065746 +300 319 0.065746 +302 319 0.147929 +304 319 0.147929 +305 319 0.147929 +306 319 0.147929 +307 319 0.065746 +308 319 0.147929 +309 319 0.147929 +310 319 0.591716 +311 319 0.147929 +312 319 0.147929 +313 319 0.065746 +314 319 0.147929 +315 319 0.147929 +316 319 0.147929 +317 319 0.147929 +318 319 0.147929 +319 319 38.731835 +347 319 -87.985741 +348 319 -114.894237 +349 319 -114.952710 +350 319 -115.018841 +351 319 -74.499424 +369 319 -13.894450 +370 319 -14.625846 +371 319 -14.625970 +372 319 -14.626111 +373 319 -14.626270 +374 319 -14.276887 +376 319 -65.326734 +377 319 -148.158171 +378 319 -148.258157 +379 319 -127.399854 +380 319 -105.021035 +399 319 -0.349563 +400 319 -14.626654 +401 319 -14.626884 +402 319 -129.672980 +403 319 -146.894426 +404 319 -181.343887 +405 319 -298.399108 +406 319 -3784.740859 +407 319 -128.486509 +426 319 -28.144742 +427 319 -44.332523 +428 319 -92.697089 +429 319 -163.720149 +430 319 -455.388093 +431 319 -4032.726734 +432 319 -311.202393 +433 319 -4.335844 +447 319 -29.370147 +448 319 -33.661787 +449 319 -33.690472 +450 319 -42.133909 +451 319 -72.281853 +452 319 -124.151407 +453 319 -88.429463 +454 319 -255.527665 +455 319 -764.033403 +456 319 -3425.023372 +457 319 -199.007771 +458 319 -154.935167 +472 319 -2.921319 +475 319 -70.683139 +476 319 -73.930756 +477 319 -20.686548 +478 319 -188.266183 +479 319 -448.706576 +480 319 -1204.092240 +481 319 -2650.430019 +482 319 -118.303314 +483 319 -235.744882 +484 319 -20.165946 +1 320 0.065746 +3 320 0.147929 +4 320 0.147929 +10 320 0.147929 +14 320 0.591716 +15 320 0.591716 +17 320 0.147929 +18 320 0.147929 +20 320 0.065746 +21 320 0.591716 +23 320 0.147929 +24 320 0.147929 +25 320 0.591716 +32 320 0.591716 +33 320 0.147929 +35 320 0.147929 +36 320 0.065746 +37 320 0.591716 +38 320 0.147929 +40 320 0.065746 +42 320 0.591716 +43 320 0.591716 +44 320 0.147929 +45 320 0.065746 +46 320 0.065746 +47 320 0.147929 +48 320 0.147929 +49 320 0.147929 +50 320 0.147929 +52 320 0.147929 +53 320 0.591716 +54 320 0.591716 +55 320 0.147929 +56 320 0.147929 +57 320 0.591716 +58 320 0.065746 +59 320 0.147929 +60 320 0.147929 +61 320 0.591716 +63 320 0.591716 +64 320 0.065746 +65 320 0.591716 +66 320 0.147929 +67 320 0.147929 +68 320 0.065746 +69 320 0.147929 +70 320 0.147929 +71 320 0.065746 +72 320 0.147929 +73 320 0.147929 +75 320 0.591716 +78 320 0.147929 +79 320 0.065746 +80 320 0.147929 +81 320 0.591716 +82 320 0.147929 +84 320 0.147929 +85 320 0.147929 +86 320 0.591716 +87 320 0.591716 +89 320 0.591716 +90 320 0.147929 +91 320 0.147929 +93 320 0.147929 +94 320 0.591716 +95 320 0.147929 +97 320 0.147929 +98 320 0.147929 +99 320 0.147929 +100 320 0.147929 +101 320 0.065746 +102 320 0.147929 +103 320 0.147929 +104 320 0.065746 +106 320 0.147929 +107 320 0.147929 +108 320 0.065746 +109 320 0.147929 +110 320 0.147929 +111 320 0.591716 +112 320 0.065746 +113 320 0.147929 +114 320 0.591716 +115 320 0.065746 +116 320 0.147929 +117 320 0.591716 +118 320 0.147929 +119 320 0.591716 +121 320 0.591716 +122 320 0.591716 +123 320 0.147929 +124 320 0.147929 +125 320 0.147929 +126 320 0.591716 +127 320 0.147929 +128 320 0.591716 +129 320 0.591716 +131 320 0.065746 +132 320 0.147929 +133 320 0.591716 +136 320 0.147929 +138 320 0.591716 +139 320 0.147929 +140 320 0.065746 +141 320 0.147929 +144 320 0.591716 +145 320 0.147929 +146 320 0.065746 +147 320 0.065746 +148 320 0.147929 +149 320 0.147929 +150 320 0.147929 +151 320 0.147929 +152 320 0.147929 +153 320 0.147929 +154 320 0.147929 +155 320 0.147929 +156 320 0.147929 +158 320 0.147929 +159 320 0.147929 +160 320 0.591716 +161 320 0.591716 +162 320 0.147929 +163 320 0.591716 +164 320 0.591716 +165 320 0.591716 +166 320 0.147929 +167 320 0.065746 +169 320 0.147929 +170 320 0.591716 +171 320 0.147929 +172 320 0.147929 +173 320 0.147929 +174 320 0.065746 +175 320 0.065746 +177 320 0.147929 +180 320 0.147929 +181 320 0.065746 +182 320 0.065746 +183 320 0.591716 +184 320 0.147929 +186 320 0.065746 +188 320 0.591716 +189 320 0.147929 +190 320 0.591716 +193 320 0.147929 +194 320 0.147929 +195 320 0.591716 +196 320 0.147929 +198 320 0.147929 +201 320 0.147929 +202 320 0.147929 +203 320 0.591716 +204 320 0.147929 +206 320 0.065746 +207 320 0.065746 +208 320 0.591716 +211 320 0.147929 +212 320 0.591716 +213 320 0.065746 +214 320 0.065746 +216 320 0.591716 +217 320 0.147929 +219 320 0.591716 +220 320 0.147929 +221 320 0.591716 +222 320 0.591716 +224 320 0.591716 +227 320 0.591716 +228 320 0.147929 +229 320 0.591716 +230 320 0.591716 +231 320 0.147929 +232 320 0.591716 +233 320 0.591716 +235 320 0.591716 +236 320 0.147929 +238 320 0.147929 +239 320 0.065746 +240 320 0.147929 +241 320 0.147929 +242 320 0.065746 +244 320 0.147929 +245 320 0.065746 +248 320 0.065746 +252 320 0.147929 +254 320 0.147929 +256 320 0.065746 +257 320 0.591716 +258 320 0.065746 +259 320 0.065746 +261 320 0.591716 +263 320 0.147929 +264 320 0.147929 +265 320 0.065746 +266 320 0.591716 +267 320 0.147929 +268 320 0.147929 +269 320 0.147929 +270 320 0.065746 +271 320 0.065746 +272 320 0.591716 +273 320 0.591716 +274 320 0.147929 +275 320 0.065746 +277 320 0.065746 +278 320 0.591716 +280 320 0.065746 +281 320 0.065746 +282 320 0.065746 +283 320 0.147929 +284 320 0.591716 +287 320 0.591716 +290 320 0.591716 +292 320 0.065746 +293 320 0.591716 +294 320 0.591716 +295 320 0.065746 +296 320 0.147929 +297 320 0.147929 +298 320 0.147929 +305 320 0.065746 +308 320 0.147929 +309 320 0.065746 +310 320 0.065746 +311 320 0.147929 +312 320 0.065746 +313 320 0.065746 +314 320 0.147929 +315 320 0.591716 +316 320 0.065746 +318 320 0.147929 +320 320 72.252772 +347 320 -107.006608 +353 320 -21.975654 +354 320 -123.657317 +359 320 -8.964040 +372 320 -48.336388 +373 320 -74.493979 +376 320 -3.738565 +378 320 -43.928541 +379 320 -302.626422 +380 320 -13.003624 +381 320 -10.279640 +384 320 -9.930397 +398 320 -118.428482 +399 320 -2.016299 +401 320 -13.692473 +402 320 -3.901208 +403 320 -7.265735 +404 320 -438.154622 +405 320 -26.720991 +406 320 -15.590913 +409 320 -9.911904 +423 320 -16.794290 +424 320 -101.296685 +426 320 -8.440456 +427 320 -34.747147 +429 320 -428.778681 +430 320 -196.938105 +431 320 -49.551644 +434 320 -9.906493 +449 320 -110.063739 +450 320 -15.310282 +452 320 -42.487619 +454 320 -364.556570 +455 320 -429.576182 +456 320 -96.484007 +459 320 -9.914146 +472 320 -37.099611 +474 320 -6.227886 +475 320 -144.869867 +476 320 -23.790392 +477 320 -25.648447 +478 320 -91.692890 +479 320 -171.916469 +480 320 -626.098008 +481 320 -220.026597 +484 320 -9.934887 +497 320 -15.195577 +498 320 -21.856718 +500 320 -171.564225 +2 321 0.065746 +3 321 0.065746 +5 321 0.147929 +6 321 0.147929 +7 321 0.591716 +8 321 0.147929 +9 321 0.065746 +16 321 0.147929 +17 321 0.147929 +18 321 0.147929 +19 321 0.065746 +20 321 0.065746 +21 321 0.065746 +22 321 0.147929 +23 321 0.147929 +24 321 0.147929 +25 321 0.065746 +31 321 0.147929 +32 321 0.147929 +33 321 0.065746 +34 321 0.065746 +36 321 0.147929 +37 321 0.147929 +38 321 0.147929 +39 321 0.591716 +40 321 0.147929 +42 321 0.147929 +43 321 0.147929 +44 321 0.147929 +46 321 0.065746 +47 321 0.591716 +51 321 0.147929 +52 321 0.147929 +53 321 0.147929 +54 321 0.147929 +55 321 0.065746 +60 321 0.065746 +66 321 0.065746 +67 321 0.065746 +68 321 0.065746 +69 321 0.147929 +70 321 0.065746 +77 321 0.065746 +79 321 0.147929 +80 321 0.147929 +81 321 0.065746 +82 321 0.591716 +83 321 0.591716 +84 321 0.147929 +85 321 0.147929 +87 321 0.065746 +89 321 0.147929 +90 321 0.147929 +91 321 0.065746 +92 321 0.065746 +95 321 0.591716 +96 321 0.591716 +97 321 0.065746 +98 321 0.591716 +100 321 0.065746 +101 321 0.065746 +102 321 0.147929 +103 321 0.147929 +104 321 0.065746 +106 321 0.147929 +107 321 0.591716 +108 321 0.147929 +109 321 0.591716 +110 321 0.591716 +112 321 0.591716 +115 321 0.065746 +116 321 0.147929 +117 321 0.065746 +118 321 0.147929 +119 321 0.591716 +120 321 0.065746 +121 321 0.065746 +122 321 0.147929 +123 321 0.591716 +124 321 0.147929 +125 321 0.065746 +126 321 0.147929 +129 321 0.147929 +131 321 0.147929 +132 321 0.591716 +134 321 0.147929 +135 321 0.591716 +136 321 0.147929 +137 321 0.147929 +138 321 0.147929 +140 321 0.147929 +141 321 0.147929 +143 321 0.147929 +145 321 0.147929 +146 321 0.591716 +148 321 0.147929 +150 321 0.147929 +152 321 0.065746 +154 321 0.147929 +155 321 0.147929 +156 321 0.147929 +157 321 0.147929 +159 321 0.147929 +160 321 0.147929 +161 321 0.147929 +162 321 0.147929 +163 321 0.147929 +164 321 0.147929 +166 321 0.065746 +167 321 0.147929 +168 321 0.147929 +169 321 0.065746 +172 321 0.065746 +173 321 0.591716 +174 321 0.147929 +175 321 0.147929 +176 321 0.147929 +178 321 0.147929 +179 321 0.147929 +180 321 0.147929 +182 321 0.147929 +183 321 0.065746 +185 321 0.147929 +186 321 0.147929 +187 321 0.065746 +188 321 0.147929 +190 321 0.147929 +191 321 0.065746 +192 321 0.147929 +193 321 0.147929 +194 321 0.147929 +195 321 0.065746 +196 321 0.065746 +199 321 0.065746 +201 321 0.147929 +202 321 0.147929 +203 321 0.065746 +204 321 0.147929 +205 321 0.147929 +206 321 0.065746 +207 321 0.147929 +208 321 0.147929 +209 321 0.147929 +211 321 0.147929 +212 321 0.147929 +213 321 0.147929 +214 321 0.065746 +215 321 0.147929 +216 321 0.065746 +217 321 0.065746 +218 321 0.065746 +223 321 0.065746 +224 321 0.065746 +227 321 0.065746 +228 321 0.147929 +230 321 0.065746 +231 321 0.147929 +232 321 0.147929 +234 321 0.147929 +235 321 0.065746 +237 321 0.147929 +239 321 0.147929 +240 321 0.065746 +241 321 0.147929 +242 321 0.147929 +244 321 0.147929 +245 321 0.147929 +247 321 0.065746 +248 321 0.147929 +250 321 0.147929 +251 321 0.147929 +252 321 0.065746 +253 321 0.147929 +254 321 0.147929 +255 321 0.147929 +256 321 0.065746 +257 321 0.065746 +258 321 0.147929 +259 321 0.147929 +261 321 0.591716 +262 321 0.591716 +263 321 0.065746 +265 321 0.147929 +266 321 0.147929 +267 321 0.147929 +268 321 0.065746 +269 321 0.147929 +270 321 0.147929 +271 321 0.065746 +272 321 0.065746 +274 321 0.147929 +275 321 0.147929 +277 321 0.147929 +279 321 0.147929 +280 321 0.147929 +281 321 0.147929 +282 321 0.147929 +283 321 0.147929 +284 321 0.065746 +288 321 0.065746 +289 321 0.147929 +290 321 0.147929 +292 321 0.147929 +293 321 0.147929 +294 321 0.147929 +296 321 0.147929 +297 321 0.147929 +298 321 0.147929 +300 321 0.147929 +302 321 0.065746 +304 321 0.147929 +305 321 0.065746 +306 321 0.147929 +307 321 0.065746 +308 321 0.147929 +309 321 0.147929 +310 321 0.147929 +311 321 0.147929 +312 321 0.065746 +313 321 0.065746 +314 321 0.147929 +315 321 0.147929 +316 321 0.147929 +317 321 0.065746 +318 321 0.591716 +321 321 48.108868 +347 321 -88.368077 +348 321 -113.315899 +349 321 -113.315931 +350 321 -113.315968 +351 321 -113.316008 +352 321 -113.316055 +353 321 -123.516496 +354 321 -265.642271 +355 321 -350.714688 +356 321 -410.926201 +357 321 -500.851283 +358 321 -623.354003 +359 321 -640.049159 +360 321 -1366.476080 +361 321 -5330.838312 +362 321 -875.271933 +369 321 -31.310650 +370 321 -32.960033 +371 321 -32.961726 +372 321 -32.963652 +373 321 -32.965835 +374 321 -32.968304 +375 321 -32.971093 +376 321 -32.974241 +377 321 -32.977796 +378 321 -34.820362 +379 321 -89.163000 +380 321 -102.741453 +381 321 -236.728718 +382 321 -176.383577 +383 321 -597.127721 +384 321 -1793.308912 +385 321 -1865.664033 +386 321 -3384.385132 +387 321 -245.873444 +402 321 -29.030803 +403 321 -33.391322 +404 321 -37.215117 +405 321 -93.480666 +406 321 -925.219725 +407 321 -1719.480166 +408 321 -1246.624657 +409 321 -694.964178 +410 321 -1255.742803 +411 321 -2387.823106 +412 321 -237.586924 +426 321 -22.348651 +427 321 -33.725919 +428 321 -150.554386 +429 321 -279.388461 +430 321 -1259.234681 +431 321 -811.695388 +432 321 -94.220585 +433 321 -695.409377 +434 321 -840.525198 +435 321 -768.783217 +436 321 -2164.547833 +437 321 -229.286843 +438 321 -4.871875 +447 321 -29.186351 +448 321 -33.598353 +449 321 -33.624578 +450 321 -41.955586 +451 321 -70.412636 +452 321 -86.858025 +453 321 -133.003337 +454 321 -105.375127 +455 321 -37.785833 +456 321 -88.316592 +457 321 -820.284528 +458 321 -682.894277 +459 321 -740.043030 +460 321 -884.979556 +461 321 -1496.473510 +462 321 -195.705379 +463 321 -29.203476 +472 321 -3.046259 +475 321 -68.505294 +476 321 -77.717536 +477 321 -50.189813 +478 321 -12.413093 +479 321 -45.210493 +480 321 -199.010695 +481 321 -749.370226 +482 321 -489.779890 +483 321 -487.616538 +484 321 -365.682981 +485 321 -1344.869053 +486 321 -1047.785536 +487 321 -105.410542 +488 321 -114.327382 +1 322 0.147929 +2 322 0.065746 +3 322 0.591716 +4 322 0.147929 +5 322 0.065746 +6 322 0.065746 +7 322 0.147929 +8 322 0.591716 +10 322 0.591716 +11 322 0.147929 +12 322 0.591716 +13 322 0.147929 +14 322 0.147929 +16 322 0.591716 +18 322 0.147929 +19 322 0.065746 +21 322 0.147929 +22 322 0.147929 +23 322 0.147929 +24 322 0.147929 +25 322 0.591716 +26 322 0.147929 +27 322 0.147929 +28 322 0.065746 +33 322 0.147929 +34 322 0.065746 +36 322 0.065746 +37 322 0.591716 +39 322 0.147929 +40 322 0.147929 +41 322 0.147929 +42 322 0.591716 +43 322 0.591716 +44 322 0.591716 +45 322 0.147929 +46 322 0.065746 +47 322 0.591716 +48 322 0.065746 +49 322 0.065746 +53 322 0.065746 +54 322 0.065746 +55 322 0.065746 +56 322 0.147929 +57 322 0.065746 +58 322 0.065746 +60 322 0.147929 +61 322 0.591716 +62 322 0.147929 +63 322 0.147929 +65 322 0.591716 +67 322 0.147929 +68 322 0.147929 +70 322 0.147929 +72 322 0.065746 +73 322 0.065746 +74 322 0.065746 +75 322 0.591716 +77 322 0.065746 +78 322 0.147929 +84 322 0.147929 +85 322 0.147929 +86 322 0.591716 +87 322 0.147929 +89 322 0.147929 +90 322 0.147929 +91 322 0.147929 +92 322 0.065746 +93 322 0.591716 +94 322 0.147929 +95 322 0.147929 +97 322 0.147929 +99 322 0.147929 +100 322 0.591716 +101 322 0.065746 +102 322 0.147929 +106 322 0.065746 +108 322 0.065746 +111 322 0.147929 +113 322 0.065746 +114 322 0.147929 +116 322 0.147929 +117 322 0.591716 +119 322 0.147929 +120 322 0.065746 +121 322 0.591716 +122 322 0.147929 +124 322 0.147929 +125 322 0.147929 +127 322 0.147929 +128 322 0.065746 +129 322 0.147929 +130 322 0.065746 +131 322 0.147929 +132 322 0.147929 +133 322 0.065746 +135 322 0.147929 +137 322 0.147929 +138 322 0.147929 +139 322 0.147929 +141 322 0.065746 +143 322 0.147929 +144 322 0.147929 +146 322 0.065746 +147 322 0.147929 +148 322 0.147929 +149 322 0.591716 +150 322 0.147929 +151 322 0.591716 +152 322 0.065746 +153 322 0.591716 +154 322 0.065746 +155 322 0.065746 +156 322 0.147929 +157 322 0.147929 +158 322 0.065746 +159 322 0.147929 +161 322 0.591716 +162 322 0.147929 +163 322 0.147929 +164 322 0.147929 +165 322 0.147929 +166 322 0.147929 +167 322 0.065746 +168 322 0.147929 +169 322 0.591716 +170 322 0.065746 +171 322 0.147929 +172 322 0.147929 +174 322 0.065746 +176 322 0.065746 +177 322 0.591716 +178 322 0.065746 +179 322 0.147929 +180 322 0.065746 +183 322 0.147929 +184 322 0.147929 +185 322 0.147929 +187 322 0.591716 +189 322 0.065746 +190 322 0.147929 +192 322 0.591716 +193 322 0.147929 +195 322 0.147929 +196 322 0.147929 +197 322 0.147929 +198 322 0.147929 +200 322 0.147929 +203 322 0.065746 +204 322 0.591716 +205 322 0.065746 +206 322 0.065746 +208 322 0.065746 +209 322 0.065746 +211 322 0.147929 +212 322 0.147929 +215 322 0.147929 +216 322 0.147929 +217 322 0.147929 +218 322 0.147929 +219 322 0.147929 +220 322 0.147929 +221 322 0.147929 +222 322 0.591716 +223 322 0.147929 +224 322 0.147929 +226 322 0.147929 +227 322 0.147929 +229 322 0.147929 +230 322 0.147929 +232 322 0.147929 +234 322 0.147929 +235 322 0.591716 +237 322 0.065746 +238 322 0.147929 +241 322 0.147929 +242 322 0.147929 +251 322 0.147929 +252 322 0.065746 +253 322 0.147929 +254 322 0.065746 +256 322 0.065746 +257 322 0.591716 +258 322 0.147929 +259 322 0.065746 +261 322 0.065746 +262 322 0.147929 +263 322 0.065746 +265 322 0.591716 +266 322 0.591716 +267 322 0.065746 +268 322 0.147929 +269 322 0.065746 +270 322 0.065746 +271 322 0.591716 +272 322 0.591716 +273 322 0.147929 +274 322 0.147929 +275 322 0.147929 +276 322 0.591716 +277 322 0.065746 +278 322 0.591716 +280 322 0.147929 +281 322 0.591716 +282 322 0.065746 +284 322 0.147929 +285 322 0.591716 +287 322 0.147929 +289 322 0.065746 +290 322 0.065746 +292 322 0.147929 +298 322 0.591716 +304 322 0.147929 +306 322 0.065746 +307 322 0.147929 +308 322 0.147929 +309 322 0.147929 +310 322 0.147929 +311 322 0.065746 +312 322 0.065746 +313 322 0.147929 +314 322 0.591716 +322 322 58.720859 +347 322 -76.853129 +353 322 -75.191261 +354 322 -25.594544 +355 322 -3.543964 +369 322 -5.236796 +371 322 -2.124525 +372 322 -85.606377 +376 322 -3.659999 +377 322 -0.497323 +378 322 -135.200273 +379 322 -53.861713 +380 322 -30.502196 +381 322 -6.018712 +394 322 -31.686759 +396 322 -26.261897 +397 322 -61.717469 +400 322 -8.070001 +401 322 -5.620560 +402 322 -85.989744 +403 322 -126.938908 +404 322 -52.746200 +405 322 -56.146069 +406 322 -2.225865 +419 322 -31.603158 +421 322 -84.336256 +422 322 -3.923426 +425 322 -13.910080 +426 322 -109.159672 +427 322 -168.778178 +428 322 -102.289106 +429 322 -85.700248 +430 322 -97.342948 +431 322 -25.602835 +444 322 -31.525807 +446 322 -88.571069 +449 322 -1.282085 +450 322 -12.856128 +451 322 -212.953874 +452 322 -148.153459 +453 322 -92.530879 +454 322 -217.014861 +455 322 -60.086601 +456 322 -15.562266 +469 322 -31.454989 +471 322 -111.676479 +472 322 -7.435874 +474 322 -14.374296 +475 322 -148.584846 +476 322 -196.523653 +477 322 -108.203545 +478 322 -232.559483 +479 322 -102.636588 +480 322 -128.180106 +481 322 -85.727728 +494 322 -31.390962 +496 322 -120.257848 +499 322 -87.154919 +500 322 -294.311257 +1 323 0.147929 +3 323 0.591716 +4 323 0.147929 +5 323 0.147929 +8 323 0.591716 +9 323 0.065746 +10 323 0.065746 +11 323 0.591716 +12 323 0.065746 +13 323 0.065746 +14 323 0.147929 +15 323 0.591716 +16 323 0.147929 +17 323 0.065746 +18 323 0.147929 +19 323 0.591716 +20 323 0.065746 +21 323 0.147929 +22 323 0.147929 +23 323 0.591716 +24 323 0.147929 +25 323 0.147929 +26 323 0.147929 +27 323 0.147929 +28 323 0.065746 +29 323 0.065746 +30 323 0.147929 +33 323 0.065746 +35 323 0.147929 +37 323 0.591716 +40 323 0.147929 +41 323 0.591716 +42 323 0.591716 +43 323 0.591716 +44 323 0.591716 +47 323 0.591716 +53 323 0.147929 +54 323 0.147929 +55 323 0.065746 +56 323 0.147929 +57 323 0.147929 +59 323 0.147929 +60 323 0.591716 +61 323 0.147929 +62 323 0.147929 +63 323 0.147929 +65 323 0.591716 +66 323 0.147929 +68 323 0.147929 +69 323 0.147929 +70 323 0.147929 +75 323 0.591716 +76 323 0.065746 +77 323 0.065746 +78 323 0.065746 +80 323 0.147929 +81 323 0.591716 +82 323 0.065746 +83 323 0.147929 +86 323 0.591716 +90 323 0.147929 +92 323 0.147929 +93 323 0.591716 +94 323 0.591716 +95 323 0.147929 +99 323 0.591716 +105 323 0.147929 +106 323 0.147929 +107 323 0.065746 +108 323 0.147929 +109 323 0.147929 +110 323 0.147929 +111 323 0.591716 +112 323 0.147929 +114 323 0.591716 +117 323 0.591716 +119 323 0.591716 +120 323 0.065746 +121 323 0.591716 +122 323 0.065746 +124 323 0.591716 +125 323 0.147929 +126 323 0.147929 +127 323 0.065746 +129 323 0.147929 +131 323 0.147929 +140 323 0.147929 +141 323 0.147929 +142 323 0.065746 +145 323 0.147929 +147 323 0.591716 +148 323 0.591716 +149 323 0.147929 +150 323 0.147929 +152 323 0.147929 +153 323 0.147929 +154 323 0.147929 +155 323 0.147929 +156 323 0.147929 +157 323 0.147929 +158 323 0.147929 +159 323 0.591716 +160 323 0.591716 +161 323 0.147929 +162 323 0.147929 +163 323 0.591716 +164 323 0.147929 +165 323 0.065746 +166 323 0.065746 +167 323 0.147929 +168 323 0.147929 +169 323 0.591716 +170 323 0.065746 +171 323 0.065746 +172 323 0.065746 +173 323 0.147929 +174 323 0.147929 +175 323 0.147929 +176 323 0.065746 +177 323 0.147929 +179 323 0.591716 +180 323 0.065746 +182 323 0.065746 +183 323 0.591716 +184 323 0.591716 +185 323 0.591716 +187 323 0.147929 +188 323 0.147929 +194 323 0.147929 +195 323 0.591716 +196 323 0.147929 +198 323 0.147929 +199 323 0.147929 +200 323 0.065746 +201 323 0.065746 +202 323 0.065746 +203 323 0.065746 +204 323 0.591716 +205 323 0.591716 +207 323 0.065746 +208 323 0.147929 +212 323 0.065746 +213 323 0.147929 +214 323 0.147929 +215 323 0.591716 +216 323 0.591716 +217 323 0.147929 +218 323 0.591716 +219 323 0.065746 +220 323 0.591716 +221 323 0.147929 +222 323 0.591716 +223 323 0.591716 +224 323 0.147929 +227 323 0.147929 +228 323 0.591716 +229 323 0.591716 +230 323 0.147929 +231 323 0.147929 +235 323 0.591716 +236 323 0.065746 +238 323 0.147929 +239 323 0.147929 +240 323 0.591716 +241 323 0.147929 +242 323 0.591716 +246 323 0.065746 +247 323 0.065746 +248 323 0.147929 +253 323 0.591716 +254 323 0.591716 +256 323 0.065746 +257 323 0.591716 +258 323 0.065746 +259 323 0.147929 +261 323 0.147929 +262 323 0.065746 +263 323 0.147929 +264 323 0.065746 +265 323 0.591716 +266 323 0.147929 +267 323 0.591716 +268 323 0.065746 +269 323 0.065746 +271 323 0.591716 +272 323 0.591716 +273 323 0.147929 +276 323 0.591716 +277 323 0.147929 +278 323 0.147929 +279 323 0.147929 +280 323 0.591716 +282 323 0.591716 +284 323 0.591716 +285 323 0.591716 +287 323 0.147929 +289 323 0.065746 +290 323 0.147929 +293 323 0.147929 +294 323 0.147929 +295 323 0.147929 +296 323 0.147929 +297 323 0.065746 +299 323 0.065746 +302 323 0.147929 +304 323 0.147929 +306 323 0.591716 +307 323 0.147929 +310 323 0.147929 +311 323 0.147929 +313 323 0.591716 +314 323 0.591716 +315 323 0.147929 +316 323 0.065746 +317 323 0.147929 +323 323 70.758354 +347 323 -23.064047 +354 323 -96.474867 +358 323 -11.070681 +359 323 -9.913490 +372 323 -28.134525 +378 323 -4.630047 +379 323 -124.037147 +383 323 -23.650922 +397 323 -18.650741 +398 323 -9.215161 +403 323 -44.516406 +404 323 -95.517961 +405 323 -18.732557 +406 323 -7.395374 +408 323 -24.039115 +423 323 -27.607258 +428 323 -73.466922 +429 323 -66.976666 +430 323 -122.179510 +431 323 -16.905398 +433 323 -24.464944 +448 323 -27.359408 +450 323 -3.806789 +453 323 -147.186790 +454 323 -34.196916 +455 323 -215.252510 +456 323 -36.840872 +457 323 -6.068628 +458 323 -18.860941 +473 323 -27.123078 +475 323 -33.814565 +478 323 -156.873800 +479 323 -113.782966 +480 323 -165.581045 +481 323 -45.735096 +482 323 -25.434182 +498 323 -14.542406 +499 323 -12.356503 +500 323 -41.282014 +1 324 0.065746 +3 324 0.591716 +5 324 0.065746 +6 324 0.065746 +7 324 0.147929 +8 324 0.065746 +9 324 0.065746 +10 324 0.065746 +11 324 0.147929 +12 324 0.147929 +13 324 0.147929 +14 324 0.147929 +15 324 0.147929 +16 324 0.147929 +17 324 0.591716 +20 324 0.147929 +21 324 0.591716 +22 324 0.147929 +23 324 0.147929 +24 324 0.147929 +25 324 0.591716 +26 324 0.147929 +27 324 0.591716 +28 324 0.147929 +29 324 0.065746 +30 324 0.147929 +31 324 0.147929 +32 324 0.147929 +33 324 0.065746 +34 324 0.147929 +35 324 0.591716 +36 324 0.147929 +37 324 0.591716 +41 324 0.065746 +43 324 0.591716 +44 324 0.147929 +45 324 0.147929 +46 324 0.147929 +47 324 0.147929 +48 324 0.147929 +49 324 0.147929 +50 324 0.147929 +52 324 0.065746 +53 324 0.147929 +54 324 0.147929 +55 324 0.591716 +56 324 0.147929 +57 324 0.147929 +58 324 0.147929 +59 324 0.147929 +60 324 0.065746 +61 324 0.591716 +62 324 0.065746 +63 324 0.065746 +64 324 0.147929 +65 324 0.591716 +66 324 0.147929 +67 324 0.147929 +68 324 0.065746 +69 324 0.065746 +70 324 0.065746 +71 324 0.147929 +72 324 0.147929 +73 324 0.065746 +74 324 0.147929 +75 324 0.591716 +77 324 0.065746 +78 324 0.147929 +79 324 0.065746 +82 324 0.147929 +83 324 0.065746 +84 324 0.065746 +85 324 0.147929 +88 324 0.065746 +89 324 0.591716 +90 324 0.147929 +91 324 0.147929 +92 324 0.147929 +93 324 0.147929 +94 324 0.147929 +96 324 0.147929 +97 324 0.591716 +99 324 0.147929 +100 324 0.147929 +101 324 0.147929 +102 324 0.591716 +103 324 0.147929 +104 324 0.065746 +105 324 0.147929 +106 324 0.147929 +107 324 0.147929 +108 324 0.147929 +109 324 0.147929 +110 324 0.147929 +111 324 0.591716 +112 324 0.147929 +113 324 0.147929 +114 324 0.147929 +115 324 0.147929 +116 324 0.591716 +117 324 0.591716 +118 324 0.147929 +119 324 0.147929 +120 324 0.065746 +121 324 0.591716 +122 324 0.591716 +123 324 0.591716 +124 324 0.147929 +125 324 0.147929 +127 324 0.147929 +128 324 0.147929 +129 324 0.591716 +130 324 0.065746 +131 324 0.147929 +132 324 0.147929 +134 324 0.147929 +135 324 0.591716 +137 324 0.147929 +138 324 0.147929 +139 324 0.147929 +140 324 0.147929 +141 324 0.591716 +144 324 0.147929 +145 324 0.147929 +146 324 0.147929 +147 324 0.147929 +148 324 0.147929 +149 324 0.591716 +150 324 0.147929 +151 324 0.147929 +152 324 0.147929 +153 324 0.591716 +154 324 0.147929 +155 324 0.147929 +156 324 0.147929 +157 324 0.147929 +158 324 0.147929 +159 324 0.147929 +160 324 0.591716 +161 324 0.147929 +162 324 0.147929 +163 324 0.147929 +164 324 0.147929 +165 324 0.147929 +166 324 0.065746 +169 324 0.147929 +170 324 0.147929 +171 324 0.147929 +173 324 0.147929 +174 324 0.065746 +176 324 0.147929 +177 324 0.147929 +178 324 0.147929 +179 324 0.147929 +180 324 0.147929 +181 324 0.065746 +183 324 0.591716 +184 324 0.147929 +188 324 0.147929 +189 324 0.147929 +190 324 0.147929 +192 324 0.591716 +193 324 0.147929 +194 324 0.147929 +195 324 0.591716 +196 324 0.065746 +198 324 0.147929 +200 324 0.147929 +201 324 0.147929 +202 324 0.147929 +203 324 0.147929 +204 324 0.147929 +206 324 0.147929 +210 324 0.147929 +211 324 0.065746 +212 324 0.147929 +213 324 0.065746 +214 324 0.065746 +215 324 0.591716 +217 324 0.147929 +218 324 0.065746 +219 324 0.147929 +220 324 0.147929 +221 324 0.147929 +222 324 0.147929 +224 324 0.147929 +227 324 0.147929 +228 324 0.147929 +229 324 0.147929 +230 324 0.147929 +231 324 0.147929 +232 324 0.147929 +233 324 0.591716 +235 324 0.591716 +237 324 0.147929 +238 324 0.591716 +240 324 0.147929 +241 324 0.065746 +242 324 0.065746 +243 324 0.147929 +244 324 0.065746 +248 324 0.147929 +251 324 0.147929 +252 324 0.147929 +253 324 0.591716 +254 324 0.147929 +256 324 0.147929 +257 324 0.591716 +258 324 0.147929 +262 324 0.591716 +264 324 0.147929 +265 324 0.147929 +266 324 0.147929 +267 324 0.065746 +268 324 0.065746 +269 324 0.065746 +270 324 0.065746 +271 324 0.147929 +272 324 0.591716 +273 324 0.147929 +274 324 0.065746 +275 324 0.147929 +277 324 0.147929 +278 324 0.591716 +280 324 0.147929 +281 324 0.147929 +282 324 0.591716 +284 324 0.591716 +285 324 0.591716 +286 324 0.065746 +287 324 0.147929 +289 324 0.147929 +290 324 0.147929 +291 324 0.147929 +293 324 0.147929 +294 324 0.147929 +296 324 0.147929 +297 324 0.147929 +302 324 0.065746 +303 324 0.065746 +304 324 0.147929 +306 324 0.591716 +308 324 0.147929 +309 324 0.147929 +310 324 0.591716 +311 324 0.147929 +312 324 0.065746 +313 324 0.147929 +315 324 0.147929 +317 324 0.065746 +318 324 0.591716 +324 324 66.873141 +347 324 -60.365060 +348 324 -5.215303 +353 324 -3.133489 +354 324 -132.551223 +355 324 -6.344363 +369 324 -8.319198 +372 324 -2.733429 +373 324 -70.172666 +374 324 -2.222642 +376 324 -9.997203 +378 324 -7.093856 +379 324 -181.652656 +380 324 -60.620459 +381 324 -47.665074 +394 324 -31.742597 +395 324 -17.888636 +398 324 -6.495439 +399 324 -66.287764 +401 324 -28.005756 +402 324 -8.282058 +404 324 -87.950912 +405 324 -202.372894 +406 324 -92.654477 +420 324 -24.607922 +421 324 -23.604922 +424 324 -14.836421 +425 324 -55.616527 +427 324 -35.152249 +429 324 -41.679613 +430 324 -466.328086 +431 324 -156.949707 +432 324 -37.489993 +446 324 -19.283187 +447 324 -27.442303 +450 324 -41.136869 +451 324 -38.677891 +452 324 -8.721523 +453 324 -39.238532 +454 324 -80.601995 +455 324 -528.518112 +456 324 -331.362070 +457 324 -102.216528 +472 324 -181.192651 +473 324 -46.332007 +475 324 -37.612808 +476 324 -88.120256 +477 324 -17.383428 +478 324 -35.072555 +479 324 -70.612651 +480 324 -120.901471 +481 324 -714.940414 +482 324 -192.095603 +498 324 -171.754795 +499 324 -51.668591 +500 324 -56.120640 +51 325 0.147929 +65 325 0.147929 +75 325 0.591716 +90 325 0.147929 +92 325 0.147929 +93 325 0.591716 +95 325 0.147929 +96 325 0.591716 +97 325 0.147929 +100 325 0.065746 +101 325 0.147929 +132 325 0.065746 +133 325 0.065746 +134 325 0.147929 +135 325 0.147929 +136 325 0.147929 +137 325 0.147929 +138 325 0.147929 +139 325 0.147929 +141 325 0.065746 +142 325 0.147929 +143 325 0.147929 +144 325 0.591716 +163 325 0.065746 +164 325 0.147929 +166 325 0.065746 +171 325 0.147929 +172 325 0.065746 +174 325 0.065746 +175 325 0.065746 +176 325 0.147929 +177 325 0.147929 +178 325 0.147929 +179 325 0.147929 +180 325 0.147929 +182 325 0.065746 +183 325 0.147929 +184 325 0.147929 +185 325 0.147929 +186 325 0.147929 +188 325 0.065746 +189 325 0.147929 +190 325 0.065746 +192 325 0.147929 +193 325 0.147929 +194 325 0.147929 +196 325 0.147929 +197 325 0.065746 +198 325 0.065746 +199 325 0.065746 +202 325 0.147929 +203 325 0.147929 +206 325 0.147929 +209 325 0.065746 +211 325 0.065746 +212 325 0.147929 +234 325 0.591716 +237 325 0.065746 +239 325 0.147929 +241 325 0.147929 +242 325 0.147929 +244 325 0.147929 +246 325 0.147929 +247 325 0.147929 +248 325 0.065746 +250 325 0.147929 +252 325 0.591716 +253 325 0.147929 +256 325 0.065746 +257 325 0.147929 +258 325 0.065746 +262 325 0.147929 +263 325 0.065746 +264 325 0.147929 +265 325 0.147929 +266 325 0.591716 +267 325 0.065746 +268 325 0.147929 +269 325 0.147929 +271 325 0.591716 +273 325 0.065746 +274 325 0.591716 +275 325 0.147929 +277 325 0.147929 +279 325 0.147929 +280 325 0.147929 +282 325 0.065746 +283 325 0.147929 +284 325 0.065746 +285 325 0.147929 +291 325 0.147929 +292 325 0.591716 +293 325 0.065746 +294 325 0.147929 +295 325 0.147929 +296 325 0.065746 +297 325 0.147929 +298 325 0.147929 +299 325 0.147929 +301 325 0.591716 +302 325 0.065746 +304 325 0.591716 +305 325 0.147929 +306 325 0.065746 +307 325 0.147929 +308 325 0.591716 +310 325 0.147929 +311 325 0.147929 +315 325 0.065746 +316 325 0.065746 +317 325 0.065746 +318 325 0.065746 +325 325 27.479113 +346 325 -118.687710 +347 325 -88.678847 +352 325 -8.217393 +353 325 -10.854273 +356 325 -9.210141 +357 325 -34.050566 +358 325 -34.138765 +359 325 -2.735319 +370 325 -23.858931 +371 325 -207.473156 +375 325 -12.197711 +376 325 -15.629348 +377 325 -75.199659 +378 325 -126.556522 +379 325 -81.109827 +380 325 -33.907873 +381 325 -24.764109 +395 325 -235.839810 +397 325 -4.302801 +398 325 -18.544780 +399 325 -120.863410 +400 325 -154.096115 +401 325 -169.867909 +402 325 -121.071144 +403 325 -53.933215 +404 325 -33.372370 +405 325 -33.400622 +406 325 -0.501224 +419 325 -181.012810 +420 325 -171.306034 +421 325 -230.408880 +422 325 -228.734492 +423 325 -272.459559 +424 325 -254.190528 +425 325 -363.217969 +426 325 -355.239930 +427 325 -307.544191 +428 325 -307.569180 +429 325 -307.597483 +430 325 -89.527963 +431 325 -20.018056 +444 325 -3444.749699 +445 325 -1060.376963 +446 325 -568.116037 +447 325 -386.614564 +448 325 -307.447216 +449 325 -182.658255 +450 325 -23.213246 +469 325 -2082.561077 +470 325 -1216.997472 +471 325 -657.691581 +472 325 -416.111867 +473 325 -269.478363 +474 325 -231.753823 +475 325 -84.309998 +476 325 -29.480545 +477 325 -29.491743 +478 325 -20.455665 +479 325 -12.257399 +494 325 -1365.143816 +495 325 -814.263377 +496 325 -819.597366 +497 325 -556.293756 +498 325 -300.875539 +499 325 -195.349667 +500 325 -129.385503 +31 326 0.065746 +32 326 0.147929 +33 326 0.147929 +35 326 0.591716 +37 326 0.147929 +38 326 0.065746 +40 326 0.591716 +49 326 0.147929 +50 326 0.065746 +51 326 0.147929 +52 326 0.147929 +53 326 0.147929 +54 326 0.147929 +55 326 0.591716 +56 326 0.147929 +57 326 0.147929 +58 326 0.591716 +60 326 0.147929 +61 326 0.591716 +62 326 0.065746 +81 326 0.591716 +82 326 0.147929 +84 326 0.065746 +85 326 0.147929 +89 326 0.591716 +90 326 0.147929 +91 326 0.147929 +92 326 0.147929 +94 326 0.147929 +96 326 0.147929 +97 326 0.591716 +98 326 0.147929 +99 326 0.147929 +100 326 0.147929 +101 326 0.147929 +105 326 0.065746 +106 326 0.147929 +107 326 0.147929 +108 326 0.147929 +109 326 0.147929 +110 326 0.147929 +111 326 0.591716 +112 326 0.065746 +113 326 0.147929 +115 326 0.147929 +117 326 0.147929 +118 326 0.147929 +119 326 0.591716 +120 326 0.147929 +121 326 0.065746 +124 326 0.591716 +125 326 0.147929 +126 326 0.147929 +127 326 0.147929 +129 326 0.147929 +130 326 0.065746 +131 326 0.065746 +132 326 0.147929 +135 326 0.147929 +136 326 0.147929 +138 326 0.065746 +139 326 0.147929 +141 326 0.147929 +142 326 0.065746 +143 326 0.147929 +144 326 0.147929 +145 326 0.065746 +148 326 0.147929 +149 326 0.591716 +150 326 0.591716 +151 326 0.147929 +152 326 0.147929 +153 326 0.591716 +154 326 0.147929 +156 326 0.147929 +158 326 0.147929 +159 326 0.147929 +160 326 0.591716 +161 326 0.147929 +162 326 0.147929 +163 326 0.147929 +164 326 0.147929 +165 326 0.147929 +166 326 0.065746 +167 326 0.147929 +168 326 0.147929 +169 326 0.147929 +171 326 0.147929 +172 326 0.147929 +173 326 0.065746 +174 326 0.147929 +175 326 0.065746 +176 326 0.147929 +177 326 0.591716 +178 326 0.591716 +179 326 0.065746 +181 326 0.065746 +182 326 0.065746 +184 326 0.591716 +185 326 0.591716 +188 326 0.147929 +195 326 0.065746 +199 326 0.591716 +201 326 0.147929 +203 326 0.065746 +210 326 0.591716 +213 326 0.147929 +218 326 0.147929 +220 326 0.591716 +221 326 0.591716 +224 326 0.147929 +229 326 0.147929 +230 326 0.591716 +232 326 0.065746 +233 326 0.065746 +234 326 0.147929 +235 326 0.591716 +239 326 0.065746 +241 326 0.065746 +242 326 0.147929 +244 326 0.147929 +246 326 0.147929 +248 326 0.147929 +252 326 0.147929 +253 326 0.591716 +254 326 0.147929 +257 326 0.147929 +260 326 0.147929 +262 326 0.147929 +263 326 0.065746 +268 326 0.147929 +269 326 0.147929 +271 326 0.591716 +272 326 0.147929 +273 326 0.591716 +274 326 0.147929 +277 326 0.147929 +278 326 0.591716 +280 326 0.147929 +281 326 0.147929 +283 326 0.147929 +284 326 0.147929 +285 326 0.591716 +287 326 0.147929 +289 326 0.147929 +290 326 0.065746 +292 326 0.065746 +293 326 0.147929 +294 326 0.065746 +295 326 0.065746 +296 326 0.591716 +297 326 0.147929 +300 326 0.147929 +301 326 0.147929 +326 326 46.011105 +347 326 -89.670052 +354 326 -62.992106 +359 326 -9.006622 +372 326 -60.652994 +373 326 -41.663151 +376 326 -32.855001 +378 326 -4.847621 +379 326 -78.388559 +380 326 -12.398140 +384 326 -9.951426 +398 326 -100.663414 +401 326 -120.511329 +403 326 -1.227490 +404 326 -76.371472 +405 326 -26.226646 +406 326 -21.779047 +409 326 -9.905555 +423 326 -67.966912 +424 326 -31.073813 +426 326 -111.359594 +427 326 -7.371119 +429 326 -97.026642 +430 326 -132.052261 +431 326 -26.359435 +434 326 -9.872983 +449 326 -97.455265 +450 326 -9.235812 +452 326 -117.041863 +454 326 -85.455525 +455 326 -302.339183 +456 326 -49.866680 +459 326 -9.853608 +474 326 -90.850528 +475 326 -39.325856 +476 326 -19.046689 +477 326 -115.447107 +479 326 -65.317964 +480 326 -330.802842 +481 326 -92.915377 +484 326 -9.847370 +499 326 -5.904328 +500 326 -114.191025 +3 327 0.591716 +5 327 0.591716 +8 327 0.591716 +10 327 0.065746 +12 327 0.147929 +13 327 0.065746 +14 327 0.591716 +15 327 0.147929 +19 327 0.147929 +22 327 0.591716 +23 327 0.065746 +25 327 0.591716 +31 327 0.147929 +32 327 0.065746 +34 327 0.065746 +40 327 0.591716 +42 327 0.591716 +44 327 0.591716 +53 327 0.065746 +54 327 0.147929 +56 327 0.147929 +57 327 0.591716 +60 327 0.591716 +63 327 0.147929 +64 327 0.147929 +65 327 0.591716 +66 327 0.147929 +67 327 0.147929 +68 327 0.147929 +70 327 0.147929 +72 327 0.591716 +73 327 0.147929 +75 327 0.591716 +77 327 0.147929 +78 327 0.147929 +80 327 0.147929 +81 327 0.147929 +82 327 0.147929 +85 327 0.065746 +86 327 0.591716 +87 327 0.147929 +89 327 0.147929 +90 327 0.065746 +91 327 0.065746 +92 327 0.065746 +93 327 0.591716 +94 327 0.591716 +95 327 0.147929 +97 327 0.147929 +99 327 0.147929 +100 327 0.147929 +101 327 0.147929 +103 327 0.065746 +104 327 0.065746 +105 327 0.591716 +108 327 0.065746 +111 327 0.147929 +112 327 0.147929 +113 327 0.147929 +114 327 0.147929 +119 327 0.147929 +120 327 0.065746 +121 327 0.591716 +122 327 0.065746 +124 327 0.591716 +125 327 0.591716 +129 327 0.591716 +132 327 0.147929 +133 327 0.147929 +135 327 0.591716 +137 327 0.147929 +138 327 0.065746 +141 327 0.065746 +145 327 0.147929 +146 327 0.065746 +148 327 0.147929 +149 327 0.147929 +150 327 0.147929 +151 327 0.147929 +152 327 0.065746 +153 327 0.147929 +154 327 0.147929 +155 327 0.591716 +156 327 0.147929 +157 327 0.065746 +158 327 0.147929 +160 327 0.065746 +161 327 0.147929 +163 327 0.147929 +164 327 0.147929 +165 327 0.147929 +166 327 0.147929 +167 327 0.065746 +168 327 0.065746 +169 327 0.147929 +171 327 0.065746 +172 327 0.147929 +173 327 0.147929 +174 327 0.065746 +176 327 0.147929 +177 327 0.147929 +179 327 0.147929 +180 327 0.147929 +183 327 0.591716 +184 327 0.147929 +185 327 0.591716 +187 327 0.147929 +188 327 0.147929 +189 327 0.591716 +190 327 0.065746 +192 327 0.147929 +195 327 0.591716 +196 327 0.147929 +197 327 0.065746 +199 327 0.147929 +200 327 0.591716 +201 327 0.065746 +203 327 0.147929 +204 327 0.147929 +205 327 0.147929 +206 327 0.147929 +208 327 0.147929 +210 327 0.065746 +211 327 0.065746 +212 327 0.147929 +213 327 0.065746 +214 327 0.147929 +215 327 0.147929 +216 327 0.147929 +217 327 0.147929 +218 327 0.147929 +220 327 0.065746 +221 327 0.147929 +222 327 0.147929 +223 327 0.147929 +224 327 0.147929 +227 327 0.591716 +228 327 0.147929 +229 327 0.591716 +230 327 0.147929 +231 327 0.147929 +234 327 0.147929 +235 327 0.591716 +237 327 0.065746 +240 327 0.591716 +242 327 0.147929 +250 327 0.591716 +251 327 0.591716 +253 327 0.147929 +254 327 0.065746 +258 327 0.147929 +259 327 0.147929 +261 327 0.065746 +262 327 0.147929 +263 327 0.065746 +264 327 0.147929 +265 327 0.591716 +266 327 0.591716 +267 327 0.591716 +268 327 0.147929 +269 327 0.065746 +270 327 0.065746 +271 327 0.147929 +272 327 0.147929 +273 327 0.065746 +274 327 0.065746 +276 327 0.147929 +277 327 0.065746 +278 327 0.147929 +280 327 0.147929 +281 327 0.065746 +282 327 0.591716 +284 327 0.147929 +285 327 0.591716 +287 327 0.147929 +289 327 0.147929 +290 327 0.147929 +291 327 0.147929 +292 327 0.147929 +293 327 0.147929 +294 327 0.147929 +295 327 0.065746 +296 327 0.065746 +297 327 0.147929 +299 327 0.591716 +302 327 0.065746 +304 327 0.147929 +305 327 0.147929 +306 327 0.147929 +307 327 0.147929 +308 327 0.147929 +309 327 0.147929 +310 327 0.147929 +311 327 0.065746 +312 327 0.065746 +313 327 0.065746 +314 327 0.591716 +315 327 0.065746 +316 327 0.147929 +318 327 0.147929 +327 327 58.409534 +347 327 -61.189850 +353 327 -40.843715 +354 327 -21.107407 +358 327 -7.979659 +359 327 -2.394141 +369 327 -22.287056 +372 327 -71.068704 +378 327 -78.028399 +379 327 -52.208857 +383 327 -11.856786 +394 327 -134.435502 +397 327 -70.767550 +403 327 -122.513746 +404 327 -41.027230 +405 327 -10.058470 +406 327 -20.030003 +407 327 -3.792852 +408 327 -8.437103 +419 327 -133.342423 +422 327 -70.494023 +428 327 -129.188632 +429 327 -46.957399 +430 327 -209.797665 +431 327 -16.956080 +432 327 -12.630400 +444 327 -64.001322 +445 327 -68.252693 +447 327 -70.248830 +450 327 -3.828471 +452 327 -40.883181 +453 327 -126.281570 +454 327 -153.605633 +455 327 -203.107617 +456 327 -27.938387 +457 327 -9.543281 +470 327 -131.175656 +472 327 -70.032586 +475 327 -29.477206 +477 327 -115.199437 +478 327 -116.095174 +479 327 -269.557201 +480 327 -103.379529 +481 327 -29.458433 +495 327 -130.112415 +497 327 -51.893861 +498 327 -17.951957 +500 327 -83.825070 +15 328 0.065746 +17 328 0.147929 +20 328 0.065746 +21 328 0.065746 +22 328 0.147929 +23 328 0.065746 +27 328 0.147929 +28 328 0.065746 +32 328 0.147929 +34 328 0.147929 +36 328 0.147929 +37 328 0.147929 +38 328 0.147929 +40 328 0.147929 +42 328 0.147929 +43 328 0.591716 +44 328 0.147929 +50 328 0.065746 +52 328 0.147929 +54 328 0.065746 +58 328 0.591716 +60 328 0.147929 +61 328 0.591716 +62 328 0.065746 +63 328 0.065746 +67 328 0.065746 +71 328 0.065746 +98 328 0.147929 +100 328 0.065746 +101 328 0.065746 +102 328 0.147929 +103 328 0.065746 +106 328 0.147929 +107 328 0.147929 +108 328 0.147929 +109 328 0.147929 +110 328 0.065746 +112 328 0.147929 +113 328 0.065746 +116 328 0.065746 +117 328 0.147929 +118 328 0.147929 +119 328 0.591716 +120 328 0.065746 +133 328 0.147929 +134 328 0.591716 +135 328 0.591716 +137 328 0.147929 +138 328 0.147929 +139 328 0.065746 +140 328 0.591716 +142 328 0.147929 +143 328 0.065746 +146 328 0.591716 +152 328 0.147929 +153 328 0.065746 +154 328 0.147929 +155 328 0.591716 +156 328 0.147929 +157 328 0.147929 +159 328 0.065746 +160 328 0.147929 +161 328 0.591716 +164 328 0.065746 +166 328 0.065746 +167 328 0.147929 +168 328 0.147929 +169 328 0.147929 +170 328 0.065746 +191 328 0.065746 +193 328 0.065746 +194 328 0.147929 +195 328 0.147929 +197 328 0.065746 +198 328 0.147929 +201 328 0.065746 +202 328 0.147929 +203 328 0.147929 +204 328 0.147929 +205 328 0.065746 +206 328 0.065746 +208 328 0.065746 +211 328 0.147929 +212 328 0.147929 +213 328 0.065746 +214 328 0.147929 +215 328 0.065746 +217 328 0.147929 +220 328 0.147929 +221 328 0.147929 +222 328 0.147929 +223 328 0.147929 +224 328 0.147929 +227 328 0.065746 +228 328 0.147929 +229 328 0.591716 +230 328 0.065746 +231 328 0.147929 +232 328 0.065746 +235 328 0.147929 +238 328 0.065746 +239 328 0.065746 +240 328 0.065746 +250 328 0.147929 +251 328 0.147929 +252 328 0.147929 +253 328 0.065746 +254 328 0.147929 +255 328 0.147929 +257 328 0.065746 +258 328 0.147929 +259 328 0.147929 +261 328 0.147929 +262 328 0.065746 +263 328 0.065746 +265 328 0.065746 +266 328 0.065746 +267 328 0.147929 +269 328 0.147929 +270 328 0.065746 +271 328 0.147929 +272 328 0.147929 +274 328 0.591716 +275 328 0.147929 +277 328 0.065746 +278 328 0.147929 +279 328 0.147929 +281 328 0.147929 +282 328 0.147929 +283 328 0.065746 +284 328 0.147929 +285 328 0.591716 +286 328 0.147929 +287 328 0.147929 +288 328 0.147929 +289 328 0.147929 +290 328 0.147929 +292 328 0.147929 +293 328 0.147929 +294 328 0.147929 +296 328 0.147929 +297 328 0.147929 +298 328 0.147929 +299 328 0.065746 +304 328 0.147929 +306 328 0.147929 +307 328 0.065746 +308 328 0.147929 +309 328 0.147929 +310 328 0.147929 +311 328 0.065746 +312 328 0.065746 +313 328 0.065746 +314 328 0.147929 +316 328 0.065746 +328 328 37.047333 +347 328 -134.079378 +348 328 -182.891903 +349 328 -183.033438 +350 328 -163.584743 +351 328 -40.419129 +354 328 -63.678722 +355 328 -59.989778 +369 328 -31.406085 +370 328 -20.540189 +375 328 -19.608900 +376 328 -243.128916 +377 328 -256.717822 +378 328 -188.048239 +379 328 -209.275931 +380 328 -118.838704 +381 328 -145.274762 +382 328 -62.905452 +395 328 -12.522715 +396 328 -33.067422 +397 328 -33.072564 +398 328 -33.078394 +399 328 -33.084989 +400 328 -33.092440 +401 328 -33.100856 +402 328 -122.403960 +403 328 -162.333825 +404 328 -185.650735 +405 328 -348.305432 +406 328 -467.671338 +407 328 -311.664220 +408 328 -161.531887 +409 328 -12.386831 +428 328 -37.633950 +429 328 -66.238687 +430 328 -325.378021 +431 328 -533.483427 +432 328 -785.316395 +433 328 -1000.391507 +434 328 -789.107063 +435 328 -129.515460 +447 328 -6.149619 +448 328 -14.630050 +449 328 -14.630368 +450 328 -18.214062 +451 328 -29.257120 +452 328 -29.257795 +453 328 -29.258558 +454 328 -86.185547 +455 328 -95.071036 +456 328 -151.921862 +457 328 -325.158712 +458 328 -329.065858 +459 328 -799.722625 +460 328 -3324.816669 +461 328 -16.614976 +472 328 -7.894966 +475 328 -46.931798 +476 328 -66.112469 +477 328 -66.127276 +478 328 -86.454423 +479 328 -99.193671 +480 328 -99.223008 +481 328 -177.213541 +482 328 -90.380178 +483 328 -368.910566 +484 328 -755.093492 +485 328 -2135.740783 +486 328 -93.767783 +2 329 0.065746 +4 329 0.147929 +6 329 0.065746 +7 329 0.591716 +10 329 0.065746 +18 329 0.591716 +22 329 0.147929 +23 329 0.591716 +24 329 0.147929 +25 329 0.591716 +27 329 0.147929 +28 329 0.065746 +30 329 0.065746 +31 329 0.065746 +33 329 0.147929 +34 329 0.147929 +35 329 0.065746 +37 329 0.591716 +40 329 0.147929 +42 329 0.591716 +43 329 0.147929 +44 329 0.591716 +45 329 0.147929 +46 329 0.065746 +47 329 0.591716 +48 329 0.147929 +53 329 0.065746 +54 329 0.591716 +55 329 0.065746 +56 329 0.147929 +57 329 0.591716 +58 329 0.147929 +60 329 0.147929 +61 329 0.147929 +62 329 0.147929 +65 329 0.147929 +66 329 0.147929 +67 329 0.065746 +72 329 0.147929 +75 329 0.591716 +78 329 0.147929 +80 329 0.147929 +81 329 0.065746 +84 329 0.065746 +85 329 0.147929 +86 329 0.591716 +90 329 0.147929 +92 329 0.147929 +93 329 0.591716 +95 329 0.147929 +99 329 0.147929 +100 329 0.591716 +102 329 0.065746 +103 329 0.147929 +104 329 0.065746 +105 329 0.147929 +106 329 0.147929 +107 329 0.147929 +108 329 0.147929 +109 329 0.147929 +110 329 0.065746 +111 329 0.591716 +112 329 0.591716 +114 329 0.147929 +116 329 0.147929 +117 329 0.065746 +119 329 0.591716 +121 329 0.147929 +122 329 0.147929 +123 329 0.147929 +125 329 0.065746 +128 329 0.065746 +129 329 0.147929 +130 329 0.065746 +131 329 0.147929 +133 329 0.147929 +134 329 0.147929 +135 329 0.147929 +141 329 0.147929 +143 329 0.065746 +145 329 0.065746 +146 329 0.065746 +148 329 0.147929 +149 329 0.147929 +153 329 0.147929 +155 329 0.147929 +156 329 0.147929 +157 329 0.147929 +158 329 0.065746 +159 329 0.065746 +160 329 0.147929 +161 329 0.147929 +162 329 0.147929 +163 329 0.065746 +164 329 0.147929 +166 329 0.147929 +169 329 0.065746 +171 329 0.147929 +172 329 0.147929 +176 329 0.065746 +177 329 0.147929 +185 329 0.147929 +186 329 0.147929 +187 329 0.147929 +188 329 0.147929 +192 329 0.591716 +193 329 0.065746 +195 329 0.591716 +197 329 0.147929 +198 329 0.147929 +200 329 0.147929 +201 329 0.591716 +204 329 0.065746 +208 329 0.065746 +209 329 0.065746 +210 329 0.591716 +211 329 0.147929 +212 329 0.065746 +214 329 0.065746 +215 329 0.065746 +216 329 0.147929 +217 329 0.147929 +218 329 0.591716 +220 329 0.147929 +221 329 0.147929 +222 329 0.591716 +223 329 0.591716 +224 329 0.065746 +227 329 0.591716 +229 329 0.591716 +230 329 0.147929 +233 329 0.065746 +237 329 0.065746 +239 329 0.065746 +240 329 0.591716 +242 329 0.147929 +250 329 0.147929 +251 329 0.147929 +253 329 0.147929 +256 329 0.065746 +257 329 0.591716 +258 329 0.065746 +259 329 0.065746 +261 329 0.065746 +262 329 0.065746 +263 329 0.147929 +266 329 0.591716 +267 329 0.147929 +268 329 0.591716 +269 329 0.147929 +270 329 0.147929 +271 329 0.591716 +272 329 0.147929 +273 329 0.147929 +274 329 0.065746 +277 329 0.147929 +278 329 0.147929 +280 329 0.065746 +282 329 0.065746 +284 329 0.591716 +287 329 0.591716 +290 329 0.147929 +293 329 0.147929 +294 329 0.591716 +295 329 0.147929 +296 329 0.147929 +297 329 0.065746 +298 329 0.147929 +299 329 0.147929 +302 329 0.147929 +307 329 0.591716 +312 329 0.065746 +314 329 0.147929 +315 329 0.147929 +316 329 0.147929 +317 329 0.147929 +318 329 0.065746 +329 329 50.426442 +347 329 -180.062264 +353 329 -63.555126 +354 329 -39.255263 +355 329 -4.639244 +358 329 -22.571358 +359 329 -4.110451 +369 329 -6.905089 +372 329 -208.137968 +373 329 -0.051787 +376 329 -7.580381 +378 329 -122.557935 +379 329 -57.727976 +380 329 -60.269751 +381 329 -27.647658 +382 329 -3.453508 +383 329 -27.453056 +394 329 -40.693879 +395 329 -0.702882 +397 329 -54.333839 +398 329 -151.455675 +401 329 -28.106033 +402 329 -3.645195 +403 329 -135.508713 +404 329 -83.559398 +405 329 -146.427475 +406 329 -5.459721 +407 329 -32.330003 +420 329 -40.595791 +423 329 -203.458996 +426 329 -38.421560 +427 329 -38.823476 +428 329 -183.610940 +429 329 -121.811166 +430 329 -323.493086 +431 329 -51.460741 +432 329 -12.160039 +445 329 -9.611020 +446 329 -30.156641 +448 329 -201.206330 +450 329 -34.029723 +451 329 -56.644778 +452 329 -127.880036 +453 329 -117.961441 +454 329 -597.701485 +455 329 -104.386250 +456 329 -48.265519 +471 329 -21.746836 +472 329 -53.483548 +473 329 -61.813303 +474 329 -137.225425 +475 329 -143.287158 +476 329 -48.217277 +477 329 -182.029609 +478 329 -378.317597 +479 329 -402.992712 +480 329 -109.788941 +481 329 -15.715001 +497 329 -54.116658 +498 329 -20.260299 +499 329 -196.962547 +500 329 -170.725665 +3 330 0.591716 +4 330 0.147929 +8 330 0.591716 +14 330 0.591716 +15 330 0.591716 +16 330 0.147929 +18 330 0.147929 +19 330 0.147929 +20 330 0.065746 +22 330 0.147929 +23 330 0.591716 +24 330 0.147929 +25 330 0.591716 +26 330 0.065746 +27 330 0.591716 +29 330 0.147929 +30 330 0.147929 +35 330 0.065746 +38 330 0.065746 +40 330 0.591716 +42 330 0.591716 +43 330 0.591716 +44 330 0.591716 +47 330 0.591716 +52 330 0.147929 +53 330 0.065746 +54 330 0.591716 +57 330 0.591716 +63 330 0.147929 +68 330 0.065746 +72 330 0.591716 +74 330 0.147929 +75 330 0.591716 +78 330 0.147929 +79 330 0.147929 +80 330 0.147929 +81 330 0.147929 +82 330 0.591716 +83 330 0.065746 +84 330 0.147929 +93 330 0.147929 +94 330 0.591716 +117 330 0.147929 +129 330 0.591716 +140 330 0.065746 +143 330 0.065746 +146 330 0.065746 +147 330 0.065746 +150 330 0.147929 +156 330 0.065746 +163 330 0.591716 +175 330 0.065746 +177 330 0.147929 +179 330 0.591716 +181 330 0.147929 +185 330 0.147929 +186 330 0.591716 +190 330 0.147929 +192 330 0.591716 +193 330 0.147929 +195 330 0.591716 +199 330 0.147929 +201 330 0.147929 +202 330 0.147929 +210 330 0.147929 +214 330 0.065746 +218 330 0.147929 +220 330 0.591716 +221 330 0.591716 +228 330 0.147929 +229 330 0.591716 +231 330 0.147929 +232 330 0.147929 +235 330 0.591716 +238 330 0.147929 +244 330 0.065746 +245 330 0.591716 +250 330 0.591716 +254 330 0.147929 +330 330 40.378628 +354 330 -11.100961 +379 330 -11.688014 +404 330 -11.637788 +429 330 -11.598217 +430 330 -7.120960 +450 330 -9.140216 +453 330 -11.273417 +454 330 -11.569278 +455 330 -11.233220 +475 330 -12.890637 +476 330 -17.301952 +478 330 -11.986767 +479 330 -11.550956 +480 330 -11.266506 +481 330 -2.278227 +82 331 0.591716 +83 331 0.065746 +84 331 0.147929 +85 331 0.065746 +86 331 0.591716 +87 331 0.147929 +99 331 0.065746 +118 331 0.147929 +119 331 0.147929 +120 331 0.147929 +121 331 0.591716 +124 331 0.147929 +125 331 0.065746 +129 331 0.591716 +133 331 0.591716 +138 331 0.147929 +140 331 0.591716 +141 331 0.065746 +144 331 0.065746 +145 331 0.591716 +148 331 0.065746 +153 331 0.147929 +154 331 0.147929 +156 331 0.147929 +157 331 0.147929 +159 331 0.147929 +160 331 0.147929 +162 331 0.591716 +164 331 0.065746 +166 331 0.147929 +167 331 0.591716 +168 331 0.591716 +169 331 0.065746 +173 331 0.147929 +177 331 0.147929 +178 331 0.065746 +179 331 0.591716 +180 331 0.147929 +182 331 0.591716 +183 331 0.065746 +184 331 0.147929 +185 331 0.591716 +186 331 0.147929 +187 331 0.147929 +190 331 0.147929 +193 331 0.147929 +194 331 0.147929 +195 331 0.591716 +196 331 0.065746 +201 331 0.147929 +203 331 0.147929 +204 331 0.147929 +205 331 0.065746 +206 331 0.147929 +208 331 0.147929 +213 331 0.147929 +214 331 0.065746 +215 331 0.147929 +216 331 0.147929 +217 331 0.147929 +218 331 0.065746 +219 331 0.147929 +220 331 0.591716 +221 331 0.147929 +222 331 0.591716 +223 331 0.147929 +224 331 0.147929 +226 331 0.147929 +227 331 0.591716 +228 331 0.147929 +229 331 0.591716 +230 331 0.591716 +231 331 0.147929 +232 331 0.147929 +247 331 0.065746 +248 331 0.147929 +250 331 0.147929 +252 331 0.147929 +253 331 0.065746 +254 331 0.065746 +257 331 0.591716 +263 331 0.147929 +264 331 0.065746 +265 331 0.147929 +266 331 0.591716 +267 331 0.147929 +271 331 0.591716 +272 331 0.591716 +273 331 0.147929 +274 331 0.147929 +275 331 0.147929 +278 331 0.591716 +279 331 0.147929 +281 331 0.591716 +282 331 0.065746 +283 331 0.065746 +284 331 0.147929 +285 331 0.147929 +287 331 0.065746 +289 331 0.147929 +290 331 0.147929 +291 331 0.065746 +292 331 0.065746 +293 331 0.147929 +294 331 0.147929 +298 331 0.147929 +299 331 0.591716 +300 331 0.065746 +302 331 0.065746 +304 331 0.591716 +312 331 0.065746 +313 331 0.147929 +314 331 0.591716 +315 331 0.147929 +316 331 0.065746 +318 331 0.147929 +331 331 40.041315 +347 331 -24.959251 +348 331 -34.971064 +349 331 -24.149350 +354 331 -379.332322 +355 331 -3.018751 +374 331 -10.904373 +375 331 -35.147762 +376 331 -33.737637 +378 331 -4.759394 +379 331 -23.163171 +380 331 -382.323556 +401 331 -1.517178 +402 331 -47.204942 +403 331 -35.516375 +404 331 -22.613011 +405 331 -73.469902 +406 331 -322.997943 +427 331 -18.205389 +428 331 -34.603474 +429 331 -72.681721 +430 331 -57.981373 +431 331 -153.948023 +432 331 -231.820054 +450 331 -8.108427 +451 331 -33.101039 +452 331 -33.110557 +453 331 -12.397377 +454 331 -76.497719 +455 331 -124.051986 +456 331 -121.658469 +457 331 -288.400637 +458 331 -110.686050 +478 331 -114.314349 +479 331 -165.195044 +480 331 -165.236419 +481 331 -218.816052 +482 331 -311.120655 +483 331 -718.740851 +2 332 0.065746 +3 332 0.591716 +4 332 0.147929 +9 332 0.147929 +14 332 0.591716 +18 332 0.147929 +22 332 0.065746 +24 332 0.065746 +25 332 0.065746 +27 332 0.591716 +28 332 0.147929 +31 332 0.147929 +32 332 0.147929 +33 332 0.147929 +37 332 0.147929 +38 332 0.147929 +40 332 0.591716 +50 332 0.591716 +53 332 0.065746 +54 332 0.147929 +55 332 0.065746 +56 332 0.147929 +57 332 0.147929 +62 332 0.147929 +64 332 0.065746 +65 332 0.591716 +72 332 0.591716 +78 332 0.065746 +80 332 0.147929 +81 332 0.147929 +82 332 0.147929 +84 332 0.147929 +85 332 0.147929 +87 332 0.065746 +88 332 0.147929 +89 332 0.147929 +91 332 0.147929 +92 332 0.147929 +93 332 0.591716 +94 332 0.147929 +95 332 0.147929 +96 332 0.147929 +97 332 0.591716 +98 332 0.147929 +99 332 0.147929 +100 332 0.147929 +101 332 0.147929 +105 332 0.065746 +106 332 0.147929 +107 332 0.147929 +108 332 0.591716 +109 332 0.147929 +110 332 0.147929 +111 332 0.147929 +112 332 0.147929 +113 332 0.147929 +114 332 0.147929 +116 332 0.147929 +117 332 0.147929 +118 332 0.591716 +119 332 0.147929 +121 332 0.147929 +122 332 0.591716 +123 332 0.591716 +124 332 0.147929 +125 332 0.147929 +126 332 0.147929 +130 332 0.147929 +131 332 0.065746 +132 332 0.147929 +133 332 0.147929 +136 332 0.147929 +137 332 0.147929 +138 332 0.147929 +139 332 0.591716 +140 332 0.065746 +141 332 0.147929 +142 332 0.065746 +143 332 0.591716 +144 332 0.147929 +145 332 0.591716 +146 332 0.147929 +148 332 0.147929 +149 332 0.591716 +150 332 0.147929 +151 332 0.591716 +152 332 0.065746 +153 332 0.591716 +158 332 0.147929 +160 332 0.591716 +161 332 0.065746 +162 332 0.147929 +163 332 0.591716 +164 332 0.147929 +165 332 0.147929 +166 332 0.147929 +167 332 0.065746 +168 332 0.147929 +169 332 0.147929 +170 332 0.065746 +171 332 0.591716 +172 332 0.065746 +173 332 0.147929 +174 332 0.147929 +175 332 0.147929 +176 332 0.147929 +177 332 0.591716 +178 332 0.065746 +180 332 0.147929 +181 332 0.065746 +183 332 0.147929 +184 332 0.147929 +185 332 0.591716 +186 332 0.065746 +187 332 0.065746 +188 332 0.147929 +189 332 0.065746 +190 332 0.065746 +191 332 0.147929 +192 332 0.591716 +193 332 0.147929 +194 332 0.147929 +195 332 0.591716 +197 332 0.591716 +199 332 0.147929 +200 332 0.065746 +201 332 0.147929 +202 332 0.065746 +203 332 0.147929 +205 332 0.591716 +206 332 0.147929 +207 332 0.147929 +208 332 0.591716 +210 332 0.147929 +211 332 0.147929 +212 332 0.147929 +213 332 0.147929 +214 332 0.591716 +215 332 0.147929 +216 332 0.147929 +218 332 0.591716 +219 332 0.591716 +220 332 0.591716 +221 332 0.147929 +223 332 0.591716 +224 332 0.147929 +229 332 0.147929 +230 332 0.591716 +231 332 0.147929 +232 332 0.147929 +233 332 0.147929 +234 332 0.591716 +235 332 0.591716 +239 332 0.065746 +241 332 0.147929 +242 332 0.147929 +244 332 0.147929 +246 332 0.147929 +247 332 0.147929 +250 332 0.065746 +252 332 0.147929 +253 332 0.147929 +254 332 0.147929 +256 332 0.147929 +257 332 0.147929 +258 332 0.065746 +262 332 0.591716 +263 332 0.147929 +264 332 0.147929 +265 332 0.147929 +266 332 0.591716 +268 332 0.147929 +269 332 0.147929 +271 332 0.591716 +272 332 0.147929 +273 332 0.591716 +274 332 0.147929 +277 332 0.147929 +278 332 0.591716 +279 332 0.147929 +281 332 0.147929 +282 332 0.147929 +283 332 0.147929 +284 332 0.147929 +285 332 0.147929 +287 332 0.147929 +289 332 0.591716 +290 332 0.147929 +291 332 0.147929 +292 332 0.591716 +293 332 0.065746 +294 332 0.147929 +295 332 0.065746 +296 332 0.065746 +297 332 0.147929 +301 332 0.147929 +303 332 0.065746 +304 332 0.591716 +306 332 0.591716 +307 332 0.147929 +310 332 0.591716 +311 332 0.591716 +312 332 0.147929 +315 332 0.591716 +316 332 0.147929 +317 332 0.065746 +332 332 61.696995 +347 332 -99.824847 +354 332 -140.964905 +359 332 -9.393991 +372 332 -18.342383 +373 332 -94.823125 +378 332 -8.560557 +379 332 -193.797057 +380 332 -19.120333 +384 332 -10.275957 +398 332 -66.426720 +399 332 -44.084333 +404 332 -113.404007 +405 332 -143.454449 +406 332 -23.207795 +409 332 -10.121617 +424 332 -107.492203 +425 332 -0.390681 +429 332 -59.915431 +430 332 -470.914364 +431 332 -41.347828 +434 332 -9.983298 +449 332 -14.788659 +450 332 -100.771053 +454 332 -125.027340 +455 332 -727.324369 +456 332 -108.841232 +459 332 -9.860529 +472 332 -38.640342 +475 332 -85.973280 +476 332 -50.471033 +478 332 -20.279488 +479 332 -114.742795 +480 332 -408.097099 +481 332 -397.583271 +482 332 -39.049628 +484 332 -1.039554 +485 332 -8.713328 +497 332 -10.339664 +498 332 -28.154017 +1 333 0.065746 +2 333 0.147929 +3 333 0.147929 +4 333 0.147929 +5 333 0.065746 +8 333 0.147929 +10 333 0.065746 +12 333 0.065746 +14 333 0.147929 +15 333 0.147929 +17 333 0.065746 +18 333 0.147929 +19 333 0.147929 +21 333 0.065746 +22 333 0.147929 +23 333 0.065746 +26 333 0.065746 +27 333 0.591716 +31 333 0.147929 +33 333 0.065746 +37 333 0.065746 +38 333 0.065746 +39 333 0.147929 +40 333 0.591716 +41 333 0.065746 +47 333 0.065746 +52 333 0.147929 +53 333 0.147929 +54 333 0.147929 +55 333 0.065746 +57 333 0.147929 +60 333 0.065746 +65 333 0.147929 +68 333 0.147929 +69 333 0.065746 +71 333 0.065746 +72 333 0.065746 +77 333 0.065746 +78 333 0.065746 +79 333 0.147929 +82 333 0.065746 +84 333 0.065746 +93 333 0.065746 +94 333 0.065746 +116 333 0.591716 +119 333 0.147929 +122 333 0.147929 +124 333 0.065746 +125 333 0.147929 +126 333 0.147929 +136 333 0.065746 +138 333 0.065746 +143 333 0.065746 +148 333 0.147929 +159 333 0.065746 +160 333 0.065746 +161 333 0.065746 +163 333 0.147929 +166 333 0.147929 +169 333 0.065746 +178 333 0.065746 +186 333 0.065746 +187 333 0.065746 +189 333 0.147929 +192 333 0.147929 +193 333 0.065746 +194 333 0.147929 +195 333 0.147929 +196 333 0.065746 +197 333 0.065746 +200 333 0.065746 +213 333 0.147929 +214 333 0.147929 +215 333 0.065746 +216 333 0.065746 +218 333 0.147929 +220 333 0.147929 +221 333 0.147929 +222 333 0.147929 +224 333 0.065746 +225 333 0.065746 +231 333 0.065746 +233 333 0.065746 +235 333 0.591716 +237 333 0.065746 +238 333 0.147929 +239 333 0.065746 +241 333 0.147929 +242 333 0.065746 +333 333 20.397077 +376 333 -28.573144 +377 333 -852.504148 +378 333 -7.663248 +400 333 -99.997629 +401 333 -188.377746 +402 333 -1682.197959 +403 333 -397.669035 +404 333 -27.560790 +405 333 -15.157385 +406 333 -6.023210 +423 333 -35.844346 +424 333 -150.654118 +425 333 -51.589203 +426 333 -272.078909 +427 333 -1267.545018 +428 333 -234.583078 +429 333 -321.659101 +430 333 -29.361490 +431 333 -6.356137 +447 333 -138.002807 +448 333 -113.997945 +450 333 -41.328419 +451 333 -459.357293 +452 333 -1012.827987 +453 333 -74.636003 +454 333 -243.426630 +455 333 -232.967444 +456 333 -39.382723 +472 333 -5.179271 +474 333 -6.857175 +475 333 -106.907854 +476 333 -514.959024 +477 333 -869.189705 +478 333 -76.616482 +479 333 -44.684602 +480 333 -299.107568 +481 333 -110.759048 +482 333 -3.391800 +499 333 -40.839623 +500 333 -105.409765 +5 334 0.147929 +8 334 0.591716 +12 334 0.591716 +13 334 0.147929 +16 334 0.147929 +20 334 0.065746 +22 334 0.147929 +23 334 0.591716 +25 334 0.065746 +32 334 0.147929 +38 334 0.147929 +50 334 0.147929 +60 334 0.591716 +62 334 0.147929 +63 334 0.147929 +64 334 0.065746 +65 334 0.147929 +72 334 0.591716 +75 334 0.591716 +76 334 0.591716 +81 334 0.147929 +93 334 0.147929 +94 334 0.147929 +99 334 0.147929 +100 334 0.065746 +105 334 0.147929 +106 334 0.147929 +109 334 0.065746 +114 334 0.065746 +117 334 0.591716 +119 334 0.591716 +121 334 0.147929 +124 334 0.591716 +129 334 0.065746 +132 334 0.147929 +138 334 0.147929 +140 334 0.065746 +143 334 0.147929 +147 334 0.147929 +148 334 0.147929 +149 334 0.147929 +150 334 0.147929 +151 334 0.147929 +153 334 0.147929 +159 334 0.591716 +163 334 0.591716 +166 334 0.065746 +169 334 0.147929 +193 334 0.147929 +204 334 0.147929 +206 334 0.065746 +210 334 0.147929 +215 334 0.591716 +220 334 0.147929 +221 334 0.147929 +232 334 0.065746 +235 334 0.147929 +274 334 0.147929 +277 334 0.065746 +278 334 0.147929 +279 334 0.147929 +281 334 0.065746 +284 334 0.065746 +285 334 0.591716 +287 334 0.147929 +289 334 0.591716 +292 334 0.147929 +293 334 0.147929 +294 334 0.147929 +295 334 0.147929 +297 334 0.591716 +302 334 0.065746 +304 334 0.065746 +305 334 0.065746 +310 334 0.147929 +311 334 0.065746 +312 334 0.065746 +313 334 0.065746 +314 334 0.147929 +315 334 0.147929 +334 334 30.003165 +347 334 -29.097068 +358 334 -17.248609 +359 334 -5.695328 +372 334 -30.152306 +379 334 -101.967913 +383 334 -26.174047 +397 334 -30.163829 +404 334 -112.061162 +407 334 -3.647385 +408 334 -23.296495 +422 334 -30.187076 +428 334 -13.563478 +429 334 -100.517382 +432 334 -27.770766 +447 334 -30.221986 +453 334 -116.226597 +457 334 -28.656662 +472 334 -30.268471 +478 334 -118.497482 +481 334 -29.050937 +482 334 -0.552347 +497 334 -30.326409 +2 335 0.147929 +4 335 0.147929 +12 335 0.147929 +16 335 0.591716 +23 335 0.147929 +26 335 0.147929 +30 335 0.065746 +31 335 0.065746 +40 335 0.147929 +44 335 0.147929 +50 335 0.147929 +52 335 0.147929 +59 335 0.147929 +60 335 0.065746 +62 335 0.147929 +63 335 0.065746 +64 335 0.065746 +79 335 0.147929 +81 335 0.147929 +82 335 0.591716 +84 335 0.591716 +85 335 0.147929 +87 335 0.147929 +90 335 0.147929 +92 335 0.147929 +94 335 0.065746 +95 335 0.065746 +96 335 0.065746 +98 335 0.147929 +99 335 0.147929 +100 335 0.147929 +101 335 0.147929 +103 335 0.065746 +105 335 0.147929 +110 335 0.065746 +112 335 0.065746 +115 335 0.147929 +116 335 0.591716 +117 335 0.147929 +118 335 0.147929 +122 335 0.147929 +124 335 0.147929 +126 335 0.147929 +127 335 0.147929 +131 335 0.147929 +132 335 0.147929 +134 335 0.065746 +135 335 0.591716 +136 335 0.065746 +137 335 0.065746 +139 335 0.065746 +140 335 0.065746 +143 335 0.147929 +145 335 0.065746 +147 335 0.591716 +148 335 0.147929 +149 335 0.147929 +150 335 0.147929 +151 335 0.147929 +152 335 0.147929 +153 335 0.147929 +154 335 0.065746 +155 335 0.147929 +156 335 0.147929 +159 335 0.147929 +161 335 0.147929 +162 335 0.065746 +163 335 0.065746 +165 335 0.065746 +167 335 0.065746 +168 335 0.065746 +169 335 0.065746 +170 335 0.065746 +171 335 0.065746 +173 335 0.147929 +175 335 0.147929 +178 335 0.591716 +179 335 0.147929 +180 335 0.065746 +184 335 0.147929 +186 335 0.065746 +188 335 0.591716 +189 335 0.065746 +192 335 0.591716 +193 335 0.147929 +194 335 0.147929 +196 335 0.147929 +197 335 0.591716 +198 335 0.065746 +199 335 0.591716 +201 335 0.065746 +202 335 0.065746 +203 335 0.147929 +205 335 0.591716 +207 335 0.147929 +208 335 0.591716 +209 335 0.147929 +211 335 0.065746 +212 335 0.591716 +213 335 0.147929 +214 335 0.147929 +215 335 0.147929 +216 335 0.147929 +228 335 0.591716 +234 335 0.591716 +238 335 0.147929 +239 335 0.065746 +240 335 0.147929 +241 335 0.147929 +242 335 0.065746 +244 335 0.147929 +246 335 0.147929 +247 335 0.065746 +248 335 0.065746 +252 335 0.065746 +254 335 0.591716 +264 335 0.147929 +265 335 0.147929 +267 335 0.065746 +268 335 0.065746 +269 335 0.065746 +273 335 0.147929 +274 335 0.147929 +275 335 0.147929 +282 335 0.591716 +283 335 0.065746 +284 335 0.147929 +292 335 0.147929 +295 335 0.065746 +297 335 0.147929 +305 335 0.147929 +308 335 0.147929 +309 335 0.147929 +311 335 0.147929 +312 335 0.147929 +313 335 0.065746 +335 335 38.609110 +347 335 -54.332416 +353 335 -15.618088 +354 335 -46.976406 +359 335 -8.982542 +372 335 -60.220158 +378 335 -37.055956 +379 335 -156.547212 +383 335 -5.067916 +384 335 -4.956515 +397 335 -17.697790 +398 335 -41.895102 +403 335 -52.894421 +404 335 -191.152002 +406 335 -25.676682 +408 335 -10.083503 +423 335 -58.986849 +428 335 -33.547728 +429 335 -221.256331 +430 335 -65.575535 +431 335 -47.169648 +433 335 -10.156110 +448 335 -58.404000 +450 335 -3.858493 +453 335 -10.301726 +454 335 -265.122661 +455 335 -154.815158 +456 335 -24.822192 +458 335 -10.242463 +472 335 -126.871093 +473 335 -42.422751 +474 335 -15.423345 +475 335 -41.562377 +479 335 -289.136344 +480 335 -157.584660 +481 335 -39.757753 +483 335 -10.342808 +497 335 -128.101067 +499 335 -57.314684 +500 335 -89.103866 +2 336 0.065746 +4 336 0.065746 +5 336 0.591716 +7 336 0.065746 +12 336 0.147929 +17 336 0.147929 +18 336 0.065746 +20 336 0.065746 +24 336 0.147929 +27 336 0.591716 +30 336 0.147929 +31 336 0.147929 +36 336 0.147929 +41 336 0.147929 +45 336 0.147929 +47 336 0.065746 +50 336 0.147929 +55 336 0.147929 +56 336 0.065746 +62 336 0.147929 +64 336 0.147929 +69 336 0.147929 +70 336 0.147929 +71 336 0.065746 +82 336 0.147929 +85 336 0.147929 +90 336 0.147929 +92 336 0.147929 +95 336 0.147929 +96 336 0.147929 +101 336 0.147929 +103 336 0.147929 +104 336 0.147929 +107 336 0.147929 +110 336 0.147929 +115 336 0.147929 +116 336 0.147929 +127 336 0.065746 +133 336 0.065746 +135 336 0.065746 +136 336 0.065746 +137 336 0.065746 +142 336 0.147929 +143 336 0.065746 +145 336 0.065746 +154 336 0.065746 +155 336 0.147929 +156 336 0.147929 +157 336 0.147929 +158 336 0.147929 +161 336 0.147929 +162 336 0.147929 +167 336 0.065746 +168 336 0.147929 +170 336 0.065746 +171 336 0.147929 +172 336 0.147929 +173 336 0.147929 +174 336 0.065746 +175 336 0.147929 +178 336 0.591716 +179 336 0.147929 +180 336 0.147929 +181 336 0.065746 +182 336 0.065746 +186 336 0.065746 +188 336 0.065746 +191 336 0.147929 +192 336 0.147929 +194 336 0.147929 +196 336 0.147929 +199 336 0.147929 +201 336 0.147929 +202 336 0.147929 +203 336 0.147929 +206 336 0.147929 +207 336 0.147929 +208 336 0.591716 +212 336 0.065746 +213 336 0.065746 +214 336 0.065746 +242 336 0.147929 +246 336 0.147929 +248 336 0.147929 +252 336 0.065746 +254 336 0.591716 +264 336 0.147929 +268 336 0.147929 +269 336 0.147929 +274 336 0.065746 +277 336 0.147929 +279 336 0.065746 +283 336 0.147929 +304 336 0.147929 +305 336 0.147929 +308 336 0.147929 +309 336 0.147929 +310 336 0.147929 +311 336 0.591716 +313 336 0.591716 +336 336 28.878374 +347 336 -63.390320 +354 336 -82.557170 +372 336 -75.026054 +378 336 -10.807747 +379 336 -107.199898 +380 336 -23.511504 +381 336 -8.313473 +397 336 -74.596888 +403 336 -56.038495 +404 336 -98.645507 +405 336 -49.155833 +406 336 -13.095442 +422 336 -74.196535 +428 336 -81.726737 +429 336 -94.728942 +430 336 -172.247831 +431 336 -14.688851 +447 336 -29.264925 +448 336 -44.561143 +450 336 -8.506959 +453 336 -123.066650 +454 336 -65.590512 +455 336 -290.960195 +456 336 -25.226461 +472 336 -30.186014 +473 336 -73.486438 +475 336 -56.479740 +478 336 -138.117946 +479 336 -154.385997 +480 336 -220.080473 +481 336 -35.321062 +497 336 -30.642240 +498 336 -73.178479 +500 336 -114.073893 +1 337 0.147929 +3 337 0.591716 +5 337 0.147929 +6 337 0.147929 +7 337 0.147929 +8 337 0.591716 +9 337 0.065746 +10 337 0.147929 +11 337 0.147929 +12 337 0.147929 +14 337 0.591716 +15 337 0.591716 +16 337 0.065746 +17 337 0.591716 +18 337 0.147929 +19 337 0.065746 +21 337 0.591716 +28 337 0.065746 +30 337 0.147929 +31 337 0.147929 +34 337 0.147929 +35 337 0.065746 +36 337 0.591716 +37 337 0.591716 +38 337 0.065746 +39 337 0.147929 +41 337 0.591716 +42 337 0.591716 +43 337 0.591716 +44 337 0.147929 +45 337 0.147929 +46 337 0.147929 +47 337 0.591716 +48 337 0.065746 +49 337 0.147929 +50 337 0.147929 +52 337 0.147929 +53 337 0.591716 +56 337 0.147929 +57 337 0.591716 +59 337 0.147929 +60 337 0.147929 +61 337 0.147929 +62 337 0.065746 +63 337 0.591716 +64 337 0.065746 +65 337 0.591716 +71 337 0.065746 +72 337 0.147929 +73 337 0.147929 +75 337 0.591716 +77 337 0.147929 +78 337 0.147929 +79 337 0.147929 +80 337 0.065746 +81 337 0.147929 +82 337 0.591716 +83 337 0.147929 +84 337 0.065746 +85 337 0.147929 +86 337 0.591716 +87 337 0.147929 +88 337 0.065746 +89 337 0.147929 +90 337 0.147929 +92 337 0.147929 +93 337 0.591716 +94 337 0.147929 +96 337 0.147929 +97 337 0.065746 +99 337 0.065746 +100 337 0.147929 +101 337 0.065746 +102 337 0.147929 +103 337 0.065746 +106 337 0.147929 +107 337 0.147929 +108 337 0.147929 +109 337 0.147929 +110 337 0.065746 +111 337 0.591716 +112 337 0.147929 +113 337 0.147929 +114 337 0.591716 +115 337 0.147929 +132 337 0.591716 +133 337 0.147929 +148 337 0.147929 +149 337 0.147929 +150 337 0.147929 +151 337 0.147929 +152 337 0.147929 +154 337 0.147929 +155 337 0.147929 +156 337 0.065746 +160 337 0.147929 +162 337 0.147929 +163 337 0.147929 +164 337 0.147929 +165 337 0.591716 +166 337 0.147929 +167 337 0.147929 +168 337 0.147929 +169 337 0.147929 +170 337 0.147929 +171 337 0.065746 +173 337 0.147929 +174 337 0.065746 +177 337 0.147929 +179 337 0.591716 +180 337 0.065746 +181 337 0.147929 +182 337 0.065746 +183 337 0.147929 +184 337 0.591716 +185 337 0.591716 +186 337 0.147929 +187 337 0.065746 +188 337 0.147929 +189 337 0.147929 +190 337 0.147929 +192 337 0.591716 +193 337 0.147929 +194 337 0.147929 +195 337 0.591716 +197 337 0.591716 +201 337 0.065746 +202 337 0.591716 +203 337 0.147929 +204 337 0.147929 +206 337 0.065746 +210 337 0.147929 +211 337 0.065746 +212 337 0.065746 +216 337 0.147929 +219 337 0.591716 +220 337 0.147929 +221 337 0.591716 +222 337 0.591716 +223 337 0.065746 +224 337 0.591716 +225 337 0.065746 +227 337 0.591716 +228 337 0.147929 +229 337 0.591716 +230 337 0.591716 +231 337 0.147929 +232 337 0.591716 +233 337 0.147929 +234 337 0.591716 +235 337 0.591716 +236 337 0.591716 +237 337 0.065746 +238 337 0.147929 +240 337 0.147929 +241 337 0.065746 +242 337 0.065746 +247 337 0.147929 +248 337 0.147929 +251 337 0.065746 +252 337 0.147929 +253 337 0.065746 +256 337 0.065746 +257 337 0.591716 +258 337 0.147929 +259 337 0.065746 +261 337 0.147929 +263 337 0.147929 +264 337 0.065746 +265 337 0.591716 +266 337 0.591716 +267 337 0.147929 +268 337 0.147929 +269 337 0.147929 +271 337 0.591716 +272 337 0.147929 +273 337 0.147929 +274 337 0.147929 +275 337 0.065746 +278 337 0.591716 +279 337 0.147929 +280 337 0.147929 +281 337 0.147929 +282 337 0.147929 +283 337 0.591716 +284 337 0.147929 +285 337 0.591716 +287 337 0.147929 +290 337 0.591716 +291 337 0.591716 +292 337 0.591716 +293 337 0.147929 +294 337 0.065746 +295 337 0.147929 +296 337 0.147929 +297 337 0.147929 +298 337 0.591716 +300 337 0.147929 +301 337 0.065746 +304 337 0.065746 +306 337 0.147929 +307 337 0.147929 +308 337 0.147929 +309 337 0.147929 +310 337 0.147929 +311 337 0.591716 +312 337 0.065746 +313 337 0.591716 +314 337 0.147929 +315 337 0.591716 +316 337 0.591716 +318 337 0.591716 +337 337 68.576471 +347 337 -89.114206 +348 337 -49.377687 +354 337 -46.849063 +355 337 -15.580589 +359 337 -21.860640 +369 337 -4.956959 +373 337 -70.231378 +374 337 -83.746947 +378 337 -5.875789 +379 337 -61.531343 +380 337 -89.523300 +381 337 -138.860731 +384 337 -23.791469 +394 337 -10.743282 +395 337 -16.581383 +396 337 -1.989292 +399 337 -36.891196 +400 337 -108.691885 +401 337 -1.339059 +402 337 -22.554280 +404 337 -54.167484 +405 337 -114.185971 +406 337 -210.698444 +407 337 -10.844830 +409 337 -23.309325 +421 337 -14.656930 +422 337 -13.320179 +425 337 -13.140798 +426 337 -119.022391 +427 337 -134.022735 +428 337 -42.694200 +429 337 -20.400115 +430 337 -188.260984 +431 337 -185.169929 +432 337 -159.623180 +434 337 -12.769462 +435 337 -10.099687 +447 337 -3.400729 +448 337 -16.806779 +449 337 -6.353532 +450 337 -4.286250 +451 337 -5.420455 +452 337 -117.084333 +453 337 -180.153692 +454 337 -83.441214 +455 337 -165.997937 +456 337 -231.126967 +457 337 -265.519907 +460 337 -22.469339 +474 337 -10.551945 +475 337 -51.190082 +476 337 -31.886100 +477 337 -6.970607 +478 337 -139.647438 +479 337 -215.789430 +480 337 -64.379932 +481 337 -277.985590 +482 337 -251.474006 +483 337 -138.728255 +485 337 -22.108403 +500 337 -42.410931 +1 338 0.065746 +3 338 0.147929 +4 338 0.147929 +5 338 0.591716 +6 338 0.147929 +7 338 0.147929 +8 338 0.591716 +9 338 0.065746 +10 338 0.147929 +17 338 0.147929 +18 338 0.147929 +19 338 0.065746 +20 338 0.065746 +21 338 0.591716 +22 338 0.591716 +25 338 0.591716 +31 338 0.147929 +34 338 0.147929 +40 338 0.591716 +45 338 0.147929 +46 338 0.065746 +53 338 0.147929 +54 338 0.591716 +55 338 0.591716 +57 338 0.591716 +58 338 0.147929 +59 338 0.147929 +60 338 0.147929 +61 338 0.147929 +63 338 0.591716 +64 338 0.147929 +65 338 0.147929 +70 338 0.065746 +71 338 0.147929 +72 338 0.147929 +73 338 0.147929 +75 338 0.147929 +77 338 0.147929 +79 338 0.147929 +80 338 0.065746 +81 338 0.147929 +82 338 0.591716 +83 338 0.065746 +84 338 0.065746 +85 338 0.147929 +87 338 0.147929 +88 338 0.147929 +89 338 0.591716 +93 338 0.591716 +94 338 0.147929 +95 338 0.147929 +96 338 0.147929 +97 338 0.147929 +99 338 0.147929 +100 338 0.147929 +101 338 0.147929 +105 338 0.065746 +106 338 0.147929 +107 338 0.147929 +108 338 0.065746 +109 338 0.147929 +110 338 0.147929 +111 338 0.591716 +112 338 0.147929 +113 338 0.147929 +114 338 0.591716 +115 338 0.147929 +117 338 0.147929 +118 338 0.147929 +119 338 0.147929 +121 338 0.591716 +122 338 0.591716 +123 338 0.147929 +125 338 0.065746 +127 338 0.147929 +128 338 0.147929 +129 338 0.147929 +131 338 0.147929 +132 338 0.591716 +133 338 0.147929 +134 338 0.147929 +136 338 0.147929 +137 338 0.147929 +138 338 0.147929 +139 338 0.147929 +146 338 0.147929 +148 338 0.147929 +149 338 0.147929 +150 338 0.147929 +151 338 0.065746 +152 338 0.147929 +153 338 0.147929 +154 338 0.147929 +155 338 0.147929 +156 338 0.147929 +158 338 0.591716 +159 338 0.591716 +160 338 0.147929 +161 338 0.147929 +162 338 0.065746 +163 338 0.147929 +164 338 0.147929 +165 338 0.147929 +166 338 0.147929 +167 338 0.065746 +170 338 0.065746 +171 338 0.147929 +173 338 0.147929 +174 338 0.147929 +175 338 0.065746 +176 338 0.065746 +179 338 0.591716 +180 338 0.065746 +181 338 0.591716 +182 338 0.065746 +183 338 0.591716 +184 338 0.591716 +185 338 0.591716 +186 338 0.591716 +187 338 0.065746 +188 338 0.147929 +189 338 0.147929 +190 338 0.065746 +193 338 0.147929 +194 338 0.065746 +195 338 0.591716 +198 338 0.065746 +201 338 0.147929 +202 338 0.147929 +203 338 0.147929 +204 338 0.147929 +206 338 0.147929 +216 338 0.591716 +219 338 0.591716 +220 338 0.147929 +221 338 0.591716 +222 338 0.591716 +223 338 0.065746 +224 338 0.591716 +229 338 0.591716 +230 338 0.591716 +231 338 0.147929 +232 338 0.591716 +233 338 0.147929 +234 338 0.591716 +235 338 0.591716 +236 338 0.591716 +238 338 0.147929 +244 338 0.065746 +248 338 0.147929 +249 338 0.147929 +251 338 0.065746 +252 338 0.591716 +253 338 0.065746 +256 338 0.147929 +257 338 0.591716 +258 338 0.147929 +259 338 0.065746 +261 338 0.591716 +263 338 0.147929 +264 338 0.065746 +265 338 0.591716 +266 338 0.591716 +267 338 0.147929 +268 338 0.065746 +269 338 0.065746 +270 338 0.065746 +271 338 0.147929 +272 338 0.591716 +273 338 0.147929 +275 338 0.147929 +280 338 0.147929 +281 338 0.147929 +282 338 0.591716 +283 338 0.591716 +284 338 0.147929 +285 338 0.591716 +287 338 0.147929 +290 338 0.591716 +293 338 0.591716 +294 338 0.147929 +295 338 0.065746 +296 338 0.147929 +297 338 0.065746 +300 338 0.147929 +301 338 0.147929 +316 338 0.591716 +318 338 0.591716 +338 338 62.592662 +347 338 -46.165647 +348 338 -3.247400 +353 338 -3.234992 +354 338 -58.079799 +355 338 -13.932613 +359 338 -9.222662 +369 338 -4.096707 +372 338 -0.479126 +373 338 -55.252110 +374 338 -3.442977 +376 338 -10.228367 +378 338 -7.208931 +379 338 -88.959055 +380 338 -42.189429 +381 338 -20.645491 +384 338 -10.123259 +394 338 -12.730287 +395 338 -11.640237 +398 338 -0.234909 +399 338 -55.184571 +400 338 -1.714872 +401 338 -26.649573 +402 338 -10.436519 +404 338 -65.598997 +405 338 -97.501342 +406 338 -43.683182 +409 338 -10.007197 +420 338 -6.171684 +421 338 -17.368378 +424 338 -0.969600 +425 338 -54.136506 +427 338 -35.861230 +429 338 -42.544957 +430 338 -272.287855 +431 338 -100.270217 +432 338 -5.528328 +434 338 -9.905873 +446 338 -0.561882 +447 338 -18.067783 +448 338 -4.035154 +450 338 -15.761673 +451 338 -49.810300 +452 338 -4.162548 +453 338 -44.697953 +454 338 -63.636283 +455 338 -402.197118 +456 338 -252.701850 +457 338 -30.771190 +459 338 -9.818955 +473 338 -14.192381 +474 338 -7.572003 +476 338 -54.002645 +477 338 -37.669812 +478 338 -50.030818 +479 338 -73.632099 +480 338 -131.759800 +481 338 -505.541249 +482 338 -84.259622 +484 338 -9.746152 +499 338 -10.841358 +500 338 -10.014547 +5 339 0.147929 +8 339 0.147929 +20 339 0.147929 +25 339 0.065746 +27 339 0.591716 +28 339 0.065746 +31 339 0.147929 +36 339 0.147929 +37 339 0.147929 +40 339 0.147929 +43 339 0.591716 +44 339 0.591716 +45 339 0.147929 +46 339 0.065746 +50 339 0.147929 +52 339 0.065746 +53 339 0.147929 +54 339 0.147929 +57 339 0.147929 +58 339 0.147929 +59 339 0.147929 +60 339 0.147929 +61 339 0.147929 +62 339 0.065746 +64 339 0.147929 +65 339 0.147929 +66 339 0.591716 +67 339 0.147929 +69 339 0.147929 +70 339 0.147929 +71 339 0.065746 +73 339 0.147929 +75 339 0.147929 +77 339 0.147929 +78 339 0.591716 +79 339 0.147929 +80 339 0.147929 +81 339 0.065746 +82 339 0.591716 +83 339 0.065746 +84 339 0.065746 +85 339 0.147929 +86 339 0.147929 +87 339 0.147929 +89 339 0.147929 +90 339 0.147929 +92 339 0.065746 +93 339 0.591716 +94 339 0.147929 +100 339 0.147929 +101 339 0.147929 +102 339 0.147929 +103 339 0.147929 +104 339 0.147929 +106 339 0.147929 +107 339 0.147929 +108 339 0.147929 +109 339 0.147929 +110 339 0.147929 +112 339 0.147929 +116 339 0.147929 +117 339 0.591716 +118 339 0.147929 +119 339 0.147929 +120 339 0.147929 +122 339 0.065746 +123 339 0.147929 +124 339 0.147929 +125 339 0.065746 +127 339 0.065746 +129 339 0.591716 +131 339 0.147929 +132 339 0.591716 +133 339 0.591716 +134 339 0.591716 +135 339 0.147929 +136 339 0.147929 +137 339 0.147929 +139 339 0.147929 +141 339 0.147929 +142 339 0.591716 +143 339 0.065746 +145 339 0.147929 +148 339 0.591716 +150 339 0.147929 +151 339 0.591716 +152 339 0.065746 +154 339 0.147929 +155 339 0.065746 +156 339 0.147929 +160 339 0.591716 +162 339 0.147929 +163 339 0.147929 +164 339 0.147929 +167 339 0.147929 +168 339 0.591716 +171 339 0.065746 +172 339 0.065746 +173 339 0.147929 +175 339 0.147929 +177 339 0.147929 +178 339 0.065746 +179 339 0.591716 +180 339 0.147929 +182 339 0.065746 +183 339 0.147929 +184 339 0.591716 +185 339 0.065746 +189 339 0.065746 +190 339 0.147929 +191 339 0.591716 +193 339 0.147929 +194 339 0.065746 +195 339 0.147929 +196 339 0.147929 +197 339 0.147929 +199 339 0.065746 +201 339 0.147929 +202 339 0.065746 +203 339 0.065746 +204 339 0.591716 +206 339 0.065746 +208 339 0.147929 +211 339 0.065746 +212 339 0.147929 +214 339 0.065746 +215 339 0.591716 +216 339 0.147929 +217 339 0.147929 +219 339 0.147929 +220 339 0.147929 +221 339 0.147929 +222 339 0.065746 +223 339 0.591716 +224 339 0.147929 +228 339 0.065746 +229 339 0.147929 +230 339 0.147929 +231 339 0.147929 +232 339 0.147929 +233 339 0.147929 +235 339 0.147929 +238 339 0.147929 +239 339 0.147929 +240 339 0.591716 +241 339 0.147929 +242 339 0.591716 +244 339 0.065746 +247 339 0.147929 +250 339 0.147929 +251 339 0.065746 +252 339 0.065746 +253 339 0.065746 +257 339 0.147929 +258 339 0.147929 +259 339 0.147929 +261 339 0.591716 +262 339 0.147929 +263 339 0.065746 +265 339 0.591716 +267 339 0.147929 +268 339 0.147929 +269 339 0.147929 +271 339 0.591716 +272 339 0.591716 +273 339 0.147929 +274 339 0.147929 +275 339 0.065746 +278 339 0.591716 +279 339 0.065746 +280 339 0.147929 +281 339 0.147929 +282 339 0.147929 +284 339 0.591716 +285 339 0.591716 +286 339 0.147929 +287 339 0.591716 +289 339 0.147929 +290 339 0.147929 +292 339 0.065746 +293 339 0.147929 +294 339 0.147929 +295 339 0.147929 +296 339 0.147929 +297 339 0.147929 +298 339 0.591716 +299 339 0.147929 +302 339 0.147929 +304 339 0.591716 +306 339 0.591716 +307 339 0.147929 +308 339 0.147929 +309 339 0.147929 +311 339 0.147929 +312 339 0.147929 +314 339 0.147929 +315 339 0.147929 +316 339 0.065746 +317 339 0.147929 +318 339 0.147929 +339 339 56.038038 +347 339 -86.472615 +348 339 -62.321285 +354 339 -86.346895 +358 339 -4.288843 +359 339 -16.162752 +369 339 -6.411341 +373 339 -53.599965 +374 339 -107.639207 +375 339 -3.469342 +376 339 -12.154092 +378 339 -3.033832 +379 339 -138.166457 +380 339 -21.788028 +381 339 -24.006102 +383 339 -22.923309 +394 339 -8.476864 +395 339 -15.699603 +396 339 -13.369414 +399 339 -9.087698 +400 339 -114.187779 +401 339 -52.405421 +402 339 -47.473568 +404 339 -66.771328 +405 339 -136.542207 +406 339 -37.795346 +408 339 -23.164157 +421 339 -2.362916 +422 339 -15.769807 +423 339 -15.812605 +424 339 -1.161796 +426 339 -85.761229 +427 339 -203.373853 +428 339 -74.030344 +429 339 -26.234936 +430 339 -366.707604 +431 339 -49.679436 +433 339 -23.437757 +449 339 -14.699619 +450 339 -24.742540 +451 339 -13.765386 +452 339 -57.854765 +453 339 -237.130774 +454 339 -138.641021 +455 339 -449.917671 +456 339 -125.800355 +458 339 -23.744883 +472 339 -32.726211 +473 339 -34.130715 +474 339 -34.178023 +475 339 -52.072917 +476 339 -73.503080 +477 339 -55.265050 +478 339 -139.700383 +479 339 -322.699625 +480 339 -158.888532 +481 339 -503.814240 +482 339 -4.476395 +483 339 -24.086375 +500 339 -51.331401 +51 340 0.147929 +90 340 0.147929 +93 340 0.147929 +94 340 0.147929 +99 340 0.147929 +100 340 0.591716 +101 340 0.147929 +124 340 0.147929 +125 340 0.065746 +160 340 0.147929 +163 340 0.147929 +164 340 0.147929 +166 340 0.147929 +167 340 0.591716 +168 340 0.591716 +169 340 0.147929 +172 340 0.065746 +173 340 0.591716 +175 340 0.591716 +177 340 0.065746 +178 340 0.065746 +179 340 0.065746 +180 340 0.147929 +181 340 0.147929 +182 340 0.591716 +183 340 0.147929 +184 340 0.147929 +185 340 0.147929 +186 340 0.591716 +188 340 0.065746 +189 340 0.147929 +190 340 0.147929 +191 340 0.065746 +193 340 0.147929 +194 340 0.147929 +196 340 0.147929 +197 340 0.065746 +201 340 0.065746 +202 340 0.591716 +204 340 0.591716 +206 340 0.147929 +214 340 0.065746 +215 340 0.147929 +216 340 0.147929 +217 340 0.065746 +222 340 0.065746 +228 340 0.147929 +229 340 0.147929 +230 340 0.147929 +231 340 0.065746 +234 340 0.065746 +235 340 0.065746 +240 340 0.591716 +241 340 0.147929 +242 340 0.065746 +244 340 0.065746 +250 340 0.065746 +251 340 0.065746 +252 340 0.065746 +253 340 0.147929 +257 340 0.065746 +258 340 0.065746 +262 340 0.065746 +263 340 0.065746 +264 340 0.147929 +265 340 0.591716 +267 340 0.147929 +268 340 0.065746 +269 340 0.065746 +271 340 0.147929 +273 340 0.065746 +274 340 0.147929 +275 340 0.147929 +278 340 0.147929 +284 340 0.147929 +285 340 0.147929 +299 340 0.065746 +300 340 0.065746 +302 340 0.065746 +304 340 0.065746 +305 340 0.065746 +308 340 0.147929 +310 340 0.591716 +311 340 0.147929 +313 340 0.065746 +314 340 0.147929 +315 340 0.147929 +316 340 0.147929 +317 340 0.147929 +340 340 30.715046 +347 340 -49.264000 +348 340 -66.747692 +349 340 -21.304941 +369 340 -13.050554 +374 340 -45.629525 +375 340 -67.147255 +376 340 -29.907399 +394 340 -1.059671 +395 340 -14.858510 +396 340 -14.865119 +397 340 -14.872646 +398 340 -14.881191 +399 340 -12.413287 +401 340 -37.482483 +402 340 -67.667024 +403 340 -25.534143 +424 340 -2.477583 +425 340 -14.901820 +426 340 -14.914209 +427 340 -14.928234 +428 340 -56.771212 +429 340 -68.349342 +430 340 -8.376367 +450 340 -3.582514 +451 340 -14.622545 +452 340 -17.566707 +453 340 -48.288232 +454 340 -79.701300 +455 340 -618.413108 +456 340 -800.621098 +475 340 -42.332726 +476 340 -66.396207 +477 340 -63.480495 +478 340 -33.414415 +479 340 -468.448348 +480 340 -2430.188271 +481 340 -351.666614 +482 340 -25.108470 +23 341 0.591716 +24 341 0.065746 +27 341 0.147929 +29 341 0.065746 +30 341 0.147929 +35 341 0.147929 +36 341 0.065746 +37 341 0.591716 +38 341 0.147929 +39 341 0.065746 +40 341 0.591716 +41 341 0.147929 +42 341 0.591716 +43 341 0.591716 +44 341 0.591716 +45 341 0.147929 +46 341 0.065746 +48 341 0.147929 +51 341 0.147929 +52 341 0.147929 +53 341 0.147929 +54 341 0.591716 +56 341 0.065746 +57 341 0.591716 +58 341 0.065746 +59 341 0.147929 +60 341 0.147929 +61 341 0.591716 +63 341 0.147929 +65 341 0.591716 +66 341 0.591716 +67 341 0.147929 +68 341 0.147929 +69 341 0.147929 +70 341 0.065746 +71 341 0.147929 +72 341 0.147929 +73 341 0.065746 +75 341 0.591716 +77 341 0.147929 +78 341 0.591716 +79 341 0.147929 +80 341 0.147929 +81 341 0.591716 +82 341 0.591716 +85 341 0.147929 +86 341 0.147929 +87 341 0.147929 +89 341 0.147929 +92 341 0.147929 +93 341 0.591716 +94 341 0.147929 +95 341 0.591716 +96 341 0.591716 +97 341 0.065746 +98 341 0.147929 +99 341 0.147929 +100 341 0.591716 +101 341 0.147929 +103 341 0.147929 +104 341 0.147929 +106 341 0.591716 +107 341 0.147929 +108 341 0.147929 +109 341 0.147929 +110 341 0.065746 +111 341 0.591716 +114 341 0.591716 +117 341 0.591716 +119 341 0.591716 +120 341 0.147929 +121 341 0.591716 +122 341 0.147929 +123 341 0.147929 +125 341 0.065746 +127 341 0.147929 +129 341 0.591716 +131 341 0.147929 +132 341 0.591716 +133 341 0.147929 +134 341 0.147929 +136 341 0.591716 +137 341 0.147929 +139 341 0.065746 +140 341 0.147929 +141 341 0.147929 +142 341 0.065746 +145 341 0.147929 +146 341 0.147929 +147 341 0.147929 +148 341 0.591716 +149 341 0.065746 +150 341 0.147929 +151 341 0.147929 +153 341 0.147929 +155 341 0.147929 +156 341 0.147929 +157 341 0.147929 +158 341 0.147929 +159 341 0.591716 +160 341 0.591716 +161 341 0.147929 +162 341 0.147929 +163 341 0.147929 +164 341 0.147929 +169 341 0.065746 +170 341 0.065746 +171 341 0.147929 +173 341 0.065746 +174 341 0.147929 +177 341 0.147929 +178 341 0.065746 +179 341 0.147929 +180 341 0.147929 +181 341 0.065746 +185 341 0.591716 +187 341 0.065746 +188 341 0.147929 +190 341 0.147929 +192 341 0.591716 +194 341 0.147929 +195 341 0.591716 +196 341 0.065746 +198 341 0.147929 +199 341 0.065746 +200 341 0.065746 +201 341 0.147929 +202 341 0.147929 +203 341 0.065746 +204 341 0.591716 +205 341 0.147929 +206 341 0.147929 +207 341 0.065746 +208 341 0.147929 +211 341 0.147929 +212 341 0.147929 +213 341 0.147929 +214 341 0.065746 +216 341 0.591716 +217 341 0.147929 +218 341 0.591716 +219 341 0.147929 +220 341 0.591716 +221 341 0.591716 +222 341 0.591716 +223 341 0.591716 +224 341 0.591716 +226 341 0.065746 +227 341 0.591716 +228 341 0.591716 +229 341 0.591716 +230 341 0.147929 +231 341 0.147929 +232 341 0.591716 +233 341 0.147929 +235 341 0.591716 +236 341 0.065746 +237 341 0.147929 +238 341 0.147929 +239 341 0.147929 +240 341 0.591716 +241 341 0.065746 +242 341 0.147929 +243 341 0.147929 +248 341 0.147929 +251 341 0.065746 +252 341 0.065746 +253 341 0.065746 +254 341 0.591716 +256 341 0.065746 +257 341 0.591716 +259 341 0.065746 +261 341 0.147929 +262 341 0.065746 +263 341 0.147929 +264 341 0.065746 +265 341 0.591716 +266 341 0.591716 +267 341 0.065746 +268 341 0.147929 +269 341 0.065746 +270 341 0.147929 +271 341 0.591716 +272 341 0.591716 +274 341 0.147929 +276 341 0.147929 +277 341 0.147929 +278 341 0.147929 +279 341 0.065746 +280 341 0.591716 +282 341 0.591716 +283 341 0.147929 +284 341 0.591716 +285 341 0.591716 +287 341 0.591716 +289 341 0.147929 +290 341 0.591716 +292 341 0.147929 +293 341 0.147929 +294 341 0.147929 +295 341 0.147929 +296 341 0.591716 +297 341 0.147929 +299 341 0.065746 +305 341 0.147929 +306 341 0.591716 +307 341 0.147929 +308 341 0.147929 +309 341 0.591716 +310 341 0.147929 +311 341 0.147929 +312 341 0.065746 +314 341 0.591716 +315 341 0.591716 +316 341 0.147929 +318 341 0.591716 +341 341 72.906674 +347 341 -99.888744 +354 341 -96.813638 +358 341 -6.352920 +359 341 -14.193372 +369 341 -2.814297 +372 341 -100.476834 +373 341 -13.384674 +376 341 -3.472612 +378 341 -4.644757 +379 341 -171.115923 +380 341 -10.385121 +383 341 -23.057229 +394 341 -16.910501 +397 341 -5.935796 +398 341 -106.381423 +401 341 -12.787142 +403 341 -11.730710 +404 341 -208.040270 +405 341 -23.926459 +406 341 -12.891954 +408 341 -23.329048 +419 341 -4.712528 +420 341 -11.942121 +423 341 -110.808805 +426 341 -12.676769 +428 341 -9.152054 +429 341 -232.081541 +430 341 -251.180612 +431 341 -58.794905 +433 341 -23.634489 +445 341 -14.447872 +446 341 -1.944893 +448 341 -50.591417 +449 341 -58.750704 +450 341 -8.826225 +451 341 -12.575392 +454 341 -256.704247 +455 341 -514.954415 +456 341 -87.041929 +458 341 -23.974411 +471 341 -16.126986 +474 341 -107.922332 +475 341 -40.445867 +476 341 -17.213149 +477 341 -2.851554 +478 341 -17.911424 +479 341 -256.818274 +480 341 -519.077160 +481 341 -125.975271 +483 341 -24.349731 +496 341 -9.167953 +497 341 -6.691360 +499 341 -106.553955 +500 341 -149.417225 +1 342 0.147929 +3 342 0.147929 +5 342 0.591716 +6 342 0.065746 +7 342 0.147929 +9 342 0.065746 +11 342 0.147929 +12 342 0.065746 +13 342 0.147929 +14 342 0.591716 +15 342 0.591716 +16 342 0.147929 +17 342 0.147929 +18 342 0.147929 +20 342 0.065746 +21 342 0.147929 +22 342 0.147929 +23 342 0.147929 +24 342 0.065746 +25 342 0.591716 +26 342 0.591716 +27 342 0.591716 +28 342 0.147929 +29 342 0.065746 +30 342 0.147929 +32 342 0.147929 +33 342 0.147929 +34 342 0.147929 +38 342 0.147929 +39 342 0.147929 +40 342 0.147929 +41 342 0.147929 +43 342 0.147929 +44 342 0.147929 +45 342 0.147929 +46 342 0.065746 +47 342 0.591716 +48 342 0.147929 +53 342 0.591716 +54 342 0.591716 +56 342 0.147929 +57 342 0.147929 +58 342 0.147929 +59 342 0.147929 +60 342 0.065746 +61 342 0.147929 +62 342 0.147929 +65 342 0.147929 +66 342 0.591716 +67 342 0.147929 +69 342 0.147929 +70 342 0.147929 +71 342 0.147929 +72 342 0.591716 +73 342 0.147929 +75 342 0.147929 +77 342 0.147929 +80 342 0.147929 +81 342 0.065746 +82 342 0.591716 +83 342 0.147929 +84 342 0.065746 +85 342 0.065746 +86 342 0.065746 +87 342 0.147929 +88 342 0.065746 +89 342 0.147929 +90 342 0.147929 +91 342 0.147929 +92 342 0.147929 +93 342 0.591716 +94 342 0.065746 +96 342 0.065746 +97 342 0.147929 +99 342 0.147929 +100 342 0.147929 +101 342 0.065746 +102 342 0.147929 +103 342 0.065746 +104 342 0.147929 +105 342 0.591716 +106 342 0.147929 +107 342 0.065746 +108 342 0.147929 +109 342 0.065746 +110 342 0.147929 +111 342 0.147929 +112 342 0.147929 +114 342 0.147929 +115 342 0.147929 +116 342 0.065746 +117 342 0.591716 +118 342 0.147929 +119 342 0.147929 +121 342 0.065746 +122 342 0.147929 +124 342 0.591716 +127 342 0.147929 +129 342 0.147929 +130 342 0.065746 +131 342 0.147929 +132 342 0.147929 +133 342 0.065746 +134 342 0.147929 +135 342 0.591716 +138 342 0.065746 +139 342 0.147929 +140 342 0.147929 +142 342 0.065746 +143 342 0.147929 +144 342 0.065746 +145 342 0.065746 +153 342 0.147929 +155 342 0.147929 +156 342 0.147929 +157 342 0.147929 +158 342 0.147929 +159 342 0.147929 +162 342 0.147929 +163 342 0.065746 +164 342 0.147929 +165 342 0.147929 +166 342 0.147929 +167 342 0.065746 +168 342 0.147929 +169 342 0.147929 +171 342 0.147929 +172 342 0.065746 +173 342 0.065746 +174 342 0.065746 +175 342 0.065746 +176 342 0.065746 +179 342 0.147929 +180 342 0.065746 +181 342 0.065746 +182 342 0.147929 +183 342 0.065746 +184 342 0.591716 +188 342 0.147929 +189 342 0.147929 +190 342 0.065746 +191 342 0.065746 +192 342 0.591716 +193 342 0.147929 +194 342 0.147929 +195 342 0.147929 +196 342 0.065746 +198 342 0.147929 +201 342 0.065746 +202 342 0.065746 +203 342 0.147929 +206 342 0.147929 +210 342 0.591716 +214 342 0.065746 +215 342 0.147929 +217 342 0.147929 +226 342 0.147929 +227 342 0.591716 +228 342 0.591716 +229 342 0.147929 +230 342 0.591716 +231 342 0.147929 +232 342 0.065746 +233 342 0.065746 +235 342 0.591716 +237 342 0.147929 +238 342 0.065746 +240 342 0.591716 +241 342 0.147929 +242 342 0.065746 +244 342 0.065746 +248 342 0.147929 +250 342 0.065746 +252 342 0.591716 +253 342 0.147929 +254 342 0.147929 +255 342 0.147929 +256 342 0.065746 +257 342 0.147929 +258 342 0.065746 +263 342 0.065746 +264 342 0.147929 +265 342 0.591716 +266 342 0.591716 +267 342 0.065746 +269 342 0.147929 +271 342 0.147929 +272 342 0.147929 +273 342 0.591716 +274 342 0.065746 +275 342 0.065746 +277 342 0.147929 +278 342 0.147929 +279 342 0.065746 +280 342 0.065746 +281 342 0.065746 +282 342 0.065746 +283 342 0.147929 +284 342 0.147929 +285 342 0.591716 +287 342 0.147929 +289 342 0.147929 +290 342 0.147929 +291 342 0.147929 +292 342 0.591716 +293 342 0.147929 +294 342 0.147929 +295 342 0.147929 +298 342 0.147929 +299 342 0.147929 +300 342 0.065746 +301 342 0.147929 +302 342 0.147929 +304 342 0.065746 +306 342 0.591716 +307 342 0.147929 +308 342 0.147929 +309 342 0.591716 +342 342 52.796441 +347 342 -40.225568 +348 342 -29.996415 +354 342 -126.483354 +355 342 -19.562132 +359 342 -28.559055 +373 342 -24.933285 +374 342 -52.973609 +375 342 -4.849538 +376 342 -14.065765 +378 342 -5.041277 +379 342 -27.379938 +380 342 -139.356901 +381 342 -49.530034 +384 342 -13.862639 +385 342 -16.327151 +399 342 -2.293795 +400 342 -50.806770 +401 342 -40.347476 +402 342 -41.544826 +404 342 -33.490178 +405 342 -51.710872 +406 342 -190.578003 +407 342 -37.804583 +410 342 -28.694098 +426 342 -30.977164 +427 342 -74.835546 +428 342 -61.000732 +429 342 -9.794640 +430 342 -211.278723 +431 342 -125.841508 +432 342 -209.284664 +433 342 -25.267013 +435 342 -2.993904 +436 342 -24.328443 +450 342 -4.167685 +451 342 -3.178658 +452 342 -13.840030 +453 342 -104.149386 +454 342 -127.096124 +455 342 -98.726624 +456 342 -346.688520 +457 342 -184.980368 +458 342 -171.281996 +459 342 -9.113673 +461 342 -26.065857 +472 342 -15.822139 +473 342 -12.191913 +475 342 -58.170901 +476 342 -32.803774 +477 342 -9.623444 +478 342 -15.196588 +479 342 -100.255529 +480 342 -129.940234 +481 342 -115.626794 +482 342 -368.665038 +483 342 -200.322340 +484 342 -115.757078 +486 342 -0.277585 +487 342 -24.638552 +498 342 -4.362402 +499 342 -16.639516 +500 342 -106.221698 +343 343 11111111.111111 +344 344 11111111.111111 +345 345 11111111.111111 +268 346 -21.644266 +269 346 -14.642524 +274 346 -82.400919 +325 346 -118.687710 +346 346 11127202.315343 +347 346 11878.900649 +370 346 3333.449292 +371 346 27579.890508 +395 346 31514.333089 +419 346 24247.541585 +420 346 7851.858409 +444 346 8975.935129 +268 347 -503.505592 +269 347 -394.775476 +270 347 -175.197476 +274 347 -606.579193 +319 347 -87.985741 +320 347 -107.006608 +321 347 -88.368077 +322 347 -76.853129 +323 347 -23.064047 +324 347 -60.365060 +325 347 -88.678847 +326 347 -89.670052 +327 347 -61.189850 +328 347 -134.079378 +329 347 -180.062264 +331 347 -24.959251 +332 347 -99.824847 +334 347 -29.097068 +335 347 -54.332416 +336 347 -63.390320 +337 347 -89.114206 +338 347 -46.165647 +339 347 -86.472615 +340 347 -49.264000 +341 347 -99.888744 +342 347 -40.225568 +346 347 11878.900649 +347 347 11427399.467594 +348 347 117104.074863 +349 347 77761.788996 +350 347 66559.878454 +351 347 38954.713460 +352 347 19652.336447 +353 347 19652.345106 +354 347 19652.354912 +355 347 19652.366041 +356 347 19652.378710 +357 347 19652.393185 +358 347 19652.409792 +359 347 19652.428941 +360 347 19652.451143 +361 347 19652.477052 +362 347 570.904889 +370 347 2397.246523 +371 347 21064.065670 +372 347 149002.060732 +373 347 107474.154164 +374 347 58906.636316 +375 347 22752.190201 +376 347 42035.743358 +377 347 50448.869110 +378 347 50504.101740 +379 347 41740.483433 +380 347 18114.265452 +395 347 23560.881455 +396 347 4540.925992 +397 347 60558.530147 +398 347 121005.486056 +399 347 48451.105254 +400 347 54061.910795 +401 347 18244.232994 +402 347 17898.327045 +403 347 10478.684429 +404 347 8826.532926 +405 347 32524.143935 +406 347 47113.851125 +407 347 21830.683226 +419 347 18087.458419 +420 347 5911.657567 +421 347 15110.119806 +422 347 32202.394729 +423 347 93259.499465 +424 347 55835.084854 +425 347 28162.718563 +426 347 46516.254022 +427 347 21627.513161 +428 347 7499.092666 +429 347 18068.894526 +430 347 6490.279687 +432 347 8986.446256 +433 347 30893.414601 +434 347 30982.081160 +435 347 5647.069526 +444 347 6710.991363 +446 347 15928.275120 +447 347 23400.066083 +448 347 71733.746145 +449 347 57515.987827 +450 347 29875.421598 +451 347 20722.682497 +452 347 37481.452239 +453 347 28490.525079 +454 347 503.710981 +455 347 11684.063815 +456 347 7297.349259 +457 347 2834.851844 +460 347 21008.275276 +471 347 15989.771164 +472 347 18368.214919 +473 347 37280.344493 +474 347 69783.788180 +475 347 41944.062672 +476 347 19283.328141 +477 347 12769.184731 +478 347 31403.941174 +479 347 30969.608703 +480 347 1055.251111 +482 347 3293.585090 +483 347 5582.183675 +496 347 16056.512879 +497 347 14995.050188 +498 347 18728.585602 +499 347 72487.522243 +500 347 40650.760407 +268 348 -104.139686 +269 348 -157.304509 +270 348 -62.620339 +274 348 -338.914351 +319 348 -114.894237 +321 348 -113.315899 +324 348 -5.215303 +328 348 -182.891903 +331 348 -34.971064 +337 348 -49.377687 +338 348 -3.247400 +339 348 -62.321285 +340 348 -66.747692 +342 348 -29.996415 +347 348 117104.074863 +348 348 11248296.382276 +349 348 103491.471901 +350 348 88290.554069 +351 348 51191.063334 +352 348 25200.537617 +353 348 25200.549217 +354 348 25200.562353 +355 348 25200.577261 +356 348 25200.594233 +357 348 25200.613624 +358 348 25200.635872 +359 348 25200.661524 +360 348 25200.691267 +361 348 25200.725975 +362 348 732.081667 +373 348 19567.493271 +374 348 46459.551050 +375 348 30435.494447 +376 348 56728.828000 +377 348 67659.793125 +378 348 67734.318448 +379 348 56067.823449 +380 348 23682.446231 +398 348 9.986832 +399 348 7148.354902 +400 348 35255.555222 +401 348 18410.115394 +402 348 24527.577271 +403 348 14498.835054 +404 348 11751.394811 +405 348 44233.098972 +406 348 63316.409415 +407 348 29916.863683 +424 348 92.525602 +425 348 3285.479965 +426 348 28979.499535 +427 348 16511.383217 +428 348 10137.557470 +429 348 24761.182140 +430 348 9034.146098 +432 348 12121.813595 +433 348 42142.923738 +434 348 42264.091542 +435 348 7730.544229 +450 348 420.515863 +451 348 1995.285247 +452 348 22203.953713 +453 348 21106.098017 +454 348 568.547623 +455 348 15871.462310 +456 348 10168.692399 +457 348 3971.985666 +460 348 28631.445191 +476 348 957.290519 +477 348 1181.828653 +478 348 18116.242567 +479 348 22475.224723 +480 348 1092.259172 +482 348 4614.728911 +483 348 7821.344733 +268 349 -52.241573 +269 349 -100.287895 +270 349 -62.638190 +274 349 -241.588712 +319 349 -114.952710 +321 349 -113.315931 +328 349 -183.033438 +331 349 -24.149350 +340 349 -21.304941 +347 349 77761.788996 +348 349 103491.471901 +349 349 11241103.050587 +350 349 88332.776550 +351 349 51207.224444 +352 349 25200.544749 +353 349 25200.556350 +354 349 25200.569486 +355 349 25200.584394 +356 349 25200.601366 +357 349 25200.620757 +358 349 25200.643005 +359 349 25200.668656 +360 349 25200.698400 +361 349 25200.733108 +362 349 732.081874 +374 349 4760.359961 +375 349 15315.476119 +376 349 49762.478516 +377 349 67705.275486 +378 349 67779.852927 +379 349 56104.587702 +380 349 23694.548750 +401 349 2773.085406 +402 349 10944.343367 +403 349 7940.581592 +404 349 11760.161038 +405 349 44266.657691 +406 349 63359.750696 +407 349 29940.142546 +428 349 3051.366693 +429 349 11046.476417 +430 349 5562.883849 +432 349 12131.069556 +433 349 42175.539407 +434 349 42296.801181 +435 349 7736.551992 +455 349 5546.794657 +456 349 6413.950660 +457 349 2742.863963 +460 349 28653.579408 +482 349 3186.711810 +483 349 5401.047843 +268 350 -48.024509 +269 350 -84.942951 +270 350 -57.934315 +274 350 -201.017777 +319 350 -115.018841 +321 350 -113.315968 +328 350 -163.584743 +347 350 66559.878454 +348 350 88290.554069 +349 350 88332.776550 +350 350 11354135.268571 +351 350 51225.509987 +352 350 25200.552803 +353 350 25200.564404 +354 350 25200.577539 +355 350 25200.592448 +356 350 25200.609420 +357 350 25200.628810 +358 350 25200.651058 +359 350 25200.676710 +360 350 25200.706453 +361 350 25200.741162 +362 350 732.082108 +375 350 2615.604406 +376 350 37209.109923 +377 350 63295.283241 +378 350 63364.689246 +379 350 54308.865461 +380 350 23708.236296 +404 350 9134.700837 +405 350 39825.229155 +406 350 58921.634467 +407 350 27419.072369 +432 350 10192.896218 +433 350 37706.103654 +434 350 37815.526449 +435 350 7046.006394 +460 350 25489.592643 +268 351 -38.975399 +269 351 -43.667779 +270 351 -39.657769 +274 351 -105.933614 +319 351 -74.499424 +321 351 -113.316008 +328 351 -40.419129 +347 351 38954.713460 +348 351 51191.063334 +349 351 51207.224444 +350 351 51225.509987 +351 351 11437235.463215 +352 351 25200.561893 +353 351 25200.573494 +354 351 25200.586629 +355 351 25200.601538 +356 351 25200.618510 +357 351 25200.637900 +358 351 25200.660148 +359 351 25200.685800 +360 351 25200.715543 +361 351 25200.750252 +362 351 732.082372 +376 351 10604.751148 +377 351 26069.053270 +378 351 26095.591972 +379 351 24534.005887 +380 351 15649.547123 +404 351 1591.738527 +405 351 10510.553182 +406 351 23143.389961 +407 351 7094.169324 +432 351 2204.534858 +433 351 9322.396291 +434 351 9349.939738 +435 351 1804.574674 +460 351 6240.351580 +209 352 -8.217393 +268 352 -14.621303 +269 352 -32.898420 +270 352 -32.898011 +274 352 -32.898321 +321 352 -113.316055 +325 352 -8.217393 +347 352 19652.336447 +348 352 25200.537617 +349 352 25200.544749 +350 352 25200.552803 +351 352 25200.561893 +352 352 11658045.411917 +353 352 26557.221809 +354 352 25200.596892 +355 352 25200.611801 +356 352 25200.628773 +357 352 25200.648164 +358 352 25200.670412 +359 352 25200.696063 +360 352 25200.725807 +361 352 25200.760515 +362 352 732.082670 +375 352 1524.549779 +376 352 1953.458242 +377 352 932.893214 +397 352 537.792215 +398 352 1938.340609 +399 352 1942.745941 +400 352 423.206580 +419 352 2.448309 +420 352 1928.100319 +421 352 1931.072010 +422 352 1396.676809 +444 352 1521.790943 +128 353 -44.010555 +145 353 -30.196345 +156 353 -62.655499 +157 353 -25.885883 +162 353 -30.173738 +209 353 -51.684967 +268 353 -14.621304 +269 353 -32.898445 +270 353 -32.898016 +274 353 -32.898342 +320 353 -21.975654 +321 353 -123.516496 +322 353 -75.191261 +324 353 -3.133489 +325 353 -10.854273 +327 353 -40.843715 +329 353 -63.555126 +335 353 -15.618088 +338 353 -3.234992 +347 353 19652.345106 +348 353 25200.549217 +349 353 25200.556350 +350 353 25200.564404 +351 353 25200.573494 +352 353 26557.221809 +353 353 11963360.796713 +354 353 37695.265974 +355 353 27469.587674 +356 353 27469.636037 +357 353 27469.691295 +358 353 27469.754697 +359 353 27469.827802 +360 353 27469.912571 +361 353 27470.011494 +362 353 798.005479 +375 353 2013.762634 +376 353 2580.303556 +377 353 1291.535397 +378 353 37953.917241 +379 353 5412.406570 +397 353 710.364387 +398 353 2560.334825 +399 353 2566.153784 +400 353 559.009360 +402 353 9234.452575 +403 353 29405.372808 +404 353 4566.650951 +405 353 754.712537 +419 353 3.233947 +420 353 2546.808528 +421 353 2550.733805 +422 353 1844.856502 +426 353 19.784231 +427 353 18879.066976 +428 353 20405.854690 +429 353 3973.475082 +430 353 1263.006350 +444 353 2010.118516 +451 353 10898.256345 +452 353 22853.299844 +453 353 4565.353583 +454 353 5115.963728 +455 353 1250.571547 +456 353 481.124745 +475 353 338.253261 +476 353 16881.981174 +477 353 20751.970622 +479 353 2772.600959 +480 353 3885.804227 +481 353 1199.288556 +500 353 15555.543489 +6 354 -4.130753 +128 354 -78.103469 +145 354 -497.489896 +156 354 -424.926759 +157 354 -256.317245 +162 354 -499.269171 +209 354 -32.904776 +268 354 -14.621305 +269 354 -32.898474 +270 354 -32.898022 +274 354 -32.898365 +320 354 -123.657317 +321 354 -265.642271 +322 354 -25.594544 +323 354 -96.474867 +324 354 -132.551223 +326 354 -62.992106 +327 354 -21.107407 +328 354 -63.678722 +329 354 -39.255263 +330 354 -11.100961 +331 354 -379.332322 +332 354 -140.964905 +335 354 -46.976406 +336 354 -82.557170 +337 354 -46.849063 +338 354 -58.079799 +339 354 -86.346895 +341 354 -96.813638 +342 354 -126.483354 +347 354 19652.354912 +348 354 25200.562353 +349 354 25200.569486 +350 354 25200.577539 +351 354 25200.586629 +352 354 25200.596892 +353 354 37695.265974 +354 354 12476183.256581 +355 354 75676.550935 +356 354 59078.639416 +357 354 59078.807342 +358 354 59079.000020 +359 354 59079.222186 +360 354 59079.479797 +361 354 59079.780426 +362 354 1716.272621 +378 354 15887.441874 +379 354 178636.592249 +380 354 146079.816534 +381 354 17809.527853 +382 354 8905.282472 +402 354 2281.648728 +403 354 24524.935298 +404 354 95624.016095 +405 354 91591.711010 +406 354 116671.995172 +407 354 6767.510149 +408 354 15578.273087 +409 354 1715.950065 +427 354 5236.439107 +428 354 31378.310891 +429 354 72004.479537 +430 354 80061.788024 +431 354 42998.679313 +432 354 90142.915432 +434 354 13991.273642 +435 354 7408.459581 +451 354 2862.077939 +452 354 11793.938602 +453 354 34965.607670 +454 354 36872.091864 +455 354 62490.778936 +456 354 46013.980206 +457 354 66449.554388 +458 354 52003.842914 +460 354 6184.904789 +476 354 5252.070456 +477 354 12484.558458 +478 354 32373.742738 +479 354 27269.498466 +480 354 37602.611544 +481 354 72043.828309 +482 354 9200.253287 +483 354 94896.253792 +484 354 13735.494826 +500 354 4446.405571 +6 355 -81.469571 +145 355 -34.015438 +156 355 -66.770476 +157 355 -63.984932 +162 355 -40.602761 +209 355 -32.905176 +251 355 -31.740294 +268 355 -14.621305 +269 355 -32.898507 +270 355 -32.898028 +274 355 -32.898392 +297 355 -12.521241 +321 355 -350.714688 +322 355 -3.543964 +324 355 -6.344363 +328 355 -59.989778 +329 355 -4.639244 +331 355 -3.018751 +337 355 -15.580589 +338 355 -13.932613 +342 355 -19.562132 +347 355 19652.366041 +348 355 25200.577261 +349 355 25200.584394 +350 355 25200.592448 +351 355 25200.601538 +352 355 25200.611801 +353 355 27469.587674 +354 355 75676.550935 +355 355 12081725.342889 +356 355 78032.861539 +357 355 78035.395178 +358 355 78038.303869 +359 355 78041.659840 +360 355 78045.554085 +361 355 78050.102519 +362 355 2267.431160 +369 355 6718.150442 +370 355 7072.049112 +371 355 7072.412392 +372 355 7072.825683 +373 355 7073.294150 +374 355 7073.823906 +375 355 7074.422200 +376 355 7075.097644 +377 355 7075.860507 +378 355 7076.723080 +379 355 8990.360479 +380 355 15910.002411 +381 355 16302.246946 +382 355 8386.230710 +403 355 242.376561 +404 355 1431.514639 +405 355 2085.557621 +406 355 9706.517988 +407 355 7334.730030 +408 355 14675.673350 +409 355 1614.937995 +428 355 1258.289480 +429 355 458.372393 +431 355 6426.624604 +432 355 5326.200328 +433 355 664.201606 +434 355 13182.200957 +435 355 6978.861722 +452 355 497.081580 +453 355 1264.499235 +456 355 3520.931116 +457 355 4146.468177 +458 355 4240.581099 +459 355 21.720069 +460 355 5826.882936 +476 355 47.260267 +477 355 1052.999924 +478 355 708.306629 +481 355 882.142167 +482 355 5128.882271 +483 355 2377.329526 +484 355 3081.776801 +6 356 -32.918233 +36 356 -17.195725 +145 356 -32.898931 +156 356 -32.898732 +157 356 -32.897909 +162 356 -32.898401 +209 356 -32.905631 +212 356 -16.986900 +251 356 -32.997430 +268 356 -14.621306 +269 356 -32.898545 +270 356 -32.898036 +274 356 -32.898422 +295 356 -9.210141 +297 356 -33.012000 +321 356 -410.926201 +325 356 -9.210141 +347 356 19652.378710 +348 356 25200.594233 +349 356 25200.601366 +350 356 25200.609420 +351 356 25200.618510 +352 356 25200.628773 +353 356 27469.636037 +354 356 59078.639416 +355 356 78032.861539 +356 356 11968630.144597 +357 356 93599.707529 +358 356 93612.033506 +359 356 91664.724589 +360 356 91503.576294 +361 356 91514.271040 +362 356 2658.667559 +369 356 6984.235896 +370 356 7352.151414 +371 356 7352.529082 +372 356 7352.958743 +373 356 7353.445764 +374 356 7353.996502 +375 356 7354.618493 +376 356 7355.320689 +377 356 7356.113767 +378 356 8179.681990 +379 356 13273.916642 +380 356 10773.918940 +381 356 5227.400794 +399 356 249.689656 +400 356 2096.943592 +401 356 2099.109613 +402 356 2101.563317 +403 356 1281.675691 +420 356 1005.350663 +421 356 2090.534380 +422 356 2091.847992 +423 356 2093.339697 +424 356 1845.340402 +444 356 1653.025137 +445 356 1084.030914 +6 357 -32.919603 +7 357 -41.208517 +36 357 -33.051273 +145 357 -32.899000 +156 357 -32.898787 +157 357 -32.897909 +162 357 -32.898435 +203 357 -2.526895 +209 357 -32.906151 +211 357 -14.252876 +212 357 -33.051556 +251 357 -33.004162 +268 357 -14.621307 +269 357 -32.898588 +270 357 -32.898045 +274 357 -32.898457 +295 357 -34.050566 +297 357 -33.019723 +321 357 -500.851283 +325 357 -34.050566 +347 357 19652.393185 +348 357 25200.613624 +349 357 25200.620757 +350 357 25200.628810 +351 357 25200.637900 +352 357 25200.648164 +353 357 27469.691295 +354 357 59078.807342 +355 357 78035.395178 +356 357 93599.707529 +357 357 12062935.854687 +358 357 119474.551233 +359 357 112264.277815 +360 357 111655.823481 +361 357 111680.563732 +362 357 3244.732257 +369 357 6985.660885 +370 357 7353.651468 +371 357 7354.029214 +372 357 7354.458962 +373 357 7354.946082 +374 357 7355.496933 +375 357 7356.119050 +376 357 7356.821390 +377 357 7357.614630 +378 357 10470.650968 +379 357 23529.964790 +380 357 23827.866755 +381 357 24792.936916 +382 357 8645.146788 +399 357 923.120910 +400 357 7752.553726 +401 357 7760.561662 +402 357 7769.633186 +403 357 4738.448706 +420 357 3716.854884 +421 357 7728.858398 +422 357 7733.714920 +423 357 7739.229862 +424 357 6822.358343 +444 357 6111.354752 +445 357 4007.741520 +6 358 -32.921175 +7 358 -132.578704 +36 358 -33.062455 +145 358 -32.899079 +156 358 -32.898851 +157 358 -32.897909 +162 358 -32.898473 +203 358 -14.737150 +209 358 -32.906748 +211 358 -33.133721 +212 358 -33.062759 +251 358 -33.011892 +268 358 -14.621308 +269 358 -32.898637 +270 358 -32.898055 +274 358 -32.898496 +295 358 -103.650835 +297 358 -33.028592 +321 358 -623.354003 +323 358 -11.070681 +325 358 -34.138765 +327 358 -7.979659 +329 358 -22.571358 +334 358 -17.248609 +339 358 -4.288843 +341 358 -6.352920 +347 358 19652.409792 +348 358 25200.635872 +349 358 25200.643005 +350 358 25200.651058 +351 358 25200.660148 +352 358 25200.670412 +353 358 27469.754697 +354 358 59079.000020 +355 358 78038.303869 +356 358 93612.033506 +357 358 119474.551233 +358 358 12240373.904509 +359 358 143131.304390 +360 358 139138.002398 +361 358 139184.578783 +362 358 4044.087580 +369 358 6987.296932 +370 358 7355.373699 +371 358 7355.751533 +372 358 7356.181381 +373 358 7356.668616 +374 358 7357.219596 +375 358 7357.841859 +376 358 7358.544363 +377 358 7359.337788 +378 358 10821.703515 +379 358 27743.020597 +380 358 30808.590109 +381 358 49972.861833 +382 358 27944.672270 +383 358 12104.626193 +399 358 925.512024 +400 358 7772.634784 +401 358 7780.663462 +402 358 7789.758483 +403 358 4750.722476 +407 358 5818.616827 +408 358 7212.907936 +420 358 3726.482469 +421 358 7748.878078 +422 358 7753.747180 +423 358 7759.276408 +424 358 6840.029962 +431 358 3310.558848 +432 358 6626.455055 +433 358 3525.424294 +444 358 6127.184692 +445 358 4018.122575 +455 358 1656.777939 +456 358 4184.964888 +457 358 4953.820588 +458 358 3129.535618 +479 358 464.604407 +480 358 5215.613465 +481 358 5027.877765 +482 358 1967.842261 +483 358 1744.043391 +6 359 -32.922987 +7 359 -132.656444 +36 359 -33.075362 +92 359 -3.232121 +145 359 -32.899170 +156 359 -32.898925 +157 359 -32.897909 +162 359 -32.898517 +203 359 -14.746281 +209 359 -32.907436 +211 359 -33.152283 +212 359 -33.075690 +251 359 -33.020811 +268 359 -14.621309 +269 359 -32.898694 +270 359 -32.898066 +274 359 -32.898542 +295 359 -151.194403 +297 359 -33.038826 +298 359 -13.309785 +320 359 -8.964040 +321 359 -640.049159 +323 359 -9.913490 +325 359 -2.735319 +326 359 -9.006622 +327 359 -2.394141 +329 359 -4.110451 +332 359 -9.393991 +334 359 -5.695328 +335 359 -8.982542 +337 359 -21.860640 +338 359 -9.222662 +339 359 -16.162752 +341 359 -14.193372 +342 359 -28.559055 +347 359 19652.428941 +348 359 25200.661524 +349 359 25200.668656 +350 359 25200.676710 +351 359 25200.685800 +352 359 25200.696063 +353 359 27469.827802 +354 359 59079.222186 +355 359 78041.659840 +356 359 91664.724589 +357 359 112264.277815 +358 359 143131.304390 +359 359 12249813.045111 +360 359 142942.246948 +361 359 142997.401534 +362 359 4154.993389 +369 359 6989.184714 +370 359 7357.360926 +371 359 7357.738862 +372 359 7358.168826 +373 359 7358.656193 +374 359 7359.207321 +375 359 7359.829752 +376 359 7360.532447 +377 359 7361.326086 +378 359 8018.917719 +379 359 20565.150616 +380 359 23620.970049 +381 359 47975.944417 +382 359 31280.724575 +383 359 12952.930053 +384 359 14881.042883 +385 359 3152.106861 +399 359 74.155307 +400 359 622.771077 +401 359 623.414363 +402 359 3236.164790 +403 359 3385.000438 +404 359 3006.812619 +405 359 3009.608538 +406 359 499.584747 +407 359 1176.884532 +408 359 8962.076920 +409 359 9002.971503 +410 359 5539.659993 +420 359 298.578997 +421 359 620.867605 +422 359 621.257735 +423 359 621.700756 +424 359 548.047469 +431 359 602.883083 +432 359 1867.007319 +433 359 7855.572978 +434 359 7406.235634 +435 359 2070.511559 +436 359 4696.830079 +444 359 490.931777 +445 359 321.946237 +455 359 301.714435 +456 359 812.438535 +457 359 1857.501144 +458 359 7557.988798 +459 359 5487.846034 +460 359 3320.472361 +461 359 5032.253778 +479 359 84.608717 +480 359 949.810975 +481 359 1610.679491 +482 359 1725.742180 +483 359 6381.051104 +484 359 4219.243102 +485 359 4512.117059 +486 359 53.590324 +487 359 4756.699400 +6 360 -32.925089 +7 360 -132.746754 +36 360 -33.090347 +46 360 -5.300417 +83 360 -63.067907 +85 360 -22.404288 +90 360 -11.928220 +92 360 -15.025366 +95 360 -53.421193 +96 360 -43.153435 +98 360 -59.137274 +103 360 -13.146001 +104 360 -6.148771 +107 360 -54.583739 +110 360 -56.583492 +112 360 -51.814392 +116 360 -24.915028 +118 360 -12.068987 +123 360 -56.740716 +134 360 -14.417279 +145 360 -32.899276 +146 360 -55.788466 +154 360 -6.769186 +155 360 -19.966522 +156 360 -32.899010 +157 360 -32.897909 +162 360 -32.898568 +174 360 -10.285883 +176 360 -11.200418 +201 360 -17.127859 +203 360 -14.756889 +209 360 -32.908234 +211 360 -33.173845 +212 360 -33.090703 +237 360 -8.218552 +251 360 -33.031161 +256 360 -2.371717 +268 360 -14.621311 +269 360 -32.898760 +270 360 -32.898079 +274 360 -32.898595 +297 360 -33.050704 +298 360 -33.690235 +308 360 -6.715741 +309 360 -6.799763 +321 360 -1366.476080 +347 360 19652.451143 +348 360 25200.691267 +349 360 25200.698400 +350 360 25200.706453 +351 360 25200.715543 +352 360 25200.725807 +353 360 27469.912571 +354 360 59079.479797 +355 360 78045.554085 +356 360 91503.576294 +357 360 111655.823481 +358 360 139138.002398 +359 360 142942.246948 +360 360 11928929.856330 +361 360 315299.251688 +362 360 9176.756817 +369 360 6991.375493 +370 360 7359.667110 +371 360 7360.045165 +372 360 7360.475264 +373 360 7360.962783 +374 360 7361.514085 +375 360 7362.136711 +376 360 7362.839626 +377 360 7363.633514 +378 360 7777.196961 +379 360 19948.565923 +380 360 23006.287222 +381 360 53224.852046 +382 360 39436.593979 +383 360 68839.038799 +384 360 169167.987863 +385 360 96842.106861 +402 360 6611.648934 +403 360 7604.739703 +404 360 8250.384471 +405 360 17263.387009 +406 360 95103.715824 +407 360 158752.389050 +408 360 104685.233779 +409 360 1291.257421 +426 360 3764.084744 +427 360 5680.307724 +428 360 18422.651105 +429 360 30677.673539 +430 360 112459.709568 +431 360 66057.273577 +432 360 2183.531676 +447 360 4915.728419 +448 360 5658.822455 +449 360 5663.239434 +450 360 6629.402220 +451 360 7865.137766 +452 360 7543.288658 +453 360 9105.743649 +454 360 5105.234449 +455 360 905.476599 +472 360 513.067955 +475 360 3820.519028 +476 360 3863.246938 +477 360 2292.565918 +2 361 -8.324114 +3 361 -4.407671 +5 361 -25.168329 +6 361 -32.927542 +7 361 -132.852373 +8 361 -14.474784 +9 361 -4.864458 +16 361 -15.128925 +17 361 -20.443097 +18 361 -20.622716 +19 361 -6.819240 +20 361 -10.640544 +21 361 -6.232026 +22 361 -14.792665 +23 361 -15.879580 +24 361 -6.527524 +25 361 -6.366946 +31 361 -16.148300 +32 361 -9.411513 +33 361 -4.013758 +34 361 -5.043728 +36 361 -33.107859 +37 361 -8.066180 +38 361 -19.731781 +39 361 -110.279685 +42 361 -14.519357 +43 361 -10.201485 +44 361 -15.770933 +46 361 -15.703519 +47 361 -79.634950 +51 361 -20.228518 +52 361 -20.145268 +53 361 -14.313914 +54 361 -14.320749 +55 361 -6.254351 +60 361 -7.266940 +66 361 -6.086518 +67 361 -6.105527 +68 361 -11.062230 +69 361 -28.104345 +70 361 -12.561094 +77 361 -6.713366 +79 361 -20.177721 +80 361 -10.485294 +81 361 -11.786325 +82 361 -105.589094 +83 361 -140.023035 +84 361 -16.328849 +85 361 -34.576637 +87 361 -7.267212 +89 361 -12.053246 +90 361 -35.332702 +91 361 -6.259095 +92 361 -15.063457 +95 361 -140.811938 +96 361 -141.776352 +97 361 -8.476947 +98 361 -140.331983 +100 361 -7.174775 +101 361 -13.992050 +102 361 -8.615201 +103 361 -35.221367 +104 361 -15.627409 +106 361 -10.916201 +107 361 -140.711236 +108 361 -10.850546 +109 361 -43.639901 +110 361 -140.541756 +112 361 -140.953826 +115 361 -11.815759 +116 361 -34.448139 +117 361 -6.962447 +118 361 -35.319439 +119 361 -37.739875 +120 361 -4.245638 +121 361 -5.814899 +122 361 -15.014271 +123 361 -140.528628 +124 361 -15.669176 +125 361 -6.637592 +126 361 -26.196649 +129 361 -12.831573 +131 361 -15.360405 +132 361 -62.511822 +134 361 -35.112921 +135 361 -49.321790 +136 361 -20.240205 +137 361 -33.455593 +138 361 -25.598859 +140 361 -27.442755 +141 361 -11.018799 +143 361 -4.872717 +145 361 -32.899399 +146 361 -140.608576 +148 361 -15.800475 +150 361 -15.687744 +152 361 -6.898881 +154 361 -35.901065 +155 361 -34.717550 +156 361 -32.899109 +157 361 -32.897909 +159 361 -15.669481 +160 361 -8.477152 +161 361 -30.411228 +162 361 -32.898627 +163 361 -15.473049 +164 361 -14.220324 +166 361 -6.615280 +167 361 -28.144177 +168 361 -27.945913 +169 361 -6.679475 +172 361 -7.438858 +173 361 -113.029461 +174 361 -35.495541 +175 361 -28.128883 +176 361 -35.402985 +179 361 -24.643333 +180 361 -28.334028 +182 361 -27.928142 +183 361 -6.875801 +185 361 -14.993966 +186 361 -19.855896 +187 361 -6.056819 +188 361 -12.113669 +190 361 -9.777062 +192 361 -19.648767 +193 361 -15.631605 +194 361 -25.952218 +195 361 -6.302385 +201 361 -34.905313 +202 361 -25.258473 +203 361 -14.769298 +204 361 -16.651092 +206 361 -9.534104 +209 361 -32.909165 +211 361 -33.199059 +212 361 -33.108248 +213 361 -24.257999 +214 361 -11.491066 +215 361 -15.673740 +217 361 -6.607830 +218 361 -6.591341 +223 361 -6.511205 +224 361 -6.543806 +227 361 -6.335723 +228 361 -26.205243 +230 361 -6.340072 +231 361 -14.938298 +232 361 -14.940585 +234 361 -8.758491 +235 361 -6.525440 +237 361 -35.723726 +240 361 -7.185802 +241 361 -22.499515 +242 361 -16.628786 +244 361 -20.338013 +245 361 -20.377238 +247 361 -9.457191 +248 361 -22.103746 +250 361 -14.847766 +251 361 -33.043252 +252 361 -9.080641 +253 361 -12.828356 +255 361 -16.119020 +256 361 -16.040947 +257 361 -6.506019 +258 361 -6.460086 +259 361 -6.300585 +261 361 -45.316380 +263 361 -6.204815 +265 361 -15.671613 +266 361 -14.216848 +267 361 -16.063149 +268 361 -14.621313 +269 361 -32.898837 +270 361 -32.898095 +271 361 -5.930967 +272 361 -5.919850 +274 361 -32.898657 +275 361 -19.113197 +277 361 -14.007868 +279 361 -25.711040 +280 361 -8.297826 +281 361 -26.654078 +282 361 -15.723082 +283 361 -21.645950 +284 361 -7.074984 +288 361 -6.336169 +289 361 -14.871210 +290 361 -14.830562 +292 361 -20.276883 +293 361 -12.360321 +294 361 -12.394734 +296 361 -11.006256 +297 361 -33.064581 +298 361 -33.764501 +300 361 -29.376481 +302 361 -6.206450 +304 361 -20.118425 +305 361 -8.939816 +306 361 -13.013008 +307 361 -6.062402 +308 361 -35.907901 +309 361 -35.897164 +310 361 -21.524946 +311 361 -20.061351 +312 361 -7.077980 +313 361 -9.175145 +314 361 -8.005351 +315 361 -14.199111 +316 361 -14.179176 +317 361 -6.285408 +318 361 -50.970807 +321 361 -5330.838312 +347 361 19652.477052 +348 361 25200.725975 +349 361 25200.733108 +350 361 25200.741162 +351 361 25200.750252 +352 361 25200.760515 +353 361 27470.011494 +354 361 59079.780426 +355 361 78050.102519 +356 361 91514.271040 +357 361 111680.563732 +358 361 139184.578783 +359 361 142997.401534 +360 361 315299.251688 +361 361 12306897.557838 +362 361 69311.149936 +369 361 6993.934582 +370 361 7362.361006 +371 361 7362.739199 +372 361 7363.169456 +373 361 7363.657154 +374 361 7364.208657 +375 361 7364.831511 +376 361 7365.534683 +377 361 7366.328862 +378 361 7780.239630 +379 361 19959.466302 +380 361 23020.666339 +381 361 53278.271004 +382 361 39841.337288 +383 361 141048.716618 +384 361 426442.915706 +385 361 405347.244761 +386 361 378044.598420 +402 361 6626.223546 +403 361 7621.503469 +404 361 8511.822168 +405 361 21638.261274 +406 361 219338.057586 +407 361 409128.478766 +408 361 297198.718193 +409 361 133154.114537 +410 361 201746.306724 +411 361 216423.329800 +426 361 5204.317422 +427 361 7853.735093 +428 361 35478.512603 +429 361 66095.550722 +430 361 299897.997832 +431 361 193918.486772 +432 361 21852.932130 +433 361 131781.203616 +434 361 146239.979013 +435 361 101510.927212 +436 361 187846.368305 +447 361 6796.608681 +448 361 7824.029025 +449 361 7830.136050 +450 361 9795.828248 +451 361 16652.214181 +452 361 20719.933771 +453 361 31966.354338 +454 361 25542.537776 +455 361 8873.333131 +456 361 18895.075979 +457 361 154081.284867 +458 361 120214.052683 +459 361 102076.764165 +460 361 94242.981988 +461 361 116668.463988 +472 361 709.380548 +475 361 16550.148583 +476 361 18827.646096 +477 361 12181.152542 +478 361 2807.342782 +479 361 10098.336742 +480 361 39138.419670 +481 361 138881.478621 +482 361 85055.137795 +483 361 68580.129034 +484 361 48999.412225 +485 361 137556.624236 +486 361 72689.823776 +2 362 -0.784650 +3 362 -3.223390 +5 362 -1.271566 +6 362 -0.956586 +7 362 -3.861121 +8 362 -3.353131 +9 362 -2.793026 +16 362 -2.951903 +17 362 -1.546924 +18 362 -1.529765 +19 362 -1.259830 +20 362 -0.586045 +21 362 -1.629572 +22 362 -3.150153 +23 362 -2.572260 +24 362 -10.545096 +25 362 -1.534821 +31 362 -2.456990 +32 362 -7.736438 +33 362 -3.601260 +34 362 -2.627440 +36 362 -0.962075 +37 362 -9.038622 +38 362 -1.624135 +39 362 -4.817527 +40 362 -18.482491 +42 362 -3.323787 +43 362 -6.982595 +44 362 -2.621876 +46 362 -0.457851 +47 362 -6.413653 +51 362 -1.568580 +52 362 -1.577341 +53 362 -3.461349 +54 362 -3.456679 +55 362 -1.613529 +60 362 -1.056421 +66 362 -1.737442 +67 362 -1.723038 +68 362 -0.569468 +69 362 -1.192626 +70 362 -0.528588 +77 362 -1.317953 +79 362 -1.573901 +80 362 -6.714544 +81 362 -0.546902 +82 362 -4.935439 +83 362 -4.080440 +84 362 -2.385289 +85 362 -1.006945 +87 362 -1.056317 +89 362 -5.275103 +90 362 -1.030157 +91 362 -1.610138 +92 362 -0.438230 +95 362 -4.104676 +96 362 -4.134335 +97 362 -0.760826 +98 362 -4.089929 +100 362 -1.092917 +101 362 -0.504729 +102 362 -8.505016 +103 362 -1.026734 +104 362 -0.455511 +106 362 -6.311126 +107 362 -4.101582 +108 362 -6.372285 +109 362 -25.267681 +110 362 -4.096374 +112 362 -4.109038 +115 362 -0.546110 +116 362 -1.003008 +117 362 -1.187431 +118 362 -1.029749 +119 362 -30.855665 +120 362 -3.378223 +121 362 -1.952331 +122 362 -3.017555 +123 362 -4.095970 +124 362 -2.669956 +125 362 -1.361945 +126 362 -1.239487 +129 362 -4.601784 +131 362 -2.825561 +132 362 -10.759524 +134 362 -1.023402 +135 362 -20.124430 +136 362 -1.567366 +137 362 -1.112009 +138 362 -1.257433 +140 362 -1.207322 +141 362 -6.215797 +143 362 -12.176920 +145 362 -0.955730 +146 362 -4.098427 +148 362 -2.608210 +150 362 -2.661066 +152 362 -1.218689 +154 362 -1.047659 +155 362 -1.011265 +156 362 -0.955721 +157 362 -0.955684 +159 362 -2.669810 +160 362 -8.638941 +161 362 -1.151026 +162 362 -0.955706 +163 362 -2.767089 +164 362 -3.525934 +166 362 -1.375276 +167 362 -1.191786 +168 362 -1.196013 +169 362 -1.337384 +172 362 -0.995088 +173 362 -4.757713 +174 362 -1.035167 +175 362 -1.192108 +176 362 -1.032319 +178 362 -16.998817 +179 362 -1.290361 +180 362 -1.187853 +182 362 -1.196398 +183 362 -1.230384 +185 362 -3.029393 +186 362 -1.609488 +187 362 -1.760127 +188 362 -5.221569 +190 362 -7.386346 +191 362 -7.546078 +192 362 -1.634240 +193 362 -2.688106 +194 362 -1.246604 +195 362 -1.579494 +196 362 -7.630802 +199 362 -8.131908 +201 362 -1.017026 +202 362 -1.268516 +203 362 -0.429255 +204 362 -2.268117 +205 362 -18.248030 +206 362 -0.649070 +207 362 -18.244548 +208 362 -18.248913 +209 362 -0.956027 +211 362 -0.964853 +212 362 -0.962087 +213 362 -1.305384 +214 362 -0.555343 +215 362 -2.667766 +216 362 -8.523449 +217 362 -1.379765 +218 362 -1.389768 +223 362 -1.439684 +224 362 -1.419118 +227 362 -1.556270 +228 362 -1.239242 +230 362 -1.553264 +231 362 -3.062172 +232 362 -3.060816 +234 362 -8.366201 +235 362 -1.430661 +237 362 -1.042194 +239 362 -18.254076 +240 362 -1.088411 +241 362 -1.390975 +242 362 -2.275802 +244 362 -1.557366 +245 362 -1.553433 +247 362 -0.654970 +248 362 -1.415196 +250 362 -3.116488 +251 362 -0.960108 +252 362 -0.688030 +253 362 -4.604485 +254 362 -17.182336 +255 362 -2.469046 +256 362 -0.468246 +257 362 -1.442988 +258 362 -10.611405 +259 362 -10.768313 +261 362 -23.717758 +262 362 -70.302862 +263 362 -1.649314 +265 362 -2.668787 +266 362 -3.528355 +267 362 -2.492388 +268 362 -0.424749 +269 362 -0.955712 +270 362 -0.955690 +271 362 -1.858547 +272 362 -1.867410 +274 362 -0.955707 +275 362 -1.705990 +277 362 -3.676791 +279 362 -1.253923 +280 362 -8.813166 +281 362 -1.226923 +282 362 -2.644290 +283 362 -1.446182 +284 362 -1.135475 +288 362 -1.555962 +289 362 -3.102303 +290 362 -3.126950 +292 362 -1.563584 +293 362 -5.005067 +294 362 -4.975135 +296 362 -6.227435 +297 362 -0.960757 +298 362 -0.982099 +300 362 -1.168062 +302 362 -1.648122 +304 362 -1.580211 +305 362 -0.702499 +306 362 -4.450737 +307 362 -1.755846 +308 362 -1.047870 +309 362 -1.047539 +310 362 -1.454965 +311 362 -1.586387 +312 362 -1.134150 +313 362 -0.679013 +314 362 -9.097895 +315 362 -3.540734 +316 362 -3.554697 +317 362 -1.591447 +318 362 -18.706724 +321 362 -875.271933 +347 362 570.904889 +348 362 732.081667 +349 362 732.081874 +350 362 732.082108 +351 362 732.082372 +352 362 732.082670 +353 362 798.005479 +354 362 1716.272621 +355 362 2267.431160 +356 362 2658.667559 +357 362 3244.732257 +358 362 4044.087580 +359 362 4154.993389 +360 362 9176.756817 +361 362 69311.149936 +362 362 11265049.901535 +369 362 203.216384 +370 362 213.921415 +371 362 213.932404 +372 362 213.944905 +373 362 213.959076 +374 362 213.975101 +375 362 213.993198 +376 362 214.013630 +377 362 214.036705 +378 362 226.066598 +379 362 580.003974 +380 362 668.989780 +381 362 1548.624466 +382 362 1158.265888 +383 362 4109.978105 +384 362 12432.372181 +385 362 13902.961445 +386 362 81728.396002 +387 362 29740.954580 +402 362 192.735244 +403 362 221.684693 +404 362 247.607444 +405 362 629.839472 +406 362 6392.420540 +407 362 11926.078064 +408 362 8679.543417 +409 362 5605.654139 +410 362 11718.329630 +411 362 73444.835313 +412 362 28759.766406 +426 362 151.531344 +427 362 228.673029 +428 362 1033.658993 +429 362 1926.083585 +430 362 8742.449521 +431 362 5653.971036 +432 362 690.623261 +433 362 5630.693757 +434 362 7213.092770 +435 362 8946.835746 +436 362 70988.989418 +437 362 27708.266461 +438 362 631.597997 +447 362 197.893242 +448 362 227.808094 +449 362 227.985909 +450 362 285.259586 +451 362 485.252761 +452 362 604.072882 +453 362 932.338021 +454 362 745.328385 +455 362 275.428661 +456 362 678.000057 +457 362 6664.348964 +458 362 5772.076831 +459 362 7797.573915 +460 362 16051.945576 +461 362 59462.567758 +462 362 23576.265573 +463 362 3678.440670 +472 362 20.654656 +475 362 482.842245 +476 362 549.371176 +477 362 355.469411 +478 362 93.311451 +479 362 341.369659 +480 362 1582.374732 +481 362 6130.170183 +482 362 4165.882281 +483 362 5019.511656 +484 362 4013.825833 +485 362 27295.842362 +486 362 49427.106693 +487 362 12448.450365 +488 362 14192.064001 +363 363 11156313.758077 +364 364 11111111.111111 +365 365 11111111.111111 +366 366 11111111.111111 +367 367 11111111.111111 +368 368 11141713.231778 +251 369 -150.689183 +319 369 -13.894450 +321 369 -31.310650 +322 369 -5.236796 +324 369 -8.319198 +327 369 -22.287056 +328 369 -31.406085 +329 369 -6.905089 +337 369 -4.956959 +338 369 -4.096707 +339 369 -6.411341 +340 369 -13.050554 +341 369 -2.814297 +355 369 6718.150442 +356 369 6984.235896 +357 369 6985.660885 +358 369 6987.296932 +359 369 6989.184714 +360 369 6991.375493 +361 369 6993.934582 +362 369 203.216384 +369 369 11162809.459959 +370 369 14428.055069 +371 369 10067.652034 +372 369 10068.089493 +373 369 10068.585348 +374 369 9995.271230 +375 369 6978.661342 +376 369 6979.327643 +377 369 6980.080180 +378 369 6980.931076 +379 369 6981.894921 +380 369 264.838922 +394 369 13233.991520 +395 369 10153.304940 +396 369 11424.815460 +397 369 9973.679404 +398 369 9976.613282 +399 369 9562.011986 +400 369 10116.813004 +401 369 10118.648346 +402 369 10120.722236 +403 369 8229.985846 +404 369 3091.353744 +405 369 3091.433478 +406 369 2533.496860 +419 369 6342.856013 +420 369 4174.592766 +421 369 3745.215498 +422 369 2542.095984 +423 369 1541.989937 +424 369 605.091752 +425 369 2957.995258 +426 369 2960.454394 +427 369 2963.238347 +428 369 4735.766643 +429 369 7034.374097 +430 369 7037.316191 +431 369 7040.669956 +432 369 7044.507534 +433 369 7048.918358 +434 369 3305.887742 +444 369 3526.654571 +445 369 3637.821069 +446 369 2610.370812 +447 369 2925.513448 +448 369 1518.587029 +449 369 1912.482112 +450 369 1552.177354 +451 369 186.736510 +453 369 123.710579 +454 369 2969.980598 +455 369 2974.066531 +456 369 296.164713 +459 369 3748.126588 +460 369 6054.910649 +469 369 1113.529831 +470 369 4940.747373 +471 369 1705.430662 +472 369 1696.117839 +473 369 2531.593559 +474 369 1267.386059 +475 369 1097.784021 +476 369 1371.636032 +477 369 1549.019715 +494 369 1111.263250 +495 369 4900.700264 +496 369 392.438502 +497 369 1963.748046 +498 369 920.243020 +499 369 2309.365415 +500 369 809.387924 +251 370 -68.126067 +268 370 -5.184834 +269 370 -0.637631 +274 370 -18.036465 +319 370 -14.625846 +321 370 -32.960033 +325 370 -23.858931 +328 370 -20.540189 +346 370 3333.449292 +347 370 2397.246523 +355 370 7072.049112 +356 370 7352.151414 +357 370 7353.651468 +358 370 7355.373699 +359 370 7357.360926 +360 370 7359.667110 +361 370 7362.361006 +362 370 213.921415 +369 370 14428.055069 +370 370 11151321.930600 +371 370 16068.605447 +372 370 10598.336950 +373 370 10598.858924 +374 370 10521.685615 +375 370 7346.283203 +376 370 7346.984604 +377 370 7347.776782 +378 370 7348.672503 +379 370 7349.687121 +380 370 278.790104 +395 370 8063.795919 +396 370 4591.466896 +397 370 4592.180837 +398 370 4592.990342 +399 370 4671.669644 +400 370 7848.773291 +401 370 7849.993014 +402 370 7851.371254 +403 370 6614.817741 +404 370 3254.080763 +405 370 3254.164694 +406 370 2666.858625 +419 370 4894.433689 +420 370 1547.415245 +428 370 1238.112735 +429 370 4600.616983 +430 370 4602.541170 +431 370 4604.734597 +432 370 4607.244447 +433 370 4610.129211 +434 370 2162.114651 +444 370 1801.237627 +459 370 2451.347426 +460 370 3960.028907 +251 371 -47.587695 +268 371 -33.198576 +269 371 -38.402329 +270 371 -2.124525 +274 371 -135.872251 +319 371 -14.625970 +321 371 -32.961726 +322 371 -2.124525 +325 371 -207.473156 +346 371 27579.890508 +347 371 21064.065670 +355 371 7072.412392 +356 371 7352.529082 +357 371 7354.029214 +358 371 7355.751533 +359 371 7357.738862 +360 371 7360.045165 +361 371 7362.739199 +362 371 213.932404 +369 371 10067.652034 +370 371 16068.605447 +371 371 11192766.354409 +372 371 10966.546837 +373 371 10599.263773 +374 371 10522.089834 +375 371 7346.660570 +376 371 7347.362007 +377 371 7348.154226 +378 371 7349.049992 +379 371 7350.064663 +380 371 278.804425 +395 371 55145.033918 +396 371 437.599904 +399 371 77.764224 +400 371 3253.860134 +401 371 3253.911296 +402 371 3253.969064 +403 371 3254.034364 +404 371 3254.108308 +405 371 3254.192240 +406 371 2666.881199 +419 371 42274.356081 +420 371 13897.624078 +421 371 438.899508 +444 371 15707.849745 +446 371 440.352154 +471 371 441.953656 +496 371 443.699272 +251 372 -47.589762 +268 372 -323.163421 +269 372 -184.876022 +270 372 -102.864523 +274 372 -178.463280 +319 372 -14.626111 +320 372 -48.336388 +321 372 -32.963652 +322 372 -85.606377 +323 372 -28.134525 +324 372 -2.733429 +326 372 -60.652994 +327 372 -71.068704 +329 372 -208.137968 +332 372 -18.342383 +334 372 -30.152306 +335 372 -60.220158 +336 372 -75.026054 +338 372 -0.479126 +341 372 -100.476834 +347 372 149002.060732 +355 372 7072.825683 +356 372 7352.958743 +357 372 7354.458962 +358 372 7356.181381 +359 372 7358.168826 +360 372 7360.475264 +361 372 7363.169456 +362 372 213.944905 +369 372 10068.089493 +370 372 10598.336950 +371 372 10966.546837 +372 372 11289939.579732 +373 372 29118.726168 +374 372 10522.549696 +375 372 7347.089887 +376 372 7347.791365 +377 372 7348.583631 +378 372 7349.479450 +379 372 7350.494179 +380 372 278.820718 +396 372 4956.066967 +397 372 69883.206553 +398 372 93207.833135 +399 372 2422.615860 +400 372 3253.891464 +401 372 3253.942626 +402 372 3254.000395 +403 372 3254.065696 +404 372 3254.139640 +405 372 3254.223573 +406 372 2666.906877 +421 372 16874.789976 +422 372 36867.052695 +423 372 96550.381031 +424 372 17820.751016 +425 372 624.335320 +446 372 17742.430270 +447 372 26698.138708 +448 372 82140.740260 +449 372 36008.038757 +450 372 4123.880250 +451 372 433.951036 +471 372 17810.947537 +472 372 20589.072845 +473 372 43703.616293 +474 372 67990.779487 +475 372 14167.584351 +476 372 1173.718955 +477 372 191.822403 +496 372 17885.308094 +497 372 16871.192123 +498 372 21985.933050 +499 372 79954.618517 +500 372 22398.783938 +251 373 -47.592105 +268 373 -143.916151 +269 373 -168.649330 +270 373 -42.377369 +274 373 -143.663269 +319 373 -14.626270 +320 373 -74.493979 +321 373 -32.965835 +324 373 -70.172666 +326 373 -41.663151 +329 373 -0.051787 +332 373 -94.823125 +337 373 -70.231378 +338 373 -55.252110 +339 373 -53.599965 +341 373 -13.384674 +342 373 -24.933285 +347 373 107474.154164 +348 373 19567.493271 +355 373 7073.294150 +356 373 7353.445764 +357 373 7354.946082 +358 373 7356.668616 +359 373 7358.656193 +360 373 7360.962783 +361 373 7363.657154 +362 373 213.959076 +369 373 10068.585348 +370 373 10598.858924 +371 373 10599.263773 +372 373 29118.726168 +373 373 11221444.457899 +374 373 43570.913619 +375 373 7864.153062 +376 373 7348.278044 +377 373 7349.070362 +378 373 7349.966240 +379 373 7350.981037 +380 373 278.839185 +398 373 45259.769092 +399 373 51442.673117 +400 373 40692.767321 +401 373 9594.021387 +402 373 3254.035903 +403 373 3254.101205 +404 373 3254.175150 +405 373 3254.259084 +406 373 2666.935979 +423 373 10997.497619 +424 373 45680.139711 +425 373 32515.736814 +426 373 33456.494015 +427 373 12821.638863 +448 373 803.833308 +449 373 29892.838106 +450 373 30005.919566 +451 373 24360.265115 +452 373 28012.698893 +453 373 17434.576700 +454 373 139.243314 +473 373 1.245072 +474 373 11861.088544 +475 373 33742.891933 +476 373 21570.008508 +477 373 15124.143133 +478 373 23949.553868 +479 373 19352.646034 +480 373 380.309879 +499 373 3229.529917 +500 373 24125.712382 +251 374 -47.245191 +268 374 -78.624139 +269 374 -105.976971 +274 374 -121.958169 +319 374 -14.276887 +321 374 -32.968304 +324 374 -2.222642 +331 374 -10.904373 +337 374 -83.746947 +338 374 -3.442977 +339 374 -107.639207 +340 374 -45.629525 +342 374 -52.973609 +347 374 58906.636316 +348 374 46459.551050 +349 374 4760.359961 +355 374 7073.823906 +356 374 7353.996502 +357 374 7355.496933 +358 374 7357.219596 +359 374 7359.207321 +360 374 7361.514085 +361 374 7364.208657 +362 374 213.975101 +369 374 9995.271230 +370 374 10521.685615 +371 374 10522.089834 +372 374 10522.549696 +373 374 43570.913619 +374 374 11222336.622015 +375 374 23066.620832 +376 374 14383.542375 +377 374 7349.620773 +378 374 7350.516718 +379 374 7351.531591 +380 374 278.860069 +399 374 10710.792126 +400 374 64279.817672 +401 374 24544.482668 +402 374 16824.544576 +403 374 9771.673234 +404 374 3176.505219 +405 374 3176.523431 +406 374 2603.229924 +424 374 19.943347 +425 374 3664.839786 +426 374 50735.707484 +427 374 27624.728046 +428 374 7114.435988 +429 374 13780.334705 +430 374 3493.530401 +450 374 180.842343 +451 374 1747.624062 +452 374 39093.671083 +453 374 35934.097356 +454 374 712.161581 +455 374 10368.414168 +456 374 3779.490560 +457 374 1238.509996 +476 374 504.275205 +477 374 939.103413 +478 374 31654.264353 +479 374 38902.801531 +480 374 1466.940018 +482 374 1438.924600 +483 374 2438.783634 +209 375 -12.197711 +251 375 -32.971093 +268 375 -15.784458 +269 375 -30.607666 +270 375 -4.724072 +274 375 -79.106603 +321 375 -32.971093 +325 375 -12.197711 +328 375 -19.608900 +331 375 -35.147762 +339 375 -3.469342 +340 375 -67.147255 +342 375 -4.849538 +347 375 22752.190201 +348 375 30435.494447 +349 375 15315.476119 +350 375 2615.604406 +352 375 1524.549779 +353 375 2013.762634 +355 375 7074.422200 +356 375 7354.618493 +357 375 7356.119050 +358 375 7357.841859 +359 375 7359.829752 +360 375 7362.136711 +361 375 7364.831511 +362 375 213.993198 +369 375 6978.661342 +370 375 7346.283203 +371 375 7346.660570 +372 375 7347.089887 +373 375 7864.153062 +374 375 23066.620832 +375 375 11330002.920569 +376 375 29914.839112 +377 375 13196.469462 +378 375 11817.830455 +379 375 9189.477561 +380 375 278.883655 +397 375 798.286519 +398 375 2877.228665 +399 375 2883.767839 +400 375 2376.515528 +401 375 10573.573441 +402 375 24666.610346 +403 375 14578.066126 +404 375 2635.517919 +405 375 4479.412806 +406 375 4487.164325 +407 375 2547.420093 +419 375 3.634215 +420 375 2862.028211 +421 375 2866.439322 +422 375 2073.195254 +426 375 994.875340 +427 375 1800.613976 +428 375 10197.980963 +429 375 24901.549640 +430 375 9081.757894 +432 375 1948.649920 +433 375 4506.353762 +434 375 4518.299106 +435 375 697.345912 +444 375 2258.911826 +452 375 427.680392 +453 375 2005.831983 +454 375 202.975152 +455 375 15965.042944 +456 375 10221.604952 +457 375 3992.054877 +460 375 3189.040646 +478 375 248.116995 +479 375 1884.121152 +480 375 352.360828 +482 375 4638.045704 +483 375 7860.863561 +58 376 -222.657604 +116 376 -28.573144 +209 376 -15.629348 +251 376 -32.974241 +268 376 -15.583011 +269 376 -60.210690 +270 376 -23.023463 +274 376 -148.377902 +319 376 -65.326734 +320 376 -3.738565 +321 376 -32.974241 +322 376 -3.659999 +324 376 -9.997203 +325 376 -15.629348 +326 376 -32.855001 +328 376 -243.128916 +329 376 -7.580381 +331 376 -33.737637 +333 376 -28.573144 +338 376 -10.228367 +339 376 -12.154092 +340 376 -29.907399 +341 376 -3.472612 +342 376 -14.065765 +347 376 42035.743358 +348 376 56728.828000 +349 376 49762.478516 +350 376 37209.109923 +351 376 10604.751148 +352 376 1953.458242 +353 376 2580.303556 +355 376 7075.097644 +356 376 7355.320689 +357 376 7356.821390 +358 376 7358.544363 +359 376 7360.532447 +360 376 7362.839626 +361 376 7365.534683 +362 376 214.013630 +369 376 6979.327643 +370 376 7346.984604 +371 376 7347.362007 +372 376 7347.791365 +373 376 7348.278044 +374 376 14383.542375 +375 376 29914.839112 +376 376 11525193.223122 +377 376 71177.348650 +378 376 54660.607131 +379 376 41021.245870 +380 376 8353.076628 +397 376 1022.872065 +398 376 3686.692378 +399 376 3695.071248 +400 376 6082.924400 +401 376 26803.456337 +402 376 32162.399678 +403 376 33608.121377 +404 376 36359.600056 +405 376 62040.011527 +406 376 60980.565473 +407 376 22902.146838 +419 376 4.656645 +420 376 3667.215513 +421 376 3672.867621 +422 376 2656.456623 +423 376 1730.873767 +424 376 7274.878378 +425 376 3265.525522 +426 376 8776.197447 +427 376 7480.311301 +428 376 10116.788587 +429 376 15752.274385 +430 376 7726.586354 +431 376 6574.697062 +432 376 32692.074982 +433 376 55709.902115 +434 376 55624.190841 +435 376 5946.474425 +444 376 2894.421675 +447 376 6663.964103 +448 376 5504.802624 +449 376 71.371874 +450 376 715.682454 +451 376 2111.796750 +452 376 8128.503539 +453 376 5477.651416 +454 376 5151.407082 +455 376 8512.274699 +456 376 8963.185017 +457 376 3831.893956 +459 376 220.038186 +460 376 42075.238170 +472 376 250.099829 +474 376 800.196668 +475 376 449.937154 +476 376 1511.463817 +477 376 7301.258007 +478 376 3458.282162 +479 376 3123.488180 +480 376 4282.036232 +481 376 783.672388 +482 376 4451.967683 +483 376 7545.486346 +499 376 813.737654 +500 376 1458.713849 +1 377 -4.451226 +2 377 -10.336360 +3 377 -10.106363 +4 377 -10.242783 +5 377 -4.620854 +8 377 -10.014716 +10 377 -4.461743 +12 377 -4.577713 +14 377 -10.014792 +15 377 -10.014809 +17 377 -4.620256 +18 377 -16.270124 +19 377 -10.062830 +21 377 -4.451239 +22 377 -10.018871 +23 377 -4.493346 +26 377 -4.456632 +27 377 -61.152282 +31 377 -10.351824 +33 377 -4.505587 +37 377 -4.503474 +38 377 -4.514441 +39 377 -20.734382 +40 377 -63.421393 +41 377 -4.505089 +47 377 -6.846513 +52 377 -10.124081 +53 377 -10.014786 +54 377 -10.014750 +55 377 -8.199372 +57 377 -10.014828 +58 377 -106.117424 +60 377 -4.531172 +65 377 -10.103789 +68 377 -10.298574 +69 377 -4.547179 +71 377 -4.663173 +72 377 -4.451576 +77 377 -4.459245 +78 377 -4.453740 +79 377 -10.126945 +82 377 -4.864080 +84 377 -4.527996 +93 377 -4.519639 +94 377 -4.471931 +116 377 -49.918981 +119 377 -10.102085 +122 377 -10.028460 +124 377 -4.482619 +125 377 -10.020722 +126 377 -11.008015 +136 377 -4.506690 +138 377 -4.527006 +143 377 -4.899497 +148 377 -10.099426 +159 377 -4.482901 +160 377 -4.503935 +161 377 -8.187104 +163 377 -10.064452 +166 377 -10.018176 +169 377 -4.459661 +178 377 -5.525106 +186 377 -4.492621 +187 377 -4.451030 +189 377 -10.065138 +192 377 -12.671234 +193 377 -4.480890 +194 377 -11.057138 +195 377 -10.015071 +196 377 -6.578050 +197 377 -4.903187 +200 377 -4.523869 +203 377 -11.324749 +209 377 -7.961272 +211 377 -1.477177 +212 377 -30.170222 +213 377 -10.811077 +214 377 -11.720944 +215 377 -4.482458 +216 377 -7.117774 +218 377 -10.017737 +220 377 -10.015775 +221 377 -10.016153 +222 377 -10.016369 +224 377 -4.451716 +225 377 -4.451447 +231 377 -4.452715 +233 377 -4.451023 +235 377 -40.066280 +237 377 -10.173730 +238 377 -10.232123 +239 377 -7.258185 +241 377 -10.014716 +242 377 -4.544371 +251 377 -32.977796 +268 377 -33.450490 +269 377 -67.035944 +270 377 -29.809083 +274 377 -168.463052 +297 377 -24.763562 +319 377 -148.158171 +321 377 -32.977796 +322 377 -0.497323 +325 377 -75.199659 +328 377 -256.717822 +333 377 -852.504148 +347 377 50448.869110 +348 377 67659.793125 +349 377 67705.275486 +350 377 63295.283241 +351 377 26069.053270 +352 377 932.893214 +353 377 1291.535397 +355 377 7075.860507 +356 377 7356.113767 +357 377 7357.614630 +358 377 7359.337788 +359 377 7361.326086 +360 377 7363.633514 +361 377 7366.328862 +362 377 214.036705 +369 377 6980.080180 +370 377 7347.776782 +371 377 7348.154226 +372 377 7348.583631 +373 377 7349.070362 +374 377 7349.620773 +375 377 13196.469462 +376 377 71177.348650 +377 377 11836118.007691 +378 377 99277.014221 +379 377 72992.917646 +380 377 24020.165581 +397 377 488.482624 +398 377 2379.889196 +399 377 16432.504871 +400 377 24397.153017 +401 377 30962.587125 +402 377 134092.190127 +403 377 60690.553846 +404 377 37087.761280 +405 377 70661.388324 +406 377 82271.029381 +407 377 30030.097055 +419 377 2.223826 +420 377 12492.266529 +421 377 17262.260560 +422 377 16790.858992 +423 377 17942.815454 +424 377 13597.950484 +425 377 4352.223900 +426 377 19638.257386 +427 377 86557.007010 +428 377 23059.365384 +429 377 35691.491555 +430 377 4027.472026 +431 377 5783.823387 +432 377 28771.900582 +433 377 58932.081724 +434 377 58922.537512 +435 377 7759.767117 +444 377 13639.658682 +445 377 4755.022191 +447 377 11642.341404 +448 377 9617.217398 +450 377 3222.416680 +451 377 32218.914540 +452 377 68817.813244 +453 377 5739.099268 +454 377 25098.207172 +455 377 25874.549319 +456 377 5402.253263 +459 377 160.652323 +460 377 43055.564480 +472 377 436.939267 +474 377 543.318542 +475 377 8117.067982 +476 377 35520.966374 +477 377 58995.312468 +478 377 5563.558283 +479 377 3805.491708 +480 377 31475.667758 +481 377 12431.913829 +482 377 422.999711 +499 377 3213.135305 +500 377 7844.819828 +58 378 -32.984077 +128 378 -26.069634 +145 378 -40.275963 +156 378 -86.131021 +157 378 -70.916761 +162 378 -58.697747 +203 378 -172.714663 +209 378 -52.111372 +211 378 -15.103848 +212 378 -46.478778 +237 378 -7.663248 +251 378 -32.981816 +268 378 -33.478929 +269 378 -67.100063 +270 378 -29.838393 +274 378 -168.670019 +295 378 -13.213366 +297 378 -34.191743 +319 378 -148.258157 +320 378 -43.928541 +321 378 -34.820362 +322 378 -135.200273 +323 378 -4.630047 +324 378 -7.093856 +325 378 -126.556522 +326 378 -4.847621 +327 378 -78.028399 +328 378 -188.048239 +329 378 -122.557935 +331 378 -4.759394 +332 378 -8.560557 +333 378 -7.663248 +335 378 -37.055956 +336 378 -10.807747 +337 378 -5.875789 +338 378 -7.208931 +339 378 -3.033832 +341 378 -4.644757 +342 378 -5.041277 +347 378 50504.101740 +348 378 67734.318448 +349 378 67779.852927 +350 378 63364.689246 +351 378 26095.591972 +353 378 37953.917241 +354 378 15887.441874 +355 378 7076.723080 +356 378 8179.681990 +357 378 10470.650968 +358 378 10821.703515 +359 378 8018.917719 +360 378 7777.196961 +361 378 7780.239630 +362 378 226.066598 +369 378 6980.931076 +370 378 7348.672503 +371 378 7349.049992 +372 378 7349.479450 +373 378 7349.966240 +374 378 7350.516718 +375 378 11817.830455 +376 378 54660.607131 +377 378 99277.014221 +378 378 12097911.761880 +379 378 84891.440782 +380 378 27596.416630 +381 378 2623.688750 +382 378 341.229917 +398 378 703.056052 +399 378 23035.281539 +400 378 29043.476647 +401 378 29083.971146 +402 378 28149.974402 +403 378 66129.661926 +404 378 35190.684922 +405 378 55811.658344 +406 378 71304.939583 +407 378 30949.036258 +420 378 18871.328286 +421 378 28923.923964 +422 378 28948.394384 +423 378 28273.146742 +424 378 5972.459341 +426 378 33.167740 +427 378 31764.397562 +428 378 45055.815076 +429 378 14808.752056 +430 378 3575.680719 +431 378 2331.570309 +432 378 12278.387308 +433 378 43334.894546 +434 378 43459.813106 +435 378 7986.383078 +444 378 22862.895757 +445 378 10031.134742 +451 378 17030.253239 +452 378 43962.764892 +453 378 13155.402409 +454 378 15028.526272 +455 378 5248.964134 +456 378 1664.028285 +457 378 1578.168765 +460 378 29404.649006 +475 378 567.072653 +476 378 29739.420620 +477 378 40610.076450 +478 378 2784.208066 +479 378 16144.443309 +480 378 4373.333785 +481 378 1882.958075 +482 378 1164.000512 +483 378 1333.800061 +500 378 25306.513516 +6 379 -26.396467 +45 379 -98.773841 +58 379 -12.016942 +128 379 -171.807944 +145 379 -292.425666 +156 379 -262.453495 +157 379 -103.217647 +162 379 -245.733338 +203 379 -102.732824 +211 379 -150.102115 +212 379 -372.068729 +251 379 -32.986370 +268 379 -33.511219 +269 379 -46.692806 +270 379 -21.875156 +274 379 -145.603045 +295 379 -33.849886 +297 379 -286.720433 +319 379 -127.399854 +320 379 -302.626422 +321 379 -89.163000 +322 379 -53.861713 +323 379 -124.037147 +324 379 -181.652656 +325 379 -81.109827 +326 379 -78.388559 +327 379 -52.208857 +328 379 -209.275931 +329 379 -57.727976 +330 379 -11.688014 +331 379 -23.163171 +332 379 -193.797057 +334 379 -101.967913 +335 379 -156.547212 +336 379 -107.199898 +337 379 -61.531343 +338 379 -88.959055 +339 379 -138.166457 +341 379 -171.115923 +342 379 -27.379938 +347 379 41740.483433 +348 379 56067.823449 +349 379 56104.587702 +350 379 54308.865461 +351 379 24534.005887 +353 379 5412.406570 +354 379 178636.592249 +355 379 8990.360479 +356 379 13273.916642 +357 379 23529.964790 +358 379 27743.020597 +359 379 20565.150616 +360 379 19948.565923 +361 379 19959.466302 +362 379 580.003974 +369 379 6981.894921 +370 379 7349.687121 +371 379 7350.064663 +372 379 7350.494179 +373 379 7350.981037 +374 379 7351.531591 +375 379 9189.477561 +376 379 41021.245870 +377 379 72992.917646 +378 379 84891.440782 +379 379 12493519.082950 +380 379 70784.253496 +381 379 16068.651781 +382 379 4185.916960 +398 379 133.755620 +399 379 10740.258622 +400 379 18565.259940 +401 379 18588.937864 +402 379 11902.181634 +403 379 26552.004904 +404 379 250562.796154 +405 379 147188.562518 +406 379 72329.290437 +407 379 39438.749921 +408 379 4102.294809 +420 379 11013.557405 +421 379 18495.313602 +422 379 18509.635492 +423 379 18392.152242 +424 379 7804.100003 +427 379 1186.872541 +428 379 46634.525160 +429 379 168409.410790 +430 379 131746.320482 +431 379 17438.290622 +432 379 10036.819856 +433 379 44352.205336 +434 379 48613.909153 +435 379 10741.828346 +444 379 14621.250082 +445 379 7469.193536 +452 379 9242.675073 +453 379 80650.495591 +454 379 93086.111314 +455 379 109818.592607 +456 379 59016.379645 +457 379 10565.089742 +458 379 552.673351 +460 379 31102.019587 +476 379 2844.916855 +477 379 17655.548106 +478 379 72961.815163 +479 379 60243.979466 +480 379 82126.019485 +481 379 103703.636802 +482 379 12164.964666 +483 379 8012.571444 +500 379 503.144875 +6 380 -79.295276 +7 380 -77.742411 +36 380 -49.510780 +145 380 -173.072035 +156 380 -96.717255 +157 380 -91.037075 +162 380 -226.994318 +203 380 -18.772268 +211 380 -68.556355 +212 380 -67.377967 +251 380 -1.251247 +268 380 -30.929773 +269 380 -28.706800 +270 380 -13.079281 +274 380 -32.305181 +295 380 -33.907873 +297 380 -176.245514 +319 380 -105.021035 +320 380 -13.003624 +321 380 -102.741453 +322 380 -30.502196 +324 380 -60.620459 +325 380 -33.907873 +326 380 -12.398140 +328 380 -118.838704 +329 380 -60.269751 +331 380 -382.323556 +332 380 -19.120333 +336 380 -23.511504 +337 380 -89.523300 +338 380 -42.189429 +339 380 -21.788028 +341 380 -10.385121 +342 380 -139.356901 +347 380 18114.265452 +348 380 23682.446231 +349 380 23694.548750 +350 380 23708.236296 +351 380 15649.547123 +354 380 146079.816534 +355 380 15910.002411 +356 380 10773.918940 +357 380 23827.866755 +358 380 30808.590109 +359 380 23620.970049 +360 380 23006.287222 +361 380 23020.666339 +362 380 668.989780 +369 380 264.838922 +370 380 278.790104 +371 380 278.804425 +372 380 278.820718 +373 380 278.839185 +374 380 278.860069 +375 380 278.883655 +376 380 8353.076628 +377 380 24020.165581 +378 380 27596.416630 +379 380 70784.253496 +380 380 12305869.045993 +381 380 39624.201853 +382 380 8510.250475 +399 380 919.252472 +400 380 7720.065819 +401 380 7728.040197 +402 380 7737.073706 +403 380 4718.591729 +404 380 645.084944 +405 380 78422.872840 +406 380 166911.326910 +407 380 27491.514574 +408 380 15128.953681 +409 380 295.914731 +420 380 3701.279005 +421 380 7696.469788 +422 380 7701.305959 +423 380 7706.797791 +424 380 6793.768520 +429 380 12897.023463 +430 380 32293.930572 +431 380 60157.280224 +432 380 95014.054894 +433 380 13533.238559 +434 380 27962.042549 +435 380 9957.563204 +444 380 6085.744465 +445 380 3990.946650 +453 380 3665.553419 +454 380 16481.648481 +455 380 10850.432437 +456 380 32949.330260 +457 380 74909.408486 +458 380 54920.473551 +459 380 17.984223 +460 380 14415.167868 +477 380 838.263588 +478 380 16270.482300 +479 380 3710.920346 +480 380 10179.131148 +481 380 19884.396277 +482 380 22256.163825 +483 380 97392.389199 +484 380 15903.961089 +6 381 -12.251710 +7 381 -253.881930 +36 381 -226.463786 +92 381 -6.952400 +145 381 -1.015134 +156 381 -38.170417 +157 381 -37.779189 +162 381 -4.322659 +203 381 -14.722364 +211 381 -37.074515 +212 381 -19.288447 +295 381 -24.764109 +297 381 -30.883805 +298 381 -32.164039 +320 381 -10.279640 +321 381 -236.728718 +322 381 -6.018712 +324 381 -47.665074 +325 381 -24.764109 +328 381 -145.274762 +329 381 -27.647658 +336 381 -8.313473 +337 381 -138.860731 +338 381 -20.645491 +339 381 -24.006102 +342 381 -49.530034 +354 381 17809.527853 +355 381 16302.246946 +356 381 5227.400794 +357 381 24792.936916 +358 381 49972.861833 +359 381 47975.944417 +360 381 53224.852046 +361 381 53278.271004 +362 381 1548.624466 +378 381 2623.688750 +379 381 16068.651781 +380 381 39624.201853 +381 381 12128993.803658 +382 381 49207.256564 +383 381 8882.185081 +384 381 5661.206734 +399 381 671.362309 +400 381 5638.234724 +401 381 5644.058692 +402 381 11962.791935 +403 381 10706.391657 +404 381 7266.176016 +405 381 14993.487261 +406 381 54121.358893 +407 381 28869.171676 +408 381 32469.838148 +409 381 2991.987475 +420 381 2703.173820 +421 381 5621.001716 +422 381 5624.533740 +423 381 5628.544618 +424 381 4961.727331 +429 381 4162.636417 +430 381 4404.004456 +431 381 13320.195319 +432 381 38957.130388 +433 381 7620.414498 +434 381 32567.523400 +435 381 15976.749947 +444 381 4444.632542 +445 381 2914.728256 +453 381 558.498494 +454 381 6818.206335 +455 381 1429.711488 +456 381 5781.108474 +457 381 38682.784892 +458 381 8989.548204 +459 381 1794.154866 +460 381 14775.479191 +477 381 19.502244 +478 381 5895.150529 +479 381 1702.317610 +480 381 1442.458452 +481 381 4996.712838 +482 381 14198.940470 +483 381 24811.879780 +484 381 9543.008570 +7 382 -91.302873 +36 382 -21.608644 +92 382 -14.941191 +116 382 -5.546531 +156 382 -21.419569 +157 382 -19.877240 +203 382 -12.202349 +211 382 -18.864771 +295 382 -3.453508 +298 382 -33.525861 +321 382 -176.383577 +328 382 -62.905452 +329 382 -3.453508 +354 382 8905.282472 +355 382 8386.230710 +357 382 8645.146788 +358 382 27944.672270 +359 382 31280.724575 +360 382 39436.593979 +361 382 39841.337288 +362 382 1158.265888 +378 382 341.229917 +379 382 4185.916960 +380 382 8510.250475 +381 382 49207.256564 +382 382 12103593.347910 +383 382 12929.022349 +384 382 8559.454407 +385 382 352.318811 +402 382 6579.390903 +403 382 7567.636413 +404 382 7716.172728 +405 382 8850.963585 +406 382 3331.857617 +407 382 8179.736278 +408 382 15395.012989 +409 382 1761.987240 +426 382 837.952599 +427 382 1264.538112 +428 382 1266.156828 +429 382 1125.649631 +431 382 506.528768 +432 382 283.884813 +434 382 13761.030610 +435 382 7336.063574 +447 382 1094.329082 +448 382 1259.755107 +449 382 1260.738406 +450 382 1261.851429 +451 382 425.158593 +455 382 253.493663 +456 382 575.028181 +460 382 6098.431756 +472 382 114.218105 +479 382 71.086336 +480 382 798.009757 +46 383 -2.733954 +83 383 -63.781125 +85 383 -33.084470 +90 383 -6.157187 +92 383 -14.965166 +95 383 -39.143528 +96 383 -13.068223 +98 383 -53.725544 +103 383 -9.252961 +104 383 -4.892270 +107 383 -42.105342 +110 383 -47.204744 +112 383 -35.053119 +116 383 -34.096916 +118 383 -6.514607 +123 383 -47.605918 +134 383 -12.493894 +146 383 -45.176711 +155 383 -26.756500 +174 383 -1.995285 +176 383 -4.311007 +201 383 -19.436537 +295 383 -140.183265 +298 383 -33.572715 +321 383 -597.127721 +323 383 -23.650922 +327 383 -11.856786 +329 383 -27.453056 +334 383 -26.174047 +335 383 -5.067916 +339 383 -22.923309 +341 383 -23.057229 +358 383 12104.626193 +359 383 12952.930053 +360 383 68839.038799 +361 383 141048.716618 +362 383 4109.978105 +381 383 8882.185081 +382 383 12929.022349 +383 383 12265517.706968 +384 383 136302.498053 +385 383 71465.670686 +402 383 6588.585817 +403 383 7578.212433 +404 383 8459.481845 +405 383 21193.805626 +406 383 87899.673815 +407 383 133724.949292 +408 383 89398.328139 +426 383 5151.255707 +427 383 7773.660681 +428 383 21109.573729 +429 383 31377.724378 +430 383 84250.042055 +431 383 44957.923175 +432 383 9448.144277 +433 383 12010.109851 +447 383 6727.312425 +448 383 7744.257488 +449 383 7750.302248 +450 383 8847.863528 +451 383 8116.547949 +452 383 5884.527262 +453 383 4689.605007 +454 383 347.487280 +455 383 2015.103297 +456 383 5205.122458 +457 383 7761.716552 +458 383 11221.372249 +472 383 702.147909 +475 383 822.560731 +476 383 372.642465 +479 383 565.088327 +480 383 6343.638240 +481 383 7577.784324 +482 383 4164.153252 +483 383 8325.033622 +46 384 -15.521635 +83 384 -138.622540 +85 384 -34.302102 +90 384 -34.923503 +92 384 -11.760831 +95 384 -139.269511 +96 384 -140.057874 +98 384 -138.876129 +103 384 -34.832430 +104 384 -15.459349 +107 384 -139.187031 +110 384 -139.048149 +112 384 -139.385673 +116 384 -34.195809 +118 384 -34.912661 +123 384 -139.037387 +134 384 -34.743576 +137 384 -2.062011 +146 384 -139.102915 +154 384 -28.517347 +155 384 -34.418437 +174 384 -35.056438 +176 384 -34.980918 +201 384 -34.573081 +237 384 -32.019071 +256 384 -11.145665 +295 384 -82.891660 +298 384 -20.317197 +308 384 -28.388649 +309 384 -28.590992 +320 384 -9.930397 +321 384 -1793.308912 +326 384 -9.951426 +332 384 -10.275957 +335 384 -4.956515 +337 384 -23.791469 +338 384 -10.123259 +342 384 -13.862639 +359 384 14881.042883 +360 384 169167.987863 +361 384 426442.915706 +362 384 12432.372181 +381 384 5661.206734 +382 384 8559.454407 +383 384 136302.498053 +384 384 12583880.091061 +385 384 256351.330771 +386 384 63.034873 +402 384 3987.213902 +403 384 4586.106154 +404 384 5467.466691 +405 384 18490.998314 +406 384 216575.756629 +407 384 400205.744394 +408 384 284584.411460 +409 384 15822.467522 +410 384 2688.965190 +426 384 5166.196239 +427 384 7796.207150 +428 384 35148.279748 +429 384 65436.857081 +430 384 292639.674966 +431 384 186155.475189 +432 384 9678.060022 +433 384 1086.512833 +434 384 8130.010094 +435 384 1904.898997 +436 384 2279.853385 +447 384 6746.824100 +448 384 7766.718677 +449 384 7772.780968 +450 384 9719.778687 +451 384 16487.107965 +452 384 19611.509077 +453 384 28340.095009 +454 384 20656.547490 +455 384 4067.263671 +456 384 503.729931 +457 384 77.490856 +458 384 772.164844 +459 384 6041.944865 +460 384 3613.751221 +461 384 2442.668910 +472 384 704.184395 +475 384 14053.716102 +476 384 15357.085431 +477 384 9665.573197 +478 384 173.028543 +479 384 498.065089 +480 384 250.170332 +483 384 779.729656 +484 384 4654.229161 +485 384 4917.571536 +486 384 26.012881 +487 384 2308.914107 +5 385 -14.866842 +20 385 -4.697569 +39 385 -90.337375 +46 385 -10.304363 +68 385 -6.185843 +69 385 -24.213197 +70 385 -10.973466 +81 385 -8.576971 +82 385 -75.634190 +83 385 -76.195679 +85 385 -12.023690 +90 385 -23.182341 +95 385 -86.553776 +96 385 -97.689660 +98 385 -80.405035 +101 385 -15.128502 +103 385 -21.864303 +104 385 -9.387456 +107 385 -85.300486 +110 385 -83.147971 +112 385 -88.288404 +115 385 -8.670667 +116 385 -9.396534 +118 385 -23.029635 +123 385 -82.978912 +126 385 -18.263456 +134 385 -20.495284 +137 385 -37.465753 +138 385 -16.308504 +140 385 -22.192822 +146 385 -84.003231 +154 385 -28.851785 +155 385 -14.588984 +161 385 -30.995333 +167 385 -24.333584 +168 385 -23.733002 +173 385 -98.699809 +174 385 -24.971152 +175 385 -24.287376 +176 385 -23.973387 +179 385 -13.065321 +180 385 -24.905558 +182 385 -23.679003 +194 385 -17.470249 +201 385 -17.597355 +202 385 -15.171218 +206 385 -0.253352 +213 385 -11.708847 +214 385 -7.623161 +228 385 -18.291200 +237 385 -27.243414 +241 385 -5.045863 +248 385 -3.409779 +256 385 -13.535851 +279 385 -16.679327 +281 385 -19.726869 +283 385 -1.436455 +295 385 -16.327151 +300 385 -27.996993 +308 385 -28.911355 +309 385 -28.817713 +310 385 -0.898821 +321 385 -1865.664033 +342 385 -16.327151 +359 385 3152.106861 +360 385 96842.106861 +361 385 405347.244761 +362 385 13902.961445 +382 385 352.318811 +383 385 71465.670686 +384 385 256351.330771 +385 385 12051864.582063 +386 385 69427.015494 +404 385 241.155079 +405 385 4300.392862 +406 385 123006.959474 +407 385 247947.122623 +408 385 191094.291989 +409 385 112398.521169 +410 385 93523.495129 +426 385 1419.599076 +427 385 2142.289598 +428 385 16876.856396 +429 385 35060.656613 +430 385 185632.217370 +431 385 126636.351960 +432 385 20568.258267 +433 385 112021.777809 +434 385 93818.363123 +435 385 1173.128553 +436 385 2685.167671 +447 385 1853.933690 +448 385 2134.186575 +449 385 2135.852409 +450 385 3125.247782 +451 385 8697.535857 +452 385 13048.513046 +453 385 22640.406996 +454 385 20240.949287 +455 385 8417.531462 +456 385 20064.650724 +457 385 128482.155784 +458 385 81164.911282 +459 385 2139.592641 +461 385 2876.928679 +472 385 193.500105 +475 385 12607.614855 +476 385 14820.682385 +477 385 9793.500634 +478 385 3143.845359 +479 385 11230.816732 +480 385 36182.618853 +481 385 111698.185878 +482 385 54652.051355 +483 385 3065.352475 +486 385 30.637473 +487 385 2719.394833 +2 386 -10.985199 +3 386 -8.958698 +5 386 -17.866260 +8 386 -21.112615 +9 386 -8.999830 +16 386 -21.462625 +17 386 -26.719061 +18 386 -26.936927 +19 386 -9.598189 +20 386 -9.136824 +21 386 -9.296669 +22 386 -21.272193 +23 386 -21.969840 +24 386 -19.996850 +25 386 -9.353025 +31 386 -22.178191 +32 386 -20.122125 +33 386 -8.933010 +34 386 -9.020703 +37 386 -20.051608 +38 386 -25.869457 +39 386 -53.407407 +42 386 -21.133828 +43 386 -20.179427 +44 386 -21.889499 +47 386 -104.314764 +51 386 -26.460454 +52 386 -26.360636 +53 386 -21.039114 +54 386 -21.042140 +55 386 -9.305509 +60 386 -9.930565 +66 386 -9.243464 +67 386 -9.249996 +68 386 -8.199440 +69 386 -12.445225 +70 386 -5.414406 +77 386 -9.532609 +79 386 -26.399513 +80 386 -20.204042 +81 386 -6.767877 +82 386 -61.818108 +84 386 -22.325610 +87 386 -9.930792 +89 386 -20.398930 +91 386 -9.307412 +97 386 -11.157861 +100 386 -9.855176 +101 386 -3.223544 +102 386 -20.077115 +106 386 -20.246528 +108 386 -20.239614 +109 386 -80.983459 +115 386 -6.713515 +117 386 -9.694996 +119 386 -80.494495 +120 386 -8.947251 +121 386 -9.162315 +122 386 -21.395146 +124 386 -21.816342 +125 386 -9.488802 +126 386 -15.832163 +129 386 -20.553090 +131 386 -21.606970 +132 386 -87.149156 +135 386 -81.792231 +136 386 -26.474491 +137 386 -4.522131 +138 386 -16.993297 +140 386 -13.571995 +141 386 -20.257677 +143 386 -19.956011 +148 386 -21.911118 +150 386 -21.829540 +152 386 -9.650883 +159 386 -21.816559 +160 386 -20.070329 +161 386 -8.815437 +163 386 -21.681134 +164 386 -20.998505 +166 386 -9.476397 +167 386 -12.378795 +168 386 -12.710982 +169 386 -9.512694 +172 386 -10.079897 +173 386 -48.763388 +175 386 -12.404284 +178 386 -15.455634 +179 386 -18.977929 +180 386 -12.064232 +182 386 -12.740946 +183 386 -9.635316 +185 386 -21.383472 +186 386 -26.016054 +187 386 -9.233498 +188 386 -20.409156 +190 386 -20.146802 +192 386 -25.771831 +193 386 -21.789848 +194 386 -16.300214 +195 386 -9.325172 +202 386 -17.680741 +204 386 -22.602665 +206 386 -12.171982 +213 386 -19.830761 +214 386 -7.328492 +215 386 -21.819580 +217 386 -9.472304 +218 386 -9.463335 +223 386 -9.421456 +224 386 -9.438153 +227 386 -9.339348 +228 386 -15.815866 +230 386 -9.341229 +231 386 -21.351890 +232 386 -21.353175 +234 386 -20.084449 +235 386 -9.428689 +240 386 -9.864016 +241 386 -24.228727 +242 386 -22.582937 +244 386 -26.592184 +245 386 -26.639492 +247 386 -12.329888 +248 386 -25.363867 +250 386 -21.301852 +252 386 -11.868874 +253 386 -20.552340 +255 386 -22.154837 +257 386 -9.418843 +258 386 -19.994884 +259 386 -19.990352 +261 386 -81.176664 +263 386 -9.286145 +265 386 -21.818070 +266 386 -20.997027 +267 386 -22.110710 +271 386 -9.194349 +272 386 -9.191119 +275 386 -25.150959 +277 386 -20.911962 +279 386 -16.771078 +280 386 -20.061898 +281 386 -14.979293 +282 386 -21.854844 +283 386 -26.762595 +284 386 -9.777483 +288 386 -9.339540 +289 386 -21.314653 +290 386 -21.292527 +292 386 -26.518579 +293 386 -20.453704 +294 386 -20.460299 +296 386 -20.256291 +300 386 -10.393048 +302 386 -9.286769 +304 386 -26.328514 +305 386 -11.699521 +306 386 -20.597127 +307 386 -9.235349 +310 386 -27.149296 +311 386 -26.260321 +312 386 -9.779754 +313 386 -11.983518 +314 386 -20.049011 +315 386 -20.989516 +316 386 -20.981140 +317 386 -9.318121 +318 386 -82.131047 +321 386 -3384.385132 +361 386 378044.598420 +362 386 81728.396002 +384 386 63.034873 +385 386 69427.015494 +386 386 11881996.330410 +387 386 459.618060 +408 386 495.367036 +409 386 57406.046652 +410 386 172813.829322 +411 386 342686.131332 +432 386 1765.888643 +433 386 59595.437462 +434 386 96650.666088 +435 386 132889.258034 +436 386 305238.636074 +455 386 549.407217 +456 386 4229.791574 +457 386 72378.989168 +458 386 75347.505455 +459 386 131351.647376 +460 386 131287.620665 +461 386 206025.159299 +478 386 379.463369 +479 386 1557.058356 +480 386 14710.358460 +481 386 69327.717216 +482 386 56032.945992 +483 386 86508.162862 +484 386 64245.954383 +485 386 195744.451109 +486 386 141715.704152 +40 387 -21.049684 +178 387 -4.399097 +191 387 -8.779243 +196 387 -8.818201 +199 387 -9.275233 +205 387 -20.822116 +207 387 -20.818753 +208 387 -20.822970 +216 387 -9.659085 +239 387 -20.827958 +254 387 -19.850813 +262 387 -80.750291 +321 387 -245.873444 +362 387 29740.954580 +386 387 459.618060 +387 387 11282842.408475 +411 387 593.128338 +412 387 32942.299730 +436 387 596.758580 +437 387 31746.729422 +438 387 715.749992 +461 387 1437.658768 +462 387 27022.811375 +463 387 4184.877669 +486 387 1791.712242 +487 387 14320.547924 +488 387 16179.323400 +388 388 11169989.842413 +389 389 11111111.111111 +390 390 11111111.111111 +391 391 11111111.111111 +392 392 11111111.111111 +393 393 11265394.735976 +251 394 -288.479340 +322 394 -31.686759 +324 394 -31.742597 +327 394 -134.435502 +329 394 -40.693879 +337 394 -10.743282 +338 394 -12.730287 +339 394 -8.476864 +340 394 -1.059671 +341 394 -16.910501 +369 394 13233.991520 +394 394 11325759.706508 +395 394 11258.938969 +396 394 2288.410729 +397 394 239.711200 +398 394 239.848922 +399 394 200.072258 +419 394 38276.443492 +420 394 20714.514547 +421 394 11127.819753 +422 394 4209.838129 +423 394 2038.768075 +424 394 189.726611 +425 394 240.181416 +426 394 240.381091 +427 394 240.607141 +428 394 230.818446 +444 394 21293.750509 +445 394 21866.758838 +446 394 13042.633981 +447 394 9942.688111 +448 394 3527.634306 +449 394 2933.468121 +450 394 2052.237541 +451 394 246.896835 +453 394 10.044973 +454 394 241.154594 +455 394 241.486361 +456 394 24.047794 +469 394 6737.736846 +470 394 29802.584301 +471 394 10130.352022 +472 394 8137.349444 +473 394 9033.270611 +474 394 3190.393251 +475 394 2379.241576 +476 394 1813.531780 +477 394 2048.062616 +494 394 6724.022239 +495 394 29561.020175 +496 394 2358.077491 +497 394 11606.062411 +498 394 3717.978654 +499 394 8333.203958 +500 394 2340.853153 +251 395 -89.893967 +268 395 -39.119927 +269 395 -39.833008 +274 395 -156.886875 +324 395 -17.888636 +325 395 -235.839810 +328 395 -12.522715 +329 395 -0.702882 +337 395 -16.581383 +338 395 -11.640237 +339 395 -15.699603 +340 395 -14.858510 +346 395 31514.333089 +347 395 23560.881455 +369 395 10153.304940 +370 395 8063.795919 +371 395 55145.033918 +394 395 11258.938969 +395 395 11321410.557562 +396 395 9852.961440 +397 395 6160.897520 +398 395 6163.322163 +399 395 5606.139203 +400 395 2801.392624 +401 395 2802.105060 +402 395 2802.910111 +403 395 2048.982031 +419 395 48087.636216 +420 395 20007.775423 +421 395 10190.275582 +422 395 7125.074473 +423 395 3775.907126 +424 395 837.354958 +425 395 3367.780784 +426 395 3370.580596 +427 395 3373.750224 +428 395 3991.333775 +429 395 2804.853278 +430 395 2806.026395 +431 395 2807.363659 +432 395 2808.893837 +433 395 2810.652588 +434 395 1318.174146 +444 395 17850.312175 +445 395 45.666616 +446 395 2574.630504 +447 395 7375.058882 +448 395 4953.133206 +449 395 5112.514744 +450 395 3800.853295 +451 395 457.266095 +453 395 140.848810 +454 395 3381.426512 +455 395 3386.078489 +456 395 337.193857 +459 395 1494.510386 +460 395 2414.306625 +471 395 103.329763 +472 395 2004.907383 +473 395 6054.794759 +474 395 4001.838666 +475 395 3672.166262 +476 395 3358.757503 +477 395 3793.121110 +497 395 170.737783 +498 395 1774.978719 +499 395 5432.639943 +500 395 2393.139185 +251 396 -63.291247 +268 396 -12.719789 +270 396 -13.542107 +322 396 -26.261897 +328 396 -33.067422 +337 396 -1.989292 +339 396 -13.369414 +340 396 -14.865119 +347 396 4540.925992 +369 396 11424.815460 +370 396 4591.466896 +371 396 437.599904 +372 396 4956.066967 +394 396 2288.410729 +395 396 9852.961440 +396 396 11241049.809766 +397 396 12280.755147 +398 396 10758.818605 +399 396 10202.303525 +400 396 7397.344095 +401 396 7399.225350 +402 396 7401.351164 +403 396 5410.532246 +421 396 6348.719404 +422 396 3609.801631 +423 396 3215.474087 +424 396 796.427416 +425 396 3369.278615 +426 396 3372.079672 +427 396 3375.250710 +428 396 5231.158304 +429 396 7406.482281 +430 396 7409.580008 +431 396 7413.111182 +432 396 7417.151763 +433 396 7421.795912 +434 396 3480.764408 +446 396 5443.157491 +447 396 102.896306 +448 396 508.524945 +449 396 3181.389309 +450 396 3236.717661 +451 396 389.397099 +453 396 140.911453 +454 396 3382.930412 +455 396 3387.584457 +456 396 337.343825 +459 396 3946.397047 +460 396 6375.206638 +471 396 5463.413960 +474 396 319.271619 +475 396 440.555007 +476 396 2860.239237 +477 396 3230.133113 +496 396 5485.456063 +500 396 74.392305 +209 397 -4.302801 +251 397 -47.945210 +268 397 -124.397016 +269 397 -81.875539 +270 397 -35.167764 +274 397 -92.423583 +322 397 -61.717469 +323 397 -18.650741 +325 397 -4.302801 +327 397 -70.767550 +328 397 -33.072564 +329 397 -54.333839 +334 397 -30.163829 +335 397 -17.697790 +336 397 -74.596888 +340 397 -14.872646 +341 397 -5.935796 +347 397 60558.530147 +352 397 537.792215 +353 397 710.364387 +369 397 9973.679404 +370 397 4592.180837 +372 397 69883.206553 +375 397 798.286519 +376 397 1022.872065 +377 397 488.482624 +394 397 239.711200 +395 397 6160.897520 +396 397 12280.755147 +397 397 11252736.680116 +398 397 24568.571062 +399 397 11222.137638 +400 397 7620.094249 +401 397 7400.375878 +402 397 7402.502022 +403 397 5411.373546 +419 397 1.281987 +420 397 1009.594120 +421 397 12949.044175 +422 397 37453.530504 +423 397 20558.755181 +424 397 560.461274 +425 397 3370.984799 +426 397 3373.787275 +427 397 3376.959919 +428 397 5233.107909 +429 397 7407.633937 +430 397 7410.732146 +431 397 7414.263869 +432 397 7418.305078 +433 397 7422.949949 +434 397 3481.305642 +444 397 796.841935 +446 397 12791.120516 +447 397 26604.397385 +448 397 29142.392840 +449 397 388.334707 +453 397 140.982809 +454 397 3384.643510 +455 397 3389.299912 +456 397 337.514654 +459 397 3947.010684 +460 397 6376.197938 +471 397 12841.181633 +472 397 20530.326826 +473 397 25935.809068 +474 397 9353.912805 +496 397 12895.461476 +497 397 16827.937780 +498 397 20834.992905 +499 397 17866.132378 +209 398 -15.508394 +212 398 -3.036386 +251 398 -47.959585 +268 398 -234.878441 +269 398 -147.516590 +270 398 -62.606192 +274 398 -156.195102 +320 398 -118.428482 +323 398 -9.215161 +324 398 -6.495439 +325 398 -18.544780 +326 398 -100.663414 +328 398 -33.078394 +329 398 -151.455675 +332 398 -66.426720 +335 398 -41.895102 +338 398 -0.234909 +340 398 -14.881191 +341 398 -106.381423 +347 398 121005.486056 +348 398 9.986832 +352 398 1938.340609 +353 398 2560.334825 +369 398 9976.613282 +370 398 4592.990342 +372 398 93207.833135 +373 398 45259.769092 +375 398 2877.228665 +376 398 3686.692378 +377 398 2379.889196 +378 398 703.056052 +379 398 133.755620 +394 398 239.848922 +395 398 6163.322163 +396 398 10758.818605 +397 398 24568.571062 +398 398 11272969.414516 +399 398 22877.934877 +400 398 8897.825201 +401 398 8102.094132 +402 398 7486.184318 +403 398 5412.327458 +419 398 4.620607 +420 398 4138.930050 +421 398 4340.552875 +422 398 3332.665444 +423 398 86255.296735 +424 398 47724.347391 +425 398 4691.835944 +426 398 3375.725628 +427 398 3378.900094 +428 398 5235.320570 +429 398 7408.939748 +430 398 7412.038503 +431 398 7415.570849 +432 398 7419.612770 +433 398 7424.258460 +434 398 3481.919324 +444 398 3422.175997 +445 398 195.437824 +448 398 52901.939187 +449 398 62818.759782 +450 398 15414.494247 +451 398 856.718524 +453 398 141.063809 +454 398 3386.588099 +455 398 3391.247177 +456 398 337.708568 +459 398 3947.706459 +460 398 6377.321928 +473 398 17374.923299 +474 398 69423.681129 +475 398 38622.039419 +476 398 4193.925718 +477 398 327.119413 +498 398 1019.056287 +499 398 64323.220081 +500 398 45289.756958 +203 399 -24.925051 +209 399 -15.543640 +211 399 -8.767050 +212 399 -34.023372 +251 399 -45.847839 +268 399 -63.032502 +269 399 -72.594748 +270 399 -33.609564 +274 399 -46.608843 +295 399 -4.010399 +297 399 -33.593898 +319 399 -0.349563 +320 399 -2.016299 +324 399 -66.287764 +325 399 -120.863410 +328 399 -33.084989 +332 399 -44.084333 +337 399 -36.891196 +338 399 -55.184571 +339 399 -9.087698 +340 399 -12.413287 +342 399 -2.293795 +347 399 48451.105254 +348 399 7148.354902 +352 399 1942.745941 +353 399 2566.153784 +356 399 249.689656 +357 399 923.120910 +358 399 925.512024 +359 399 74.155307 +369 399 9562.011986 +370 399 4671.669644 +371 399 77.764224 +372 399 2422.615860 +373 399 51442.673117 +374 399 10710.792126 +375 399 2883.767839 +376 399 3695.071248 +377 399 16432.504871 +378 399 23035.281539 +379 399 10740.258622 +380 399 919.252472 +381 399 671.362309 +394 399 200.072258 +395 399 5606.139203 +396 399 10202.303525 +397 399 11222.137638 +398 399 22877.934877 +399 399 11242400.151541 +400 399 44609.852135 +401 399 32445.673254 +402 399 17081.595544 +403 399 6049.262366 +404 399 77.773796 +405 399 77.775802 +406 399 63.738958 +419 399 4.631109 +420 399 19817.664579 +421 399 27742.408840 +422 399 26752.564574 +423 399 23436.170980 +424 399 18679.582918 +425 399 33609.986649 +426 399 14996.380418 +427 399 4725.882205 +428 399 4698.156877 +429 399 7410.416918 +430 399 7413.516291 +431 399 7417.049341 +432 399 7421.092068 +433 399 7425.738685 +434 399 3482.613537 +444 399 21919.463670 +445 399 7900.713082 +449 399 1549.249777 +450 399 18009.417664 +451 399 23729.270602 +452 399 11520.799913 +453 399 2987.570371 +454 399 2824.954652 +455 399 2828.841066 +456 399 281.702811 +459 399 3948.493540 +460 399 6378.593418 +475 399 8277.586511 +476 399 18271.293507 +477 399 15025.847285 +478 399 10753.152803 +479 399 3210.518630 +480 399 14.712667 +500 399 397.828708 +58 400 -8.070001 +116 400 -99.997629 +203 400 -33.901634 +209 400 -3.386017 +211 400 -15.039715 +212 400 -34.070207 +251 400 -47.719094 +268 400 -77.314441 +269 400 -109.202168 +274 400 -88.884698 +295 400 -33.680130 +297 400 -34.018412 +319 400 -14.626654 +322 400 -8.070001 +325 400 -154.096115 +328 400 -33.092440 +333 400 -99.997629 +337 400 -108.691885 +338 400 -1.714872 +339 400 -114.187779 +342 400 -50.806770 +347 400 54061.910795 +348 400 35255.555222 +352 400 423.206580 +353 400 559.009360 +356 400 2096.943592 +357 400 7752.553726 +358 400 7772.634784 +359 400 622.771077 +369 400 10116.813004 +370 400 7848.773291 +371 400 3253.860134 +372 400 3253.891464 +373 400 40692.767321 +374 400 64279.817672 +375 400 2376.515528 +376 400 6082.924400 +377 400 24397.153017 +378 400 29043.476647 +379 400 18565.259940 +380 400 7720.065819 +381 400 5638.234724 +395 400 2801.392624 +396 400 7397.344095 +397 400 7620.094249 +398 400 8897.825201 +399 400 44609.852135 +400 400 11527479.259050 +401 400 81367.229941 +402 400 29731.396112 +403 400 13355.711504 +404 400 3254.260632 +405 400 3254.344568 +406 400 2667.006035 +419 400 1.008838 +420 400 22426.799190 +421 400 35206.546065 +422 400 35014.406309 +423 400 39829.011306 +424 400 35774.626988 +425 400 13847.058684 +426 400 59006.401358 +427 400 27921.916274 +428 400 1994.731996 +429 400 7412.085863 +430 400 7415.185934 +431 400 7418.719780 +432 400 7422.763417 +433 400 7427.411080 +434 400 3483.397878 +444 400 27828.388104 +445 400 12753.911209 +447 400 23321.921400 +448 400 19265.195931 +449 400 157.369205 +450 400 1584.247907 +451 400 1065.315983 +452 400 46995.599103 +453 400 36962.117794 +454 400 514.220165 +459 400 3949.382804 +460 400 6380.029980 +472 400 875.276106 +474 400 1764.368891 +476 400 85.102000 +477 400 357.794808 +478 400 38947.578528 +479 400 40398.376356 +480 400 1139.753397 +499 400 1794.225669 +5 401 -0.023504 +58 401 -270.024618 +71 401 -1.810557 +82 401 -6.564811 +92 401 -1.881657 +116 401 -124.087524 +126 401 -15.758813 +194 401 -16.471481 +203 401 -33.946738 +211 401 -15.058463 +212 401 -34.123301 +214 401 -23.661057 +251 401 -47.727740 +268 401 -20.189071 +269 401 -32.070734 +274 401 -46.180060 +295 401 -33.714919 +297 401 -34.069039 +298 401 -17.073792 +319 401 -14.626884 +320 401 -13.692473 +322 401 -5.620560 +324 401 -28.005756 +325 401 -169.867909 +326 401 -120.511329 +328 401 -33.100856 +329 401 -28.106033 +331 401 -1.517178 +333 401 -188.377746 +337 401 -1.339059 +338 401 -26.649573 +339 401 -52.405421 +340 401 -37.482483 +341 401 -12.787142 +342 401 -40.347476 +347 401 18244.232994 +348 401 18410.115394 +349 401 2773.085406 +356 401 2099.109613 +357 401 7760.561662 +358 401 7780.663462 +359 401 623.414363 +369 401 10118.648346 +370 401 7849.993014 +371 401 3253.911296 +372 401 3253.942626 +373 401 9594.021387 +374 401 24544.482668 +375 401 10573.573441 +376 401 26803.456337 +377 401 30962.587125 +378 401 29083.971146 +379 401 18588.937864 +380 401 7728.040197 +381 401 5644.058692 +395 401 2802.105060 +396 401 7399.225350 +397 401 7400.375878 +398 401 8102.094132 +399 401 32445.673254 +400 401 81367.229941 +401 401 11773464.998224 +402 401 55912.483747 +403 401 17447.375533 +404 401 3678.817348 +405 401 3679.251781 +406 401 2673.423536 +420 401 21931.258425 +421 401 38700.642413 +422 401 38751.642942 +423 401 45601.721158 +424 401 46189.797868 +425 401 16280.163052 +426 401 58188.574255 +427 401 28739.635157 +428 401 14965.021485 +429 401 17258.009350 +430 401 8801.106464 +431 401 7420.606471 +432 401 7424.651137 +433 401 7429.299982 +434 401 3484.283758 +444 401 30611.700059 +445 401 16764.794110 +446 401 21.386084 +447 401 28940.280916 +448 401 23906.271383 +449 401 109.603823 +450 401 7137.714283 +451 401 15900.840636 +452 401 34749.942796 +453 401 25596.499998 +454 401 6888.269556 +455 401 8949.258552 +456 401 1290.490700 +457 401 172.319910 +459 401 3950.387192 +460 401 6381.652517 +472 401 1086.134198 +474 401 2325.636544 +475 401 14620.395814 +476 401 5964.291407 +477 401 26778.929773 +478 401 12887.901561 +479 401 19543.086407 +480 401 6116.843077 +481 401 847.944845 +482 401 200.204567 +483 401 339.319810 +499 401 7534.857598 +500 401 13812.180901 +1 402 -12.176466 +2 402 -28.458070 +3 402 -27.539594 +4 402 -28.170308 +5 402 -12.706425 +8 402 -27.388614 +10 402 -12.224284 +12 402 -12.598368 +14 402 -27.385346 +15 402 -27.385097 +17 402 -12.728116 +18 402 -11.873459 +19 402 -27.590889 +21 402 -12.169701 +22 402 -27.420235 +23 402 -12.333145 +26 402 -12.204115 +27 402 -56.332726 +31 402 -28.114022 +33 402 -12.270600 +37 402 -12.265852 +38 402 -12.401189 +39 402 -4.576064 +40 402 -51.040100 +41 402 -12.269479 +47 402 -6.133039 +52 402 -27.795374 +53 402 -27.385437 +54 402 -27.386135 +55 402 -3.531790 +57 402 -27.384852 +58 402 -138.475361 +60 402 -12.454076 +65 402 -27.533988 +68 402 -28.342398 +69 402 -12.504086 +71 402 -11.047210 +72 402 -12.168821 +77 402 -12.214667 +78 402 -12.168661 +79 402 -27.804652 +82 402 -6.891763 +84 402 -12.444092 +92 402 -33.325654 +93 402 -12.302592 +94 402 -12.261090 +119 402 -27.530287 +122 402 -27.463558 +124 402 -12.297606 +125 402 -27.429514 +126 402 -14.707389 +128 402 -7.977695 +136 402 -12.376404 +138 402 -12.319598 +143 402 -13.235814 +148 402 -27.714686 +156 402 -19.908188 +157 402 -12.611396 +159 402 -12.298553 +160 402 -12.266888 +161 402 -3.551467 +162 402 -15.149652 +163 402 -27.596530 +166 402 -27.416509 +169 402 -12.216295 +178 402 -11.212420 +186 402 -12.330770 +187 402 -12.171097 +189 402 -27.598912 +192 402 -23.710530 +193 402 -12.291791 +194 402 -14.139957 +195 402 -27.382868 +196 402 -6.822316 +197 402 -13.245077 +200 402 -12.312339 +203 402 -22.673133 +209 402 -13.951385 +211 402 -13.602539 +212 402 -4.013326 +213 402 -29.247655 +214 402 -8.905852 +215 402 -12.297065 +216 402 -5.516266 +218 402 -27.414059 +220 402 -27.401450 +221 402 -27.404218 +222 402 -27.405699 +224 402 -12.180282 +225 402 -12.178354 +231 402 -12.186154 +233 402 -12.173922 +235 402 -109.628086 +238 402 -28.137206 +239 402 -5.221509 +241 402 -27.388673 +242 402 -12.495347 +251 402 -47.737510 +268 402 -15.904993 +269 402 -15.836238 +274 402 -71.302666 +295 402 -33.754329 +297 402 -9.362910 +298 402 -265.291279 +319 402 -129.672980 +320 402 -3.901208 +321 402 -29.030803 +322 402 -85.989744 +324 402 -8.282058 +325 402 -121.071144 +328 402 -122.403960 +329 402 -3.645195 +331 402 -47.204942 +333 402 -1682.197959 +337 402 -22.554280 +338 402 -10.436519 +339 402 -47.473568 +340 402 -67.667024 +342 402 -41.544826 +347 402 17898.327045 +348 402 24527.577271 +349 402 10944.343367 +353 402 9234.452575 +354 402 2281.648728 +356 402 2101.563317 +357 402 7769.633186 +358 402 7789.758483 +359 402 3236.164790 +360 402 6611.648934 +361 402 6626.223546 +362 402 192.735244 +369 402 10120.722236 +370 402 7851.371254 +371 402 3253.969064 +372 402 3254.000395 +373 402 3254.035903 +374 402 16824.544576 +375 402 24666.610346 +376 402 32162.399678 +377 402 134092.190127 +378 402 28149.974402 +379 402 11902.181634 +380 402 7737.073706 +381 402 11962.791935 +382 402 6579.390903 +383 402 6588.585817 +384 402 3987.213902 +395 402 2802.910111 +396 402 7401.351164 +397 402 7402.502022 +398 402 7486.184318 +399 402 17081.595544 +400 402 29731.396112 +401 402 55912.483747 +402 402 12207695.318185 +403 402 120328.200464 +404 402 57147.211420 +405 402 56778.763323 +406 402 33881.422749 +420 402 11023.076703 +421 402 27086.978173 +422 402 27482.587486 +423 402 27419.342246 +424 402 17924.862518 +425 402 8477.634724 +426 402 51225.165239 +427 402 274205.331395 +428 402 65554.192767 +429 402 68033.211314 +430 402 24044.942431 +431 402 17840.999079 +432 402 27614.636063 +433 402 27643.893061 +434 402 19534.416320 +444 402 21718.202287 +445 402 16427.886014 +446 402 378.764612 +450 402 2906.146813 +451 402 95264.625379 +452 402 194559.327239 +453 402 31550.473803 +454 402 40357.676089 +455 402 39170.822538 +456 402 14476.809027 +457 402 4192.331425 +459 402 8143.348882 +460 402 23770.414753 +474 402 412.826333 +475 402 13217.128369 +476 402 113545.783582 +477 402 161590.240814 +478 402 18641.300723 +479 402 23636.093002 +480 402 40028.851705 +481 402 10492.452221 +482 402 7482.894038 +483 402 10461.464868 +499 402 2755.030736 +500 402 31231.000054 +6 403 -4.496474 +18 403 -31.108445 +27 403 -105.783558 +39 403 -37.753811 +40 403 -116.749562 +45 403 -12.720175 +47 403 -12.009546 +55 403 -17.541360 +58 403 -133.752017 +92 403 -33.347538 +128 403 -18.596553 +145 403 -72.952052 +156 403 -97.541069 +157 403 -59.626654 +161 403 -17.553113 +162 403 -44.706144 +178 403 -3.602932 +192 403 -10.230277 +196 403 -10.647542 +203 403 -126.646328 +209 403 -39.014250 +211 403 -11.191981 +212 403 -71.142945 +216 403 -13.304107 +237 403 -7.435919 +239 403 -13.948863 +251 403 -38.831762 +268 403 -5.705533 +269 403 -4.270030 +274 403 -51.074955 +295 403 -20.585677 +298 403 -170.035795 +319 403 -146.894426 +320 403 -7.265735 +321 403 -33.391322 +322 403 -126.938908 +323 403 -44.516406 +325 403 -53.933215 +326 403 -1.227490 +327 403 -122.513746 +328 403 -162.333825 +329 403 -135.508713 +331 403 -35.516375 +333 403 -397.669035 +335 403 -52.894421 +336 403 -56.038495 +340 403 -25.534143 +341 403 -11.730710 +347 403 10478.684429 +348 403 14498.835054 +349 403 7940.581592 +353 403 29405.372808 +354 403 24524.935298 +355 403 242.376561 +356 403 1281.675691 +357 403 4738.448706 +358 403 4750.722476 +359 403 3385.000438 +360 403 7604.739703 +361 403 7621.503469 +362 403 221.684693 +369 403 8229.985846 +370 403 6614.817741 +371 403 3254.034364 +372 403 3254.065696 +373 403 3254.101205 +374 403 9771.673234 +375 403 14578.066126 +376 403 33608.121377 +377 403 60690.553846 +378 403 66129.661926 +379 403 26552.004904 +380 403 4718.591729 +381 403 10706.391657 +382 403 7567.636413 +383 403 7578.212433 +384 403 4586.106154 +395 403 2048.982031 +396 403 5410.532246 +397 403 5411.373546 +398 403 5412.327458 +399 403 6049.262366 +400 403 13355.711504 +401 403 17447.375533 +402 403 120328.200464 +403 403 12190845.685189 +404 403 91518.787541 +405 403 79923.466521 +406 403 49558.990753 +420 403 2247.069077 +421 403 11786.498666 +422 403 12170.795799 +423 403 12176.793246 +424 403 11625.502156 +425 403 7504.371947 +426 403 7084.043289 +427 403 20843.546774 +428 403 122594.031477 +429 403 92764.758236 +430 403 21896.727118 +431 403 15904.063282 +432 403 36776.953330 +433 403 36827.425528 +434 403 33086.190579 +444 403 9622.431454 +445 403 9913.804145 +446 403 379.013343 +451 403 6869.367057 +452 403 51704.175258 +453 403 41703.077185 +454 403 53735.699638 +455 403 55333.514200 +456 403 19428.677823 +457 403 4033.921589 +459 403 3799.705167 +460 403 31690.919230 +476 403 21255.214993 +477 403 56958.062992 +478 403 20570.532411 +479 403 15881.403287 +480 403 56166.844894 +481 403 23605.406865 +482 403 5591.633370 +483 403 7943.304439 +500 403 12985.946839 +6 404 -22.570360 +36 404 -3.255058 +39 404 -11.639795 +45 404 -189.623080 +55 404 -0.428142 +58 404 -154.843657 +92 404 -33.372370 +116 404 -17.237002 +128 404 -133.522879 +145 404 -125.429209 +156 404 -142.051201 +157 404 -78.640309 +161 404 -0.366502 +162 404 -148.945790 +203 404 -306.602168 +211 404 -137.687923 +212 404 -349.202937 +237 404 -15.126351 +251 404 -14.627770 +269 404 -20.480093 +270 404 -7.996535 +274 404 -23.303126 +297 404 -215.377749 +298 404 -165.722420 +319 404 -181.343887 +320 404 -438.154622 +321 404 -37.215117 +322 404 -52.746200 +323 404 -95.517961 +324 404 -87.950912 +325 404 -33.372370 +326 404 -76.371472 +327 404 -41.027230 +328 404 -185.650735 +329 404 -83.559398 +330 404 -11.637788 +331 404 -22.613011 +332 404 -113.404007 +333 404 -27.560790 +334 404 -112.061162 +335 404 -191.152002 +336 404 -98.645507 +337 404 -54.167484 +338 404 -65.598997 +339 404 -66.771328 +341 404 -208.040270 +342 404 -33.490178 +347 404 8826.532926 +348 404 11751.394811 +349 404 11760.161038 +350 404 9134.700837 +351 404 1591.738527 +353 404 4566.650951 +354 404 95624.016095 +355 404 1431.514639 +359 404 3006.812619 +360 404 8250.384471 +361 404 8511.822168 +362 404 247.607444 +369 404 3091.353744 +370 404 3254.080763 +371 404 3254.108308 +372 404 3254.139640 +373 404 3254.175150 +374 404 3176.505219 +375 404 2635.517919 +376 404 36359.600056 +377 404 37087.761280 +378 404 35190.684922 +379 404 250562.796154 +380 404 645.084944 +381 404 7266.176016 +382 404 7716.172728 +383 404 8459.481845 +384 404 5467.466691 +385 404 241.155079 +399 404 77.773796 +400 404 3254.260632 +401 404 3678.817348 +402 404 57147.211420 +403 404 91518.787541 +404 404 12482620.518524 +405 404 131111.845082 +406 404 69394.007632 +407 404 8528.998481 +421 404 7119.222213 +422 404 7500.867256 +423 404 7503.532562 +424 404 7506.549360 +425 404 7509.960027 +426 404 10220.051413 +427 404 3936.671772 +428 404 41180.540359 +429 404 236473.198414 +430 404 75581.331602 +431 404 19992.313407 +432 404 34486.005616 +433 404 42359.641519 +434 404 42152.787756 +435 404 2054.878248 +444 404 5932.152892 +445 404 7496.454103 +446 404 379.295572 +447 404 3417.555279 +448 404 3920.715338 +449 404 3923.994606 +450 404 3927.707179 +451 404 801.177035 +452 404 7359.565347 +453 404 76573.020421 +454 404 136050.243592 +455 404 103694.560041 +456 404 20643.380849 +457 404 8924.517321 +459 404 294.060226 +460 404 34432.270084 +472 404 343.604811 +476 404 1021.154413 +477 404 18731.593046 +478 404 68791.017156 +479 404 96209.726716 +480 404 98865.107712 +481 404 48066.419344 +482 404 8573.983585 +483 404 7288.739541 +6 405 -21.205188 +7 405 -158.762222 +36 405 -47.290752 +45 405 -89.127183 +58 405 -167.002305 +85 405 -25.555455 +90 405 -20.179128 +92 405 -130.204014 +116 405 -67.837901 +128 405 -35.113590 +145 405 -150.841873 +155 405 -1.590496 +156 405 -106.035316 +157 405 -35.047625 +162 405 -138.977601 +201 405 -29.446783 +203 405 -71.900787 +211 405 -57.728153 +212 405 -19.497370 +237 405 -15.157385 +251 405 -14.628147 +268 405 -2.618208 +269 405 -38.549071 +270 405 -16.830345 +274 405 -136.868391 +297 405 -176.627547 +298 405 -165.795301 +308 405 -12.395799 +309 405 -12.561416 +319 405 -298.399108 +320 405 -26.720991 +321 405 -93.480666 +322 405 -56.146069 +323 405 -18.732557 +324 405 -202.372894 +325 405 -33.400622 +326 405 -26.226646 +327 405 -10.058470 +328 405 -348.305432 +329 405 -146.427475 +331 405 -73.469902 +332 405 -143.454449 +333 405 -15.157385 +336 405 -49.155833 +337 405 -114.185971 +338 405 -97.501342 +339 405 -136.542207 +341 405 -23.926459 +342 405 -51.710872 +347 405 32524.143935 +348 405 44233.098972 +349 405 44266.657691 +350 405 39825.229155 +351 405 10510.553182 +353 405 754.712537 +354 405 91591.711010 +355 405 2085.557621 +359 405 3009.608538 +360 405 17263.387009 +361 405 21638.261274 +362 405 629.839472 +369 405 3091.433478 +370 405 3254.164694 +371 405 3254.192240 +372 405 3254.223573 +373 405 3254.259084 +374 405 3176.523431 +375 405 4479.412806 +376 405 62040.011527 +377 405 70661.388324 +378 405 55811.658344 +379 405 147188.562518 +380 405 78422.872840 +381 405 14993.487261 +382 405 8850.963585 +383 405 21193.805626 +384 405 18490.998314 +385 405 4300.392862 +399 405 77.775802 +400 405 3254.344568 +401 405 3679.251781 +402 405 56778.763323 +403 405 79923.466521 +404 405 131111.845082 +405 405 12633688.230835 +406 405 158630.625958 +407 405 48931.817738 +408 405 252.794234 +421 405 7125.249041 +422 405 7507.217168 +423 405 7509.884730 +424 405 7512.904082 +425 405 7516.317636 +426 405 18674.811813 +427 405 17537.019975 +428 405 25550.946165 +429 405 53846.472500 +430 405 171328.051280 +431 405 57529.695830 +432 405 50655.256560 +433 405 79878.136183 +434 405 79782.128743 +435 405 9324.754034 +444 405 5937.174798 +445 405 7502.800278 +446 405 379.616668 +447 405 13426.598560 +448 405 15422.238515 +449 405 15434.829617 +450 405 17122.925919 +451 405 15131.320209 +452 405 15079.682827 +453 405 12419.351371 +454 405 40429.923499 +455 405 70364.341805 +456 405 89263.514302 +457 405 27518.386181 +458 405 3499.803474 +459 405 294.359829 +460 405 59540.173252 +472 405 1368.280655 +475 405 7014.879538 +476 405 6372.510043 +477 405 1306.803415 +478 405 33886.565914 +479 405 13739.533301 +480 405 28746.228695 +481 405 103465.331936 +482 405 29205.672602 +483 405 22343.600872 +1 406 -18.602982 +2 406 -9.167910 +3 406 -8.104303 +4 406 -8.737519 +5 406 -10.797896 +6 406 -58.798166 +7 406 -95.275320 +8 406 -18.575118 +13 406 -18.530332 +14 406 -18.546347 +15 406 -18.545704 +16 406 -18.797762 +17 406 -21.553636 +19 406 -18.936740 +21 406 -18.504980 +22 406 -18.674362 +25 406 -18.535979 +26 406 -8.336205 +27 406 -40.913384 +28 406 -18.561522 +30 406 -10.340295 +32 406 -8.100875 +34 406 -8.099589 +36 406 -174.872860 +37 406 -18.223794 +38 406 -20.699218 +41 406 -19.159891 +42 406 -18.588927 +43 406 -8.106022 +44 406 -76.494962 +46 406 -4.957611 +49 406 -19.034662 +50 406 -20.799257 +51 406 -9.276369 +52 406 -20.793876 +53 406 -18.547622 +54 406 -74.201620 +55 406 -4.513915 +57 406 -18.545059 +58 406 -122.370814 +59 406 -19.284057 +60 406 -19.471928 +62 406 -18.356880 +63 406 -18.883705 +64 406 -18.297963 +65 406 -8.104770 +66 406 -8.194424 +67 406 -18.442142 +69 406 -11.510742 +70 406 -26.123297 +72 406 -8.226189 +73 406 -25.890662 +75 406 -18.532036 +77 406 -8.354574 +78 406 -8.194165 +80 406 -8.099141 +83 406 -114.298733 +84 406 -19.452418 +85 406 -34.022353 +86 406 -8.251877 +87 406 -8.652119 +89 406 -18.312098 +90 406 -40.319393 +91 406 -18.495422 +92 406 -186.463857 +93 406 -18.222762 +94 406 -18.954366 +95 406 -70.372840 +96 406 -24.268532 +98 406 -96.328763 +99 406 -19.108783 +101 406 -27.403435 +103 406 -16.647193 +104 406 -8.784202 +105 406 -19.173624 +106 406 -18.260069 +107 406 -75.634908 +108 406 -18.258378 +109 406 -18.259669 +110 406 -84.706601 +111 406 -18.608251 +112 406 -63.114064 +116 406 -61.823416 +117 406 -19.071312 +118 406 -11.796667 +119 406 -18.233076 +120 406 -18.233727 +122 406 -18.761968 +123 406 -85.420915 +124 406 -19.066783 +125 406 -8.315003 +126 406 -26.062998 +127 406 -20.671065 +129 406 -18.354936 +130 406 -8.388668 +131 406 -8.386909 +132 406 -8.464343 +134 406 -22.410533 +135 406 -18.344573 +136 406 -20.885809 +137 406 -13.981223 +141 406 -18.263055 +145 406 -144.324131 +146 406 -81.096986 +148 406 -19.129899 +149 406 -18.507288 +150 406 -19.069193 +151 406 -8.226389 +152 406 -18.977980 +153 406 -8.232314 +155 406 -191.305280 +156 406 -71.218159 +157 406 -70.783058 +159 406 -19.068369 +162 406 -173.596643 +163 406 -18.968424 +166 406 -18.682772 +167 406 -25.940604 +168 406 -11.411567 +169 406 -18.787991 +173 406 -26.056128 +174 406 -3.830251 +175 406 -25.904054 +176 406 -7.906202 +177 406 -18.497856 +178 406 -17.544736 +179 406 -10.595182 +181 406 -20.627782 +182 406 -11.436428 +183 406 -18.969356 +185 406 -18.733148 +186 406 -20.612571 +187 406 -18.479934 +188 406 -4.311207 +189 406 -18.986406 +190 406 -8.102647 +194 406 -25.964583 +195 406 -18.524839 +196 406 -4.724066 +197 406 -8.221907 +199 406 -3.908519 +201 406 -62.792401 +202 406 -25.008320 +203 406 -34.043741 +204 406 -19.658966 +205 406 -8.829422 +206 406 -20.522991 +208 406 -8.840398 +211 406 -30.482148 +212 406 -31.208220 +213 406 -20.252745 +214 406 -26.768499 +215 406 -19.066989 +217 406 -18.715121 +219 406 -18.605470 +220 406 -18.630564 +221 406 -18.639575 +222 406 -18.644586 +223 406 -74.476209 +224 406 -18.641999 +227 406 -18.538195 +228 406 -25.508661 +229 406 -18.637928 +230 406 -18.546388 +231 406 -18.694558 +233 406 -18.587043 +234 406 -18.368674 +235 406 -18.638524 +237 406 -6.023210 +238 406 -19.622551 +239 406 -8.821424 +241 406 -21.246049 +242 406 -19.612373 +244 406 -21.133605 +245 406 -9.402967 +247 406 -20.844626 +250 406 -18.676164 +251 406 -11.988084 +252 406 -20.022150 +253 406 -18.371361 +257 406 -18.622248 +258 406 -18.223978 +259 406 -8.099752 +261 406 -8.124182 +262 406 -3.496322 +263 406 -18.511853 +264 406 -19.994049 +265 406 -19.067681 +266 406 -18.529734 +267 406 -19.291731 +268 406 -27.523618 +269 406 -61.300335 +270 406 -27.261777 +271 406 -18.413037 +272 406 -18.410703 +273 406 -8.377635 +274 406 -163.402632 +275 406 -8.857600 +277 406 -7.710082 +278 406 -18.629187 +279 406 -25.622690 +281 406 -22.944307 +282 406 -19.098370 +283 406 -9.845316 +284 406 -19.187190 +285 406 -18.238361 +287 406 -8.223891 +289 406 -18.691350 +290 406 -18.680294 +292 406 -8.850210 +293 406 -18.314680 +294 406 -18.317926 +296 406 -18.262576 +297 406 -10.469577 +298 406 -109.813589 +299 406 -8.103049 +300 406 -13.453460 +302 406 -18.475032 +304 406 -19.342743 +305 406 -19.335293 +306 406 -18.367935 +307 406 -8.209937 +308 406 -30.017667 +309 406 -29.994653 +310 406 -78.964649 +311 406 -19.354853 +312 406 -19.169950 +313 406 -8.674851 +314 406 -18.222995 +315 406 -18.531977 +316 406 -18.525668 +317 406 -18.518498 +318 406 -18.365360 +319 406 -3784.740859 +320 406 -15.590913 +321 406 -925.219725 +322 406 -2.225865 +323 406 -7.395374 +324 406 -92.654477 +325 406 -0.501224 +326 406 -21.779047 +327 406 -20.030003 +328 406 -467.671338 +329 406 -5.459721 +331 406 -322.997943 +332 406 -23.207795 +333 406 -6.023210 +335 406 -25.676682 +336 406 -13.095442 +337 406 -210.698444 +338 406 -43.683182 +339 406 -37.795346 +341 406 -12.891954 +342 406 -190.578003 +347 406 47113.851125 +348 406 63316.409415 +349 406 63359.750696 +350 406 58921.634467 +351 406 23143.389961 +354 406 116671.995172 +355 406 9706.517988 +359 406 499.584747 +360 406 95103.715824 +361 406 219338.057586 +362 406 6392.420540 +369 406 2533.496860 +370 406 2666.858625 +371 406 2666.881199 +372 406 2666.906877 +373 406 2666.935979 +374 406 2603.229924 +375 406 4487.164325 +376 406 60980.565473 +377 406 82271.029381 +378 406 71304.939583 +379 406 72329.290437 +380 406 166911.326910 +381 406 54121.358893 +382 406 3331.857617 +383 406 87899.673815 +384 406 216575.756629 +385 406 123006.959474 +399 406 63.738958 +400 406 2667.006035 +401 406 2673.423536 +402 406 33881.422749 +403 406 49558.990753 +404 406 69394.007632 +405 406 158630.625958 +406 406 13420309.521931 +407 406 278082.947545 +408 406 134474.942020 +421 406 106.924449 +422 406 112.656421 +423 406 112.696452 +424 406 112.741762 +425 406 112.792987 +426 406 10539.150670 +427 406 16142.106548 +428 406 49355.937648 +429 406 81250.564896 +430 406 242300.937040 +431 406 697014.249936 +432 406 203955.184667 +433 406 103373.919422 +434 406 107524.197807 +435 406 14541.696368 +444 406 89.095713 +445 406 112.590140 +446 406 5.696686 +447 406 12232.389828 +448 406 14053.592740 +449 406 14065.016522 +450 406 17622.831049 +451 406 26407.258941 +452 406 35186.052933 +453 406 26329.497104 +454 406 47828.776887 +455 406 132485.159651 +456 406 462372.044215 +457 406 133528.942002 +458 406 66728.478117 +459 406 829.005990 +460 406 78203.927986 +472 406 1249.560002 +475 406 15712.635182 +476 406 15656.904164 +477 406 4297.341540 +478 406 34609.416927 +479 406 81143.735385 +480 406 173810.616057 +481 406 348168.709496 +482 406 54419.269753 +483 406 130962.651332 +484 406 21439.487499 +6 407 -8.386655 +7 407 -31.016068 +27 407 -47.742027 +36 407 -22.762807 +46 407 -15.390490 +55 407 -5.371182 +83 407 -137.608559 +85 407 -34.102262 +90 407 -34.628453 +95 407 -138.155538 +96 407 -138.820523 +98 407 -137.823089 +103 407 -34.551595 +104 407 -15.337909 +107 407 -138.085868 +110 407 -137.968516 +112 407 -138.253626 +116 407 -28.465306 +118 407 -34.619309 +123 407 -137.959420 +134 407 -34.476524 +146 407 -138.014798 +154 407 -23.366239 +155 407 -34.201090 +156 407 -14.545566 +157 407 -16.024907 +162 407 -0.848221 +174 407 -34.740478 +176 407 -34.676861 +178 407 -1.753651 +188 407 -5.821023 +196 407 -4.953089 +199 407 -6.926304 +201 407 -34.332236 +203 407 -30.760694 +205 407 -15.470811 +208 407 -15.435861 +211 407 -34.565797 +212 407 -34.553683 +237 407 -29.589403 +239 407 -15.496383 +256 407 -7.677250 +262 407 -8.637194 +269 407 -18.931630 +270 407 -8.941742 +274 407 -103.855117 +277 407 -0.878983 +295 407 -39.770240 +297 407 -35.120745 +308 407 -23.137921 +309 407 -23.496901 +319 407 -128.486509 +321 407 -1719.480166 +327 407 -3.792852 +328 407 -311.664220 +329 407 -32.330003 +334 407 -3.647385 +337 407 -10.844830 +342 407 -37.804583 +347 407 21830.683226 +348 407 29916.863683 +349 407 29940.142546 +350 407 27419.072369 +351 407 7094.169324 +354 407 6767.510149 +355 407 7334.730030 +358 407 5818.616827 +359 407 1176.884532 +360 407 158752.389050 +361 407 409128.478766 +362 407 11926.078064 +375 407 2547.420093 +376 407 22902.146838 +377 407 30030.097055 +378 407 30949.036258 +379 407 39438.749921 +380 407 27491.514574 +381 407 28869.171676 +382 407 8179.736278 +383 407 133724.949292 +384 407 400205.744394 +385 407 247947.122623 +404 407 8528.998481 +405 407 48931.817738 +406 407 278082.947545 +407 407 13007009.515157 +408 407 301040.447209 +409 407 5695.119708 +426 407 4300.449738 +427 407 6489.725795 +428 407 33642.672247 +429 407 63834.446676 +430 407 287500.762496 +431 407 185437.668198 +432 407 52724.947794 +433 407 54721.663741 +434 407 72135.222337 +435 407 20945.171101 +447 407 5616.197409 +448 407 6465.178973 +449 407 6470.225351 +450 407 8402.557628 +451 407 15942.449042 +452 407 18833.828067 +453 407 25805.735718 +454 407 17246.895883 +455 407 5497.684063 +456 407 5585.945285 +457 407 12961.836603 +458 407 22181.464165 +459 407 1749.483494 +460 407 42296.587291 +472 407 586.177810 +475 407 12310.522285 +476 407 12934.836702 +477 407 7910.242071 +479 407 665.474446 +480 407 7470.565124 +481 407 1496.053673 +482 407 554.705246 +483 407 23279.808445 +484 407 10415.367176 +36 408 -36.230486 +46 408 -12.717033 +83 408 -74.295615 +85 408 -1.110175 +90 408 -28.607372 +95 408 -99.526073 +96 408 -126.322907 +98 408 -84.583654 +101 408 -1.579275 +103 408 -25.428223 +104 408 -10.501686 +107 408 -96.488713 +110 408 -91.262083 +112 408 -103.722858 +118 408 -28.240030 +123 408 -90.851049 +134 408 -22.105897 +137 408 -13.671586 +146 408 -93.340290 +154 408 -35.187240 +155 408 -7.545027 +156 408 -36.221890 +157 408 -36.152900 +174 408 -32.890877 +176 408 -30.506087 +201 408 -15.006935 +211 408 -13.229371 +212 408 -12.862376 +237 408 -35.055885 +256 408 -15.701435 +295 408 -112.349420 +297 408 -26.834863 +308 408 -35.192294 +309 408 -35.184356 +321 408 -1246.624657 +323 408 -24.039115 +327 408 -8.437103 +328 408 -161.531887 +334 408 -23.296495 +335 408 -10.083503 +339 408 -23.164157 +341 408 -23.329048 +354 408 15578.273087 +355 408 14675.673350 +358 408 7212.907936 +359 408 8962.076920 +360 408 104685.233779 +361 408 297198.718193 +362 408 8679.543417 +379 408 4102.294809 +380 408 15128.953681 +381 408 32469.838148 +382 408 15395.012989 +383 408 89398.328139 +384 408 284584.411460 +385 408 191094.291989 +386 408 495.367036 +405 408 252.794234 +406 408 134474.942020 +407 408 301040.447209 +408 408 12812241.161262 +409 408 13456.027558 +410 408 43.679709 +428 408 13909.852995 +429 408 33802.489839 +430 408 211026.578369 +431 408 149855.232137 +432 408 20508.570218 +433 408 20770.184851 +434 408 36354.607176 +435 408 17165.494567 +450 408 842.143312 +451 408 8306.232073 +452 408 14507.740192 +453 408 26714.547817 +454 408 24694.529513 +455 408 6374.066291 +456 408 4153.663851 +457 408 7459.507513 +458 408 12134.946964 +460 408 16884.312652 +475 408 15416.364415 +476 408 18088.620140 +477 408 11938.826545 +478 408 1147.217089 +479 408 3529.978963 +480 408 2046.518581 +481 408 6337.506051 +482 408 4220.152875 +483 408 9198.014330 +5 409 -8.074397 +20 409 -0.296058 +36 409 -4.453979 +39 409 -85.540701 +68 409 -2.861670 +69 409 -24.196563 +70 409 -11.120106 +81 409 -6.984844 +82 409 -60.175500 +101 409 -16.726444 +115 409 -7.146451 +126 409 -13.931320 +137 409 -34.981150 +138 409 -10.560135 +140 409 -20.709556 +154 409 -6.868757 +156 409 -4.357923 +157 409 -3.574929 +161 409 -35.917113 +167 409 -24.404391 +168 409 -23.367643 +173 409 -99.974975 +175 409 -24.324620 +179 409 -4.968479 +180 409 -25.391901 +182 409 -23.274433 +194 409 -12.563420 +202 409 -8.599189 +213 409 -2.630050 +214 409 -5.339918 +228 409 -13.979167 +237 409 -3.223111 +256 409 -4.650220 +279 409 -11.199553 +281 409 -16.455308 +295 409 -63.255599 +300 409 -30.732091 +308 409 -7.002995 +309 409 -6.791950 +320 409 -9.911904 +321 409 -694.964178 +326 409 -9.905555 +328 409 -12.386831 +332 409 -10.121617 +337 409 -23.309325 +338 409 -10.007197 +354 409 1715.950065 +355 409 1614.937995 +359 409 9002.971503 +360 409 1291.257421 +361 409 133154.114537 +362 409 5605.654139 +380 409 295.914731 +381 409 2991.987475 +382 409 1761.987240 +384 409 15822.467522 +385 409 112398.521169 +386 409 57406.046652 +407 409 5695.119708 +408 409 13456.027558 +409 409 12552762.248832 +410 409 72856.986832 +430 409 3930.555511 +431 409 5507.040576 +432 409 13346.333393 +433 409 108406.488428 +434 409 84823.383468 +435 409 3036.481446 +452 409 872.413089 +453 409 3221.014588 +454 409 4524.944962 +455 409 5172.931520 +456 409 20816.695270 +457 409 123527.091891 +458 409 61679.767515 +459 409 6058.076985 +460 409 4741.043588 +475 409 2272.000639 +476 409 3206.286778 +477 409 2340.761884 +478 409 2935.356051 +479 409 10861.067125 +480 409 36929.821158 +481 409 103639.421335 +482 409 37033.807912 +483 409 144.188126 +484 409 4624.919105 +485 409 4825.059230 +2 410 -5.057559 +5 410 -26.954536 +17 410 -23.747794 +18 410 -24.907327 +20 410 -14.433768 +38 410 -18.932009 +39 410 -69.764831 +47 410 -80.665512 +51 410 -22.334460 +52 410 -21.777414 +68 410 -12.515057 +69 410 -15.492393 +70 410 -6.633377 +79 410 -21.995163 +81 410 -9.525732 +82 410 -87.647191 +97 410 -6.261445 +101 410 -1.818414 +115 410 -9.410798 +126 410 -22.707398 +136 410 -22.412265 +138 410 -25.139716 +140 410 -17.912490 +161 410 -7.564412 +167 410 -15.349100 +168 410 -16.064958 +173 410 -59.773284 +175 410 -15.404088 +179 410 -29.248487 +180 410 -14.669654 +182 410 -16.129446 +186 410 -19.800478 +192 410 -18.343829 +194 410 -23.690394 +202 410 -26.569848 +206 410 -13.087746 +213 410 -30.995406 +214 410 -10.704949 +228 410 -22.673111 +241 410 -30.978222 +244 410 -23.059613 +245 410 -23.317364 +247 410 -12.880223 +248 410 -30.395473 +252 410 -10.520812 +275 410 -14.395244 +279 410 -24.675844 +281 410 -20.907413 +283 410 -29.728180 +292 410 -22.655801 +295 410 -28.694098 +300 410 -11.034579 +304 410 -21.596720 +305 410 -9.587038 +310 410 -29.553091 +311 410 -21.210744 +313 410 -11.130603 +321 410 -1255.742803 +342 410 -28.694098 +359 410 5539.659993 +361 410 201746.306724 +362 410 11718.329630 +384 410 2688.965190 +385 410 93523.495129 +386 410 172813.829322 +408 410 43.679709 +409 410 72856.986832 +410 410 12201410.585332 +411 410 18674.427652 +432 410 603.431041 +433 410 75264.299594 +434 410 129215.890481 +435 410 94901.040334 +436 410 4719.039225 +456 410 2698.244522 +457 410 93058.358631 +458 410 106448.907548 +459 410 114364.396512 +460 410 3736.648786 +461 410 5056.048988 +479 410 262.177256 +480 410 16623.457065 +481 410 91827.786469 +482 410 81683.667443 +483 410 81929.571942 +484 410 48285.859952 +486 410 53.843728 +487 410 4779.191640 +2 411 -6.366862 +3 411 -9.049106 +8 411 -21.527227 +9 411 -9.101684 +16 411 -21.939985 +17 411 -4.266741 +18 411 -3.359047 +19 411 -9.820563 +21 411 -9.464494 +22 411 -21.715905 +23 411 -22.532709 +24 411 -20.148642 +25 411 -9.531627 +31 411 -22.774947 +32 411 -20.315179 +33 411 -9.015698 +34 411 -9.128025 +37 411 -20.222362 +38 411 -8.101620 +42 411 -21.552363 +43 411 -20.389275 +44 411 -22.439137 +47 411 -28.434643 +51 411 -5.381311 +52 411 -5.823086 +53 411 -21.439990 +54 411 -21.443587 +55 411 -9.475048 +60 411 -10.207594 +66 411 -9.400764 +67 411 -9.408609 +77 411 -9.743665 +79 411 -5.650229 +80 411 -20.420808 +84 411 -22.946025 +87 411 -10.207857 +89 411 -20.665816 +91 411 -9.477318 +97 411 -5.361901 +100 411 -10.120111 +102 411 -20.256176 +106 411 -20.474874 +108 411 -20.466105 +109 411 -81.896136 +117 411 -9.933693 +119 411 -81.268521 +120 411 -9.034281 +121 411 -9.302732 +122 411 -21.860702 +124 411 -22.353844 +125 411 -9.692159 +129 411 -20.855465 +131 411 -22.109196 +132 411 -89.279780 +135 411 -82.906296 +136 411 -5.319718 +141 411 -20.488993 +143 411 -20.092392 +148 411 -22.464326 +150 411 -22.369237 +152 411 -9.882193 +159 411 -22.354096 +160 411 -20.247209 +163 411 -22.195954 +164 411 -21.391690 +166 411 -9.677551 +169 411 -9.720265 +172 411 -10.380524 +178 411 -19.945201 +183 411 -9.864000 +185 411 -21.846973 +186 411 -7.402281 +187 411 -9.388782 +188 411 -20.678490 +190 411 -20.347215 +192 411 -8.577192 +193 411 -22.322931 +195 411 -9.498491 +204 411 -23.266973 +215 411 -22.357621 +217 411 -9.672730 +218 411 -9.662158 +223 411 -9.612721 +224 411 -9.632448 +227 411 -9.515365 +230 411 -9.517604 +231 411 -21.809813 +232 411 -21.811326 +234 411 -20.265845 +235 411 -9.621270 +240 411 -10.130376 +242 411 -23.244140 +244 411 -4.808321 +245 411 -4.605227 +247 411 -0.096891 +250 411 -21.750876 +252 411 -1.922853 +253 411 -20.854549 +255 411 -22.747822 +257 411 -9.609632 +258 411 -20.145962 +259 411 -20.139774 +261 411 -82.140074 +263 411 -9.451917 +265 411 -22.355860 +266 411 -21.389930 +267 411 -22.696552 +271 411 -9.341567 +272 411 -9.337660 +275 411 -11.810027 +277 411 -21.288490 +280 411 -20.236040 +282 411 -22.398744 +284 411 -10.029795 +288 411 -9.515594 +289 411 -21.765961 +290 411 -21.739884 +292 411 -5.127105 +293 411 -20.733537 +294 411 -20.741663 +296 411 -20.487239 +302 411 -9.452664 +304 411 -5.966691 +305 411 -2.661011 +306 411 -20.909154 +307 411 -9.391009 +311 411 -6.273937 +312 411 -10.032437 +313 411 -1.445585 +314 411 -20.218903 +315 411 -21.380988 +316 411 -21.371013 +317 411 -9.490090 +318 411 -83.322463 +321 411 -2387.823106 +361 411 216423.329800 +362 411 73444.835313 +386 411 342686.131332 +387 411 593.128338 +410 411 18674.427652 +411 411 11928130.957006 +434 411 1125.897475 +435 411 45357.386712 +436 411 311095.972338 +458 411 0.182723 +459 411 25521.241436 +460 411 130877.542143 +461 411 209477.923053 +483 411 12011.752062 +484 411 18884.344872 +485 411 200165.196559 +486 411 143929.626163 +40 412 -20.581967 +191 412 -8.781986 +196 412 -8.757410 +199 412 -9.083542 +205 412 -20.400615 +207 412 -20.397955 +208 412 -20.401290 +216 412 -9.394566 +239 412 -20.405235 +254 412 -19.708437 +262 412 -79.673921 +321 412 -237.586924 +362 412 28759.766406 +387 412 32942.299730 +412 412 11411877.093390 +437 412 31241.707682 +438 412 696.148820 +461 412 836.575215 +462 412 26603.493802 +463 412 4087.263795 +486 412 1185.174867 +487 412 14153.223753 +488 412 15836.571704 +413 413 11224946.427183 +414 414 11111111.111111 +415 415 11111111.111111 +416 416 11111111.111111 +417 417 11111111.111111 +418 418 11391147.167632 +209 419 -0.019589 +251 419 -169.658110 +268 419 -30.546915 +269 419 -29.118527 +274 419 -121.327779 +322 419 -31.603158 +325 419 -181.012810 +327 419 -133.342423 +341 419 -4.712528 +346 419 24247.541585 +347 419 18087.458419 +352 419 2.448309 +353 419 3.233947 +369 419 6342.856013 +370 419 4894.433689 +371 419 42274.356081 +375 419 3.634215 +376 419 4.656645 +377 419 2.223826 +394 419 38276.443492 +395 419 48087.636216 +397 419 1.281987 +398 419 4.620607 +399 419 4.631109 +400 419 1.008838 +419 419 11456691.158339 +420 419 12925.544136 +421 419 4.603280 +422 419 3.329392 +444 419 34858.430059 +445 419 16416.243396 +446 419 139.405170 +469 419 6719.960476 +470 419 29560.262889 +471 419 1155.942973 +494 419 6706.282053 +495 419 29320.662893 +496 419 657.136498 +497 419 479.620350 +203 420 -21.367282 +209 420 -15.426463 +211 420 -8.922973 +212 420 -24.364007 +251 420 -83.317518 +268 420 -9.290342 +269 420 -11.485343 +274 420 -38.458817 +295 420 -16.147473 +297 420 -23.510137 +298 420 -2.333197 +324 420 -24.607922 +325 420 -171.306034 +329 420 -40.595791 +338 420 -6.171684 +341 420 -11.942121 +346 420 7851.858409 +347 420 5911.657567 +352 420 1928.100319 +353 420 2546.808528 +356 420 1005.350663 +357 420 3716.854884 +358 420 3726.482469 +359 420 298.578997 +369 420 4174.592766 +370 420 1547.415245 +371 420 13897.624078 +375 420 2862.028211 +376 420 3667.215513 +377 420 12492.266529 +378 420 18871.328286 +379 420 11013.557405 +380 420 3701.279005 +381 420 2703.173820 +394 420 20714.514547 +395 420 20007.775423 +397 420 1009.594120 +398 420 4138.930050 +399 420 19817.664579 +400 420 22426.799190 +401 420 21931.258425 +402 420 11023.076703 +403 420 2247.069077 +419 420 12925.544136 +420 420 11388110.133389 +421 420 31252.074213 +422 420 24709.904519 +423 420 21608.413553 +424 420 5961.284399 +425 420 525.967012 +426 420 256.982532 +444 420 24787.992608 +445 420 13469.806111 +446 420 11889.576882 +447 420 6261.061491 +448 420 378.785149 +471 420 8897.231109 +472 420 7358.874324 +473 420 6204.780197 +474 420 710.793873 +496 420 1665.263933 +497 420 11076.575934 +498 420 3012.674895 +499 420 5850.511000 +500 420 940.078698 +92 421 -31.557225 +203 421 -33.768405 +209 421 -15.450239 +211 421 -14.984309 +212 421 -33.913592 +251 421 -57.993145 +268 421 -30.552973 +269 421 -13.295850 +270 421 -13.582325 +274 421 -26.905108 +295 421 -33.577188 +297 421 -33.869014 +298 421 -33.288909 +322 421 -84.336256 +324 421 -23.604922 +325 421 -230.408880 +337 421 -14.656930 +338 421 -17.368378 +339 421 -2.362916 +347 421 15110.119806 +352 421 1931.072010 +353 421 2550.733805 +356 421 2090.534380 +357 421 7728.858398 +358 421 7748.878078 +359 421 620.867605 +369 421 3745.215498 +371 421 438.899508 +372 421 16874.789976 +375 421 2866.439322 +376 421 3672.867621 +377 421 17262.260560 +378 421 28923.923964 +379 421 18495.313602 +380 421 7696.469788 +381 421 5621.001716 +394 421 11127.819753 +395 421 10190.275582 +396 421 6348.719404 +397 421 12949.044175 +398 421 4340.552875 +399 421 27742.408840 +400 421 35206.546065 +401 421 38700.642413 +402 421 27086.978173 +403 421 11786.498666 +404 421 7119.222213 +405 421 7125.249041 +406 421 106.924449 +419 421 4.603280 +420 421 31252.074213 +421 421 11395423.788094 +422 421 55770.542371 +423 421 48798.490537 +424 421 24920.696700 +425 421 14605.728747 +426 421 10370.226891 +444 421 41490.019604 +445 421 26757.439205 +446 421 21063.346326 +447 421 9910.100308 +448 421 4812.745861 +449 421 1944.708446 +450 421 572.058853 +451 421 68.822209 +471 421 17546.562785 +472 421 2537.891664 +473 421 8423.166540 +474 421 4352.684283 +475 421 3245.970612 +476 421 505.519896 +477 421 570.895097 +496 421 17619.637951 +498 421 2328.806864 +499 421 7499.830676 +500 421 3193.689293 +92 422 -33.248935 +203 422 -33.795683 +209 422 -11.174617 +211 422 -14.995657 +212 422 -33.945632 +237 422 -0.775205 +251 422 -29.089986 +268 422 -60.580129 +269 422 -44.061159 +270 422 -13.455590 +274 422 -60.704181 +295 422 -33.598286 +297 422 -33.899585 +298 422 -33.300892 +322 422 -3.923426 +325 422 -228.734492 +327 422 -70.494023 +334 422 -30.187076 +336 422 -74.196535 +337 422 -13.320179 +339 422 -15.769807 +347 422 32202.394729 +352 422 1396.676809 +353 422 1844.856502 +356 422 2091.847992 +357 422 7733.714920 +358 422 7753.747180 +359 422 621.257735 +369 422 2542.095984 +372 422 36867.052695 +375 422 2073.195254 +376 422 2656.456623 +377 422 16790.858992 +378 422 28948.394384 +379 422 18509.635492 +380 422 7701.305959 +381 422 5624.533740 +394 422 4209.838129 +395 422 7125.074473 +396 422 3609.801631 +397 422 37453.530504 +398 422 3332.665444 +399 422 26752.564574 +400 422 35014.406309 +401 422 38751.642942 +402 422 27482.587486 +403 422 12170.795799 +404 422 7500.867256 +405 422 7507.217168 +406 422 112.656421 +419 422 3.329392 +420 422 24709.904519 +421 422 55770.542371 +422 422 11340882.389612 +423 422 52606.221406 +424 422 25720.716822 +425 422 15161.995688 +426 422 10903.809578 +427 422 172.914619 +428 422 172.940648 +429 422 172.970134 +430 422 173.003620 +431 422 141.026017 +444 422 41159.911505 +445 422 27322.762886 +446 422 1363.836051 +447 422 27373.668951 +448 422 12546.484579 +449 422 4813.057380 +450 422 3817.849590 +451 422 459.310855 +471 422 816.354450 +472 422 20479.584768 +473 422 15078.478762 +474 422 2137.823396 +475 422 2949.929608 +476 422 3373.776876 +477 422 3810.082829 +496 422 819.844641 +497 422 16791.226680 +498 422 18677.324742 +500 422 498.126361 +92 423 -33.260749 +95 423 -10.748523 +116 423 -35.844346 +134 423 -23.183010 +171 423 -9.956765 +203 423 -33.826676 +211 423 -15.008548 +212 423 -30.945667 +237 423 -14.658555 +251 423 -15.812605 +268 423 -215.097633 +269 423 -107.061582 +270 423 -69.214644 +274 423 -94.249252 +295 423 -33.622245 +297 423 -33.934332 +298 423 -33.314489 +320 423 -16.794290 +323 423 -27.607258 +325 423 -272.459559 +326 423 -67.966912 +329 423 -203.458996 +333 423 -35.844346 +335 423 -58.986849 +339 423 -15.812605 +341 423 -110.808805 +347 423 93259.499465 +356 423 2093.339697 +357 423 7739.229862 +358 423 7759.276408 +359 423 621.700756 +369 423 1541.989937 +372 423 96550.381031 +373 423 10997.497619 +376 423 1730.873767 +377 423 17942.815454 +378 423 28273.146742 +379 423 18392.152242 +380 423 7706.797791 +381 423 5628.544618 +394 423 2038.768075 +395 423 3775.907126 +396 423 3215.474087 +397 423 20558.755181 +398 423 86255.296735 +399 423 23436.170980 +400 423 39829.011306 +401 423 45601.721158 +402 423 27419.342246 +403 423 12176.793246 +404 423 7503.532562 +405 423 7509.884730 +406 423 112.696452 +420 423 21608.413553 +421 423 48798.490537 +422 423 52606.221406 +423 423 11328945.670839 +424 423 55187.033120 +425 423 31169.484656 +426 423 23785.705687 +427 423 13052.203772 +428 423 13053.813144 +429 423 13055.636168 +430 423 5862.965223 +431 423 2666.696508 +444 423 48757.939492 +445 423 40016.487085 +446 423 13423.797479 +447 423 21233.492898 +448 423 83631.466663 +449 423 35054.887679 +450 423 3828.210908 +451 423 460.557385 +472 423 313.744437 +473 423 27853.748667 +474 423 70499.216264 +475 423 3947.703787 +476 423 3382.933018 +477 423 3820.423069 +498 423 3053.225532 +499 423 80931.469405 +500 423 17114.606388 +92 424 -33.274121 +95 424 -32.957510 +116 424 -150.654118 +134 424 -32.969827 +171 424 -32.956830 +174 424 -1.811931 +176 424 -15.790012 +203 424 -8.936769 +211 424 -6.256112 +237 424 -14.659911 +251 424 -3.639379 +256 424 -11.228781 +268 424 -77.544901 +269 424 -74.943001 +270 424 -17.165304 +274 424 -86.015515 +295 424 -29.638997 +297 424 -0.379847 +298 424 -33.329880 +320 424 -101.296685 +324 424 -14.836421 +325 424 -254.190528 +326 424 -31.073813 +332 424 -107.492203 +333 424 -150.654118 +338 424 -0.969600 +339 424 -1.161796 +340 424 -2.477583 +347 424 55835.084854 +348 424 92.525602 +356 424 1845.340402 +357 424 6822.358343 +358 424 6840.029962 +359 424 548.047469 +369 424 605.091752 +372 424 17820.751016 +373 424 45680.139711 +374 424 19.943347 +376 424 7274.878378 +377 424 13597.950484 +378 424 5972.459341 +379 424 7804.100003 +380 424 6793.768520 +381 424 4961.727331 +394 424 189.726611 +395 424 837.354958 +396 424 796.427416 +397 424 560.461274 +398 424 47724.347391 +399 424 18679.582918 +400 424 35774.626988 +401 424 46189.797868 +402 424 17924.862518 +403 424 11625.502156 +404 424 7506.549360 +405 424 7512.904082 +406 424 112.741762 +420 424 5961.284399 +421 424 24920.696700 +422 424 25720.716822 +423 424 55187.033120 +424 424 11326651.122949 +425 424 63662.329156 +426 424 43028.574706 +427 424 32292.639457 +428 424 32273.141973 +429 424 31737.311474 +430 424 12661.829104 +431 424 4043.072941 +444 424 45077.609450 +445 424 51000.342888 +446 424 32094.713198 +447 424 66681.573123 +448 424 47696.094314 +449 424 35137.375858 +450 424 25452.008136 +451 424 2202.752189 +453 424 23.485837 +454 424 563.836029 +455 424 564.611723 +456 424 56.225396 +472 424 1318.670758 +474 424 7229.440112 +475 424 41894.159288 +476 424 8341.061684 +477 424 1210.620020 +499 424 290.674519 +500 424 27748.809868 +58 425 -13.910080 +92 425 -33.289240 +95 425 -32.959869 +96 425 -120.807368 +116 425 -51.589203 +134 425 -32.972676 +171 425 -32.959163 +174 425 -14.637737 +176 425 -32.940528 +237 425 -14.661441 +251 425 -14.901820 +256 425 -14.642663 +268 425 -36.854219 +269 425 -40.033927 +270 425 -29.107423 +274 425 -17.288943 +298 425 -33.347285 +322 425 -13.910080 +324 425 -55.616527 +325 425 -363.217969 +332 425 -0.390681 +333 425 -51.589203 +337 425 -13.140798 +338 425 -54.136506 +340 425 -14.901820 +347 425 28162.718563 +348 425 3285.479965 +369 425 2957.995258 +372 425 624.335320 +373 425 32515.736814 +374 425 3664.839786 +376 425 3265.525522 +377 425 4352.223900 +394 425 240.181416 +395 425 3367.780784 +396 425 3369.278615 +397 425 3370.984799 +398 425 4691.835944 +399 425 33609.986649 +400 425 13847.058684 +401 425 16280.163052 +402 425 8477.634724 +403 425 7504.371947 +404 425 7509.960027 +405 425 7516.317636 +406 425 112.792987 +420 425 525.967012 +421 425 14605.728747 +422 425 15161.995688 +423 425 31169.484656 +424 425 63662.329156 +425 425 11615958.720750 +426 425 83655.777419 +427 425 69487.540686 +428 425 69316.029171 +429 425 66076.248420 +430 425 19567.021939 +431 425 4461.735640 +444 425 64123.389692 +445 425 80494.363454 +446 425 66421.319745 +447 425 77904.578143 +448 425 62937.996151 +449 425 34598.676274 +450 425 12336.274616 +451 425 21859.452008 +452 425 3652.112838 +453 425 281.297106 +454 425 3391.282807 +455 425 3395.948343 +456 425 338.176721 +472 425 451.558671 +474 425 3041.203110 +475 425 58.783474 +476 425 13764.935275 +477 425 14239.852625 +478 425 3607.752179 +479 425 160.341161 +499 425 3092.666570 +2 426 -25.500777 +4 426 -18.027776 +5 426 -12.875755 +12 426 -10.201625 +17 426 -12.867891 +38 426 -3.024245 +58 426 -160.645139 +60 426 -5.583511 +68 426 -22.857023 +69 426 -7.481691 +71 426 -13.021485 +79 426 -0.586813 +82 426 -13.693394 +84 426 -5.150994 +92 426 -31.424671 +95 426 -32.962533 +96 426 -131.734316 +116 426 -50.493393 +126 426 -31.020298 +134 426 -32.975892 +136 426 -1.544303 +171 426 -32.961796 +174 426 -14.638443 +176 426 -32.942358 +194 426 -31.181685 +209 426 -0.165961 +214 426 -33.345011 +237 426 -14.663170 +238 426 -16.936314 +242 426 -7.178318 +251 426 -14.914209 +256 426 -14.643581 +268 426 -69.781336 +269 426 -96.080792 +274 426 -69.898656 +298 426 -135.540120 +319 426 -28.144742 +320 426 -8.440456 +321 426 -22.348651 +322 426 -109.159672 +325 426 -355.239930 +326 426 -111.359594 +329 426 -38.421560 +333 426 -272.078909 +337 426 -119.022391 +339 426 -85.761229 +340 426 -14.914209 +341 426 -12.676769 +342 426 -30.977164 +347 426 46516.254022 +348 426 28979.499535 +353 426 19.784231 +360 426 3764.084744 +361 426 5204.317422 +362 426 151.531344 +369 426 2960.454394 +373 426 33456.494015 +374 426 50735.707484 +375 426 994.875340 +376 426 8776.197447 +377 426 19638.257386 +378 426 33.167740 +382 426 837.952599 +383 426 5151.255707 +384 426 5166.196239 +385 426 1419.599076 +394 426 240.381091 +395 426 3370.580596 +396 426 3372.079672 +397 426 3373.787275 +398 426 3375.725628 +399 426 14996.380418 +400 426 59006.401358 +401 426 58188.574255 +402 426 51225.165239 +403 426 7084.043289 +404 426 10220.051413 +405 426 18674.811813 +406 426 10539.150670 +407 426 4300.449738 +420 426 256.982532 +421 426 10370.226891 +422 426 10903.809578 +423 426 23785.705687 +424 426 43028.574706 +425 426 83655.777419 +426 426 12064397.891072 +427 426 117545.166906 +428 426 83296.439060 +429 426 76941.029382 +430 426 19945.421511 +431 426 4462.162590 +444 426 62683.553736 +445 426 78943.221465 +446 426 68835.425049 +447 426 78305.344646 +448 426 66913.552513 +449 426 48250.086445 +450 426 23077.652821 +451 426 83995.187085 +452 426 68778.012240 +453 426 26938.862828 +454 426 3634.993652 +455 426 3398.771573 +456 426 338.457865 +472 426 1016.024922 +474 426 1545.691446 +475 426 45409.433422 +476 426 43524.672245 +477 426 23948.389912 +478 426 38960.522914 +479 426 29414.575986 +480 426 579.957882 +499 426 9904.924926 +500 426 51409.245373 +1 427 -12.190485 +2 427 -3.257855 +3 427 -27.415523 +4 427 -10.396084 +8 427 -27.409980 +10 427 -12.266240 +12 427 -2.522512 +14 427 -27.401624 +15 427 -27.400943 +17 427 -0.005789 +19 427 -27.715929 +21 427 -12.173765 +22 427 -27.471265 +23 427 -12.408069 +26 427 -12.236984 +31 427 -27.849393 +33 427 -12.205057 +37 427 -12.201807 +38 427 -9.467112 +41 427 -12.204287 +52 427 -27.974791 +53 427 -27.401874 +54 427 -27.403736 +57 427 -27.400265 +58 427 -106.206667 +60 427 -6.971240 +65 427 -27.412003 +68 427 -5.767723 +69 427 -5.132259 +72 427 -12.170251 +77 427 -12.252534 +78 427 -12.161205 +79 427 -27.399384 +84 427 -7.391859 +93 427 -12.227692 +94 427 -12.316179 +95 427 -32.965541 +96 427 -131.740949 +116 427 -67.527293 +119 427 -27.409698 +122 427 -27.539659 +124 427 -12.363407 +125 427 -27.486728 +128 427 -17.229942 +134 427 -32.979525 +136 427 -10.916983 +138 427 -12.240140 +143 427 -6.030894 +145 427 -2.572125 +148 427 -27.874590 +156 427 -36.928717 +157 427 -32.285847 +159 427 -12.364611 +160 427 -12.202514 +162 427 -32.265118 +163 427 -27.723341 +166 427 -27.464867 +169 427 -12.254881 +171 427 -32.964770 +174 427 -14.639241 +176 427 -32.944426 +186 427 -12.405115 +187 427 -12.178040 +189 427 -27.726465 +193 427 -12.355992 +195 427 -27.394406 +197 427 -5.925675 +200 427 -12.234797 +201 427 -10.531149 +203 427 -10.131458 +209 427 -24.854092 +212 427 -14.790475 +213 427 -20.858367 +215 427 -12.362718 +218 427 -27.460587 +220 427 -27.437368 +221 427 -27.442675 +222 427 -27.445458 +224 427 -12.197929 +225 427 -12.194254 +231 427 -12.208399 +233 427 -12.185026 +235 427 -109.791658 +237 427 -14.665122 +238 427 -11.448622 +241 427 -27.410123 +242 427 -5.425332 +251 427 -14.928234 +256 427 -14.644618 +268 427 -21.980013 +269 427 -43.331491 +274 427 -47.376742 +298 427 -361.218234 +319 427 -44.332523 +320 427 -34.747147 +321 427 -33.725919 +322 427 -168.778178 +324 427 -35.152249 +325 427 -307.544191 +326 427 -7.371119 +329 427 -38.823476 +331 427 -18.205389 +333 427 -1267.545018 +337 427 -134.022735 +338 427 -35.861230 +339 427 -203.373853 +340 427 -14.928234 +342 427 -74.835546 +347 427 21627.513161 +348 427 16511.383217 +353 427 18879.066976 +354 427 5236.439107 +360 427 5680.307724 +361 427 7853.735093 +362 427 228.673029 +369 427 2963.238347 +373 427 12821.638863 +374 427 27624.728046 +375 427 1800.613976 +376 427 7480.311301 +377 427 86557.007010 +378 427 31764.397562 +379 427 1186.872541 +382 427 1264.538112 +383 427 7773.660681 +384 427 7796.207150 +385 427 2142.289598 +394 427 240.607141 +395 427 3373.750224 +396 427 3375.250710 +397 427 3376.959919 +398 427 3378.900094 +399 427 4725.882205 +400 427 27921.916274 +401 427 28739.635157 +402 427 274205.331395 +403 427 20843.546774 +404 427 3936.671772 +405 427 17537.019975 +406 427 16142.106548 +407 427 6489.725795 +422 427 172.914619 +423 427 13052.203772 +424 427 32292.639457 +425 427 69487.540686 +426 427 117545.166906 +427 427 12371757.219745 +428 427 128359.828829 +429 427 86535.705796 +430 427 20366.196981 +431 427 4462.644810 +444 427 54201.119250 +445 427 68480.842807 +446 427 68483.188542 +447 427 81678.056262 +448 427 70788.299905 +449 427 52126.373806 +450 427 18408.616920 +451 427 74390.613318 +452 427 233460.555794 +453 427 101391.996471 +454 427 28931.690720 +455 427 7903.194250 +456 427 4639.963651 +457 427 268.206912 +472 427 1362.021526 +475 427 4174.634859 +476 427 102765.298120 +477 427 171424.617070 +478 427 34042.825746 +479 427 91713.415045 +480 427 17028.725378 +481 427 245.077665 +482 427 4051.725839 +483 427 3923.894328 +499 427 132.203084 +500 427 31404.865054 +6 428 -21.277207 +18 428 -11.150583 +27 428 -71.178365 +40 428 -55.323594 +45 428 -61.255581 +47 428 -7.532416 +58 428 -63.089901 +83 428 -85.529550 +90 428 -21.803225 +95 428 -32.968943 +96 428 -131.748448 +116 428 -67.617738 +128 428 -9.875790 +134 428 -32.983632 +143 428 -6.977509 +145 428 -76.497090 +156 428 -105.006552 +157 428 -49.187287 +162 428 -47.012030 +171 428 -32.968133 +174 428 -14.640142 +176 428 -32.946763 +178 428 -14.400069 +192 428 -32.936114 +196 428 -9.578516 +197 428 -7.090803 +201 428 -65.784402 +203 428 -87.034684 +209 428 -28.351373 +211 428 -61.026042 +212 428 -58.845964 +213 428 -7.948102 +216 428 -5.679960 +237 428 -14.667330 +239 428 -4.787048 +251 428 -23.237705 +256 428 -14.645790 +268 428 -10.273050 +269 428 -11.635372 +274 428 -20.541886 +297 428 -21.175998 +298 428 -177.955999 +308 428 -1.037446 +309 428 -1.479113 +319 428 -92.697089 +321 428 -150.554386 +322 428 -102.289106 +323 428 -73.466922 +325 428 -307.569180 +327 428 -129.188632 +328 428 -37.633950 +329 428 -183.610940 +331 428 -34.603474 +333 428 -234.583078 +334 428 -13.563478 +335 428 -33.547728 +336 428 -81.726737 +337 428 -42.694200 +339 428 -74.030344 +340 428 -56.771212 +341 428 -9.152054 +342 428 -61.000732 +347 428 7499.092666 +348 428 10137.557470 +349 428 3051.366693 +353 428 20405.854690 +354 428 31378.310891 +355 428 1258.289480 +360 428 18422.651105 +361 428 35478.512603 +362 428 1033.658993 +369 428 4735.766643 +370 428 1238.112735 +374 428 7114.435988 +375 428 10197.980963 +376 428 10116.788587 +377 428 23059.365384 +378 428 45055.815076 +379 428 46634.525160 +382 428 1266.156828 +383 428 21109.573729 +384 428 35148.279748 +385 428 16876.856396 +394 428 230.818446 +395 428 3991.333775 +396 428 5231.158304 +397 428 5233.107909 +398 428 5235.320570 +399 428 4698.156877 +400 428 1994.731996 +401 428 14965.021485 +402 428 65554.192767 +403 428 122594.031477 +404 428 41180.540359 +405 428 25550.946165 +406 428 49355.937648 +407 428 33642.672247 +408 428 13909.852995 +422 428 172.940648 +423 428 13053.813144 +424 428 32273.141973 +425 428 69316.029171 +426 428 83296.439060 +427 428 128359.828829 +428 428 12232841.042772 +429 428 183963.514612 +430 428 60520.515566 +431 428 16204.810669 +432 428 8434.902482 +433 428 8439.702329 +434 428 3331.679686 +444 428 54205.523860 +445 428 68486.407866 +446 428 68488.753814 +447 428 81701.499388 +448 428 70812.819054 +449 428 52149.130302 +450 428 21547.783454 +451 428 23821.121800 +452 428 63959.667712 +453 428 113384.353765 +454 428 61864.908432 +455 428 40971.297586 +456 428 9543.359713 +457 428 509.788130 +459 428 5113.567076 +460 428 7248.581785 +472 428 1363.844120 +475 428 3408.960998 +476 428 6677.755789 +477 428 70396.856945 +478 428 45596.129148 +479 428 44836.474215 +480 428 50536.630822 +481 428 10103.411924 +482 428 7701.224852 +483 428 7458.252041 +500 428 1100.574645 +6 429 -6.495940 +7 429 -92.967984 +18 429 -29.696707 +27 429 -83.705917 +36 429 -14.833117 +39 429 -26.441754 +40 429 -104.487007 +45 429 -63.678114 +46 429 -19.816396 +47 429 -9.789751 +55 429 -17.325341 +58 429 -3.079225 +83 429 -136.547532 +85 429 -283.788842 +90 429 -63.698519 +92 429 -4.437851 +95 429 -40.925332 +96 429 -131.756940 +103 429 -0.788458 +104 429 -1.103903 +107 429 -1.928475 +110 429 -1.821787 +116 429 -50.483589 +118 429 -29.413706 +123 429 -3.331775 +128 429 -106.989705 +134 429 -36.111509 +137 429 -1.047397 +145 429 -76.063745 +156 429 -116.846569 +157 429 -70.909723 +161 429 -17.399826 +162 429 -116.956151 +171 429 -35.875105 +174 429 -14.641163 +176 429 -32.949410 +196 429 -7.157330 +201 429 -68.703808 +203 429 -227.029717 +211 429 -51.063171 +212 429 -268.684623 +216 429 -12.230076 +237 429 -14.669830 +239 429 -13.425391 +251 429 -33.133320 +256 429 -14.647118 +268 429 -16.063157 +269 429 -15.984823 +274 429 -71.976844 +297 429 -187.274166 +298 429 -65.135342 +308 429 -36.174533 +309 429 -36.150334 +319 429 -163.720149 +320 429 -428.778681 +321 429 -279.388461 +322 429 -85.700248 +323 429 -66.976666 +324 429 -41.679613 +325 429 -307.597483 +326 429 -97.026642 +327 429 -46.957399 +328 429 -66.238687 +329 429 -121.811166 +330 429 -11.598217 +331 429 -72.681721 +332 429 -59.915431 +333 429 -321.659101 +334 429 -100.517382 +335 429 -221.256331 +336 429 -94.728942 +337 429 -20.400115 +338 429 -42.544957 +339 429 -26.234936 +340 429 -68.349342 +341 429 -232.081541 +342 429 -9.794640 +347 429 18068.894526 +348 429 24761.182140 +349 429 11046.476417 +353 429 3973.475082 +354 429 72004.479537 +355 429 458.372393 +360 429 30677.673539 +361 429 66095.550722 +362 429 1926.083585 +369 429 7034.374097 +370 429 4600.616983 +374 429 13780.334705 +375 429 24901.549640 +376 429 15752.274385 +377 429 35691.491555 +378 429 14808.752056 +379 429 168409.410790 +380 429 12897.023463 +381 429 4162.636417 +382 429 1125.649631 +383 429 31377.724378 +384 429 65436.857081 +385 429 35060.656613 +395 429 2804.853278 +396 429 7406.482281 +397 429 7407.633937 +398 429 7408.939748 +399 429 7410.416918 +400 429 7412.085863 +401 429 17258.009350 +402 429 68033.211314 +403 429 92764.758236 +404 429 236473.198414 +405 429 53846.472500 +406 429 81250.564896 +407 429 63834.446676 +408 429 33802.489839 +422 429 172.970134 +423 429 13055.636168 +424 429 31737.311474 +425 429 66076.248420 +426 429 76941.029382 +427 429 86535.705796 +428 429 183963.514612 +429 429 12595623.307631 +430 429 146042.386210 +431 429 35313.642277 +432 429 14850.057369 +433 429 14858.800394 +434 429 6246.456078 +444 429 54210.512646 +445 429 68492.711009 +446 429 68495.057200 +447 429 78310.577951 +448 429 66919.968188 +449 429 48251.003768 +450 429 17807.556030 +451 429 31470.543054 +452 429 44281.222636 +453 429 92019.922215 +454 429 228328.432373 +455 429 136140.932989 +456 429 27965.131168 +457 429 5221.833175 +459 429 8622.444283 +460 429 12762.335287 +472 429 1022.311917 +475 429 20954.926432 +476 429 19778.076790 +477 429 6221.327697 +478 429 84463.972295 +479 429 118796.220217 +480 429 151321.869059 +481 429 29861.070427 +482 429 13963.884191 +483 429 16011.206620 +5 430 -7.485991 +7 430 -75.560732 +17 430 -0.660260 +30 430 -5.220300 +36 430 -36.420267 +39 430 -23.702301 +45 430 -123.270081 +46 430 -15.293127 +55 430 -2.879626 +56 430 -205.426508 +69 430 -10.496468 +70 430 -24.486476 +73 430 -23.583745 +83 430 -136.853521 +85 430 -69.941616 +90 430 -49.646208 +92 430 -132.552892 +95 430 -275.827678 +96 430 -227.359359 +98 430 -210.374305 +101 430 -29.199821 +103 430 -147.823276 +104 430 -104.065284 +107 430 -290.353375 +110 430 -287.033244 +112 430 -322.263917 +118 430 -34.401495 +123 430 -307.609215 +126 430 -24.254058 +128 430 -58.680074 +134 430 -293.795204 +137 430 -17.796699 +145 430 -168.260459 +146 430 -249.068382 +154 430 -28.191167 +155 430 -182.463437 +156 430 -85.093083 +157 430 -25.844474 +161 430 -2.779564 +162 430 -101.430421 +167 430 -23.778941 +168 430 -10.104757 +171 430 -228.828920 +173 430 -24.227510 +174 430 -104.530798 +175 430 -23.636164 +176 430 -102.410099 +179 430 -6.524408 +182 430 -10.203635 +194 430 -23.872385 +201 430 -39.438831 +202 430 -19.991356 +203 430 -91.403795 +211 430 -86.493554 +212 430 -93.089757 +214 430 -26.910902 +228 430 -22.063601 +237 430 -14.672670 +251 430 -33.147178 +256 430 -14.648625 +268 430 -1.864978 +269 430 -1.365822 +274 430 -34.891840 +279 430 -22.522584 +281 430 -9.972680 +283 430 -2.252883 +297 430 -134.288950 +298 430 -33.117562 +300 430 -17.208010 +308 430 -51.842021 +309 430 -52.200793 +319 430 -455.388093 +320 430 -196.938105 +321 430 -1259.234681 +322 430 -97.342948 +323 430 -122.179510 +324 430 -466.328086 +325 430 -89.527963 +326 430 -132.052261 +327 430 -209.797665 +328 430 -325.378021 +329 430 -323.493086 +330 430 -7.120960 +331 430 -57.981373 +332 430 -470.914364 +333 430 -29.361490 +335 430 -65.575535 +336 430 -172.247831 +337 430 -188.260984 +338 430 -272.287855 +339 430 -366.707604 +340 430 -8.376367 +341 430 -251.180612 +342 430 -211.278723 +347 430 6490.279687 +348 430 9034.146098 +349 430 5562.883849 +353 430 1263.006350 +354 430 80061.788024 +360 430 112459.709568 +361 430 299897.997832 +362 430 8742.449521 +369 430 7037.316191 +370 430 4602.541170 +374 430 3493.530401 +375 430 9081.757894 +376 430 7726.586354 +377 430 4027.472026 +378 430 3575.680719 +379 430 131746.320482 +380 430 32293.930572 +381 430 4404.004456 +383 430 84250.042055 +384 430 292639.674966 +385 430 185632.217370 +395 430 2806.026395 +396 430 7409.580008 +397 430 7410.732146 +398 430 7412.038503 +399 430 7413.516291 +400 430 7415.185934 +401 430 8801.106464 +402 430 24044.942431 +403 430 21896.727118 +404 430 75581.331602 +405 430 171328.051280 +406 430 242300.937040 +407 430 287500.762496 +408 430 211026.578369 +409 430 3930.555511 +422 430 173.003620 +423 430 5862.965223 +424 430 12661.829104 +425 430 19567.021939 +426 430 19945.421511 +427 430 20366.196981 +428 430 60520.515566 +429 430 146042.386210 +430 430 13352514.936552 +431 430 267783.367094 +432 430 79493.777000 +433 430 72803.320900 +434 430 15787.235377 +444 430 15781.111163 +445 430 19938.851662 +446 430 19939.634624 +447 430 19767.521733 +448 430 14078.569747 +449 430 7280.847536 +450 430 2594.494225 +451 430 18238.615269 +452 430 34309.742243 +453 430 42386.163206 +454 430 163324.734904 +455 430 529785.200187 +456 430 148040.874480 +457 430 12063.202355 +458 430 56.826626 +459 430 57112.216580 +460 430 62561.957185 +475 430 24100.803162 +476 430 26946.284870 +477 430 14409.292359 +478 430 78041.412068 +479 430 166603.272812 +480 430 213954.120235 +481 430 288199.974656 +482 430 51681.269457 +483 430 14863.856187 +1 431 -24.917577 +2 431 -12.443869 +3 431 -10.779999 +4 431 -11.799299 +5 431 -7.378833 +6 431 -62.350037 +7 431 -32.959927 +8 431 -24.872344 +13 431 -24.799023 +14 431 -24.825336 +15 431 -24.824281 +16 431 -25.227961 +17 431 -28.715079 +19 431 -25.445191 +21 431 -24.757126 +22 431 -25.032363 +25 431 -24.808314 +26 431 -11.183481 +28 431 -24.850170 +30 431 -8.964578 +32 431 -10.769090 +34 431 -10.751085 +36 431 -50.489970 +37 431 -24.216354 +38 431 -28.105110 +41 431 -25.789474 +42 431 -24.894795 +43 431 -10.784684 +44 431 -102.935979 +45 431 -38.599475 +46 431 -10.380728 +48 431 -46.733912 +49 431 -25.596835 +50 431 -28.254075 +51 431 -12.605374 +52 431 -28.246065 +53 431 -24.827427 +54 431 -99.327946 +56 431 -5.726831 +57 431 -24.823224 +58 431 -38.836316 +59 431 -25.979335 +60 431 -26.264939 +62 431 -24.257259 +63 431 -25.362607 +64 431 -24.393933 +65 431 -10.781306 +66 431 -10.952775 +67 431 -24.651715 +69 431 -5.430674 +70 431 -11.684420 +72 431 -11.006074 +73 431 -12.239619 +75 431 -24.801828 +77 431 -11.212447 +78 431 -10.952333 +80 431 -10.760771 +83 431 -22.905643 +84 431 -26.235361 +85 431 -0.894851 +86 431 -11.048294 +87 431 -11.670166 +89 431 -24.421019 +90 431 -23.346266 +91 431 -24.741245 +92 431 -148.595331 +93 431 -24.195086 +94 431 -25.472563 +95 431 -67.339298 +96 431 -114.060353 +98 431 -74.151345 +99 431 -25.711011 +101 431 -8.887809 +103 431 -32.480901 +104 431 -6.505356 +105 431 -25.810524 +106 431 -24.316468 +107 431 -95.072261 +108 431 -24.312747 +109 431 -24.315590 +110 431 -67.527954 +111 431 -24.926101 +112 431 -107.741585 +117 431 -25.653350 +118 431 -22.705977 +119 431 -24.250380 +120 431 -24.252273 +122 431 -25.171533 +123 431 -52.109215 +124 431 -25.646373 +125 431 -11.149867 +126 431 -11.826735 +127 431 -28.063172 +129 431 -24.499850 +130 431 -11.265885 +131 431 -11.263137 +132 431 -11.383305 +134 431 -144.278404 +135 431 -24.246772 +136 431 -28.382891 +137 431 -0.805626 +141 431 -24.322957 +145 431 -50.734863 +146 431 -188.951543 +148 431 -25.743452 +149 431 -24.760953 +150 431 -25.650086 +151 431 -11.006405 +152 431 -25.509180 +153 431 -11.016202 +154 431 -34.871474 +155 431 -267.637555 +156 431 -28.263065 +157 431 -16.736086 +158 431 -19.535649 +159 431 -25.648816 +162 431 -80.740041 +163 431 -25.494369 +166 431 -25.045798 +167 431 -12.119012 +168 431 -5.674321 +169 431 -25.212580 +173 431 -11.843019 +174 431 -30.784734 +175 431 -12.207200 +176 431 -26.649811 +177 431 -24.745293 +179 431 -8.039049 +181 431 -27.998680 +182 431 -5.612550 +183 431 -25.495814 +185 431 -25.125929 +186 431 -27.976011 +187 431 -24.715405 +189 431 -25.522230 +190 431 -10.775101 +194 431 -12.061384 +195 431 -24.789971 +197 431 -6.972126 +202 431 -14.515924 +203 431 -48.556454 +204 431 -26.547743 +206 431 -27.842462 +211 431 -7.600657 +212 431 -1.421591 +213 431 -27.438973 +214 431 -10.225105 +215 431 -25.646690 +217 431 -25.097317 +219 431 -24.921604 +220 431 -24.962105 +221 431 -24.976602 +222 431 -24.984655 +223 431 -99.774197 +224 431 -24.980498 +227 431 -24.811957 +228 431 -13.189592 +229 431 -24.973954 +230 431 -24.825404 +231 431 -25.064596 +233 431 -24.891736 +234 431 -24.267542 +235 431 -24.974913 +237 431 -107.029130 +238 431 -26.492785 +241 431 -28.918505 +242 431 -26.477415 +244 431 -28.751401 +245 431 -12.793641 +247 431 -28.321606 +250 431 -25.035243 +251 431 -33.162975 +252 431 -27.093788 +253 431 -24.529151 +256 431 -104.776668 +257 431 -24.948705 +258 431 -24.190201 +259 431 -10.750686 +261 431 -10.825392 +263 431 -24.768515 +264 431 -27.051654 +265 431 -25.647756 +266 431 -24.798038 +267 431 -25.991038 +271 431 -24.601926 +272 431 -24.597900 +273 431 -11.248636 +275 431 -11.979979 +278 431 -24.959887 +279 431 -12.900746 +281 431 -21.466286 +282 431 -25.694999 +283 431 -11.197473 +284 431 -25.831305 +285 431 -24.265042 +287 431 -11.002262 +289 431 -25.059483 +290 431 -25.041841 +292 431 -11.968885 +293 431 -24.425897 +294 431 -24.432003 +295 431 -21.696862 +296 431 -24.321924 +297 431 -54.431840 +298 431 -33.131463 +299 431 -10.776337 +300 431 -1.640548 +302 431 -24.707197 +304 431 -26.068745 +305 431 -26.057406 +306 431 -24.523075 +307 431 -10.978983 +308 431 -34.875772 +309 431 -34.869021 +310 431 -106.686559 +311 431 -26.087171 +312 431 -25.804894 +313 431 -11.704601 +314 431 -24.211188 +315 431 -24.801731 +316 431 -24.791338 +317 431 -24.779504 +318 431 -24.518494 +319 431 -4032.726734 +320 431 -49.551644 +321 431 -811.695388 +322 431 -25.602835 +323 431 -16.905398 +324 431 -156.949707 +325 431 -20.018056 +326 431 -26.359435 +327 431 -16.956080 +328 431 -533.483427 +329 431 -51.460741 +331 431 -153.948023 +332 431 -41.347828 +333 431 -6.356137 +335 431 -47.169648 +336 431 -14.688851 +337 431 -185.169929 +338 431 -100.270217 +339 431 -49.679436 +341 431 -58.794905 +342 431 -125.841508 +354 431 42998.679313 +355 431 6426.624604 +358 431 3310.558848 +359 431 602.883083 +360 431 66057.273577 +361 431 193918.486772 +362 431 5653.971036 +369 431 7040.669956 +370 431 4604.734597 +376 431 6574.697062 +377 431 5783.823387 +378 431 2331.570309 +379 431 17438.290622 +380 431 60157.280224 +381 431 13320.195319 +382 431 506.528768 +383 431 44957.923175 +384 431 186155.475189 +385 431 126636.351960 +395 431 2807.363659 +396 431 7413.111182 +397 431 7414.263869 +398 431 7415.570849 +399 431 7417.049341 +400 431 7418.719780 +401 431 7420.606471 +402 431 17840.999079 +403 431 15904.063282 +404 431 19992.313407 +405 431 57529.695830 +406 431 697014.249936 +407 431 185437.668198 +408 431 149855.232137 +409 431 5507.040576 +422 431 141.026017 +423 431 2666.696508 +424 431 4043.072941 +425 431 4461.735640 +426 431 4462.162590 +427 431 4462.644810 +428 431 16204.810669 +429 431 35313.642277 +430 431 267783.367094 +431 431 14038792.926281 +432 431 160964.942834 +433 431 119636.542808 +434 431 38775.038668 +444 431 3530.132873 +445 431 4460.235684 +446 431 4460.465294 +447 431 4319.700500 +448 431 1794.326111 +449 431 418.284524 +451 431 3971.170823 +452 431 9807.155708 +453 431 22816.500079 +454 431 42426.791181 +455 431 138648.552535 +456 431 690339.223939 +457 431 91804.519775 +458 431 11506.593464 +459 431 81024.557303 +460 431 102830.455109 +475 431 14609.419357 +476 431 17623.350816 +477 431 12068.892920 +478 431 12845.615831 +479 431 48752.206472 +480 431 248321.956052 +481 431 489554.899901 +482 431 97680.710119 +483 431 53920.279582 +484 431 1070.781068 +6 432 -18.115157 +7 432 -63.879431 +27 432 -114.369260 +36 432 -127.818852 +55 432 -12.748149 +58 432 -134.342669 +92 432 -31.766655 +98 432 -33.088664 +101 432 -7.151022 +103 432 -14.692807 +107 432 -33.070658 +110 432 -14.701052 +112 432 -33.062985 +134 432 -132.368165 +137 432 -30.832536 +145 432 -107.143126 +146 432 -132.526560 +154 432 -11.651220 +155 432 -141.300714 +156 432 -58.687722 +157 432 -58.391757 +161 432 -7.932809 +162 432 -131.369038 +178 432 -25.260375 +188 432 -13.037946 +196 432 -12.504333 +197 432 -3.868412 +199 432 -13.860607 +203 432 -3.364559 +205 432 -31.095052 +208 432 -31.067024 +237 432 -44.640496 +239 432 -31.115596 +251 432 -33.181051 +256 432 -8.259327 +262 432 -11.035207 +269 432 -14.982110 +270 432 -6.139308 +274 432 -32.273296 +277 432 -11.240431 +295 432 -52.561205 +298 432 -33.147365 +308 432 -11.884183 +309 432 -11.517906 +319 432 -311.202393 +321 432 -94.220585 +324 432 -37.489993 +327 432 -12.630400 +328 432 -785.316395 +329 432 -12.160039 +331 432 -231.820054 +334 432 -27.770766 +337 432 -159.623180 +338 432 -5.528328 +342 432 -209.284664 +347 432 8986.446256 +348 432 12121.813595 +349 432 12131.069556 +350 432 10192.896218 +351 432 2204.534858 +354 432 90142.915432 +355 432 5326.200328 +358 432 6626.455055 +359 432 1867.007319 +360 432 2183.531676 +361 432 21852.932130 +362 432 690.623261 +369 432 7044.507534 +370 432 4607.244447 +375 432 1948.649920 +376 432 32692.074982 +377 432 28771.900582 +378 432 12278.387308 +379 432 10036.819856 +380 432 95014.054894 +381 432 38957.130388 +382 432 283.884813 +383 432 9448.144277 +384 432 9678.060022 +385 432 20568.258267 +386 432 1765.888643 +395 432 2808.893837 +396 432 7417.151763 +397 432 7418.305078 +398 432 7419.612770 +399 432 7421.092068 +400 432 7422.763417 +401 432 7424.651137 +402 432 27614.636063 +403 432 36776.953330 +404 432 34486.005616 +405 432 50655.256560 +406 432 203955.184667 +407 432 52724.947794 +408 432 20508.570218 +409 432 13346.333393 +410 432 603.431041 +428 432 8434.902482 +429 432 14850.057369 +430 432 79493.777000 +431 432 160964.942834 +432 432 13384794.274094 +433 432 189082.137893 +434 432 96104.203229 +435 432 2365.881950 +452 432 1479.961342 +453 432 5464.209638 +454 432 7676.020347 +455 432 6204.216281 +456 432 13103.363827 +457 432 125512.523051 +458 432 83242.243050 +459 432 82280.521026 +460 432 149936.882843 +475 432 3854.249933 +476 432 5439.224999 +477 432 3970.948970 +478 432 2587.235450 +479 432 8728.721320 +480 432 8306.687391 +481 432 8382.291098 +482 432 17970.425304 +483 432 146667.824554 +484 432 25368.676270 +5 433 -4.776742 +6 433 -4.967501 +7 433 -20.299512 +39 433 -96.479364 +58 433 -134.548526 +68 433 -1.073923 +69 433 -28.234771 +70 433 -13.085441 +81 433 -7.045641 +82 433 -59.501985 +98 433 -33.102598 +101 433 -14.963797 +103 433 -14.349499 +107 433 -33.083266 +110 433 -14.706875 +112 433 -33.075028 +115 433 -7.280746 +126 433 -13.259031 +134 433 -132.424898 +137 433 -23.018401 +138 433 -8.371026 +140 433 -23.132456 +146 433 -132.594996 +155 433 -134.583516 +161 433 -37.562594 +167 433 -28.539358 +168 433 -27.020471 +173 433 -117.613559 +175 433 -28.422441 +179 433 -0.297751 +180 433 -29.987362 +182 433 -26.883981 +194 433 -11.273821 +202 433 -5.534864 +203 433 -34.219503 +211 433 -21.467216 +212 433 -21.821072 +214 433 -4.657042 +228 433 -13.328516 +251 433 -33.201827 +262 433 -4.335844 +269 433 -33.990962 +270 433 -15.116031 +274 433 -136.475253 +279 433 -9.296965 +281 433 -16.928560 +295 433 -81.693301 +297 433 -8.464801 +298 433 -33.165639 +300 433 -37.838766 +319 433 -4.335844 +321 433 -695.409377 +323 433 -24.464944 +328 433 -1000.391507 +335 433 -10.156110 +339 433 -23.437757 +341 433 -23.634489 +342 433 -25.267013 +347 433 30893.414601 +348 433 42142.923738 +349 433 42175.539407 +350 433 37706.103654 +351 433 9322.396291 +355 433 664.201606 +358 433 3525.424294 +359 433 7855.572978 +361 433 131781.203616 +362 433 5630.693757 +369 433 7048.918358 +370 433 4610.129211 +375 433 4506.353762 +376 433 55709.902115 +377 433 58932.081724 +378 433 43334.894546 +379 433 44352.205336 +380 433 13533.238559 +381 433 7620.414498 +383 433 12010.109851 +384 433 1086.512833 +385 433 112021.777809 +386 433 59595.437462 +395 433 2810.652588 +396 433 7421.795912 +397 433 7422.949949 +398 433 7424.258460 +399 433 7425.738685 +400 433 7427.411080 +401 433 7429.299982 +402 433 27643.893061 +403 433 36827.425528 +404 433 42359.641519 +405 433 79878.136183 +406 433 103373.919422 +407 433 54721.663741 +408 433 20770.184851 +409 433 108406.488428 +410 433 75264.299594 +428 433 8439.702329 +429 433 14858.800394 +430 433 72803.320900 +431 433 119636.542808 +432 433 189082.137893 +433 433 13283114.890966 +434 433 221296.597156 +435 433 13631.616862 +455 433 2796.574356 +456 433 18388.786504 +457 433 138842.889372 +458 433 78269.369768 +459 433 82562.723535 +460 433 181716.362847 +478 433 1931.531826 +479 433 7717.408174 +480 433 40299.281786 +481 433 115117.931436 +482 433 36953.214913 +483 433 9395.795813 +484 433 6203.368152 +5 434 -32.785398 +17 434 -4.571338 +18 434 -6.416043 +20 434 -15.714433 +36 434 -32.080403 +39 434 -71.670516 +51 434 -2.320426 +52 434 -1.432575 +58 434 -133.487308 +68 434 -15.395892 +69 434 -14.826366 +70 434 -6.188294 +79 434 -1.779679 +81 434 -10.756186 +82 434 -99.803727 +98 434 -4.682540 +107 434 -1.560574 +110 434 -1.235865 +112 434 -0.071338 +115 434 -10.576131 +126 434 -26.194010 +134 434 -20.870304 +136 434 -2.444406 +138 434 -29.978078 +140 434 -18.662900 +146 434 -42.290785 +155 434 -134.250054 +156 434 -32.166959 +157 434 -32.873731 +161 434 -2.097479 +167 434 -14.598472 +168 434 -15.736160 +173 434 -55.810714 +175 434 -14.685935 +179 434 -36.314108 +180 434 -13.516771 +182 434 -15.838549 +194 434 -27.726264 +202 434 -32.191482 +203 434 -34.329150 +206 434 -6.453976 +211 434 -34.849250 +212 434 -34.834902 +213 434 -35.921052 +214 434 -12.596443 +228 434 -26.140492 +241 434 -23.992439 +244 434 -3.475644 +245 434 -3.886098 +247 434 -5.724482 +248 434 -20.501223 +251 434 -15.571398 +252 434 -1.977964 +269 434 -34.080659 +270 434 -15.156669 +274 434 -136.878476 +279 434 -29.258311 +281 434 -23.377913 +283 434 -16.335106 +292 434 -2.832425 +295 434 -52.438108 +297 434 -35.509398 +298 434 -12.327302 +300 434 -7.698845 +304 434 -1.144497 +305 434 -0.490322 +310 434 -15.208562 +311 434 -0.529014 +313 434 -2.948056 +320 434 -9.906493 +321 434 -840.525198 +326 434 -9.872983 +328 434 -789.107063 +332 434 -9.983298 +337 434 -12.769462 +338 434 -9.905873 +347 434 30982.081160 +348 434 42264.091542 +349 434 42296.801181 +350 434 37815.526449 +351 434 9349.939738 +354 434 13991.273642 +355 434 13182.200957 +359 434 7406.235634 +361 434 146239.979013 +362 434 7213.092770 +369 434 3305.887742 +370 434 2162.114651 +375 434 4518.299106 +376 434 55624.190841 +377 434 58922.537512 +378 434 43459.813106 +379 434 48613.909153 +380 434 27962.042549 +381 434 32567.523400 +382 434 13761.030610 +384 434 8130.010094 +385 434 93818.363123 +386 434 96650.666088 +395 434 1318.174146 +396 434 3480.764408 +397 434 3481.305642 +398 434 3481.919324 +399 434 3482.613537 +400 434 3483.397878 +401 434 3484.283758 +402 434 19534.416320 +403 434 33086.190579 +404 434 42152.787756 +405 434 79782.128743 +406 434 107524.197807 +407 434 72135.222337 +408 434 36354.607176 +409 434 84823.383468 +410 434 129215.890481 +411 434 1125.897475 +428 434 3331.679686 +429 434 6246.456078 +430 434 15787.235377 +431 434 38775.038668 +432 434 96104.203229 +433 434 221296.597156 +434 434 13031997.118178 +435 434 44389.031594 +456 434 1145.691456 +457 434 93969.362812 +458 434 117703.153407 +459 434 45936.016635 +460 434 129904.542815 +480 434 14779.943762 +481 434 96118.661402 +482 434 93914.588143 +483 434 26716.302825 +484 434 7489.061050 +485 434 3231.515682 +2 435 -11.902031 +17 435 -24.855356 +18 435 -23.300048 +23 435 -4.899363 +31 435 -8.632562 +36 435 -17.333106 +38 435 -28.301048 +44 435 -3.356098 +47 435 -114.311458 +51 435 -26.763167 +52 435 -27.518702 +60 435 -5.048813 +79 435 -27.223124 +84 435 -11.069962 +87 435 -5.052427 +97 435 -12.129668 +100 435 -3.805990 +117 435 -0.818295 +124 435 -1.894197 +132 435 -5.190608 +136 435 -26.657800 +148 435 -3.777566 +150 435 -2.162108 +156 435 -17.307800 +157 435 -17.102274 +159 435 -1.898604 +172 435 -7.273732 +186 435 -28.494970 +192 435 -28.171970 +193 435 -1.350568 +203 435 -7.570422 +204 435 -15.272454 +206 435 -7.357436 +211 435 -11.075792 +212 435 -10.996415 +215 435 -1.960099 +240 435 -3.956479 +241 435 -8.851800 +242 435 -14.987720 +244 435 -25.782664 +245 435 -25.434983 +247 435 -7.959424 +248 435 -11.668869 +252 435 -11.092251 +255 435 -8.231816 +265 435 -1.929382 +267 435 -7.462954 +269 435 -5.204100 +270 435 -2.417457 +274 435 -26.418077 +275 435 -27.352130 +282 435 -2.670578 +283 435 -15.064376 +284 435 -2.422491 +292 435 -26.328246 +295 435 -13.093591 +297 435 -14.090017 +304 435 -27.764213 +305 435 -12.355289 +310 435 -15.988953 +311 435 -28.289349 +312 435 -2.464575 +313 435 -10.274449 +321 435 -768.783217 +328 435 -129.515460 +337 435 -10.099687 +342 435 -2.993904 +347 435 5647.069526 +348 435 7730.544229 +349 435 7736.551992 +350 435 7046.006394 +351 435 1804.574674 +354 435 7408.459581 +355 435 6978.861722 +359 435 2070.511559 +361 435 101510.927212 +362 435 8946.835746 +375 435 697.345912 +376 435 5946.474425 +377 435 7759.767117 +378 435 7986.383078 +379 435 10741.828346 +380 435 9957.563204 +381 435 15976.749947 +382 435 7336.063574 +384 435 1904.898997 +385 435 1173.128553 +386 435 132889.258034 +404 435 2054.878248 +405 435 9324.754034 +406 435 14541.696368 +407 435 20945.171101 +408 435 17165.494567 +409 435 3036.481446 +410 435 94901.040334 +411 435 45357.386712 +432 435 2365.881950 +433 435 13631.616862 +434 435 44389.031594 +435 435 12383136.987259 +436 435 12701.481856 +458 435 2782.864594 +459 435 122929.726641 +460 435 44901.729537 +461 435 527.541484 +482 435 935.543614 +483 435 72291.690189 +484 435 66972.030500 +485 435 22180.689468 +486 435 5.617984 +487 435 498.654554 +3 436 -9.154717 +8 436 -21.985096 +9 436 -9.219110 +16 436 -22.464168 +19 436 -10.064365 +21 436 -9.650686 +22 436 -22.204484 +23 436 -18.248440 +24 436 -20.333237 +25 436 -9.729152 +31 436 -14.793666 +32 436 -20.542130 +33 436 -9.113361 +34 436 -9.251108 +37 436 -20.426396 +42 436 -22.014367 +43 436 -20.633530 +44 436 -19.684029 +53 436 -21.883390 +54 436 -21.887587 +55 436 -9.663040 +60 436 -5.460870 +66 436 -9.575913 +67 436 -9.585134 +77 436 -9.975465 +80 436 -20.672201 +84 436 -12.552659 +87 436 -5.457558 +89 436 -20.969100 +91 436 -9.665697 +100 436 -6.603269 +102 436 -20.468739 +106 436 -20.738229 +108 436 -20.727542 +109 436 -82.948822 +117 436 -9.376554 +119 436 -82.178192 +120 436 -9.136413 +121 436 -9.460223 +122 436 -22.372383 +124 436 -21.047710 +125 436 -9.915809 +129 436 -21.195671 +131 436 -22.659754 +132 436 -86.420793 +135 436 -84.167763 +141 436 -20.755418 +143 436 -20.261226 +148 436 -19.291554 +150 436 -20.797530 +152 436 -10.135490 +159 436 -21.043594 +160 436 -20.457531 +163 436 -22.759890 +164 436 -21.826997 +166 436 -9.898871 +169 436 -9.948374 +172 436 -3.434198 +178 436 -20.067275 +183 436 -10.114505 +185 436 -22.356479 +187 436 -9.561820 +188 436 -20.984316 +190 436 -20.581745 +193 436 -21.555723 +195 436 -9.690457 +204 436 -8.718180 +215 436 -20.986159 +217 436 -9.893279 +218 436 -9.881014 +223 436 -9.823595 +224 436 -9.846519 +227 436 -9.710170 +230 436 -9.712784 +231 436 -22.313417 +232 436 -22.315170 +234 436 -20.480807 +235 436 -9.833531 +240 436 -6.464569 +242 436 -8.976748 +250 436 -22.245068 +253 436 -21.194582 +255 436 -15.163256 +257 436 -9.820003 +258 436 -20.329826 +259 436 -20.321943 +261 436 -83.245241 +263 436 -9.635953 +265 436 -21.014847 +266 436 -21.824941 +267 436 -15.873216 +271 436 -9.506163 +272 436 -9.501548 +277 436 -21.706288 +280 436 -20.443550 +282 436 -20.323042 +284 436 -7.882970 +288 436 -9.710437 +289 436 -22.262568 +290 436 -22.232314 +293 436 -21.050272 +294 436 -21.059991 +295 436 -24.328443 +296 436 -20.753284 +302 436 -9.636828 +306 436 -21.259426 +307 436 -9.564440 +312 436 -7.843926 +314 436 -20.422051 +315 436 -21.814493 +316 436 -21.802836 +317 436 -9.680635 +318 436 -84.664438 +321 436 -2164.547833 +342 436 -24.328443 +359 436 4696.830079 +361 436 187846.368305 +362 436 70988.989418 +384 436 2279.853385 +385 436 2685.167671 +386 436 305238.636074 +387 436 596.758580 +410 436 4719.039225 +411 436 311095.972338 +435 436 12701.481856 +436 436 12108308.888945 +460 436 110755.901906 +461 436 216994.316483 +484 436 495.954235 +485 436 184347.992517 +486 436 145829.517715 +487 436 4052.062957 +40 437 -20.159220 +191 437 -8.798433 +196 437 -8.710806 +199 437 -8.910924 +205 437 -20.021496 +207 437 -20.019503 +208 437 -20.022002 +216 437 -4.281804 +239 437 -20.024960 +254 437 -19.598084 +262 437 -78.739611 +321 437 -229.286843 +362 437 27708.266461 +387 437 31746.729422 +412 437 31241.707682 +437 437 11542465.717871 +438 437 317.286887 +461 437 838.141976 +462 437 26234.611173 +463 437 3336.792735 +486 437 1187.394495 +487 437 14010.536760 +488 437 14880.147864 +216 438 -4.871875 +321 438 -4.871875 +362 438 631.597997 +387 438 715.749992 +412 438 696.148820 +437 438 317.286887 +438 438 11280670.605153 +463 438 662.094660 +488 438 647.440705 +439 439 11111111.111111 +440 440 11111111.111111 +441 441 11111111.111111 +442 442 11111111.111111 +443 443 11446854.729258 +51 444 -25.951377 +65 444 -24.345457 +75 444 -94.696177 +90 444 -26.291328 +92 444 -26.295328 +93 444 -98.650379 +95 444 -26.079432 +96 444 -104.244744 +97 444 -32.518999 +100 444 -10.162595 +101 444 -27.428456 +132 444 -10.221224 +133 444 -11.624988 +134 444 -26.087847 +135 444 -34.123158 +136 444 -25.918611 +137 444 -29.254558 +138 444 -28.138827 +139 444 -29.094472 +141 444 -10.688108 +142 444 -25.727823 +143 444 -31.935527 +144 444 -93.770742 +163 444 -10.250301 +164 444 -23.579761 +166 444 -10.472564 +171 444 -26.078967 +172 444 -10.107556 +174 444 -11.583567 +175 444 -13.773527 +176 444 -26.066719 +177 444 -23.721568 +178 444 -30.889452 +179 444 -29.787700 +180 444 -31.155205 +182 444 -13.831121 +183 444 -23.058078 +184 444 -22.974929 +185 444 -23.437582 +186 444 -25.975225 +188 444 -11.870484 +189 444 -23.082399 +190 444 -10.883892 +192 444 -27.275733 +193 444 -22.991199 +194 444 -24.977458 +196 444 -28.841879 +197 444 -14.189898 +198 444 -11.670203 +199 444 -12.723687 +202 444 -26.258241 +203 444 -26.693810 +206 444 -33.438036 +209 444 -12.175638 +211 444 -11.845983 +212 444 -26.802830 +234 444 -124.725118 +237 444 -11.599144 +239 444 -28.622397 +241 444 -33.206706 +242 444 -22.761510 +244 444 -25.003070 +246 444 -23.029021 +247 444 -31.593402 +248 444 -12.407125 +250 444 -23.552415 +251 444 -95.527129 +252 444 -136.643170 +253 444 -23.675888 +256 444 -11.586805 +257 444 -23.599609 +258 444 -11.033644 +262 444 -26.956371 +263 444 -10.461289 +264 444 -29.425887 +265 444 -22.979141 +266 444 -94.778176 +267 444 -10.149880 +268 444 -11.138219 +269 444 -11.359115 +271 444 -94.859309 +273 444 -10.271509 +274 444 -44.678937 +275 444 -27.406111 +277 444 -27.889460 +279 444 -25.422050 +280 444 -24.608831 +282 444 -10.200322 +283 444 -24.878345 +284 444 -10.186085 +285 444 -24.323662 +291 444 -24.505319 +292 444 -137.298235 +293 444 -10.665273 +294 444 -23.976641 +295 444 -26.550118 +296 444 -10.689890 +297 444 -26.769364 +298 444 -26.333261 +299 444 -24.553857 +301 444 -101.880331 +302 444 -10.587732 +304 444 -124.866672 +305 444 -31.186911 +306 444 -10.607093 +307 444 -23.506619 +308 444 -106.879151 +310 444 -29.627558 +311 444 -31.451081 +315 444 -10.514433 +316 444 -10.524183 +317 444 -10.528216 +318 444 -10.520691 +322 444 -31.525807 +325 444 -3444.749699 +327 444 -64.001322 +346 444 8975.935129 +347 444 6710.991363 +352 444 1521.790943 +353 444 2010.118516 +356 444 1653.025137 +357 444 6111.354752 +358 444 6127.184692 +359 444 490.931777 +369 444 3526.654571 +370 444 1801.237627 +371 444 15707.849745 +375 444 2258.911826 +376 444 2894.421675 +377 444 13639.658682 +378 444 22862.895757 +379 444 14621.250082 +380 444 6085.744465 +381 444 4444.632542 +394 444 21293.750509 +395 444 17850.312175 +397 444 796.841935 +398 444 3422.175997 +399 444 21919.463670 +400 444 27828.388104 +401 444 30611.700059 +402 444 21718.202287 +403 444 9622.431454 +404 444 5932.152892 +405 444 5937.174798 +406 444 89.095713 +419 444 34858.430059 +420 444 24787.992608 +421 444 41490.019604 +422 444 41159.911505 +423 444 48757.939492 +424 444 45077.609450 +425 444 64123.389692 +426 444 62683.553736 +427 444 54201.119250 +428 444 54205.523860 +429 444 54210.512646 +430 444 15781.111163 +431 444 3530.132873 +444 444 12099833.790442 +445 444 203519.697603 +446 444 101192.641202 +447 444 68288.428702 +448 444 54247.971149 +449 444 32193.810636 +450 444 4097.458729 +469 444 348497.634587 +470 444 276656.123766 +471 444 132679.302478 +472 444 77651.084720 +473 444 49116.356990 +474 444 41794.754729 +475 444 15131.897326 +476 444 5222.796175 +477 444 5224.781193 +478 444 3627.062951 +479 444 2175.734794 +494 444 224138.941059 +495 444 157073.774073 +496 444 182043.873929 +497 444 116363.127396 +498 444 58616.677012 +499 444 36862.215962 +500 444 23900.775162 +90 445 -33.224205 +92 445 -33.229372 +95 445 -32.950509 +96 445 -131.707797 +97 445 -5.167278 +101 445 -34.695541 +133 445 -14.688747 +134 445 -32.961376 +135 445 -0.850407 +137 445 -20.025958 +138 445 -30.879114 +139 445 -21.234640 +171 445 -32.949910 +174 445 -14.635255 +175 445 -4.698308 +176 445 -32.934094 +178 445 -10.996936 +180 445 -9.898932 +182 445 -4.462328 +188 445 -15.006041 +192 445 -34.497676 +196 445 -23.329349 +198 445 -14.747152 +199 445 -11.251220 +203 445 -12.377196 +206 445 -2.573196 +211 445 -6.051382 +212 445 -9.521492 +237 445 -14.655370 +239 445 -25.373296 +241 445 -3.192256 +248 445 -15.139286 +251 445 -92.311585 +256 445 -14.639436 +262 445 -34.084176 +264 445 -18.819621 +277 445 -34.479223 +295 445 -17.411199 +297 445 -10.332068 +298 445 -30.945188 +304 445 -38.619583 +305 445 -9.772601 +308 445 -135.112313 +310 445 -17.500626 +311 445 -8.755310 +325 445 -1060.376963 +327 445 -68.252693 +329 445 -9.611020 +341 445 -14.447872 +356 445 1084.030914 +357 445 4007.741520 +358 445 4018.122575 +359 445 321.946237 +369 445 3637.821069 +377 445 4755.022191 +378 445 10031.134742 +379 445 7469.193536 +380 445 3990.946650 +381 445 2914.728256 +394 445 21866.758838 +395 445 45.666616 +398 445 195.437824 +399 445 7900.713082 +400 445 12753.911209 +401 445 16764.794110 +402 445 16427.886014 +403 445 9913.804145 +404 445 7496.454103 +405 445 7502.800278 +406 445 112.590140 +419 445 16416.243396 +420 445 13469.806111 +421 445 26757.439205 +422 445 27322.762886 +423 445 40016.487085 +424 445 51000.342888 +425 445 80494.363454 +426 445 78943.221465 +427 445 68480.842807 +428 445 68486.407866 +429 445 68492.711009 +430 445 19938.851662 +431 445 4460.235684 +444 445 203519.697603 +445 445 11726020.685130 +446 445 130270.408653 +447 445 86283.902828 +448 445 68541.839007 +449 445 40675.599509 +450 445 5177.146131 +470 445 51060.842438 +471 445 87794.081973 +472 445 89132.290565 +473 445 61976.504470 +474 445 52833.449249 +475 445 19126.378864 +476 445 6599.547197 +477 445 6602.055507 +478 445 4583.259748 +479 445 2749.385835 +495 445 15008.083371 +496 445 13066.852698 +497 445 47863.661122 +498 445 49569.989459 +499 445 41973.891767 +500 445 30048.197391 +90 446 -33.233208 +92 446 -1.681295 +95 446 -32.951942 +96 446 -131.710958 +101 446 -8.715563 +133 446 -14.690593 +134 446 -32.963106 +171 446 -32.951326 +174 446 -14.635635 +176 446 -32.935079 +188 446 -15.016925 +192 446 -12.882125 +198 446 -14.750618 +237 446 -14.656299 +251 446 -51.946603 +256 446 -14.639930 +262 446 -24.489465 +268 446 -30.659402 +269 446 -13.626012 +270 446 -13.627279 +274 446 -30.658376 +308 446 -135.211970 +322 446 -88.571069 +324 446 -19.283187 +325 446 -568.116037 +329 446 -30.156641 +338 446 -0.561882 +341 446 -1.944893 +347 446 15928.275120 +369 446 2610.370812 +371 446 440.352154 +372 446 17742.430270 +394 446 13042.633981 +395 446 2574.630504 +396 446 5443.157491 +397 446 12791.120516 +401 446 21.386084 +402 446 378.764612 +403 446 379.013343 +404 446 379.295572 +405 446 379.616668 +406 446 5.696686 +419 446 139.405170 +420 446 11889.576882 +421 446 21063.346326 +422 446 1363.836051 +423 446 13423.797479 +424 446 32094.713198 +425 446 66421.319745 +426 446 68835.425049 +427 446 68483.188542 +428 446 68488.753814 +429 446 68495.057200 +430 446 19939.634624 +431 446 4460.465294 +444 446 101192.641202 +445 446 130270.408653 +446 446 11711186.931637 +447 446 90023.983477 +448 446 68580.951490 +449 446 40677.080085 +450 446 5177.549621 +471 446 28352.303235 +472 446 46708.735558 +473 446 49764.665630 +474 446 50171.483451 +475 446 19136.994062 +476 446 6600.738966 +477 446 6603.247771 +478 446 4584.198495 +479 446 2750.031952 +496 446 18775.743661 +497 446 7523.318984 +498 446 2575.597134 +499 446 9099.616415 +500 446 11618.025888 +90 447 -33.243457 +95 447 -32.953572 +96 447 -131.714554 +116 447 -202.708924 +133 447 -14.692694 +134 447 -32.965074 +171 447 -32.952938 +174 447 -14.636068 +176 447 -32.936200 +188 447 -2.041939 +198 447 -14.754563 +237 447 -13.882151 +251 447 -48.910816 +256 447 -14.640492 +268 447 -45.984819 +269 447 -26.710695 +270 447 -13.406534 +274 447 -43.633693 +308 447 -15.200862 +319 447 -29.370147 +321 447 -29.186351 +324 447 -27.442303 +325 447 -386.614564 +327 447 -70.248830 +328 447 -6.149619 +333 447 -138.002807 +334 447 -30.221986 +336 447 -29.264925 +337 447 -3.400729 +338 447 -18.067783 +347 447 23400.066083 +360 447 4915.728419 +361 447 6796.608681 +362 447 197.893242 +369 447 2925.513448 +372 447 26698.138708 +376 447 6663.964103 +377 447 11642.341404 +382 447 1094.329082 +383 447 6727.312425 +384 447 6746.824100 +385 447 1853.933690 +394 447 9942.688111 +395 447 7375.058882 +396 447 102.896306 +397 447 26604.397385 +400 447 23321.921400 +401 447 28940.280916 +404 447 3417.555279 +405 447 13426.598560 +406 447 12232.389828 +407 447 5616.197409 +420 447 6261.061491 +421 447 9910.100308 +422 447 27373.668951 +423 447 21233.492898 +424 447 66681.573123 +425 447 77904.578143 +426 447 78305.344646 +427 447 81678.056262 +428 447 81701.499388 +429 447 78310.577951 +430 447 19767.521733 +431 447 4319.700500 +444 447 68288.428702 +445 447 86283.902828 +446 447 90023.983477 +447 447 11679287.620186 +448 447 114868.222365 +449 447 55698.963922 +450 447 19881.909393 +451 447 4720.565645 +452 447 1368.575908 +453 447 1368.624241 +454 447 1368.678974 +455 447 1368.741104 +456 447 1368.811843 +457 447 1368.892675 +458 447 1368.985436 +459 447 1369.092413 +460 447 1174.368667 +472 447 30004.174137 +473 447 20170.507573 +474 447 16727.837555 +475 447 9175.665003 +476 447 6602.095437 +477 447 6604.604805 +478 447 4585.267043 +479 447 2750.767451 +497 447 16761.154453 +498 447 12281.118312 +499 447 8368.794704 +500 447 2982.191200 +90 448 -29.070125 +95 448 -22.206897 +96 448 -131.718630 +116 448 -195.888136 +133 448 -14.695075 +134 448 -9.784294 +171 448 -22.998000 +174 448 -14.636558 +176 448 -32.937470 +198 448 -14.759038 +251 448 -20.841932 +256 448 -14.641129 +268 448 -180.942478 +269 448 -82.511903 +270 448 -53.552177 +274 448 -65.115739 +319 448 -33.661787 +321 448 -33.598353 +323 448 -27.359408 +325 448 -307.447216 +328 448 -14.630050 +329 448 -201.206330 +333 448 -113.997945 +335 448 -58.404000 +336 448 -44.561143 +337 448 -16.806779 +338 448 -4.035154 +341 448 -50.591417 +347 448 71733.746145 +360 448 5658.822455 +361 448 7824.029025 +362 448 227.808094 +369 448 1518.587029 +372 448 82140.740260 +373 448 803.833308 +376 448 5504.802624 +377 448 9617.217398 +382 448 1259.755107 +383 448 7744.257488 +384 448 7766.718677 +385 448 2134.186575 +394 448 3527.634306 +395 448 4953.133206 +396 448 508.524945 +397 448 29142.392840 +398 448 52901.939187 +400 448 19265.195931 +401 448 23906.271383 +404 448 3920.715338 +405 448 15422.238515 +406 448 14053.592740 +407 448 6465.178973 +420 448 378.785149 +421 448 4812.745861 +422 448 12546.484579 +423 448 83631.466663 +424 448 47696.094314 +425 448 62937.996151 +426 448 66913.552513 +427 448 70788.299905 +428 448 70812.819054 +429 448 66919.968188 +430 448 14078.569747 +431 448 1794.326111 +444 448 54247.971149 +445 448 68541.839007 +446 448 68580.951490 +447 448 114868.222365 +448 448 11625288.307992 +449 448 65933.946831 +450 448 23751.704570 +451 448 7108.888969 +452 448 3255.865984 +453 448 3255.980968 +454 448 3256.111179 +455 448 3256.258987 +456 448 3256.427275 +457 448 3256.619577 +458 448 3256.840258 +459 448 3257.094757 +460 448 2793.843565 +472 448 4111.270400 +473 448 38314.926589 +474 448 55277.976751 +475 448 10322.723209 +476 448 6603.633817 +477 448 6606.143823 +478 448 4586.478973 +479 448 2751.601699 +498 448 12042.054951 +499 448 67378.160080 +500 448 1243.152213 +58 449 -1.282085 +96 449 -131.723238 +116 449 -81.945418 +133 449 -14.697770 +174 449 -12.825180 +176 449 -17.148894 +198 449 -2.850105 +251 449 -21.053150 +256 449 -3.413068 +268 449 -89.431488 +269 449 -82.240297 +270 449 -24.693723 +274 449 -84.692859 +319 449 -33.690472 +320 449 -110.063739 +321 449 -33.624578 +322 449 -1.282085 +325 449 -182.658255 +326 449 -97.455265 +328 449 -14.630368 +332 449 -14.788659 +337 449 -6.353532 +339 449 -14.699619 +341 449 -58.750704 +347 449 57515.987827 +360 449 5663.239434 +361 449 7830.136050 +362 449 227.985909 +369 449 1912.482112 +372 449 36008.038757 +373 449 29892.838106 +376 449 71.371874 +382 449 1260.738406 +383 449 7750.302248 +384 449 7772.780968 +385 449 2135.852409 +394 449 2933.468121 +395 449 5112.514744 +396 449 3181.389309 +397 449 388.334707 +398 449 62818.759782 +399 449 1549.249777 +400 449 157.369205 +401 449 109.603823 +404 449 3923.994606 +405 449 15434.829617 +406 449 14065.016522 +407 449 6470.225351 +421 449 1944.708446 +422 449 4813.057380 +423 449 35054.887679 +424 449 35137.375858 +425 449 34598.676274 +426 449 48250.086445 +427 449 52126.373806 +428 449 52149.130302 +429 449 48251.003768 +430 449 7280.847536 +431 449 418.284524 +444 449 32193.810636 +445 449 40675.599509 +446 449 40677.080085 +447 449 55698.963922 +448 449 65933.946831 +449 449 11579540.240275 +450 449 31394.107168 +451 449 7540.199255 +452 449 3255.936668 +453 449 3256.051655 +454 449 3256.181869 +455 449 3256.329680 +456 449 3256.497972 +457 449 3256.690278 +458 449 3256.910963 +459 449 3257.165468 +460 449 2793.904218 +472 449 3114.594626 +474 449 35622.036624 +475 449 29811.984176 +476 449 7495.539166 +477 449 7480.438423 +478 449 1907.384486 +479 449 531.359407 +499 449 13858.278597 +500 449 43165.539265 +58 450 -12.856128 +82 450 -0.442688 +96 450 -10.921074 +116 450 -82.007938 +126 450 -4.230330 +133 450 -12.292172 +194 450 -6.567345 +201 450 -173.003373 +214 450 -30.088058 +251 450 -15.917074 +268 450 -36.389134 +269 450 -36.669012 +270 450 -12.316914 +274 450 -45.100095 +319 450 -42.133909 +320 450 -15.310282 +321 450 -41.955586 +322 450 -12.856128 +323 450 -3.806789 +324 450 -41.136869 +325 450 -23.213246 +326 450 -9.235812 +327 450 -3.828471 +328 450 -18.214062 +329 450 -34.029723 +330 450 -9.140216 +331 450 -8.108427 +332 450 -100.771053 +333 450 -41.328419 +335 450 -3.858493 +336 450 -8.506959 +337 450 -4.286250 +338 450 -15.761673 +339 450 -24.742540 +340 450 -3.582514 +341 450 -8.826225 +342 450 -4.167685 +347 450 29875.421598 +348 450 420.515863 +360 450 6629.402220 +361 450 9795.828248 +362 450 285.259586 +369 450 1552.177354 +372 450 4123.880250 +373 450 30005.919566 +374 450 180.842343 +376 450 715.682454 +377 450 3222.416680 +382 450 1261.851429 +383 450 8847.863528 +384 450 9719.778687 +385 450 3125.247782 +394 450 2052.237541 +395 450 3800.853295 +396 450 3236.717661 +398 450 15414.494247 +399 450 18009.417664 +400 450 1584.247907 +401 450 7137.714283 +402 450 2906.146813 +404 450 3927.707179 +405 450 17122.925919 +406 450 17622.831049 +407 450 8402.557628 +408 450 842.143312 +421 450 572.058853 +422 450 3817.849590 +423 450 3828.210908 +424 450 25452.008136 +425 450 12336.274616 +426 450 23077.652821 +427 450 18408.616920 +428 450 21547.783454 +429 450 17807.556030 +430 450 2594.494225 +444 450 4097.458729 +445 450 5177.146131 +446 450 5177.549621 +447 450 19881.909393 +448 450 23751.704570 +449 450 31394.107168 +450 450 11844224.513571 +451 450 24084.628822 +452 450 9930.307318 +453 450 5005.696639 +454 450 4850.249369 +455 450 4850.419054 +456 450 4133.090312 +457 450 4054.023366 +458 450 4054.269829 +459 450 4054.554060 +460 450 3477.851670 +472 450 3115.890333 +474 450 4205.491333 +475 450 40306.487406 +476 450 32325.901164 +477 450 12433.678626 +478 450 3159.481826 +479 450 1816.147211 +480 450 1816.907496 +481 450 1817.774163 +482 450 1818.765857 +483 450 1645.140655 +499 450 10356.763302 +500 450 13170.954570 +2 451 -29.080771 +4 451 -28.698650 +5 451 -13.031269 +12 451 -12.859438 +17 451 -13.028927 +19 451 -4.938707 +23 451 -10.810604 +38 451 -12.590825 +52 451 -28.077937 +58 451 -40.824591 +60 451 -12.664788 +68 451 -28.928535 +69 451 -12.733235 +71 451 -13.195041 +79 451 -28.188562 +82 451 -13.498040 +84 451 -12.650964 +90 451 -57.457501 +94 451 -1.930619 +116 451 -31.585316 +124 451 -7.178413 +126 451 -27.367921 +128 451 -9.426390 +136 451 -12.555441 +148 451 -21.052884 +156 451 -22.838253 +157 451 -16.759505 +159 451 -7.290365 +162 451 -18.877039 +163 451 -5.892227 +186 451 -10.599234 +189 451 -6.286503 +193 451 -6.468600 +194 451 -25.208599 +201 451 -149.686028 +209 451 -14.622039 +214 451 -4.060952 +215 451 -7.114015 +238 451 -28.653865 +242 451 -12.721363 +251 451 -1.914922 +268 451 -27.475803 +269 451 -27.321293 +270 451 -22.586090 +274 451 -12.500929 +298 451 -158.826227 +319 451 -72.281853 +321 451 -70.412636 +322 451 -212.953874 +324 451 -38.677891 +328 451 -29.257120 +329 451 -56.644778 +331 451 -33.101039 +333 451 -459.357293 +337 451 -5.420455 +338 451 -49.810300 +339 451 -13.765386 +340 451 -14.622545 +341 451 -12.575392 +342 451 -3.178658 +347 451 20722.682497 +348 451 1995.285247 +353 451 10898.256345 +354 451 2862.077939 +360 451 7865.137766 +361 451 16652.214181 +362 451 485.252761 +369 451 186.736510 +372 451 433.951036 +373 451 24360.265115 +374 451 1747.624062 +376 451 2111.796750 +377 451 32218.914540 +378 451 17030.253239 +382 451 425.158593 +383 451 8116.547949 +384 451 16487.107965 +385 451 8697.535857 +394 451 246.896835 +395 451 457.266095 +396 451 389.397099 +398 451 856.718524 +399 451 23729.270602 +400 451 1065.315983 +401 451 15900.840636 +402 451 95264.625379 +403 451 6869.367057 +404 451 801.177035 +405 451 15131.320209 +406 451 26407.258941 +407 451 15942.449042 +408 451 8306.232073 +421 451 68.822209 +422 451 459.310855 +423 451 460.557385 +424 451 2202.752189 +425 451 21859.452008 +426 451 83995.187085 +427 451 74390.613318 +428 451 23821.121800 +429 451 31470.543054 +430 451 18238.615269 +431 451 3971.170823 +447 451 4720.565645 +448 451 7108.888969 +449 451 7540.199255 +450 451 24084.628822 +451 451 12300043.907087 +452 451 57532.911675 +453 451 19138.545436 +454 451 10763.390061 +455 451 9762.698973 +456 451 6834.299948 +457 451 6510.984212 +458 451 6511.310105 +459 451 6511.685926 +460 451 5585.417656 +472 451 2101.331995 +474 451 188.243414 +475 451 50201.020888 +476 451 125889.940470 +477 451 16680.985063 +478 451 8601.319197 +479 451 7428.009473 +480 451 7417.163137 +481 451 7420.701134 +482 451 7424.749527 +483 451 6715.959207 +499 451 2773.364763 +500 451 71570.859057 +1 452 -12.213604 +3 452 -27.312571 +6 452 -9.221660 +8 452 -27.451829 +10 452 -12.317314 +14 452 -27.438391 +15 452 -27.437278 +19 452 -22.922856 +21 452 -12.186939 +22 452 -27.542767 +23 452 -1.681615 +26 452 -12.278957 +31 452 -27.607448 +33 452 -12.148988 +37 452 -12.147222 +41 452 -12.148565 +45 452 -22.981646 +52 452 -0.097080 +53 452 -27.438798 +54 452 -27.441824 +57 452 -27.436168 +58 452 -143.159985 +65 452 -27.311119 +72 452 -12.180796 +77 452 -12.299513 +78 452 -12.162885 +90 452 -72.130662 +93 452 -12.162353 +94 452 -10.449801 +116 452 -14.631589 +119 452 -27.310200 +122 452 -27.636248 +124 452 -5.259982 +125 452 -27.564413 +128 452 -18.236829 +138 452 -12.170289 +145 452 -30.473500 +148 452 -7.002329 +156 452 -55.545552 +157 452 -47.041717 +159 452 -5.149492 +160 452 -12.147601 +162 452 -43.332486 +163 452 -21.978525 +166 452 -27.533695 +169 452 -12.302581 +186 452 -1.889449 +187 452 -12.194089 +189 452 -21.588116 +193 452 -5.960775 +195 452 -27.426438 +200 452 -12.166842 +201 452 -120.233645 +203 452 -18.624694 +209 452 -12.895086 +211 452 -21.671134 +212 452 -36.892373 +215 452 -5.323543 +218 452 -27.527585 +220 452 -27.493757 +221 452 -27.501603 +222 452 -27.505688 +224 452 -12.224673 +225 452 -12.219252 +231 452 -12.239741 +233 452 -12.205232 +235 452 -110.037112 +241 452 -27.452055 +268 452 -59.621362 +269 452 -77.208159 +274 452 -51.949607 +298 452 -29.253568 +308 452 -41.212812 +309 452 -42.735784 +319 452 -124.151407 +320 452 -42.487619 +321 452 -86.858025 +322 452 -148.153459 +324 452 -8.721523 +326 452 -117.041863 +327 452 -40.883181 +328 452 -29.257795 +329 452 -127.880036 +331 452 -33.110557 +333 452 -1012.827987 +337 452 -117.084333 +338 452 -4.162548 +339 452 -57.854765 +340 452 -17.566707 +342 452 -13.840030 +347 452 37481.452239 +348 452 22203.953713 +353 452 22853.299844 +354 452 11793.938602 +355 452 497.081580 +360 452 7543.288658 +361 452 20719.933771 +362 452 604.072882 +373 452 28012.698893 +374 452 39093.671083 +375 452 427.680392 +376 452 8128.503539 +377 452 68817.813244 +378 452 43962.764892 +379 452 9242.675073 +383 452 5884.527262 +384 452 19611.509077 +385 452 13048.513046 +399 452 11520.799913 +400 452 46995.599103 +401 452 34749.942796 +402 452 194559.327239 +403 452 51704.175258 +404 452 7359.565347 +405 452 15079.682827 +406 452 35186.052933 +407 452 18833.828067 +408 452 14507.740192 +409 452 872.413089 +425 452 3652.112838 +426 452 68778.012240 +427 452 233460.555794 +428 452 63959.667712 +429 452 44281.222636 +430 452 34309.742243 +431 452 9807.155708 +432 452 1479.961342 +447 452 1368.575908 +448 452 3255.865984 +449 452 3255.936668 +450 452 9930.307318 +451 452 57532.911675 +452 452 12575617.868239 +453 452 70291.907598 +454 452 16194.894281 +455 452 11258.416180 +456 452 6899.927883 +457 452 6511.134479 +458 452 6511.460380 +459 452 6511.836212 +460 452 5585.546564 +472 452 1756.996650 +475 452 23947.377499 +476 452 67133.404939 +477 452 241957.469077 +478 452 53103.932404 +479 452 26922.160519 +480 452 7557.706948 +481 452 7422.835047 +482 452 7426.884604 +483 452 6717.890463 +500 452 11775.889629 +6 453 -19.292844 +7 453 -13.726877 +36 453 -10.314909 +45 453 -40.893243 +46 453 -14.792027 +58 453 -76.000687 +83 453 -187.765065 +85 453 -39.083258 +90 453 -80.610646 +116 453 -14.632105 +137 453 -4.443458 +143 453 -12.793241 +145 453 -49.316214 +154 453 -6.006920 +156 453 -65.383414 +157 453 -64.188615 +162 453 -53.049139 +178 453 -7.856485 +192 453 -12.794925 +197 453 -12.800156 +201 453 -32.022137 +203 453 -63.140545 +209 453 -10.301726 +211 453 -55.027848 +212 453 -48.037554 +213 453 -28.391196 +251 453 -0.623230 +268 453 -31.376740 +269 453 -60.176875 +274 453 -56.376405 +297 453 -155.877628 +298 453 -269.374787 +300 453 -1.235945 +308 453 -69.487663 +309 453 -69.017868 +319 453 -88.429463 +321 453 -133.003337 +322 453 -92.530879 +323 453 -147.186790 +324 453 -39.238532 +327 453 -126.281570 +328 453 -29.258558 +329 453 -117.961441 +330 453 -11.273417 +331 453 -12.397377 +333 453 -74.636003 +334 453 -116.226597 +335 453 -10.301726 +336 453 -123.066650 +337 453 -180.153692 +338 453 -44.697953 +339 453 -237.130774 +340 453 -48.288232 +342 453 -104.149386 +347 453 28490.525079 +348 453 21106.098017 +353 453 4565.353583 +354 453 34965.607670 +355 453 1264.499235 +360 453 9105.743649 +361 453 31966.354338 +362 453 932.338021 +369 453 123.710579 +373 453 17434.576700 +374 453 35934.097356 +375 453 2005.831983 +376 453 5477.651416 +377 453 5739.099268 +378 453 13155.402409 +379 453 80650.495591 +380 453 3665.553419 +381 453 558.498494 +383 453 4689.605007 +384 453 28340.095009 +385 453 22640.406996 +394 453 10.044973 +395 453 140.848810 +396 453 140.911453 +397 453 140.982809 +398 453 141.063809 +399 453 2987.570371 +400 453 36962.117794 +401 453 25596.499998 +402 453 31550.473803 +403 453 41703.077185 +404 453 76573.020421 +405 453 12419.351371 +406 453 26329.497104 +407 453 25805.735718 +408 453 26714.547817 +409 453 3221.014588 +424 453 23.485837 +425 453 281.297106 +426 453 26938.862828 +427 453 101391.996471 +428 453 113384.353765 +429 453 92019.922215 +430 453 42386.163206 +431 453 22816.500079 +432 453 5464.209638 +447 453 1368.624241 +448 453 3255.980968 +449 453 3256.051655 +450 453 5005.696639 +451 453 19138.545436 +452 453 70291.907598 +453 453 12567566.126484 +454 453 78161.313394 +455 453 23239.141652 +456 453 8206.502865 +457 453 6511.304342 +458 453 6511.630253 +459 453 6512.006095 +460 453 5585.692284 +472 453 1757.058701 +475 453 33897.579225 +476 453 43066.893520 +477 453 54689.425903 +478 453 145811.926135 +479 453 127727.591561 +480 453 18031.686488 +481 453 2221.657438 +482 453 2850.731659 +483 453 2583.190149 +5 454 -1.536498 +7 454 -148.635861 +18 454 -13.325335 +27 454 -97.256782 +36 454 -5.050658 +40 454 -70.987705 +45 454 -52.134496 +46 454 -137.433488 +47 454 -10.181533 +56 454 -70.905286 +58 454 -56.840889 +69 454 -7.054273 +70 454 -17.453589 +73 454 -15.811472 +83 454 -30.730196 +85 454 -155.618295 +90 454 -38.934588 +92 454 -51.060901 +95 454 -92.958537 +101 454 -25.980944 +103 454 -42.658560 +104 454 -25.418606 +107 454 -32.350824 +110 454 -14.345885 +112 454 -144.358273 +116 454 -14.632691 +118 454 -392.323491 +123 454 -32.303745 +126 454 -17.031090 +128 454 -92.249552 +134 454 -32.310706 +137 454 -16.518136 +145 454 -43.679604 +146 454 -31.311557 +154 454 -242.347168 +155 454 -23.249928 +156 454 -71.601323 +157 454 -26.039820 +162 454 -37.601197 +167 454 -16.166794 +168 454 -6.340509 +171 454 -77.318229 +173 454 -16.982817 +174 454 -19.956124 +175 454 -15.906907 +176 454 -48.114559 +178 454 -6.146518 +182 454 -6.520800 +192 454 -19.180243 +194 454 -16.336845 +196 454 -13.587853 +201 454 -29.249476 +202 454 -9.247317 +203 454 -167.932564 +209 454 -16.006333 +211 454 -37.229940 +212 454 -233.500490 +214 454 -21.849379 +216 454 -7.116158 +228 454 -13.039558 +239 454 -5.644504 +251 454 -14.962200 +274 454 -2.751777 +279 454 -13.877381 +297 454 -39.731606 +298 454 -105.543401 +300 454 -17.873356 +308 454 -51.705289 +309 454 -34.633244 +319 454 -255.527665 +320 454 -364.556570 +321 454 -105.375127 +322 454 -217.014861 +323 454 -34.196916 +324 454 -80.601995 +326 454 -85.455525 +327 454 -153.605633 +328 454 -86.185547 +329 454 -597.701485 +330 454 -11.569278 +331 454 -76.497719 +332 454 -125.027340 +333 454 -243.426630 +335 454 -265.122661 +336 454 -65.590512 +337 454 -83.441214 +338 454 -63.636283 +339 454 -138.641021 +340 454 -79.701300 +341 454 -256.704247 +342 454 -127.096124 +347 454 503.710981 +348 454 568.547623 +353 454 5115.963728 +354 454 36872.091864 +360 454 5105.234449 +361 454 25542.537776 +362 454 745.328385 +369 454 2969.980598 +373 454 139.243314 +374 454 712.161581 +375 454 202.975152 +376 454 5151.407082 +377 454 25098.207172 +378 454 15028.526272 +379 454 93086.111314 +380 454 16481.648481 +381 454 6818.206335 +383 454 347.487280 +384 454 20656.547490 +385 454 20240.949287 +394 454 241.154594 +395 454 3381.426512 +396 454 3382.930412 +397 454 3384.643510 +398 454 3386.588099 +399 454 2824.954652 +400 454 514.220165 +401 454 6888.269556 +402 454 40357.676089 +403 454 53735.699638 +404 454 136050.243592 +405 454 40429.923499 +406 454 47828.776887 +407 454 17246.895883 +408 454 24694.529513 +409 454 4524.944962 +424 454 563.836029 +425 454 3391.282807 +426 454 3634.993652 +427 454 28931.690720 +428 454 61864.908432 +429 454 228328.432373 +430 454 163324.734904 +431 454 42426.791181 +432 454 7676.020347 +447 454 1368.678974 +448 454 3256.111179 +449 454 3256.181869 +450 454 4850.249369 +451 454 10763.390061 +452 454 16194.894281 +453 454 78161.313394 +454 454 13075382.303555 +455 454 144425.496493 +456 454 27890.578394 +457 454 19214.073530 +458 454 19175.260013 +459 454 19175.919682 +460 454 16447.791218 +472 454 1757.128968 +475 454 19152.283052 +476 454 27685.556627 +477 454 27312.987960 +478 454 138730.210461 +479 454 381279.723627 +480 454 151104.956470 +481 454 26002.711946 +482 454 17648.786654 +483 454 16034.861299 +2 455 -9.113298 +4 455 -1.645017 +5 455 -13.961056 +7 455 -11.306722 +17 455 -30.282510 +18 455 -25.492342 +27 455 -50.732475 +30 455 -14.730485 +36 455 -36.660328 +38 455 -21.440253 +39 455 -14.761797 +40 455 -81.227147 +45 455 -85.950130 +46 455 -17.287376 +47 455 -6.358668 +48 455 -35.415755 +50 455 -22.705328 +51 455 -15.960022 +52 455 -22.638554 +55 455 -15.124218 +56 455 -165.919726 +58 455 -7.272287 +69 455 -9.645606 +70 455 -20.501083 +73 455 -21.748841 +83 455 -15.057012 +85 455 -174.511192 +90 455 -33.059122 +92 455 -110.836573 +95 455 -250.441858 +96 455 -292.810901 +98 455 -130.148369 +99 455 -0.529976 +100 455 -5.944152 +101 455 -30.596440 +103 455 -161.761600 +104 455 -114.433477 +107 455 -251.007456 +110 455 -257.775982 +112 455 -212.266451 +116 455 -14.633355 +118 455 -73.300638 +123 455 -335.580835 +124 455 -0.298955 +126 455 -20.821313 +127 455 -21.074883 +128 455 -48.200839 +134 455 -216.039291 +136 455 -23.760726 +137 455 -17.972335 +145 455 -155.147806 +146 455 -113.610868 +154 455 -73.263187 +155 455 -215.922603 +156 455 -64.552204 +158 455 -40.770595 +161 455 -15.238459 +162 455 -92.389469 +167 455 -71.943440 +168 455 -59.512572 +171 455 -326.191936 +172 455 -1.256096 +173 455 -71.889333 +174 455 -193.760606 +175 455 -72.013985 +176 455 -124.342246 +179 455 -19.399921 +180 455 -12.876500 +181 455 -25.547101 +182 455 -59.472052 +184 455 -0.299228 +186 455 -40.360808 +193 455 -0.191729 +194 455 -32.846764 +196 455 -2.447378 +201 455 -29.249877 +202 455 -69.277789 +203 455 -109.085035 +204 455 -14.606765 +206 455 -24.102658 +211 455 -63.455410 +212 455 -99.815151 +213 455 -15.063190 +214 455 -22.497549 +215 455 -0.299744 +216 455 -9.927669 +228 455 -35.200407 +237 455 -23.443598 +238 455 -2.826354 +239 455 -11.657290 +240 455 -6.202927 +241 455 -34.167593 +242 455 -3.730084 +244 455 -29.213797 +245 455 -11.937226 +247 455 -23.262883 +251 455 -14.982785 +252 455 -12.857986 +256 455 -23.975891 +264 455 -14.509953 +265 455 -1.216507 +267 455 -1.422958 +268 455 -14.295820 +269 455 -14.710604 +274 455 -37.502223 +275 455 -7.723220 +279 455 -23.229338 +281 455 -32.606126 +283 455 -13.903231 +284 455 -0.941084 +292 455 -4.044847 +295 455 -10.858252 +297 455 -80.307997 +298 455 -34.817862 +300 455 -7.796256 +304 455 -0.629022 +305 455 -0.611870 +308 455 -40.383715 +309 455 -6.351361 +310 455 -34.466907 +311 455 -1.481548 +313 455 -1.073973 +319 455 -764.033403 +320 455 -429.576182 +321 455 -37.785833 +322 455 -60.086601 +323 455 -215.252510 +324 455 -528.518112 +326 455 -302.339183 +327 455 -203.107617 +328 455 -95.071036 +329 455 -104.386250 +330 455 -11.233220 +331 455 -124.051986 +332 455 -727.324369 +333 455 -232.967444 +335 455 -154.815158 +336 455 -290.960195 +337 455 -165.997937 +338 455 -402.197118 +339 455 -449.917671 +340 455 -618.413108 +341 455 -514.954415 +342 455 -98.726624 +347 455 11684.063815 +348 455 15871.462310 +349 455 5546.794657 +353 455 1250.571547 +354 455 62490.778936 +358 455 1656.777939 +359 455 301.714435 +360 455 905.476599 +361 455 8873.333131 +362 455 275.428661 +369 455 2974.066531 +374 455 10368.414168 +375 455 15965.042944 +376 455 8512.274699 +377 455 25874.549319 +378 455 5248.964134 +379 455 109818.592607 +380 455 10850.432437 +381 455 1429.711488 +382 455 253.493663 +383 455 2015.103297 +384 455 4067.263671 +385 455 8417.531462 +386 455 549.407217 +394 455 241.486361 +395 455 3386.078489 +396 455 3387.584457 +397 455 3389.299912 +398 455 3391.247177 +399 455 2828.841066 +401 455 8949.258552 +402 455 39170.822538 +403 455 55333.514200 +404 455 103694.560041 +405 455 70364.341805 +406 455 132485.159651 +407 455 5497.684063 +408 455 6374.066291 +409 455 5172.931520 +424 455 564.611723 +425 455 3395.948343 +426 455 3398.771573 +427 455 7903.194250 +428 455 40971.297586 +429 455 136140.932989 +430 455 529785.200187 +431 455 138648.552535 +432 455 6204.216281 +433 455 2796.574356 +447 455 1368.741104 +448 455 3256.258987 +449 455 3256.329680 +450 455 4850.419054 +451 455 9762.698973 +452 455 11258.416180 +453 455 23239.141652 +454 455 144425.496493 +455 455 14347245.220977 +456 455 138315.052333 +457 455 23033.878122 +458 455 21151.667410 +459 455 21152.355480 +460 455 18143.006242 +472 455 1757.208731 +475 455 11708.342251 +476 455 18013.979604 +477 455 16600.360524 +478 455 32947.591719 +479 455 198083.646369 +480 455 667957.996721 +481 455 344802.410007 +482 455 41265.171387 +483 455 26271.558819 +1 456 -25.187298 +2 456 -3.655776 +3 456 -10.810839 +4 456 -10.392946 +6 456 -37.130185 +8 456 -25.132492 +13 456 -25.043083 +14 456 -25.075256 +15 456 -25.073969 +16 456 -25.557973 +19 456 -25.813406 +21 456 -24.991629 +22 456 -25.325364 +25 456 -25.054454 +26 456 -11.324818 +28 456 -25.105531 +32 456 -10.792652 +34 456 -10.756038 +36 456 -36.025557 +37 456 -24.258069 +38 456 -7.410322 +39 456 -31.803827 +41 456 -26.213901 +42 456 -25.159726 +43 456 -10.818276 +44 456 -104.598601 +45 456 -51.073977 +48 456 -117.551111 +49 456 -25.990362 +50 456 -6.313395 +51 456 -8.534256 +52 456 -6.371129 +53 456 -25.077809 +54 456 -100.333489 +55 456 -3.857234 +56 456 -83.641404 +57 456 -25.072678 +59 456 -26.433110 +60 456 -26.761233 +62 456 -9.858349 +63 456 -25.716598 +64 456 -24.526376 +65 456 -10.812932 +66 456 -11.044782 +67 456 -24.860753 +70 456 -0.122685 +72 456 -11.110969 +75 456 -25.046517 +77 456 -11.359123 +78 456 -11.044228 +80 456 -10.777455 +83 456 -3.306633 +84 456 -26.727328 +85 456 -25.083768 +86 456 -11.162606 +87 456 -11.890283 +89 456 -24.563042 +90 456 -3.289917 +91 456 -24.972050 +92 456 -77.679153 +93 456 -33.893291 +94 456 -36.034300 +96 456 -10.617923 +99 456 -35.883730 +100 456 -35.745603 +101 456 -18.844015 +103 456 -19.732245 +104 456 -31.918344 +105 456 -26.238255 +106 456 -24.417693 +107 456 -28.432548 +108 456 -24.412278 +109 456 -24.416418 +110 456 -37.440272 +111 456 -25.197600 +112 456 -48.916755 +116 456 -14.634111 +117 456 -26.056074 +118 456 -55.749545 +119 456 -24.316919 +120 456 -24.319991 +122 456 -25.491160 +124 456 -36.012643 +125 456 -15.739567 +127 456 -7.728339 +128 456 -22.456902 +129 456 -24.667185 +130 456 -11.422099 +131 456 -11.418869 +132 456 -11.559339 +133 456 -25.709945 +134 456 -33.852644 +135 456 -13.559641 +136 456 -5.403338 +137 456 -36.137659 +141 456 -24.427082 +145 456 -42.008423 +146 456 -30.140585 +148 456 -26.160610 +149 456 -24.996342 +150 456 -26.052283 +151 456 -11.111377 +152 456 -25.888194 +153 456 -11.123412 +154 456 -36.521500 +155 456 -130.414554 +156 456 -73.680736 +157 456 -28.260238 +158 456 -340.393980 +159 456 -26.050807 +160 456 -9.684839 +161 456 -57.779269 +162 456 -74.802447 +163 456 -36.069106 +164 456 -9.915848 +166 456 -35.346715 +167 456 -16.176955 +168 456 -16.308483 +169 456 -35.617832 +171 456 -37.665332 +172 456 -3.488899 +173 456 -17.000079 +174 456 -16.675798 +175 456 -16.191204 +176 456 -11.444095 +177 456 -29.369083 +178 456 -4.684414 +179 456 -2.016943 +180 456 -5.059893 +181 456 -14.543581 +182 456 -16.296932 +183 456 -36.071471 +184 456 -9.964432 +185 456 -35.476682 +186 456 -33.740789 +187 456 -24.940093 +188 456 -6.950007 +189 456 -36.113148 +190 456 -20.494566 +191 456 -4.556974 +193 456 -10.059884 +194 456 -4.185427 +195 456 -25.031989 +196 456 -12.434062 +197 456 -4.385309 +201 456 -16.082386 +202 456 -17.301063 +203 456 -46.795154 +204 456 -55.095876 +206 456 -15.803889 +211 456 -28.636978 +212 456 -16.069167 +213 456 -13.034239 +214 456 -1.834952 +215 456 -36.012312 +216 456 -13.822449 +217 456 -29.860105 +219 456 -25.192166 +220 456 -25.241019 +221 456 -25.258463 +222 456 -29.703642 +223 456 -100.874635 +224 456 -25.263147 +227 456 -25.058910 +228 456 -4.210445 +229 456 -35.230862 +230 456 -34.990318 +231 456 -29.814102 +233 456 -25.156019 +234 456 -11.317790 +235 456 -29.690353 +237 456 -45.656960 +238 456 -24.195536 +240 456 -35.527686 +241 456 -7.566357 +242 456 -27.995963 +244 456 -5.576772 +245 456 -1.226435 +247 456 -5.832040 +250 456 -29.773728 +251 456 -1.492022 +252 456 -19.710776 +253 456 -34.503372 +256 456 -109.793507 +257 456 -29.653846 +258 456 -28.503358 +259 456 -10.754937 +261 456 -10.878034 +262 456 -7.929980 +263 456 -29.402662 +264 456 -24.099074 +265 456 -65.889938 +266 456 -25.041876 +267 456 -35.436285 +268 456 -1.613915 +269 456 -1.605150 +271 456 -34.623941 +272 456 -24.792970 +273 456 -15.899579 +274 456 -39.722955 +275 456 -15.374146 +278 456 -35.207846 +282 456 -26.104429 +284 456 -35.664405 +285 456 -34.039123 +287 456 -11.106277 +289 456 -25.357798 +290 456 -25.336707 +292 456 -8.186263 +293 456 -24.569589 +294 456 -24.577763 +295 456 -28.146748 +296 456 -24.425592 +297 456 -107.300813 +298 456 -34.949561 +299 456 -15.112589 +300 456 -13.801599 +302 456 -29.314807 +304 456 -30.534321 +305 456 -30.535814 +306 456 -24.697295 +307 456 -11.077488 +308 456 -3.332774 +310 456 -117.364309 +311 456 -35.497395 +312 456 -26.231743 +313 456 -15.543854 +314 456 -33.930890 +315 456 -34.951643 +316 456 -34.934524 +317 456 -34.915187 +318 456 -24.691374 +319 456 -3425.023372 +320 456 -96.484007 +321 456 -88.316592 +322 456 -15.562266 +323 456 -36.840872 +324 456 -331.362070 +326 456 -49.866680 +327 456 -27.938387 +328 456 -151.921862 +329 456 -48.265519 +331 456 -121.658469 +332 456 -108.841232 +333 456 -39.382723 +335 456 -24.822192 +336 456 -25.226461 +337 456 -231.126967 +338 456 -252.701850 +339 456 -125.800355 +340 456 -800.621098 +341 456 -87.041929 +342 456 -346.688520 +347 456 7297.349259 +348 456 10168.692399 +349 456 6413.950660 +353 456 481.124745 +354 456 46013.980206 +355 456 3520.931116 +358 456 4184.964888 +359 456 812.438535 +361 456 18895.075979 +362 456 678.000057 +369 456 296.164713 +374 456 3779.490560 +375 456 10221.604952 +376 456 8963.185017 +377 456 5402.253263 +378 456 1664.028285 +379 456 59016.379645 +380 456 32949.330260 +381 456 5781.108474 +382 456 575.028181 +383 456 5205.122458 +384 456 503.729931 +385 456 20064.650724 +386 456 4229.791574 +394 456 24.047794 +395 456 337.193857 +396 456 337.343825 +397 456 337.514654 +398 456 337.708568 +399 456 281.702811 +401 456 1290.490700 +402 456 14476.809027 +403 456 19428.677823 +404 456 20643.380849 +405 456 89263.514302 +406 456 462372.044215 +407 456 5585.945285 +408 456 4153.663851 +409 456 20816.695270 +410 456 2698.244522 +424 456 56.225396 +425 456 338.176721 +426 456 338.457865 +427 456 4639.963651 +428 456 9543.359713 +429 456 27965.131168 +430 456 148040.874480 +431 456 690339.223939 +432 456 13103.363827 +433 456 18388.786504 +434 456 1145.691456 +447 456 1368.811843 +448 456 3256.427275 +449 456 3256.497972 +450 456 4133.090312 +451 456 6834.299948 +452 456 6899.927883 +453 456 8206.502865 +454 456 27890.578394 +455 456 138315.052333 +456 456 15164504.520632 +457 456 74339.062503 +458 456 33997.162108 +459 456 33875.528931 +460 456 29061.030631 +472 456 1757.299546 +475 456 948.188092 +476 456 1486.307844 +477 456 1421.469331 +478 456 7315.145210 +479 456 34230.676475 +480 456 302059.127857 +481 456 691741.718635 +482 456 151449.387439 +483 456 30504.479334 +5 457 -5.044059 +6 457 -30.586221 +7 457 -80.047474 +27 457 -74.233878 +36 457 -137.656732 +39 457 -123.999913 +45 457 -29.610458 +48 457 -26.048194 +55 457 -7.931850 +56 457 -2.763457 +62 457 -14.286437 +68 457 -0.845954 +69 457 -36.569625 +70 457 -16.858210 +81 457 -8.826667 +82 457 -74.190929 +85 457 -9.221498 +92 457 -54.569660 +101 457 -9.237813 +115 457 -9.142565 +116 457 -14.634975 +118 457 -32.912484 +126 457 -16.379131 +133 457 -33.057434 +135 457 -10.581264 +137 457 -5.559205 +138 457 -9.837939 +140 457 -29.665948 +145 457 -93.688419 +154 457 -32.900137 +155 457 -52.554446 +156 457 -33.773559 +157 457 -30.247103 +158 457 -7.653971 +161 457 -161.630990 +162 457 -104.207733 +167 457 -36.982530 +168 457 -34.924367 +173 457 -151.731949 +175 457 -36.824025 +178 457 -24.872290 +180 457 -37.902806 +182 457 -34.739523 +188 457 -5.880152 +194 457 -13.719504 +196 457 -9.979604 +197 457 -10.762978 +199 457 -1.410199 +201 457 -14.627822 +202 457 -6.054058 +203 457 -48.378220 +205 457 -3.596850 +208 457 -3.728128 +214 457 -5.624414 +228 457 -16.472295 +234 457 -17.177802 +237 457 -58.853086 +239 457 -3.500976 +256 457 -39.815235 +274 457 -16.801658 +277 457 -11.065363 +279 457 -11.075130 +281 457 -21.305887 +295 457 -44.268571 +297 457 -13.232175 +298 457 -2.179332 +300 457 -37.519499 +308 457 -32.168504 +309 457 -32.476949 +319 457 -199.007771 +321 457 -820.284528 +323 457 -6.068628 +324 457 -102.216528 +327 457 -9.543281 +328 457 -325.158712 +331 457 -288.400637 +334 457 -28.656662 +337 457 -265.519907 +338 457 -30.771190 +342 457 -184.980368 +347 457 2834.851844 +348 457 3971.985666 +349 457 2742.863963 +354 457 66449.554388 +355 457 4146.468177 +358 457 4953.820588 +359 457 1857.501144 +361 457 154081.284867 +362 457 6664.348964 +374 457 1238.509996 +375 457 3992.054877 +376 457 3831.893956 +378 457 1578.168765 +379 457 10565.089742 +380 457 74909.408486 +381 457 38682.784892 +383 457 7761.716552 +384 457 77.490856 +385 457 128482.155784 +386 457 72378.989168 +401 457 172.319910 +402 457 4192.331425 +403 457 4033.921589 +404 457 8924.517321 +405 457 27518.386181 +406 457 133528.942002 +407 457 12961.836603 +408 457 7459.507513 +409 457 123527.091891 +410 457 93058.358631 +427 457 268.206912 +428 457 509.788130 +429 457 5221.833175 +430 457 12063.202355 +431 457 91804.519775 +432 457 125512.523051 +433 457 138842.889372 +434 457 93969.362812 +447 457 1368.892675 +448 457 3256.619577 +449 457 3256.690278 +450 457 4054.023366 +451 457 6510.984212 +452 457 6511.134479 +453 457 6511.304342 +454 457 19214.073530 +455 457 23033.878122 +456 457 74339.062503 +457 457 14453591.669091 +458 457 182738.324010 +459 457 72678.676527 +460 457 62361.041364 +472 457 1757.403320 +475 457 10255.707609 +476 457 14445.681808 +477 457 14448.917049 +478 457 19457.792811 +479 457 24512.717692 +480 457 66158.643913 +481 457 182601.431326 +482 457 118661.828001 +483 457 136609.381055 +484 457 4390.647523 +5 458 -35.305093 +6 458 -14.793105 +7 458 -24.189262 +20 458 -14.179447 +27 458 -36.523970 +39 458 -58.360781 +55 458 -4.409279 +68 458 -16.825666 +69 458 -10.226924 +70 458 -3.977437 +81 458 -10.400333 +82 458 -97.785142 +92 458 -21.120072 +103 458 -0.348524 +115 458 -10.148951 +116 458 -14.635967 +118 458 -32.913540 +126 458 -26.177770 +133 458 -33.069070 +138 458 -31.428842 +140 458 -15.639301 +145 458 -55.644298 +154 458 -32.900298 +155 458 -0.211963 +156 458 -38.215304 +157 458 -37.938071 +161 458 -132.438042 +162 458 -74.129125 +167 458 -9.904513 +168 458 -11.513040 +170 458 -1.862591 +173 458 -35.961307 +175 458 -10.028262 +179 458 -39.243388 +180 458 -8.372798 +182 458 -11.657678 +188 458 -6.709643 +194 458 -28.307643 +196 458 -2.152468 +199 458 -11.884810 +201 458 -14.628295 +202 458 -34.486422 +205 458 -26.238771 +206 458 -1.115856 +208 458 -26.083502 +213 458 -35.375702 +214 458 -12.960956 +228 458 -26.103290 +237 458 -15.726848 +239 458 -26.352228 +241 458 -15.423586 +247 458 -0.123988 +248 458 -10.656892 +262 458 -14.580496 +279 458 -30.432340 +281 458 -22.250668 +283 458 -4.978867 +295 458 -76.822699 +300 458 -0.095897 +308 458 -33.135265 +309 458 -33.134267 +310 458 -3.445495 +319 458 -154.935167 +321 458 -682.894277 +323 458 -18.860941 +328 458 -329.065858 +331 458 -110.686050 +335 458 -10.242463 +339 458 -23.744883 +341 458 -23.974411 +342 458 -171.281996 +354 458 52003.842914 +355 458 4240.581099 +358 458 3129.535618 +359 458 7557.988798 +361 458 120214.052683 +362 458 5772.076831 +379 458 552.673351 +380 458 54920.473551 +381 458 8989.548204 +383 458 11221.372249 +384 458 772.164844 +385 458 81164.911282 +386 458 75347.505455 +405 458 3499.803474 +406 458 66728.478117 +407 458 22181.464165 +408 458 12134.946964 +409 458 61679.767515 +410 458 106448.907548 +411 458 0.182723 +430 458 56.826626 +431 458 11506.593464 +432 458 83242.243050 +433 458 78269.369768 +434 458 117703.153407 +435 458 2782.864594 +447 458 1368.985436 +448 458 3256.840258 +449 458 3256.910963 +450 458 4054.269829 +451 458 6511.310105 +452 458 6511.460380 +453 458 6511.630253 +454 458 19175.260013 +455 458 21151.667410 +456 458 33997.162108 +457 458 182738.324010 +458 458 13821867.574487 +459 458 81971.835816 +460 458 63119.057532 +472 458 1757.522408 +475 458 10512.297906 +476 458 14808.599462 +477 458 14811.916015 +478 458 19355.994356 +479 458 22203.822288 +480 458 31127.051638 +481 458 112749.670778 +482 458 97909.671118 +483 458 85832.618283 +484 458 24758.947881 +2 459 -5.672320 +6 459 -0.162442 +7 459 -8.951231 +17 459 -30.963781 +18 459 -31.294592 +20 459 -2.615057 +38 459 -26.571090 +47 459 -115.429887 +51 459 -30.571842 +52 459 -30.420765 +58 459 -1.299752 +79 459 -30.479592 +97 459 -7.856989 +98 459 -28.436145 +101 459 -11.435994 +103 459 -14.704044 +107 459 -31.537246 +110 459 -13.477733 +112 459 -33.017592 +116 459 -14.637111 +118 459 -32.914757 +133 459 -33.082500 +134 459 -111.620097 +136 459 -30.593096 +137 459 -27.235697 +138 459 -3.976926 +139 459 -1.117761 +140 459 -9.429725 +146 459 -90.383251 +154 459 -32.900484 +155 459 -0.574920 +161 459 -132.504588 +167 459 -8.388852 +168 459 -7.936738 +170 459 -14.989121 +186 459 -28.178901 +192 459 -25.484436 +198 459 -16.404406 +201 459 -14.628840 +206 459 -13.484842 +213 459 -3.659495 +228 459 -0.505696 +241 459 -19.460642 +244 459 -30.771391 +245 459 -30.843105 +247 459 -14.330514 +248 459 -23.451516 +251 459 -17.654432 +252 459 -13.752178 +275 459 -18.237990 +281 459 -7.167887 +283 459 -28.244228 +292 459 -30.659867 +295 459 -39.447237 +298 459 -20.859445 +304 459 -30.372171 +305 459 -13.495656 +308 459 -33.153951 +309 459 -33.152873 +310 459 -29.545836 +311 459 -30.269047 +313 459 -13.926264 +320 459 -9.914146 +321 459 -740.043030 +326 459 -9.853608 +328 459 -799.722625 +332 459 -9.860529 +338 459 -9.818955 +342 459 -9.113673 +355 459 21.720069 +359 459 5487.846034 +361 459 102076.764165 +362 459 7797.573915 +369 459 3748.126588 +370 459 2451.347426 +376 459 220.038186 +377 459 160.652323 +380 459 17.984223 +381 459 1794.154866 +384 459 6041.944865 +385 459 2139.592641 +386 459 131351.647376 +395 459 1494.510386 +396 459 3946.397047 +397 459 3947.010684 +398 459 3947.706459 +399 459 3948.493540 +400 459 3949.382804 +401 459 3950.387192 +402 459 8143.348882 +403 459 3799.705167 +404 459 294.060226 +405 459 294.359829 +406 459 829.005990 +407 459 1749.483494 +409 459 6058.076985 +410 459 114364.396512 +411 459 25521.241436 +428 459 5113.567076 +429 459 8622.444283 +430 459 57112.216580 +431 459 81024.557303 +432 459 82280.521026 +433 459 82562.723535 +434 459 45936.016635 +435 459 122929.726641 +447 459 1369.092413 +448 459 3257.094757 +449 459 3257.165468 +450 459 4054.554060 +451 459 6511.685926 +452 459 6511.836212 +453 459 6512.006095 +454 459 19175.919682 +455 459 21152.355480 +456 459 33875.528931 +457 459 72678.676527 +458 459 81971.835816 +459 459 13394345.988582 +460 459 159570.226499 +472 459 1757.659746 +475 459 10518.213083 +476 459 14816.932503 +477 459 14820.250923 +478 459 19366.175364 +479 459 22215.160566 +480 459 22221.731942 +481 459 38463.416846 +482 459 18626.114920 +483 459 116926.166746 +484 459 84461.333761 +485 459 1306.813147 +2 460 -6.748318 +8 460 -6.424869 +15 460 -6.936143 +16 460 -16.943933 +17 460 -21.525191 +19 460 -9.048967 +20 460 -12.182791 +21 460 -6.887534 +22 460 -27.370905 +23 460 -31.148411 +25 460 -1.793941 +27 460 -14.746031 +28 460 -7.939394 +31 460 -24.135238 +32 460 -14.747022 +34 460 -14.869824 +36 460 -14.288346 +37 460 -14.685008 +38 460 -23.792087 +40 460 -10.019620 +42 460 -22.839353 +43 460 -59.215500 +44 460 -40.112588 +47 460 -4.548613 +50 460 -9.495067 +52 460 -21.331865 +53 460 -3.849293 +54 460 -10.897401 +55 460 -0.006368 +58 460 -115.826749 +60 460 -27.683659 +61 460 -59.195636 +62 460 -6.578521 +63 460 -7.153144 +67 460 -6.842637 +71 460 -11.579610 +77 460 -7.360903 +84 460 -24.358748 +87 460 -10.838673 +91 460 -0.081185 +97 460 -4.822646 +98 460 -28.420668 +100 460 -18.140293 +101 460 -13.038565 +102 460 -14.704658 +103 460 -12.617186 +106 460 -14.870580 +107 460 -28.401363 +108 460 -14.864124 +109 460 -14.869853 +110 460 -12.626025 +112 460 -28.393138 +113 460 -6.710316 +116 460 -12.555299 +117 460 -26.825364 +118 460 -28.232103 +119 460 -59.017420 +120 460 -6.560504 +122 460 -15.105622 +124 460 -23.583377 +125 460 -6.144375 +131 460 -20.631474 +132 460 -94.155289 +133 460 -28.387189 +134 460 -113.697163 +135 460 -59.764766 +137 460 -29.280798 +138 460 -31.078569 +139 460 -13.917346 +140 460 -125.363753 +142 460 -25.523333 +143 460 -6.455462 +146 460 -113.867119 +148 460 -23.728441 +150 460 -23.603602 +152 460 -26.556988 +153 460 -6.862536 +154 460 -28.218916 +155 460 -115.861980 +156 460 -14.304633 +157 460 -14.437821 +159 460 -30.849608 +160 460 -14.701254 +161 460 -113.710292 +163 460 -22.410503 +164 460 -9.279849 +166 460 -12.841648 +167 460 -30.501458 +168 460 -30.552656 +169 460 -22.774828 +170 460 -12.881515 +172 460 -11.063762 +183 460 -9.942751 +185 460 -14.779471 +186 460 -1.721167 +191 460 -6.386667 +192 460 -4.047331 +193 460 -30.797422 +194 460 -30.904257 +195 460 -16.322124 +197 460 -6.451495 +198 460 -29.810110 +201 460 -12.547656 +202 460 -29.869548 +203 460 -21.975213 +204 460 -41.867037 +205 460 -4.556026 +206 460 -10.692101 +208 460 -4.562002 +211 460 -18.956281 +212 460 -19.022213 +213 460 -14.010260 +214 460 -29.839779 +215 460 -30.855502 +217 460 -21.535762 +218 460 -5.399914 +220 460 -15.780598 +221 460 -15.795159 +222 460 -15.803861 +223 460 -19.868655 +224 460 -20.429595 +227 460 -8.223048 +228 460 -31.681825 +229 460 -63.144609 +230 460 -8.294403 +231 460 -29.789474 +232 460 -20.990759 +235 460 -20.114195 +238 460 -7.584859 +239 460 -4.546437 +240 460 -18.162060 +242 460 -24.747532 +250 460 -28.285474 +251 460 -28.519850 +252 460 -22.247784 +253 460 -6.737413 +254 460 -14.723361 +255 460 -40.765255 +257 460 -11.027653 +258 460 -14.626479 +259 460 -14.622006 +261 460 -14.917712 +262 460 -4.429956 +263 460 -6.878698 +265 460 -30.852557 +266 460 -9.223135 +267 460 -40.658584 +269 460 -24.109787 +270 460 -10.619985 +271 460 -15.282600 +272 460 -15.275931 +274 460 -91.355649 +275 460 -30.348597 +277 460 -6.775376 +278 460 -15.778111 +279 460 -30.551856 +281 460 -30.643527 +282 460 -40.026821 +283 460 -10.416139 +284 460 -27.126943 +285 460 -59.202654 +286 460 -20.785870 +287 460 -15.492301 +288 460 -16.888048 +289 460 -28.675632 +290 460 -28.000208 +292 460 -22.011297 +293 460 -15.061926 +294 460 -15.068383 +295 460 -22.469339 +296 460 -14.879728 +297 460 -16.562230 +298 460 -28.483663 +299 460 -6.572154 +304 460 -22.068640 +306 460 -15.196468 +307 460 -6.832005 +308 460 -28.453304 +309 460 -28.452307 +310 460 -24.909524 +311 460 -9.753308 +312 460 -17.954275 +313 460 -10.241165 +314 460 -14.680859 +315 460 -2.021233 +316 460 -8.618487 +317 460 -0.497042 +321 460 -884.979556 +328 460 -3324.816669 +337 460 -22.469339 +347 460 21008.275276 +348 460 28631.445191 +349 460 28653.579408 +350 460 25489.592643 +351 460 6240.351580 +354 460 6184.904789 +355 460 5826.882936 +359 460 3320.472361 +361 460 94242.981988 +362 460 16051.945576 +369 460 6054.910649 +370 460 3960.028907 +375 460 3189.040646 +376 460 42075.238170 +377 460 43055.564480 +378 460 29404.649006 +379 460 31102.019587 +380 460 14415.167868 +381 460 14775.479191 +382 460 6098.431756 +384 460 3613.751221 +386 460 131287.620665 +395 460 2414.306625 +396 460 6375.206638 +397 460 6376.197938 +398 460 6377.321928 +399 460 6378.593418 +400 460 6380.029980 +401 460 6381.652517 +402 460 23770.414753 +403 460 31690.919230 +404 460 34432.270084 +405 460 59540.173252 +406 460 78203.927986 +407 460 42296.587291 +408 460 16884.312652 +409 460 4741.043588 +410 460 3736.648786 +411 460 130877.542143 +428 460 7248.581785 +429 460 12762.335287 +430 460 62561.957185 +431 460 102830.455109 +432 460 149936.882843 +433 460 181716.362847 +434 460 129904.542815 +435 460 44901.729537 +436 460 110755.901906 +447 460 1174.368667 +448 460 2793.843565 +449 460 2793.904218 +450 460 3477.851670 +451 460 5585.417656 +452 460 5585.546564 +453 460 5585.692284 +454 460 16447.791218 +455 460 18143.006242 +456 460 29061.030631 +457 460 62361.041364 +458 460 63119.057532 +459 460 159570.226499 +460 460 13220641.291162 +461 460 17582.684397 +472 460 1507.670712 +475 460 9026.903996 +476 460 12716.136264 +477 460 12718.984187 +478 460 16619.718267 +479 460 19064.355229 +480 460 19069.994643 +481 460 34273.428867 +482 460 17949.795574 +483 460 77119.288815 +484 460 151595.671728 +485 460 373724.909752 +486 460 7363.856918 +3 461 -9.276005 +8 461 -16.063496 +9 461 -9.352637 +16 461 -6.093737 +19 461 -1.281799 +21 461 -9.856108 +22 461 -11.200097 +24 461 -20.551460 +25 461 -8.152579 +32 461 -20.803997 +33 461 -9.226439 +34 461 -9.390506 +37 461 -20.664620 +40 461 -6.124387 +42 461 -15.381330 +43 461 -20.913289 +53 461 -18.522090 +54 461 -18.417792 +55 461 -9.863991 +66 461 -9.769719 +67 461 -9.780387 +77 461 -2.868210 +80 461 -20.959350 +89 461 -21.310155 +91 461 -9.792238 +102 461 -20.715754 +106 461 -21.037778 +108 461 -21.025102 +109 461 -84.146257 +119 461 -83.227584 +120 461 -9.254105 +121 461 -9.635507 +122 461 -7.826996 +125 461 -4.016436 +129 461 -21.575259 +131 461 -2.629810 +135 461 -85.582361 +141 461 -21.058153 +143 461 -20.463267 +152 461 -0.106483 +160 461 -20.702236 +163 461 -0.965153 +164 461 -19.948178 +166 461 -4.356045 +169 461 -3.380689 +178 461 -20.221499 +183 461 -0.445285 +185 461 -8.134936 +187 461 -9.753409 +188 461 -21.328020 +190 461 -20.851443 +191 461 -6.263009 +195 461 -9.135872 +205 461 -2.576765 +208 461 -2.568442 +217 461 -4.469567 +218 461 -4.721022 +223 461 -5.945891 +224 461 -5.447143 +227 461 -8.628683 +230 461 -8.562422 +231 461 -8.980484 +232 461 -8.945715 +234 461 -20.730297 +235 461 -5.728073 +239 461 -2.590146 +250 461 -10.359193 +253 461 -21.573989 +257 461 -6.025260 +258 461 -20.547298 +259 461 -20.537673 +261 461 -84.497151 +262 461 -2.755236 +263 461 -9.839106 +266 461 -20.001064 +271 461 -9.688892 +272 461 -9.683535 +277 461 -22.167296 +280 461 -20.685357 +288 461 -8.621894 +289 461 -10.001786 +290 461 -10.621618 +293 461 -21.405349 +294 461 -21.416730 +295 461 -26.065857 +296 461 -21.055624 +302 461 -9.840116 +306 461 -21.649545 +307 461 -9.756442 +314 461 -20.659363 +315 461 -20.270817 +316 461 -20.573772 +317 461 -9.393602 +318 461 -86.163088 +321 461 -1496.473510 +328 461 -16.614976 +342 461 -26.065857 +359 461 5032.253778 +361 461 116668.463988 +362 461 59462.567758 +384 461 2442.668910 +385 461 2876.928679 +386 461 206025.159299 +387 461 1437.658768 +410 461 5056.048988 +411 461 209477.923053 +412 461 836.575215 +435 461 527.541484 +436 461 216994.316483 +437 461 838.141976 +460 461 17582.684397 +461 461 12329496.375615 +462 461 244.404657 +485 461 72468.371834 +486 461 151349.766831 +487 461 4341.440670 +40 462 -7.670096 +191 462 -2.565649 +196 462 -8.678173 +199 462 -6.953640 +205 462 -18.139283 +207 462 -18.325244 +208 462 -18.092260 +239 462 -17.818981 +254 462 -19.519242 +262 462 -77.942812 +321 462 -195.705379 +362 462 23576.265573 +387 462 27022.811375 +412 462 26603.493802 +437 462 26234.611173 +461 462 244.404657 +462 462 11753449.488444 +463 462 1595.142456 +486 462 346.247716 +487 462 13891.796931 +488 462 11402.787000 +40 463 -12.109049 +199 463 -1.802820 +205 463 -1.543471 +207 463 -1.356151 +208 463 -1.590840 +216 463 -8.935004 +239 463 -1.866140 +321 463 -29.203476 +362 463 3678.440670 +387 463 4184.877669 +412 463 4087.263795 +437 463 3336.792735 +438 463 662.094660 +462 463 1595.142456 +463 463 11372272.642069 +488 463 3847.924568 +464 464 11111111.111111 +465 465 11111111.111111 +466 466 11111111.111111 +467 467 11111111.111111 +468 468 11478892.583568 +51 469 -27.896355 +65 469 -33.409349 +75 469 -130.179284 +93 469 -135.281367 +100 469 -14.016751 +132 469 -14.086615 +136 469 -28.157955 +141 469 -14.677975 +142 469 -29.761171 +143 469 -4.978916 +144 469 -129.000379 +163 469 -14.122150 +164 469 -32.424422 +166 469 -14.401511 +172 469 -13.957224 +177 469 -32.605634 +179 469 -10.333722 +183 469 -31.768573 +184 469 -31.667236 +185 469 -32.243624 +186 469 -27.708322 +189 469 -31.798491 +190 469 -14.931073 +193 469 -31.686931 +194 469 -34.229349 +197 469 -2.220876 +202 469 -25.616198 +234 469 -26.789011 +242 469 -31.422513 +244 469 -34.262652 +246 469 -31.732979 +247 469 -5.740521 +250 469 -32.389572 +251 469 -31.454989 +252 469 -2.311271 +253 469 -32.547179 +257 469 -32.449738 +258 469 -15.125385 +263 469 -14.387150 +265 469 -31.672327 +266 469 -130.284174 +267 469 -14.002131 +271 469 -130.388016 +273 469 -14.148300 +275 469 -19.036504 +279 469 -32.662933 +280 469 -33.750588 +282 469 -14.061370 +283 469 -34.100517 +284 469 -14.044361 +285 469 -33.381150 +291 469 -33.616377 +292 469 -1.135003 +293 469 -14.648554 +294 469 -32.933204 +296 469 -14.680273 +299 469 -33.679296 +301 469 -128.704845 +302 469 -14.548846 +306 469 -14.573710 +307 469 -32.331285 +315 469 -14.454949 +316 469 -14.467416 +317 469 -14.472574 +318 469 -14.462950 +322 469 -31.454989 +325 469 -2082.561077 +369 469 1113.529831 +394 469 6737.736846 +419 469 6719.960476 +444 469 348497.634587 +469 469 11972099.781028 +470 469 25237.143590 +471 469 36.307470 +494 469 305755.854356 +495 469 156212.049303 +496 469 10299.905694 +497 469 43.036328 +51 470 -7.601628 +97 470 -36.172943 +135 470 -42.605447 +136 470 -7.297292 +137 470 -17.041858 +138 470 -4.737842 +139 470 -15.624725 +142 470 -5.445293 +143 470 -38.319533 +175 470 -12.783648 +178 470 -28.205288 +179 470 -30.170131 +180 470 -29.651228 +182 470 -13.095041 +186 470 -7.820767 +196 470 -13.201302 +197 470 -17.018112 +199 470 -4.861174 +202 470 -10.282129 +206 470 -39.977721 +234 470 -142.483421 +239 470 -10.871922 +241 470 -39.053574 +247 470 -37.113396 +248 470 -0.561949 +251 470 -131.175656 +252 470 -177.082228 +264 470 -18.471391 +275 470 -18.360266 +277 470 -0.814079 +279 470 -2.145051 +292 470 -176.391714 +301 470 -10.777381 +304 470 -119.903098 +305 470 -29.819089 +310 470 -20.053252 +311 470 -31.182557 +325 470 -1216.997472 +327 470 -131.175656 +369 470 4940.747373 +394 470 29802.584301 +419 470 29560.262889 +444 470 276656.123766 +445 470 51060.842438 +469 470 25237.143590 +470 470 12003880.344911 +471 470 85445.957780 +472 470 10227.281315 +473 470 127.920211 +495 470 68236.437420 +496 470 216435.180172 +497 470 103697.063261 +498 470 24811.222983 +499 470 4675.832378 +500 470 182.432796 +97 471 -14.555938 +101 471 -26.033028 +116 471 -22.763848 +135 471 -4.628685 +137 471 -37.204349 +138 471 -35.700555 +139 471 -36.987921 +175 471 -11.966067 +178 471 -27.895137 +180 471 -25.388758 +182 471 -11.427321 +192 471 -21.662342 +196 471 -36.646884 +199 471 -16.159532 +206 471 -8.595491 +239 471 -36.351001 +241 471 -10.019279 +248 471 -15.734017 +251 471 -37.873822 +252 471 -5.340000 +262 471 -9.628763 +264 471 -37.436227 +268 471 -30.776261 +269 471 -13.679620 +270 471 -13.676840 +274 471 -30.779911 +277 471 -35.365904 +292 471 -8.054180 +304 471 -99.325267 +305 471 -25.100204 +310 471 -37.709507 +311 471 -22.775225 +322 471 -111.676479 +325 471 -657.691581 +329 471 -21.746836 +341 471 -16.126986 +347 471 15989.771164 +369 471 1705.430662 +371 471 441.953656 +372 471 17810.947537 +394 471 10130.352022 +395 471 103.329763 +396 471 5463.413960 +397 471 12841.181633 +419 471 1155.942973 +420 471 8897.231109 +421 471 17546.562785 +422 471 816.354450 +444 471 132679.302478 +445 471 87794.081973 +446 471 28352.303235 +469 471 36.307470 +470 471 85445.957780 +471 471 12029408.303305 +472 471 60953.455478 +473 471 16342.228901 +474 471 2763.378761 +496 471 59615.154464 +497 471 105609.618321 +498 471 74305.029126 +499 471 41527.965924 +500 471 18741.137529 +101 472 -34.809230 +116 472 -509.420199 +137 472 -11.186745 +138 472 -35.796367 +139 472 -14.130518 +188 472 -12.987394 +192 472 -34.597923 +196 472 -19.188510 +199 472 -10.638581 +239 472 -24.074964 +248 472 -15.771557 +251 472 -33.079098 +262 472 -34.157086 +264 472 -8.228815 +268 472 -30.014863 +269 472 -13.334917 +270 472 -13.362921 +274 472 -43.588355 +277 472 -35.449035 +308 472 -120.124734 +310 472 -4.970407 +319 472 -2.921319 +320 472 -37.099611 +321 472 -3.046259 +322 472 -7.435874 +324 472 -181.192651 +325 472 -416.111867 +327 472 -70.032586 +328 472 -7.894966 +329 472 -53.483548 +332 472 -38.640342 +333 472 -5.179271 +334 472 -30.268471 +335 472 -126.871093 +336 472 -30.186014 +339 472 -32.726211 +342 472 -15.822139 +347 472 18368.214919 +360 472 513.067955 +361 472 709.380548 +362 472 20.654656 +369 472 1696.117839 +372 472 20589.072845 +376 472 250.099829 +377 472 436.939267 +382 472 114.218105 +383 472 702.147909 +384 472 704.184395 +385 472 193.500105 +394 472 8137.349444 +395 472 2004.907383 +397 472 20530.326826 +400 472 875.276106 +401 472 1086.134198 +404 472 343.604811 +405 472 1368.280655 +406 472 1249.560002 +407 472 586.177810 +420 472 7358.874324 +421 472 2537.891664 +422 472 20479.584768 +423 472 313.744437 +424 472 1318.670758 +425 472 451.558671 +426 472 1016.024922 +427 472 1362.021526 +428 472 1363.844120 +429 472 1022.311917 +444 472 77651.084720 +445 472 89132.290565 +446 472 46708.735558 +447 472 30004.174137 +448 472 4111.270400 +449 472 3114.594626 +450 472 3115.890333 +451 472 2101.331995 +452 472 1756.996650 +453 472 1757.058701 +454 472 1757.128968 +455 472 1757.208731 +456 472 1757.299546 +457 472 1757.403320 +458 472 1757.522408 +459 472 1757.659746 +460 472 1507.670712 +470 472 10227.281315 +471 472 60953.455478 +472 472 12101410.986836 +473 472 75746.071484 +474 472 46372.009876 +475 472 12301.014910 +496 472 1556.979242 +497 472 77722.345495 +498 472 108344.962367 +499 472 56377.430040 +500 472 37658.173661 +90 473 -4.184959 +101 473 -30.827601 +116 473 -63.363767 +138 473 -1.233446 +188 473 -15.043433 +192 473 -34.658806 +248 473 -3.963092 +251 473 -43.483248 +262 473 -34.201285 +268 473 -91.722725 +269 473 -65.607098 +270 473 -14.705420 +274 473 -32.810327 +277 473 -9.911027 +308 473 -135.454715 +323 473 -27.123078 +324 473 -46.332007 +325 473 -269.478363 +329 473 -61.813303 +335 473 -42.422751 +336 473 -73.486438 +338 473 -14.192381 +339 473 -34.130715 +342 473 -12.191913 +347 473 37280.344493 +369 473 2531.593559 +372 473 43703.616293 +373 473 1.245072 +394 473 9033.270611 +395 473 6054.794759 +397 473 25935.809068 +398 473 17374.923299 +420 473 6204.780197 +421 473 8423.166540 +422 473 15078.478762 +423 473 27853.748667 +444 473 49116.356990 +445 473 61976.504470 +446 473 49764.665630 +447 473 20170.507573 +448 473 38314.926589 +470 473 127.920211 +471 473 16342.228901 +472 473 75746.071484 +473 473 11928538.378628 +474 473 63919.746340 +475 473 14204.219624 +498 473 29661.143270 +499 473 54527.259457 +500 473 35007.293452 +58 474 -14.374296 +90 474 -33.268244 +116 474 -34.178023 +188 474 -15.059422 +192 474 -5.235777 +198 474 -11.913997 +214 474 -6.857175 +251 474 -18.123949 +262 474 -30.675241 +268 474 -152.763400 +269 474 -71.186204 +270 474 -50.879146 +274 474 -82.820765 +308 474 -135.601142 +320 474 -6.227886 +322 474 -14.374296 +325 474 -231.753823 +326 474 -90.850528 +329 474 -137.225425 +333 474 -6.857175 +335 474 -15.423345 +337 474 -10.551945 +338 474 -7.572003 +339 474 -34.178023 +341 474 -107.922332 +347 474 69783.788180 +369 474 1267.386059 +372 474 67990.779487 +373 474 11861.088544 +376 474 800.196668 +377 474 543.318542 +394 474 3190.393251 +395 474 4001.838666 +396 474 319.271619 +397 474 9353.912805 +398 474 69423.681129 +400 474 1764.368891 +401 474 2325.636544 +402 474 412.826333 +420 474 710.793873 +421 474 4352.684283 +422 474 2137.823396 +423 474 70499.216264 +424 474 7229.440112 +425 474 3041.203110 +426 474 1545.691446 +444 474 41794.754729 +445 474 52833.449249 +446 474 50171.483451 +447 474 16727.837555 +448 474 55277.976751 +449 474 35622.036624 +450 474 4205.491333 +451 474 188.243414 +471 474 2763.378761 +472 474 46372.009876 +473 474 63919.746340 +474 474 11974799.662225 +475 474 25396.416877 +476 474 2677.640184 +477 474 2678.965505 +478 474 2680.465910 +479 474 2221.186401 +499 474 63243.699539 +500 474 36337.468045 +58 475 -8.780397 +82 475 -14.197990 +90 475 -330.188720 +116 475 -7.116825 +126 475 -32.198627 +133 475 -2.408641 +188 475 -11.764092 +194 475 -32.392681 +198 475 -14.769826 +201 475 -238.116776 +209 475 -2.837448 +214 475 -28.118555 +251 475 -14.560368 +268 475 -60.912201 +269 475 -61.579545 +270 475 -11.602055 +274 475 -60.140597 +298 475 -113.219681 +308 475 -190.636210 +309 475 -159.887679 +319 475 -70.683139 +320 475 -144.869867 +321 475 -68.505294 +322 475 -148.584846 +323 475 -33.814565 +324 475 -37.612808 +325 475 -84.309998 +326 475 -39.325856 +327 475 -29.477206 +328 475 -46.931798 +329 475 -143.287158 +330 475 -12.890637 +332 475 -85.973280 +333 475 -106.907854 +335 475 -41.562377 +336 475 -56.479740 +337 475 -51.190082 +339 475 -52.072917 +340 475 -42.332726 +341 475 -40.445867 +342 475 -58.170901 +347 475 41944.062672 +353 475 338.253261 +360 475 3820.519028 +361 475 16550.148583 +362 475 482.842245 +369 475 1097.784021 +372 475 14167.584351 +373 475 33742.891933 +376 475 449.937154 +377 475 8117.067982 +378 475 567.072653 +383 475 822.560731 +384 475 14053.716102 +385 475 12607.614855 +394 475 2379.241576 +395 475 3672.166262 +396 475 440.555007 +398 475 38622.039419 +399 475 8277.586511 +401 475 14620.395814 +402 475 13217.128369 +405 475 7014.879538 +406 475 15712.635182 +407 475 12310.522285 +408 475 15416.364415 +409 475 2272.000639 +421 475 3245.970612 +422 475 2949.929608 +423 475 3947.703787 +424 475 41894.159288 +425 475 58.783474 +426 475 45409.433422 +427 475 4174.634859 +428 475 3408.960998 +429 475 20954.926432 +430 475 24100.803162 +431 475 14609.419357 +432 475 3854.249933 +444 475 15131.897326 +445 475 19126.378864 +446 475 19136.994062 +447 475 9175.665003 +448 475 10322.723209 +449 475 29811.984176 +450 475 40306.487406 +451 475 50201.020888 +452 475 23947.377499 +453 475 33897.579225 +454 475 19152.283052 +455 475 11708.342251 +456 475 948.188092 +457 475 10255.707609 +458 475 10512.297906 +459 475 10518.213083 +460 475 9026.903996 +472 475 12301.014910 +473 475 14204.219624 +474 475 25396.416877 +475 475 12343928.899177 +476 475 74722.592692 +477 475 33254.567684 +478 475 19258.412693 +479 475 15815.026142 +480 475 10498.820006 +481 475 10502.717494 +482 475 251.468111 +499 475 14662.254366 +500 475 149189.337566 +2 476 -29.424106 +4 476 -28.994403 +5 476 -13.196266 +6 476 -0.876754 +10 476 -5.943525 +12 476 -13.004119 +17 476 -13.193657 +19 476 -28.027701 +23 476 -12.585534 +38 476 -12.699513 +45 476 -3.902438 +52 476 -28.395900 +58 476 -29.199747 +60 476 -12.784088 +68 476 -29.253428 +69 476 -12.861824 +71 476 -13.378176 +77 476 -2.777152 +79 476 -28.411591 +84 476 -12.768330 +90 476 -117.167831 +94 476 -12.453772 +124 476 -12.522521 +128 476 -15.058625 +133 476 -14.704251 +136 476 -12.658796 +148 476 -28.256432 +156 476 -33.856212 +157 476 -33.953290 +159 476 -12.524242 +162 476 -33.919102 +163 476 -28.038671 +169 476 -3.355050 +186 476 -12.581415 +189 476 -28.043283 +193 476 -12.511890 +198 476 -14.776294 +201 476 -228.943175 +203 476 -14.355894 +209 476 -12.139043 +211 476 -2.770129 +212 476 -25.579510 +215 476 -12.521536 +238 476 -28.943731 +242 476 -12.848372 +251 476 -14.065681 +268 476 -20.900137 +269 476 -21.043155 +270 476 -19.766796 +274 476 -21.216713 +298 476 -48.761741 +308 476 -136.476802 +309 476 -103.084195 +319 476 -73.930756 +320 476 -23.790392 +321 476 -77.717536 +322 476 -196.523653 +324 476 -88.120256 +325 476 -29.480545 +326 476 -19.046689 +328 476 -66.112469 +329 476 -48.217277 +330 476 -17.301952 +332 476 -50.471033 +333 476 -514.959024 +337 476 -31.886100 +338 476 -54.002645 +339 476 -73.503080 +340 476 -66.396207 +341 476 -17.213149 +342 476 -32.803774 +347 476 19283.328141 +348 476 957.290519 +353 476 16881.981174 +354 476 5252.070456 +355 476 47.260267 +360 476 3863.246938 +361 476 18827.646096 +362 476 549.371176 +369 476 1371.636032 +372 476 1173.718955 +373 476 21570.008508 +374 476 504.275205 +376 476 1511.463817 +377 476 35520.966374 +378 476 29739.420620 +379 476 2844.916855 +383 476 372.642465 +384 476 15357.085431 +385 476 14820.682385 +394 476 1813.531780 +395 476 3358.757503 +396 476 2860.239237 +398 476 4193.925718 +399 476 18271.293507 +400 476 85.102000 +401 476 5964.291407 +402 476 113545.783582 +403 476 21255.214993 +404 476 1021.154413 +405 476 6372.510043 +406 476 15656.904164 +407 476 12934.836702 +408 476 18088.620140 +409 476 3206.286778 +421 476 505.519896 +422 476 3373.776876 +423 476 3382.933018 +424 476 8341.061684 +425 476 13764.935275 +426 476 43524.672245 +427 476 102765.298120 +428 476 6677.755789 +429 476 19778.076790 +430 476 26946.284870 +431 476 17623.350816 +432 476 5439.224999 +444 476 5222.796175 +445 476 6599.547197 +446 476 6600.738966 +447 476 6602.095437 +448 476 6603.633817 +449 476 7495.539166 +450 476 32325.901164 +451 476 125889.940470 +452 476 67133.404939 +453 476 43066.893520 +454 476 27685.556627 +455 476 18013.979604 +456 476 1486.307844 +457 476 14445.681808 +458 476 14808.599462 +459 476 14816.932503 +460 476 12716.136264 +474 476 2677.640184 +475 476 74722.592692 +476 476 12702946.417069 +477 476 73302.034101 +478 476 27694.525289 +479 476 21233.588887 +480 476 14789.612394 +481 476 14795.103002 +482 476 355.701744 +499 476 142.691600 +500 476 42946.958876 +1 477 -12.245813 +3 477 -27.230770 +6 477 -18.374785 +7 477 -0.479330 +8 477 -27.514143 +10 477 -6.433955 +14 477 -27.495631 +15 477 -27.494088 +21 477 -12.209219 +22 477 -27.634705 +26 477 -12.330014 +31 477 -3.960713 +33 477 -12.102409 +36 477 -3.944144 +37 477 -12.102114 +41 477 -12.102331 +45 477 -48.199866 +46 477 -2.746153 +53 477 -27.496196 +54 477 -27.500383 +57 477 -27.492546 +58 477 -131.320148 +65 477 -27.231371 +72 477 -12.200451 +77 477 -9.578427 +78 477 -12.173700 +85 477 -11.380801 +90 477 -33.178349 +93 477 -12.106598 +119 477 -27.231826 +122 477 -27.753277 +125 477 -27.662535 +128 477 -13.186892 +133 477 -17.033846 +137 477 -9.423991 +138 477 -12.110069 +145 477 -42.150461 +156 477 -58.658612 +157 477 -42.681471 +160 477 -12.102170 +162 477 -29.770788 +166 477 -27.622962 +169 477 -9.004318 +187 477 -12.219238 +195 477 -27.478953 +198 477 -14.783608 +200 477 -12.108498 +201 477 -52.887351 +203 477 -29.866197 +209 477 -13.088161 +211 477 -46.570327 +212 477 -37.639442 +218 477 -27.615023 +220 477 -27.570594 +221 477 -27.580976 +222 477 -27.586362 +224 477 -12.260504 +225 477 -12.253338 +231 477 -12.280167 +233 477 -12.234532 +235 477 -110.364338 +241 477 -27.514452 +251 477 -15.884693 +268 477 -18.459623 +269 477 -15.659078 +270 477 -13.919152 +274 477 -7.015387 +297 477 -4.369451 +298 477 -12.626959 +300 477 -4.880475 +308 477 -95.513847 +309 477 -60.574527 +319 477 -20.686548 +320 477 -25.648447 +321 477 -50.189813 +322 477 -108.203545 +324 477 -17.383428 +325 477 -29.491743 +326 477 -115.447107 +327 477 -115.199437 +328 477 -66.127276 +329 477 -182.029609 +333 477 -869.189705 +337 477 -6.970607 +338 477 -37.669812 +339 477 -55.265050 +340 477 -63.480495 +341 477 -2.851554 +342 477 -9.623444 +347 477 12769.184731 +348 477 1181.828653 +353 477 20751.970622 +354 477 12484.558458 +355 477 1052.999924 +360 477 2292.565918 +361 477 12181.152542 +362 477 355.469411 +369 477 1549.019715 +372 477 191.822403 +373 477 15124.143133 +374 477 939.103413 +376 477 7301.258007 +377 477 58995.312468 +378 477 40610.076450 +379 477 17655.548106 +380 477 838.263588 +381 477 19.502244 +384 477 9665.573197 +385 477 9793.500634 +394 477 2048.062616 +395 477 3793.121110 +396 477 3230.133113 +398 477 327.119413 +399 477 15025.847285 +400 477 357.794808 +401 477 26778.929773 +402 477 161590.240814 +403 477 56958.062992 +404 477 18731.593046 +405 477 1306.803415 +406 477 4297.341540 +407 477 7910.242071 +408 477 11938.826545 +409 477 2340.761884 +421 477 570.895097 +422 477 3810.082829 +423 477 3820.423069 +424 477 1210.620020 +425 477 14239.852625 +426 477 23948.389912 +427 477 171424.617070 +428 477 70396.856945 +429 477 6221.327697 +430 477 14409.292359 +431 477 12068.892920 +432 477 3970.948970 +444 477 5224.781193 +445 477 6602.055507 +446 477 6603.247771 +447 477 6604.604805 +448 477 6606.143823 +449 477 7480.438423 +450 477 12433.678626 +451 477 16680.985063 +452 477 241957.469077 +453 477 54689.425903 +454 477 27312.987960 +455 477 16600.360524 +456 477 1421.469331 +457 477 14448.917049 +458 477 14811.916015 +459 477 14820.250923 +460 477 12718.984187 +474 477 2678.965505 +475 477 33254.567684 +476 477 73302.034101 +477 477 12895160.302257 +478 477 42521.982984 +479 477 21240.727709 +480 477 14792.924695 +481 477 14798.416533 +482 477 355.781440 +500 477 444.602886 +6 478 -10.037946 +7 478 -130.760401 +31 478 -23.427575 +36 478 -11.978916 +45 478 -13.459352 +46 478 -27.426484 +56 478 -28.820964 +58 478 -50.669460 +69 478 -4.908989 +70 478 -13.346608 +73 478 -10.957009 +83 478 -50.259639 +85 478 -67.864269 +92 478 -26.464970 +95 478 -42.221314 +101 478 -25.779904 +103 478 -12.746831 +104 478 -6.225577 +107 478 -13.594778 +110 478 -6.758754 +112 478 -44.456501 +123 478 -14.637544 +126 478 -12.731636 +133 478 -433.373629 +134 478 -14.482645 +137 478 -25.338804 +143 478 -12.590500 +145 478 -38.430513 +146 478 -12.656017 +154 478 -45.317134 +155 478 -5.187860 +156 478 -53.212283 +157 478 -53.140149 +162 478 -53.152471 +167 478 -11.473934 +168 478 -3.871003 +171 478 -38.133598 +173 478 -12.661379 +174 478 -8.508257 +175 478 -11.095840 +176 478 -14.548901 +182 478 -4.133123 +194 478 -11.721353 +197 478 -12.596288 +198 478 -14.791888 +201 478 -37.898732 +202 478 -1.421954 +203 478 -38.538210 +211 478 -29.290608 +212 478 -37.221232 +213 478 -28.002119 +214 478 -19.750981 +228 478 -6.927093 +268 478 -51.352768 +269 478 -61.886120 +274 478 -44.292513 +279 478 -8.144640 +297 478 -157.084700 +298 478 -16.176317 +300 478 -16.415025 +308 478 -66.486793 +309 478 -33.071646 +319 478 -188.266183 +320 478 -91.692890 +321 478 -12.413093 +322 478 -232.559483 +323 478 -156.873800 +324 478 -35.072555 +325 478 -20.455665 +327 478 -116.095174 +328 478 -86.454423 +329 478 -378.317597 +330 478 -11.986767 +331 478 -114.314349 +332 478 -20.279488 +333 478 -76.616482 +334 478 -118.497482 +336 478 -138.117946 +337 478 -139.647438 +338 478 -50.030818 +339 478 -139.700383 +340 478 -33.414415 +341 478 -17.911424 +342 478 -15.196588 +347 478 31403.941174 +348 478 18116.242567 +354 478 32373.742738 +355 478 708.306629 +361 478 2807.342782 +362 478 93.311451 +373 478 23949.553868 +374 478 31654.264353 +375 478 248.116995 +376 478 3458.282162 +377 478 5563.558283 +378 478 2784.208066 +379 478 72961.815163 +380 478 16270.482300 +381 478 5895.150529 +384 478 173.028543 +385 478 3143.845359 +386 478 379.463369 +399 478 10753.152803 +400 478 38947.578528 +401 478 12887.901561 +402 478 18641.300723 +403 478 20570.532411 +404 478 68791.017156 +405 478 33886.565914 +406 478 34609.416927 +408 478 1147.217089 +409 478 2935.356051 +425 478 3607.752179 +426 478 38960.522914 +427 478 34042.825746 +428 478 45596.129148 +429 478 84463.972295 +430 478 78041.412068 +431 478 12845.615831 +432 478 2587.235450 +433 478 1931.531826 +444 478 3627.062951 +445 478 4583.259748 +446 478 4584.198495 +447 478 4585.267043 +448 478 4586.478973 +449 478 1907.384486 +450 478 3159.481826 +451 478 8601.319197 +452 478 53103.932404 +453 478 145811.926135 +454 478 138730.210461 +455 478 32947.591719 +456 478 7315.145210 +457 478 19457.792811 +458 478 19355.994356 +459 478 19366.175364 +460 478 16619.718267 +474 478 2680.465910 +475 478 19258.412693 +476 478 27694.525289 +477 478 42521.982984 +478 478 13034434.353754 +479 478 145013.734037 +480 478 46413.385713 +481 478 41363.862325 +482 478 25919.128142 +483 478 23118.006431 +5 479 -16.166555 +7 479 -36.433050 +17 479 -4.542362 +30 479 -12.645940 +45 479 -52.300952 +46 479 -33.357521 +48 479 -21.940921 +56 479 -71.170527 +58 479 -40.611079 +69 479 -12.607878 +70 479 -26.494032 +73 479 -28.439723 +83 479 -102.283702 +85 479 -79.406139 +92 479 -36.382168 +95 479 -92.622103 +96 479 -25.281350 +101 479 -59.659007 +103 479 -42.258308 +104 479 -32.558510 +107 479 -37.164455 +110 479 -45.375155 +112 479 -128.626094 +118 479 -247.097298 +123 479 -18.743788 +126 479 -26.993859 +133 479 -208.424191 +134 479 -18.906985 +137 479 -35.731263 +145 479 -37.657709 +146 479 -31.790216 +154 479 -188.984705 +155 479 -116.560714 +156 479 -63.653194 +157 479 -26.041091 +158 479 -15.853835 +162 479 -37.590904 +167 479 -95.396713 +168 479 -75.561890 +171 479 -56.893662 +173 479 -97.021443 +174 479 -24.969552 +175 479 -95.120215 +176 479 -52.096958 +178 479 -13.624835 +179 479 -16.362342 +180 479 -18.033723 +182 479 -75.799325 +192 479 -31.059767 +194 479 -39.430807 +198 479 -12.257399 +201 479 -33.133533 +202 479 -65.534425 +203 479 -155.758802 +209 479 -26.261093 +211 479 -37.259814 +212 479 -130.087387 +214 479 -27.365546 +228 479 -42.532732 +237 479 -14.683324 +256 479 -15.874843 +268 479 -34.853875 +269 479 -69.651792 +274 479 -56.063319 +279 479 -30.741836 +281 479 -24.550334 +283 479 -6.181867 +295 479 -3.044941 +297 479 -45.877215 +298 479 -288.466534 +300 479 -13.074732 +308 479 -49.458756 +309 479 -33.081116 +319 479 -448.706576 +320 479 -171.916469 +321 479 -45.210493 +322 479 -102.636588 +323 479 -113.782966 +324 479 -70.612651 +325 479 -12.257399 +326 479 -65.317964 +327 479 -269.557201 +328 479 -99.193671 +329 479 -402.992712 +330 479 -11.550956 +331 479 -165.195044 +332 479 -114.742795 +333 479 -44.684602 +335 479 -289.136344 +336 479 -154.385997 +337 479 -215.789430 +338 479 -73.632099 +339 479 -322.699625 +340 479 -468.448348 +341 479 -256.818274 +342 479 -100.255529 +347 479 30969.608703 +348 479 22475.224723 +353 479 2772.600959 +354 479 27269.498466 +358 479 464.604407 +359 479 84.608717 +361 479 10098.336742 +362 479 341.369659 +373 479 19352.646034 +374 479 38902.801531 +375 479 1884.121152 +376 479 3123.488180 +377 479 3805.491708 +378 479 16144.443309 +379 479 60243.979466 +380 479 3710.920346 +381 479 1702.317610 +382 479 71.086336 +383 479 565.088327 +384 479 498.065089 +385 479 11230.816732 +386 479 1557.058356 +399 479 3210.518630 +400 479 40398.376356 +401 479 19543.086407 +402 479 23636.093002 +403 479 15881.403287 +404 479 96209.726716 +405 479 13739.533301 +406 479 81143.735385 +407 479 665.474446 +408 479 3529.978963 +409 479 10861.067125 +410 479 262.177256 +425 479 160.341161 +426 479 29414.575986 +427 479 91713.415045 +428 479 44836.474215 +429 479 118796.220217 +430 479 166603.272812 +431 479 48752.206472 +432 479 8728.721320 +433 479 7717.408174 +444 479 2175.734794 +445 479 2749.385835 +446 479 2750.031952 +447 479 2750.767451 +448 479 2751.601699 +449 479 531.359407 +450 479 1816.147211 +451 479 7428.009473 +452 479 26922.160519 +453 479 127727.591561 +454 479 381279.723627 +455 479 198083.646369 +456 479 34230.676475 +457 479 24512.717692 +458 479 22203.822288 +459 479 22215.160566 +460 479 19064.355229 +474 479 2221.186401 +475 479 15815.026142 +476 479 21233.588887 +477 479 21240.727709 +478 479 145013.734037 +479 479 13738385.830970 +480 479 209753.858743 +481 479 53527.181439 +482 479 37283.148377 +483 479 33394.019920 +2 480 -13.114869 +4 480 -12.293683 +7 480 -11.407530 +17 480 -26.701773 +18 480 -18.448030 +19 480 -5.102938 +27 480 -135.118354 +30 480 -2.661649 +36 480 -36.939436 +38 480 -29.642978 +40 480 -98.364707 +41 480 -15.536908 +44 480 -56.184500 +45 480 -11.535572 +46 480 -93.817949 +47 480 -14.136051 +48 480 -31.275797 +49 480 -10.070856 +50 480 -29.831163 +51 480 -43.460308 +52 480 -29.821048 +56 480 -99.558918 +58 480 -46.824378 +59 480 -20.211682 +60 480 -26.248698 +63 480 -2.088591 +69 480 -11.881770 +70 480 -6.249131 +83 480 -16.631856 +84 480 -25.669579 +85 480 -154.406313 +87 480 -11.604996 +92 480 -101.779294 +94 480 -31.965161 +95 480 -183.066746 +96 480 -198.998426 +98 480 -122.653711 +99 480 -40.037364 +100 480 -108.004609 +101 480 -37.171710 +103 480 -85.523979 +104 480 -55.704473 +105 480 -16.086648 +107 480 -123.037922 +110 480 -119.855031 +112 480 -68.005167 +117 480 -11.762163 +118 480 -79.305219 +123 480 -133.087214 +124 480 -38.108061 +125 480 -10.283870 +127 480 -29.589968 +128 480 -104.629081 +130 480 -0.683851 +131 480 -0.577539 +132 480 -4.686963 +133 480 -165.127459 +134 480 -45.447923 +136 480 -29.993776 +137 480 -17.947256 +140 480 -2.704457 +145 480 -61.681714 +146 480 -47.958567 +148 480 -14.304694 +150 480 -11.666624 +152 480 -7.281580 +154 480 -49.732630 +155 480 -135.704366 +156 480 -51.936790 +158 480 -88.488242 +159 480 -11.629367 +161 480 -132.349274 +162 480 -52.682208 +163 480 -32.827540 +164 480 -20.269629 +166 480 -22.745956 +167 480 -123.199989 +168 480 -122.854039 +169 480 -24.205738 +171 480 -187.077873 +172 480 -12.318488 +173 480 -165.574377 +174 480 -121.295930 +175 480 -123.251741 +176 480 -62.590279 +177 480 -8.443088 +179 480 -15.978150 +180 480 -42.209231 +181 480 -59.140008 +182 480 -122.401003 +183 480 -32.884864 +184 480 -26.550552 +185 480 -23.480583 +186 480 -147.882189 +189 480 -33.899766 +193 480 -26.516227 +194 480 -30.147194 +196 480 -15.370233 +201 480 -33.147403 +202 480 -129.394190 +203 480 -85.307117 +204 480 -138.281843 +206 480 -58.921014 +211 480 -30.103702 +212 480 -133.291827 +213 480 -28.799069 +214 480 -12.974802 +215 480 -38.117645 +216 480 -9.855923 +217 480 -10.335175 +222 480 -9.839629 +228 480 -30.555349 +229 480 -22.030419 +230 480 -20.239871 +231 480 -10.185618 +235 480 -9.799697 +237 480 -31.622710 +238 480 -27.589081 +239 480 -7.814269 +240 480 -108.120171 +241 480 -61.991282 +242 480 -39.822274 +244 480 -44.080175 +245 480 -13.556306 +247 480 -29.916425 +250 480 -10.066405 +252 480 -41.008288 +253 480 -14.072997 +256 480 -17.020968 +257 480 -9.670315 +263 480 -8.643612 +264 480 -56.792581 +265 480 -117.806802 +267 480 -47.454010 +269 480 -0.948834 +271 480 -16.103067 +273 480 -11.076118 +274 480 -4.777030 +275 480 -40.740009 +278 480 -21.872635 +281 480 -9.290604 +282 480 -12.959816 +283 480 -8.200898 +284 480 -43.397822 +292 480 -12.511294 +295 480 -34.182279 +297 480 -68.033042 +298 480 -65.529022 +300 480 -39.313470 +302 480 -8.128347 +304 480 -34.202297 +305 480 -33.946988 +308 480 -33.092691 +309 480 -33.091874 +310 480 -222.768531 +311 480 -49.613880 +312 480 -15.940440 +313 480 -24.329772 +315 480 -19.896840 +316 480 -19.735930 +317 480 -19.554272 +319 480 -1204.092240 +320 480 -626.098008 +321 480 -199.010695 +322 480 -128.180106 +323 480 -165.581045 +324 480 -120.901471 +326 480 -330.802842 +327 480 -103.379529 +328 480 -99.223008 +329 480 -109.788941 +330 480 -11.266506 +331 480 -165.236419 +332 480 -408.097099 +333 480 -299.107568 +335 480 -157.584660 +336 480 -220.080473 +337 480 -64.379932 +338 480 -131.759800 +339 480 -158.888532 +340 480 -2430.188271 +341 480 -519.077160 +342 480 -129.940234 +347 480 1055.251111 +348 480 1092.259172 +353 480 3885.804227 +354 480 37602.611544 +358 480 5215.613465 +359 480 949.810975 +361 480 39138.419670 +362 480 1582.374732 +373 480 380.309879 +374 480 1466.940018 +375 480 352.360828 +376 480 4282.036232 +377 480 31475.667758 +378 480 4373.333785 +379 480 82126.019485 +380 480 10179.131148 +381 480 1442.458452 +382 480 798.009757 +383 480 6343.638240 +384 480 250.170332 +385 480 36182.618853 +386 480 14710.358460 +399 480 14.712667 +400 480 1139.753397 +401 480 6116.843077 +402 480 40028.851705 +403 480 56166.844894 +404 480 98865.107712 +405 480 28746.228695 +406 480 173810.616057 +407 480 7470.565124 +408 480 2046.518581 +409 480 36929.821158 +410 480 16623.457065 +426 480 579.957882 +427 480 17028.725378 +428 480 50536.630822 +429 480 151321.869059 +430 480 213954.120235 +431 480 248321.956052 +432 480 8306.687391 +433 480 40299.281786 +434 480 14779.943762 +450 480 1816.907496 +451 480 7417.163137 +452 480 7557.706948 +453 480 18031.686488 +454 480 151104.956470 +455 480 667957.996721 +456 480 302059.127857 +457 480 66158.643913 +458 480 31127.051638 +459 480 22221.731942 +460 480 19069.994643 +475 480 10498.820006 +476 480 14789.612394 +477 480 14792.924695 +478 480 46413.385713 +479 480 209753.858743 +480 480 15646792.530750 +481 480 208845.979525 +482 480 38161.606659 +483 480 33402.388860 +1 481 -25.487253 +3 481 -10.853813 +5 481 -9.004540 +6 481 -9.366111 +8 481 -25.422662 +13 481 -25.316823 +14 481 -25.354980 +15 481 -25.353454 +16 481 -25.919695 +18 481 -18.453074 +19 481 -21.111450 +21 481 -25.255620 +22 481 -25.649140 +25 481 -25.330318 +26 481 -11.480109 +27 481 -6.336597 +28 481 -25.390810 +32 481 -10.828309 +34 481 -10.773038 +35 481 -67.791057 +36 481 -31.189397 +37 481 -24.326953 +39 481 -50.680972 +40 481 -46.666176 +41 481 -11.135896 +42 481 -25.454783 +43 481 -10.864019 +44 481 -50.213511 +45 481 -100.756870 +46 481 -8.368114 +47 481 -1.663387 +48 481 -55.921830 +49 481 -16.346546 +53 481 -25.358003 +54 481 -101.458367 +55 481 -14.444965 +56 481 -78.678543 +57 481 -25.351925 +58 481 -8.241846 +59 481 -6.710637 +60 481 -1.045727 +63 481 -24.014362 +64 481 -24.686684 +65 481 -10.856697 +66 481 -11.149664 +67 481 -25.098796 +68 481 -2.227964 +69 481 -37.600215 +70 481 -16.563038 +72 481 -11.228983 +75 481 -25.320900 +77 481 -11.519892 +78 481 -11.148995 +80 481 -10.806209 +81 481 -12.416688 +82 481 -105.015906 +83 481 -11.778975 +84 481 -1.586463 +85 481 -54.330830 +86 481 -11.290233 +87 481 -0.521786 +89 481 -24.733045 +91 481 -25.232269 +92 481 -46.263531 +93 481 -49.029173 +94 481 -20.623106 +95 481 -27.870242 +96 481 -68.210616 +98 481 -6.578216 +99 481 -13.159236 +101 481 -8.938682 +103 481 -70.178803 +104 481 -47.262110 +105 481 -10.613920 +106 481 -24.546460 +107 481 -121.755376 +108 481 -24.539337 +109 481 -24.544784 +110 481 -105.314430 +111 481 -25.499371 +112 481 -135.078315 +115 481 -12.822203 +117 481 -14.730431 +118 481 -18.693237 +119 481 -24.410745 +120 481 -24.415002 +122 481 -25.842227 +123 481 -195.668268 +124 481 -14.925726 +125 481 -12.642856 +126 481 -23.474551 +128 481 -55.718449 +129 481 -24.862844 +130 481 -10.908815 +131 481 -11.011402 +132 481 -7.063340 +133 481 -139.457705 +134 481 -168.481867 +137 481 -22.056239 +138 481 -15.112248 +140 481 -37.852783 +141 481 -24.558776 +145 481 -137.673691 +146 481 -82.211560 +148 481 -12.307318 +149 481 -25.261235 +150 481 -14.821634 +151 481 -11.229469 +152 481 -19.018710 +153 481 -11.243788 +154 481 -30.247406 +155 481 -62.686237 +156 481 -82.098061 +157 481 -27.547830 +158 481 -242.818413 +159 481 -14.857204 +160 481 -24.802035 +161 481 -417.141728 +162 481 -92.494848 +163 481 -19.816666 +164 481 -5.275353 +166 481 -28.729499 +167 481 -37.585664 +168 481 -37.658804 +169 481 -27.711479 +170 481 -75.342715 +171 481 -127.990523 +173 481 -149.293556 +174 481 -63.449926 +175 481 -37.591243 +176 481 -43.976367 +177 481 -28.103824 +178 481 -11.817540 +179 481 -1.443525 +180 481 -36.473427 +182 481 -37.665449 +183 481 -19.763214 +185 481 -28.206263 +187 481 -25.194077 +188 481 -9.840208 +189 481 -18.814687 +190 481 -35.675040 +191 481 -11.526292 +194 481 -20.070568 +195 481 -25.303647 +196 481 -30.988883 +197 481 -11.146222 +201 481 -33.163215 +202 481 -10.289852 +203 481 -44.887469 +211 481 -49.156653 +212 481 -62.770258 +214 481 -8.315352 +215 481 -14.916820 +216 481 -34.239677 +217 481 -26.904673 +219 481 -25.492980 +220 481 -25.550375 +221 481 -25.570835 +222 481 -27.179606 +223 481 -102.096496 +224 481 -25.576326 +227 481 -25.335604 +228 481 -23.593884 +229 481 -29.257509 +230 481 -30.657612 +231 481 -26.988463 +233 481 -25.450414 +234 481 -11.066680 +235 481 -27.201196 +237 481 -24.878485 +239 481 -8.627802 +250 481 -27.051319 +253 481 -36.026362 +256 481 -34.959214 +257 481 -27.279047 +258 481 -35.245466 +259 481 -10.771234 +261 481 -10.942991 +262 481 -7.742676 +263 481 -27.952242 +265 481 -14.886915 +266 481 -25.315390 +267 481 -6.457090 +271 481 -34.194756 +272 481 -25.016801 +273 481 -12.110663 +278 481 -29.377611 +279 481 -16.691392 +281 481 -29.794000 +282 481 -13.588046 +284 481 -10.106803 +285 481 -49.303301 +287 481 -11.223392 +289 481 -25.687016 +290 481 -25.662392 +293 481 -24.741283 +294 481 -24.751552 +295 481 -42.567563 +296 481 -24.556824 +297 481 -88.534260 +299 481 -21.883263 +300 481 -25.057727 +302 481 -28.340811 +304 481 -4.823615 +305 481 -5.056712 +306 481 -24.899942 +307 481 -11.188988 +308 481 -33.105002 +309 481 -33.104133 +311 481 -4.448511 +312 481 -10.752705 +314 481 -49.103542 +315 481 -30.937450 +316 481 -31.070207 +317 481 -31.220269 +318 481 -24.892660 +319 481 -2650.430019 +320 481 -220.026597 +321 481 -749.370226 +322 481 -85.727728 +323 481 -45.735096 +324 481 -714.940414 +326 481 -92.915377 +327 481 -29.458433 +328 481 -177.213541 +329 481 -15.715001 +330 481 -2.278227 +331 481 -218.816052 +332 481 -397.583271 +333 481 -110.759048 +334 481 -29.050937 +335 481 -39.757753 +336 481 -35.321062 +337 481 -277.985590 +338 481 -505.541249 +339 481 -503.814240 +340 481 -351.666614 +341 481 -125.975271 +342 481 -115.626794 +353 481 1199.288556 +354 481 72043.828309 +355 481 882.142167 +358 481 5027.877765 +359 481 1610.679491 +361 481 138881.478621 +362 481 6130.170183 +376 481 783.672388 +377 481 12431.913829 +378 481 1882.958075 +379 481 103703.636802 +380 481 19884.396277 +381 481 4996.712838 +383 481 7577.784324 +385 481 111698.185878 +386 481 69327.717216 +401 481 847.944845 +402 481 10492.452221 +403 481 23605.406865 +404 481 48066.419344 +405 481 103465.331936 +406 481 348168.709496 +407 481 1496.053673 +408 481 6337.506051 +409 481 103639.421335 +410 481 91827.786469 +427 481 245.077665 +428 481 10103.411924 +429 481 29861.070427 +430 481 288199.974656 +431 481 489554.899901 +432 481 8382.291098 +433 481 115117.931436 +434 481 96118.661402 +450 481 1817.774163 +451 481 7420.701134 +452 481 7422.835047 +453 481 2221.657438 +454 481 26002.711946 +455 481 344802.410007 +456 481 691741.718635 +457 481 182601.431326 +458 481 112749.670778 +459 481 38463.416846 +460 481 34273.428867 +475 481 10502.717494 +476 481 14795.103002 +477 481 14798.416533 +478 481 41363.862325 +479 481 53527.181439 +480 481 208845.979525 +481 481 17046166.293294 +482 481 137643.838380 +483 481 53242.648800 +484 481 1455.617129 +5 482 -34.397955 +6 482 -51.471789 +7 482 -52.354808 +20 482 -13.934504 +36 482 -36.281011 +39 482 -84.947374 +45 482 -27.072676 +48 482 -53.332503 +55 482 -3.391800 +56 482 -43.564410 +62 482 -24.060070 +68 482 -16.759690 +69 482 -1.424479 +81 482 -8.375015 +82 482 -80.868478 +83 482 -15.118480 +85 482 -15.262597 +92 482 -68.610553 +96 482 -6.716299 +101 482 -15.082077 +103 482 -11.782938 +104 482 -27.595647 +107 482 -12.182699 +110 482 -27.090474 +112 482 -28.248128 +115 482 -8.044566 +118 482 -34.448445 +126 482 -22.488435 +133 482 -132.156169 +134 482 -29.366413 +135 482 -24.062723 +137 482 -33.883454 +138 482 -29.353292 +140 482 -8.606555 +154 482 -33.937412 +155 482 -68.872267 +156 482 -12.941768 +158 482 -37.279813 +162 482 -29.019123 +167 482 -1.914852 +168 482 -3.134275 +170 482 -14.937910 +171 482 -27.030699 +174 482 -9.997076 +175 482 -1.160199 +176 482 -9.707151 +178 482 -24.518468 +179 482 -39.769974 +182 482 -3.326438 +188 482 -7.221465 +194 482 -25.277128 +197 482 -10.698144 +198 482 -23.965650 +201 482 -33.181307 +202 482 -33.334147 +203 482 -34.307071 +211 482 -10.965956 +212 482 -5.696139 +213 482 -35.830900 +214 482 -11.730813 +216 482 -6.340307 +228 482 -22.390812 +234 482 -24.058295 +237 482 -33.252302 +241 482 -10.202861 +248 482 -4.120394 +256 482 -91.449174 +262 482 -11.546698 +274 482 -19.520487 +277 482 -10.905614 +279 482 -28.053263 +281 482 -17.331545 +295 482 -25.986529 +297 482 -32.325863 +298 482 -32.922545 +308 482 -0.950581 +309 482 -0.641207 +319 482 -118.303314 +321 482 -489.779890 +323 482 -25.434182 +324 482 -192.095603 +328 482 -90.380178 +331 482 -311.120655 +332 482 -39.049628 +333 482 -3.391800 +334 482 -0.552347 +337 482 -251.474006 +338 482 -84.259622 +339 482 -4.476395 +340 482 -25.108470 +342 482 -368.665038 +347 482 3293.585090 +348 482 4614.728911 +349 482 3186.711810 +354 482 9200.253287 +355 482 5128.882271 +358 482 1967.842261 +359 482 1725.742180 +361 482 85055.137795 +362 482 4165.882281 +374 482 1438.924600 +375 482 4638.045704 +376 482 4451.967683 +377 482 422.999711 +378 482 1164.000512 +379 482 12164.964666 +380 482 22256.163825 +381 482 14198.940470 +383 482 4164.153252 +385 482 54652.051355 +386 482 56032.945992 +401 482 200.204567 +402 482 7482.894038 +403 482 5591.633370 +404 482 8573.983585 +405 482 29205.672602 +406 482 54419.269753 +407 482 554.705246 +408 482 4220.152875 +409 482 37033.807912 +410 482 81683.667443 +427 482 4051.725839 +428 482 7701.224852 +429 482 13963.884191 +430 482 51681.269457 +431 482 97680.710119 +432 482 17970.425304 +433 482 36953.214913 +434 482 93914.588143 +435 482 935.543614 +450 482 1818.765857 +451 482 7424.749527 +452 482 7426.884604 +453 482 2850.731659 +454 482 17648.786654 +455 482 41265.171387 +456 482 151449.387439 +457 482 118661.828001 +458 482 97909.671118 +459 482 18626.114920 +460 482 17949.795574 +475 482 251.468111 +476 482 355.701744 +477 482 355.781440 +478 482 25919.128142 +479 482 37283.148377 +480 482 38161.606659 +481 482 137643.838380 +482 482 15732443.093724 +483 482 98469.420461 +484 482 5530.856286 +6 483 -5.099449 +7 483 -25.768197 +17 483 -21.647505 +18 483 -24.520030 +20 483 -4.040770 +27 483 -107.389832 +36 483 -101.912482 +38 483 -9.830409 +45 483 -21.760883 +47 483 -51.365148 +48 483 -15.707034 +51 483 -18.160139 +52 483 -16.789944 +55 483 -11.961533 +79 483 -17.325258 +82 483 -2.491844 +83 483 -13.699633 +84 483 -0.301054 +85 483 -14.912926 +86 483 -1.114169 +87 483 -0.301397 +92 483 -24.294658 +99 483 -0.130433 +101 483 -15.117140 +118 483 -31.244931 +119 483 -0.263809 +120 483 -0.263896 +121 483 -1.084877 +124 483 -0.291761 +125 483 -0.125767 +129 483 -1.081069 +133 483 -119.504415 +136 483 -18.351716 +137 483 -33.958265 +138 483 -24.858508 +139 483 -8.992867 +140 483 -81.910622 +141 483 -0.118151 +144 483 -0.125800 +145 483 -133.623081 +148 483 -0.130415 +153 483 -0.275554 +154 483 -30.747171 +155 483 -34.400065 +156 483 -48.586212 +157 483 -48.861887 +158 483 -1.231453 +159 483 -0.291777 +160 483 -0.262891 +162 483 -140.783753 +164 483 -0.123267 +166 483 -0.282385 +167 483 -38.467805 +168 483 -38.104034 +169 483 -0.126400 +170 483 -13.099039 +173 483 -0.837887 +177 483 -0.275948 +178 483 -0.115999 +179 483 -3.128442 +180 483 -0.841401 +182 483 -3.241410 +183 483 -0.128572 +184 483 -0.291717 +185 483 -1.134445 +186 483 -12.318989 +187 483 -0.274252 +188 483 -12.171883 +190 483 -0.263878 +192 483 -8.400291 +193 483 -0.291289 +194 483 -11.302285 +195 483 -1.107584 +196 483 -11.913310 +198 483 -34.479334 +199 483 -11.443251 +201 483 -30.013713 +202 483 -7.227588 +203 483 -41.177786 +204 483 -0.306060 +205 483 -26.668236 +206 483 -15.889956 +208 483 -27.090311 +213 483 -13.644293 +214 483 -7.378220 +215 483 -0.291802 +216 483 -0.332543 +217 483 -0.282635 +218 483 -0.125303 +219 483 -0.279994 +220 483 -1.122766 +221 483 -0.280960 +222 483 -1.124467 +223 483 -0.280318 +224 483 -0.280988 +226 483 -0.281270 +227 483 -1.109574 +228 483 -15.564130 +229 483 -1.123343 +230 483 -1.110167 +231 483 -0.282846 +232 483 -0.282869 +237 483 -33.531038 +239 483 -26.347167 +241 483 -26.905704 +244 483 -19.947499 +245 483 -20.583792 +247 483 -15.479420 +248 483 -32.594103 +250 483 -0.282092 +252 483 -9.929534 +253 483 -0.120240 +254 483 -0.128650 +256 483 -12.949253 +257 483 -1.121172 +262 483 -1.360179 +263 483 -0.275844 +264 483 -0.209114 +265 483 -0.291790 +266 483 -1.108464 +267 483 -0.297161 +271 483 -1.089789 +272 483 -1.089373 +273 483 -0.285704 +274 483 -33.084600 +275 483 -0.351667 +278 483 -1.122589 +279 483 -10.116187 +281 483 -36.026780 +282 483 -0.129995 +283 483 -35.396999 +284 483 -0.294978 +285 483 -0.264421 +287 483 -0.122632 +289 483 -0.282400 +290 483 -0.282036 +291 483 -0.116627 +292 483 -19.123574 +293 483 -0.268643 +294 483 -0.268764 +295 483 -58.778914 +298 483 -31.883842 +299 483 -1.056244 +300 483 -0.328750 +302 483 -0.122381 +304 483 -17.879526 +305 483 -7.236640 +310 483 -34.943798 +311 483 -15.398623 +312 483 -0.131071 +313 483 -11.452063 +314 483 -1.050309 +315 483 -0.277069 +316 483 -0.123067 +318 483 -0.270264 +319 483 -235.744882 +321 483 -487.616538 +328 483 -368.910566 +331 483 -718.740851 +335 483 -10.342808 +337 483 -138.728255 +339 483 -24.086375 +341 483 -24.349731 +342 483 -200.322340 +347 483 5582.183675 +348 483 7821.344733 +349 483 5401.047843 +354 483 94896.253792 +355 483 2377.329526 +358 483 1744.043391 +359 483 6381.051104 +361 483 68580.129034 +362 483 5019.511656 +374 483 2438.783634 +375 483 7860.863561 +376 483 7545.486346 +378 483 1333.800061 +379 483 8012.571444 +380 483 97392.389199 +381 483 24811.879780 +383 483 8325.033622 +384 483 779.729656 +385 483 3065.352475 +386 483 86508.162862 +401 483 339.319810 +402 483 10461.464868 +403 483 7943.304439 +404 483 7288.739541 +405 483 22343.600872 +406 483 130962.651332 +407 483 23279.808445 +408 483 9198.014330 +409 483 144.188126 +410 483 81929.571942 +411 483 12011.752062 +427 483 3923.894328 +428 483 7458.252041 +429 483 16011.206620 +430 483 14863.856187 +431 483 53920.279582 +432 483 146667.824554 +433 483 9395.795813 +434 483 26716.302825 +435 483 72291.690189 +450 483 1645.140655 +451 483 6715.959207 +452 483 6717.890463 +453 483 2583.190149 +454 483 16034.861299 +455 483 26271.558819 +456 483 30504.479334 +457 483 136609.381055 +458 483 85832.618283 +459 483 116926.166746 +460 483 77119.288815 +478 483 23118.006431 +479 483 33394.019920 +480 483 33402.388860 +481 483 53242.648800 +482 483 98469.420461 +483 483 14720686.341944 +484 483 107010.872093 +485 483 423.486514 +2 484 -12.982873 +6 484 -14.165294 +7 484 -31.404320 +17 484 -27.348116 +18 484 -8.490021 +20 484 -16.385829 +38 484 -34.176393 +47 484 -74.765363 +50 484 -6.980270 +51 484 -14.028071 +52 484 -30.800801 +71 484 -14.447269 +79 484 -14.758132 +92 484 -9.939892 +97 484 -13.276053 +101 484 -3.721880 +136 484 -13.860647 +137 484 -6.809445 +138 484 -31.984341 +139 484 -14.975642 +140 484 -135.524557 +142 484 -30.761709 +145 484 -6.944770 +156 484 -15.735326 +157 484 -15.475564 +162 484 -17.215236 +167 484 -26.960342 +168 484 -27.466873 +172 484 -2.298902 +186 484 -19.477852 +192 484 -22.607117 +194 484 -36.954998 +198 484 -18.207771 +199 484 -1.325345 +202 484 -37.285444 +204 484 -3.378760 +205 484 -2.140555 +206 484 -11.462287 +208 484 -1.879696 +213 484 -15.597376 +214 484 -37.295592 +228 484 -36.092262 +237 484 -4.876676 +239 484 -2.330983 +242 484 -2.912622 +244 484 -12.467510 +245 484 -11.912744 +252 484 -24.158492 +262 484 -12.489367 +275 484 -39.618031 +279 484 -37.062875 +281 484 -28.332251 +283 484 -10.488068 +286 484 -13.274229 +292 484 -31.626217 +295 484 -30.567963 +304 484 -34.127840 +305 484 -6.964901 +310 484 -28.710477 +311 484 -24.459212 +313 484 -13.498014 +319 484 -20.165946 +320 484 -9.934887 +321 484 -365.682981 +326 484 -9.847370 +328 484 -755.093492 +332 484 -1.039554 +338 484 -9.746152 +342 484 -115.757078 +354 484 13735.494826 +355 484 3081.776801 +359 484 4219.243102 +361 484 48999.412225 +362 484 4013.825833 +380 484 15903.961089 +381 484 9543.008570 +384 484 4654.229161 +386 484 64245.954383 +406 484 21439.487499 +407 484 10415.367176 +409 484 4624.919105 +410 484 48285.859952 +411 484 18884.344872 +431 484 1070.781068 +432 484 25368.676270 +433 484 6203.368152 +434 484 7489.061050 +435 484 66972.030500 +436 484 495.954235 +457 484 4390.647523 +458 484 24758.947881 +459 484 84461.333761 +460 484 151595.671728 +481 484 1455.617129 +482 484 5530.856286 +483 484 107010.872093 +484 484 13710031.657530 +485 484 26670.559974 +8 485 -23.039351 +15 485 -10.250668 +16 485 -23.663163 +17 485 -16.452989 +19 485 -10.621010 +20 485 -2.610146 +21 485 -19.906323 +22 485 -46.762196 +23 485 -35.448594 +25 485 -10.184732 +27 485 -5.601739 +28 485 -11.901131 +31 485 -24.905360 +32 485 -21.604097 +34 485 -21.819119 +37 485 -21.493667 +38 485 -18.588203 +42 485 -46.295135 +43 485 -86.816621 +44 485 -48.812055 +50 485 -7.485079 +52 485 -16.919676 +53 485 -22.906210 +54 485 -33.167098 +55 485 -10.097953 +60 485 -36.302550 +61 485 -86.781814 +62 485 -9.644576 +63 485 -10.610042 +66 485 -7.379346 +67 485 -17.777734 +71 485 -3.519299 +77 485 -10.505790 +84 485 -25.157934 +87 485 -11.195498 +91 485 -10.101446 +100 485 -22.108970 +102 485 -21.528825 +106 485 -21.820431 +108 485 -21.809222 +109 485 -21.819169 +113 485 -9.871530 +117 485 -35.075960 +119 485 -86.468238 +120 485 -9.612901 +121 485 -3.199042 +122 485 -23.544010 +124 485 -24.281280 +125 485 -10.428302 +129 485 -3.536868 +131 485 -23.916601 +132 485 -96.923428 +135 485 -87.769855 +142 485 -8.761813 +143 485 -9.421332 +148 485 -24.445405 +150 485 -24.304167 +152 485 -34.844256 +153 485 -10.127899 +159 485 -35.077490 +160 485 -21.522746 +163 485 -24.046141 +164 485 -33.058670 +166 485 -20.856285 +169 485 -34.116712 +172 485 -9.150843 +183 485 -10.685878 +185 485 -23.523349 +187 485 -6.907424 +191 485 -9.260638 +193 485 -35.012657 +194 485 -1.117197 +195 485 -33.114241 +197 485 -9.413688 +202 485 -2.467110 +204 485 -47.760450 +206 485 -5.003207 +214 485 -2.506573 +215 485 -35.084808 +217 485 -33.901067 +218 485 -10.383035 +220 485 -23.353430 +221 485 -23.377566 +222 485 -23.391986 +223 485 -33.626621 +224 485 -33.716005 +227 485 -20.395399 +229 485 -93.450551 +230 485 -20.402296 +231 485 -47.026598 +232 485 -33.941329 +235 485 -33.666638 +238 485 -11.319741 +240 485 -22.137847 +242 485 -22.684491 +250 485 -46.859966 +252 485 -14.814235 +253 485 -13.408485 +254 485 -6.265401 +255 485 -49.677418 +257 485 -20.663539 +258 485 -21.387812 +259 485 -21.379641 +261 485 -21.901992 +263 485 -19.445449 +265 485 -35.081151 +266 485 -33.053539 +267 485 -49.536550 +271 485 -27.469368 +272 485 -27.288152 +275 485 -20.602288 +277 485 -31.656003 +278 485 -23.349307 +279 485 -1.572407 +282 485 -48.698200 +283 485 -5.513894 +284 485 -35.507238 +285 485 -86.794114 +286 485 -18.314620 +287 485 -22.873972 +288 485 -33.188649 +289 485 -46.903748 +290 485 -46.829755 +292 485 -15.333645 +293 485 -22.149196 +294 485 -22.160196 +295 485 -30.821732 +296 485 -21.836296 +299 485 -9.633407 +302 485 -9.317276 +304 485 -15.206282 +306 485 -28.537247 +307 485 -17.072663 +310 485 -9.774016 +311 485 -6.880977 +312 485 -21.862147 +313 485 -5.853516 +314 485 -21.486221 +315 485 -22.815847 +316 485 -33.013740 +317 485 -10.121079 +318 485 -9.110637 +321 485 -1344.869053 +328 485 -2135.740783 +332 485 -8.713328 +337 485 -22.108403 +359 485 4512.117059 +361 485 137556.624236 +362 485 27295.842362 +384 485 4917.571536 +386 485 195744.451109 +409 485 4825.059230 +411 485 200165.196559 +434 485 3231.515682 +435 485 22180.689468 +436 485 184347.992517 +459 485 1306.813147 +460 485 373724.909752 +461 485 72468.371834 +483 485 423.486514 +484 485 26670.559974 +485 485 13514804.130899 +486 485 6649.133641 +3 486 -9.413512 +9 486 -9.502861 +21 486 -0.345037 +24 486 -20.804282 +27 486 -15.550997 +32 486 -21.101946 +33 486 -9.355433 +34 486 -9.546845 +37 486 -20.938095 +40 486 -22.859938 +43 486 -21.229800 +66 486 -2.603719 +67 486 -2.312124 +80 486 -21.283539 +89 486 -21.690513 +102 486 -20.998322 +106 486 -21.374862 +108 486 -21.360116 +109 486 -85.493798 +119 486 -84.421375 +120 486 -9.387882 +121 486 -6.630337 +129 486 -18.459075 +135 486 -87.156457 +141 486 -21.398551 +143 486 -20.699412 +160 486 -20.982414 +178 486 -20.408557 +187 486 -3.056995 +188 486 -21.711146 +190 486 -21.157512 +191 486 -8.872796 +205 486 -10.106896 +208 486 -10.103955 +234 486 -21.015426 +239 486 -10.111648 +253 486 -18.503492 +254 486 -14.861728 +258 486 -20.799345 +259 486 -20.787924 +261 486 -85.901412 +262 486 -10.172622 +263 486 -0.771763 +271 486 -4.943849 +272 486 -5.107704 +277 486 -0.999234 +280 486 -20.962536 +293 486 -21.800365 +294 486 -21.813485 +295 486 -0.277585 +296 486 -21.395611 +302 486 -0.746180 +306 486 -15.921451 +307 486 -2.972012 +314 486 -20.931896 +318 486 -78.714539 +321 486 -1047.785536 +328 486 -93.767783 +342 486 -0.277585 +359 486 53.590324 +361 486 72689.823776 +362 486 49427.106693 +384 486 26.012881 +385 486 30.637473 +386 486 141715.704152 +387 486 1791.712242 +410 486 53.843728 +411 486 143929.626163 +412 486 1185.174867 +435 486 5.617984 +436 486 145829.517715 +437 486 1187.394495 +460 486 7363.856918 +461 486 151349.766831 +462 486 346.247716 +485 486 6649.133641 +486 486 12661118.190778 +487 486 46.233601 +196 487 -8.659360 +254 487 -19.471548 +262 487 -77.279634 +295 487 -24.638552 +321 487 -105.410542 +342 487 -24.638552 +359 487 4756.699400 +362 487 12448.450365 +384 487 2308.914107 +385 487 2719.394833 +387 487 14320.547924 +410 487 4779.191640 +412 487 14153.223753 +435 487 498.654554 +436 487 4052.062957 +437 487 14010.536760 +461 487 4341.440670 +462 487 13891.796931 +486 487 46.233601 +487 487 11999385.460055 +40 488 -19.439670 +199 488 -8.619327 +205 488 -19.382595 +207 488 -19.381840 +208 488 -19.382788 +216 488 -8.737248 +239 488 -19.383915 +321 488 -114.327382 +362 488 14192.064001 +387 488 16179.323400 +412 488 15836.571704 +437 488 14880.147864 +438 488 647.440705 +462 488 11402.787000 +463 488 3847.924568 +488 488 11487122.561199 +489 489 11111111.111111 +490 490 11111111.111111 +491 491 11111111.111111 +492 492 11111111.111111 +493 493 11489799.486771 +65 494 -15.284216 +75 494 -129.372245 +93 494 -35.074263 +100 494 -13.984932 +132 494 -14.041663 +141 494 -10.377315 +144 494 -128.312744 +163 494 -14.071707 +164 494 -32.234492 +166 494 -14.318037 +172 494 -13.944742 +177 494 -32.398058 +183 494 -31.656001 +184 494 -31.570685 +185 494 -32.072408 +189 494 -31.681555 +190 494 -5.392037 +193 494 -31.587090 +194 494 -3.639276 +242 494 -31.384867 +244 494 -3.265720 +246 494 -31.625796 +250 494 -32.203153 +251 494 -31.390962 +253 494 -32.345192 +257 494 -32.257283 +258 494 -2.657070 +263 494 -14.305133 +265 494 -31.574916 +266 494 -129.467054 +267 494 -13.973775 +271 494 -129.560987 +273 494 -14.094121 +280 494 -9.761564 +282 494 -14.020708 +283 494 -5.141353 +284 494 -14.006839 +285 494 -15.799203 +291 494 -11.791595 +293 494 -11.120902 +294 494 -25.709028 +296 494 -10.321116 +299 494 -10.819309 +302 494 -14.032214 +306 494 -13.241447 +307 494 -32.150835 +315 494 -14.366190 +316 494 -14.377451 +317 494 -14.382113 +318 494 -14.373415 +322 494 -31.390962 +325 494 -1365.143816 +369 494 1111.263250 +394 494 6724.022239 +419 494 6706.282053 +444 494 224138.941059 +469 494 305755.854356 +494 494 11832803.445334 +495 494 21632.327990 +51 495 -35.061679 +65 495 -17.847314 +93 495 -98.964117 +136 495 -35.022046 +141 495 -4.191539 +142 495 -34.791388 +143 495 -8.845403 +179 495 -21.303851 +186 495 -35.090527 +190 495 -9.408876 +194 495 -30.247713 +197 495 -3.949898 +202 495 -35.433068 +234 495 -51.335606 +244 495 -30.652038 +247 495 -10.612178 +251 495 -130.112415 +258 495 -12.322878 +275 495 -36.823929 +279 495 -34.422210 +280 495 -23.683772 +283 495 -28.626662 +285 495 -17.306442 +291 495 -21.530202 +293 495 -3.421095 +294 495 -6.986711 +296 495 -4.249836 +299 495 -22.560386 +301 495 -137.920621 +302 495 -0.419015 +306 495 -1.232377 +325 495 -814.263377 +327 495 -130.112415 +369 495 4900.700264 +394 495 29561.020175 +419 495 29320.662893 +444 495 157073.774073 +445 495 15008.083371 +469 495 156212.049303 +470 495 68236.437420 +494 495 21632.327990 +495 495 11979968.738148 +496 495 17689.753756 +97 496 -27.113529 +116 496 -30.974488 +135 496 -39.273899 +143 496 -33.437974 +175 496 -5.618848 +178 496 -11.532764 +179 496 -18.400188 +180 496 -14.402935 +182 496 -6.236453 +197 496 -14.838326 +206 496 -34.350017 +234 496 -114.184482 +241 496 -32.604207 +247 496 -31.261786 +251 496 -9.167953 +252 496 -173.726831 +268 496 -30.903204 +269 496 -13.737725 +270 496 -13.730860 +274 496 -30.911571 +292 496 -170.279454 +304 496 -60.178440 +305 496 -14.734937 +311 496 -17.422295 +322 496 -120.257848 +325 496 -819.597366 +341 496 -9.167953 +347 496 16056.512879 +369 496 392.438502 +371 496 443.699272 +372 496 17885.308094 +394 496 2358.077491 +396 496 5485.456063 +397 496 12895.461476 +419 496 657.136498 +420 496 1665.263933 +421 496 17619.637951 +422 496 819.844641 +444 496 182043.873929 +445 496 13066.852698 +446 496 18775.743661 +469 496 10299.905694 +470 496 216435.180172 +471 496 59615.154464 +472 496 1556.979242 +495 496 17689.753756 +496 496 12264456.757040 +497 496 50884.704558 +498 496 248.468230 +97 497 -21.955064 +116 497 -202.461642 +135 497 -6.617766 +137 497 -26.174758 +139 497 -23.005282 +175 497 -17.704271 +178 497 -39.689408 +180 497 -38.546470 +182 497 -17.350442 +196 497 -17.591945 +199 497 -5.575077 +206 497 -12.762101 +239 497 -12.397498 +241 497 -14.962299 +251 497 -42.624923 +252 497 -5.998548 +264 497 -29.374675 +268 497 -26.890160 +269 497 -9.524906 +270 497 -13.324858 +274 497 -32.480346 +292 497 -10.221126 +304 497 -150.785070 +305 497 -38.106419 +310 497 -32.918503 +311 497 -34.557034 +320 497 -15.195577 +325 497 -556.293756 +327 497 -51.893861 +329 497 -54.116658 +332 497 -10.339664 +334 497 -30.326409 +335 497 -128.101067 +336 497 -30.642240 +341 497 -6.691360 +347 497 14995.050188 +369 497 1963.748046 +372 497 16871.192123 +394 497 11606.062411 +395 497 170.737783 +397 497 16827.937780 +419 497 479.620350 +420 497 11076.575934 +422 497 16791.226680 +444 497 116363.127396 +445 497 47863.661122 +446 497 7523.318984 +447 497 16761.154453 +469 497 43.036328 +470 497 103697.063261 +471 497 105609.618321 +472 497 77722.345495 +496 497 50884.704558 +497 497 12291537.299648 +498 497 42520.663926 +499 497 3928.384018 +101 498 -4.050738 +116 498 -229.662502 +137 498 -35.942145 +138 498 -34.672444 +139 498 -37.305557 +175 498 -0.467063 +178 498 -2.675062 +196 498 -36.933613 +199 498 -16.275661 +239 498 -36.611598 +248 498 -11.851336 +251 498 -16.725730 +264 498 -31.613784 +268 498 -40.210303 +269 498 -41.041342 +274 498 -24.421197 +277 498 -25.632933 +310 498 -26.843607 +320 498 -21.856718 +323 498 -14.542406 +324 498 -171.754795 +325 498 -300.875539 +327 498 -17.951957 +329 498 -20.260299 +332 498 -28.154017 +336 498 -73.178479 +342 498 -4.362402 +347 498 18728.585602 +369 498 920.243020 +372 498 21985.933050 +394 498 3717.978654 +395 498 1774.978719 +397 498 20834.992905 +398 498 1019.056287 +420 498 3012.674895 +421 498 2328.806864 +422 498 18677.324742 +423 498 3053.225532 +444 498 58616.677012 +445 498 49569.989459 +446 498 2575.597134 +447 498 12281.118312 +448 498 12042.054951 +470 498 24811.222983 +471 498 74305.029126 +472 498 108344.962367 +473 498 29661.143270 +496 498 248.468230 +497 498 42520.663926 +498 498 12240850.653340 +499 498 39665.683695 +500 498 5295.602821 +58 499 -14.617538 +90 499 -29.741488 +101 499 -34.956970 +116 499 -39.255919 +126 499 -0.648692 +138 499 -36.030936 +139 499 -2.941873 +192 499 -29.492252 +194 499 -4.369629 +196 499 -10.704232 +199 499 -7.975875 +214 499 -35.821302 +239 499 -18.155779 +248 499 -15.863321 +251 499 -39.893546 +262 499 -3.576222 +268 499 -174.846976 +269 499 -67.862442 +270 499 -61.727969 +274 499 -74.654632 +277 499 -35.652207 +298 499 -4.197998 +308 499 -18.406507 +309 499 -20.191387 +322 499 -87.154919 +323 499 -12.356503 +324 499 -51.668591 +325 499 -195.349667 +326 499 -5.904328 +329 499 -196.962547 +333 499 -40.839623 +335 499 -57.314684 +338 499 -10.841358 +341 499 -106.553955 +342 499 -16.639516 +347 499 72487.522243 +369 499 2309.365415 +372 499 79954.618517 +373 499 3229.529917 +376 499 813.737654 +377 499 3213.135305 +394 499 8333.203958 +395 499 5432.639943 +397 499 17866.132378 +398 499 64323.220081 +400 499 1794.225669 +401 499 7534.857598 +402 499 2755.030736 +420 499 5850.511000 +421 499 7499.830676 +423 499 80931.469405 +424 499 290.674519 +425 499 3092.666570 +426 499 9904.924926 +427 499 132.203084 +444 499 36862.215962 +445 499 41973.891767 +446 499 9099.616415 +447 499 8368.794704 +448 499 67378.160080 +449 499 13858.278597 +450 499 10356.763302 +451 499 2773.364763 +470 499 4675.832378 +471 499 41527.965924 +472 499 56377.430040 +473 499 54527.259457 +474 499 63243.699539 +475 499 14662.254366 +476 499 142.691600 +497 499 3928.384018 +498 499 39665.683695 +499 499 12308364.476846 +500 499 32053.297605 +2 500 -4.747824 +5 500 -6.580751 +17 500 -6.489718 +58 500 -28.466389 +71 500 -12.295657 +82 500 -14.464465 +90 500 -173.244201 +101 500 -35.046396 +116 500 -33.097775 +126 500 -32.170967 +128 500 -13.800869 +138 500 -1.668796 +156 500 -32.385821 +157 500 -27.402382 +162 500 -29.140105 +188 500 -3.313445 +192 500 -34.806691 +194 500 -28.660383 +201 500 -169.306615 +203 500 -5.311735 +209 500 -15.342116 +212 500 -6.270051 +248 500 -5.778708 +251 500 -12.473217 +262 500 -34.308385 +268 500 -61.839990 +269 500 -59.994051 +270 500 -14.436067 +274 500 -60.579567 +277 500 -14.463080 +298 500 -132.124922 +308 500 -242.050488 +309 500 -377.327094 +320 500 -171.564225 +322 500 -294.311257 +323 500 -41.282014 +324 500 -56.120640 +325 500 -129.385503 +326 500 -114.191025 +327 500 -83.825070 +329 500 -170.725665 +333 500 -105.409765 +335 500 -89.103866 +336 500 -114.073893 +337 500 -42.410931 +338 500 -10.014547 +339 500 -51.331401 +341 500 -149.417225 +342 500 -106.221698 +347 500 40650.760407 +353 500 15555.543489 +354 500 4446.405571 +369 500 809.387924 +372 500 22398.783938 +373 500 24125.712382 +376 500 1458.713849 +377 500 7844.819828 +378 500 25306.513516 +379 500 503.144875 +394 500 2340.853153 +395 500 2393.139185 +396 500 74.392305 +398 500 45289.756958 +399 500 397.828708 +401 500 13812.180901 +402 500 31231.000054 +403 500 12985.946839 +420 500 940.078698 +421 500 3193.689293 +422 500 498.126361 +423 500 17114.606388 +424 500 27748.809868 +426 500 51409.245373 +427 500 31404.865054 +428 500 1100.574645 +444 500 23900.775162 +445 500 30048.197391 +446 500 11618.025888 +447 500 2982.191200 +448 500 1243.152213 +449 500 43165.539265 +450 500 13170.954570 +451 500 71570.859057 +452 500 11775.889629 +470 500 182.432796 +471 500 18741.137529 +472 500 37658.173661 +473 500 35007.293452 +474 500 36337.468045 +475 500 149189.337566 +476 500 42946.958876 +477 500 444.602886 +498 500 5295.602821 +499 500 32053.297605 +500 500 12741928.914287 \ No newline at end of file diff --git a/SPEX/ExampleMats/tomography.rhs b/SPEX/ExampleMats/tomography.rhs new file mode 100644 index 0000000000..d776bc42cb --- /dev/null +++ b/SPEX/ExampleMats/tomography.rhs @@ -0,0 +1,501 @@ +500 1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index edfc198353..1670bc21ef 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -1,176 +1,20 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/Include/SPEX.h: user #include file for SPEX_Left_LU. +// SPEX/Include/SPEX.h: Include file for SPEX Library //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2023, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ -#ifndef SPEX_LEFT_LU_H -#define SPEX_LEFT_LU_H +#ifndef SPEX_H +#define SPEX_H -// This software package exactly solves a sparse system of linear equations -// using the SPEX Left LU factorization. This code accompanies the paper (submitted -// to ACM Transactions on Mathematical Software): -// "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, ACM Trans. Mathematical Software, -// June 2022. https://doi.org/10.1145/3519024 - -// The theory associated with this software can be found in the paper -// (published in SIAM journal on matrix analysis and applications): - -// "Exact Solution of Sparse Linear Systems via Left-Looking -// Roundoff-Error-Free LU Factorization in Time Proportional to -// Arithmetic Work", C. Lourenco, A. R. Escobedo, E. Moreno-Centeno, -// T. Davis, SIAM J. Matrix Analysis and Applications. pp 609-638, -// vol 40, no 2, 2019. - -// 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 Left LU for a publication, we request that you please cite -// the above two papers. - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//-------------------------Authors---------------------------------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -// Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy Davis -// - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//-------------------------Contact Information---------------------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -// Please contact Chris Lourenco (chrisjlourenco@gmail.com) -// or Tim Davis (timdavis@aldenmath.com, DrTimothyAldenDavis@gmail.com, -// davis@tamu.edu) - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//-------------------------Copyright-------------------------------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -// SPEX Left LU 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. -// -// See license.txt for license info. -// -// This software is copyright by Christopher Lourenco, Jinhao Chen, Erick -// Moreno-Centeno and Timothy A. Davis. All Rights Reserved. -// - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//---------------------------DISCLAIMER----------------------------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -// SPEX Left LU 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. - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//--------------------------Summary--------------------------------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -// This software package solves the linear system Ax = b exactly. The input -// matrix and right hand side vectors are stored as either integers, double -// precision numbers, multiple precision floating points (through the mpfr -// library) or as rational numbers (as a collection of numerators and -// denominators using the GMP mpq_t data structure). Appropriate routines -// within the code transform the input into an integral matrix in compressed -// column form. - -// This package computes the factorization PAQ = LDU. Note that we store the -// "functional" form of the factorization by only storing L and U. The user -// is given some freedom to select the permutation matrices P and Q. The -// recommended default settings select Q using the COLAMD column ordering -// and select P via a partial pivoting scheme in which the diagonal entry -// in column k is selected if it is the same magnitude as the smallest -// entry, otherwise the smallest entry is selected as the kth pivot. -// Alternative strategies allowed to select Q include the AMD column -// ordering or no column permutation (Q=I). For pivots, there are a variety -// of potential schemes including traditional partial pivoting, diagonal -// pivoting, tolerance pivoting etc. This package does not allow pivoting -// based on sparsity criterion. - -// The factors L and U are computed via integer preserving operations via -// integer-preserving Gaussian elimination. The key part of this algorithm -// is a Roundoff Error Free (REF) sparse triangular solve function which -// exploits sparsity to reduce the number of operations that must be -// performed. - -// Once L and U are computed, a simplified version of the triangular solve -// is performed which assumes the vector b is dense. The final solution -// vector x is gauranteed to be exact. This vector can be output in one of -// three ways: 1) full precision rational arithmetic (as a sequence of -// numerators and denominators) using the GMP mpq_t data type, 2) double -// precision while not exact will produce a solution accurate to machine -// roundoff unless the size of the associated solution exceeds double -// precision (i.e., the solution is 10^500 or something), 3) variable -// precision floating point using the GMP mpfr_t data type. The associated -// precision is user defined. - - -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -//---------------------Include files required by SPEX Left LU------------------- -//------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ - -#include -#include -#include -#include -#include -#include -#include -#include "SuiteSparse_config.h" -// #include "SPEX_Util.h" - - -//------------------------------------------------------------------------------ -// SPEX_Util/Include/SPEX_Util.h: Include file for utility functions for SPEX -//------------------------------------------------------------------------------ - -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -#ifndef SPEX_UTIL_H -#define SPEX_UTIL_H - -// SPEX_Util is a collection of utility functions for the SParse EXact package. -// Included are several routines for memory management, matrix operations, and +// SPEX is a collection of functions for the SParse EXact package. +// Included are several routines for memory management, matrix operations, and // wrappers to the GMP library. // // This is the global include file and should be included in all SPEX_* packages @@ -181,9 +25,10 @@ //-------------------------Authors---------------------------------------------- //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// Unless otherwise noted all Utility functions are authored by: +// Unless otherwise noted all functions are authored by: // -// Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy Davis +// Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis // //------------------------------------------------------------------------------ @@ -192,8 +37,10 @@ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// Please contact Chris Lourenco (chrisjlourenco@gmail.com, lourenco@usna.edu) -// or Tim Davis (timdavis@aldenmath.com, DrTimothyAldenDavis@gmail.com, +// Please contact +// Chris Lourenco (chrisjlourenco@gmail.com, lourenco@usna.edu) +// or +// Tim Davis (timdavis@aldenmath.com, DrTimothyAldenDavis@gmail.com, // davis@tamu.edu) //------------------------------------------------------------------------------ @@ -219,8 +66,9 @@ // // See license.txt for license info. // -// This software is copyright by Christopher Lourenco, Jinhao Chen, Erick -// Moreno-Centeno and Timothy A. Davis. All Rights Reserved. +// This software is copyright by Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno and Timothy A. Davis. +// All Rights Reserved. // //------------------------------------------------------------------------------ @@ -234,41 +82,47 @@ // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. - //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //---------------------Include files required by SPEX -------------------------- //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// #include -// #include -// #include -// #include -// #include -// #include -// #include -#include -#include -// #include -#include -#include +#include +#include +#include +#include +#include +#include +#include +// #include +// #include +// #include +// #include #include "SuiteSparse_config.h" //------------------------------------------------------------------------------ -// Version +// SPEX Version //------------------------------------------------------------------------------ -#define SPEX_DATE "Jan 20, 2024" -#define SPEX_VERSION "2.3.2" -#define SPEX_VERSION_MAJOR 2 -#define SPEX_VERSION_MINOR 3 -#define SPEX_VERSION_SUB 2 +// Current version of the code +#define SPEX_DATE "Feb XX, 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(2,3,2) +#define SPEX__VERSION SUITESPARSE__VERCODE(3,1,0) #if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,6,0)) -#error "SPEX 2.3.2 requires SuiteSparse_config 7.6.0 or later" + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "SPEX 3.1.0 requires SuiteSparse_config 7.7.0 or later" #endif #if defined ( __cplusplus ) @@ -276,12 +130,6 @@ extern "C" { #endif -//------------------------------------------------------------------------------ -// version -//------------------------------------------------------------------------------ - -void SPEX_version (int version [3]) ; - //------------------------------------------------------------------------------ // Error codes //------------------------------------------------------------------------------ @@ -292,49 +140,100 @@ void SPEX_version (int version [3]) ; typedef enum { - SPEX_OK = 0, // all is well - SPEX_OUT_OF_MEMORY = -1, // out of memory - SPEX_SINGULAR = -2, // the input matrix A is singular - SPEX_INCORRECT_INPUT = -3, // one or more input arguments are incorrect - SPEX_INCORRECT = -4, // The solution is incorrect - SPEX_UNSYMMETRIC = -5, // The input matrix is unsymmetric (for Cholesky) - SPEX_PANIC = -6 // SPEX used without proper initialization + + SPEX_OK = 0, // all is well + SPEX_OUT_OF_MEMORY = -1, // out of memory + SPEX_SINGULAR = -2, // the input matrix A is singular + SPEX_INCORRECT_INPUT = -3, // one or more input arguments are incorrect + SPEX_NOTSPD = -4, // The input matrix is not symmetric positive + // definite (for a Cholesky factorization) + SPEX_INCORRECT_ALGORITHM = -5,// The algorithm is not compatible with + // the factorization + SPEX_PANIC = -6 // SPEX used without proper initialization, + // or other unrecoverable error } SPEX_info ; +//------------------------------------------------------------------------------ +// SPEX Version, continued +//------------------------------------------------------------------------------ + +SPEX_info SPEX_version +( + int version [3], // SPEX major, minor, and sub version + char date [128] // date of this version +) ; + +// Requirements: SPEX requires GMP 6.1.2 or later, and MPFR 4.0.2 or later. +// NOTE that these version numbers are from the original source distributions. +// It is NOT the "number 10" assigned to libgmp.so.10 in the Ubuntu linux +// distro. + +// GMP v6.1.2 or later is required: +#if __GNU_MP_RELEASE < 60102 +#error "GMP v6.1.2 or later is required." +#endif + +// MPFR v4.0.2 or later is required: +#if MPFR_VERSION < MPFR_VERSION_NUM(4,0,2) +#error "MPFR v4.0.2 or later is required." +#endif + //------------------------------------------------------------------------------ // Pivot scheme codes //------------------------------------------------------------------------------ +// SPEX_DEFAULT is only used to define the defaults for the following enums but +// in all other places we use the appropiate default (ie SPEX_DEFAULT_ORDERING) +// for ease of reading +#define SPEX_DEFAULT 0 + // A code in SPEX_options to tell SPEX what type of pivoting to use for pivoting // in unsymmetric LU factorization. typedef enum { - SPEX_SMALLEST = 0, // Smallest pivot + SPEX_SMALLEST = SPEX_DEFAULT, // Smallest pivot (the default method) SPEX_DIAGONAL = 1, // Diagonal pivoting SPEX_FIRST_NONZERO = 2, // First nonzero per column chosen as pivot SPEX_TOL_SMALLEST = 3, // Diagonal pivoting with tol for smallest pivot. - // (Default) SPEX_TOL_LARGEST = 4, // Diagonal pivoting with tol. for largest pivot SPEX_LARGEST = 5 // Largest pivot } SPEX_pivot ; //------------------------------------------------------------------------------ -// Column ordering scheme codes +// Fill-reducing ordering scheme codes +//------------------------------------------------------------------------------ + +// A code in SPEX_options to tell SPEX which fill-reducing ordering to used +// prior to exact factorization + +typedef enum +{ + SPEX_DEFAULT_ORDERING = SPEX_DEFAULT, // Default: colamd for LU + // AMD for Cholesky + SPEX_NO_ORDERING = 1, // None: A is factorized as-is + SPEX_COLAMD = 2, // COLAMD: Default for LU (and QR in the FUTURE) + SPEX_AMD = 3 // AMD: Default for Cholesky +} +SPEX_preorder ; + +//------------------------------------------------------------------------------ +// Factorization type codes //------------------------------------------------------------------------------ -// A code in SPEX_options to tell SPEX which column ordering to used prior to -// exact factorization +// A code in SPEX_options to tell SPEX which factorization algorithm to use typedef enum { - SPEX_NO_ORDERING = 0, // None: A is factorized as-is - SPEX_COLAMD = 1, // COLAMD: Default - SPEX_AMD = 2 // AMD + SPEX_ALGORITHM_DEFAULT = SPEX_DEFAULT, // Defaults: Left for LU, + // Up for Chol + SPEX_LU_LEFT = 1, // Left looking LU factorization + SPEX_CHOL_LEFT = 2, // Left looking Cholesky factorization + SPEX_CHOL_UP = 3 // Up looking Cholesky factorization } -SPEX_col_order ; +SPEX_factorization_algorithm ; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -344,26 +243,52 @@ SPEX_col_order ; // This struct serves as a global struct to define all user-selectable options. -typedef struct SPEX_options +typedef struct { - SPEX_pivot pivot ; // row pivoting scheme used. - SPEX_col_order order ; // column ordering scheme used - double tol ; // tolerance for the row-pivotin methods + SPEX_pivot pivot ; // row pivoting scheme used (LU only) + SPEX_preorder order ; // ordering scheme used + double tol ; // tolerance for the row-pivoting methods for LU. // SPEX_TOL_SMALLEST and SPEX_TOL_LARGEST int print_level ; // 0: print nothing, 1: just errors, - // 2: terse (basic stats from COLAMD/AMD and - // SPEX Left LU), 3: all, with matrices and results - int32_t prec ; // Precision used to output file if MPFR is chosen + // 2: terse (basic stats from COLAMD/AMD and the + // factorization), 3: all, with matrices and results + uint64_t prec ; // Precision for MPFR mpfr_rnd_t round ; // Type of MPFR rounding used - bool check ; // Set true if the solution to the system should be - // checked. Intended for debugging only; SPEX is - // guaranteed to return the exact solution. -} SPEX_options ; + SPEX_factorization_algorithm algo ; // parameter which tells the function + // which factorization algorithm to use +} SPEX_options_struct ; + +// A SPEX_options object is a pointer to a SPEX_options_struct +typedef SPEX_options_struct *SPEX_options ; // Purpose: Create SPEX_options object with default parameters // upon successful allocation, which are defined in SPEX_util_nternal.h -// To free it, simply use SPEX_FREE (*option). -SPEX_info SPEX_create_default_options (SPEX_options **option) ; +// To free it, simply use SPEX_FREE (option). + +SPEX_info SPEX_create_default_options (SPEX_options *option_handle) ; + + +//------------------------------------------------------------------------------ +// SPEX_vector +//------------------------------------------------------------------------------ + +// 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. + +typedef struct +{ + int64_t nz; // number of explicit entries in the vector + int64_t nzmax;// size of array i and x, nz <= nzmax + int64_t *i; // array of size nzmax that contains the column/row indices + // of each nnz. + mpz_t *x; // array of size nzmax that contains the values of each nnz + mpq_t scale; // a scale factor that has not applied to entries in this v. + // The real value of the k-th nonzero entry in the list should + // be computed as x[k]*scale. x[k]/den(scale) must be integer. +} SPEX_vector_struct ; + +// A SPEX_vector is a pointer to a SPEX_vector_struct +typedef SPEX_vector_struct *SPEX_vector ; //------------------------------------------------------------------------------ @@ -371,18 +296,19 @@ SPEX_info SPEX_create_default_options (SPEX_options **option) ; //------------------------------------------------------------------------------ // SPEX uses a single matrix data type, SPEX_matrix, which can be held in -// one of three kinds of formats: sparse CSC (compressed sparse column), -// sparse triplet, and dense: +// one of four kinds of formats: sparse CSC (compressed sparse column), +// sparse triplet, dense, and sparse dynamic CSC. 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 + SPEX_DENSE = 2, // matrix is in dense format (held by column) } SPEX_kind ; -// Each of the three formats can have values of 5 different data types: mpz_t, +// The last format (SPEX_DYNAMIC_CSC) only support mpz_t type, while each of +// the first three formats can have values of 5 different data types: mpz_t, // mpq_t, mpfr_t, int64_t, and double: typedef enum @@ -395,8 +321,10 @@ typedef enum } SPEX_type ; -// This gives a total of 15 different matrix types. Not all functions accept -// all 15 matrices types, however. +// This gives a total of 16 different matrix types: +// (sparse CSC, triplet, dense) x (5 data types) = 15 formats, + +// Not all functions accept all 16 matrices types, however. // Suppose A is an m-by-n matrix with nz <= nzmax entries. // The p, i, j, and x components are defined as: @@ -419,34 +347,45 @@ 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. - +// // 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->p_shallow has no effect. typedef struct { + SPEX_kind kind ; // CSC, triplet, dense + SPEX_type type ; // mpz, mpq, mpfr, int64, or fp64 (double) + + int64_t m ; // number of rows int64_t n ; // number of columns - int64_t nzmax ; // size of A->i, A->j, and A->x + + mpq_t scale ; // scale factor for mpz matrices (never shallow) + // For all matrices whose type is not mpz, + // mpz_scale = 1. + // The real value of the nonzero entry A(i,j) + // should be computed as A(i,j)/scale. + + //-------------------------------------------------------------------------- + // 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 and dense matrices. - SPEX_kind kind ; // CSC, triplet, or dense - SPEX_type type ; // mpz, mpq, mpfr, int64, or fp64 (double) + // 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. - bool p_shallow ; // if true, A->p is shallow. int64_t *i ; // if CSC or triplet: row indices, of size nzmax. // if dense: A->i is NULL. - bool i_shallow ; // if true, A->i is shallow. + int64_t *j ; // if triplet: column indices, of size nzmax. // if CSC or dense: A->j is NULL. - bool j_shallow ; // if true, A->j is shallow. union // A->x.type has size nzmax. { @@ -456,45 +395,71 @@ typedef struct int64_t *int64 ; // A->x.int64 double *fp64 ; // A->x.fp64 } x ; + + //-------------------------------------------------------------------------- + // This component is only used for SPEX_DYNAMIC_CSC matrix, and ignored for + // CSC, triplet and dense matrix, for a future version of SPEX. + //-------------------------------------------------------------------------- + + SPEX_vector *v; // In this version of SPEX, v is always NULL, and + // should not be used. + + //-------------------------------------------------------------------------- + // flags to indicate if any component is shallow + //-------------------------------------------------------------------------- + + bool p_shallow ; // if true, A->p is shallow. + bool i_shallow ; // if true, A->i is shallow. + bool j_shallow ; // if true, A->j is shallow. bool x_shallow ; // if true, A->x.type is shallow. - mpq_t scale ; // scale factor for mpz matrices (never shallow) - // For all matrices who's type is not mpz, - // mpz_scale = 1. +} SPEX_matrix_struct ; -} SPEX_matrix ; +// A SPEX_matrix is a pointer to a SPEX_matrix_struct +typedef SPEX_matrix_struct *SPEX_matrix ; //------------------------------------------------------------------------------ // SPEX_matrix_allocate: allocate an m-by-n SPEX_matrix //------------------------------------------------------------------------------ +// 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). + +// 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 shallow is false: All components (p,i,j,x) are allocated and set to zero, // and then shallow flags are all false. // if shallow is true: All components (p,i,j,x) are NULL, and their shallow -// flags are all true. The user can then set A->p, -// A->i, A->j, and/or A->x accordingly, from their own -// arrays. +// flags are all true. SPEX_info SPEX_matrix_allocate ( - SPEX_matrix **A_handle, // matrix to allocate - SPEX_kind kind, // CSC, triplet, or dense + SPEX_matrix *A_handle, // matrix to allocate + SPEX_kind kind, // CSC, triplet, dense (and a future dynamic CSC) SPEX_type type, // mpz, mpq, mpfr, int64, or double int64_t m, // # of rows int64_t n, // # of columns - int64_t nzmax, // max # of entries + int64_t nzmax, // max # of entries for CSC or triplet + // (ignored if A is dense) bool shallow, // if true, matrix is shallow. A->p, A->i, A->j, // A->x are all returned as NULL and must be set // by the caller. All A->*_shallow are returned - // as true. + // as true. Ignored if kind is dynamic_CSC. bool init, // If true, and the data types are mpz, mpq, or // mpfr, the entries are initialized (using the // appropriate SPEX_mp*_init function). If false, - // the mpz, mpq, and mpfr arrays are allocated but - // not initialized. Meaningless for data types - // FP64 or INT64 - const SPEX_options *option + // the mpz, mpq, and mpfr arrays are malloced but + // not initialized. Utilized internally to reduce + // memory. Ignored if shallow is true. + const SPEX_options option ) ; //------------------------------------------------------------------------------ @@ -503,19 +468,29 @@ SPEX_info SPEX_matrix_allocate SPEX_info SPEX_matrix_free ( - SPEX_matrix **A_handle, // matrix to free - const SPEX_options *option + SPEX_matrix *A_handle, // matrix to free + const SPEX_options option ) ; //------------------------------------------------------------------------------ // SPEX_matrix_nnz: # of entries in a matrix //------------------------------------------------------------------------------ -SPEX_info SPEX_matrix_nnz // find the # of entries in A +SPEX_info SPEX_matrix_nnz // find the # of entries in A +( + int64_t *nnz, // # of entries in A, -1 if A is NULL + const SPEX_matrix A, // matrix to query + const SPEX_options option // command options, currently unused +) ; + +//------------------------------------------------------------------------------ +// SPEX_matrix_check: check and print a SPEX_matrix +//------------------------------------------------------------------------------ + +SPEX_info SPEX_matrix_check // returns a SPEX status code ( - int64_t *nnz, // # of entries in A, -1 if A is NULL - const SPEX_matrix *A, // matrix to query - const SPEX_options *option + const SPEX_matrix A, // matrix to check + const SPEX_options option ) ; //------------------------------------------------------------------------------ @@ -524,68 +499,174 @@ SPEX_info SPEX_matrix_nnz // find the # of entries in A // 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). + SPEX_info SPEX_matrix_copy ( - SPEX_matrix **C_handle, // matrix to create (never shallow) + SPEX_matrix *C_handle, // matrix to create (never shallow) // inputs, not modified: - SPEX_kind C_kind, // C->kind: CSC, triplet, or dense + SPEX_kind C_kind, // C->kind: CSC, triplet, dense, + // (or future dynamic CSC) SPEX_type C_type, // C->type: mpz_t, mpq_t, mpfr_t, int64_t, or double - SPEX_matrix *A, // matrix to make a copy of (may be shallow) - const SPEX_options *option + const SPEX_matrix A, // matrix to make a copy of (may be shallow) + const SPEX_options option ) ; //------------------------------------------------------------------------------ -// SPEX_matrix macros +// SPEX symbolic analysis and factorization //------------------------------------------------------------------------------ -// 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) +typedef enum +{ + SPEX_LU_FACTORIZATION = 0, // LU factorization + SPEX_CHOLESKY_FACTORIZATION = 1, // Cholesky factorization + SPEX_QR_FACTORIZATION = 2 // QR factorization (FUTURE) +} +SPEX_factorization_kind ; //------------------------------------------------------------------------------ -// SPEX_LU_analysis: symbolic pre-analysis +// SPEX_symbolic_analysis: symbolic pre-analysis //------------------------------------------------------------------------------ -// This struct stores the column permutation for LU and the estimate of the -// number of nonzeros in L and U. +// This struct stores the results of symbolic analysis + +// This object is constructed by SPEX_lu_analyze and SPEX_cholesky_analyze. +// All these functions allocate space and assign values, and thus do not +// require user to perform any memory allocation. Certain components of this +// object can still be NULL after it is constructed. User can access (read or +// print) components of this object, but should not try to modify any of them +// other than calling SPEX_symbolic_analysis_free to free the memory space. typedef struct { - int64_t *q ; // Column permutation for LU factorization, representing - // the permutation matrix Q. The matrix A*Q is factorized. - // If the kth column of L, U, and A*Q is column j of the - // unpermuted matrix A, then j = S->q [k]. - int64_t lnz ; // Approximate number of nonzeros in L. - int64_t unz ; // Approximate number of nonzeros in U. - // lnz and unz are used to allocate the initial space for - // L and U; the space is reallocated as needed. -} SPEX_LU_analysis ; - -// The symbolic analysis object is created by SPEX_LU_analyze. - -// SPEX_LU_analysis_free frees the SPEX_LU_analysis object. -SPEX_info SPEX_LU_analysis_free + SPEX_factorization_kind kind; // LU, Cholesky (or QR in the FUTURE) + + //-------------------------------------------------------------------------- + // The permutations of the matrix that are found during the symbolic + // analysis process. One or more of these permutations could be NULL for + // some SPEX_symbolic_analysis_kind. Specifically, + // For kind == SPEX_LU_FACTORIZATION, only Q_perm is not NULL. + // For kind == SPEX_CHOLESKY_FACTORIZATION, both Q_perm and Qinv_perm are + // NULL. + //-------------------------------------------------------------------------- + int64_t *P_perm; // row permutation + int64_t *Pinv_perm; // inverse of row permutation + + int64_t *Q_perm; // column permutation + int64_t *Qinv_perm; // inverse of column permutation + + //-------------------------------------------------------------------------- + // estimates of nonzeros that will apprear in the factorization + //-------------------------------------------------------------------------- + + int64_t lnz ; // Approximate number of nonzeros in L. + // Available only for SPEX_LU_FACTORIZATION + // or SPEX_CHOLESKY_FACTORIZATION. + int64_t unz ; // Approximate number of nonzeros in U. + // lnz and unz are used to allocate + // the initial space for L and U; the + // space is reallocated as needed. + // Available only for SPEX_LU_FACTORIZATION. + + //-------------------------------------------------------------------------- + // These are only used in the Cholesky analysis process + //-------------------------------------------------------------------------- + int64_t *parent; // Elimination tree of target matrix + // for Cholesky factorization. + int64_t *cp; // column pointers of L for Cholesky + // factorization. + +} SPEX_symbolic_analysis_struct ; + +// A SPEX_symbolic_analysis object is a pointer to a +// SPEX_symbolic_analysis_struct +typedef SPEX_symbolic_analysis_struct *SPEX_symbolic_analysis ; + +//------------------------------------------------------------------------------ +// SPEX_symbolic_analysis_free frees the SPEX_symbolic_analysis object. +//------------------------------------------------------------------------------ + +SPEX_info SPEX_symbolic_analysis_free ( - SPEX_LU_analysis **S, // Structure to be deleted - const SPEX_options *option + SPEX_symbolic_analysis *S_handle, // Structure to be deleted + const SPEX_options option ) ; -// SPEX_LU_analyze performs the symbolic ordering and analysis for LU factorization. -// Currently, there are three options: no ordering, COLAMD, and AMD. -SPEX_info SPEX_LU_analyze +//------------------------------------------------------------------------------ +// SPEX_factorization: data structure for factorization +//------------------------------------------------------------------------------ + +// The SPEX_factorization object holds an LU, Cholesky, or (in the future) QR +// 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, or +// SPEX_cholesky_factorize. All these function will create a +// static factorization of corresponding kind. +// +// To free the factorization object, simply call SPEX_factorization_free. + +typedef struct +{ + SPEX_factorization_kind kind; // LU, Cholesky, QR factorization + + bool updatable; // flag to denote if the factorization + // is in the updatable format + // (for a future SPEX version) + + mpq_t scale_for_A; // the scale of the target matrix + + //-------------------------------------------------------------------------- + // These are used for LU or Cholesky factorization, but ignored for QR + // factorization. + //-------------------------------------------------------------------------- + + SPEX_matrix L; // The lower-triangular matrix from LU + // or Cholesky factorization. + SPEX_matrix U; // The upper-triangular matrix from LU + // factorization. NULL for Cholesky + // factorization. + SPEX_matrix rhos; // A n-by-1 dense matrix for the + // pivot values + + + //-------------------------------------------------------------------------- + // The permutations of the matrix that are used during the factorization. + // 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 + // For kind == SPEX_CHOLESKY_FACTORIZATION, both Q_perm and Qinv_perm are + // NULL. + //-------------------------------------------------------------------------- + + int64_t *P_perm; // row permutation + int64_t *Pinv_perm; // inverse of row permutation + + int64_t *Q_perm; // column permutation + int64_t *Qinv_perm; // inverse of column permutation + +} SPEX_factorization_struct ; + +// A SPEX_factorization is a pointer to a SPEX_factorization_struct +typedef SPEX_factorization_struct *SPEX_factorization ; + +//------------------------------------------------------------------------------ +// SPEX_factorization_free frees the SPEX_factorization object. +//------------------------------------------------------------------------------ + +SPEX_info SPEX_factorization_free ( - SPEX_LU_analysis **S, // symbolic analysis (column permutation and nnz L,U) - const SPEX_matrix *A, // Input matrix - const SPEX_options *option // Control parameters + SPEX_factorization *F_handle, // Structure to be deleted + const SPEX_options option ) ; - //------------------------------------------------------------------------------ // Memory management //------------------------------------------------------------------------------ @@ -595,6 +676,7 @@ SPEX_info SPEX_LU_analyze // SuiteSparse_free. // Allocate and initialize memory space for SPEX + void *SPEX_calloc ( size_t nitems, // number of items to allocate @@ -602,12 +684,14 @@ void *SPEX_calloc ) ; // Allocate memory space for SPEX + void *SPEX_malloc ( size_t size // size of memory space to allocate ) ; // Free the memory allocated by SPEX_calloc, SPEX_malloc, or SPEX_realloc. + void SPEX_free ( void *p // pointer to memory space to free @@ -655,81 +739,73 @@ void *SPEX_realloc // pointer to reallocated block, or original block ) ; //------------------------------------------------------------------------------ -// SPEX memory environment routines +// SPEX environment routines //------------------------------------------------------------------------------ // SPEX_initialize: initializes the working evironment for SPEX library. // It must be called prior to calling any other SPEX_* function. -SPEX_info SPEX_initialize (void) ; + +SPEX_info SPEX_initialize ( void ) ; // SPEX_initialize_expert is the same as SPEX_initialize, except that it allows // for a redefinition of custom memory functions that are used for SPEX and // GMP. The four inputs to this function are pointers to four functions with // the same signatures as the ANSI C malloc, calloc, realloc, and free. + SPEX_info SPEX_initialize_expert ( - void* (*MyMalloc) (size_t), // user-defined malloc - void* (*MyCalloc) (size_t, size_t), // user-defined calloc - void* (*MyRealloc) (void *, size_t), // user-defined realloc + void *(*MyMalloc) (size_t), // user-defined malloc + void *(*MyCalloc) (size_t, size_t), // user-defined calloc + void *(*MyRealloc) (void *, size_t), // user-defined realloc void (*MyFree) (void *) // user-defined free ) ; // SPEX_finalize: This function finalizes the working evironment for SPEX // library, and frees any internal workspace created by SPEX. It must be // called as the last SPEX_* function called. -SPEX_info SPEX_finalize (void) ; - -// SPEX_matrix_check: check and print a SPEX_sparse matrix -SPEX_info SPEX_matrix_check // returns a SPEX status code +SPEX_info SPEX_finalize ( - const SPEX_matrix *A, // matrix to check - const SPEX_options* option // defines the print level + void ) ; +// SPEX is thread-safe but it requires each user thread to call +// SPEX_thread_initialize when it starts, and SPEX_thread_finalize when it +// finishes. These two functions must be called after the user's primary thread +// calls SPEX_initialize (or SPEX_initialize_experm) and before the user's +// primary thread calls SPEX_finalize. -/* Purpose: This function takes as input a mpz_t SPEX_matrix and divides - * it by an mpz_t constant storing the solution in a mpq_t dense SPEX_matrix - * array. - */ -SPEX_info SPEX_matrix_div // divides the x matrix by a scalar -( - SPEX_matrix **x2_handle, // x2 = x/scalar - SPEX_matrix* x, // input vector x - const mpz_t scalar, // the scalar - const SPEX_options *option -) ; +SPEX_info SPEX_thread_initialize ( void ) ; + +SPEX_info SPEX_thread_finalize ( void ) ; -/* Purpose: This function multiplies matrix x a scalar - */ -SPEX_info SPEX_matrix_mul // multiplies x by a scalar +//------------------------------------------------------------------------------ +// SPEX matrix utilities +//------------------------------------------------------------------------------ + +// Purpose: This function sets C = A', where A must be a SPEX_CSC matrix +// C_handle is NULL on input. On output, C_handle contains a pointer to A' + +SPEX_info SPEX_transpose ( - SPEX_matrix *x, // matrix to be multiplied - const mpz_t scalar // scalar to multiply by + SPEX_matrix *C_handle, // C = A' + SPEX_matrix A, // Matrix to be transposed + const SPEX_options option ) ; +// Purpose: Determine if the input A is symmetric. Since SPEX is an exact +// framework, the method checks if the matrix is symmetric both numerically +// and in its symbolic pattern. The method has no option for checking just +// pattern symmetry. -/* SPEX_check_solution: checks the solution of the linear system. Performs a - * quick rational arithmetic check of A*x=b. - */ -SPEX_info SPEX_check_solution -( - const SPEX_matrix *A, // input matrix - const SPEX_matrix *x, // solution vector - const SPEX_matrix *b, // right hand side - const SPEX_options* option // Command options -); - -/* Purpose: p [0..n] = cumulative sum of c [0..n-1], and then copy p [0..n-1] - * into c. This function is lightly modified from CSparse. - */ -SPEX_info SPEX_cumsum +SPEX_info SPEX_determine_symmetry ( - int64_t *p, // vector to store the sum of c - int64_t *c, // vector which is summed - int64_t n // size of c -); + bool *is_symmetric, // true if matrix is symmetric, false otherwise + const SPEX_matrix A, // Input matrix to be checked for symmetry + const SPEX_options option // Command options +) ; +// ended HERE on Apr 10. //------------------------------------------------------------------------------ //---------------------------SPEX GMP/MPFR Functions---------------------------- @@ -749,7 +825,7 @@ SPEX_info SPEX_cumsum // allocated by that function. The list is started fresh each time a GMP // function is called. If any allocation fails, the NULL pointer is not // returned to GMP. Instead, all allocated blocks in the list are freed, -// and spex_gmp_allocate returns directly to wrapper. +// and the allocation routine passed to GMP returns directly to the wrapper. SPEX_info SPEX_mpfr_asprintf (char **str, const char *format, ... ) ; @@ -757,7 +833,7 @@ SPEX_info SPEX_gmp_fscanf (FILE *fp, const char *format, ... ) ; SPEX_info SPEX_mpz_init (mpz_t x) ; -SPEX_info SPEX_mpz_init2(mpz_t x, const size_t size) ; +SPEX_info SPEX_mpz_init2(mpz_t x, const uint64_t size) ; SPEX_info SPEX_mpz_set (mpz_t x, const mpz_t y) ; @@ -765,28 +841,38 @@ SPEX_info SPEX_mpz_set_ui (mpz_t x, const uint64_t y) ; SPEX_info SPEX_mpz_set_si (mpz_t x, const int64_t y) ; +SPEX_info SPEX_mpz_swap (mpz_t x, mpz_t y); + SPEX_info SPEX_mpz_get_d (double *x, const mpz_t y) ; SPEX_info SPEX_mpz_get_si (int64_t *x, const mpz_t y) ; -SPEX_info SPEX_mpz_set_q (mpz_t x, const mpq_t y) ; - SPEX_info SPEX_mpz_mul (mpz_t a, const mpz_t b, const mpz_t c) ; -#if 0 +SPEX_info SPEX_mpz_mul_si (mpz_t a, const mpz_t b, const int64_t c) ; + +SPEX_info SPEX_mpz_sub (mpz_t a, const mpz_t b, const mpz_t c) ; + SPEX_info SPEX_mpz_add (mpz_t a, const mpz_t b, const mpz_t c) ; SPEX_info SPEX_mpz_addmul (mpz_t x, const mpz_t y, const mpz_t z) ; -#endif SPEX_info SPEX_mpz_submul (mpz_t x, const mpz_t y, const mpz_t z) ; +SPEX_info SPEX_mpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d) ; + +SPEX_info SPEX_mpz_cdiv_q (mpz_t q, const mpz_t n, const mpz_t d) ; + +SPEX_info SPEX_mpz_cdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d) ; + SPEX_info SPEX_mpz_divexact (mpz_t x, const mpz_t y, const mpz_t z) ; SPEX_info SPEX_mpz_gcd (mpz_t x, const mpz_t y, const mpz_t z) ; SPEX_info SPEX_mpz_lcm (mpz_t lcm, const mpz_t x, const mpz_t y) ; +SPEX_info SPEX_mpz_neg (mpz_t x, const mpz_t y) ; + SPEX_info SPEX_mpz_abs (mpz_t x, const mpz_t y) ; SPEX_info SPEX_mpz_cmp (int *r, const mpz_t x, const mpz_t y) ; @@ -795,6 +881,8 @@ SPEX_info SPEX_mpz_cmpabs (int *r, const mpz_t x, const mpz_t y) ; SPEX_info SPEX_mpz_cmp_ui (int *r, const mpz_t x, const uint64_t y) ; +SPEX_info SPEX_mpz_cmpabs_ui (int *r, const mpz_t x, const uint64_t y) ; + SPEX_info SPEX_mpz_sgn (int *sgn, const mpz_t x) ; SPEX_info SPEX_mpz_sizeinbase (size_t *size, const mpz_t x, int64_t base) ; @@ -805,6 +893,8 @@ SPEX_info SPEX_mpq_set (mpq_t x, const mpq_t y) ; SPEX_info SPEX_mpq_set_z (mpq_t x, const mpz_t y) ; +SPEX_info SPEX_mpq_canonicalize (mpq_t x); + SPEX_info SPEX_mpq_set_d (mpq_t x, const double y) ; SPEX_info SPEX_mpq_set_ui (mpq_t x, const uint64_t y, const uint64_t z) ; @@ -815,10 +905,10 @@ SPEX_info SPEX_mpq_set_num (mpq_t x, const mpz_t y) ; SPEX_info SPEX_mpq_set_den (mpq_t x, const mpz_t y) ; -SPEX_info SPEX_mpq_get_den (mpz_t x, const mpq_t y) ; - SPEX_info SPEX_mpq_get_d (double *x, const mpq_t y) ; +SPEX_info SPEX_mpq_neg (mpq_t x, const mpq_t y) ; + SPEX_info SPEX_mpq_abs (mpq_t x, const mpq_t y) ; SPEX_info SPEX_mpq_add (mpq_t x, const mpq_t y, const mpq_t z) ; @@ -874,83 +964,352 @@ SPEX_info SPEX_mpfr_free_cache (void) ; SPEX_info SPEX_mpfr_free_str (char *str) ; -#if 0 -// These functions are currently unused, but kept here for future reference. -SPEX_info SPEX_gmp_asprintf (char **str, const char *format, ... ) ; -SPEX_info SPEX_gmp_printf (const char *format, ... ) ; -SPEX_info SPEX_mpfr_printf ( const char *format, ... ) ; -SPEX_info SPEX_gmp_fprintf (FILE *fp, const char *format, ... ) ; -SPEX_info SPEX_mpfr_fprintf (FILE *fp, const char *format, ... ) ; -SPEX_info SPEX_mpz_set_d (mpz_t x, const double y) ; -SPEX_info SPEX_mpfr_log2(mpfr_t x, const mpfr_t y, const mpfr_rnd_t rnd) ; -#endif +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//-------------------------SPEX Left LU----------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// This portion of the SPEX library solves a sparse system of linear equations +// using the SPEX Left LU factorization. This code accompanies the paper +// (submitted to ACM Transactions on Mathematical Software): + +// "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, +// ACM Trans. Mathematical Software. pp 1-23, vol 48, no 2, 2022. + +// The theory associated with this software can be found in the paper +// (published in SIAM journal on matrix analysis and applications): + +// "Exact Solution of Sparse Linear Systems via Left-Looking +// Roundoff-Error-Free LU Factorization in Time Proportional to +// Arithmetic Work", C. Lourenco, A. R. Escobedo, E. Moreno-Centeno, +// T. Davis, SIAM J. Matrix Analysis and Applications. pp 609-638, +// vol 40, no 2, 2019. + +// 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 Left LU for a publication, we request that you please cite +// the above two papers. + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//-------------------------Authors---------------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// Christopher Lourenco, Jinhao Chen, Timothy A. Davis, and Erick Moreno-Centeno + + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//--------------------------Summary--------------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// This software package solves the linear system Ax = b exactly. The input +// matrix and right hand side vectors are stored as either integers, double +// precision numbers, multiple precision floating points (through the mpfr +// library) or as rational numbers (as a collection of numerators and +// denominators using the GMP mpq_t data structure). Appropriate routines +// within the code transform the input into an integral matrix in compressed +// column form. + +// This package computes the factorization PAQ = LDU. Note that we store the +// "functional" form of the factorization by only storing L and U. The user +// is given some freedom to select the permutation matrices P and Q. The +// recommended default settings select Q using the COLAMD column ordering +// and select P via a partial pivoting scheme in which the diagonal entry +// in column k is selected if it is the same magnitude as the smallest +// entry, otherwise the smallest entry is selected as the kth pivot. +// Alternative strategies allowed to select Q include the AMD column +// ordering or no column permutation (Q=I). For pivots, there are a variety +// of potential schemes including traditional partial pivoting, diagonal +// pivoting, tolerance pivoting etc. This package does not allow pivoting +// based on sparsity criterion. + +// The factors L and U are computed via integer preserving operations via +// integer-preserving Gaussian elimination. The key part of this algorithm +// is a Roundoff Error Free (REF) sparse triangular solve function which +// exploits sparsity to reduce the number of operations that must be +// performed. + +// Once L and U are computed, a simplified version of the triangular solve +// is performed which assumes the vector b is dense. The final solution +// vector x is gauranteed to be exact. This vector can be output in one of +// three ways: 1) full precision rational arithmetic (as a sequence of +// numerators and denominators) using the GMP mpq_t data type, 2) double +// precision while not exact will produce a solution accurate to machine +// roundoff unless the size of the associated solution exceeds double +// precision (i.e., the solution is 10^500 or something), 3) variable +// precision floating point using the GMP mpfr_t data type. The associated +// precision is user defined. -#endif //------------------------------------------------------------------------------ // Primary factorization & solve routines //------------------------------------------------------------------------------ -// SPEX_backslash solves the linear system Ax = b. This is the simplest way to -// use the SPEX Left LU package. This function encompasses both factorization and -// solve and returns the solution vector in the user desired type. It can be -// thought of as an exact version of MATLAB sparse backslash. -SPEX_info SPEX_Left_LU_backslash +// SPEX_lu_backslash solves the linear system Ax = b via LU factorization +// of A. This is the simplest way to use the SPEX Left LU package. This +// function encompasses both factorization and solve and returns the solution +// vector in the user desired type. It can be thought of as an exact version +// of MATLAB sparse backslash. +// x and b be can be single vectors, or matrices. + +SPEX_info SPEX_lu_backslash ( // Output - SPEX_matrix **X_handle, // Final solution vector + SPEX_matrix *x_handle, // Final solution vector // Input - SPEX_type type, // Type of output desired: - // Must be SPEX_MPQ, SPEX_MPFR, - // or SPEX_FP64 - const SPEX_matrix *A, // Input matrix - const SPEX_matrix *b, // Right hand side vector(s) - const SPEX_options* option + SPEX_type type, // Type of output desired. Must be + // SPEX_MPQ, SPEX_MPFR, or SPEX_FP64 + const SPEX_matrix A, // Input matrix + const SPEX_matrix b, // Right hand side vector(s) + const SPEX_options option // Command options ) ; -// SPEX_Left_LU_factorize performs the SPEX Left LU factorization. -// This factorization is done via n iterations of the sparse REF -// triangular solve function. The overall factorization is -// PAQ = LDU. The determinant can be obtained as rhos->x.mpz[n-1]. -// -// L: undefined on input, created on output -// U: undefined on input, created on output -// rhos: undefined on input, created on output -// pinv: undefined on input, created on output -// -// A: input only, not modified -// S: input only, not modified -// option: input only, not modified -SPEX_info SPEX_Left_LU_factorize +SPEX_info SPEX_lu_analyze +( + SPEX_symbolic_analysis *S_handle, // symbolic analysis including + // column perm. and nnz of L and U + const SPEX_matrix A, // Input matrix + const SPEX_options option // Control parameters, if NULL, use default +) ; + +SPEX_info SPEX_lu_factorize ( // output: - SPEX_matrix **L_handle, // lower triangular matrix - SPEX_matrix **U_handle, // upper triangular matrix - SPEX_matrix **rhos_handle, // sequence of pivots - int64_t **pinv_handle, // inverse row permutation + SPEX_factorization *F_handle, // LU factorization // input: - const SPEX_matrix *A, // matrix to be factored - const SPEX_LU_analysis *S, // column permutation and estimates - // of nnz in L and U - const SPEX_options* option + const SPEX_matrix A, // matrix to be factored + const SPEX_symbolic_analysis S, // symbolic analysis + const SPEX_options option // command options ) ; -// SPEX_Left_LU_solve solves the linear system LD^(-1)U x = b. -SPEX_info SPEX_Left_LU_solve // solves the linear system LD^(-1)U x = b +// solves the linear system Ax = b via LU factorization. +// x and b be can be single vectors, or matrices. + +SPEX_info SPEX_lu_solve // solves the linear system LD^(-1)U x = b ( // Output - SPEX_matrix **X_handle, // rational solution to the system + SPEX_matrix *x_handle, // rational solution to the system + // input/output: + SPEX_factorization F, // The LU factorization. + // Mathematically, F is unchanged. // input: - const SPEX_matrix *b, // right hand side vector - const SPEX_matrix *A, // Input matrix - const SPEX_matrix *L, // lower triangular matrix - const SPEX_matrix *U, // upper triangular matrix - const SPEX_matrix *rhos, // sequence of pivots - const SPEX_LU_analysis *S, // symbolic analysis struct - const int64_t *pinv, // inverse row permutation - const SPEX_options* option + const SPEX_matrix b, // right hand side vector(s) + const SPEX_options option // Command options +) ; + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//-------------------------SPEX Cholesky---------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// This portion of the SPEX library exactly solves a sparse symmetric positive +// definite (SPD) system of linear equations using one of two Integer- +// Preserving Cholesky factorizations. This code accompanies the paper (to be +// submitted to ACM TOMs) + +// "Algorithm 1xxx: Exactly Solving Sparse Symmetric Positive Definite +// Linear Systems via SPEX Cholesky factorization," C. Lourenco, L. Mejia +// Domenzain, E. Moreno-Centeno, T. Davis, to be submitted ACM TOMS. + +// The theory associated with this paper is found at: + +// "Exactly Solving Sparse Rational Linear Systems via Roundoff-Error-Free +// Cholesky Factorizations", C. Lourenco, E. Moreno-Centeno, +// SIAM J. Matrix Analysis and Applications. +// pp 609-638, vol 43, no 1, 2022. + +// To use this code you must first download and install the GMP, +// MPFR, AMD, and COLAMD libraries. GMP and MPFR can be found at: +// https://gmplib.org/ +// http://www.mpfr.org/ +// +// SPEX_Utilities, AMD, and COLAMD are distributed along with SPEX_Cholesky. +// The easiest way ensure these dependencies are met is to only access this +// package through the SPEX repository. +// +// All of these codes are components of the SPEX software library. This code +// may be found at: +// https://github.com/clouren/spex +// www.suitesparse.com +// +// + + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//-------------------------Authors---------------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. + + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//--------------------------Summary--------------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// This software package solves the SPD linear system Ax = b exactly. The +// key property of this package is that it can exactly solve any SPD input +// system. The input matrix and right hand side vectors are stored as +// either integers, double precision numbers, multiple precision floating +// points (through the mpfr library) or as rational numbers (as a collection +// of numerators and denominators using the GMP mpq_t data structure). +// Appropriate routines within the code transform the input into an integral +// matrix in compressed column form. + +// This package computes the factorization PAP' = LDL'. Note that we store +// the "functional" form of the factorization by only storing the matrix L. +// The user is given some freedom to select the permutation matrix P. The +// recommended default settings select P using the AMD ordering. +// Alternative strategies allowed to select P include the COLAMD +// ordering or no column permutation (P=I). + +// The factor L is computed via integer preserving operations via +// integer-preserving Gaussian elimination. The key part of this algorithm +// is a REF Sparse triangular solve function which exploits sparsity and +// symmetry to reduce the number of operations that must be performed. + +// Once L is computed, a simplified version of the triangular solve +// is performed which assumes the vector b is dense. The final solution +// vector x is gauranteed to be exact. This vector can be output in one of +// three ways: 1) full precision rational arithmetic (as a sequence of +// numerators and denominators) using the GMP mpq_t data type, 2) double +// precision while not exact will produce a solution accurate to machine +// roundoff unless the size of the associated solution exceeds double +// precision (i.e., the solution is 10^500 or something), 3) variable +// precision floating point using the GMP mpfr_t data type. The associated +// precision is user defined. + + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//-----------------------Primary SPEX Cholesky routines------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// Purpose: Compute the exact solution of Ax = b via Cholesky factorization of A +// On input, A is expected to be SPD and x is NULL +// On output, x contains the solution of the linear system + +SPEX_info SPEX_cholesky_backslash +( + // Output + SPEX_matrix *x_handle, // On input: undefined. + // On output: solution vector(s) + // Input + SPEX_type type, // Type of output desired + // Must be SPEX_FP64, SPEX_MPFR, or SPEX_MPQ + const SPEX_matrix A, // Input matrix. Must be SPEX_MPZ and SPEX_CSC + const SPEX_matrix b, // Right hand side vector(s). Must be + // SPEX_MPZ and SPEX_DENSE + const SPEX_options option // Command options (Default if NULL) +) ; + +SPEX_info SPEX_cholesky_analyze +( + // Output + SPEX_symbolic_analysis *S_handle, // Symbolic analysis data structure + // Input + const SPEX_matrix A, // Input matrix. Must be SPEX_MPZ and SPEX_CSC + const SPEX_options option // Command options (Default if NULL) +) ; + +SPEX_info SPEX_cholesky_factorize +( + // Output + SPEX_factorization *F_handle, // Cholesky factorization struct + //Input + const SPEX_matrix A, // Matrix to be factored. Must be SPEX_MPZ + // and SPEX_CSC + const SPEX_symbolic_analysis S, // Symbolic analysis struct containing the + // elimination tree of A, the column + // pointers of L, and the exact number of + // nonzeros of L. + const SPEX_options option // command options. + // Notably, option->chol_type indicates + // whether CHOL_UP (default) or CHOL_LEFT + // is used. +) ; + +// Purpose: After computing the REF Cholesky factorization A = LDL', +// this function solves the associated linear system LDL' x = b. +// +// On input x is undefined, F contains the REF Cholesky factorization +// of A (including L, rhos, and row permutation), b contains +// the user's right hand side. +// +// On output x contains the rational solution of the system LDL' x = b +// x and b be can be single vectors, or matrices. + + +SPEX_info SPEX_cholesky_solve +( + // Output + SPEX_matrix *x_handle, // On input: undefined. + // On output: Rational solution (SPEX_MPQ) + // to the system. + // input/output: + 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 Backslash-------------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +// SPEX_backslash is a wrapper for the exact routines contained within the +// SPEX software package. + +// SPEX_BACKSLASH: solve Ax=b via sparse integer-preserving factorization. +// SPEX_backslash: computes the exact solution to the sparse linear system Ax = +// b. A and b may be stored as either int64, double precision, arbitrary +// precision floating point (mpfr_t), arbitrary sized integer (mpz_t), or +// arbitrary size rational numbers (mpq_t). The result x is computed exactly, +// represented in arbitrary-precision rational values. This solution vector +// may be returned in either this rational form, or in double precision or in +// arbitrary precision floating point. +// +// A must be square. If A is SPD, an exact up-looking Cholesky factorization is +// applied. Otherwise, an exact left-looking LU functionality is applied. +// x and b be can be single vectors, or matrices. + +//------------------------------------------------------------------------------ +// Purpose: Solve Ax = b by analyzing the input matrix and applying the +// appropiate factorization approach +//------------------------------------------------------------------------------ + +SPEX_info SPEX_backslash +( + // Output + SPEX_matrix *x_handle, // On output: Final solution vector(s) + // On input: undefined + // Input + const SPEX_type type, // Type of output desired + // Must be SPEX_MPQ, SPEX_MPFR, or SPEX_FP64 + const SPEX_matrix A, // Input matrix + const SPEX_matrix b, // Right hand side vector(s) + SPEX_options option // Command options (NULL: means use defaults) ) ; #if defined ( __cplusplus ) @@ -958,3 +1317,4 @@ SPEX_info SPEX_Left_LU_solve // solves the linear system LD^(-1)U x = b #endif #endif + diff --git a/SPEX/LICENSE.txt b/SPEX/LICENSE.txt index 2803b23bac..0020fe095d 100644 --- a/SPEX/LICENSE.txt +++ b/SPEX/LICENSE.txt @@ -2,15 +2,14 @@ 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_Left_LU/License/license.txt <== +==> SPEX/LICENSE <== - SPEX Left LU: a Sparse Left-looking Integer-Preserving LU Factorization + SPEX: a SParse EXact Factorization Framework for solving SLEs - Copyright (c) 2019-2022, Christopher Lourenco, JinHao Chen, 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 http://suitesparse.com @@ -20,7 +19,7 @@ found in the lists below. -------------------------------------------------------------------------------- - SPEX Left LU is free software; you can redistribute it and/or modify + 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 @@ -35,7 +34,7 @@ found in the lists below. or both in parallel, as here. - SPEX Left LU is distributed in the hope that it will be useful, but + 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. @@ -82,6 +81,7 @@ found in the lists below. DAMAGE. ==> COLAMD/Doc/License.txt <== + COLAMD, Copyright 1998-2016, Timothy A. Davis. http://www.suitesparse.com http://www.suitesparse.com diff --git a/SPEX/MATLAB/.gitignore b/SPEX/MATLAB/.gitignore new file mode 100644 index 0000000000..21dde81f4e --- /dev/null +++ b/SPEX/MATLAB/.gitignore @@ -0,0 +1,3 @@ +# Ignore the spex_deps.m file (constructed by cmake) +spex_deps.m +!.gitignore diff --git a/SPEX/MATLAB/Source/SPEX_mex.h b/SPEX/MATLAB/Source/SPEX_mex.h new file mode 100644 index 0000000000..a951aefd59 --- /dev/null +++ b/SPEX/MATLAB/Source/SPEX_mex.h @@ -0,0 +1,131 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +// This file contains the routines for SPEX's MATLAB interface. +// The MATLAB interface can be used to solve linear systems Ax = b +// using either the left LU factorization, Cholesky factorization, +// or allowing SPEX to choose for the user the correct algorithm. + +// Note that the MATLAB interface of SPEX is intended to provide +// accurate solutions to linear systems within MATLAB. Note that there +// are two major limitations to the MATLAB interface: + +// 1) The MATLAB interface does not give access to the factors L and/or U. +// thus, one can not reuse the factors after a solution is computed (nor +// can they be updated). If a user desires this functionality, they should +// utilize the C interface. + +// +// 2) The MATLAB interface preserves 16 decimal digits of precision from +// MATLAB. That is, since the input is floating point, all numbers are +// assumed to be correct to 16 digits. This is due to the fact that +// epsilon is about 2e-16 thus, floating point numbers, such as fl(0.9) +// can not be expressed exactly. With an exact (floating-point) +// conversion, fl(0.9) is sent to SPEX as 45000000000000001 / +// 50000000000000000. Using 16 decimal digits of precision, this number is +// sent to spex as 9/10. If one wishes to preserve full floating point +// precision, they may either scale the matrix themselves within MATLAB, +// or if this is not possible, utilize the C interface, and copy the +// matrix twice. First it should be copied from SPEX_FP64 (double) to +// SPEX_MPFR and then from SPEX_MPFR to SPEX_MPQ. Either of these options +// will preserve as much floating-point precision as the user desires. + +#ifndef SPEX_BACKSLASH_MEX_H +#define SPEX_BACKSLASH_MEX_H + +#include "SPEX.h" +#include "matrix.h" +#include "mex.h" + +#define SPEX_MEX_OK(method) \ +{ \ + status = method ; \ + if (status != SPEX_OK) \ + { \ + spex_mex_error (status, "") ; \ + } \ +} + + +/* These enums determine the type of output desired by the user + */ +typedef enum +{ + SPEX_SOLUTION_DOUBLE = 0, // x as double + SPEX_SOLUTION_VPA = 1, // return x as vpa + SPEX_SOLUTION_CHAR = 2 // x as cell strings +} +SPEX_solution ; + + +typedef struct spex_mex_options +{ + SPEX_solution solution ; // how should x be returned to MATLAB + int32_t digits ; // # of digits to use for vpa +} +spex_mex_options ; + +/* Purpose: A GMP reallocation function + * This allows GMP to use MATLAB's default realloc function + */ +void *SPEX_gmp_mex_realloc +( + void *x, // void * to be reallocated + size_t a, // Previous size + size_t b // New size +); + +/* Purpose: A GMP free function. This allows GMP to use + * MATLAB's mxFree instead of free + */ +void SPEX_gmp_mex_free +( + void *x, // void * to be freed + size_t a // Size +); + +/* Purpose: get command options from MATLAB + */ +void spex_mex_get_matlab_options +( + SPEX_options option, // Control parameters + spex_mex_options *mexoptions, // MATLAB-specific options + const mxArray* input // options struct, may be NULL +) ; + +// Purpose: This function checks if the array x contains Inf's, NaN's, or +// if its values can be represented as int64_t values. + +bool spex_mex_check_for_inf // true if x can be represented as int64_t +( + double *x, // The array of numeric values + mwSize n // size of array +) ; + +/* Purpose: This function reads in the A matrix and right hand side vectors. */ +void spex_mex_get_A_and_b +( + SPEX_matrix *A_handle, // Internal SPEX Mat stored in CSC + SPEX_matrix *b_handle, // mpz matrix used internally + const mxArray* pargin[], // The input A matrix and options + SPEX_options option +) ; + +/* Purpose: Report errors if they arise + */ +void spex_mex_error +( + SPEX_info status, + char *message +) ; + +#endif + diff --git a/SPEX/MATLAB/Source/spex_mex_check_for_inf.c b/SPEX/MATLAB/Source/spex_mex_check_for_inf.c new file mode 100644 index 0000000000..6242b4f381 --- /dev/null +++ b/SPEX/MATLAB/Source/spex_mex_check_for_inf.c @@ -0,0 +1,67 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This function checks if the array x contains Inf's, NaN's, or + * if its values can be represented as int64_t values, useful for input + * arguments. + */ + +#include "SPEX_mex.h" + +bool spex_mex_check_for_inf // true if x can be represented as int64_t +( + double *x, // The array of numeric values + mwSize n // size of array +) +{ + // Assume it is int64 + bool x_is_int64 = true ; + + // Iterate through all entries + for (mwSize k = 0; k < n; k++) + { + double xk = x [k] ; + + // Check if inf + if (mxIsInf (xk)) + { + spex_mex_error (1, "A must not have any Inf values"); + } + + // Check if NAN + if (mxIsNaN (xk)) + { + spex_mex_error (1, "A must not have any NaN values"); + } + + // Check if int64 + if (x_is_int64) + { + if (xk < INT64_MIN || xk > INT64_MAX) + { + x_is_int64 = false ; + break; + } + else + { + int64_t xi = (int64_t) xk ; + if ((double) xi != xk) + { + x_is_int64 = false ; + break; + } + } + } + } + + return (x_is_int64); +} + diff --git a/SPEX/MATLAB/Source/spex_mex_error.c b/SPEX/MATLAB/Source/spex_mex_error.c new file mode 100644 index 0000000000..3d978a1a59 --- /dev/null +++ b/SPEX/MATLAB/Source/spex_mex_error.c @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This function prints error messages for MATLAB for debugging */ + +#include "SPEX_mex.h" + +void spex_mex_error +( + SPEX_info status, + char *message +) +{ + + switch (status) + { + case SPEX_OK : // all is well + return ; + + case SPEX_OUT_OF_MEMORY : // out of memory + SPEX_finalize ( ); + mexErrMsgTxt ("out of memory"); + + case SPEX_SINGULAR : // the input matrix A is singular + SPEX_finalize ( ); + mexErrMsgTxt ("input matrix is singular"); + + case SPEX_INCORRECT_INPUT : // one or more input arguments are + // incorrect + SPEX_finalize ( ); + mexErrMsgTxt ("invalid inputs"); + + + case SPEX_PANIC : // SPEX used without proper + // initialization + SPEX_finalize ( ); + mexErrMsgTxt ("panic"); + + default : + SPEX_finalize ( ); + mexErrMsgTxt (message); + } +} + diff --git a/SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_mex_get_A_and_b.c b/SPEX/MATLAB/Source/spex_mex_get_A_and_b.c similarity index 70% rename from SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_mex_get_A_and_b.c rename to SPEX/MATLAB/Source/spex_mex_get_A_and_b.c index 9c81ce8f20..f9c32d3d42 100644 --- a/SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_mex_get_A_and_b.c +++ b/SPEX/MATLAB/Source/spex_mex_get_A_and_b.c @@ -1,23 +1,24 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/MATLAB/spex_left_lu_mex_get_A_and_b: Obtain user's A and b matrices +// SPEX/MATLAB/SPEX_mex_get_A_and_b.c: convert A&b to SPEX matrices //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ /* Purpose: This function reads in the A matrix and right hand side vectors. */ -#include "SPEX_Left_LU_mex.h" +#include "SPEX_mex.h" -void spex_left_lu_mex_get_A_and_b +void spex_mex_get_A_and_b ( - SPEX_matrix **A_handle, // Internal SPEX Mat stored in CSC - SPEX_matrix **b_handle, // mpz matrix used internally + SPEX_matrix *A_handle, // Internal SPEX Mat stored in CSC + SPEX_matrix *b_handle, // mpz matrix used internally const mxArray* pargin[], // The input A matrix and options - SPEX_options* option + SPEX_options option ) { @@ -27,7 +28,7 @@ void spex_left_lu_mex_get_A_and_b if (!A_handle || !pargin) { - spex_left_lu_mex_error (SPEX_INCORRECT_INPUT, ""); + spex_mex_error (SPEX_INCORRECT_INPUT, ""); } (*A_handle) = NULL ; @@ -45,36 +46,37 @@ void spex_left_lu_mex_get_A_and_b //-------------------------------------------------------------------------- // Read in Ap, Ai, Ax - Ap = (int64_t *) mxGetJc (pargin[0]) ; - Ai = (int64_t *) mxGetIr (pargin[0]) ; - Ax = mxGetDoubles (pargin[0]) ; + Ap = (int64_t *) mxGetJc (pargin[0]); + Ai = (int64_t *) mxGetIr (pargin[0]); + Ax = mxGetDoubles (pargin[0]); + if (!Ai || !Ap || !Ax) { - spex_left_lu_mex_error (SPEX_INCORRECT_INPUT, "") ; + spex_mex_error (SPEX_INCORRECT_INPUT, ""); } // Get info about A - nA = (int64_t) mxGetN (pargin[0]) ; - mA = (int64_t) mxGetM (pargin[0]) ; + nA = (int64_t) mxGetN (pargin[0]); + mA = (int64_t) mxGetM (pargin[0]); Anz = Ap[nA]; if (nA != mA) { - spex_left_lu_mex_error (1, "A must be square") ; + spex_mex_error (1, "A must be square"); } // check the values of A - bool A_has_int64_values = spex_left_lu_mex_check_for_inf (Ax, Anz) ; + bool A_has_int64_values = spex_mex_check_for_inf (Ax, Anz); - SPEX_matrix* A = NULL; - SPEX_matrix* A_matlab = NULL; + SPEX_matrix A = NULL; + SPEX_matrix A_matlab = NULL; if (A_has_int64_values) { // All entries in A can be typecast to int64_t without change in value. - int64_t *Ax_int64 = (int64_t*) SPEX_malloc (Anz* sizeof (int64_t)) ; + int64_t *Ax_int64 = (int64_t*) SPEX_malloc (Anz* sizeof (int64_t)); if (!Ax_int64) { - spex_left_lu_mex_error (SPEX_OUT_OF_MEMORY, "") ; + spex_mex_error (SPEX_OUT_OF_MEMORY, ""); } for (k = 0; k < Anz; k++) { @@ -105,36 +107,36 @@ void spex_left_lu_mex_get_A_and_b A_matlab->i = Ai ; // scale A and convert to MPZ - SPEX_MEX_OK (SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, A_matlab, option)) ; + SPEX_MEX_OK (SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, A_matlab, option)); // free the shallow copy of A - SPEX_MEX_OK (SPEX_matrix_free (&A_matlab, option)) ; + SPEX_MEX_OK (SPEX_matrix_free (&A_matlab, option)); //-------------------------------------------------------------------------- // Read in b //-------------------------------------------------------------------------- - SPEX_matrix* b = NULL; - SPEX_matrix* b_matlab = NULL; + SPEX_matrix b = NULL; + SPEX_matrix b_matlab = NULL; - bx = mxGetDoubles (pargin[1]) ; + bx = mxGetDoubles (pargin[1]); if (!bx) { - spex_left_lu_mex_error (SPEX_INCORRECT_INPUT, "") ; + spex_mex_error (SPEX_INCORRECT_INPUT, ""); } // Get info about RHS vector (s) - nb = mxGetN (pargin[1]) ; - mb = mxGetM (pargin[1]) ; + nb = mxGetN (pargin[1]); + mb = mxGetM (pargin[1]); if (mb != mA) { - spex_left_lu_mex_error (1, "dimension mismatch") ; + spex_mex_error (1, "dimension mismatch"); } int64_t count = 0; // check the values of b - bool b_has_int64_values = spex_left_lu_mex_check_for_inf (bx, nb*mb) ; + bool b_has_int64_values = spex_mex_check_for_inf (bx, nb*mb); if (b_has_int64_values) { @@ -162,10 +164,10 @@ void spex_left_lu_mex_get_A_and_b } // scale b and convert to MPZ - SPEX_MEX_OK (SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, b_matlab, option)) ; + SPEX_MEX_OK (SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, b_matlab, option)); // free the shallow copy of b - SPEX_MEX_OK (SPEX_matrix_free (&b_matlab, option)) ; + SPEX_MEX_OK (SPEX_matrix_free (&b_matlab, option)); (*A_handle) = A; (*b_handle) = b; diff --git a/SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_get_matlab_options.c b/SPEX/MATLAB/Source/spex_mex_get_matlab_options.c similarity index 77% rename from SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_get_matlab_options.c rename to SPEX/MATLAB/Source/spex_mex_get_matlab_options.c index f7879dc5cf..624b1f8710 100644 --- a/SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_get_matlab_options.c +++ b/SPEX/MATLAB/Source/spex_mex_get_matlab_options.c @@ -1,23 +1,28 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/MATLAB/spex_get_matlab_options: Set factorization options +// SPEX/MATLAB/SPEX_mex_get_matlab_optons.c: Get command options from user //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ -#include "SPEX_Left_LU_mex.h" +/* Purpose: This function reads in the necessary information from the options + * struct for MATLAB. + */ -// Purpose: This function reads in the necessary information from the options -// struct for MATLAB. + +#include "SPEX_mex.h" #define MATCH(s,t) (strcmp (s,t) == 0) +#define SPEX_MIN(a,b) ( a < b ? a : b) +#define SPEX_MAX(a,b) (a > b ? a : b) -void spex_left_lu_get_matlab_options +void spex_mex_get_matlab_options ( - SPEX_options* option, // Control parameters + SPEX_options option, // Control parameters spex_mex_options *mexoptions, // MATLAB-specific options const mxArray* input // options struct, may be NULL ) @@ -31,8 +36,8 @@ void spex_left_lu_get_matlab_options #define LEN 256 char string [LEN+1] ; - // true if input options struct is present - bool present = (input != NULL) && !mxIsEmpty (input) && mxIsStruct (input) ; + // true if input options struct is present + bool present = (input != NULL) && !mxIsEmpty (input) && mxIsStruct (input); //-------------------------------------------------------------------------- // Get the column ordering @@ -42,8 +47,11 @@ void spex_left_lu_get_matlab_options field = present ? mxGetField (input, 0, "order") : NULL ; if (field != NULL) { - if (!mxIsChar (field)) spex_left_lu_mex_error (1, "option.order must be a string") ; - mxGetString (field, string, LEN) ; + if (!mxIsChar (field)) + { + spex_mex_error (1, "option.order must be a string"); + } + mxGetString (field, string, LEN); if (MATCH (string, "none")) { option->order = SPEX_NO_ORDERING ; // None: A is factorized as-is @@ -58,7 +66,7 @@ void spex_left_lu_get_matlab_options } else { - spex_left_lu_mex_error (1, "unknown option.order") ; + spex_mex_error (1, "unknown option.order"); } } @@ -70,8 +78,11 @@ void spex_left_lu_get_matlab_options field = present ? mxGetField (input, 0, "pivot") : NULL ; if (field != NULL) { - if (!mxIsChar (field)) spex_left_lu_mex_error (1, "option.pivot must be a string") ; - mxGetString (field, string, LEN) ; + if (!mxIsChar (field)) + { + spex_mex_error (1, "option.pivot must be a string"); + } + mxGetString (field, string, LEN); if (MATCH (string, "smallest")) { option->pivot = SPEX_SMALLEST ; // Smallest pivot @@ -100,7 +111,7 @@ void spex_left_lu_get_matlab_options } else { - spex_left_lu_mex_error (1, "unknown option.pivot") ; + spex_mex_error (1, "unknown option.pivot"); } } @@ -114,11 +125,11 @@ void spex_left_lu_get_matlab_options field = present ? mxGetField (input, 0, "tol") : NULL ; if (field != NULL) { - option->tol = mxGetScalar (field) ; + option->tol = mxGetScalar (field); if (option->tol > 1 || option->tol <= 0) { - spex_left_lu_mex_error (1, "invalid option.tol, " - "must be > 0 and <= 1") ; + spex_mex_error (1, "invalid option.tol, " + "must be > 0 and <= 1"); } } } @@ -131,7 +142,7 @@ void spex_left_lu_get_matlab_options field = present ? mxGetField (input, 0, "solution") : NULL ; if (field != NULL) { - mxGetString (field, string, LEN) ; + mxGetString (field, string, LEN); if (MATCH (string, "vpa")) { mexoptions->solution = SPEX_SOLUTION_VPA ; // return x as vpa @@ -146,7 +157,7 @@ void spex_left_lu_get_matlab_options } else { - spex_left_lu_mex_error (1, "unknown option.solution") ; + spex_mex_error (1, "unknown option.solution"); } } @@ -158,12 +169,12 @@ void spex_left_lu_get_matlab_options field = present ? mxGetField (input, 0, "digits") : NULL ; if (field != NULL) { - double d = mxGetScalar (field) ; + double d = mxGetScalar (field); if (d != trunc (d) || d < 2 || d > (1 << 29)) { // the MATLAB vpa requires digits between 2 and 2^29 - spex_left_lu_mex_error (1, "options.digits must be an integer " - "between 2 and 2^29") ; + spex_mex_error (1, "options.digits must be an integer " + "between 2 and 2^29"); } mexoptions->digits = (int32_t) d ; } @@ -177,9 +188,9 @@ void spex_left_lu_get_matlab_options if (field != NULL) { // silently convert to an integer 0, 1, 2, or 3 - option->print_level = (int) mxGetScalar (field) ; - option->print_level = SPEX_MIN (option->print_level, 3) ; - option->print_level = SPEX_MAX (option->print_level, 0) ; + option->print_level = (int) mxGetScalar (field); + option->print_level = SPEX_MIN (option->print_level, 3); + option->print_level = SPEX_MAX (option->print_level, 0); } } diff --git a/SPEX/MATLAB/spex_backslash.m b/SPEX/MATLAB/spex_backslash.m new file mode 100644 index 0000000000..73b30bdac5 --- /dev/null +++ b/SPEX/MATLAB/spex_backslash.m @@ -0,0 +1,132 @@ +function x = spex_backslash(A, b, option) +% SPEX_BACKSLASH: solve Ax=b via sparse integer-preserving factorization. +% spex_backslash: computes the exact solution to the sparse linear system Ax = b +% where A and b are stored as doubles. A must be stored as a sparse matrix. b +% must be stored as a set of dense right hand side vectors (b can be either 1 +% or multiple vector(s)). SPEX compues the result, x, exactly in +% arbitrary-precision rational numbers. The solution x can be returned in the +% following types: +% (a) [floating-poing double] - This final rational-to-double conversion means that x may no +% longer exactly solve Ax = b. +% (b) [vpa matrix] - This is the arbitrary precision type in MATLAB. +% (c) [cell array of strings] - x{i} = 'numerator/denominator', where the numerator +% and denominator are strings of decimal digits of arbitrary length. +% +% If A is SPD, an exact up-looking Cholesky factorization is applied. Otherwise, +% an exact left-looking LU factorization is applied. +% +% Usage: +% +% x = spex_backslash(A, b) returns the solution to Ax = b using default settings. +% +% x = spex_backslash(A, b, options) returns the solution to Ax = b with user +% defined settings in an options struct. Entries not present are treated as +% defaults. +% +% option.print: display the inputs and outputs +% 0: nothing (default), 1: just errors, 2: terse, 3: all +% +% option.solution: a string determining how x is to be returned: +% 'double': x is converted to a 64-bit floating-point approximate +% solution. This is the default. +% 'vpa': x is returned as a vpa array with option.digits digits (default +% is given by the MATLAB digits function). The result may be +% inexact, if an entry in x cannot be exactly represented in the +% specified number of digits. Note: the conversion from the SPEX +% exact solution (stored as a rational vector) to an arbitrary +% precision vpa number is very slow (it can be much slower than +% exactly solving the system Ax = b). +% 'char': x is returned as a cell array of strings, where +% x {i} = 'numerator/denominator' and both numerator and denominator +% are arbitrary-length strings of decimal digits. The result is +% always exact, although x cannot be directly used in MATLAB for +% numerical calculations. It can be inspected or analyzed using +% MATLAB string manipulation. Within MATLAB, x may be conversted to +% vpa, (x=vpa(x)), and then to double (x=double(vpa(x))). +% +% option.digits: the number of decimal digits to use for x, if +% option.solution is 'vpa'. Must be in range 2 to 2^29. +% +% Example: +% +% % In this first example, x = spex_backslash(A, b) returns an approximate +% % solution. Note that, since SPEX computes the solution exactly, the +% % only source of round-of-errors is the final rationa-to-double conversion. +% +% load west0479 +% A = west0479 ; +% n = size (A, 1) ; +% xtrue = rand (n,1) ; +% b = A*xtrue ; +% x = spex_backslash (A, b) ; +% err = norm (x-xtrue) +% x = A\b ; +% err = norm (x-xtrue) +% +% % In this example, x = spex_backslash(A,b) is returned exactly in the +% % MATLAB vector x, because x contains only integers representable exactly +% % in double precision. +% % In contrast using x = A\b results in floating-point roundoff error. +% +% amax = max (abs (A), [ ], 'all') ; +% A = floor (2^20 * (A / amax)) + n * speye (n) ; +% xtrue = floor (64 * xtrue) ; +% b = A*xtrue ; +% x = spex_backslash (A, b) ; +% % error and residual will be exactly zero: +% err = norm (x-xtrue) +% resid = norm (A*x-b) +% x = A\b ; +% % error and residual will be nonzero: +% err = norm (x-xtrue) +% resid = norm (A*x-b) +% +% See also vpa, spex_mex_install, spex_mex_test, spex_mex_demo. + +% spex_backslash is a wrapper for the exact routines contained within the SPEX +% software package. In order to use spex_backslash you must install the MATLAB +% 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. +% All Rights Reserved. +% SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +if (nargin < 3) + option = [ ]; % use default options +end + +if (~isnumeric(A) || ~isnumeric(b)) + error ('inputs must be numeric'); +end + +% SPEX Backslash expects sparse input. +% So, if A is not sprase it is sprasified. +if (~issparse(A)) + A = sparse(A); +end + +% Preprocessing complete. Now use SPEX Backslash to solve Ax = b. +x = spex_backslash_mex_soln(A, b, option); + +% At this point, depending on the user options, x is either +% (a) a 64-bit floating-point (i.e., double) approximate solution +% (in this case the only source of roundoff errors was the final +% conversion from a rational number to a double), or +% (b) a cell array of strings, where x {i} = 'numerator/denominator' +% and both numerator and denominator are arbitrary-length strings of decimal digits. + +% if requested, convert to vpa. +% if provided, use the requested number of digits (otherwise use +% the default in MATLAB). +if (isfield(option, 'solution') && isequal(option.solution, 'vpa')) + if (isfield(option, 'digits')) + x = vpa(x, option.digits); + else + % use the current default # of digits for vpa. The default is 32, + % but this can be changed as a global setting, by the MATLAB 'digits' + % command. + x = vpa(x); + end +end diff --git a/SPEX/MATLAB/spex_backslash_mex_soln.c b/SPEX/MATLAB/spex_backslash_mex_soln.c new file mode 100644 index 0000000000..a6b84e3a5a --- /dev/null +++ b/SPEX/MATLAB/spex_backslash_mex_soln.c @@ -0,0 +1,181 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: The .c file defining the SPEX Backslash MATLAB interface + * This function defines: x = spex_backslash_mex_soln(A, b, option) + */ + + +#include "SPEX_mex.h" + +void mexFunction +( + int nargout, + mxArray *pargout [ ], + int nargin, + const mxArray *pargin [ ] +) +{ + //-------------------------------------------------------------------------- + // Initialize SPEX Backslash library environment + //-------------------------------------------------------------------------- + + SPEX_info status; + SPEX_MEX_OK(SPEX_initialize_expert(mxMalloc, mxCalloc, mxRealloc, mxFree)); + + SuiteSparse_config_printf_func_set (mexPrintf); + + //-------------------------------------------------------------------------- + // Check that there is the correct number of input arguments + //-------------------------------------------------------------------------- + + if (nargout > 1 || nargin < 2 || nargin > 3) + { + spex_mex_error (1, "Usage: x = SPEX_backslash_soln (A,b,option)"); + } + + //-------------------------------------------------------------------------- + // check inputs for for reals and sparsity + //-------------------------------------------------------------------------- + + if (mxIsComplex(pargin [0]) || mxIsComplex(pargin [1])) + { + spex_mex_error(1, "inputs must be real"); + } + /***/ + if (!mxIsSparse(pargin [0])) // Is the matrix sparse? + { + spex_mex_error(1, "first input must be sparse"); + } + /**/ + if (mxIsSparse(pargin [1])) // Is b sparse? + { + spex_mex_error(1, "second input must be dense"); + } + + //-------------------------------------------------------------------------- + // get the input options + //-------------------------------------------------------------------------- + + SPEX_options option = NULL; + SPEX_create_default_options(&option); + if (option == NULL) + { + spex_mex_error (SPEX_OUT_OF_MEMORY, ""); + } + + spex_mex_options mexoptions; + if (nargin > 2) + { + spex_mex_get_matlab_options (option, &mexoptions, pargin [2]); + } + + //-------------------------------------------------------------------------- + // get A and b + //-------------------------------------------------------------------------- + + SPEX_matrix A = NULL ; + SPEX_matrix b = NULL ; + spex_mex_get_A_and_b (&A, &b, pargin, option); + + // Print the matrices if user specified a print level + if (option->print_level > 0) + { + printf ("\nScaled integer input matrix A:\n"); + SPEX_matrix_check (A, option); + } + + if (option->print_level > 0) + { + printf ("\nScaled integer right-hand-side b:\n"); + SPEX_matrix_check (b, option); + } + + //-------------------------------------------------------------------------- + // x = A\b via SPEX_backslash, returning result as SPEX_MPQ + //-------------------------------------------------------------------------- + + SPEX_matrix x = NULL ; + SPEX_MEX_OK(SPEX_backslash(&x, SPEX_MPQ, A, b, option)); + + //-------------------------------------------------------------------------- + // print the result, if requested + //-------------------------------------------------------------------------- + + if (option->print_level > 0) + { + printf ("\nSolution x:\n"); + SPEX_matrix_check(x, option); + } + + //-------------------------------------------------------------------------- + // return x to MATLAB + //-------------------------------------------------------------------------- + + if (mexoptions.solution == SPEX_SOLUTION_DOUBLE) + { + + //---------------------------------------------------------------------- + // return x as a double MATLAB matrix + //---------------------------------------------------------------------- + + // convert x to double + SPEX_matrix t = NULL; + SPEX_MEX_OK(SPEX_matrix_copy (&t, SPEX_DENSE, SPEX_FP64, x, option)); + SPEX_matrix_free(&x, NULL); + x = t; + t = NULL; + + // create an empty 0-by-0 MATLAB matrix and free its contents + pargout[0] = mxCreateDoubleMatrix(0, 0, mxREAL); + mxFree(mxGetDoubles(pargout[0])); + + // transplant x into the new MATLAB matrix and set its size + mxSetDoubles(pargout[0], x->x.fp64); + mxSetM(pargout[0], x->m); + mxSetN(pargout[0], x->n); + x->x.fp64 = NULL; // set to NULL so it is not freed by SPEX_matrix_free + } + else + { + + //---------------------------------------------------------------------- + // return x as a cell array of strings + //---------------------------------------------------------------------- + + pargout[0] = mxCreateCellMatrix(x->m, x->n); + int64_t mn = (x->m) * (x->n); + for (int64_t p = 0; p < mn; p++) + { + // convert x (i,j) into a C string + char *s; + status = SPEX_mpfr_asprintf(&s, "%Qd", x->x.mpq [p]); + if (status < 0) + { + spex_mex_error(1, "error converting x to string"); + } + // convert the string into a MATLAB string and store in x {i,j} + mxSetCell(pargout[0], p, mxCreateString(s)); + // free the C string + SPEX_mpfr_free_str(s); + } + } + + //-------------------------------------------------------------------------- + // free workspace + //-------------------------------------------------------------------------- + + SPEX_matrix_free(&x, option); + SPEX_matrix_free(&b, option); + SPEX_matrix_free(&A, option); + SPEX_FREE(option); + SPEX_finalize( ); +} diff --git a/SPEX/MATLAB/spex_cholesky_backslash.m b/SPEX/MATLAB/spex_cholesky_backslash.m new file mode 100644 index 0000000000..791af8aed2 --- /dev/null +++ b/SPEX/MATLAB/spex_cholesky_backslash.m @@ -0,0 +1,133 @@ +function x = spex_cholesky_backslash (A,b,option) +% spex_cholesky_BACKSLASH: solve Ax=b via sparse integer-preserving Cholesky +% spex_cholesky_backslash: computes the exact solution to the sparse linear system Ax = +% b where A and b are stored as doubles. A must be stored as a sparse matrix and be SPD. b +% must be stored as a dense set of right hand side vectors. b can be either 1 +% or multiple vector(s). The result x is computed exactly, represented in +% arbitrary-precision rational values, and then returned to MATLAB as a +% floating-poing double result. This final conversion means that x may no +% longer exactly solve A*x=b, unless this final conversion is able to be +% done without modification. +% +% x may also be returned as a vpa matrix, or a cell array of strings, with +% x {i} = 'numerator/denominator', where the numerator and denominator are +% strings of decimal digits of arbitrary length. +% +% Usage: +% +% x = spex_cholesky_backslash (A,b) returns the solution to Ax=b using default settings. +% +% x = spex_cholesky_backslash (A,b,options) returns the solution to Ax=b with user +% defined settings in an options struct. Entries not present are treated as +% defaults. +% +% option.order: Column ordering used. +% 'none': no column ordering; factorize the matrix A as-is +% 'colamd': COLAMD (the default ordering) +% 'amd': AMD +% +% option.print: display the inputs and outputs +% 0: nothing (default), 1: just errors, 2: terse, 3: all +% +% option.solution: a string determining how x is to be returned: +% 'double': x is converted to a 64-bit floating-point approximate +% solution. This is the default. +% 'vpa': x is returned as a vpa array with option.digits digits (default +% is given by the MATLAB digits function). The result may be +% inexact, if an entry in x cannot be represented in the specified +% number of digits. To convert this x to double, use x=double(x). +% 'char': x is returned as a cell array of strings, where +% x {i} = 'numerator/denominator' and both numerator and denominator +% are arbitrary-length strings of decimal digits. The result is +% always exact, although x cannot be directly used in MATLAB for +% numerical calculations. It can be inspected or analyzed using +% MATLAB string manipulation. To convert x to vpa, use x=vpa(x). To +% convert x to double, use x=double(vpa(x)). +% +% option.digits: the number of decimal digits to use for x, if +% option.solution is 'vpa'. Must be in range 2 to 2^29. +% +% Example: +% +% % In this first example, x = spex_cholesky_backslash (A,b) returns an approximate +% % solution, not because it was computed incorrectly in spex_cholesky_backslash. It +% % is computed exactly as a rational result in SPEX_backslash with arbitrary +% % precision, but then converted to double precision on output. +% +% load west0479 +% A = west0479 ; +% A = A'*A; +% n = size (A, 1) ; +% xtrue = rand (n,1) ; +% b = A*xtrue ; +% x = spex_cholesky_backslash (A, b) ; +% err = norm (x-xtrue) +% x = A\b ; +% err = norm (x-xtrue) +% +% % In this example, x = spex_cholesky_backslash (A,b) is returned exactly +% % in the MATLAB vector x, because x contains only integers representable +% % exactly in double precision. x = A\b results in floating-point +% % roundoff error. +% +% amax = max (abs (A), [ ], 'all') ; +% A = floor (2^20 * (A / amax)) + n * speye (n) ; +% xtrue = floor (64 * xtrue) ; +% b = A*xtrue ; +% x = SPEX_backslash (A, b) ; +% % error and residual will be exactly zero: +% err = norm (x-xtrue) +% resid = norm (A*x-b) +% x = A\b ; +% % error and residual will be nonzero: +% err = norm (x-xtrue) +% resid = norm (A*x-b) +% +% See also vpa, spex_mex_install, spex_mex_test, spex_mex_demo, +% spex_lu_backslash + +% spex_cholesky_backslash is a wrapper for the exact routines contained within the SPEX +% software package. In order to use spex_cholesky_backslash you must install the MATLAB +% 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. +% All Rights Reserved. +% SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +if (nargin < 3) + option = [ ]; % use default options +end + +if (~isnumeric (A) || ~isnumeric (b)) + error ('inputs must be numeric') ; +end + +% Check if the input matrix is stored as sparse. If not, SPEX Chol expects +% sparse input, so convert to sparse. +if (~issparse (A)) + A = sparse (A) ; +end + +% Ensure that input appears to be symmetric. +if ( normest(A-A') > 1e-6) + error('inputs must be symmetric') +end + + +% Preprocessing complete. Now use SPEX Chol to solve A*x=b. +x=spex_cholesky_mex_soln (A, b, option) ; + +% convert to vpa, if requested +if (isfield (option, 'solution') && isequal (option.solution, 'vpa')) + if (isfield (option, 'digits')) + x = vpa (x, option.digits) ; + else + % use the current default # of digits for vpa. The default is 32, + % but this can be changed as a global setting, by the MATLAB 'digits' + % command. + x = vpa (x) ; + end +end + diff --git a/SPEX/MATLAB/spex_cholesky_mex_soln.c b/SPEX/MATLAB/spex_cholesky_mex_soln.c new file mode 100644 index 0000000000..7684c0e20f --- /dev/null +++ b/SPEX/MATLAB/spex_cholesky_mex_soln.c @@ -0,0 +1,182 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: The .c file defining the SPEX Chol MATLAB interfacee + * This function defines: x = spex_cholesky_mex_soln (A, b, option) + */ + + +#include "SPEX_mex.h" + +void mexFunction +( + int nargout, + mxArray *pargout [ ], + int nargin, + const mxArray *pargin [ ] +) +{ + //-------------------------------------------------------------------------- + // Initialize SPEX Chol library environment + //-------------------------------------------------------------------------- + + SPEX_info status ; + SPEX_MEX_OK (SPEX_initialize_expert + (mxMalloc, mxCalloc, mxRealloc, mxFree)); + + SuiteSparse_config_printf_func_set (mexPrintf); + + //-------------------------------------------------------------------------- + // Check inputs + //-------------------------------------------------------------------------- + + if (nargout > 1 || nargin < 2 || nargin > 3) + { + spex_mex_error (1, "Usage: x = SPEX_chol_soln (A,b,option)"); + } + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + if (mxIsComplex (pargin [0]) || mxIsComplex (pargin [1])) + { + spex_mex_error (1, "inputs must be real"); + } + /***/ + if (!mxIsSparse (pargin [0])) // Is the matrix sparse? + { + spex_mex_error (1, "first input must be sparse"); + } + /**/ + if (mxIsSparse (pargin [1])) // Is b sparse? + { + spex_mex_error (1, "second input must be full"); + } + + //-------------------------------------------------------------------------- + // get the input options + //-------------------------------------------------------------------------- + + SPEX_options option = NULL; + SPEX_create_default_options(&option); + if (option == NULL) + { + spex_mex_error (SPEX_OUT_OF_MEMORY, ""); + } + + spex_mex_options mexoptions ; + if (nargin > 2) spex_mex_get_matlab_options (option, &mexoptions, pargin [2]); + + //-------------------------------------------------------------------------- + // get A and b + //-------------------------------------------------------------------------- + + SPEX_matrix A = NULL ; + SPEX_matrix b = NULL ; + spex_mex_get_A_and_b (&A, &b, pargin, option); +/**/ + if (option->print_level > 0) + { + printf ("\nScaled integer input matrix A:\n"); + SPEX_matrix_check (A, option); + } + + if (option->print_level > 0) + { + printf ("\nScaled integer right-hand-side b:\n"); + SPEX_matrix_check (b, option); + } + + //-------------------------------------------------------------------------- + // x = A\b via SPEX_Chol, returning result as SPEX_MPQ + //-------------------------------------------------------------------------- + + SPEX_matrix x = NULL ; + SPEX_MEX_OK (SPEX_cholesky_backslash (&x, SPEX_MPQ, A, b, option)); + + //-------------------------------------------------------------------------- + // print the result, if requested + //-------------------------------------------------------------------------- + + if (option->print_level > 0) + { + printf ("\nSolution x:\n"); + SPEX_matrix_check (x, option); + } + + //-------------------------------------------------------------------------- + // return x to MATLAB + //-------------------------------------------------------------------------- + + if (mexoptions.solution == SPEX_SOLUTION_DOUBLE) + { + + //---------------------------------------------------------------------- + // return x as a double MATLAB matrix + //---------------------------------------------------------------------- + + // convert x to double + SPEX_matrix t = NULL ; + SPEX_MEX_OK (SPEX_matrix_copy (&t, SPEX_DENSE, SPEX_FP64, x, option)); + SPEX_matrix_free (&x, NULL); + x = t ; + t = NULL ; + + // create an empty 0-by-0 MATLAB matrix and free its contents + pargout [0] = mxCreateDoubleMatrix (0, 0, mxREAL); + mxFree (mxGetDoubles (pargout [0])); + + // transplant x into the new MATLAB matrix and set its size + mxSetDoubles (pargout [0], x->x.fp64); + mxSetM (pargout [0], x->m); + mxSetN (pargout [0], x->n); + x->x.fp64 = NULL ; // set to NULL so it is not freed by SPEX_matrix_free + + } + else + { + + //---------------------------------------------------------------------- + // return x as a cell array of strings + //---------------------------------------------------------------------- + + pargout [0] = mxCreateCellMatrix (x->m, x->n); + int64_t mn = (x->m) * (x->n); + for (int64_t p = 0 ; p < mn ; p++) + { + // convert x (i,j) into a C string + char *s ; + status = SPEX_mpfr_asprintf (&s, "%Qd", x->x.mpq [p]); + if (status < 0) + { + spex_mex_error (1, "error converting x to string"); + } + // convert the string into a MATLAB string and store in x {i,j} + mxSetCell (pargout [0], p, mxCreateString (s)); + // free the C string + SPEX_mpfr_free_str (s); + } + } + + //-------------------------------------------------------------------------- + // free workspace + //-------------------------------------------------------------------------- + + SPEX_matrix_free (&x, option); + SPEX_matrix_free (&b, option); + SPEX_matrix_free (&A, option); + SPEX_FREE (option); + SPEX_finalize ( ); + /**/ + +} + diff --git a/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_backslash.m b/SPEX/MATLAB/spex_lu_backslash.m similarity index 87% rename from SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_backslash.m rename to SPEX/MATLAB/spex_lu_backslash.m index dee21aa4f3..15f45be0b4 100644 --- a/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_backslash.m +++ b/SPEX/MATLAB/spex_lu_backslash.m @@ -1,6 +1,6 @@ -function x = SPEX_Left_LU_backslash (A,b,option) -% SPEX_Left_LU_BACKSLASH: solve Ax=b via sparse left-looking integer-preserving LU -% SPEX_Left_LU_backslash: computes the exact solution to the sparse linear system Ax = +function x = SPEX_lu_backslash (A,b,option) +% SPEX_LU_BACKSLASH: solve Ax=b via sparse left-looking integer-preserving LU +% spex_lu_backslash: computes the exact solution to the sparse linear system Ax = % b where A and b are stored as doubles. A must be stored as a sparse matrix. b % must be stored as a dense set of right hand side vectors. b can be either 1 % or multiple vector(s). The result x is computed exactly, represented in @@ -15,9 +15,9 @@ % % Usage: % -% x = SPEX_Left_LU_backslash (A,b) returns the solution to Ax=b using default settings. +% x = spex_lu_backslash (A,b) returns the solution to Ax=b using default settings. % -% x = SPEX_Left_LU_backslash (A,b,options) returns the solution to Ax=b with user +% x = spex_lu_backslash (A,b,options) returns the solution to Ax=b with user % defined settings in an options struct. Entries not present are treated as % defaults. % @@ -70,7 +70,7 @@ % n = size (A, 1) ; % xtrue = rand (n,1) ; % b = A*xtrue ; -% x = SPEX_Left_LU_backslash (A, b) ; +% x = spex_lu_backslash (A, b) ; % err = norm (x-xtrue) % x = A\b ; % err = norm (x-xtrue) @@ -94,9 +94,11 @@ % % See also vpa, SPEX_install, SPEX_test, SPEX_demo. -% SPEX_Left_LU_LU: (c) 2019-2020, Chris Lourenco, Jinhao Chen, Erick Moreno-Centeno, -% Timothy A. Davis, Texas A&M University. All Rights Reserved. See -% SPEX_Left_LU/License for the license. +% 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 < 3) option = [ ] ; % use default options @@ -113,7 +115,7 @@ end % Preprocessing complete. Now use SPEX Left LU to solve A*x=b. -x = SPEX_Left_LU_mex_soln (A, b, option) ; +x = spex_lu_mex_soln (A, b, option) ; % convert to vpa, if requested if (isfield (option, 'solution') && isequal (option.solution, 'vpa')) diff --git a/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_mex_soln.c b/SPEX/MATLAB/spex_lu_mex_soln.c similarity index 65% rename from SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_mex_soln.c rename to SPEX/MATLAB/spex_lu_mex_soln.c index 7df9d9c15b..151d55f87d 100644 --- a/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_mex_soln.c +++ b/SPEX/MATLAB/spex_lu_mex_soln.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU_/MATLAB/SPEX_Left_LU_mex_soln: Use SPEX Left LU within MATLAB +// SPEX/MATLAB/spex_lu_mex_soln: Use SPEX Left LU within MATLAB //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -12,7 +13,7 @@ * This function defines: x = SPEX_mex_soln (A, b, option) */ -#include "SPEX_Left_LU_mex.h" +#include "SPEX_mex.h" void mexFunction ( @@ -27,12 +28,10 @@ void mexFunction //-------------------------------------------------------------------------- SPEX_info status ; - if (!spex_initialized ( )) - { - SPEX_MEX_OK (SPEX_initialize_expert - (mxMalloc, mxCalloc, mxRealloc, mxFree)) ; - } - SuiteSparse_config_printf_func_set ((void *) mexPrintf) ; + SPEX_MEX_OK (SPEX_initialize_expert + (mxMalloc, mxCalloc, mxRealloc, mxFree)); + + SuiteSparse_config_printf_func_set (mexPrintf); //-------------------------------------------------------------------------- // Check inputs @@ -40,7 +39,7 @@ void mexFunction if (nargout > 1 || nargin < 2 || nargin > 3) { - spex_left_lu_mex_error (1, "Usage: x = SPEX_mex_soln (A,b,option)") ; + spex_mex_error (1, "Usage: x = SPEX_mex_soln (A,b,option)"); } //-------------------------------------------------------------------------- @@ -49,53 +48,53 @@ void mexFunction if (mxIsComplex (pargin [0]) || mxIsComplex (pargin [1])) { - spex_left_lu_mex_error (1, "inputs must be real") ; + spex_mex_error (1, "inputs must be real"); } if (!mxIsSparse (pargin [0])) // Is the matrix sparse? { - spex_left_lu_mex_error (1, "first input must be sparse") ; + spex_mex_error (1, "first input must be sparse"); } if (mxIsSparse (pargin [1])) // Is b sparse? { - spex_left_lu_mex_error (1, "second input must be full") ; + spex_mex_error (1, "second input must be full"); } //-------------------------------------------------------------------------- // get the input options //-------------------------------------------------------------------------- - SPEX_options *option = NULL; + SPEX_options option = NULL; SPEX_MEX_OK(SPEX_create_default_options(&option)); spex_mex_options mexoptions ; - if (nargin > 2) spex_left_lu_get_matlab_options (option, &mexoptions, pargin [2]) ; + if (nargin > 2) spex_mex_get_matlab_options (option, &mexoptions, pargin [2]); //-------------------------------------------------------------------------- // get A and b //-------------------------------------------------------------------------- - SPEX_matrix *A = NULL ; - SPEX_matrix *b = NULL ; - spex_left_lu_mex_get_A_and_b (&A, &b, pargin, option) ; + SPEX_matrix A = NULL ; + SPEX_matrix b = NULL ; + spex_mex_get_A_and_b (&A, &b, pargin, option); if (option->print_level > 0) { - printf ("\nScaled integer input matrix A:\n") ; - SPEX_matrix_check (A, option) ; + printf ("\nScaled integer input matrix A:\n"); + SPEX_matrix_check (A, option); } if (option->print_level > 0) { - printf ("\nScaled integer right-hand-side b:\n") ; - SPEX_matrix_check (b, option) ; + printf ("\nScaled integer right-hand-side b:\n"); + SPEX_matrix_check (b, option); } //-------------------------------------------------------------------------- - // x = A\b via SPEX_Left_LU, returning result as SPEX_MPQ + // x = A\b via SPEX_LU, returning result as SPEX_MPQ //-------------------------------------------------------------------------- - SPEX_matrix *x = NULL ; - SPEX_MEX_OK (SPEX_Left_LU_backslash (&x, SPEX_MPQ, A, b, option)) ; + SPEX_matrix x = NULL ; + SPEX_MEX_OK (SPEX_lu_backslash (&x, SPEX_MPQ, A, b, option)); //-------------------------------------------------------------------------- // print the result, if requested @@ -103,8 +102,8 @@ void mexFunction if (option->print_level > 0) { - printf ("\nSolution x:\n") ; - SPEX_matrix_check (x, option) ; + printf ("\nSolution x:\n"); + SPEX_matrix_check (x, option); } //-------------------------------------------------------------------------- @@ -119,20 +118,20 @@ void mexFunction //---------------------------------------------------------------------- // convert x to double - SPEX_matrix* t = NULL ; - SPEX_MEX_OK (SPEX_matrix_copy (&t, SPEX_DENSE, SPEX_FP64, x, option)) ; - SPEX_matrix_free (&x, NULL) ; + SPEX_matrix t = NULL ; + SPEX_MEX_OK (SPEX_matrix_copy (&t, SPEX_DENSE, SPEX_FP64, x, option)); + SPEX_matrix_free (&x, NULL); x = t ; t = NULL ; // create an empty 0-by-0 MATLAB matrix and free its contents - pargout [0] = mxCreateDoubleMatrix (0, 0, mxREAL) ; - mxFree (mxGetDoubles (pargout [0])) ; + pargout [0] = mxCreateDoubleMatrix (0, 0, mxREAL); + mxFree (mxGetDoubles (pargout [0])); // transplant x into the new MATLAB matrix and set its size - mxSetDoubles (pargout [0], x->x.fp64) ; - mxSetM (pargout [0], x->m) ; - mxSetN (pargout [0], x->n) ; + mxSetDoubles (pargout [0], x->x.fp64); + mxSetM (pargout [0], x->m); + mxSetN (pargout [0], x->n); x->x.fp64 = NULL ; // set to NULL so it is not freed by SPEX_matrix_free } @@ -143,21 +142,21 @@ void mexFunction // return x as a cell array of strings //---------------------------------------------------------------------- - pargout [0] = mxCreateCellMatrix (x->m, x->n) ; - int64_t mn = (x->m) * (x->n) ; + pargout [0] = mxCreateCellMatrix (x->m, x->n); + int64_t mn = (x->m) * (x->n); for (int64_t p = 0 ; p < mn ; p++) { // convert x (i,j) into a C string char *s ; - status = SPEX_mpfr_asprintf (&s, "%Qd", x->x.mpq [p]) ; + status = SPEX_mpfr_asprintf (&s, "%Qd", x->x.mpq [p]); if (status < 0) { - spex_left_lu_mex_error (1, "error converting x to string") ; + spex_mex_error (1, "error converting x to string"); } // convert the string into a MATLAB string and store in x {i,j} - mxSetCell (pargout [0], p, mxCreateString (s)) ; + mxSetCell (pargout [0], p, mxCreateString (s)); // free the C string - SPEX_mpfr_free_str (s) ; + SPEX_mpfr_free_str (s); } } @@ -165,10 +164,10 @@ void mexFunction // free workspace //-------------------------------------------------------------------------- - SPEX_matrix_free (&x, option) ; - SPEX_matrix_free (&b, option) ; - SPEX_matrix_free (&A, option) ; - SPEX_FREE (option) ; - SPEX_finalize ( ) ; + SPEX_matrix_free (&x, option); + SPEX_matrix_free (&b, option); + SPEX_matrix_free (&A, option); + SPEX_FREE (option); + SPEX_finalize ( ); } diff --git a/SPEX/MATLAB/spex_mex_demo.m b/SPEX/MATLAB/spex_mex_demo.m new file mode 100644 index 0000000000..bb393a5cab --- /dev/null +++ b/SPEX/MATLAB/spex_mex_demo.m @@ -0,0 +1,159 @@ +%% spex_mex_demo a demo of SPEX MATLAB interface +% SPEX is a package for solving sparse linear systems of equations +% with a roundoff-free integer-preserving method. The result is +% always exact, unless the matrix A is perfectly singular. +% +% 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. +% All Rights Reserved. +% SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + + +format compact + +%% SPEX vs MATLAB backslash: first example +% In this first example, x = spex_backslash (A, b) ; returns an approximate +% solution, but not because it was computed incorrectly in spex_backslash. +% It is computed exactly as a rational result in spex_lu_backslash with +% arbitrary precision, but then converted to double precision on output. + +format long g +load west0479 +A = west0479 ; +n = size (A, 1) ; +xtrue = rand (n,1) ; +b = A*xtrue ; +x = spex_backslash (A, b) ; +% error is nonzero: x is computed exactly in rational arbitrary-precision, +% but then lost precision when returned to MATLAB: +err_spex = norm (x-xtrue) +x = A\b ; +% error is nonzero: MATLAB x=A\b experiences floating-point error +% throughout its computations: +err_matlab = norm (x-xtrue) + +%% SPEX backslash: exact, vs MATLAB backslash: approximate +% In this example, x = spex_backslash (A, b) ; is returned exactly in the +% MATLAB vector x, because x contains only integers representable exactly +% in double precision. x = A\b results in floating-point roundoff error. + +amax = max (abs (A), [ ], 'all') ; +A = floor (2^20 * (A / amax)) + n * speye (n) ; +xtrue = floor (64 * xtrue) ; +b = A*xtrue ; +x = spex_backslash (A, b) ; +% error will be exactly zero: +err_spex = norm (x-xtrue) +x = A\b ; +% error will be small but nonzero: +err_matlab = norm (x-xtrue) + +%% SPEX Backslash on singular problems +% The matrix 2008 is a rank deficient rectangular matrix +% If we compute A = A'*A we obtain this 9*9 integer matrix: +% +% 4 -1 -1 0 -1 0 0 -1 0 +% -1 4 0 -1 0 -1 0 -1 0 +% -1 0 4 -1 -1 0 -1 0 0 +% 0 -1 -1 4 0 -1 -1 0 0 +% -1 0 -1 0 4 -1 0 0 -1 +% 0 -1 0 -1 -1 4 0 0 -1 +% 0 0 -1 -1 0 0 4 -1 -1 +% -1 -1 0 0 0 0 -1 4 -1 +% 0 0 0 0 -1 -1 -1 -1 4 +% +% Since this is an integer matrix, SPEX can obtain it exactly. +% This matrix is ill-conditioned and singular, SPEX correctly determines +% that it is. However, MATLAB Cholesky factorization both +% succeeds and returns a useless answer. +% Note that to continue the demo, the backslash line is wrapped in a try catch +% the default behavior of SPEX is to return an error to MATLAB and exit + +fprintf("Testing singular matrix"); +prob = ssget(2008); A = prob.A; +B = full(A'*A); +b = ones(9,1); + +try x = spex_backslash (B, b) ; +catch fprintf("\nError, spex determines matrix is singular\n"); +end + +R = chol(B); +x_chol = R \ (R' \ b) + +R = vpa(chol(B)); +x_vpa = vpa ( R \ vpa( (R'\b))) + +%% SPEX on an ill-conditioned problem +% x = spex_backslash (A,b) is able to accurately solve problems that x=A\b cannot. +% Consider the following matrix in the MATLAB gallery: + +[U, b] = gallery ('wilk', 3) + +%% vpa can find a good but not perfect solution: +xvpa = vpa (U) \ b + +% but MATLAB's numerical x = U\b computes a poor solution: +xapprox = U \ b + +%% spex_backslash computes the exact answer +% It returns it to MATLAB as a double vector, obtaining the exact results + +xspex = spex_backslash (U, b) +err = xvpa - xspex +relerr = double (err (2:3) ./ xvpa (2:3)) + +%% spex_lu_backslash with exact results +% spex_lu_backslash can also return x as a cell array of strings, which +% preserves the exact rational result. The printing option is also +% enabled in this example. The floating-point matrices U and b are +% converted into a scaled integer matrix before solving U*x=b with +% SPEX Left LU. +% +% Note that, importantly, SPEX obtains an integer matrix by scaling the +% input. SPEX scales all input by 1e16. This is because consider the number +% U(1,2). The value U(1,2)=0.9 is a floating point number and cannot be +% represented exactly in IEEE floating-point. Specifically, the rational +% represenation of it is fl(0.9) = 45000000000000001 / 50000000000000000. +% +% SPEX assumes the user wants what they typed in. Scaling this matrix exactly +% gives the above rational. Conversely scaling with 16 digits of precision +% gives the exact fraction 9/10. +% +% If one wishes to obtain FULL floating-point precision and/or support +% for floating point values smaller than 1e-16 there are two options: +% +% 1) Within MATLAB the user scaes the matrix themselves. If SPEX is +% given an integer matrix it is preserved exactly +% +% 2) Within C convert the matrix to a SPEX_MPFR. MPFR numbers +% can exactly store doubles. The conversion from MPFR to integer +% is fully exact and all one would obtain the rational representation +% of the floating-point number itself. This can be done with 1 call +% to the SPEX matrix copy function. +% +% In any case, below is the exact solution with U(1,2) = 9/10 + +option.print = 3 ; % also print the details +option.solution = 'char' ; % return x as a cell array of strings + +%% + +xspex = spex_lu_backslash (U, b, option) + +%% Converting an exact rational result to vpa or double +% If spex_lu_backslash returns x as a cell array of strings, it cannot +% be immediately used in computations in MATLAB. It can be converted +% into a vpa or double matrix, as illustrated below. + +xspex_as_vpa = vpa (xspex) +xspex_as_double = double (vpa (xspex)) +xvpa_as_double = double (xvpa) + +%% Comparing the VPA and SPEX_BACKSLASH solutions in double +% Both vpa(U)\b and spex_backslash(U,b) compute the same result +% in the end, when their results are converted to double. +err = xvpa_as_double - xspex_as_double + diff --git a/SPEX/MATLAB/spex_mex_install.m b/SPEX/MATLAB/spex_mex_install.m new file mode 100644 index 0000000000..267e65cbe1 --- /dev/null +++ b/SPEX/MATLAB/spex_mex_install.m @@ -0,0 +1,128 @@ +function spex_mex_install(run_demo) +% 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. +% +% 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. +% 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') ; + +% Find all source files and add them to the src string +src = ''; +path = './Source/'; +files = dir('./Source/*.c'); +[m n] = size(files); +for k = 1:m + tmp = [' ', path, files(k).name]; + src = [src, tmp]; +end +path = '../SPEX_Utilities/Source/'; +files = dir('../SPEX_Utilities/Source/*.c'); +[m n] = size(files); +for k = 1:m + tmp = [' ', path, files(k).name]; + src = [src, tmp]; +end + +path = '../SPEX_LU/Source/'; +files = dir('../SPEX_LU/Source/*.c'); +[m n] = size(files); +for k = 1:m + tmp = [' ', path, files(k).name]; + src = [src, tmp]; +end + +path = '../SPEX_Cholesky/Source/'; +files = dir('../SPEX_Cholesky/Source/*.c'); +[m n] = size(files); +for k = 1:m + tmp = [' ', path, files(k).name]; + src = [src, tmp]; +end +path = '../SPEX_Backslash/Source/'; +files = dir('../SPEX_Backslash/Source/*.c'); +[m n] = size(files); +for k = 1:m + tmp = [' ', path, files(k).name]; + 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 ; + +% libraries: +if (isempty (suitesparse_libdir)) + suitesparse_libdir = ' ' ; +else + suitesparse_libdir = [' -L' suitesparse_libdir ' '] ; +end +libs = [suitesparse_libdir ' -lamd -lcolamd -lsuitesparseconfig ' gmp_lib ' ' mpfr_lib ' -lm'] ; + +% Path to headers +if (isempty (suitesparse_incdir)) + suitesparse_incdir = ' ' ; +else + suitesparse_incdir = ['-I' suitesparse_incdir ' '] ; +end +if (isempty (gmp_include)) + gmp_include = ' ' ; +else + gmp_include = [' -I' gmp_include ' '] ; +end +if (isempty (mpfr_include)) + mpfr_include = ' ' ; +else + mpfr_include = [' -I' mpfr_include ' '] ; +end + +includes = [ suitesparse_incdir ' -ISource/ -I../Include/ -I../../SuiteSparse_config -I../../COLAMD/Include -I../../AMD/Include -I../SPEX_Utilities/Source ' gmp_include mpfr_include ] ; + +% verbose = ' -v ' +verbose = '' ; + +% Generate the mex commands here +% having -R2018a here for function mxGetDoubles +m1 = ['mex ', verbose, ' -R2018a ', includes, ' spex_lu_mex_soln.c ' , src, ' ', flags, ' ', libs] ; +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]; + +if (~isempty (verbose)) + fprintf ('%s\n', m1) ; +end + +% Now, we evaluate each one +eval (m1) ; +eval (m2) ; +eval (m3) ; + +if (run_demo) + % Test SPEX + spex_mex_test ; +end + +fprintf ('To use SPEX MATLAB Interface in future MATLAB sessions, add the following\n') ; +fprintf ('line to your startup.m file:\n') ; +fprintf (' addpath (''%s'') ;\n', pwd) ; +fprintf ('Type ''doc startup'' for more info on how to use startup.m\n') ; +fprintf ('To run a demo, type:\n') ; +fprintf (' echodemo spex_mex_demo ;\n') ; + diff --git a/SPEX/MATLAB/spex_mex_test.m b/SPEX/MATLAB/spex_mex_test.m new file mode 100644 index 0000000000..b10f041ba7 --- /dev/null +++ b/SPEX/MATLAB/spex_mex_test.m @@ -0,0 +1,224 @@ +function spex_mex_test +% spex_mex_test: run a set of tests for SPEX matlab interface +% +% Usage: spex_mex_test +% +% 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. +% All Rights Reserved. +% SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +maxerr = 0 ; +rng ('default') ; + +fprintf ('Testing SPEX Left LU: ') ; + +% First, check if we can use a real life sparse matrix via ssget +if (exist ('ssget') ~= 0) + fprintf ('. (please wait) ') ; + % 159 is a square SPD matrix + prob = ssget(159); + A = prob.A; + [m n] = size(A); + b = rand(m, 1); + fprintf ('.') ; + x = spex_lu_backslash(A,b); + x2 = A\b; + err = norm(x-x2)/norm(x); + maxerr = max (maxerr, err) ; + + % now convert to an integer problem (x will not be integer) + A = floor (2^20 * A) ; + b = floor (2^20 * b) ; + fprintf ('.') ; + x = spex_lu_backslash (A, b) ; + x2 = A\b; + err = norm(x-x2)/norm(x); + maxerr = max (maxerr, err) ; + fprintf ('.') ; +end + +orderings = { 'none', 'colamd', 'amd' } ; +pivotings = { 'smallest', 'diagonal', 'first', ... + 'tol smallest', 'tol largest', 'largest' } ; + +for n = [1 10 100] + for density = [0.001 0.05 0.5] + + % construct a well-conditioned problem to solve + A = sprand(n,n,density); + A = A+A' + n * speye (n) ; + b = rand(n,1); + + for korder = 1:length (orderings) + for kpiv = 1:length (pivotings) + for tol = [0.1 0.5] + + clear option + option.order = orderings {korder} ; + option.pivot = pivotings {kpiv} ; + option.tol = tol ; + + fprintf ('.') ; + x = spex_lu_backslash(A,b, option); + x2 = A\b; + err = norm(x-x2)/norm(x); + maxerr = max (maxerr, err) ; + + % now convert to an integer problem (x will not be integer) + A = floor (2^20 * A) ; + b = floor (2^20 * b) ; + x = spex_lu_backslash(A,b, option); + x2 = A\b; + err = norm(x-x2)/norm(x); + maxerr = max (maxerr, err) ; + end + end + end + end +end + +fprintf ('\nmaxerr: %g\n', maxerr) ; + +if (maxerr < 1e-6) + fprintf('\nLeft LU installation successful\n') +else + error ('\nTesting failure! error too high please reinstall\n') +end + +fprintf ('Testing SPEX Cholesky: ') ; + +% First, check if we can use a real life sparse matrix via ssget +if (exist ('ssget') ~= 0) + fprintf ('. (please wait) ') ; + % 2 is a square SPD matrix + prob = ssget(2); + A = prob.A; + [m n] = size(A); + b = rand(m, 1); + fprintf ('.') ; + x = spex_cholesky_backslash(A,b); + x2 = A\b; + err = norm(x-x2)/norm(x); + maxerr = max (maxerr, err) ; + + % now convert to an integer problem (x will not be integer) + A = floor (2^20 * A) ; + b = floor (2^20 * b) ; + fprintf ('.') ; + x = spex_cholesky_backslash (A, b) ; + x2 = A\b; + err = norm(x-x2)/norm(x); + maxerr = max (maxerr, err) ; + fprintf ('.') ; +end + +orderings = { 'none', 'colamd', 'amd' } ; +%pivotings = { 'smallest', 'diagonal', 'first', ... +% 'tol smallest', 'tol largest', 'largest' } ; + +for n = [1 10 100] + for density = [0.001 0.05 0.5] + + % construct a well-conditioned problem to solve + A = sprand(n,n,density); + A = A+A' + n * speye (n) ; + b = rand(n,1); + + for korder = 1:length (orderings) + %for kpiv = 1:length (pivotings) + % for tol = [0.1 0.5] + + clear option + option.order = orderings {korder} ; +% option.pivot = pivotings {kpiv} ; +% option.tol = tol ; + + fprintf ('.') ; + x = spex_cholesky_backslash(A,b, option); + x2 = A\b; + err = norm(x-x2)/norm(x); + maxerr = max (maxerr, err) ; + + % now convert to an integer problem (x will not be integer) + A = floor (2^20 * A) ; + b = floor (2^20 * b) ; + x = spex_cholesky_backslash(A,b, option); + x2 = A\b; + err = norm(x-x2)/norm(x); + maxerr = max (maxerr, err) ; + %end + %end + end + end +end + +fprintf ('\nmaxerr: %g\n', maxerr) ; + +if (maxerr < 1e-6) + fprintf('\nSPEX Cholesky installation successful\n') +else + error ('spex_cholesky_backslash:test', '\nTesting failure! error too high, please reinstall\n') +end + + +fprintf ('Testing SPEX Backslash: ') ; +for n = [1 10 100] + for density = [0.001 0.05 0.5] + + % construct a well-conditioned problem to solve + A = sprand(n,n,density); + A = A + n*speye(n); + A2 = A+A' + n * speye (n) ; + b = rand(n,1); + + for korder = 1:length (orderings) + %for kpiv = 1:length (pivotings) + % for tol = [0.1 0.5] + + clear option + option.order = orderings {korder} ; +% option.pivot = pivotings {kpiv} ; +% option.tol = tol ; + + fprintf ('.') ; + x = spex_cholesky_backslash(A2,b, option); + x2 = A2\b; + err = norm(x-x2)/norm(x); + maxerr = max (maxerr, err) ; + + fprintf ('.') + x = spex_lu_backslash(A, b, option); + x2 = A\b; + err = norm(x-x2)/norm(x); + maxerr = max( maxerr, err); + + % now convert to an integer problem (x will not be integer) + A2 = floor (2^20 * A2) ; + b = floor (2^20 * b) ; + x = spex_cholesky_backslash(A2,b, option); + x2 = A2\b; + err = norm(x-x2)/norm(x); + maxerr = max (maxerr, err) ; + + % now convert to an integer problem (x will not be integer) + A = floor (2^20 * A) ; + x = spex_lu_backslash(A,b, option); + x2 = A\b; + err = norm(x-x2)/norm(x); + maxerr = max (maxerr, err) ; + %end + %end + end + end +end + +if (maxerr < 1e-6) + fprintf('\nSPEX Backslash installation successful\n') +else + error ('SPEX_backslash:test', '\nTesting failure! error too high. Please reinstall\n') +end + +fprintf("\nAll testing complete, ready to go!\n"); diff --git a/SPEX/Makefile b/SPEX/Makefile index 268f14acdd..cd662c172f 100644 --- a/SPEX/Makefile +++ b/SPEX/Makefile @@ -1,9 +1,10 @@ #------------------------------------------------------------------------------- -# SuiteSparse/SPEX/Makefile +# SuiteSparse/SPEX/Makefile: Makefile for SPEX #------------------------------------------------------------------------------- -# SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -# Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +# SPEX: (c) 2019-2024, 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 #------------------------------------------------------------------------------- @@ -51,14 +52,20 @@ debug: all: library -demos: library +demos: ( cd build && cmake $(CMAKE_OPTIONS) -DSUITESPARSE_DEMOS=1 .. && cmake --build . --config Release -j${JOBS} ) - ( cd SPEX_Left_LU/Demo && ../../build/example ) - ( cd SPEX_Left_LU/Demo && ../../build/example2 ) - ( cd SPEX_Left_LU/Demo && ../../build/spexlu_demo ) + ./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_threaded f ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt cov: - ( cd SPEX_Left_LU/Tcov && $(MAKE) ) + ( cd Tcov && $(MAKE) ) # just compile after running cmake; do not run cmake again remake: @@ -78,7 +85,7 @@ uninstall: # remove all files not in the distribution clean: - $(RM) -rf build/* Config/*.tmp MATLAB/*.o MATLAB/*.mex* - ( cd SPEX_Left_LU/Tcov && $(MAKE) clean ) + ( cd Tcov && $(MAKE) clean ) purge: clean diff --git a/SPEX/Python/.gitignore b/SPEX/Python/.gitignore new file mode 100644 index 0000000000..e1254e5398 --- /dev/null +++ b/SPEX/Python/.gitignore @@ -0,0 +1,7 @@ +# Ignore these files: +*.o +*.so.* +*.so +*.dylib +*.a +*.obj diff --git a/SPEX/Python/SPEXpy/Options.py b/SPEX/Python/SPEXpy/Options.py new file mode 100644 index 0000000000..85a28f7541 --- /dev/null +++ b/SPEX/Python/SPEXpy/Options.py @@ -0,0 +1,47 @@ +#------------------------------------------------------------------------------- +# SPEX/Python/utilities/Options.py: class Options +#------------------------------------------------------------------------------- + +# 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 + +#------------------------------------------------------------------------------ + +class Options: + def __init__(self, out="double", ordering=None): + self.ordering = ordering + self.output = out + + def default_lu(self): + self.ordering="colamd" + + def default_chol(self): + self.ordering="amd" + + def order(self): + + if self.ordering=="none": + order=0 + elif self.ordering=="colamd": ##colamd is the default ordering for Left LU + order=1 + elif self.ordering=="amd": ##amd is the default ordering for Cholesky + order=2 + else: + raise ValueError("Invalid order options") + + return order + + def charOut(self): + + if self.output=="double": + charOut=False + elif self.output=="string": + charOut=True + else: + raise ValueError("Invalid output type options") + + return charOut + + diff --git a/SPEX/Python/SPEXpy/SPEX_error.py b/SPEX/Python/SPEXpy/SPEX_error.py new file mode 100644 index 0000000000..5680bb2a5b --- /dev/null +++ b/SPEX/Python/SPEXpy/SPEX_error.py @@ -0,0 +1,25 @@ +#------------------------------------------------------------------------------- +# 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. +# All Rights Reserved. +# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +#------------------------------------------------------------------------------ + +class SPEX_error(LookupError): + '''raise this when there's a lookup error for spex''' + + +def determine_error(ok): + errorMessages={ + 1:"out of memory", + 2:"the input matrix A is singular", + 3:"one or more input arguments are incorrect", + 4:"the input matrix is unsymmetric", + 5:"the algorithm is not compatible with the factorization", + 6:"SPEX used without proper initialization", + } + return errorMessages.get(ok*(-1)) diff --git a/SPEX/Python/SPEXpy/Source/spex_python_connect.c b/SPEX/Python/SPEXpy/Source/spex_python_connect.c new file mode 100644 index 0000000000..728505f891 --- /dev/null +++ b/SPEX/Python/SPEXpy/Source/spex_python_connect.c @@ -0,0 +1,168 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#include "spex_python_connect.h" +#include "spex_cholesky_internal.h" + +#define FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&A, option); \ + SPEX_matrix_free(&b, option); \ + SPEX_matrix_free(&x, option); \ + SPEX_matrix_free(&A_in, option); \ + SPEX_matrix_free(&b_in, option); \ + SPEX_FREE(option); \ + SPEX_finalize(); \ +} + + +SPEX_info spex_python +( + //output + void **sol_void, // solution + //input + int64_t *Ap, // column pointers of A, an array size is n+1 + int64_t *Ai, // row indices of A, of size nzmax. + double *Ax, // values of A + double *bx, // values of b + int m, // Number of rows of A + int n, // Number of columns of A + int nz, // Number of nonzeros in A + int ordering, // type of ordering: 0-none, 1-colamd, 2-amd, + int algorithm, // 1-backslash, 2-left lu, 3-cholesky + bool charOut // True if char ** output, false if double +) +{ + // this function will make the SPEX_matrix A, b and x and call + // spex_cholesky_backslash + SPEX_info info; + + //-------------------------------------------------------------------------- + // Prior to using SPEX Chol, its environment must be initialized. This is + // done by calling the SPEX_initialize() function. + //-------------------------------------------------------------------------- + SPEX_initialize(); + + //-------------------------------------------------------------------------- + // Validate Inputs + //-------------------------------------------------------------------------- + + if (!Ap || !Ai || !Ax || !bx) + { + return SPEX_INCORRECT_INPUT; + } + + // ordering must be acceptable + if (ordering != 0 && ordering != 1 && ordering != 2) + { + return SPEX_INCORRECT_INPUT; + } + + if (n == 0 || m == 0 || n != m) + { + return SPEX_INCORRECT_INPUT; + } + + //-------------------------------------------------------------------------- + // Declare our data structures + //-------------------------------------------------------------------------- + SPEX_matrix A_in = NULL; //input matrix + SPEX_matrix b_in = NULL; //input rhs + SPEX_matrix A = NULL; //copy of input matrix in CSC MPZ + SPEX_matrix b = NULL; //copy of input rhs in CSC MPZ + SPEX_matrix x = NULL; //solution + + SPEX_options option = NULL; + SPEX_create_default_options(&option); + SPEX_preorder order_in = ordering; + option->order = ordering; + + //-------------------------------------------------------------------------- + // Allocate memory, populate in A and b + //-------------------------------------------------------------------------- + + SPEX_matrix_allocate(&A_in, SPEX_CSC, SPEX_FP64, n, n, nz, true, true, + option); + SPEX_matrix_allocate(&b_in, SPEX_DENSE, SPEX_FP64, n, 1, n, true, true, + option); + + A_in->p=Ap; + A_in->i=Ai; + A_in->x.fp64=Ax; + + b_in->x.fp64=bx; + + // At this point, A_in is a shallow double CSC matrix. We make a copy of it + // with A. A is a CSC matrix with mpz entries + + SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, A_in, option); + // b is a dense matrix with mpz entries + SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, b_in, option); + + //-------------------------------------------------------------------------- + // solve Ax=b + //------------------------------------------------------------------------- + switch(algorithm) + { + case 1: + SPEX_CHECK( SPEX_backslash(&x, SPEX_MPQ, A, b, option)); + break; + case 2: + SPEX_CHECK( SPEX_lu_backslash(&x, SPEX_MPQ, A, b, option)); + break; + case 3: + SPEX_CHECK( SPEX_cholesky_backslash(&x, SPEX_MPQ, A, b, option)); + break; + default: + return SPEX_INCORRECT_INPUT; + } + + //-------------------------------------------------------------------------- + // Return output as desired type + //----------------------------------------------------------------------- + if(charOut) + { + //solution as string + for (int i = 0; i < n; ++i) + { + char *s ; + int status = SPEX_mpfr_asprintf (&s, "%Qd", x->x.mpq [i]); + if (status < 0) + { + printf("error converting x to string"); + } + //check string size + int sizeStr; + sizeStr=strlen(s); + //allocate sol_char[i] + sol_void[i] = (void*) malloc (sizeStr*sizeof(char)); + //copy s into sol_char[i] + strcpy(sol_void[i],s); + } + } + else + { + //solution as double + SPEX_matrix x2 = NULL ; + SPEX_matrix_copy(&x2, SPEX_DENSE, SPEX_FP64, x, option); + /*for (int i = 0; i < n; ++i) + { + sol_doub[i]=x2->x.fp64[i]; + }*/ + for (int i = 0; i < n; ++i) + { + (sol_void[i])=&(x2->x.fp64[i]); + } + } + + FREE_WORKSPACE; + return SPEX_OK; +} diff --git a/SPEX/Python/SPEXpy/Source/spex_python_connect.h b/SPEX/Python/SPEXpy/Source/spex_python_connect.h new file mode 100644 index 0000000000..eb227efd49 --- /dev/null +++ b/SPEX/Python/SPEXpy/Source/spex_python_connect.h @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#include "SPEX.h" + +SPEX_info spex_python +( + //output + void **sol_void, // solution + //input + int64_t *Ap, // column pointers of A, an array size is n+1 + int64_t *Ai, // row indices of A, of size nzmax. + double *Ax, // values of A + double *bx, // values of b + int m, // Number of rows of A + int n, // Number of columns of A + int nz, // Number of nonzeros in A + int ordering, // type of ordering: 0-none, 1-colamd, 2-amd + int algorithm, // 1-backslash, 2-left lu, 3-cholesky + bool charOut // True if char ** output, false if double +); + diff --git a/SPEX/Python/SPEXpy/__init__.py b/SPEX/Python/SPEXpy/__init__.py new file mode 100644 index 0000000000..0d348eab60 --- /dev/null +++ b/SPEX/Python/SPEXpy/__init__.py @@ -0,0 +1,33 @@ +#------------------------------------------------------------------------------- +# SPEX/Python/SPEXpy/__init__.py +#------------------------------------------------------------------------------- + +# 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 + +#------------------------------------------------------------------------------ + +from .backslash import backslash +from .cholesky_backslash import cholesky_backslash +from .lu_backslash import lu_backslash + +from .spex_connect import spex_connect +from .spex_matrix_from_file import spex_matrix_from_file +from .Options import Options +from .SPEX_error import SPEX_error + +__all__=[ + 'backslash', + 'cholesky_backslash', + 'lu_backslash', + + 'spex_connect.py', + 'spex_matrix_from_file', + + 'SPEX_error', + 'Options' +] + + diff --git a/SPEX/Python/SPEXpy/backslash.py b/SPEX/Python/SPEXpy/backslash.py new file mode 100644 index 0000000000..b057b94fad --- /dev/null +++ b/SPEX/Python/SPEXpy/backslash.py @@ -0,0 +1,43 @@ +#------------------------------------------------------------------------------- +# 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. +# All Rights Reserved. +# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +#------------------------------------------------------------------------------ + +from .Options import Options +from .SPEX_error import * +from .spex_connect import spex_connect + +import scipy +from scipy.sparse import isspmatrix, isspmatrix_csc, linalg + +def backslash( A, b):#, options=Options('double')): + ## A is a scipy.sparse(data must be float64) #technically it only needs to be numerical + ## b is a numpy.array (data must be float64) + ## options is a dictionary that specifies what tipe the solution should be, this by default is double + + ##-------------------------------------------------------------------------- + ## Verify inputs + ##-------------------------------------------------------------------------- + if not isspmatrix(A): + raise SPEX_error(determine_error(3)) + ## If the sparse input matrix is not in csc form, convert it into csc form + if not isspmatrix_csc(A): + A.tocsc() + # Check input shape + if A.shape[1]!=b.shape[0]: + raise SPEX_error(determine_error(3)) + + ##-------------------------------------------------------------------------- + ## Call SPEX + ##-------------------------------------------------------------------------- + x=spex_connect(A,b,0,False,1) + #x=spex_connect(A,b,0,options.charOut(),1) #1 calls the general backslash + + return x + diff --git a/SPEX/Python/SPEXpy/cholesky_backslash.py b/SPEX/Python/SPEXpy/cholesky_backslash.py new file mode 100644 index 0000000000..bde5ff4ce1 --- /dev/null +++ b/SPEX/Python/SPEXpy/cholesky_backslash.py @@ -0,0 +1,49 @@ +#------------------------------------------------------------------------------- +# 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. +# All Rights Reserved. +# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +#------------------------------------------------------------------------------ + +from .Options import Options +from .SPEX_error import * +from .spex_connect import spex_connect + +import scipy +from scipy.sparse import isspmatrix, isspmatrix_csc, linalg + +def cholesky_backslash( A, b, options=Options('double', 'amd')): + ## A is a scipy.sparse(data must be float64) #technically it only needs to be numerical + ## b is a numpy.array (data must be float64) + ## options is a dictionary that specifies what tipe the solution should be, this by default is double + + ##-------------------------------------------------------------------------- + ## Verify inputs + ##-------------------------------------------------------------------------- + if not isspmatrix(A): + raise SPEXerror(determine_error(3)) + ## If the sparse input matrix is not in csc form, convert it into csc form + if not isspmatrix_csc(A): + A.tocsc() + ## Check symmetry + tol=1e-8 + if linalg.norm(A-A.T, scipy.Inf) > tol: + raise SPEX_error(determine_error(-4)) + # Check input shape + if A.shape[1]!=b.shape[0]: + raise SPEX_error(determine_error(-3)) + + if options.ordering==None: + options.default_chol() + + ##-------------------------------------------------------------------------- + ## Call SPEX + ##-------------------------------------------------------------------------- + x=spex_connect(A,b,options.order(),options.charOut(),3) #3 calls the Cholesky + + return x + diff --git a/SPEX/Python/SPEXpy/lu_backslash.py b/SPEX/Python/SPEXpy/lu_backslash.py new file mode 100644 index 0000000000..3810af8820 --- /dev/null +++ b/SPEX/Python/SPEXpy/lu_backslash.py @@ -0,0 +1,45 @@ +#------------------------------------------------------------------------------- +# 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. +# All Rights Reserved. +# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +#------------------------------------------------------------------------------ + +from .Options import Options +from .SPEX_error import * +from .spex_connect import spex_connect + +import scipy +from scipy.sparse import isspmatrix, isspmatrix_csc, linalg + +def lu_backslash( A, b, options=Options('double', 'colamd')): + ## A is a scipy.sparse(data must be float64) #technically it only needs to be numerical + ## b is a numpy.array (data must be float64) + ## options is a dictionary that specifies what tipe the solution should be, this by default is double + + ##-------------------------------------------------------------------------- + ## Verify inputs + ##-------------------------------------------------------------------------- + if not isspmatrix(A): + raise SPEX_error(determine_error(3)) + ## If the sparse input matrix is not in csc form, convert it into csc form + if not isspmatrix_csc(A): + A.tocsc() + # Check input shape + if A.shape[1]!=b.shape[0]: + raise SPEX_error(determine_error(3)) + + if options.ordering==None: + options.default_lu() + + ##-------------------------------------------------------------------------- + ## Call SPEX + ##-------------------------------------------------------------------------- + x=spex_connect(A,b,options.order(),options.charOut(),2) #2 calls lu + + return x + diff --git a/SPEX/Python/SPEXpy/setup.py b/SPEX/Python/SPEXpy/setup.py new file mode 100644 index 0000000000..f1ab038c1a --- /dev/null +++ b/SPEX/Python/SPEXpy/setup.py @@ -0,0 +1,15 @@ +from setuptools import find_packages, setup + +setup( + name='SPEXpy', + packages=find_packages(include=['SPEXpy']), + install_requires=[ +        'numpy', +        'scipy', +    ], + version='0.1.0', + description='Python interface for SPEX', + author='Lorena Mejia Domenzain', + license='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 new file mode 100644 index 0000000000..b8c4a1a273 --- /dev/null +++ b/SPEX/Python/SPEXpy/spex_connect.py @@ -0,0 +1,80 @@ +#------------------------------------------------------------------------------- +# 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. +# All Rights Reserved. +# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +#------------------------------------------------------------------------------ + +import ctypes +import numpy as np +from numpy.ctypeslib import ndpointer +from .SPEX_error import * + +def spex_connect( A, b, order, charOut, algorithm ): + ## A is a scipy.sparse.csc_matrix (data must be float64) #technically it only needs to be numerical + ## b is a numpy.array (data must be float64) + + ##-------------------------------------------------------------------------- + ## Load the library with the "C bridge code" + ##-------------------------------------------------------------------------- + lib = ctypes.CDLL('../build/libspexpython.so') + c_backslash = lib.spex_python + + ##-------------------------------------------------------------------------- + ## Specify the parameter types and return type of the C function + ##-------------------------------------------------------------------------- + c_backslash.argtypes = [ctypes.POINTER(ctypes.c_void_p), + ndpointer(dtype=np.int64, ndim=1, flags=None), + ndpointer(dtype=np.int64, ndim=1, flags=None), + ndpointer(dtype=np.float64, ndim=1, flags=None), + ndpointer(dtype=np.float64, ndim=1, flags=None), + ctypes.c_int, + ctypes.c_int, + ctypes.c_int, + ctypes.c_int, + ctypes.c_int, + ctypes.c_bool] + c_backslash.restype = ctypes.c_int + + n=A.shape[0] #number of columns/rows of A + + x_v = (ctypes.c_void_p*n)() + + ##-------------------------------------------------------------------------- + ## Solve Ax=b using REF Sparse Cholesky Factorization + ##-------------------------------------------------------------------------- + ok=c_backslash(x_v, + A.indptr.astype(np.int64), #without the cast it would be int32 and it would not be compatible with the C method + A.indices.astype(np.int64), + A.data.astype(np.float64), + b, + n, + n, + A.nnz, + order, + algorithm, + charOut) + + if ok!=0: + raise SPEX_error(determine_error(ok)) + + ##-------------------------------------------------------------------------- + ## Cast solution into correct type (string or double) + ##-------------------------------------------------------------------------- + if charOut: + val = ctypes.cast(x_v, ctypes.POINTER(ctypes.c_char_p)) + x=[] + for i in range(n): + x.append(val[i]) + else: + #x = ctypes.cast(x_v, ctypes.POINTER(ctypes.c_double)) + x=[] + for i in range(n): + val=ctypes.cast(x_v[i], ctypes.POINTER(ctypes.c_double)) + x.append(val[0]) ##this can also be changed to be a numpy array instead of a list + + return np.array(x) diff --git a/SPEX/Python/SPEXpy/spex_matrix_from_file.py b/SPEX/Python/SPEXpy/spex_matrix_from_file.py new file mode 100644 index 0000000000..37e151356b --- /dev/null +++ b/SPEX/Python/SPEXpy/spex_matrix_from_file.py @@ -0,0 +1,37 @@ +#------------------------------------------------------------------------------- +# 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. +# All Rights Reserved. +# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +#------------------------------------------------------------------------------ + + +import numpy as np +from scipy.sparse import coo_matrix + +def spex_matrix_from_file(fname): + #fname is the name of the file that contains matrix A + + ##-------------------------------------------------------------------------- + ## Load file data and store it in mat + ##-------------------------------------------------------------------------- + mat = np.loadtxt(fname, delimiter=' ') + + ##-------------------------------------------------------------------------- + ## Splice mat to get the componets of matrix A and populate a scipy sparse matrix + ##-------------------------------------------------------------------------- + data = mat[1:,2] + row = mat[1:,0].astype(int) + col = mat[1:,1].astype(int) + n = mat[0][0].astype(int) + m = mat[0][1].astype(int) + ## The matrix in the file is in triplet form + triplet=coo_matrix((data, (row, col)),shape=(n, m)) + ## Change the triplet matrix into a csc matrix + A = triplet.tocsc() + + return A diff --git a/SPEX/Python/spex_python_demo.py b/SPEX/Python/spex_python_demo.py new file mode 100644 index 0000000000..f1e7e01621 --- /dev/null +++ b/SPEX/Python/spex_python_demo.py @@ -0,0 +1,72 @@ +#------------------------------------------------------------------------------- +# SPEX/Python/spex_python_demo.py: demo of 3 backslash functions with different input +# matrices +#------------------------------------------------------------------------------- + +# 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 + +#------------------------------------------------------------------------------ + +# SPEX is a package for solving sparse linear systems of equations +# with a roundoff-free integer-preserving method. The result is +# always exact, unless the matrix A is perfectly singular. + +# Import SPEX +import SPEXpy as SPEX +from SPEXpy import Options + +# Import scientific computing +import numpy as np +from numpy.random import default_rng +from scipy.sparse import csc_matrix +from scipy.sparse import random +from scipy import stats + + +##-------------------------------------------------------------------------- +## Cholesky +##-------------------------------------------------------------------------- + +# Create A and B +row = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2]) +col = np.array([0, 1, 2, 0, 1, 2, 0, 1, 2]) +data = np.array([4, 12, -16, 12, 37, -43, -16, -43, 98],dtype=np.float64) +A=csc_matrix((data, (row, col)), shape=(3, 3)) +b=np.ones(3,dtype=np.float64) + +# Solve +x=SPEX.cholesky_backslash(A,b) +print(x) + + +##-------------------------------------------------------------------------- +## Left LU +##-------------------------------------------------------------------------- + +# Generate a random sparse matrix A and populate b +n=10 +rng = default_rng() +rvs = stats.poisson(25, loc=10).rvs +S = random(n, n, density=0.7, random_state=rng, data_rvs=rvs) +S2=S+np.eye(n) +A=csc_matrix(S2) +b=np.ones(n,dtype=np.float64) + +# Solve +options=Options("string") +x=SPEX.lu_backslash(A,b,options) +print(x) + +##-------------------------------------------------------------------------- +## Backslash +##-------------------------------------------------------------------------- + +# Use the previous matrices + +# Solve +x=SPEX.backslash(A,b) +print(x) +#SPEX.backslash always returns the output as float64 diff --git a/SPEX/README.md b/SPEX/README.md index 24c2748fc4..5a4b77ef03 100644 --- a/SPEX/README.md +++ b/SPEX/README.md @@ -3,51 +3,71 @@ SPEX is a software package for SParse EXact algebra Files and folders in this distribution: README.md this file - - - SPEX_Left_LU Sparse left-looking integer-preserving - LU factorization for exactly solve - sparse linear systems (Release) - + + build Contains the SPEX C library as well + as the .so files + + DOC User guide for the SPEX software package + + MATLAB MATLAB interface for the SPEX software package + + SPEX_Backslash Exactly solve sparse linear systems with + default settings. This is the easiest + starting point for the SPEX software package. + SPEX_Backslash will automatically determine the + appropriate factorization algorithm for use in + solving your problem A x = b (Developmental) + + SPEX_Cholesky Sparse integer-preserving SPEX_Cholesky + factorization for exactly solving SPD + linear systems (Developmental) + + SPEX_LU Sparse left-looking integer-preserving + LU factorization for exactly solve + sparse linear systems. (Release) + + SPEX_QR Sparse integer-preserving QR factorization + (Developmental) + + SPEX_Update Sparse column replacement and rank 1 updates + for the SPEX factorizations + SPEX_UTIL Utility functions for all SPEX components - + Makefile compiles SPEX and its dependencies Dependencies: AMD approximate minimum degree ordering - + COLAMD column approximate minimum degree ordering - + SuiteSparse_config configuration for all of SuiteSparse - - GNU GMP GNU Multiple Precision Arithmetic Library - for big integer operations - + + GNU GMP GNU Multiple Precision Arithmetic Library + for big integer operations. v6.1.2 or later + is required. + GNU MPFR GNU Multiple Precision Floating-Point Reliable Library for arbitrary precision floating point - operations + operations. v4.0.2 or later is required. -Default instalation locations: +Default installation locations: include lib share - -To compile SPEX and its dependencies, just type "make" in this folder. -To run a few short demos, type "make demos" -To install the package system-wide, type "sudo make install". -Primary Author: Chris Lourenco +To compile SPEX and its dependencies, just type "make" in this folder. +This will also run a few short demos +To install the package system-wide, copy the `lib/*` to /usr/local/lib, +and copy `include/*` to /usr/local/include. -Coauthors (alphabetical order): +Authors (alphabetical order): Jinhao Chen - Tim Davis + Timothy A. Davis + Christopher Lourenco + Lorena Mejia-Domenzain Erick Moreno-Centeno -NOTE: The cmake build system for SPEX 2.0.3 in SuiteSparse v7.0.0 -works on Windows, but (so far) only when using the MSYS2 build -system. It doesn't yet work in MS Visual Studio, because the GMP -library isn't available on Windows for MSVC (just msys2 and -cygwin). We hope to resolve this issue in the future. diff --git a/SPEX/SPEX_Util/License/CONTRIBUTOR-LICENSE.txt b/SPEX/SPEX_Backslash/License/CONTRIBUTOR-LICENSE.txt similarity index 97% rename from SPEX/SPEX_Util/License/CONTRIBUTOR-LICENSE.txt rename to SPEX/SPEX_Backslash/License/CONTRIBUTOR-LICENSE.txt index 68e035b4e9..7f8e28675b 100644 --- a/SPEX/SPEX_Util/License/CONTRIBUTOR-LICENSE.txt +++ b/SPEX/SPEX_Backslash/License/CONTRIBUTOR-LICENSE.txt @@ -1,6 +1,6 @@ -SPEX Individual Contributor License Agreement +SPEX_Backslash Individual Contributor License Agreement -Thank you for your interest in contributing to SPEX ("We" or "Us"). +Thank you for your interest in contributing to SPEX_Backslash ("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 @@ -161,8 +161,9 @@ software project managed by Us. any limited remedy to the maximum extent possible under law. Us -Christopher Lourenco, and all SPEX co-authors: +All SPEX co-authors: +Christopher Lourenco Jinhao Chen +Lorena Mejia Domenzain Timothy A. Davis Erick Moreno-Centeno - diff --git a/SPEX/SPEX_Left_LU/License/GPLv2.txt b/SPEX/SPEX_Backslash/License/GPLv2.txt similarity index 100% rename from SPEX/SPEX_Left_LU/License/GPLv2.txt rename to SPEX/SPEX_Backslash/License/GPLv2.txt diff --git a/SPEX/SPEX_Left_LU/License/lesserv3.txt b/SPEX/SPEX_Backslash/License/lesserv3.txt similarity index 100% rename from SPEX/SPEX_Left_LU/License/lesserv3.txt rename to SPEX/SPEX_Backslash/License/lesserv3.txt diff --git a/SPEX/SPEX_Util/License/license.txt b/SPEX/SPEX_Backslash/License/license.txt similarity index 88% rename from SPEX/SPEX_Util/License/license.txt rename to SPEX/SPEX_Backslash/License/license.txt index 3544ee7d76..f81e281688 100644 --- a/SPEX/SPEX_Util/License/license.txt +++ b/SPEX/SPEX_Backslash/License/license.txt @@ -1,10 +1,9 @@ -SPEX_Util: Utility functions for SParse EXact package +SPEX Backslash: -Copyright (c) 2019-2022, Christopher Lourenco, JinHao Chen, 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 http://suitesparse.com diff --git a/SPEX/SPEX_Backslash/README.md b/SPEX/SPEX_Backslash/README.md new file mode 100644 index 0000000000..9762930baf --- /dev/null +++ b/SPEX/SPEX_Backslash/README.md @@ -0,0 +1,14 @@ + +SPEX_Backslash is software package used to solve a sparse systems of linear +equations. +exactly using Integer-Preserving factorizations. + +*********SPEX_Backslash********* +Purpose: Exactly solve a sparse system of linear equations using a given input + matrix and right hand side vector file. This code can output the final + solution to a user specified output file in either double precision or + full precision rational numbers. If you intend to use SPEX_Backslash + within another program, refer to examples for help with this. + +*********SPEX_Backslash_Demo********* + Purpose: Demonstrate SPEX_Backslash for a matrix to be read in diff --git a/SPEX/SPEX_Backslash/Source/SPEX_backslash.c b/SPEX/SPEX_Backslash/Source/SPEX_backslash.c new file mode 100644 index 0000000000..76433e5082 --- /dev/null +++ b/SPEX/SPEX_Backslash/Source/SPEX_backslash.c @@ -0,0 +1,163 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: Exactly solve sparse linear systems using SPEX Software package, + * automatically determining the most appropriate factorization method. + * + * Input/Output arguments: + * + * x_handle: A pointer to the solution of the linear system. + * Null on input. The output can be in double precision, mpfr_t, or + * rational mpq_t + * + * type: Type of output desired, must be either SPEX_MPQ, + * SPEX_FP64, or SPEX_MPFR + * + * A: User's input matrix. It must be populated prior to calling this + * function. + * + * b: Collection of right hand side vectors. Must be populated prior + * to factorization. + * + * option: Struct containing various command parameters for the + * factorization. If NULL on input, default values are used. + */ + +#include "spex_util_internal.h" +#include "SPEX.h" + +SPEX_info SPEX_backslash +( + // Output + SPEX_matrix *x_handle, // On output: Final solution vector(s) + // On input: undefined + // Input + const SPEX_type type, // Type of output desired + // Must be SPEX_MPQ, SPEX_MPFR, or SPEX_FP64 + const SPEX_matrix A, // Input matrix + const SPEX_matrix b, // Right hand side vector(s) + SPEX_options option // Command options (NULL: means use defaults) +) +{ + + SPEX_info info; + // Check inputs + if (!spex_initialized()) return SPEX_PANIC; + + // Check for NULL pointers + if (!x_handle || !A || !b ) + { + return SPEX_INCORRECT_INPUT; + } + + // Check for data types and dimension of A and b + if (A->m != A->n || A->type != SPEX_MPZ || A->kind != SPEX_CSC + || b->type != SPEX_MPZ || b->kind != SPEX_DENSE) + { + return SPEX_INCORRECT_INPUT; + } + + // Check that output type is correct + if (type != SPEX_MPQ && type != SPEX_FP64 && type != SPEX_MPFR) + { + return SPEX_INCORRECT_INPUT; + } + + + SPEX_options backslash_options = NULL; + info = SPEX_create_default_options(&backslash_options); + if (info != SPEX_OK) + { + return SPEX_OUT_OF_MEMORY; + } + + if (option != NULL) + { + // IF the options are not NULL, copy the important parts. + // Otherwise do nothing + backslash_options->print_level = option->print_level; // print level + backslash_options->prec = option->prec; // MPFR precision + backslash_options->round = option->round; // MPFR rounding + } + + // Declare output + SPEX_matrix x = NULL; + + // Attempt a Cholesky factorization of A. + // If Cholesky is occuring, we update the option + // struct to do AMD and diagonal pivoting + backslash_options->order = SPEX_AMD; + backslash_options->pivot = SPEX_DIAGONAL; + + // Try SPEX Cholesky. The output for this function + // is either: + // SPEX_OK: Cholesky success, x is the exact solution + // SPEX_NOTSPD: Cholesky failed. This means + // A is not SPD. In this case, we try LU + // Other error code: Some error. Return the error code and exit + info = SPEX_cholesky_backslash(&x, type, A, b, backslash_options); + if (info == SPEX_OK) + { + // Cholesky was successful. Set x_handle = x + (*x_handle) = x; + + // x_handle contains the exact solution of Ax = b and is + // stored in the user desired type. Now, we exit and return ok + SPEX_FREE(backslash_options); + return SPEX_OK; + } + else if (info == SPEX_NOTSPD) + { + // Cholesky factorization failed. Must try + // LU factorization now + + // Since LU is occuring, we update the option + // struct to do COLAMD and small pivoting + backslash_options->order = SPEX_COLAMD; + backslash_options->pivot = SPEX_SMALLEST; + + // The LU factorization can return either: + // SPEX_OK: LU success, x is the exact solution + // Other error code: Some error. Return the error + // code and exit + info = SPEX_lu_backslash(&x, type, A, b, backslash_options); + if (info == SPEX_OK) + { + // LU success, set x_handle = x + (*x_handle) = x; + + // x_handle contains the exact solution of Ax = b and is + // stored in the user desired type. Now, we exit and return ok + SPEX_FREE(backslash_options); + return SPEX_OK; + } + else + { + // Both Cholesky and LU have failed, info contains + // the problem, most likely that A is singular + // Note that, because LU failed, x_handle is still + // NULL so there is no potential for a memory leak here + SPEX_FREE(backslash_options); + return info; + } + } + else + { + // Cholesky failed, but not due to a SPEX_NOTSPD + // error code. Most likely invalid input or out of + // memory condition. + // Note that since Cholesky failed, x_handle is still NULL + // so there is no potential for a memory leak here + SPEX_FREE(backslash_options); + return info; + } + +} diff --git a/SPEX/SPEX_Cholesky/License/CONTRIBUTOR-LICENSE.txt b/SPEX/SPEX_Cholesky/License/CONTRIBUTOR-LICENSE.txt new file mode 100644 index 0000000000..a8f18db254 --- /dev/null +++ b/SPEX/SPEX_Cholesky/License/CONTRIBUTOR-LICENSE.txt @@ -0,0 +1,169 @@ +SPEX_Cholesky Individual Contributor License Agreement + +Thank you for your interest in contributing to SPEX_Cholesky ("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 +All SPEX_Cholesky co-authors: +Christopher Lourenco +Jinhao Chen +Lorena Mejia Domenzain +Timothy A. Davis +Erick Moreno-Centeno diff --git a/SPEX/SPEX_Util/License/GPLv2.txt b/SPEX/SPEX_Cholesky/License/GPLv2.txt similarity index 100% rename from SPEX/SPEX_Util/License/GPLv2.txt rename to SPEX/SPEX_Cholesky/License/GPLv2.txt diff --git a/SPEX/SPEX_Util/License/lesserv3.txt b/SPEX/SPEX_Cholesky/License/lesserv3.txt similarity index 100% rename from SPEX/SPEX_Util/License/lesserv3.txt rename to SPEX/SPEX_Cholesky/License/lesserv3.txt diff --git a/SPEX/SPEX_Cholesky/License/license.txt b/SPEX/SPEX_Cholesky/License/license.txt new file mode 100644 index 0000000000..ac5cd4a939 --- /dev/null +++ b/SPEX/SPEX_Cholesky/License/license.txt @@ -0,0 +1,39 @@ +SPEX_Chol: Integer-Preserving Cholesky Factorization + +Copyright (c) 2020-2023, Christopher Lourenco, Jinhao Chen, +Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +All Rights Reserved. + +Available at: + https://github.com/clouren/SPEX/SPEX_Cholesky + http://suitesparse.com + +Contact Christopher Lourenco, chrisjlourenco@gmail.com, or Tim Davis +(timdavis@aldenmath.com or DrTimothyAldenDavis@gmail.com) for a commercial +license. + +-------------------------------------------------------------------------------- + +SPEX_Chol 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_Chol 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/. diff --git a/SPEX/SPEX_Cholesky/README.txt b/SPEX/SPEX_Cholesky/README.txt new file mode 100644 index 0000000000..3978bd03c8 --- /dev/null +++ b/SPEX/SPEX_Cholesky/README.txt @@ -0,0 +1,16 @@ + +SPEX_Cholesky is software package used to solve a sparse SPD linear systems exactly using the Sparse Cholesky factorization. It comprises both an integer-preserving up-looking and integer-preserving left-looking Cholesky factorization. + +*********SPEX_Cholesky********* +Purpose: Exactly solve an SPD sparse system of linear equations using a given + input matrix and right hand side vector file. This code can output the + final solution to a user specified output file in either double + precision or full precision rational numbers. If you intend to use + SPEX_Cholesky within another program, refer to examples for help with + this. + +*********example_simple********* + Purpose: Demonstrate the simple interface of SPEX_Cholesky for a matrix to be read in + +*********example_extended********* +Purpose: Demonstrate the extended interface of SPEX_Cholesky for a matrix to be read in diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c new file mode 100644 index 0000000000..05e169045f --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c @@ -0,0 +1,112 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: perform the symbolic analysis of A for the Cholesky factorization, + * that is, preordering A, computing the elimination tree, getting the column + * counts of A, setting the column pointers and exact number of non zeros of L. + * + * Input arguments of the function: + * + * S: Symbolic analysis struct for Cholesky factorization. + * On input it's NULL + * On output it contains the row/column permutation, the elimination + * tree, and the number of nonzeros in L. + * + * A: User's input matrix (Must be SPEX_MPZ and SPEX_CSC) + * + * option: Command options (Default if NULL) + * + */ + +#define SPEX_FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&PAP, NULL); \ +} + +#define SPEX_FREE_ALL \ +{ \ + SPEX_FREE_WORKSPACE ; \ + SPEX_symbolic_analysis_free (&S, option); \ +} + +#include "spex_cholesky_internal.h" + +SPEX_info SPEX_cholesky_analyze +( + // Output + SPEX_symbolic_analysis *S_handle, // Symbolic analysis data structure + // Input + const SPEX_matrix A, // Input matrix. Must be SPEX_MPZ and SPEX_CSC + const SPEX_options option // Command options (Default if NULL) +) +{ + + SPEX_info info; + // SPEX must be initialized + if (!spex_initialized()) + { + return SPEX_PANIC; + } + + // Check inputs + if ( !S_handle || !A) + { + return SPEX_INCORRECT_INPUT; + } + + // SPEX must be CSC + SPEX_REQUIRE_KIND(A, SPEX_CSC); + + // Declare permuted matrix and S + SPEX_matrix PAP = NULL; + SPEX_symbolic_analysis S = NULL; + + //-------------------------------------------------------------------------- + // Determine if A is indeed symmetric. If so, we try Cholesky. + // This symmetry check checks for both the nonzero pattern and values. + //-------------------------------------------------------------------------- + + bool is_symmetric ; + SPEX_CHECK( SPEX_determine_symmetry(&is_symmetric, A, option) ); + if (!is_symmetric) + { + SPEX_FREE_WORKSPACE ; + return SPEX_NOTSPD ; + } + + //-------------------------------------------------------------------------- + // Preorder: obtain the row/column ordering of A (Default is AMD) + //-------------------------------------------------------------------------- + + SPEX_CHECK( spex_cholesky_preorder(&S, A, option) ); + + //-------------------------------------------------------------------------- + // Permute matrix A, that is apply the row/column ordering from the + // symbolic analysis step to get the permuted matrix PAP. + //-------------------------------------------------------------------------- + + SPEX_CHECK( spex_cholesky_permute_A(&PAP, A, false, S) ); + + //-------------------------------------------------------------------------- + // Symbolic Analysis: compute the elimination tree of PAP + //-------------------------------------------------------------------------- + + SPEX_CHECK( spex_cholesky_symbolic_analysis(S, PAP, option) ); + + //-------------------------------------------------------------------------- + // Set output, free all workspace and return success + //-------------------------------------------------------------------------- + + (*S_handle) = S ; + SPEX_FREE_WORKSPACE ; + return (SPEX_OK); +} + diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c new file mode 100644 index 0000000000..575812b01a --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c @@ -0,0 +1,180 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This code utilizes the SPEX Cholesky factorization to exactly solve + * the linear system Ax = b. + * + * Input/Output arguments: + * + * x_handle: A pointer to the solution of the linear system. The output + * can be returned in double precision, + * mpfr_t (user-specified precision floating point), or + * mpq_t (rational) + * + * type: Type of output desired. + * Must be SPEX_MPQ, SPEX_FP64 or SPEX_MPFR + * + * A: User's input matrix. + * Must be populated prior to calling this function. + * + * b: Collection of right hand side vector(s). + * Must be populated prior to calling this function. + * + * option: Struct containing various command parameters for the + * factorization. If NULL on input, default values are used. + */ + +#define SPEX_FREE_WORKSPACE \ +{ \ + SPEX_factorization_free(&F, option); \ + SPEX_symbolic_analysis_free (&S, option); \ + SPEX_matrix_free (&PAP, option); \ +} + +#define SPEX_FREE_ALL \ +{ \ + SPEX_FREE_WORKSPACE \ + SPEX_matrix_free(&x, NULL); \ +} + +#include "spex_cholesky_internal.h" + +SPEX_info SPEX_cholesky_backslash +( + // Output + SPEX_matrix *x_handle, // On input: undefined. + // On output: solution vector(s) + // Input + SPEX_type type, // Type of output desired + // Must be SPEX_FP64, SPEX_MPFR, or SPEX_MPQ + const SPEX_matrix A, // Input matrix. Must be SPEX_MPZ and SPEX_CSC + const SPEX_matrix b, // Right hand side vector(s). Must be + // SPEX_MPZ and SPEX_DENSE + const SPEX_options option // Command options (Default if NULL) +) +{ + + SPEX_info info; + // SPEX must be initialized + if (!spex_initialized()) + { + return SPEX_PANIC; + } + + //------------------------------------------------------------------------- + // check inputs + //------------------------------------------------------------------------- + + // x, A, B can't be NULL + if (!x_handle || !A || !b) + { + return SPEX_INCORRECT_INPUT; + } + + // type must be acceptable + if (type != SPEX_MPQ && type != SPEX_FP64 && type != SPEX_MPFR) + { + return SPEX_INCORRECT_INPUT; + } + + // A must be the appropriate dimension + if (A->n == 0 || A->m == 0) + { + return SPEX_INCORRECT_INPUT; + } + + // Make sure A and b are in the correct format + if (A->type != SPEX_MPZ || A->kind != SPEX_CSC || b->type != SPEX_MPZ + || b->kind != SPEX_DENSE) + { + return SPEX_INCORRECT_INPUT; + } + + // Declare memory + SPEX_symbolic_analysis S = NULL; + SPEX_factorization F = NULL ; + SPEX_matrix x = NULL; + SPEX_matrix PAP = NULL; + + //-------------------------------------------------------------------------- + // Determine if A is indeed symmetric. If so, we try Cholesky. This + // symmetry check checks for both the nonzero pattern and values. + //-------------------------------------------------------------------------- + + bool is_symmetric ; + SPEX_CHECK( SPEX_determine_symmetry(&is_symmetric, A, option) ); + if (!is_symmetric) + { + SPEX_FREE_WORKSPACE ; + return SPEX_NOTSPD ; + } + + //-------------------------------------------------------------------------- + // Preorder: obtain the row/column ordering of A (Default is AMD) + //-------------------------------------------------------------------------- + + SPEX_CHECK( spex_cholesky_preorder(&S, A, option) ); + + //-------------------------------------------------------------------------- + // Permute matrix A, that is apply the row/column ordering from the + // symbolic analysis step to get the permuted matrix PAP. + //-------------------------------------------------------------------------- + + SPEX_CHECK( spex_cholesky_permute_A(&PAP, A, true, S) ); + + //-------------------------------------------------------------------------- + // Symbolic Analysis: compute the elimination tree of PAP + //-------------------------------------------------------------------------- + + SPEX_CHECK( spex_cholesky_symbolic_analysis(S, PAP, option) ); + + //-------------------------------------------------------------------------- + // Factorization: Perform the REF Cholesky factorization of PAP. + // By default, up-looking Cholesky factorization is done; however, + // the left looking factorization is done if option->algo=SPEX_CHOL_LEFT + //-------------------------------------------------------------------------- + + SPEX_CHECK( spex_cholesky_factor(&F, S, PAP, option) ); + + //-------------------------------------------------------------------------- + // Solve: Solve Ax = b using the REF Cholesky factorization. That is, + // apply the factorization LDL' = PAP' to solve the linear system LDL'x = b. + // At the conclusion of the solve function, x is the exact solution of + // Ax = b stored as a set of numerators and denominators (mpq_t) + //-------------------------------------------------------------------------- + + SPEX_CHECK( SPEX_cholesky_solve(&x, F, b, option) ); + + //-------------------------------------------------------------------------- + // At this point x is stored as mpq_t. If the user desires the output + // to be mpq_t we set x_handle = x. Otherwise, we create a copy, x2, of x + // of the desired type. We then set x_handle = x2 and free x. + //-------------------------------------------------------------------------- + + if (type == SPEX_MPQ) + { + (*x_handle) = x; + } + else + { + SPEX_matrix x2 = NULL; + SPEX_CHECK( SPEX_matrix_copy(&x2, SPEX_DENSE, type, x, option) ); + (*x_handle) = x2; + SPEX_matrix_free (&x, NULL); + } + + //-------------------------------------------------------------------------- + // Free all workspace and return success + //-------------------------------------------------------------------------- + + SPEX_FREE_WORKSPACE; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c new file mode 100644 index 0000000000..c662cb9acb --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c @@ -0,0 +1,112 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This function performs the integer preserving Cholesky factorization. + * First it permutes the input matrix according to the symbolic analysis. + * Then it performs the left-looking or up-looking integer-preserving Cholesky + * factorization. In order to compute the L matrix, it performs n iterations of + * a sparse REF symmetric triangular solve function. The overall factorization + * is PAP' = LDL' + * + * + * Input arguments of the function: + * + * F_handle: Handle to the factorization struct. Null on input. + * On output, contains a pointer to the factorization. + * + * A: User's input matrix. Must be SPEX_MPZ and SPEX_CSC. + * + * S: Symbolic analysis struct for Cholesky factorization. + * On input it contains the elimination tree and + * the number of nonzeros in L. + * + * option: Command options. Default if NULL. Notably, option->chol_type + * indicates whether it is performing the default up-looking + * factorization (SPEX_CHOL_UP) or the left-looking factorization + * (SPEX_CHOL_LEFT). + */ + +#define SPEX_FREE_WORKSPACE \ +{ \ + SPEX_matrix_free (&PAP, option); \ +} + +#define SPEX_FREE_ALL \ +{ \ + SPEX_FREE_WORKSPACE ; \ +} + +#include "spex_cholesky_internal.h" + +SPEX_info SPEX_cholesky_factorize +( + // Output + SPEX_factorization *F_handle, // Cholesky factorization struct + //Input + const SPEX_matrix A, // Matrix to be factored. Must be SPEX_MPZ + // and SPEX_CSC + const SPEX_symbolic_analysis S, // Symbolic analysis struct containing the + // elimination tree of A, the column + // pointers of L, and the exact number of + // nonzeros of L. + const SPEX_options option // command options. + // Notably, option->chol_type indicates + // whether CHOL_UP (default) or CHOL_LEFT + // is used. +) +{ + + SPEX_info info; + + if (!spex_initialized()) + { + return SPEX_PANIC; + } + + // Check inputs for NULL + if (!F_handle || !A || !S) + { + return (SPEX_INCORRECT_INPUT); + } + + // Ensure inputs are in the correct format + if (A->kind != SPEX_CSC || A->type != SPEX_MPZ + || S->kind != SPEX_CHOLESKY_FACTORIZATION) + { + return (SPEX_INCORRECT_INPUT); + } + + SPEX_matrix PAP = NULL ; + SPEX_factorization F = NULL ; + + //-------------------------------------------------------------------------- + // Numerically permute matrix A, that is apply the row/column ordering from + // the symbolic analysis step to get the permuted matrix PAP. + //-------------------------------------------------------------------------- + + SPEX_CHECK(spex_cholesky_permute_A(&PAP, A, true, S)); + + //-------------------------------------------------------------------------- + // Factorization: Perform the REF Cholesky factorization of + // A. By default, up-looking Cholesky factorization is done; however, + // the left looking factorization is done if option->algo=SPEX_CHOL_LEFT + //-------------------------------------------------------------------------- + + SPEX_CHECK(spex_cholesky_factor(&F, S, PAP, option)); + + //-------------------------------------------------------------------------- + // Set F_handle = F, free all workspace and return success + //-------------------------------------------------------------------------- + + (*F_handle) = F ; + SPEX_FREE_WORKSPACE; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c new file mode 100644 index 0000000000..f42f15a7f4 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c @@ -0,0 +1,156 @@ +//------------------------------------------------------------------------------ +// SPEX_Cholesky/SPEX_cholesky_solve: Solve the SPD linear system after +// factorization +//------------------------------------------------------------------------------ + +// 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_WORKSPACE \ +{ \ + SPEX_matrix_free(&b2, option); \ +} + +# define SPEX_FREE_ALL \ +{ \ + SPEX_FREE_WORKSPACE \ + SPEX_matrix_free(&x, NULL); \ +} + +#include "spex_cholesky_internal.h" + +/* Purpose: This function solves the linear system LDL' x = b. + * + * Input arguments: + * + * x_handle: A handle to the solution matrix. On input this is NULL, + * on output x_handle contains a pointer to the solution + * vector(s) + * + * F: The factorization struct containing the REF cholesky + * factorization of A, permutation, etc + * + * S: Symbolic analysis struct (contains row/column permutation + * and its inverse + * + * option: Command options * + */ + +SPEX_info SPEX_cholesky_solve +( + // Output + SPEX_matrix *x_handle, // On input: undefined. + // 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. + // input: + const SPEX_matrix b, // Right hand side vector + const SPEX_options option // command options +) +{ + + SPEX_info info; + + // Ensure SPEX is initialized + if (!spex_initialized()) + { + return SPEX_PANIC; + } + + // Check the inputs + if (!x_handle || b->type != SPEX_MPZ || b->kind != SPEX_DENSE + || F->kind != SPEX_CHOLESKY_FACTORIZATION) + { + return SPEX_INCORRECT_INPUT; + } + + // det is the determinant of the PAP matrix. It is obtained for free + // from the SPEX Cholesky factorization det = rhos[n-1] = L[n,n] + mpz_t *det = NULL; + + //-------------------------------------------------------------------------- + // Declare workspace and output + //-------------------------------------------------------------------------- + // x is the permuted final solution vector returned to the user + SPEX_matrix x = NULL; + // b2 is the permuted right hand side vector(s) + SPEX_matrix b2 = NULL; + + //-------------------------------------------------------------------------- + // get b2 = Pinv*b + //-------------------------------------------------------------------------- + + SPEX_CHECK (spex_permute_dense_matrix (&b2, b, F->Pinv_perm, option)); + + //-------------------------------------------------------------------------- + // Forward substitution, b2 = L \ b2. Note that b2 is overwritten + //-------------------------------------------------------------------------- + + SPEX_CHECK(spex_cholesky_forward_sub(b2, F->L, F->rhos)); + + //-------------------------------------------------------------------------- + // Apply the determinant to b2, b2 = det*b2 + //-------------------------------------------------------------------------- + + // Set the value of the determinant det = rhos[n-1] + det = &(F->rhos->x.mpz[F->L->n-1]); + + // Multiply b2 by the determinant. This multiplication ensures that the next + // backsolve is integral + SPEX_CHECK(spex_matrix_mul(b2, (*det) )); + + //-------------------------------------------------------------------------- + // Backsolve, b2 = L' \ b2. Note that, again, b2 is overwritten + //-------------------------------------------------------------------------- + + SPEX_CHECK(spex_cholesky_backward_sub(b2, F->L)); + + //-------------------------------------------------------------------------- + // get real solution x by applying both permutation and scale + // x = P*b2/scale + //-------------------------------------------------------------------------- + + // Scale is the scaling factor for the solution vectors. + // When the forward/backsolve is complete, the entries in + // x/det are rational, but are solving the scaled linear system + // A' x = b' (that is if A had input which was rational or floating point + // and had to be converted to integers). Thus, the scale here is used + // to convert x into into the actual solution of A x = b. + // Mathematically, set scale = b->scale * rhos[n-1] / PAP->scale + + SPEX_MPQ_SET_Z(b2->scale, (*det)); + SPEX_MPQ_MUL(b2->scale, b2->scale, b->scale); + SPEX_MPQ_DIV(b2->scale, b2->scale, F->scale_for_A); + + // allocate space for x as dense MPQ matrix + SPEX_CHECK (SPEX_matrix_allocate (&x, SPEX_DENSE, SPEX_MPQ, b->m, b->n, + 0, false, true, option)); + + // obtain x from permuted b2 with scale applied + for (int64_t i = 0 ; i < b->m ; i++) + { + int64_t pi = F->P_perm[i]; + for (int64_t j = 0 ; j < b->n ; j++) + { + + SPEX_MPQ_SET_Z(SPEX_2D(x, pi, j, mpq), + SPEX_2D(b2, i, j, mpz)); + SPEX_MPQ_DIV(SPEX_2D(x, pi, j, mpq), + SPEX_2D(x, pi, j, mpq), b2->scale); + } + } + + // Set output, free memory + (*x_handle) = x; + SPEX_FREE_WORKSPACE; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_backward_sub.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_backward_sub.c new file mode 100644 index 0000000000..6e70d9f283 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_backward_sub.c @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#define SPEX_FREE_ALL ; + +#include "spex_cholesky_internal.h" + + +/* Purpose: This function solves the linear system L' x = x for Cholesky + * factorization. On input, x contains the forward substitution solution vector + * (that is the solution of L D x = b. On output, x contains the exact solution + * of the system Ax = (det A)*b L is the lower triangular REF Cholesky factor of + * A. It is not modified on input/output + */ + +SPEX_info spex_cholesky_backward_sub +( + // Output + SPEX_matrix x, // Solution vector to A x = det(A) * b + // Input + const SPEX_matrix L // The lower triangular matrix +) +{ + + SPEX_info info; + // All inputs have been checked by the caller, asserts are + // here as a reminder + ASSERT(L->type == SPEX_MPZ); + ASSERT(L->kind == SPEX_CSC); + ASSERT(x->type == SPEX_MPZ); + ASSERT(x->kind == SPEX_DENSE); + + int64_t k, p, j, n = L->n; + int sgn, sgn2; + + // Iterate across the RHS vectors + for (k = 0; k < x->n; k++) + { + // Iterate across the rows of x + for (j = n-1; j >= 0; j--) + { + // Iterate across column j of L + for (p = L->p[j]+1; p < L->p[j+1]; p++) + { + // If either x[p,k] or L[p,k] is 0, skip the operation + SPEX_MPZ_SGN(&sgn, SPEX_2D(x, L->i[p], k, mpz)); + SPEX_MPZ_SGN(&sgn2, L->x.mpz[p]); + if (sgn == 0 || sgn2 ==0 ) continue; + + // Compute x[j,k] = x[j,k] - L[p,k]*x[p,k] + SPEX_MPZ_SUBMUL(SPEX_2D(x, j, k, mpz), + L->x.mpz[p], SPEX_2D(x, L->i[p], k, mpz)); + } + + // Compute x[j,k] = x[j,k] / L[j,j] + SPEX_MPZ_DIVEXACT(SPEX_2D(x, j, k, mpz), + SPEX_2D(x, j, k, mpz), L->x.mpz[ L->p[j]]); + + } + } + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c new file mode 100644 index 0000000000..1802865a97 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c @@ -0,0 +1,124 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#define SPEX_FREE_WORKSPACE \ +{ \ + SPEX_FREE(w); \ +} + +#define SPEX_FREE_ALL \ +{ \ + SPEX_FREE_WORKSPACE; \ + SPEX_FREE(colcount); \ +} + +#include "spex_cholesky_internal.h" + +#define HEAD(k,j) ( j) +#define NEXT(J) (-1) + +/* Purpose: Obtain the column counts of an SPD matrix for Cholesky + * factorization. This is a modified version of Csparse's cs_chol_counts + * function + */ + +SPEX_info spex_cholesky_counts +( + // Output + int64_t **c_handle, // On ouptut: column counts + // On input: undefined + // Input + const SPEX_matrix A, // Input matrix + const int64_t *parent, // Elimination tree + const int64_t *post // Post-order of the tree +) +{ + + SPEX_info info; + int64_t i, j, k, n, J, s, p, q, jleaf, *colcount = NULL, *w = NULL; + // Auxiliary variables + int64_t *maxfirst, *prevleaf, *ancestor, *first, *delta ; + n = A->n ; + // Can not have negative n + ASSERT(n >= 0); + // Size of workspace + s = 4*n ; + // Allocate result in delta + colcount = (int64_t*) SPEX_malloc(n* sizeof (int64_t)); + // Create a workspace of size s + w = (int64_t*) SPEX_malloc (s* sizeof (int64_t)); + if (colcount == NULL || w == NULL) + { + SPEX_FREE_ALL; + return SPEX_OUT_OF_MEMORY; + } + delta = colcount; + ancestor = w ; maxfirst = w+n ; prevleaf = w+2*n ; first = w+3*n ; + // Clear workspace + for (k = 0 ; k < s ; k++) + { + w [k] = -1 ; + } + // Find first j + for (k = 0 ; k < n ; k++) + { + j = post[k] ; + delta[j] = (first[j] == -1) ? 1 : 0 ; /* delta[j]=1 if j is a leaf */ + for ( ; j != -1 && first[j] == -1 ; j = parent[j]) + { + first [j] = k ; + } + } + // Initialize ancestor of each node + for (i = 0 ; i < n ; i++) + { + ancestor[i] = i ; + } + for (k = 0 ; k < n ; k++) + { + j = post[k] ; /* j is the kth node in postordered etree */ + if (parent[j] != -1) + { + delta[parent[j]]-- ; /* j is not a root */ + } + for (J = HEAD(k,j); J != -1 ; J = NEXT(J)) /* J=j for LL'=A case */ + { + for (p = A->p[J] ; p < A->p[J+1] ; p++) + { + i = A->i[p] ; + SPEX_CHECK(spex_cholesky_leaf(&q, i, j, first, maxfirst, + prevleaf, ancestor, &jleaf)); + if (jleaf >= 1) + { + delta[j]++ ; /* A(i,j) is in skeleton */ + } + if (jleaf == 2) + { + delta[q]-- ; /* account for overlap in q */ + } + } + } + if (parent[j] != -1) + { + ancestor[j] = parent[j] ; + } + } + for (j = 0 ; j < n ; j++) /* sum up delta's of each child */ + { + if (parent[j] != -1) + { + colcount[parent[j]] += colcount[j] ; + } + } + (*c_handle) = colcount; + SPEX_FREE_WORKSPACE; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c new file mode 100644 index 0000000000..a7559a0b53 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c @@ -0,0 +1,67 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#include "spex_cholesky_internal.h" + +/* Purpose: This function computes the reach of the kth row of A onto the graph + * of L using the elimination tree. It finds the nonzero pattern of row k of L + * and uses the upper triangular part of A(:,k) */ + +SPEX_info spex_cholesky_ereach +( + // Output + int64_t *top_handle, // On output: starting point of nonzero pattern + // On input: undefined + int64_t *xi, // On output: contains the nonzero pattern in + // xi[top..n-1] + // On input: undefined + // Input + const SPEX_matrix A, // Matrix to be analyzed + const int64_t k, // Node to start at + const int64_t *parent, // Elimination tree of A + int64_t *w // Workspace array +) +{ + + // Check inputs + ASSERT(A->n >= 0); + ASSERT(A->kind == SPEX_CSC); + ASSERT(A->type == SPEX_MPZ); + + // Declare variables + int64_t i, p, n, len, top ; + top = n = A->n ; + + // Mark node k as visited + SPEX_MARK(w, k); + + // Iterate across nonzeros in A(:,k) + for (p = A->p[k] ; p < A->p[k+1] ; p++) + { + // A(i,k) is nonzero + i = A->i[p] ; + if (i > k) + { + continue ; // only use upper triangular part of A + } + for (len = 0 ; !SPEX_MARKED(w,i); i = parent[i]) // traverse up etree + { + ASSERT (i >= 0 && i < n); + xi[len++] = i ; // L(k,i) is nonzero + SPEX_MARK(w, i); // mark i as visited + } + while (len > 0) xi[--top] = xi[--len] ; // push path onto stack + } + for (p = top ; p < n ; p++) SPEX_MARK(w, xi[p]); // unmark all nodes + SPEX_MARK(w, k); // unmark node k + (*top_handle) = top ; + return SPEX_OK ; // xi [top..n-1] contains pattern of L(k,:) +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c new file mode 100644 index 0000000000..8c2d8f2fc5 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c @@ -0,0 +1,79 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#define SPEX_FREE_WORKSPACE \ +{ \ + SPEX_FREE(w); \ +} + +#define SPEX_FREE_ALL \ +{ \ + SPEX_FREE_WORKSPACE ; \ + SPEX_FREE(parent); \ +} + +#include "spex_cholesky_internal.h" + + +/* Purpose: Compute the elimination tree of A */ + +SPEX_info spex_cholesky_etree +( + // Output + int64_t **tree_handle, // On output: contains the elimination tree of A + // On input: undefined. + // Input + const SPEX_matrix A // Input matrix (must be SPD). +) +{ + + // All inputs are checked by the caller so asserts are used here as a + // reminder of the appropriate formats + ASSERT (A != NULL); + ASSERT(A->kind == SPEX_CSC); + ASSERT(A->type == SPEX_MPZ); + ASSERT(A->n == A->m); + ASSERT (tree_handle != NULL); + (*tree_handle) = NULL ; + + // Declare variables + int64_t i, k, p, n, inext, *w = NULL, *parent = NULL, *ancestor ; + n = A->n ; + + // Allocate parent + parent = (int64_t*) SPEX_malloc( n * sizeof(int64_t)); + // Allocate workspace + w = (int64_t*) SPEX_malloc( n * sizeof(int64_t) ); + if (!parent || !w) + { + SPEX_FREE_ALL; + return SPEX_OUT_OF_MEMORY; + } + ancestor = w ; + for (k = 0 ; k < n ; k++) + { + parent [k] = -1 ; // node k has no parent yet + ancestor [k] = -1 ; // nor does k have an ancestor + for (p = A->p [k] ; p < A->p [k+1] ; p++) + { + i = A->i [p] ; + for ( ; i != -1 && i < k ; i = inext) // traverse from i to k + { + inext = ancestor [i] ; // inext = ancestor of i + ancestor [i] = k ; // path compression + if (inext == -1) parent [i] = k ; // no anc., parent is k + } + } + } + SPEX_FREE_WORKSPACE ; + (*tree_handle) = parent; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c new file mode 100644 index 0000000000..e899145edf --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c @@ -0,0 +1,141 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +# define SPEX_FREE_ALL \ +{ \ + SPEX_factorization_free(&F, option); \ +} + + +#include "spex_cholesky_internal.h" + +/* Purpose: This function performs the integer preserving Cholesky + * factorization. It allows either the left-looking or up-looking + * integer-preserving Cholesky factorization. In order to compute the L matrix, + * it performs n iterations of a sparse REF symmetric triangular solve + * function. The overall factorization is PAP' = LDL' + * + * Importantly, this function assumes that A has already been permuted, + * and symbolically analyzed. + * + * Input arguments of the function: + * + * F_handle: A handle to the factorization struct. Null on input. + * On output, contains a pointer to the factorization (this + * includes matrix L) + * + * S: Symbolic analysis struct for Cholesky factorization. + * On input it contains the elimination tree and + * the number of nonzeros in L. + * + * A: The user's permuted input matrix + * + * option: Command options. Notably, option->chol_type indicates whether + * it is performing a left-looking (SPEX_CHOL_LEFT) or up-looking + * factorization (SPEX_CHOL_UP) (default) + */ + +SPEX_info spex_cholesky_factor +( + // Output + SPEX_factorization *F_handle, // Cholesky factorization + //Input + const SPEX_symbolic_analysis S, // Symbolic analysis struct containing the + // elimination tree of A, the column pointers of + // L, and the exact number of nonzeros of L. + const SPEX_matrix A, // Matrix to be factored + const SPEX_options option // Command options + // Notably, option->chol_type indicates whether + // CHOL_UP (default) or CHOL_LEFT is used. +) +{ + + SPEX_info info; + + SPEX_factorization F = NULL ; + + //-------------------------------------------------------------------------- + // Check inputs + //-------------------------------------------------------------------------- + // All inputs have been checked by the caller, asserts are used here as a + // reminder of the appropriate data types + ASSERT(A->type == SPEX_MPZ); + ASSERT(A->kind == SPEX_CSC); + + // Number of nonzeros in A + int64_t anz; + SPEX_CHECK( SPEX_matrix_nnz(&anz, A, option) ); + ASSERT(anz > 0); + + (*F_handle) = NULL ; + + //-------------------------------------------------------------------------- + // Declare and initialize workspace + //-------------------------------------------------------------------------- + + // Dimension of A + int64_t n = A->n ; + + // Allocate memory for the factorization + F = (SPEX_factorization) SPEX_calloc(1, sizeof(SPEX_factorization_struct)); + if (F == NULL) return SPEX_OUT_OF_MEMORY; + + // set factorization kind + F->kind = SPEX_CHOLESKY_FACTORIZATION; + + // Allocate and set scale_for_A + SPEX_MPQ_INIT(F->scale_for_A); + SPEX_MPQ_SET(F->scale_for_A, A->scale); + + // Inverse pivot ordering + F->Pinv_perm = (int64_t*) SPEX_malloc ( n*sizeof(int64_t) ); + // row/column permutation, to be copied from S->P_perm + F->P_perm = (int64_t*) SPEX_malloc ( n*sizeof(int64_t) ); + if (!(F->Pinv_perm) || !(F->P_perm)) + { + // out of memory: free everything and return + SPEX_FREE_ALL; + return SPEX_OUT_OF_MEMORY; + } + + // Copy row/column permutation from symbolic analysis to factorization + memcpy(F->P_perm, S->P_perm, n*sizeof(int64_t)); + memcpy(F->Pinv_perm, S->Pinv_perm, n*sizeof(int64_t)); + + //-------------------------------------------------------------------------- + // factorization: up-looking or left-looking + //-------------------------------------------------------------------------- + + SPEX_factorization_algorithm algo = SPEX_OPTION_ALGORITHM(option); + switch(algo) + { + case SPEX_ALGORITHM_DEFAULT: + // fall through to up-looking Cholesky (the default) + case SPEX_CHOL_UP: + SPEX_CHECK( spex_cholesky_up_factor(&(F->L), &(F->rhos), S, A, + option)); + break; + case SPEX_CHOL_LEFT: + SPEX_CHECK( spex_cholesky_left_factor(&(F->L), &(F->rhos), S, A, + option) ); + break; + default: + SPEX_FREE_ALL; + return SPEX_INCORRECT_ALGORITHM; + } + + //-------------------------------------------------------------------------- + // Set outputs, return ok + //-------------------------------------------------------------------------- + + (*F_handle) = F ; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c new file mode 100644 index 0000000000..d4880ffeec --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c @@ -0,0 +1,190 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This function performs sparse REF forward substitution This is + * essentially the same as the sparse REF triangular solve applied to each + * column of the right hand side vectors. Like the normal one, this + * function expects that the vector x is dense. As a result,the nonzero + * pattern is not computed and each nonzero in x is iterated across. + * The system to solve is LDx = x + * + * On output, the matrix x structure is modified + * + */ + +#define SPEX_FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&h, NULL); \ +} + +#define SPEX_FREE_ALL \ +{ \ + SPEX_FREE_WORKSPACE \ +} + +#include "spex_cholesky_internal.h" + +SPEX_info spex_cholesky_forward_sub +( + // Input/Output + SPEX_matrix x, // Right hand side matrix. + // On input: contains b + // On output: contains the solution of LD x = x + // Input + const SPEX_matrix L, // REF Cholesky factor of A (lower triangular) + const SPEX_matrix rhos // Sequence of pivots used in factorization +) +{ + + SPEX_info info; + int64_t i, p, k, n = L->n, m, mnew; + + // All inputs have been checked by the caller. Asserts are + // here for reminder + ASSERT(n >= 0); + ASSERT(L->n == x->m); + ASSERT(L->kind == SPEX_CSC); + ASSERT(L->type == SPEX_MPZ); + ASSERT(x->kind == SPEX_DENSE); + ASSERT(x->type == SPEX_MPZ); + + int sgn; + + // Build the history matrix + SPEX_matrix h = NULL ; + SPEX_CHECK(SPEX_matrix_allocate(&h, SPEX_DENSE, SPEX_INT64, x->m, x->n, + x->nzmax, false, true, NULL)); + + // initialize entries of history matrix to be -1 + int xnz = x->n * x->m; + for (i = 0; i < xnz; i++) + { + h->x.int64[i] = -1; + } + + //-------------------------------------------------------------------------- + // Iterate across each RHS vector + //-------------------------------------------------------------------------- + for (k = 0; k < x->n; k++) + { + //---------------------------------------------------------------------- + // Iterate accross all nonzeros in x. Assumes x is dense + //---------------------------------------------------------------------- + for (i = 0; i < n; i++) + { + // p is the history value of x[i,k] that is p = h[i,k] + p = SPEX_2D(h, i, k, int64); + // If x[i][k] = 0, can skip operations and continue to next i + SPEX_MPZ_SGN(&sgn, SPEX_2D(x, i, k, mpz)); + if (sgn == 0) continue; + + //------------------------------------------------------------------ + // History Update x[i,k] + //------------------------------------------------------------------ + if (p < i-1) + { + // x[i,l] = x[i,k] * rhos[i-1] + SPEX_MPZ_MUL(SPEX_2D(x, i, k, mpz), + SPEX_2D(x, i, k, mpz),rhos->x.mpz[i-1]); + + // Only divide by the previous pivot if it is not =1 + // (the default for the first iteration) + if (p > -1) + { + // x[i,k] = x[i,k] / rhos[p] + SPEX_MPZ_DIVEXACT(SPEX_2D(x, i, k, mpz), + SPEX_2D(x, i, k, mpz), rhos->x.mpz[p]); + } + } + + //------------------------------------------------------------------ + // IPGE updates + //------------------------------------------------------------------ + // Access entry L[m,i] + for (m = L->p[i]; m < L->p[i+1]; m++) + { + // mnew is the row index of L[m,i] + mnew = L->i[m]; + // skip if L[m,i] is zero + SPEX_MPZ_SGN(&sgn, L->x.mpz[m]); + if (sgn == 0) continue; + + if (mnew > i) + { + // p is the history value of x[m,k] + p = SPEX_2D(h, mnew, k, int64); + // Check if x[m,k] is zero + SPEX_MPZ_SGN(&sgn, SPEX_2D(x, mnew, k, mpz)); + if (sgn == 0) + { + // In this case x[m,k] is zero, + // so we compute x[m,k] = 0 - l[m,i]*x[i,k] + SPEX_MPZ_SUBMUL(SPEX_2D(x, mnew, k, mpz), + L->x.mpz[m], SPEX_2D(x, i, k, mpz)); + // x[m,k] = x[m,k]/rhos[i-1] if we are not in the first + // iteration (in which case rhos[i-1] = 1 + if (i > 0) + { + SPEX_MPZ_DIVEXACT(SPEX_2D(x, mnew, k, mpz), + SPEX_2D(x, mnew, k, mpz), + rhos->x.mpz[i-1]); + } + } + else + { + // In this case, x[m,k] is not equal to zero. We first + // check if a history update is necessary + if (p < i-1) + { + // x[m,k] = x[m,k] * rhos[i-1] + SPEX_MPZ_MUL(SPEX_2D(x, mnew, k, mpz), + SPEX_2D(x, mnew, k, mpz), + rhos->x.mpz[i-1]); + // Divide by the history pivot if we are not in the + // first interation (in which case rhos[p] = 1) + // x[m,k] = x[m,k] / rhos[p] + if (p > -1) + { + SPEX_mpz_divexact(SPEX_2D(x, mnew, k, mpz), + SPEX_2D(x, mnew, k, mpz), + rhos->x.mpz[p]); + } + } + // x[m,k] = x[m,k] * rhos[i] + SPEX_MPZ_MUL(SPEX_2D(x, mnew, k, mpz), + SPEX_2D(x, mnew, k, mpz),rhos->x.mpz[i]); + // x[m,k] = x[m,k] - l[m,i] *x[i,k] + SPEX_MPZ_SUBMUL(SPEX_2D(x, mnew, k, mpz), + L->x.mpz[m], SPEX_2D(x, i, k, mpz)); + // Divide by the previous pivot if not in iteration 0. + // If at iteration 0, the pivot is equal to 1 so no + // division is necessary + // x[m,k] = x[m,k] / rhos[i-1] + if (i > 0) + { + SPEX_MPZ_DIVEXACT(SPEX_2D(x, mnew, k, mpz), + SPEX_2D(x, mnew, k, mpz), + rhos->x.mpz[i-1]); + } + } + // Update the history value of x[m,k] + SPEX_2D(h, mnew, k, int64) = i; + } + } + } + } + + //-------------------------------------------------------------------------- + // Free h memory and return success + //-------------------------------------------------------------------------- + SPEX_FREE_WORKSPACE; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h b/SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h new file mode 100644 index 0000000000..67013e6264 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h @@ -0,0 +1,355 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +// This file is not intended to be #include'd in user applications. Use +// SPEX.h instead. + +#ifndef SPEX_CHOL_INTERNAL_H +#define SPEX_CHOL_INTERNAL_H + +// Definition of SPEX macros, SPEX data structures, etc +#include "spex_util_internal.h" + +// ============================================================================ +// Internal Functions +// ============================================================================ + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//---------Routines to compute and anayze the elimination tree------------------ +// ----These routines are taken and lightly modified from Tim Davis' Csparse---- +// -------------------------www.suitesparse.com--------------------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +// Routines to compute and postorder the etree +//------------------------------------------------------------------------------ + +/* Purpose: Compute the elimination tree of A */ + +SPEX_info spex_cholesky_etree +( + // Output + int64_t **tree_handle, // On output: contains the elimination tree of A + // On input: undefined. + // Input + const SPEX_matrix A // Input matrix (must be SPD). +) ; + +/* Purpose: post order a forest */ + +SPEX_info spex_cholesky_post +( + // Output + int64_t **post_handle, // On output: post-order of the forest + // On input: undefied + // Input + const int64_t *parent, // Parent[j] is parent of node j in forest + const int64_t n // Number of nodes in the forest +) ; + +/* Purpose: Depth-first search and postorder of a tree rooted at node j */ + +SPEX_info spex_cholesky_tdfs +( + int64_t *k, // Index (kth node) + const int64_t j, // Root node + int64_t *head, // Head of list + int64_t *next, // Next node in the list + int64_t *post, // Post ordered tree + int64_t *stack // Stack of nodes +) ; + +//------------------------------------------------------------------------------ +// Routines to compute the column counts (number of nonzeros per column) of L +//------------------------------------------------------------------------------ + +/* Purpose: consider A(i,j), node j in ith row subtree and return lca(jprev,j) + Used to determine Column counts of cholesky factor*/ + +SPEX_info spex_cholesky_leaf +( + int64_t *lca_handle, // Least common ancestor (jprev,j) + const int64_t i, // Index (subtree i) + const int64_t j, // Index (node j) + const int64_t *first, // first[j] is the first descendant of node j + int64_t *maxfirst, // maxfirst[j] is the maximum first descendant of + // node j + int64_t *prevleaf, // prevleaf[i] is the previous leaf of ith subtree + int64_t *ancestor, // ancestor[i] is the ancestor of ith subtree + int64_t *jleaf // indicates whether j is the first leaf (value of + // 1) or not (value of 2) +) ; + +/* Purpose: Obtain the column counts of an SPD matrix for Cholesky factorization + * This is a modified version of Csparse's cs_chol_counts function + */ + +SPEX_info spex_cholesky_counts +( + // Output + int64_t **c_handle, // On ouptut: column counts + // On input: undefined + // Input + const SPEX_matrix A, // Input matrix + const int64_t *parent, // Elimination tree + const int64_t *post // Post-order of the tree +) ; + +//------------------------------------------------------------------------------ +// Routine to compute the reach (nonzeros of L) using the etree +//------------------------------------------------------------------------------ + +/* Purpose: This function computes the reach of the kth row of A on the + * elimination tree of A. + * On input, k is the iteration of the algorithm, parent contains the + * elimination tree and w is workspace. + * On output, xi[top_handle..n-1] contains the nonzero pattern of the + * kth row of L (or the kth column of L') + */ + +SPEX_info spex_cholesky_ereach +( + // Output + int64_t *top_handle, // On output: starting point of nonzero pattern + // On input: undefined + int64_t *xi, // On output: contains the nonzero pattern in + // xi[top..n-1] + // On input: undefined + // Input + const SPEX_matrix A, // Matrix to be analyzed + const int64_t k, // Node to start at + const int64_t *parent, // Elimination tree of A + int64_t *w // Workspace array +) ; + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +//-------------------Internal REF Chol Factorization Routines------------------- +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + + +/* Purpose: Perform the up-looking Cholesky factorization */ + +SPEX_info spex_cholesky_up_factor +( + // Output + SPEX_matrix* L_handle, // Lower triangular matrix. NULL on input. + SPEX_matrix* rhos_handle, // Sequence of pivots. NULL on input. + // Input + const SPEX_symbolic_analysis S, // Symbolic analysis struct containing the + // elimination tree of A, the column pointers of + // L, and the exact number of nonzeros of L. + const SPEX_matrix A, // Matrix to be factored + const SPEX_options option // command options +) ; + +/* Purpose: Perform the left-looking Cholesky factorization*/ + +SPEX_info spex_cholesky_left_factor +( + // Output + SPEX_matrix *L_handle, // Lower triangular matrix. NULL on input. + SPEX_matrix *rhos_handle, // Sequence of pivots. NULL on input. + // Input + const SPEX_symbolic_analysis S, // Symbolic analysis struct containing the + // elimination tree of A, the column pointers of + // L, and the exact number of nonzeros of L. + const SPEX_matrix A, // Matrix to be factored + const SPEX_options option // command options +) ; + +/* Purpose: This function performs a symbolic left-looking factorization. + * On input, A is the matrix to be factored, parent contains the elimination + * tree and S contains the row/column permutations and number of nonzeros in L + * On output, L_handle is allocated to contain the nonzero pattern of L and + * memory for the values. + */ + +SPEX_info spex_cholesky_pre_left_factor +( + // Output + SPEX_matrix *L_handle, // On output: partial L matrix + // On input: undefined + // Input + int64_t *xi, // Workspace nonzero pattern vector + const SPEX_matrix A, // Input Matrix + const SPEX_symbolic_analysis S // Symbolic analysis struct containing the + // number of nonzeros in L, the elimination + // tree, the row/coluimn permutation and its + // inverse +) ; + +/* Purpose: This function performs the symmetric sparse REF triangular solve. + * i.e.,(LD) x = A(:,k). + */ + +SPEX_info spex_cholesky_left_triangular_solve +( + // Output + int64_t *top_output, // On output: the beginning of nonzero pattern of + // L(:,k). The nonzero pattern is contained in + // xi[top_output...n-1] + // On input: undefined + SPEX_matrix x, // On output: Solution of LD x = A(:,k) ==> kth row + // of L but really, the ONLY valid values of x are + // those in x[xi] since x is a working vector its + // other positions are jumbled. + int64_t *xi, // On output: Nonzero pattern vector + // Input + const SPEX_matrix L, // Partial L matrix + const SPEX_matrix A, // Input matrix + const int64_t k, // Iteration of algorithm + const SPEX_matrix rhos, // Partial sequence of pivots + int64_t *h, // History vector + const int64_t *parent, // Elimination tree + int64_t *c // Column pointers of L but they don't point to the + // top position of each column of L. Instead they + // point to the position on each column where the + // next value of L will be grabbed, since at + // iteration k we need to grab the kth of L in + // order to not recompute those values. +) ; + +/* Purpose: This function performs the symmetric sparse REF triangular solve. + * for uplooking Cholesky factorization. i.e., (LD) x = A(1:k-1,k). At the + * given iteration k it computes the k-th column of L' (k-th row of L) + */ + +SPEX_info spex_cholesky_up_triangular_solve +( + //Output + int64_t *top_output, // On input NULL. On output contains the + // beginning of nonzero pattern + // The nonzero pattern is contained in + // xi[top_output...n-1] + int64_t *xi, // Nonzero pattern vector + SPEX_matrix x, // Solution of system ==> kth row of L + // Input + const SPEX_matrix L, // Partial L matrix + const SPEX_matrix A, // Input matrix + const int64_t k, // Iteration of algorithm + const int64_t *parent, // Elimination tree + int64_t *c, // Column pointers + const SPEX_matrix rhos, // sequence of pivots + int64_t *h // History vector +) ; + +/* Purpose: This function performs sparse REF forward substitution for Cholesky + * factorization. On input, x contains the righ hand side vectors, L is the + * Cholesky factor of A and rhos is the sequence of pivots used during + * factorization. On output, x contains the solution to LD x = x Note that + * this function assumes that x is stored as a dense matrix + */ + +SPEX_info spex_cholesky_forward_sub +( + // Input/Output + SPEX_matrix x, // Right hand side matrix. + // On input: contains b + // On output: contains the solution of LD x = x + // Input + const SPEX_matrix L, // REF Cholesky factor of A (lower triangular) + const SPEX_matrix rhos // Sequence of pivots used in factorization +) ; + +/* Purpose: This solves the system L'x = b for Cholesky factorization + * On input, x contains the scaled solution of L D x = b and L is the + * REF Cholesky factor of A. + * On output, x is the solution to the linear system Ax = (det A)b. + */ + +SPEX_info spex_cholesky_backward_sub +( + // Output + SPEX_matrix x, // Solution vector to A x = det(A) * b + // Input + const SPEX_matrix L // The lower triangular matrix +) ; + +/* Purpose: Matrix preordering for integer-preserving Cholesky factorization. + * On input, S is undefined + * On output, S contains the row/column permutation of A + */ + +SPEX_info spex_cholesky_preorder +( + // Output + SPEX_symbolic_analysis *S_handle, // Symbolic analysis data structure + // On input: undefined + // On output: contains the + // row/column permutation and its + // inverse. + // Input + const SPEX_matrix A, // Input matrix + const SPEX_options option // Control parameters (use default if NULL) +) ; + +/* Purpose: Permute the matrix A and return PAP = PAP' + * On input PAP is undefined and A contains the input matrix + * On output PAP contains the permuted matrix (PAP') + */ + +SPEX_info spex_cholesky_permute_A +( + //Output + SPEX_matrix* PAP_handle, // On input: undefined + // On output: contains the permuted matrix + //Input + const SPEX_matrix A, // Input matrix + const bool numeric, // True if user wants to permute pattern and + // numbers, false if only pattern + const SPEX_symbolic_analysis S // Symbolic analysis struct that contains + // row/column permutations +) ; + +/* Purpose: perform the symbolic analysis for the SPEX Cholesky factorization, + * that is, computing and postordering the elimination tree, getting the column + * counts of the SPD matrix A, setting the column pointers and exact number of + * non zeros of L. + */ + +SPEX_info spex_cholesky_symbolic_analysis +( + //Output + SPEX_symbolic_analysis S, // Symbolic analysis + //Input + const SPEX_matrix A, // Matrix to be factored + const SPEX_options option // Command options +) ; + +/* Purpose: Compute the REF Cholesky factorization A = LDL' + * only appropriate if A is SPD. + * On input A contains the user's matrix, option->algo indicates which + * factorization algorithm is used; up-looking (default) or left-looking + * On output, L contains the REF Cholesky factor of A, rhos contains + * the REF Cholesky pivot elements and S contains the elimination tree + * lower triangular matrix and rhos contains the pivots' values + * used in the factorization + */ + +SPEX_info spex_cholesky_factor +( + // Output + SPEX_factorization *F_handle, // Cholesky factorization + //Input + const SPEX_symbolic_analysis S, // Symbolic analysis struct containing the + // elimination tree of A, the column pointers of + // L, and the exact number of nonzeros of L. + const SPEX_matrix A, // Matrix to be factored + const SPEX_options option // Command options + // Notably, option->chol_type indicates whether + // CHOL_UP (default) or CHOL_LEFT is used. +) ; + +#endif diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c new file mode 100644 index 0000000000..1ac8814249 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c @@ -0,0 +1,62 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#include "spex_cholesky_internal.h" + +/* Purpose: consider A(i,j), node j in ith row subtree and return + * the Least Common Ancestor (lca(jprev,j)) + * Used to determine Column counts of Cholesky factor + */ + +SPEX_info spex_cholesky_leaf +( + int64_t *lca_handle, // Least common ancestor (jprev,j) + const int64_t i, // Index (subtree i) + const int64_t j, // Index (node j) + const int64_t *first, // first[j] is the first descendant of node j + int64_t *maxfirst, // maxfirst[j] is the maximum first descendant of + // node j + int64_t *prevleaf, // prevleaf[i] is the previous leaf of ith subtree + int64_t *ancestor, // ancestor[i] is the ancestor of ith subtree + int64_t *jleaf // indicates whether j is the first leaf (value of + // 1) or not (value of 2) +) +{ + + *jleaf = 0 ; + if (i <= j || first [j] <= maxfirst [i]) + { + (*lca_handle) = -1; + return (SPEX_OK); // j not a leaf + } + + // Declare variables + int64_t q, s, sparent, jprev ; + + maxfirst [i] = first [j] ; // update max first[j] seen so far + jprev = prevleaf [i] ; // jprev = previous leaf of ith subtree + prevleaf [i] = j ; + (*jleaf) = (jprev == -1) ? 1:2 ; // j is first or subsequent leaf + + if ((*jleaf) == 1) + { + (*lca_handle) = i; + return SPEX_OK ; // if 1st leaf, q = root of ith subtree + } + for (q = jprev ; q != ancestor [q] ; q = ancestor [q]); + for (s = jprev ; s != q ; s = sparent) + { + sparent = ancestor [s] ; // path compression + ancestor [s] = q ; + } + (*lca_handle) = q; + return SPEX_OK ; // q = least common ancestor (jprev,j) +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_factor.c new file mode 100644 index 0000000000..d9c03227e9 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_factor.c @@ -0,0 +1,244 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#define SPEX_FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&x, NULL); \ + SPEX_FREE(xi); \ + SPEX_FREE(h); \ + SPEX_FREE(c); \ +} + +#define SPEX_FREE_ALL \ +{ \ + SPEX_matrix_free(&L, NULL); \ + SPEX_matrix_free(&rhos, NULL); \ + SPEX_FREE_WORKSPACE \ +} + +#include "spex_cholesky_internal.h" + +/* Purpose: This function performs the left-looking REF Cholesky factorization. + * In order to compute the L matrix, it performs n iterations of a sparse REF + * symmetric triangular solve function which, at each iteration, computes the + * kth column of L. + * + * Importantly, this function assumes that A has already been permuted. + * + * Input arguments of the function: + * + * L_handle: A handle to the L matrix. Null on input. + * On output, contains a pointer to the L matrix. + * + * rhos_handle: A handle to the sequence of pivots. NULL on input. + * On output it contains a pointer to the pivots matrix. + * + * S: Symbolic analysis struct for Cholesky factorization. + * On input it contains information that is not used in this + * function such as the row/column permutation + * On output it contains the elimination tree and + * the number of nonzeros in L. + * + * A: The user's permuted input matrix + * + * option: Command options + * + */ + +SPEX_info spex_cholesky_left_factor +( + // Output + SPEX_matrix *L_handle, // Lower triangular matrix. NULL on input. + SPEX_matrix *rhos_handle, // Sequence of pivots. NULL on input. + // Input + const SPEX_symbolic_analysis S, // Symbolic analysis struct containing the + // elimination tree of A, the column pointers of + // L, and the exact number of nonzeros of L. + const SPEX_matrix A, // Matrix to be factored + const SPEX_options option // command options +) +{ + + //-------------------------------------------------------------------------- + // Check inputs + //-------------------------------------------------------------------------- + + SPEX_info info; + ASSERT (A != NULL); + ASSERT (A->type == SPEX_MPZ); + ASSERT (A->kind == SPEX_CSC); + ASSERT (L_handle != NULL); + ASSERT (rhos_handle != NULL); + (*L_handle) = NULL ; + (*rhos_handle) = NULL ; + + //-------------------------------------------------------------------------- + // Declare and initialize workspace + //-------------------------------------------------------------------------- + + SPEX_matrix L = NULL ; + SPEX_matrix rhos = NULL ; + int64_t *xi = NULL ; + int64_t *h = NULL ; + int64_t *c; + SPEX_matrix x = NULL ; + + // Declare variables + int64_t n = A->n, top, i, j, lnz = 0, jnew, k; + int sgn; + size_t size; + + c = (int64_t*) SPEX_malloc(n* sizeof (int64_t)); + + // h is the history vector utilized for the sparse REF + // triangular solve algorithm. h serves as a global + // vector which is repeatedly passed into the triangular + // solve algorithm + h = (int64_t*) SPEX_malloc(n* sizeof(int64_t)); + + // xi serves as a global nonzero pattern vector. It stores + // the pattern of nonzeros of the kth column of L + // for the triangular solve. + xi = (int64_t*) SPEX_malloc(2*n* sizeof(int64_t)); + + if (!h || !xi || !c) + { + SPEX_FREE_WORKSPACE; + return SPEX_OUT_OF_MEMORY; + } + // initialize workspace history array + for (i = 0; i < n; i++) + { + h[i] = -1; + } + + //-------------------------------------------------------------------------- + // Allocate and initialize the workspace x + //-------------------------------------------------------------------------- + + // SPEX utilizes arbitrary sized integers which can grow beyond the + // default 64 bits allocated by GMP. If the integers frequently grow, GMP + // can get bogged down by performing intermediate reallocations. Instead, + // we utilize a larger estimate on the workspace x vector so that computing + // the values in L and U do not require too many extra intermediate calls to + // realloc. + // + // The bound given in the paper is that the number of bits is <= n log sigma + // where sigma is the largest entry in A. Because this bound is extremely + // pessimistic, instead of using this bound, we use a very rough estimate: + // 64*max(2, log (n)) + // + // Note that the estimate presented here is not an upper bound nor a lower + // bound. It is still possible that more bits will be required which is + // correctly handled internally. + int64_t estimate = 64 * SPEX_MAX (2, ceil (log2 ((double) n))); + + // Create x, a "global" dense mpz_t matrix of dimension n*1 (i.e., it is + // used as workspace re-used at each iteration). The second boolean + // parameter is set to false, indicating that the size of each mpz entry + // will be initialized afterwards (and should not be initialized with the + // default size). + SPEX_CHECK (SPEX_matrix_allocate(&x, SPEX_DENSE, SPEX_MPZ, n, 1, n, + false, /* do not initialize the entries of x: */ false, option)); + + // Create rhos, a "global" dense mpz_t matrix of dimension n*1. + // As inidicated with the second boolean parameter true, the mpz entries in + // rhos are initialized to the default size (unlike x). + + SPEX_CHECK (SPEX_matrix_allocate(&(rhos), SPEX_DENSE, SPEX_MPZ, n, 1, n, + false, true, option)); + + // initialize the entries of x + for (i = 0; i < n; i++) + { + // Allocate memory for entries of x + SPEX_MPZ_INIT2(x->x.mpz[i], estimate); + } + + //-------------------------------------------------------------------------- + // Declare memory for L + //-------------------------------------------------------------------------- + + // Since we are performing a left-looking factorization, we pre-allocate L + // by performing a symbolic version of the factorization and obtaining the + // exact nonzero pattern of L. + // That said, the individual (x) values of L are not allocated. Instead, + // a more efficient method to allocate these values is done inside the + // factorization to reduce memory usage. + + SPEX_CHECK(spex_cholesky_pre_left_factor(&(L), xi, A, S)); + + // Set the column pointers of L + for (k = 0; k < n; k++) + { + L->p[k] = c[k] = (S->cp)[k]; + } + + //-------------------------------------------------------------------------- + // Perform the factorization + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Iterations 0:n-1 (1:n in standard) + //-------------------------------------------------------------------------- + for (k = 0; k < n; k++) + { + // LDx = A(:,k) + SPEX_CHECK(spex_cholesky_left_triangular_solve(&top, x, xi, L, A, k, + rhos, h, S->parent, c)); + + // Set the pivot element If this element is equal to zero, no pivot + // element exists and the matrix is either not SPD or singular + SPEX_MPZ_SGN(&sgn, x->x.mpz[k]); + if (sgn != 0) + { + SPEX_MPZ_SET(rhos->x.mpz[k], x->x.mpz[k]); + } + else + { + // A is not symmetric positive definite + SPEX_FREE_ALL; + return SPEX_NOTSPD; + } + //---------------------------------------------------------------------- + // Add the nonzeros to the L matrix + //---------------------------------------------------------------------- + for (j = top; j < n; j++) + { + // Index of x[i] + jnew = xi[j]; + if (jnew >= k) + { + // Find the size of x[j] + size = mpz_sizeinbase(x->x.mpz[jnew],2); + + // GMP manual: Allocated size should be size+2 + SPEX_MPZ_INIT2(L->x.mpz[lnz], size+2); + + // Place the x value of this nonzero in row jnew of L + SPEX_MPZ_SET(L->x.mpz[lnz],x->x.mpz[jnew]); + + // Increment lnz + lnz += 1; + } + } + } + // Finalize L->p + L->p[n] = S->lnz; + + //-------------------------------------------------------------------------- + // Free memory + //-------------------------------------------------------------------------- + (*L_handle) = L; + (*rhos_handle) = rhos; + SPEX_FREE_WORKSPACE; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c new file mode 100644 index 0000000000..1caa721e28 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c @@ -0,0 +1,345 @@ +//------------------------------------------------------------------------------ +// SPEX_Cholesky/spex_cholesky_left_triangular_solve: sparse symmetric +// left-looking triangular solve +//------------------------------------------------------------------------------ + +// 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 ; + +#include "spex_cholesky_internal.h" + +/* Purpose: This function performs the REF triangular solve for left-looking + * REF Cholesky factorization. At iteration k, it solves the linear system + * LD x = A(:,k). Upon completion of this function, x contains the kth column of + * L + * + * Input arguments of the function: + * + * top_output: A pointer to the beginning of the nonzero pattern of L(:,k) + * Undefined on input. On output xi[top_output..n-1] contains + * the beginning of the nonzero pattern. + * + * x: Solution of linear system. Undefined on input. On output + * contains the kth column of L. + * + * xi: Nonzero pattern. Undefined on input. On output contains the + * nonzero pattern of the kth row of L + * + * L: Lower triangular matrix. + * + * A: Input matrix + * + * k: Current iteration of the algorithm (i.e., column of A) + * + * rhos: Sequence of pivots used in factorization + * + * h: History vector. + * + * parent: Elimination tree + * + * c: Column pointers of L but they don't point to the top + * position of each column of L. Instead they point to the + * position on each column where the next value of L will be + * grabbed, since at iteration k we need to grab the kth of L + * in order to not recompute those values. + */ + + +// Comparison function used for the quicksort in the factorization +// 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) +{ + return ( *(int64_t*)a - *(int64_t*)b ); +} + +SPEX_info spex_cholesky_left_triangular_solve +( + // Output + int64_t *top_output, // On output: the beginning of nonzero pattern of + // L(:,k). The nonzero pattern is contained in + // xi[top_output...n-1] + // On input: undefined + SPEX_matrix x, // On output: Solution of LD x = A(:,k) ==> kth row + // of L but really, the ONLY valid values of x are + // those in x[xi] since x is a working vector its + // other positions are jumbled. + int64_t *xi, // On output: Nonzero pattern vector + // Input + const SPEX_matrix L, // Partial L matrix + const SPEX_matrix A, // Input matrix + const int64_t k, // Iteration of algorithm + const SPEX_matrix rhos, // Partial sequence of pivots + int64_t *h, // History vector + const int64_t *parent, // Elimination tree + int64_t *c // Column pointers of L but they don't point to the + // top position of each column of L. Instead they + // point to the position on each column where the + // next value of L will be grabbed, since at + // iteration k we need to grab the kth of L in + // order to not recompute those values. +) +{ + + SPEX_info info; + + // Input checks. All pointers are checked by the callersm these are here to + // remind us of the correct formats of each matrix + ASSERT(top_output != NULL); + ASSERT (x != NULL); + ASSERT (xi != NULL); + ASSERT (L != NULL); + ASSERT (A != NULL); + ASSERT (rhos != NULL); + ASSERT (h != NULL); + ASSERT (parent != NULL); + ASSERT (c != NULL); + ASSERT(L->type == SPEX_MPZ); + ASSERT(L->kind == SPEX_CSC); + ASSERT(A->type == SPEX_MPZ); + ASSERT(A->kind == SPEX_CSC); + ASSERT(rhos->type == SPEX_MPZ); + ASSERT(rhos->kind == SPEX_DENSE); + ASSERT(x->type == SPEX_MPZ); + ASSERT(x->kind == SPEX_DENSE); + + int64_t j, i, p, m, top, n; + int sgn; + + // row_top is the start of the nonzero pattern obtained after analyzing the + // elimination tree xi[row_top..n-1] contains the nonzero pattern of the kth + // row of L which is the first k-1 entries of the kth column of L + int64_t row_top; + + //---------------------------------------------------------------- + // Initialize REF Triangular Solve by getting nonzero patern of x + // This is done in two steps: + // 1) Obtain the nonzero pattern of L[1:k-1,k] + // We could get this from L[k,1:k], but it is cheaper to do it with + // ereach. + // 2) Obtain the nonzero pattern of L[k:n,k] + // This is obtained from the preallocation of L + //---------------------------------------------------------------- + + // Obtain dimension of the matrix, which is also the dimension of the dense + // vectors + n = A->n; + ASSERT(n >= 0); + + //---------------------------------------------------------------- + // 1) Obtain the nonzero pattern of L[1:k-1,k] + //---------------------------------------------------------------- + + // Obtain the nonzero pattern of the kth row of L which is entries + // L(1:k-1,k) Note that the left-looking Cholesky factorization performs + // two elimination tree analyses. The first is done prior to here in the + // preallocation of the L matrix. The second, performed here, gets the + // nonzero pattern of L(k,:) (To compute L(:,k) you need the prealocation + // first). + + SPEX_CHECK(spex_cholesky_ereach(&row_top, xi, A, k, parent, c)); + + // After eReach, xi[rowtop..n-1] stores the location of the nonzeros + // located in rows 1:k-1. Note that the values of these nonzeros have + // already been computed by the left-looking algorithm as they lie in row k + // of columns 1:k-1 of L, so we do not need to compute these values from + // scratch however we need to obtain their values. + + //---------------------------------------------------------------- + // 2) Obtain the nonzero pattern of L[1:k-1,k] + //---------------------------------------------------------------- + // Now we populate the remainder of the nonzero pattern + // (i.e., the indices of the nonzeros on rows k:n of L). + // Note that these indices are known + // because L was preallocated prior to factorization. Thus, we simply need + // to iterate across the remainder of the kth column of L. + // Oddly, this 'second' part of the nonzero pattern will be stored in the + // top part of xi. (becuase of how the ereach works, it is easier to store + // the nonzero pattern in rows 1:k-1 in the 'bottom' part of xi). + top = row_top; //top starts in the last position, and it is decreased until + // it reaches the actual top position of xi + for (i = L->p[k]; i < L->p[k+1]; i++) + { + top -= 1; // One more nonzero in column k + xi[top] = L->i[i]; // Index of the new nonzero + } + // At this point xi[top..n-1] contains the FULL nonzero pattern of column k. + // Any entry lying in rows 1:k-1 of L already have their correct final value + // currently stored in L. Any entry lying in rows k:n should take their + // default value in A prior to the left-looking solve. We need the entries + // in rows 1:k-1 of L in order to perform the IPGE_Updates & History_Updates + // that are needed to compute the values of the entries in rows k:n of L. + + //---------------------------------------------------------------- + // Initialize x (only the positions of its nonzeros) + //---------------------------------------------------------------- + + // Reset only the essential positions in the x working vector. That is, so + // that x[i] = 0 for all row indices i located in xi (i.e., the nonzero + // pattern of L(:,k)) (HOWEVER, you don't need to zero out the nonzeros + // that will be grabbed directly from L[k,1:k-1] that is why the loop ends + // in row_top and not in n) + + for (i = top; i < row_top; i++) + { + SPEX_mpz_set_ui(x->x.mpz[ xi[i] ], 0); + } + + SPEX_mpz_set_ui(x->x.mpz[k], 0); + + // Now x[xi] has been zeroed. We obtain the values of any nonzero located in + // L[k,1:k-1] which already reside in the previously computed kth row of L. + // This is done by using the column pointer vector and a helper index p. + for (i = row_top; i < n; i++) + { + m = xi[i]; // m is the row index of the current nonzero. + p = ++c[m]; // this increases the column pointer of the mth column by + // one; because c[m] needs to be pointing to the next place + // on column m where a value will be taken from (when we + // grab another row of L) + mpz_set(x->x.mpz[m], L->x.mpz[p]); + } + + //-------------------------------------------------------------------------- + // Obtain A(:,k) to finish populating L(k+1:n,k) with its starting values. + //-------------------------------------------------------------------------- + for (i = A->p[k]; i < A->p[k+1]; i++) + { + if ( A->i[i] >= k) + { + SPEX_MPZ_SET(x->x.mpz[A->i[i]], A->x.mpz[i]); + } + } + // Sort the nonzero pattern xi using quicksort + qsort(&xi[top], n-top, sizeof(int64_t), compare); + + // Reset the history vector h + for (i = top; i < n; i++) + { + h[xi[i]] = -1; + } + + //-------------------------------------------------------------------------- + // Iterate accross nonzeros in x + //-------------------------------------------------------------------------- + for ( p = top; p < n; p++) + { + /* Finalize x[j] */ + j = xi[p]; // Current nonzero term + // If x[j] == 0 no work must be done (this zero is due to numerical + // cancellation, not a structural/symbolic zero) + SPEX_MPZ_SGN(&sgn, x->x.mpz[j]); + if (sgn == 0) continue; + if (j < k) // j < k implies already computed entries + { + //------------------------------------------------------------------ + // IPGE updates + //------------------------------------------------------------------ + // ----------- Iterate accross nonzeros in Lij --------------------- + for (m = L->p[j]; m < L->p[j+1]; m++) + { + i = L->i[m]; // i value of Lij + if (i >= k) + { + /*************** If lij==0 then no update******************/ + SPEX_MPZ_SGN(&sgn, L->x.mpz[m]); + if (sgn == 0) continue; + + //---------------------------------------------------------- + /************* lij is nonzero, x[i] is zero****************/ + // x[i] = 0 then only perform IPGE update subtraction/div + //---------------------------------------------------------- + SPEX_MPZ_SGN(&sgn, x->x.mpz[i]); + if (sgn == 0) + { + // No previous pivot (because this entry has never been + // updated before) + if (j < 1) + { + SPEX_MPZ_SUBMUL(x->x.mpz[i],L->x.mpz[m], + x->x.mpz[j]);// x[i] = 0 - lij*x[j] + h[i] = j; // Entry is up to date + } + // Previous pivot exists + else + { + SPEX_MPZ_SUBMUL(x->x.mpz[i],L->x.mpz[m], + x->x.mpz[j]);// x[i] = 0 - lij*x[j] + SPEX_MPZ_DIVEXACT(x->x.mpz[i], + x->x.mpz[i], + rhos->x.mpz[j-1]);// x[i] = x[i] / rho[j-1] + h[i] = j; // Entry is up to date + } + } + + //---------------------------------------------------------- + /************ Both lij and x[i] are nonzero****************/ + // x[i] != 0 --> History & IPGE update on x[i] + //---------------------------------------------------------- + else + { + // No previous pivot in this case + if (j < 1) + { + SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], + rhos->x.mpz[0]); // x[i] = x[i]*rho[0] + SPEX_MPZ_SUBMUL(x->x.mpz[i], L->x.mpz[m], + x->x.mpz[j]);// x[i] = x[i] - lij*xj + h[i] = j; // Entry is now up to date + } + // There is a previous pivot + else + { + // History update if necessary + if (h[i] < j - 1) + { + SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], + rhos->x.mpz[j-1]);// x[i] = x[i] * rho[j-1] + if (h[i] > -1) + { + SPEX_MPZ_DIVEXACT(x->x.mpz[i], + x->x.mpz[i],rhos->x.mpz[h[i]]); + // x[i] = x[i] / rho[h[i]] + } + } + SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], + rhos->x.mpz[j]);// x[i] = x[i] * rho[j] + SPEX_MPZ_SUBMUL(x->x.mpz[i], L->x.mpz[m], + x->x.mpz[j]);// x[i] = x[i] - lij*xj + SPEX_MPZ_DIVEXACT(x->x.mpz[i], + x->x.mpz[i], + rhos->x.mpz[j-1]);// x[i] = x[i] / rho[j-1] + h[i] = j; // Entry is up to date + } + } + } + } + } + else // Entries of L + { + //------------------------------------------------------------------ + // History update + //------------------------------------------------------------------ + if (h[j] < k-1) + { + SPEX_MPZ_MUL(x->x.mpz[j],x->x.mpz[j], + rhos->x.mpz[k-1]); // x[j] = x[j] * rho[k-1] + if (h[j] > -1) + { + SPEX_MPZ_DIVEXACT(x->x.mpz[j],x->x.mpz[j], + rhos->x.mpz[h[j]]);// x[j] = x[j] / rho[h[j]] + } + } + } + } + // Output the beginning of nonzero pattern + (*top_output) = top; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c new file mode 100644 index 0000000000..bcc3a5d7b8 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c @@ -0,0 +1,134 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#include "spex_cholesky_internal.h" + +#undef SPEX_FREE_ALL +#define SPEX_FREE_ALL { SPEX_matrix_free (&PAP, NULL); } + +/* Purpose: Given the row/column permutation P stored in S, permute the matrix + * A and return PAP' + * Input arguments: + * + * PAP_handle: The user's permuted input matrix. + * + * A: The user's input matrix + * + * S: Symbolic analysis struct for Cholesky factorization. + * Contains row/column permutation of A + */ + +SPEX_info spex_cholesky_permute_A +( + //Output + SPEX_matrix* PAP_handle, // On input: undefined + // On output: contains the permuted matrix + //Input + const SPEX_matrix A, // Input matrix + const bool numeric, // True if user wants to permute pattern and + // numbers, false if only pattern + const SPEX_symbolic_analysis S // Symbolic analysis struct that contains + // row/column permutations +) +{ + + SPEX_info info; + + //-------------------------------------------------------------------------- + // Check inputs + //-------------------------------------------------------------------------- + + ASSERT(A != NULL); + ASSERT(S != NULL); + ASSERT(PAP_handle != NULL); + ASSERT(A->type == SPEX_MPZ); + ASSERT(A->kind == SPEX_CSC); + + // Create indices and pinv, the inverse row permutation + int64_t j, k, t, nz = 0, n = A->n; + (*PAP_handle) = NULL ; + //int64_t *pinv = NULL; + + // Allocate memory for PAP which is a permuted copy of A + SPEX_matrix PAP = NULL ; + SPEX_CHECK(SPEX_matrix_allocate(&PAP, SPEX_CSC, SPEX_MPZ, n, n, A->p[n], + false, true, NULL)); + + if(numeric) + { + + //---------------------------------------------------------------------- + // construct PAP with numerical values + //---------------------------------------------------------------------- + + // Set PAP scale + SPEX_MPQ_SET(PAP->scale, A->scale); + + // Populate the entries in PAP + for (k = 0; k < n; k++) + { + // Set the number of nonzeros in the kth column of PAP + PAP->p[k] = nz; + // Column k of PAP is equal to column S->P_perm[k] of A. j is the + // starting point for nonzeros and indices for column S->P_perm[k] + // of A + j = S->P_perm[k]; + // Iterate across the nonzeros in column S->P_perm[k] + for (t = A->p[j]; t < A->p[j+1]; t++) + { + // Set the nonzero value and location of the entries in column + // k of PAP + SPEX_MPZ_SET(PAP->x.mpz[nz], A->x.mpz[t]); + // Row i of this nonzero is equal to pinv[A->i[t]] + PAP->i[nz] = S->Pinv_perm[ A->i[t] ]; + // Move to the next nonzero element of PAP + nz++; + } + } + } + else + { + + //---------------------------------------------------------------------- + // construct PAP with just its pattern, not the values + //---------------------------------------------------------------------- + + // FUTURE: tell SPEX_matrix_allocate not to allocate PAP->x at all. + SPEX_FREE (PAP->x.mpz); + ASSERT (PAP->x.mpz == NULL); + PAP->x_shallow = true ; + + // Populate the entries in PAP + for (k = 0; k < n; k++) + { + // Set the number of nonzeros in the kth column of PAP + PAP->p[k] = nz; + // Column k of PAP is equal to column S->p[k] of A. j is the + // starting point for nonzeros and indices for column S->p[k] of A + j = S->P_perm[k]; + // Iterate across the nonzeros in column S->p[k] + for (t = A->p[j]; t < A->p[j+1]; t++) + { + // Row i of this nonzero is equal to pinv[A->i[t]] + PAP->i[nz] = S->Pinv_perm[ A->i[t] ]; + // Move to the next nonzero element of PAP + nz++; + } + } + } + + // Finalize the last column of PAP + PAP->p[n] = nz; + // Set output, return success + (*PAP_handle) = PAP; + return SPEX_OK; +} + diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c new file mode 100644 index 0000000000..6142df5330 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c @@ -0,0 +1,77 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#define SPEX_FREE_WORKSPACE \ +{ \ + SPEX_FREE (w); \ +} + +#define SPEX_FREE_ALL \ +{ \ + SPEX_FREE (post); \ + SPEX_FREE_WORKSPACE ; \ +} + +#include "spex_cholesky_internal.h" + +/* Purpose: post order a forest. */ + +SPEX_info spex_cholesky_post +( + // Output + int64_t **post_handle, // On output: post-order of the forest + // On input: undefied + // Input + const int64_t *parent, // Parent[j] is parent of node j in forest + const int64_t n // Number of nodes in the forest +) +{ + + SPEX_info info ; + + // All inputs have been checked by the caller + ASSERT( n >= 0); + + // Declare variables + int64_t j, k = 0, *post = NULL, *w = NULL, *head, *next, *stack ; + + // Allocate the postordering result + post = (int64_t*) SPEX_malloc(n* sizeof(int64_t)); + + // Create a workspace + w = (int64_t*) SPEX_malloc (3*n* sizeof (int64_t)); + if ((w == NULL) || (post == NULL)) + { + SPEX_FREE_ALL; + return (SPEX_OUT_OF_MEMORY); + } + head = w ; next = w + n ; stack = w + 2*n ; + + // Empty linked lists + for (j = 0 ; j < n ; j++) + { + head [j] = -1 ; + } + for (j = n-1 ; j >= 0 ; j--) // traverse nodes in reverse order + { + if (parent [j] == -1) continue ; // j is a root + next [j] = head [parent [j]] ; // add j to list of its parent + head [parent [j]] = j ; + } + for (j = 0 ; j < n ; j++) + { + if (parent [j] != -1) continue ; // skip j if it is not a root + SPEX_CHECK(spex_cholesky_tdfs (&k, j, head, next, post, stack)); + } + SPEX_FREE_WORKSPACE ; + (*post_handle) = post; + return (SPEX_OK); +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_pre_left_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_pre_left_factor.c new file mode 100644 index 0000000000..5b42a4e363 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_pre_left_factor.c @@ -0,0 +1,127 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#define SPEX_FREE_WORKSPACE \ +{ \ + SPEX_FREE(c); \ +} + +# define SPEX_FREE_ALL \ +{ \ + SPEX_FREE_WORKSPACE \ + SPEX_matrix_free(&L, NULL); \ +} + +#include "spex_cholesky_internal.h" + + +/* Purpose: This function performs a symbolic left-looking factorization. + * It allocates the memory for the L matrix and determines the full nonzero + * pattern of L + * + * Importantly, this function assumes that A has already been permuted. + * + * Input arguments of the function: + * + * L_handle: A handle to the L matrix. Null on input. + * On output, contains a pointer to the partial L matrix. + * + * xi: Workspace nonzero pattern vector. It stores the pattern of + * nonzeros of the kth column of L for the triangular solve. + * + * A: The user's permuted input matrix + * + * S: Symbolic analysis struct for Cholesky factorization. + * On input it contains information that is not used in this + * function such as the row/column permutation + * On output it contains the number of nonzeros in L. + */ + +SPEX_info spex_cholesky_pre_left_factor +( + // Output + SPEX_matrix *L_handle, // On output: partial L matrix + // On input: undefined + // Input + int64_t *xi, // Workspace nonzero pattern vector + const SPEX_matrix A, // Input Matrix + const SPEX_symbolic_analysis S // Symbolic analysis struct containing the + // number of nonzeros in L, the elimination + // tree, the row/coluimn permutation and its + // inverse +) +{ + + // All inputs have been checked by the caller, thus asserts are used here + // as a reminder of the expected data types + SPEX_info info; + ASSERT(A->kind == SPEX_CSC); + ASSERT(A->type == SPEX_MPZ); + + int64_t top, k, j, jnew, n = A->n, p = 0; + int64_t *c = NULL; + SPEX_matrix L = NULL; + ASSERT(n >= 0); + + //-------------------------------------------------------------------------- + // Declare memory for L and c + //-------------------------------------------------------------------------- + + // Allocate L + SPEX_CHECK(SPEX_matrix_allocate(&L, SPEX_CSC, SPEX_MPZ, n, n, S->lnz, + false, false, NULL)); + + // Allocate c + c = (int64_t*) SPEX_malloc(n* sizeof (int64_t)); + if (!c) + { + SPEX_FREE_ALL; + return SPEX_OUT_OF_MEMORY; + } + + // Set the column pointers of L and c + for (k = 0; k < n; k++) + { + L->p[k] = c[k] = S->cp[k]; + } + + L->i[0] = 0; + c[0]++; + + //-------------------------------------------------------------------------- + // Iterations 1:n-1 + //-------------------------------------------------------------------------- + for (k = 1; k < n; k++) + { + // Obtain nonzero pattern in xi[top..n] + SPEX_CHECK(spex_cholesky_ereach(&top, xi, A, k, S->parent, c)); + + //---------------------------------------------------------------------- + // Iterate accross the nonzeros in x + //---------------------------------------------------------------------- + for (j = top; j < n; j++) + { + jnew = xi[j]; + if (jnew == k) continue; + p = c[jnew]++; + // Place the i location of the next nonzero + L->i[p] = k; + } + p = c[k]++; + L->i[p] = k; + } + // Finalize L->p + L->p[n] = S->lnz; + (*L_handle) = L; + + SPEX_FREE_WORKSPACE; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c new file mode 100644 index 0000000000..4c953fdfff --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c @@ -0,0 +1,185 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This function performs the symbolic ordering for SPEX Cholesky. + * Currently, there are three options: user-defined order, COLAMD, or AMD. + * It is *highly* recommended that AMD is used for Cholesky factorization. + * + * Input/output arguments: + * + * S: Symbolic analysis struct. Undefined on input; contains column + * permutation and estimates of nnz on output (is the exact + * number of nonzeros if AMD is used) + * + * A: Input matrix, unmodified on input/output + * + * option: option->order tells the function which ordering scheme to use + */ + + +#define SPEX_FREE_ALL \ +{ \ + SPEX_FREE_WORKSPACE ; \ + SPEX_symbolic_analysis_free(&S, option); \ +} + +#include "spex_cholesky_internal.h" + +SPEX_info spex_cholesky_preorder +( + // Output + SPEX_symbolic_analysis *S_handle, // Symbolic analysis data structure + // On input: undefined + // On output: contains the + // row/column permutation and its + // inverse. + // Input + const SPEX_matrix A, // Input matrix + const SPEX_options option // Control parameters (use default if NULL) +) +{ + + //-------------------------------------------------------------------------- + // Check inputs + //-------------------------------------------------------------------------- + + SPEX_info info ; + if ( !spex_initialized() ) return SPEX_PANIC; + + // All inputs have been checked by the caller so ASSERTS are used instead + // of ifs A can have any data type, but must be in sparse CSC format + ASSERT(A->type == SPEX_MPZ); + ASSERT(A->kind == SPEX_CSC); + + // m = n for Cholesky factorization + ASSERT(A->n == A->m); + + // Dimension can't be negative + ASSERT(A->n >= 0); + + (*S_handle) = NULL ; + + //-------------------------------------------------------------------------- + // Allocate symbolic analysis object + //-------------------------------------------------------------------------- + + SPEX_symbolic_analysis S = NULL; + + // declare indices and dimension of matrix + int64_t i, k, index, n = A->n; + + int64_t anz; // Number of nonzeros in A + SPEX_CHECK (SPEX_matrix_nnz(&anz, A, option)); + + // Allocate memory for S + S = (SPEX_symbolic_analysis) + SPEX_calloc(1, sizeof(SPEX_symbolic_analysis_struct)); + if (S == NULL) + { + SPEX_FREE_ALL; + return (SPEX_OUT_OF_MEMORY); + } + + S->kind = SPEX_CHOLESKY_FACTORIZATION ; + + //Check which ordering to use. + SPEX_preorder order = SPEX_OPTION_ORDER(option); + switch(order) + { + default: + case SPEX_DEFAULT_ORDERING: + case SPEX_AMD: + // ---AMD ordering is used (DEFAULT)--- + // S->p is set to AMD's column ordering on A. + // The number of nonzeros in L is given as AMD's computed + // number of nonzeros in the Cholesky factor L of A which is the exact + // nnz(L) for Cholesky factorization (barring numeric cancellation) + { + SPEX_CHECK( spex_amd(&(S->P_perm),&(S->lnz),A,option)); + } + break; + + case SPEX_NO_ORDERING: + // ---No ordering is used--- + // S->p is set to [0 ... n] and the number of nonzeros in L is estimated + // to be 10 times the number of nonzeros in A. + // This is a very crude estimate on the nnz(L) + { + S->P_perm = (int64_t*)SPEX_malloc( (n+1)*sizeof(int64_t) ); + if (S->P_perm == NULL) + { + SPEX_FREE_ALL; + return (SPEX_OUT_OF_MEMORY); + } + + for (i = 0; i < n+1; i++) + { + S->P_perm[i] = i; + } + // Very crude estimate for number of L and U nonzeros + S->lnz = 10*anz; + } + break; + + case SPEX_COLAMD: + // --- COLAMD ordering is used + // S->p is set as COLAMD's column ordering. + // The number of nonzeros in L is set as 10 times the number of + // nonzeros in A. This is a crude estimate. + { + SPEX_CHECK( spex_colamd(&(S->P_perm),&(S->lnz),A,option)); + } + break; + } + + //-------------------------------------------------------------------------- + // Make sure appropriate space is allocated. It is possible to return + // estimates which exceed the dimension of L or estimates which are + // too small for L. In this case, this block of code ensures that the + // estimates on nnz(L) and nnz(U) are at least n and no more than n*n. + //-------------------------------------------------------------------------- + + // estimate exceeds max number of nnz in A + if (S->lnz > (double) n*n) + { + int64_t nnz = ceil(0.5*n*n); + S->lnz = nnz; + } + // If estimate < n, it is possible that the first iteration of triangular + // solve may fail, so we make sure that the estimate is at least n + if (S->lnz < n) + { + S->lnz += n; + } + + // Allocate pinv + S->Pinv_perm = (int64_t*)SPEX_calloc(n, sizeof(int64_t)); + if(!(S->Pinv_perm)) + { + SPEX_FREE_ALL; + return (SPEX_OUT_OF_MEMORY); + } + + // Populate pinv + for (k = 0; k < n; k++) + { + index = S->P_perm[k]; + S->Pinv_perm[index] = k; + } + + //-------------------------------------------------------------------------- + // Set result, report success + //-------------------------------------------------------------------------- + + SPEX_FREE_WORKSPACE ; + (*S_handle) = S; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c new file mode 100644 index 0000000000..52836c3fb2 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c @@ -0,0 +1,93 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#define SPEX_FREE_WORKSPACE \ +{ \ + SPEX_FREE(post); \ + SPEX_FREE(c); \ +} + +# define SPEX_FREE_ALL \ +{ \ + SPEX_FREE_WORKSPACE \ +} + +#include "spex_cholesky_internal.h" + +/* Purpose: perform the symbolic analysis for the SPEX Cholesky factorization, + * that is, computing and postordering the elimination tree, getting the column + * counts of the SPD matrix A, setting the column pointers and exact number of + * non zeros of L. + * + * IMPORTANT: This function assumes that A has already been permuted. + * + * Input arguments of the function: + * + * S: Symbolic analysis struct for Cholesky factorization. + * On input it contains information that is not used in this + * function such as the row/column permutation + * On output it contains the elimination tree and + * the number of nonzeros in L. + * + * A: The user's permuted input matrix + * + * option: Command options + */ + +SPEX_info spex_cholesky_symbolic_analysis +( + //Output + SPEX_symbolic_analysis S, // Symbolic analysis + //Input + const SPEX_matrix A, // Matrix to be factored + const SPEX_options option // Command options +) +{ + + SPEX_info info; + + //-------------------------------------------------------------------------- + // Check inputs + //-------------------------------------------------------------------------- + + // Inputs are checked by the caller, asserts are here as a reminder of the + // format + ASSERT(A->type == SPEX_MPZ); + ASSERT(A->kind == SPEX_CSC); + + // Declare local variables + int64_t n = A->n; + int64_t *post = NULL; + int64_t *c = NULL; + + // Obtain elimination tree of A + SPEX_CHECK( spex_cholesky_etree(&S->parent, A) ); + + // Postorder the elimination tree of A + SPEX_CHECK( spex_cholesky_post(&post, S->parent, n) ); + + // Get the column counts of A + 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*)); + if (S->cp == NULL) + { + SPEX_FREE_ALL; + return SPEX_OUT_OF_MEMORY; + } + SPEX_CHECK( spex_cumsum(S->cp, c, n)); + + // Set the exact number of nonzeros in L + S->lnz = S->cp[n]; + SPEX_FREE_WORKSPACE; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c new file mode 100644 index 0000000000..a1456cfc4d --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c @@ -0,0 +1,46 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#include "spex_cholesky_internal.h" + + +/* Purpose: Depth-first search and postorder of a tree rooted at node j */ + +SPEX_info spex_cholesky_tdfs +( + int64_t *k, // Index (kth node) + const int64_t j, // Root node + int64_t *head, // Head of list + int64_t *next, // Next node in the list + int64_t *post, // Post ordered tree + int64_t *stack // Stack of nodes +) +{ + + int64_t i, p, top = 0 ; + stack [0] = j ; // place j on the stack + while (top >= 0) // while (stack is not empty) + { + p = stack[top] ; // p = top of stack + i = head[p] ; // i = youngest child of p + if (i == -1) + { + top-- ; // p has no unordered children left + post[(*k)++] = p ; // node p is the kth postordered node + } + else + { + head[p] = next[i] ; // remove i from children of p + stack[++top] = i ; // start dfs on child node i + } + } + return SPEX_OK ; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c new file mode 100644 index 0000000000..a223426ca0 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c @@ -0,0 +1,259 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#define SPEX_FREE_WORKSPACE \ +{ \ + SPEX_matrix_free(&x, NULL); \ + SPEX_FREE(xi); \ + SPEX_FREE(h); \ + SPEX_FREE(c); \ +} + +#define SPEX_FREE_ALL \ +{ \ + SPEX_matrix_free(&L, NULL); \ + SPEX_matrix_free(&rhos, NULL); \ + SPEX_FREE_WORKSPACE \ +} + +#include "spex_cholesky_internal.h" + +/* Purpose: This function performs the up-looking REF Cholesky factorization. + * In order to compute the L matrix, it performs n iterations of a sparse REF + * symmetric triangular solve function which, at each iteration, computes the + * kth row of L. + * + * Importantly, this function assumes that A has already been permuted. + * + * Input arguments of the function: + * + * L_handle: A handle to the L matrix. Null on input. + * On output, contains a pointer to the L matrix. + * + * rhos_handle: A handle to the sequence of pivots. NULL on input. + * On output it contains a pointer to the pivots matrix. + * + * S: Symbolic analysis struct for Cholesky factorization. + * On input it contains information that is not used in this + * function such as the row/column permutation + * On output it contains the elimination tree and + * the number of nonzeros in L. + * + * A: The user's permuted input matrix + * + * option: Command options + * + */ + +SPEX_info spex_cholesky_up_factor +( + // Output + SPEX_matrix* L_handle, // Lower triangular matrix. NULL on input. + SPEX_matrix* rhos_handle, // Sequence of pivots. NULL on input. + // Input + const SPEX_symbolic_analysis S, // Symbolic analysis struct containing the + // elimination tree of A, the column pointers of + // L, and the exact number of nonzeros of L. + const SPEX_matrix A, // Matrix to be factored + const SPEX_options option // command options +) +{ + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + SPEX_info info; + ASSERT (A != NULL); + ASSERT (A->type == SPEX_MPZ); + ASSERT (A->kind == SPEX_CSC); + ASSERT (L_handle != NULL); + ASSERT (rhos_handle != NULL); + (*L_handle) = NULL ; + (*rhos_handle) = NULL ; + + //-------------------------------------------------------------------------- + // Declare and initialize workspace + //-------------------------------------------------------------------------- + + SPEX_matrix L = NULL ; + SPEX_matrix rhos = NULL ; + int64_t *xi = NULL ; + int64_t *h = NULL ; + SPEX_matrix x = NULL ; + int64_t *c = NULL; + + // Declare variables + int64_t n = A->n, top, i, j, jnew, k; + int sgn, prev_sgn; + size_t size; + + c = (int64_t*) SPEX_malloc(n*sizeof(int64_t)); + + // h is the history vector utilized for the sparse REF + // triangular solve algorithm. h serves as a global + // vector which is repeatedly passed into the triangular + // solve algorithm + h = (int64_t*) SPEX_malloc(n*sizeof(int64_t)); + + // xi serves as a global nonzero pattern vector. It stores + // the pattern of nonzeros of the kth column of L + // for the triangular solve. + xi = (int64_t*) SPEX_malloc(2*n*sizeof(int64_t)); + + if (!h || !xi || !c) + { + SPEX_FREE_WORKSPACE; + return SPEX_OUT_OF_MEMORY; + } + + // initialize workspace history array + for (i = 0; i < n; i++) + { + h[i] = -1; + } + + //-------------------------------------------------------------------------- + // Allocate and initialize the workspace x + //-------------------------------------------------------------------------- + + // SPEX utilizes arbitrary sized integers which can grow beyond the + // default 64 bits allocated by GMP. If the integers frequently grow, GMP + // can get bogged down by performing intermediate reallocations. Instead, + // we utilize a larger estimate on the workspace x vector so that computing + // the values in L and U do not require too many extra intermediate calls to + // realloc. + // + // The bound given in the paper is that the number of bits is <= n log sigma + // where sigma is the largest entry in A. Because this bound is extremely + // pessimistic, instead of using this bound, we use a very rough estimate: + // 64*max(2, log (n)) + // + // Note that the estimate presented here is not an upper bound nor a lower + // bound. It is still possible that more bits will be required which is + // correctly handled internally. + int64_t estimate = 64 * SPEX_MAX (2, ceil (log2 ((double) n))); + + // Create x, a "global" dense mpz_t matrix of dimension n*1 (i.e., it is + // used as workspace re-used at each iteration). The second boolean + // parameter is set to false, indicating that the size of each mpz entry + // will be initialized afterwards (and should not be initialized with the + // default size) + SPEX_CHECK (SPEX_matrix_allocate(&x, SPEX_DENSE, SPEX_MPZ, n, 1, n, + false, /* do not initialize the entries of x: */ false, option)); + + // Create rhos, a "global" dense mpz_t matrix of dimension n*1. + // As indicated with the second boolean parameter true, the mpz entries in + // rhos are initialized to the default size (unlike x). + SPEX_CHECK (SPEX_matrix_allocate(&(rhos), SPEX_DENSE, SPEX_MPZ, n, 1, n, + false, true, option)); + + // initialize the entries of x + for (i = 0; i < n; i++) + { + // Allocate memory for entries of x to be estimate bits + SPEX_MPZ_INIT2(x->x.mpz[i], estimate); + } + + //-------------------------------------------------------------------------- + // Declare memory for L + //-------------------------------------------------------------------------- + + // Since we are performing an up-looking factorization, we allocate + // L without initializing each entry. + // Note that, the inidividual (x) values of L are not allocated. Instead, + // a more efficient method to allocate these values is done inside the + // factorization to reduce memory usage. + + SPEX_CHECK(SPEX_matrix_allocate(&(L), SPEX_CSC, SPEX_MPZ, n, n, S->lnz, + false, false, option)); + + // Set the column pointers of L + for (k = 0; k < n; k++) + { + L->p[k] = c[k] = S->cp[k]; + } + + + //-------------------------------------------------------------------------- + // Perform the up-looking factorization + //-------------------------------------------------------------------------- + + //-------------------------------------------------------------------------- + // Iterations 0:n-1 (1:n in standard) + //-------------------------------------------------------------------------- + SPEX_MPZ_SGN(&prev_sgn, x->x.mpz[0]); + + for (k = 0; k < n; k++) + { + // LDx = A(:,k) + SPEX_CHECK(spex_cholesky_up_triangular_solve(&top, xi, x, L, A, k, + S->parent, c, rhos, h)); + + // If x[k] is nonzero choose it as pivot. Otherwise, the matrix is + // not SPD (indeed, it may even be singular). + SPEX_MPZ_SGN(&sgn, x->x.mpz[k]); + if (sgn != 0) + { + SPEX_MPZ_SET(rhos->x.mpz[k], x->x.mpz[k]); + } + else + { + // A is not symmetric positive definite + SPEX_FREE_ALL; + return SPEX_NOTSPD; + } + + //---------------------------------------------------------------------- + // Add the nonzeros (i.e. x) to L + //---------------------------------------------------------------------- + int64_t p = 0; + for (j = top; j < n; j++) + { + // Obtain the row index of x[j] + jnew = xi[j]; + if (jnew == k) continue; + + // Determine the column where x[j] belongs to + p = c[jnew]++; + + // Place the i index of this nonzero. Should always be k because at + // iteration k, the up-looking algorithm computes row k of L + L->i[p] = k; + + // Find the number of bits of x[j] + size = mpz_sizeinbase(x->x.mpz[jnew],2); + + // GMP manual: Allocated size should be size+2 + SPEX_MPZ_INIT2(L->x.mpz[p], size+2); + + // Place the x value of this nonzero + SPEX_MPZ_SET(L->x.mpz[p],x->x.mpz[jnew]); + } + // Now, place L(k,k) + p = c[k]++; + L->i[p] = k; + size = mpz_sizeinbase(x->x.mpz[k], 2); + SPEX_MPZ_INIT2(L->x.mpz[p], size+2); + SPEX_MPZ_SET(L->x.mpz[p], x->x.mpz[k]); + } + // Finalize L->p + L->p[n] = S->lnz; + + //-------------------------------------------------------------------------- + // Free memory and set output + //-------------------------------------------------------------------------- + + (*L_handle) = L; + (*rhos_handle) = rhos; + SPEX_FREE_WORKSPACE; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c new file mode 100644 index 0000000000..79c5e0bf03 --- /dev/null +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -0,0 +1,309 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#define SPEX_FREE_ALL ; + +#include "spex_cholesky_internal.h" + +/* Purpose: This function performs the symmetric sparse REF triangular solve + * for the up-looking Cholesky factorization. i,e, LD x = A(1:k-1, k). At the + * end of this function, the vector x contains the values of the kth row of the + * integer- preserving matrix L. + * + * Input arguments of the function: + * + * top_output: A pointer to the beginning of the nonzero pattern. Undefined + * on input, on output xi[top_output..n] contains the beginning + * of the nonzero pattern. + * + * xi: Nonzero pattern. Undefined on input, on output contains teh + * nonzero pattern of the kth row of L + * + * x: Solution of linear system. Undefined on input, on output + * contains the kth row of L. + * + * L: Lower triangular matrix. + * + * A: Input matrix + * + * k: Current iteration of the algorithm + * + * parent: Elimination tree + * + * c: Column pointers of L but they don't point to the top + * position of each column of L. Instead they point to the + * position on each column where the next value of L will be + * grabbed, since at iteration k we need to grab the kth of L + * in order to not recompute those values. + * + * rhos: Pivot matrix + * + * h: History vector + */ + +// Comparison function used for the quicksort in the factorization +// 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) +{ + return ( *(int64_t*)a - *(int64_t*)b ); +} + +SPEX_info spex_cholesky_up_triangular_solve +( + //Output + int64_t *top_output, // On input NULL. On output contains the + // beginning of nonzero pattern + // The nonzero pattern is contained in + // xi[top_output...n-1] + int64_t *xi, // Nonzero pattern vector + SPEX_matrix x, // Solution of system ==> kth row of L + // Input + const SPEX_matrix L, // Partial L matrix + const SPEX_matrix A, // Input matrix + const int64_t k, // Iteration of algorithm + const int64_t *parent, // Elimination tree + int64_t *c, // Column pointers + const SPEX_matrix rhos, // sequence of pivots + int64_t *h // History vector +) +{ + + SPEX_info info; + + // All inputs are checked by the caller. Here we include + // asserts as a reminder of the expected data types of the inputs + ASSERT(L->type == SPEX_MPZ); + ASSERT(L->kind == SPEX_CSC); + ASSERT(A->type == SPEX_MPZ); + ASSERT(A->kind == SPEX_CSC); + ASSERT(x->type == SPEX_MPZ); + ASSERT(x->kind == SPEX_DENSE); + ASSERT(rhos->type == SPEX_MPZ); + ASSERT(rhos->kind == SPEX_DENSE); + + int64_t j, i, p, m, top, n = A->n; + int sgn; + + ASSERT(n >= 0); + + //-------------------------------------------------------------------------- + // Initialize REF Triangular Solve by getting the nonzero patern of x && + // obtaining A(:,k) + //-------------------------------------------------------------------------- + // Obtain the nonzero pattern of the kth row of L by analyzing the + // elimination tree of A. The indices of these nonzeros are stored in + // xi[top..n-1] + SPEX_CHECK(spex_cholesky_ereach(&top, xi, A, k, parent, c)); + + // Sort the nonzero pattern using quicksort (required by IPGE unlike in GE) + 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++) + { + SPEX_MPZ_SET_UI(x->x.mpz[xi[i]],0); + } + + // Reset value of x[k]. If the matrix is nonsingular, x[k] will + // be a part of the nonzero pattern and reset in the above loop. + // However, in some rare cases, the matrix can be singular but x[k] + // will be nonzero from a previous iteration. Thus, here we reset + // x[k] to account for this extremely rare case. + SPEX_MPZ_SET_UI(x->x.mpz[k],0); + + // Reset h[i] = -1 for all i in nonzero pattern + for (i = top; i < n; i++) + { + h[xi[i]] = -1; + } + + // Set x = A(:,k) + // Note: The if is needed since the columns of A are allowed to be unsorted. + for (i = A->p[k]; i < A->p[k+1]; i++) + { + if (A->i[i] <= k) + { + SPEX_MPZ_SET(x->x.mpz[A->i[i]], A->x.mpz[i]); + } + } + + //-------------------------------------------------------------------------- + // Perform the REF Triangular Solve. Note that, unlike the left-looking + // Cholesky triangular solve where L is lower trapezoidal, the up-looking L + // matrix is actually lower triangular; thus this is a true triangular + // solve. + //-------------------------------------------------------------------------- + for (p = top; p < n; p++) + { + // Obtain the index of the current nonzero + j = xi[p]; + SPEX_MPZ_SGN(&sgn, x->x.mpz[j]); + if (sgn == 0) continue; // If x[j] == 0 no work must be done + + // Initial history update to finalize x[j] if necessary + if (h[j] < j-1) + { + // History update x[j]: x[j] = x[j]*rhos[j-1]/rhos[h[j]] + // x[j] = x[j]*rhos[j-1] + SPEX_MPZ_MUL(x->x.mpz[j], x->x.mpz[j], + rhos->x.mpz[j-1]); + if (h[j] > -1) + { + // x[j] = x[j] / rhos [ h[j] ] + SPEX_MPZ_DIVEXACT(x->x.mpz[j], x->x.mpz[j], + rhos->x.mpz[h[j]]); + } + } + + //------------------------------------------------------------------ + // IPGE updates + //------------------------------------------------------------------ + // ----------- Iterate accross nonzeros in Lij --------------------- + for (m = L->p[j]+1; m < c[j]; m++) + { + i = L->i[m]; // i value of Lij + if (i > j && i < k) // Update all dependent x[i] excluding x[k] + { + /*************** If lij==0 then no update******************/ + SPEX_MPZ_SGN(&sgn, L->x.mpz[m]); + if (sgn == 0) continue; + + //---------------------------------------------------------- + /************* lij is nonzero, x[i] is zero****************/ + // x[i] = 0 then only perform IPGE update subtraction/division + //---------------------------------------------------------- + SPEX_MPZ_SGN(&sgn, x->x.mpz[i]); + if (sgn == 0) + { + // First, get the correct value of x[i] = 0 - lij * x[j] + SPEX_MPZ_MUL(x->x.mpz[i], L->x.mpz[m], + x->x.mpz[j]); + SPEX_MPZ_NEG(x->x.mpz[i],x->x.mpz[i]); + // Do a division by the pivot if necessary. + if (j >= 1) + { + // x[i] = x[i] / rho[j-1] + SPEX_MPZ_DIVEXACT(x->x.mpz[i], x->x.mpz[i], + rhos->x.mpz[j-1]); + } + // Update the history value of x[i] + h[i] = j; + + } + + //---------------------------------------------------------- + /************ Both lij and x[i] are nonzero****************/ + // x[i] != 0 --> History & IPGE update on x[i] + //---------------------------------------------------------- + else + { + // There is no previous pivot + if (j < 1) + { + // History update x[i] = x[i]*rhos[0] + SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], + rhos->x.mpz[0]); + // x[i] = x[i] - lij x[j] + SPEX_MPZ_SUBMUL(x->x.mpz[i], L->x.mpz[m], + x->x.mpz[j]); + // Update the history value of x[i] + h[i] = j; + } + // There is a previous pivot + else + { + // History update if necessary + if (h[i] < j - 1) + { + // x[i] = x[i] * rhos[j-1] + SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], + rhos->x.mpz[j-1]); + // Divide by the history pivot only if the history + // pivot is not the rho[-1] (which equals 1) (rho[0] + // in the 1-based logic of othe IPGE algorithm) + if (h[i] > -1) + { + // x[i] = x[i] / rho[h[i]] + SPEX_MPZ_DIVEXACT(x->x.mpz[i], + x->x.mpz[i],rhos->x.mpz[h[i]]); + } + } + // ---- IPGE Update : + // x[i] = (x[i]*rhos[j] - lij*xj) / rho[j-1] + // x[i] = x[i]*rhos[j] + SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], + rhos->x.mpz[j]); + // x[i] = x[i] - lij*xj + SPEX_MPZ_SUBMUL(x->x.mpz[i], L->x.mpz[m], + x->x.mpz[j]); + // x[i] = x[i] / rho[j-1] + SPEX_MPZ_DIVEXACT(x->x.mpz[i],x->x.mpz[i], + rhos->x.mpz[j-1]); + // Entry is up to date; + h[i] = j; + } + } + } + } + // ------ History Update x[k] if necessary ----- + if (h[k] < j - 1) + { + // x[k] = x[k] * rho[j-1] + SPEX_MPZ_MUL(x->x.mpz[k],x->x.mpz[k],rhos->x.mpz[j-1]); + // Divide by the history pivot only if the history pivot is not the + // rho[-1] (which equals 1) (rho[0] in the 1-based logic of the + // IPGE algorithm) + if (h[k] > -1) + { + // x[k] = x[k] / rho[h[k]] + SPEX_MPZ_DIVEXACT(x->x.mpz[k],x->x.mpz[k], + 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]); + // x[k] = x[k] - xj*xj + SPEX_MPZ_SUBMUL(x->x.mpz[k], x->x.mpz[j], x->x.mpz[j]); + // 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] + // has its correct final value. Thus, a final history + // update is done to x[k] if necessary + //---------------------------------------------------------- + if (h[k] < k-1) + { + // x[k] = x[k] * rhos[k-1] + SPEX_MPZ_MUL(x->x.mpz[k], x->x.mpz[k], rhos->x.mpz[k-1]); + // Only divide by previous pivot if the previous pivot is not 1 (which + // is always the case in the first IPGE iteration) + if (h[k] > -1) + { + // x[k] = x[k] / rhos[h[k]] + SPEX_MPZ_DIVEXACT(x->x.mpz[k], x->x.mpz[k], + rhos->x.mpz[ h[k]]); + } + } + // Output the top of the nonzero pattern + (*top_output) = top; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Left_LU/License/CONTRIBUTOR-LICENSE.txt b/SPEX/SPEX_LU/License/CONTRIBUTOR-LICENSE.txt similarity index 97% rename from SPEX/SPEX_Left_LU/License/CONTRIBUTOR-LICENSE.txt rename to SPEX/SPEX_LU/License/CONTRIBUTOR-LICENSE.txt index 68e035b4e9..96d0a1fdb5 100644 --- a/SPEX/SPEX_Left_LU/License/CONTRIBUTOR-LICENSE.txt +++ b/SPEX/SPEX_LU/License/CONTRIBUTOR-LICENSE.txt @@ -1,6 +1,6 @@ -SPEX Individual Contributor License Agreement +SPEX_LU Individual Contributor License Agreement -Thank you for your interest in contributing to SPEX ("We" or "Us"). +Thank you for your interest in contributing to SPEX_LU ("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 @@ -161,8 +161,8 @@ software project managed by Us. any limited remedy to the maximum extent possible under law. Us -Christopher Lourenco, and all SPEX co-authors: +All SPEX_LU co-authors: +Christopher Lourenco Jinhao Chen Timothy A. Davis Erick Moreno-Centeno - diff --git a/SPEX/SPEX_LU/License/GPLv2.txt b/SPEX/SPEX_LU/License/GPLv2.txt new file mode 100644 index 0000000000..d159169d10 --- /dev/null +++ b/SPEX/SPEX_LU/License/GPLv2.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/SPEX/SPEX_LU/License/lesserv3.txt b/SPEX/SPEX_LU/License/lesserv3.txt new file mode 100644 index 0000000000..fc8a5de7ed --- /dev/null +++ b/SPEX/SPEX_LU/License/lesserv3.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/SPEX/SPEX_Left_LU/License/license.txt b/SPEX/SPEX_LU/License/license.txt similarity index 82% rename from SPEX/SPEX_Left_LU/License/license.txt rename to SPEX/SPEX_LU/License/license.txt index 54f28eafc4..5174d2bd10 100644 --- a/SPEX/SPEX_Left_LU/License/license.txt +++ b/SPEX/SPEX_LU/License/license.txt @@ -1,14 +1,13 @@ -SPEX_Left_LU: a Sparse Left-looking Integer-Preserving LU Factorization +SPEX_LU: a Sparse Left-looking Integer-Preserving LU Factorization -Copyright (c) 2019-2022, Christopher Lourenco, JinHao Chen, Erick Moreno- -Centeno, and Timothy A. Davis. +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 http://suitesparse.com -Contact Chris Lourenco, chrisjlourenco@gmail.com, or Tim Davis +Contact Christopher Lourenco, chrisjlourenco@gmail.com, or Tim Davis (timdavis@aldenmath.com or DrTimothyAldenDavis@gmail.com) for a commercial license. diff --git a/SPEX/SPEX_Left_LU/README.md b/SPEX/SPEX_LU/README.md similarity index 68% rename from SPEX/SPEX_Left_LU/README.md rename to SPEX/SPEX_LU/README.md index 8a01b3e99d..cad52b6cf8 100644 --- a/SPEX/SPEX_Left_LU/README.md +++ b/SPEX/SPEX_LU/README.md @@ -1,12 +1,12 @@ -SPEX_Left_LU is software package used to solve a sparse systems of linear equations +SPEX_LU is software package used to solve a sparse systems of linear equations exactly using the Sparse Left-looking Integer-Preserving LU factorization. -*********SPEX_Left_LU********* +*********SPEX_LU********* Purpose: Exactly solve a sparse system of linear equations using a given input matrix and right hand side vector file. This code can output the final solution to a user specified output file in either double precision or - full precision rational numbers. If you intend to use SPEX_Left_LU within + full precision rational numbers. If you intend to use SPEX_LU within another program, refer to examples for help with this. ./spexlu_demo followed by the listed args: @@ -15,11 +15,11 @@ help. e.g., ./spexlu_demo help, which indicates to print to guideline for using this function. f (or file) Filename. e.g., ./spexlu_demo f MATRIX_NAME RHS_NAME, which indicates -SPEX_Left_LU will read matrix from MATRIX_NAME and right hand side from RHS_NAME. +SPEX_LU will read matrix from MATRIX_NAME and right hand side from RHS_NAME. For this demo, the matrix is stored in a triplet format. Refer to -SPEX_Left_LU/ExampleMats for examples. +SPEX_LU/ExampleMats for examples. -p (or piv) Pivot_param. e.g., ./spexlu_demo p 0, which indicates SPEX_Left_LU will use +p (or piv) Pivot_param. e.g., ./spexlu_demo p 0, which indicates SPEX_LU will use smallest pivot for pivot scheme. Other available options are listed as follows: 0: Smallest pivot @@ -29,35 +29,28 @@ as follows: 4: Diagonal pivoting with tolerance for largest pivot 5: Largest pivot -q (or col) Column_order_param. e.g., ./spexlu_demo q 0, which indicates SPEX_Left_LU +q (or col) Column_order_param. e.g., ./spexlu_demo q 0, 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., ./spexlu_demo t 1e-10, which indicates SPEX_Left_LU +t (or tol) tolerance_param. e.g., ./spexlu_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., ./spexlu_demo o 1, which indicates SPEX_Left_LU will output the +o (or out). e.g., ./spexlu_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 + 2: terse, with basic stats from COLAMD/AMD and SLIP and solution -If none of the above args is given, they are set to the following default: - - mat_name = "../ExampleMats/10teams_mat.txt" - rhs_name = "../ExampleMats/10teams_v.txt" - p = 3, - q = 1, - t = 1, *********example********* -Purpose: Demonstrate the simple interface of SPEX_Left_LU for a randomly generated +Purpose: Demonstrate the simple interface of SPEX_LU for a randomly generated matrix *********example2********* -Purpose: Demonstrate the simple interface of SPEX_Left_LU for a matrix to be read in +Purpose: Demonstrate the simple interface of SPEX_LU for a matrix to be read in diff --git a/SPEX/SPEX_LU/Source/SPEX_lu_analyze.c b/SPEX/SPEX_LU/Source/SPEX_lu_analyze.c new file mode 100644 index 0000000000..970a4347b7 --- /dev/null +++ b/SPEX/SPEX_LU/Source/SPEX_lu_analyze.c @@ -0,0 +1,160 @@ +//------------------------------------------------------------------------------ +// 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. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This function performs the symbolic ordering for unsymmetric + * matrices. Currently, there are three options: user-defined order, COLAMD, + * or AMD. + * + * Input/output arguments: + * + * S: Symbolic analysis struct. Undefined on input; contains column + * permutation and estimates of nnz(L) and nnz(U) nnz on output + * + * A: Input matrix, unmodified on input/output + * + * option: option->order tells the function which ordering scheme to use + * + */ + +#define SPEX_FREE_ALL \ +{ \ + SPEX_symbolic_analysis_free (&S, option); \ +} + +#include "spex_lu_internal.h" + +SPEX_info SPEX_lu_analyze +( + SPEX_symbolic_analysis *S_handle, // symbolic analysis including + // column perm. and nnz of L and U + const SPEX_matrix A, // Input matrix + const SPEX_options option // Control parameters, if NULL, use default +) +{ + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + if (!spex_initialized()) return SPEX_PANIC; + SPEX_info info ; + + // A can have any data type, but must be in sparse CSC format + SPEX_REQUIRE_KIND (A, SPEX_CSC); + + if (!S_handle) + { + return SPEX_INCORRECT_INPUT; + } + (*S_handle) = NULL; + if (A->n != A->m) + { + return SPEX_INCORRECT_INPUT; + } + + //-------------------------------------------------------------------------- + // allocate symbolic analysis object + //-------------------------------------------------------------------------- + + SPEX_symbolic_analysis S = NULL ; + int64_t i, n = A->n, anz; + // SPEX enviroment is checked to be init'ed and A is checked to be not NULL + // and a SPEX_CSC kind, so there shouldnt be any error from this function + SPEX_matrix_nnz(&anz, A, option); + + // ALlocate memory for S + S = (SPEX_symbolic_analysis) SPEX_calloc(1, + sizeof(SPEX_symbolic_analysis_struct)); + if (S == NULL) {return SPEX_OUT_OF_MEMORY;} + S->kind = SPEX_LU_FACTORIZATION; + + //-------------------------------------------------------------------------- + // No ordering is used. S->Q_perm is set to [0...n] and the number of + // nonzeros in L and U is estimated to be 10 times the number of nonzeros + // in A. This is a very crude estimate on the nnz(L) and nnz(U) + //-------------------------------------------------------------------------- + + SPEX_preorder order = SPEX_OPTION_ORDER (option); + switch(order) + { + default: + case SPEX_DEFAULT_ORDERING: + case SPEX_COLAMD: + // ---COLAMD ordering is used (DEFAULT)--- + // S->q is set to COLAMD's column ordering on A. + + { + SPEX_CHECK( spex_colamd(&(S->Q_perm),&(S->unz),A,option)); + S->lnz = S->unz; + } + break; + + case SPEX_NO_ORDERING: + // ---No ordering is used--- + // S->q is set to [0 ... n] and the number of nonzeros in L is estimated + // to be 10 times the number of nonzeros in A. + // This is a very crude estimate on the nnz(L) + { + S->Q_perm = (int64_t*)SPEX_malloc( (n+1)*sizeof(int64_t) ); + if (S->Q_perm == NULL) + { + // out of memory + SPEX_FREE_ALL; + return (SPEX_OUT_OF_MEMORY); + } + for (i = 0; i < n+1; i++) + { + S->Q_perm[i] = i; + } + // Very crude estimate for number of L and U nonzeros + S->lnz = S->unz = 10*anz; + } + break; + + case SPEX_AMD: + // --- AMD ordering is used + // S->q is set as AMD's column ordering. + { + SPEX_CHECK( spex_amd(&(S->Q_perm),&(S->unz),A,option)); + S->lnz = S->unz; + } + break; + } + + //-------------------------------------------------------------------------- + // Make sure appropriate space is allocated. It's possible to return + // estimates which exceed the dimension of L and U or estimates which are + // too small for L U. In this case, this block of code ensures that the + // estimates on nnz(L) and nnz(U) are at least n and no more than n*n. + //-------------------------------------------------------------------------- + // estimate exceeds max number of nnz in A + if (S->lnz > (double) n*n) + { + int64_t nnz = ceil(0.5*n*n); + S->lnz = S->unz = nnz; + } + // If estimate < n, first column of triangular solve may fail + if (S->lnz < n) + { + S->lnz = S->lnz + n; + } + if (S->unz < n) + { + S->unz = S->unz + n; + } + + //-------------------------------------------------------------------------- + // return result + //-------------------------------------------------------------------------- + + (*S_handle) = S ; + return SPEX_OK; +} + diff --git a/SPEX/SPEX_Left_LU/Source/SPEX_Left_LU_backslash.c b/SPEX/SPEX_LU/Source/SPEX_lu_backslash.c similarity index 53% rename from SPEX/SPEX_Left_LU/Source/SPEX_Left_LU_backslash.c rename to SPEX/SPEX_LU/Source/SPEX_lu_backslash.c index 849fa0f22a..8739db221c 100644 --- a/SPEX/SPEX_Left_LU/Source/SPEX_Left_LU_backslash.c +++ b/SPEX/SPEX_LU/Source/SPEX_lu_backslash.c @@ -1,20 +1,20 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/SPEX_Left_LU_backslash: solve Ax=b, returning solution as desired data type +// SPEX_LU/SPEX_lu_backslash: solve Ax=b, return solution as desired data type //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. 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 //------------------------------------------------------------------------------ -/* Purpose: This code utilizes the SPEX Left LU factorization to exactly solve the - * linear system Ax = b. This is essentially an exact version of - * MATLAB sparse backslash +/* Purpose: This code utilizes the SPEX Left LU factorization to exactly solve + * the linear system Ax = b. This is essentially an exact version of MATLAB + * sparse backslash * * Input/Output arguments: * - * X_handle: A pointer to the solution of the linear system. The output is + * x_handle: A pointer to the solution of the linear system. The output is * allowed to be returned in either double precision, mpfr_t, or * rational mpq_t * @@ -24,36 +24,33 @@ * A: User's input matrix. It must be populated prior to calling this * function. * - * b: Collection of right hand side vectors. Must be populated prior to - * factorization. + * b: Collection of right hand side vectors. Must be populated prior + * to factorization. * - * option: Struct containing various command parameters for the factorization. If - * NULL on input, default values are used. + * option: Struct containing various command parameters for the + * factorization. If NULL on input, default values are used. */ -# define SPEX_FREE_WORK \ - SPEX_matrix_free(&L, NULL); \ - SPEX_matrix_free(&U, NULL); \ - SPEX_FREE(pinv); \ - SPEX_matrix_free(&rhos, NULL); \ - SPEX_LU_analysis_free (&S, NULL); +# define SPEX_FREE_WORKSPACE \ + SPEX_factorization_free(&F, option); \ + SPEX_symbolic_analysis_free (&S, option); # define SPEX_FREE_ALL \ - SPEX_FREE_WORK \ + SPEX_FREE_WORKSPACE \ SPEX_matrix_free(&x, NULL); \ -#include "spex_left_lu_internal.h" +#include "spex_lu_internal.h" -SPEX_info SPEX_Left_LU_backslash +SPEX_info SPEX_lu_backslash ( // Output - SPEX_matrix **X_handle, // Final solution vector + SPEX_matrix *x_handle, // Final solution vector // Input - SPEX_type type, // Type of output desired - // Must be SPEX_MPQ, SPEX_MPFR, or SPEX_FP64 - const SPEX_matrix *A, // Input matrix - const SPEX_matrix *b, // Right hand side vector(s) - const SPEX_options* option // Command options + SPEX_type type, // Type of output desired. Must be + // SPEX_MPQ, SPEX_MPFR, or SPEX_FP64 + const SPEX_matrix A, // Input matrix + const SPEX_matrix b, // Right hand side vector(s) + const SPEX_options option // Command options ) { @@ -62,52 +59,43 @@ SPEX_info SPEX_Left_LU_backslash //------------------------------------------------------------------------- SPEX_info info ; - if (!spex_initialized ( )) return (SPEX_PANIC) ; + if (!spex_initialized ( )) return (SPEX_PANIC); - if (X_handle == NULL) + if (x_handle == NULL) { return SPEX_INCORRECT_INPUT; } - (*X_handle) = NULL; + (*x_handle) = NULL; if (type != SPEX_MPQ && type != SPEX_FP64 && type != SPEX_MPFR) { return SPEX_INCORRECT_INPUT; } - SPEX_REQUIRE (A, SPEX_CSC, SPEX_MPZ) ; - SPEX_REQUIRE (b, SPEX_DENSE, SPEX_MPZ) ; + SPEX_REQUIRE (A, SPEX_CSC, SPEX_MPZ); + SPEX_REQUIRE (b, SPEX_DENSE, SPEX_MPZ); - SPEX_matrix *L = NULL ; - SPEX_matrix *U = NULL ; - SPEX_matrix *x = NULL; - int64_t *pinv = NULL ; - SPEX_matrix *rhos = NULL ; - SPEX_LU_analysis *S = NULL; + SPEX_symbolic_analysis S = NULL; + SPEX_factorization F = NULL ; + SPEX_matrix x = NULL; //-------------------------------------------------------------------------- // Symbolic Analysis //-------------------------------------------------------------------------- - SPEX_CHECK(SPEX_LU_analyze(&S, A, option)); + SPEX_CHECK(SPEX_lu_analyze(&S, A, option)); //-------------------------------------------------------------------------- // LU Factorization //-------------------------------------------------------------------------- - SPEX_CHECK(SPEX_Left_LU_factorize(&L, &U, &rhos, &pinv, A, S, option)); + SPEX_CHECK(SPEX_lu_factorize(&F, A, S, option)); //-------------------------------------------------------------------------- // Solve //-------------------------------------------------------------------------- - SPEX_CHECK (SPEX_Left_LU_solve (&x, b, A, - (const SPEX_matrix *) L, - (const SPEX_matrix *) U, - (const SPEX_matrix *) rhos, - S, - (const int64_t *) pinv, - option)) ; + SPEX_CHECK (SPEX_lu_solve (&x, F, b, option)); //-------------------------------------------------------------------------- // Now, x contains the exact solution of the linear system in mpq_t @@ -116,21 +104,21 @@ SPEX_info SPEX_Left_LU_backslash if (type == SPEX_MPQ) { - (*X_handle) = x ; + (*x_handle) = x ; } else { - SPEX_matrix* x2 = NULL ; - SPEX_CHECK (SPEX_matrix_copy (&x2, SPEX_DENSE, type, x, option)) ; - (*X_handle) = x2 ; - SPEX_matrix_free (&x, NULL) ; + SPEX_matrix x2 = NULL ; + SPEX_CHECK (SPEX_matrix_copy (&x2, SPEX_DENSE, type, x, option)); + (*x_handle) = x2 ; + SPEX_matrix_free (&x, NULL); } //-------------------------------------------------------------------------- // Free memory //-------------------------------------------------------------------------- - SPEX_FREE_WORK ; - return (SPEX_OK) ; + SPEX_FREE_WORKSPACE ; + return (SPEX_OK); } diff --git a/SPEX/SPEX_Left_LU/Source/SPEX_Left_LU_factorize.c b/SPEX/SPEX_LU/Source/SPEX_lu_factorize.c similarity index 68% rename from SPEX/SPEX_Left_LU/Source/SPEX_Left_LU_factorize.c rename to SPEX/SPEX_LU/Source/SPEX_lu_factorize.c index 8129310f89..eac7505861 100644 --- a/SPEX/SPEX_Left_LU/Source/SPEX_Left_LU_factorize.c +++ b/SPEX/SPEX_LU/Source/SPEX_lu_factorize.c @@ -1,56 +1,46 @@ -//------------------------------------------------------------------------------ -// SPEX_Left_LU/SPEX_Left_LU_factorize: exact sparse LU factorization +//----------------------------------------------------------------------------- +// SPEX_LU/SPEX_lu_factorize: exact sparse LU factorization //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. 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 //------------------------------------------------------------------------------ -/* Purpose: This function performs the SPEX Left LU factorization. This - * factorization is done via n iterations of the sparse REF triangular solve - * function. The overall factorization is PAQ = LDU - * The determinant of A can be obtained as determinant = rhos[n-1] +/* Purpose: This internal function performs the SPEX Left LU factorization, but + * does not free the row permutation when finished. This factorization is done + * via n iterations of the sparse REF triangular solve function. The overall + * factorization is PAQ = LDU The determinant of A can be obtained as + * determinant = rhos[n-1] * - * L: undefined on input, created on output - * U: undefined on input, created on output - * rhos: undefined on input, created on output - * pinv: undefined on input, created on output + * F: undefined on input, created on output * * A: input only, not modified * S: input only, not modified * option: input only, not modified */ -#define SPEX_FREE_WORK \ +#define SPEX_FREE_WORKSPACE \ SPEX_matrix_free(&x, NULL); \ SPEX_FREE(xi); \ SPEX_FREE(h); \ SPEX_FREE(pivs); \ - SPEX_FREE(row_perm); \ #define SPEX_FREE_ALL \ - SPEX_FREE_WORK \ - SPEX_matrix_free(&L, NULL); \ - SPEX_matrix_free(&U, NULL); \ - SPEX_matrix_free(&rhos, NULL); \ - SPEX_FREE(pinv); + SPEX_FREE_WORKSPACE; \ + SPEX_factorization_free(&F, option); -#include "spex_left_lu_internal.h" +#include "spex_lu_internal.h" -SPEX_info SPEX_Left_LU_factorize +SPEX_info SPEX_lu_factorize ( // output: - SPEX_matrix **L_handle, // lower triangular matrix - SPEX_matrix **U_handle, // upper triangular matrix - SPEX_matrix **rhos_handle, // sequence of pivots - int64_t **pinv_handle, // inverse row permutation + SPEX_factorization *F_handle, // LU factorization // input: - const SPEX_matrix *A, // matrix to be factored - const SPEX_LU_analysis *S, // column permutation and estimates - // of nnz in L and U - const SPEX_options* option // command options + const SPEX_matrix A, // matrix to be factored + const SPEX_symbolic_analysis S, // symbolic analysis + const SPEX_options option // command options ) { @@ -58,46 +48,56 @@ SPEX_info SPEX_Left_LU_factorize // check inputs //-------------------------------------------------------------------------- - if (!spex_initialized ( )) return (SPEX_PANIC) ; + if (!spex_initialized ( )) return (SPEX_PANIC); - SPEX_REQUIRE (A, SPEX_CSC, SPEX_MPZ) ; + SPEX_REQUIRE (A, SPEX_CSC, SPEX_MPZ); int64_t anz; // SPEX enviroment is checked to be init'ed and A is a SPEX_CSC matrix that // is not NULL, so SPEX_matrix_nnz must return SPEX_OK - SPEX_info info = SPEX_matrix_nnz (&anz, A, option) ; + SPEX_info info = SPEX_matrix_nnz (&anz, A, option); ASSERT(info == SPEX_OK); - if (!L_handle || !U_handle || !rhos_handle || !pinv_handle || !S || anz < 0) + if (!F_handle || !S || anz < 0) { return SPEX_INCORRECT_INPUT; } - (*L_handle) = NULL ; - (*U_handle) = NULL ; - (*rhos_handle) = NULL ; - (*pinv_handle) = NULL ; + (*F_handle) = NULL ; //-------------------------------------------------------------------------- // Declare and initialize workspace //-------------------------------------------------------------------------- - SPEX_matrix *L = NULL ; - SPEX_matrix *U = NULL ; - SPEX_matrix *rhos = NULL ; - int64_t *pinv = NULL ; + SPEX_factorization F = NULL ; int64_t *xi = NULL ; int64_t *h = NULL ; int64_t *pivs = NULL ; - int64_t *row_perm = NULL ; - SPEX_matrix *x = NULL ; + SPEX_matrix x = NULL ; int64_t n = A->n ; int64_t k = 0, top, i, j, col, loc, lnz = 0, unz = 0, pivot, jnew ; size_t size ; + // allocate memory space for the factorization + F = (SPEX_factorization) SPEX_calloc(1, sizeof(SPEX_factorization_struct)); + if (F == NULL) + { + return SPEX_OUT_OF_MEMORY; + } + // set factorization kind + F->kind = SPEX_LU_FACTORIZATION; + // Allocate and set scale_for_A + SPEX_MPQ_INIT(F->scale_for_A); + SPEX_MPQ_SET (F->scale_for_A, A->scale); + // Inverse pivot ordering - pinv = (int64_t *) SPEX_malloc (n * sizeof (int64_t)) ; + F->Pinv_perm = (int64_t*) SPEX_malloc (n * sizeof(int64_t)); + // Actual row permutation, the inverse of pinv. This + // is used for sorting + F->P_perm = (int64_t*) SPEX_malloc (n * sizeof(int64_t)); + // column permutation, to be copied from S->Q_perm + F->Q_perm = (int64_t*) SPEX_malloc (n * sizeof(int64_t)); // Indicator of which rows have been pivotal // pivs[i] = 1 if row i has been selected as a pivot @@ -115,25 +115,25 @@ SPEX_info SPEX_Left_LU_factorize // for the triangular solve. xi = (int64_t*) SPEX_malloc(2*n* sizeof(int64_t)); - // Actual row permutation, the inverse of pinv. This - // is used for sorting - row_perm = (int64_t*) SPEX_malloc(n* sizeof(int64_t)); - - if (!pivs || !h || !xi || !row_perm || !pinv) + if (!(F->Pinv_perm) || !(F->P_perm) || !(F->Q_perm) || + !pivs || !h || !xi) { // out of memory: free everything and return SPEX_FREE_ALL ; return SPEX_OUT_OF_MEMORY; } + // copy column permutation from symbolic analysis to factorization + memcpy(F->Q_perm, S->Q_perm, n * sizeof(int64_t)); + // initialize workspace and pivot status for (i = 0; i < n; i++) { h[i] = -1; pivs[i] = -1; // Initialize location based vectors - pinv[i] = i; - row_perm[i] = i; + F->Pinv_perm[i] = i; + F->P_perm[i] = i; } //-------------------------------------------------------------------------- @@ -141,7 +141,7 @@ SPEX_info SPEX_Left_LU_factorize //-------------------------------------------------------------------------- // Create rhos, a global dense mpz_t matrix of dimension n*1 - SPEX_CHECK (SPEX_matrix_allocate(&rhos, SPEX_DENSE, SPEX_MPZ, n, 1, n, + SPEX_CHECK (SPEX_matrix_allocate(&(F->rhos), SPEX_DENSE, SPEX_MPZ, n, 1, n, false, false, option)); // Allocate L and U without initializing each entry. @@ -151,9 +151,9 @@ SPEX_info SPEX_Left_LU_factorize // L and U are not allocated. Instead, a more efficient method to // allocate these values is done in the factorization to reduce // memory usage. - SPEX_CHECK (SPEX_matrix_allocate(&L, SPEX_CSC, SPEX_MPZ, n, n, S->lnz, + SPEX_CHECK (SPEX_matrix_allocate(&(F->L), SPEX_CSC, SPEX_MPZ, n, n, S->lnz, false, false, option)); - SPEX_CHECK (SPEX_matrix_allocate(&U, SPEX_CSC, SPEX_MPZ, n, n, S->unz, + SPEX_CHECK (SPEX_matrix_allocate(&(F->U), SPEX_CSC, SPEX_MPZ, n, n, S->unz, false, false, option)); //-------------------------------------------------------------------------- @@ -170,7 +170,7 @@ SPEX_info SPEX_Left_LU_factorize // Note that the estimate presented here is not an upper bound nor a lower // bound. It is still possible that more bits will be required which is // correctly handled internally. - int64_t estimate = 64 * SPEX_MAX (2, ceil (log2 ((double) n))) ; + int64_t estimate = 64 * SPEX_MAX (2, ceil (log2 ((double) n))); // Create x, a global dense mpz_t matrix of dimension n*1. Unlike rhos, the // second boolean parameter is set to false to avoid initializing @@ -182,7 +182,7 @@ SPEX_info SPEX_Left_LU_factorize for (i = 0; i < n; i++) { // Allocate memory for entries of x - SPEX_CHECK(SPEX_mpz_init2(x->x.mpz[i], estimate)); + SPEX_MPZ_INIT2(x->x.mpz[i], estimate); } //-------------------------------------------------------------------------- @@ -192,41 +192,41 @@ SPEX_info SPEX_Left_LU_factorize for (k = 0; k < n; k++) { // Column pointers for column k of L and U - L->p[k] = lnz; - U->p[k] = unz; - col = S->q[k]; + F->L->p[k] = lnz; + F->U->p[k] = unz; + col = F->Q_perm[k]; //---------------------------------------------------------------------- // Reallocate memory if necessary // if lnz+n > L->nzmax, L needs to expand to accomodate new nonzeros. // To do so, we double the size of the L and U matrices. //---------------------------------------------------------------------- - if (lnz + n > L->nzmax) + if (lnz + n > F->L->nzmax) { // Double the size of L - SPEX_CHECK(spex_sparse_realloc(L)); + SPEX_CHECK(spex_sparse_realloc(F->L)); } - if (unz + n > U->nzmax) + if (unz + n > F->U->nzmax) { // Double the size of U - SPEX_CHECK(spex_sparse_realloc(U)); + SPEX_CHECK(spex_sparse_realloc(F->U)); } //---------------------------------------------------------------------- // Triangular solve to compute LDx = A(:,k) //---------------------------------------------------------------------- - SPEX_CHECK(spex_left_lu_ref_triangular_solve(&top, L, A, k, xi, - (const int64_t *) (S->q), - rhos, - (const int64_t *) pinv, - (const int64_t *) row_perm, - h, x)) ; + SPEX_CHECK(spex_left_lu_ref_triangular_solve(&top, F->L, A, k, xi, + (const int64_t *) (F->Q_perm), + F->rhos, + (const int64_t *) (F->Pinv_perm), + (const int64_t *) (F->P_perm), + h, x)); //---------------------------------------------------------------------- // Obtain pivot //---------------------------------------------------------------------- SPEX_CHECK(spex_left_lu_get_pivot(&pivot, x, pivs, n, top, xi, - col, k, rhos, pinv, row_perm, option)); + col, k, F->rhos, F->Pinv_perm, F->P_perm, option)); //---------------------------------------------------------------------- // Populate L and U. We iterate across all nonzeros in x @@ -235,7 +235,7 @@ SPEX_info SPEX_Left_LU_factorize { jnew = xi[j]; // Location of x[j] in final matrix - loc = pinv[jnew]; + loc = F->Pinv_perm[jnew]; //------------------------------------------------------------------ // loc <= k are rows above k, thus go to U @@ -243,13 +243,13 @@ SPEX_info SPEX_Left_LU_factorize if (loc <= k) { // Place the i location of the unz nonzero - U->i[unz] = jnew; + F->U->i[unz] = jnew; // Find the size in bits of x[j] - SPEX_CHECK(SPEX_mpz_sizeinbase(&size, x->x.mpz[jnew], 2)); + SPEX_MPZ_SIZEINBASE(&size, x->x.mpz[jnew], 2); // GMP manual: Allocated size should be size+2 - SPEX_CHECK(SPEX_mpz_init2(U->x.mpz[unz], size+2)); + SPEX_MPZ_INIT2(F->U->x.mpz[unz], size+2); // Place the x value of the unz nonzero - SPEX_CHECK(SPEX_mpz_set(U->x.mpz[unz], x->x.mpz[jnew])); + SPEX_MPZ_SET(F->U->x.mpz[unz], x->x.mpz[jnew]); // Increment unz unz++; } @@ -260,13 +260,13 @@ SPEX_info SPEX_Left_LU_factorize if (loc >= k) { // Place the i location of the lnz nonzero - L->i[lnz] = jnew; + F->L->i[lnz] = jnew; // Set the size of x[j] - SPEX_CHECK(SPEX_mpz_sizeinbase(&size, x->x.mpz[jnew], 2)); + SPEX_MPZ_SIZEINBASE(&size, x->x.mpz[jnew], 2); // GMP manual: Allocated size should be size+2 - SPEX_CHECK(SPEX_mpz_init2(L->x.mpz[lnz], size+2)); + SPEX_MPZ_INIT2(F->L->x.mpz[lnz], size+2); // Place the x value of the lnz nonzero - SPEX_CHECK(SPEX_mpz_set(L->x.mpz[lnz], x->x.mpz[jnew])); + SPEX_MPZ_SET(F->L->x.mpz[lnz], x->x.mpz[jnew]); // Increment lnz lnz++; } @@ -274,21 +274,21 @@ SPEX_info SPEX_Left_LU_factorize } // Finalize L->p, U->p - L->p[n] = lnz; - U->p[n] = unz; + F->L->p[n] = lnz; + F->U->p[n] = unz; //-------------------------------------------------------------------------- // Free memory //-------------------------------------------------------------------------- - // free everything, but keep L, U, rhos, and pinv - SPEX_FREE_WORK ; + // free everything, but keep F + SPEX_FREE_WORKSPACE ; // This cannot fail since the size of L and U are shrinking. // Collapse L - spex_sparse_collapse(L); + spex_sparse_collapse(F->L); // Collapse U - spex_sparse_collapse(U); + spex_sparse_collapse(F->U); //-------------------------------------------------------------------------- // finalize the row indices in L and U @@ -297,12 +297,12 @@ SPEX_info SPEX_Left_LU_factorize // Permute entries in L for (i = 0; i < lnz; i++) { - L->i[i] = pinv[L->i[i]]; + F->L->i[i] = F->Pinv_perm[F->L->i[i]]; } // Permute entries in U for (i = 0; i < unz; i++) { - U->i[i] = pinv[U->i[i]]; + F->U->i[i] = F->Pinv_perm[F->U->i[i]]; } //-------------------------------------------------------------------------- @@ -310,18 +310,15 @@ SPEX_info SPEX_Left_LU_factorize //-------------------------------------------------------------------------- #if 0 - SPEX_CHECK (SPEX_matrix_check (L, option)) ; - SPEX_CHECK (SPEX_matrix_check (U, option)) ; + SPEX_CHECK (SPEX_matrix_check (F->L, option)); + SPEX_CHECK (SPEX_matrix_check (F->U, option)); #endif //-------------------------------------------------------------------------- // return result //-------------------------------------------------------------------------- - (*L_handle) = L ; - (*U_handle) = U ; - (*rhos_handle) = rhos ; - (*pinv_handle) = pinv ; - return (SPEX_OK) ; + (*F_handle) = F ; + return (SPEX_OK); } diff --git a/SPEX/SPEX_LU/Source/SPEX_lu_solve.c b/SPEX/SPEX_LU/Source/SPEX_lu_solve.c new file mode 100644 index 0000000000..4dca51d78c --- /dev/null +++ b/SPEX/SPEX_LU/Source/SPEX_lu_solve.c @@ -0,0 +1,142 @@ +//------------------------------------------------------------------------------ +// 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. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This function solves the linear system LD^(-1)U x = b. It + * essnetially serves as a wrapper for all forward and backward substitution + * routines. This function always returns the solution matrix x as a mpq_t + * matrix. If a user desires to have double or mpfr output, they must create + * a matrix copy. + * + * Input/output arguments: + * + * x_handle: A pointer to the solution vectors. Unitialized on input. + * on output, contains the exact rational solution of the system + * + * b: Set of RHS vectors + * + * F: LU factorization of A. 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. + * + * option: command options + */ + +#define SPEX_FREE_WORKSPACE \ + SPEX_matrix_free (&b2, NULL); + +#define SPEX_FREE_ALL \ + SPEX_FREE_WORKSPACE \ + SPEX_matrix_free (&x, NULL); + +#include "spex_lu_internal.h" + +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. + // input: + const SPEX_matrix b, // right hand side vector + const SPEX_options option // Command options +) +{ + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + SPEX_info info ; + if (!spex_initialized ( )) return (SPEX_PANIC); + + SPEX_REQUIRE (b, SPEX_DENSE, SPEX_MPZ); + + if (!x_handle || !F || F->kind != SPEX_LU_FACTORIZATION) + { + return SPEX_INCORRECT_INPUT; + } + + // check components of F in debug mode + ASSERT_MATRIX (F->L, SPEX_CSC, SPEX_MPZ); + ASSERT_MATRIX (F->U, SPEX_CSC, SPEX_MPZ); + ASSERT_MATRIX (F->rhos, SPEX_DENSE, SPEX_MPZ); + + //-------------------------------------------------------------------------- + // Declare and initialize workspace + //-------------------------------------------------------------------------- + + (*x_handle) = NULL; + int64_t n = F->L->n; + + SPEX_matrix x = NULL; // final solution + SPEX_matrix b2 = NULL; // permuted b + + //-------------------------------------------------------------------------- + // b2 (Pinv_perm) = b + //-------------------------------------------------------------------------- + + SPEX_CHECK (spex_permute_dense_matrix (&b2, b, F->Pinv_perm, option)); + + //-------------------------------------------------------------------------- + // b2 = L\b2, via forward substitution + //-------------------------------------------------------------------------- + + SPEX_CHECK(spex_left_lu_forward_sub(F->L, b2, F->rhos)); + + //-------------------------------------------------------------------------- + // b2 = b2 * det, where det=rhos[n-1] + //-------------------------------------------------------------------------- + + SPEX_CHECK(spex_matrix_mul(b2, F->rhos->x.mpz[n-1])); + + //-------------------------------------------------------------------------- + // b2 = U\b2, via back substitution + //-------------------------------------------------------------------------- + SPEX_CHECK(spex_left_lu_back_sub(F->U, b2)); + + //-------------------------------------------------------------------------- + // x = Q*b2/scale + //-------------------------------------------------------------------------- + // set scale = b->scale * rhos[n-1] / A_scale + SPEX_MPQ_SET_Z(b2->scale, F->rhos->x.mpz[n-1]); + SPEX_MPQ_MUL(b2->scale, b2->scale, b->scale); + SPEX_MPQ_DIV(b2->scale, b2->scale, F->scale_for_A); + + // allocate space for x as dense MPQ matrix + SPEX_CHECK (SPEX_matrix_allocate (&x, SPEX_DENSE, SPEX_MPQ, b->m, b->n, + 0, false, true, option)); + + // obtain x from permuted b2 with scale applied + for (int64_t i = 0 ; i < b->m ; i++) + { + int64_t qi = F->Q_perm[i]; + for (int64_t j = 0 ; j < b->n ; j++) + { + SPEX_MPQ_SET_Z(SPEX_2D(x, qi, j, mpq), + SPEX_2D(b2, i, j, mpz)); + SPEX_MPQ_DIV(SPEX_2D(x, qi, j, mpq), + SPEX_2D(x, qi, j, mpq), b2->scale); + } + } + + //-------------------------------------------------------------------------- + // free workspace and return result + //-------------------------------------------------------------------------- + + SPEX_FREE_WORKSPACE ; + (*x_handle) = x ; + return (SPEX_OK); +} + diff --git a/SPEX/SPEX_Left_LU/Source/spex_left_lu_back_sub.c b/SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c similarity index 65% rename from SPEX/SPEX_Left_LU/Source/spex_left_lu_back_sub.c rename to SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c index 105d2ae857..6cc147e7c1 100644 --- a/SPEX/SPEX_Left_LU/Source/spex_left_lu_back_sub.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_back_sub.c @@ -1,9 +1,9 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/spex_left_lu_back_sub: sparse REF backward substitution (x = U\x) +// SPEX_LU/spex_left_lu_back_sub: sparse REF backward substitution (x = U\x) //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. 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 //------------------------------------------------------------------------------ @@ -19,12 +19,13 @@ * by the solution x. */ -#include "spex_left_lu_internal.h" + +#include "spex_lu_internal.h" SPEX_info spex_left_lu_back_sub // performs sparse REF backward substitution ( - const SPEX_matrix *U, // input upper triangular matrix - SPEX_matrix *bx // right hand side matrix + const SPEX_matrix U, // input upper triangular matrix + SPEX_matrix bx // right hand side matrix ) { @@ -33,8 +34,8 @@ SPEX_info spex_left_lu_back_sub // performs sparse REF backward substitution //-------------------------------------------------------------------------- SPEX_info info ; - SPEX_REQUIRE (U, SPEX_CSC, SPEX_MPZ) ; - SPEX_REQUIRE (bx, SPEX_DENSE, SPEX_MPZ) ; + SPEX_REQUIRE (U, SPEX_CSC, SPEX_MPZ); + SPEX_REQUIRE (bx, SPEX_DENSE, SPEX_MPZ); //-------------------------------------------------------------------------- @@ -49,24 +50,24 @@ SPEX_info spex_left_lu_back_sub // performs sparse REF backward substitution for (int64_t j = U->n-1; j >= 0; j--) { // If bx[j] is zero skip this iteration - SPEX_CHECK( SPEX_mpz_sgn( &sgn, SPEX_2D( bx, j, k, mpz))); + SPEX_MPZ_SGN(&sgn, SPEX_2D( bx, j, k, mpz)); if (sgn == 0) {continue;} // Obtain bx[j] - SPEX_CHECK(SPEX_mpz_divexact( SPEX_2D(bx, j, k, mpz), + SPEX_MPZ_DIVEXACT(SPEX_2D(bx, j, k, mpz), SPEX_2D(bx, j, k, mpz), - Ux[Up[j+1]-1])); + Ux[Up[j+1]-1]); for (int64_t i = Up[j]; i < Up[j+1]-1; i++) { - SPEX_CHECK(SPEX_mpz_sgn(&sgn, Ux[i])); + SPEX_MPZ_SGN(&sgn, Ux[i]); if (sgn == 0) {continue;} // bx[i] = bx[i] - Ux[i]*bx[j] - SPEX_CHECK(SPEX_mpz_submul( SPEX_2D(bx, Ui[i], k, mpz), - Ux[i], SPEX_2D(bx, j, k, mpz))); + SPEX_MPZ_SUBMUL(SPEX_2D(bx, Ui[i], k, mpz), + Ux[i], SPEX_2D(bx, j, k, mpz)); } } } - return (SPEX_OK) ; + return (SPEX_OK); } diff --git a/SPEX/SPEX_Left_LU/Source/spex_left_lu_dfs.c b/SPEX/SPEX_LU/Source/spex_left_lu_dfs.c similarity index 77% rename from SPEX/SPEX_Left_LU/Source/spex_left_lu_dfs.c rename to SPEX/SPEX_LU/Source/spex_left_lu_dfs.c index d9b33be931..2f0b8cbeaf 100644 --- a/SPEX/SPEX_Left_LU/Source/spex_left_lu_dfs.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_dfs.c @@ -1,9 +1,9 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/spex_left_lu_dfs: depth-first search +// SPEX_LU/spex_left_lu_dfs: depth-first search //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. 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 //------------------------------------------------------------------------------ @@ -13,16 +13,16 @@ * indices in the xi vector. This function is modified from CSparse/cs_dfs. */ -#include "spex_left_lu_internal.h" +#include "spex_lu_internal.h" -void spex_left_lu_dfs // performs a dfs of the graph of the matrix starting at node j +void spex_left_lu_dfs // dfs of the graph of the matrix starting at node j ( - int64_t *top, // beginning of stack - int64_t j, // What node to start DFS at - SPEX_matrix* L, // matrix which represents the Graph of L - int64_t* xi, // the nonzero pattern - int64_t* pstack, // workspace vector - const int64_t* pinv // row permutation + int64_t *top, // beginning of stack + int64_t j, // What node to start DFS at + SPEX_matrix L, // matrix which represents the Graph of L + int64_t *xi, // the nonzero pattern + int64_t *pstack, // workspace vector + const int64_t *pinv // row permutation ) { @@ -30,7 +30,7 @@ void spex_left_lu_dfs // performs a dfs of the graph of the matrix starting at n // check inputs //-------------------------------------------------------------------------- - ASSERT_KIND (L, SPEX_CSC) ; + ASSERT_KIND (L, SPEX_CSC); // top xi etc already checked in the caller function diff --git a/SPEX/SPEX_Left_LU/Source/spex_left_lu_forward_sub.c b/SPEX/SPEX_LU/Source/spex_left_lu_forward_sub.c similarity index 63% rename from SPEX/SPEX_Left_LU/Source/spex_left_lu_forward_sub.c rename to SPEX/SPEX_LU/Source/spex_left_lu_forward_sub.c index 7d4b41ccc1..1e1366905e 100644 --- a/SPEX/SPEX_Left_LU/Source/spex_left_lu_forward_sub.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_forward_sub.c @@ -1,9 +1,9 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/spex_forward_sub: sparse forward substitution (x = (LD)\x) +// SPEX_LU/spex_left_lu_forward_sub: sparse forward substitution (x = (LD)\x) //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. 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,19 +16,19 @@ * system to solve is L*D*x_output = x_input, overwriting the right-hand-side * with the solution. * - * On output, the SPEX_matrix* x structure is modified. + * On output, the SPEX_matrix x is modified. */ -#define SPEX_FREE_ALL \ - SPEX_matrix_free(&h, NULL) ; +#define SPEX_FREE_ALL \ + SPEX_matrix_free(&h, NULL); -#include "spex_left_lu_internal.h" +#include "spex_lu_internal.h" SPEX_info spex_left_lu_forward_sub ( - const SPEX_matrix *L, // lower triangular matrix - SPEX_matrix *x, // right hand side matrix of size n*numRHS - const SPEX_matrix *rhos // sequence of pivots used in factorization + const SPEX_matrix L, // lower triangular matrix + SPEX_matrix x, // right hand side matrix of size n*numRHS + const SPEX_matrix rhos // sequence of pivots used in factorization ) { @@ -47,7 +47,7 @@ SPEX_info spex_left_lu_forward_sub int sgn ; // Build the history matrix - SPEX_matrix *h; + SPEX_matrix h = NULL ; SPEX_CHECK (SPEX_matrix_allocate(&h, SPEX_DENSE, SPEX_INT64, x->m, x->n, x->nzmax, false, true, NULL)); @@ -73,7 +73,7 @@ SPEX_info spex_left_lu_forward_sub { hx = SPEX_2D(h, i, k, int64); // If x[i][k] = 0, can skip operations and continue to next i - SPEX_CHECK(SPEX_mpz_sgn(&sgn, SPEX_2D(x, i, k, mpz))); + SPEX_MPZ_SGN(&sgn, SPEX_2D(x, i, k, mpz)); if (sgn == 0) {continue;} //------------------------------------------------------------------ @@ -83,15 +83,15 @@ SPEX_info spex_left_lu_forward_sub if (hx < i-1) { // x[i] = x[i] * rhos[i-1] - SPEX_CHECK(SPEX_mpz_mul( SPEX_2D(x, i, k, mpz), - SPEX_2D(x, i, k, mpz), - SPEX_1D(rhos, i-1, mpz))); + SPEX_MPZ_MUL(SPEX_2D(x, i, k, mpz), + SPEX_2D(x, i, k, mpz), + SPEX_1D(rhos, i-1, mpz)); // x[i] = x[i] / rhos[hx] if (hx > -1) { - SPEX_CHECK(SPEX_mpz_divexact( SPEX_2D(x, i, k, mpz), - SPEX_2D(x, i, k, mpz), - SPEX_1D(rhos, hx, mpz))); + SPEX_MPZ_DIVEXACT(SPEX_2D(x, i, k, mpz), + SPEX_2D(x, i, k, mpz), + SPEX_1D(rhos, hx, mpz)); } } @@ -106,27 +106,26 @@ SPEX_info spex_left_lu_forward_sub jnew = L->i[j]; // skip if Lx[j] is zero - SPEX_CHECK(SPEX_mpz_sgn(&sgn, L->x.mpz[j])); + SPEX_MPZ_SGN(&sgn, L->x.mpz[j]); if (sgn == 0) {continue;} // j > i if (jnew > i) { // check if x[jnew] is zero - SPEX_CHECK(SPEX_mpz_sgn(&sgn, SPEX_2D(x, jnew, k, mpz))); + SPEX_MPZ_SGN(&sgn, SPEX_2D(x, jnew, k, mpz)); if (sgn == 0) { // x[j] = x[j] - lji xi - SPEX_CHECK(SPEX_mpz_submul(SPEX_2D(x, jnew, k, mpz), - SPEX_1D(L, j, mpz), - SPEX_2D(x, i, k, mpz))); + SPEX_MPZ_SUBMUL(SPEX_2D(x, jnew, k, mpz), + SPEX_1D(L, j, mpz), + SPEX_2D(x, i, k, mpz)); // x[j] = x[j] / rhos[i-1] if (i > 0) { - SPEX_CHECK( - SPEX_mpz_divexact(SPEX_2D(x, jnew, k, mpz), - SPEX_2D(x, jnew, k, mpz), - SPEX_1D(rhos, i-1, mpz))); + SPEX_MPZ_DIVEXACT(SPEX_2D(x, jnew, k, mpz), + SPEX_2D(x, jnew, k, mpz), + SPEX_1D(rhos, i-1, mpz)); } } else @@ -136,33 +135,31 @@ SPEX_info spex_left_lu_forward_sub if (hx < i-1) { // x[j] = x[j] * rhos[i-1] - SPEX_CHECK(SPEX_mpz_mul(SPEX_2D(x, jnew, k, mpz), - SPEX_2D(x, jnew, k, mpz), - SPEX_1D(rhos, i-1, mpz))); + SPEX_MPZ_MUL(SPEX_2D(x, jnew, k, mpz), + SPEX_2D(x, jnew, k, mpz), + SPEX_1D(rhos, i-1, mpz)); // x[j] = x[j] / rhos[hx] if (hx > -1) { - SPEX_CHECK( - SPEX_mpz_divexact(SPEX_2D(x, jnew, k, mpz), - SPEX_2D(x, jnew, k, mpz), - SPEX_1D(rhos, hx, mpz))); + SPEX_MPZ_DIVEXACT(SPEX_2D(x, jnew, k, mpz), + SPEX_2D(x, jnew, k, mpz), + SPEX_1D(rhos, hx, mpz)); } } // x[j] = x[j] * rhos[i] - SPEX_CHECK(SPEX_mpz_mul(SPEX_2D(x, jnew, k, mpz), - SPEX_2D(x, jnew, k, mpz), - SPEX_1D(rhos, i, mpz))); + SPEX_MPZ_MUL(SPEX_2D(x, jnew, k, mpz), + SPEX_2D(x, jnew, k, mpz), + SPEX_1D(rhos, i, mpz)); // x[j] = x[j] - lmi xi - SPEX_CHECK(SPEX_mpz_submul(SPEX_2D(x, jnew, k, mpz), - SPEX_1D(L, j, mpz), - SPEX_2D(x, i, k, mpz))); + SPEX_MPZ_SUBMUL(SPEX_2D(x, jnew, k, mpz), + SPEX_1D(L, j, mpz), + SPEX_2D(x, i, k, mpz)); // x[j] = x[j] / rhos[i-1] if (i > 0) { - SPEX_CHECK( - SPEX_mpz_divexact(SPEX_2D(x, jnew, k, mpz), - SPEX_2D(x, jnew, k, mpz), - SPEX_1D(rhos, i-1, mpz))); + SPEX_MPZ_DIVEXACT(SPEX_2D(x, jnew, k, mpz), + SPEX_2D(x, jnew, k, mpz), + SPEX_1D(rhos, i-1, mpz)); } } //h[jnew][k] = i; diff --git a/SPEX/SPEX_Left_LU/Source/spex_left_lu_get_largest_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_largest_pivot.c similarity index 78% rename from SPEX/SPEX_Left_LU/Source/spex_left_lu_get_largest_pivot.c rename to SPEX/SPEX_LU/Source/spex_left_lu_get_largest_pivot.c index d2fb454fd6..cd96bb01ed 100644 --- a/SPEX/SPEX_Left_LU/Source/spex_left_lu_get_largest_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_largest_pivot.c @@ -1,9 +1,9 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/spex_left_lu_get_largest_pivot: find a pivot entry in a column +// SPEX_LU/spex_left_lu_get_largest_pivot: find a pivot entry in a column //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. 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 //------------------------------------------------------------------------------ @@ -17,20 +17,20 @@ * On output, the index of the largest pivot is returned. */ -#define SPEX_FREE_ALL \ +#define SPEX_FREE_ALL \ SPEX_MPZ_CLEAR(big); -#include "spex_left_lu_internal.h" +#include "spex_lu_internal.h" SPEX_info spex_left_lu_get_largest_pivot ( int64_t *pivot, // the index of largest pivot - SPEX_matrix* x, // kth column of L and U - int64_t* pivs, // vector which indicates whether each row + SPEX_matrix x, // kth column of L and U + int64_t *pivs, // vector which indicates whether each row // has been pivotal int64_t n, // dimension of problem int64_t top, // nonzero pattern is located in xi[top..n-1] - int64_t* xi // nonzero pattern of x + int64_t *xi // nonzero pattern of x ) { @@ -51,8 +51,8 @@ SPEX_info spex_left_lu_get_largest_pivot int r ; (*pivot) = -1 ; mpz_t big ; - SPEX_MPZ_SET_NULL (big) ; - SPEX_CHECK (SPEX_mpz_init (big)) ; + SPEX_MPZ_SET_NULL (big); + SPEX_MPZ_INIT (big); //-------------------------------------------------------------------------- // Iterate accross the nonzeros in x @@ -63,13 +63,13 @@ SPEX_info spex_left_lu_get_largest_pivot // Location of the ith nonzero inew = xi[i]; // inew can be pivotal - SPEX_CHECK(SPEX_mpz_cmpabs(&r, big, x->x.mpz[inew])); + SPEX_MPZ_CMPABS(&r, big, x->x.mpz[inew]); if (pivs[inew] < 0 && r < 0) { // Current largest pivot location (*pivot) = inew; // Current largest pivot value - SPEX_CHECK(SPEX_mpz_set(big, x->x.mpz[inew])); + SPEX_MPZ_SET(big, x->x.mpz[inew]); } } diff --git a/SPEX/SPEX_Left_LU/Source/spex_left_lu_get_nonzero_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_nonzero_pivot.c similarity index 72% rename from SPEX/SPEX_Left_LU/Source/spex_left_lu_get_nonzero_pivot.c rename to SPEX/SPEX_LU/Source/spex_left_lu_get_nonzero_pivot.c index 94311aee73..3dc8e88bf0 100644 --- a/SPEX/SPEX_Left_LU/Source/spex_left_lu_get_nonzero_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_nonzero_pivot.c @@ -1,32 +1,32 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/spex_left_lu_get_nonzero_pivot: find a nonzero pivot in a column +// SPEX_LU/spex_left_lu_get_nonzero_pivot: find a nonzero pivot in a column //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. 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 //------------------------------------------------------------------------------ -/* Purpose: This function obtains the first eligible nonzero pivot - * This is enabled if the user sets option->pivot = SPEX_FIRST_NONZERO +/* Purpose: This function obtains the first eligible nonzero pivot. This is + * enabled if the user sets option->pivot = SPEX_FIRST_NONZERO * - * Note: This pivoting scheme is NOT recommended for SPEX Left LU. It is provided - * for comparison with other pivoting options. + * Note: This pivoting scheme is NOT recommended for SPEX Left LU. It is + * provided for comparison with other pivoting options. * * On output, the kth pivot is returned. */ -#include "spex_left_lu_internal.h" +#include "spex_lu_internal.h" -SPEX_info spex_left_lu_get_nonzero_pivot // find the first eligible nonzero pivot +SPEX_info spex_left_lu_get_nonzero_pivot // find first eligible nonzero pivot ( int64_t *pivot, // the index of first eligible nonzero pivot - SPEX_matrix* x, // kth column of L and U - int64_t* pivs, // vector indicating which rows are pivotal + SPEX_matrix x, // kth column of L and U + int64_t *pivs, // vector indicating which rows are pivotal int64_t n, // size of x int64_t top, // nonzero pattern is located in xi[top..n-1] - int64_t* xi // nonzero pattern of x + int64_t *xi // nonzero pattern of x ) { @@ -55,7 +55,7 @@ SPEX_info spex_left_lu_get_nonzero_pivot // find the first eligible nonzero pivo int64_t inew = xi[i]; // check if x[inew] is an eligible pivot int sgn ; - SPEX_CHECK (SPEX_mpz_sgn (&sgn, x->x.mpz[inew])) ; + SPEX_MPZ_SGN (&sgn, x->x.mpz[inew]); if (sgn != 0 && pivs [inew] < 0) { (*pivot) = inew; diff --git a/SPEX/SPEX_Left_LU/Source/spex_left_lu_get_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c similarity index 63% rename from SPEX/SPEX_Left_LU/Source/spex_left_lu_get_pivot.c rename to SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c index a0f2f39289..3e8753b18f 100644 --- a/SPEX/SPEX_Left_LU/Source/spex_left_lu_get_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c @@ -1,9 +1,9 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/spex_left_lu_get_pivot: find a pivot entry in a column +// SPEX_LU/spex_left_lu_get_pivot: find a pivot entry in a column //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. 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 //------------------------------------------------------------------------------ @@ -14,7 +14,7 @@ * SPEX_SMALLEST = 0, Smallest pivot * SPEX_DIAGONAL = 1, Diagonal pivoting * SPEX_FIRST_NONZERO = 2, First nonzero per column chosen as pivot - * SPEX_TOL_SMALLEST = 3, Diagonal pivoting with tolerance for pivot. (Default) + * SPEX_TOL_SMALLEST = 3, Diagonal pivoting with tolerance for pivot (default) * SPEX_TOL_LARGEST = 4, Diagonal pivoting with tolerance for largest pivot * SPEX_LARGEST = 5 Largest pivot * @@ -25,26 +25,26 @@ */ #define SPEX_FREE_ALL \ - SPEX_MPQ_CLEAR (tol) ; \ - SPEX_MPQ_CLEAR (ratio) ; + SPEX_MPQ_CLEAR (tol); \ + SPEX_MPQ_CLEAR (ratio); -#include "spex_left_lu_internal.h" +#include "spex_lu_internal.h" SPEX_info spex_left_lu_get_pivot ( int64_t *pivot, // found index of pivot entry - SPEX_matrix* x, // kth column of L and U - int64_t* pivs, // vector indicating which rows have been pivotal + SPEX_matrix x, // kth column of L and U + int64_t *pivs, // vector indicating which rows have been pivotal int64_t n, // dimension of the problem int64_t top, // nonzero pattern is located in xi[top..n-1] - int64_t* xi, // nonzero pattern of x + int64_t *xi, // nonzero pattern of x int64_t col, // current column of A (real kth column i.e., q[k]) int64_t k, // iteration of the algorithm - SPEX_matrix* rhos, // vector of pivots - int64_t* pinv, // row permutation - int64_t* row_perm, // opposite of pinv. + SPEX_matrix rhos, // vector of pivots + int64_t *pinv, // row permutation + int64_t *row_perm, // opposite of pinv. // if pinv[i] = j then row_perm[j] = i - const SPEX_options* option // command options + const SPEX_options option // command options ) { @@ -56,14 +56,6 @@ SPEX_info spex_left_lu_get_pivot SPEX_REQUIRE(rhos, SPEX_DENSE, SPEX_MPZ); SPEX_REQUIRE(x, SPEX_DENSE, SPEX_MPZ); - // inputs have been checked in the only caller SPEX_Left_LU_factorize - // they are kept here for future reference -#if 0 - if (!pivot || !pivs || !xi || !pinv || !row_perm ) - { - return SPEX_INCORRECT_INPUT; - } -#endif // pivoting method to use (see above description) SPEX_pivot order = SPEX_OPTION_PIVOT(option); // tolerance used if some tol-based pivoting is used @@ -78,107 +70,120 @@ SPEX_info spex_left_lu_get_pivot SPEX_MPQ_SET_NULL(tol); SPEX_MPQ_SET_NULL(ratio); - //-------------------------------------------------------------------------- - // Smallest pivot - //-------------------------------------------------------------------------- - if (order == SPEX_SMALLEST) { + + //---------------------------------------------------------------------- + // Smallest pivot + //---------------------------------------------------------------------- + SPEX_CHECK(spex_left_lu_get_smallest_pivot(pivot, x, pivs, n, top, xi)); - } - //-------------------------------------------------------------------------- - // Diagonal - //-------------------------------------------------------------------------- + } else if (order == SPEX_DIAGONAL) { + + //---------------------------------------------------------------------- + // Diagonal + //---------------------------------------------------------------------- + // Check if x[col] is eligible. take smallest pivot if not - SPEX_CHECK (SPEX_mpz_sgn(&sgn, x->x.mpz[col])); + SPEX_MPZ_SGN(&sgn, x->x.mpz[col]); if (sgn != 0 && pivs[col] < 0) { *pivot = col; } else { - SPEX_CHECK (spex_left_lu_get_smallest_pivot(pivot, x, pivs, n, top, xi)); + SPEX_CHECK (spex_left_lu_get_smallest_pivot(pivot, x, pivs, n, + top, xi)); } - } - //-------------------------------------------------------------------------- - // First nonzero - //-------------------------------------------------------------------------- + } else if (order == SPEX_FIRST_NONZERO) { + + //---------------------------------------------------------------------- + // First nonzero + //---------------------------------------------------------------------- + SPEX_CHECK (spex_left_lu_get_nonzero_pivot(pivot, x, pivs, n, top, xi)); - } - //-------------------------------------------------------------------------- - // Tolerance with largest pivot - //-------------------------------------------------------------------------- + } else if (order == SPEX_TOL_LARGEST) { + + //---------------------------------------------------------------------- + // Tolerance with largest pivot + //---------------------------------------------------------------------- + SPEX_CHECK (spex_left_lu_get_largest_pivot(pivot, x, pivs, n, top, xi)); //---------------------------------------------------------------------- // Check x[col] vs largest potential pivot //---------------------------------------------------------------------- - SPEX_CHECK (SPEX_mpz_sgn(&sgn, x->x.mpz[col])); + SPEX_MPZ_SGN(&sgn, x->x.mpz[col]); if (sgn != 0 && pivs[col] < 0) { - SPEX_CHECK(SPEX_mpq_init(tol)); - SPEX_CHECK(SPEX_mpq_init(ratio)); + SPEX_MPQ_INIT(tol); + SPEX_MPQ_INIT(ratio); // tol = user specified tolerance - SPEX_CHECK(SPEX_mpq_set_d(tol, tolerance)); + SPEX_MPQ_SET_D(tol, tolerance); // ratio = diagonal/largest - SPEX_CHECK(SPEX_mpq_set_num(ratio, x->x.mpz[col])); - SPEX_CHECK(SPEX_mpq_set_den(ratio, x->x.mpz[*pivot])); + SPEX_MPQ_SET_NUM(ratio, x->x.mpz[col]); + SPEX_MPQ_SET_DEN(ratio, x->x.mpz[*pivot]); // ratio = |ratio| - SPEX_CHECK(SPEX_mpq_abs(ratio, ratio)); + SPEX_MPQ_ABS(ratio, ratio); // Is ratio >= tol? - SPEX_CHECK(SPEX_mpq_cmp(&r, ratio, tol)); + SPEX_MPQ_CMP(&r, ratio, tol); if (r >= 0) { *pivot = col; } } - } - //-------------------------------------------------------------------------- - // Use the largest potential pivot - //-------------------------------------------------------------------------- + } else if (order == SPEX_LARGEST) { + + //---------------------------------------------------------------------- + // Use the largest potential pivot + //---------------------------------------------------------------------- + SPEX_CHECK (spex_left_lu_get_largest_pivot(pivot, x, pivs, n, top, xi)); - } - //-------------------------------------------------------------------------- - // Tolerance with smallest pivot (default option) - //-------------------------------------------------------------------------- + } else // if (order == SPEX_TOL_SMALLEST) { - SPEX_CHECK (spex_left_lu_get_smallest_pivot(pivot, x, pivs, n, top, xi)) ; + + //---------------------------------------------------------------------- + // Tolerance with smallest pivot (default option) + //---------------------------------------------------------------------- + + SPEX_CHECK (spex_left_lu_get_smallest_pivot(pivot, x, pivs, n, top, + xi)); //---------------------------------------------------------------------- // Checking x[col] vs smallest pivot //---------------------------------------------------------------------- - SPEX_CHECK (SPEX_mpz_sgn(&sgn, x->x.mpz[col])); + SPEX_MPZ_SGN(&sgn, x->x.mpz[col]); if (sgn != 0 && pivs[col] < 0) { // Initialize tolerance and ratio - SPEX_CHECK(SPEX_mpq_init(tol)); - SPEX_CHECK(SPEX_mpq_init(ratio)); + SPEX_MPQ_INIT(tol); + SPEX_MPQ_INIT(ratio); // ratio = |smallest/diagonal| - SPEX_CHECK(SPEX_mpz_abs(SPEX_MPQ_NUM(ratio), x->x.mpz[*pivot])); - SPEX_CHECK(SPEX_mpz_abs(SPEX_MPQ_DEN(ratio), x->x.mpz[col])); + SPEX_MPZ_ABS(SPEX_MPQ_NUM(ratio), x->x.mpz[*pivot]); + SPEX_MPZ_ABS(SPEX_MPQ_DEN(ratio), x->x.mpz[col]); // Set user specified tolerance - SPEX_CHECK(SPEX_mpq_set_d(tol, tolerance)); + SPEX_MPQ_SET_D(tol, tolerance); // Is ratio >= tol? - SPEX_CHECK(SPEX_mpq_cmp(&r, ratio, tol)); + SPEX_MPQ_CMP(&r, ratio, tol); if (r >= 0) { *pivot = col; @@ -189,6 +194,7 @@ SPEX_info spex_left_lu_get_pivot //-------------------------------------------------------------------------- // Reflect changes in row location & row_perm //-------------------------------------------------------------------------- + // Must move pivot into position k int64_t intermed = pinv[*pivot]; int64_t intermed2 = row_perm[k]; @@ -203,15 +209,15 @@ SPEX_info spex_left_lu_get_pivot pinv[intermed2] = intermed; // Row pivot is now pivotal pivs[*pivot] = 1; - + // Set the kth pivot. size_t size; // Get the size of x[pivot] - SPEX_CHECK(SPEX_mpz_sizeinbase(&size, x->x.mpz[*pivot], 2)); + SPEX_MPZ_SIZEINBASE(&size, x->x.mpz[*pivot], 2); // GMP manual: Allocated size should be size+2 - SPEX_CHECK(SPEX_mpz_init2(rhos->x.mpz[k], size+2)); - // The kth pivot is x[pivot] - SPEX_CHECK (SPEX_mpz_set(rhos->x.mpz[k], x->x.mpz[*pivot])); + SPEX_MPZ_INIT2(rhos->x.mpz[k], size+2); + // The kth pivot is x[pivot] + SPEX_MPZ_SET(rhos->x.mpz[k], x->x.mpz[*pivot]); // Free memory SPEX_FREE_ALL; diff --git a/SPEX/SPEX_Left_LU/Source/spex_left_lu_get_smallest_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_smallest_pivot.c similarity index 79% rename from SPEX/SPEX_Left_LU/Source/spex_left_lu_get_smallest_pivot.c rename to SPEX/SPEX_LU/Source/spex_left_lu_get_smallest_pivot.c index 2f3c9b544b..2769471194 100644 --- a/SPEX/SPEX_Left_LU/Source/spex_left_lu_get_smallest_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_smallest_pivot.c @@ -1,9 +1,9 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/spex_left_lu_get_smallest_pivot: find the smallest entry in a column +// SPEX_LU/spex_left_lu_get_smallest_pivot: find the smallest entry in a column //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. 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 //------------------------------------------------------------------------------ @@ -15,19 +15,19 @@ * On output, the index of kth pivot is returned. */ -#define SPEX_FREE_ALL \ +#define SPEX_FREE_ALL \ SPEX_MPZ_CLEAR(small); -#include "spex_left_lu_internal.h" +#include "spex_lu_internal.h" SPEX_info spex_left_lu_get_smallest_pivot ( int64_t *pivot, // the index of smallest pivot - SPEX_matrix* x, // kth column of L and U - int64_t* pivs, // vector indicating if each row has been pivotal + SPEX_matrix x, // kth column of L and U + int64_t *pivs, // vector indicating if each row has been pivotal int64_t n, // dimension of problem int64_t top, // nonzeros are stored in xi[top..n-1] - int64_t* xi // nonzero pattern of x + int64_t *xi // nonzero pattern of x ) { @@ -50,7 +50,7 @@ SPEX_info spex_left_lu_get_smallest_pivot j = n; flag = top; mpz_t small; SPEX_MPZ_SET_NULL(small); - SPEX_CHECK(SPEX_mpz_init(small)); + SPEX_MPZ_INIT(small); //-------------------------------------------------------------------------- // Find an initial pivot. Fails if all terms are 0 in array x @@ -62,11 +62,11 @@ SPEX_info spex_left_lu_get_smallest_pivot inew = xi[flag]; //check if inew can be pivotal - SPEX_CHECK(SPEX_mpz_sgn(&sgn, x->x.mpz[inew])); + SPEX_MPZ_SGN(&sgn, x->x.mpz[inew]); if (pivs[inew] < 0 && sgn != 0) { // Current smallest pivot - SPEX_CHECK(SPEX_mpz_set(small, x->x.mpz[inew])); + SPEX_MPZ_SET(small, x->x.mpz[inew]); // Current smallest pivot location *pivot = inew; // Where to start the search for rest of nonzeros @@ -86,16 +86,16 @@ SPEX_info spex_left_lu_get_smallest_pivot { inew = xi[i]; // check if inew can be pivotal - SPEX_CHECK(SPEX_mpz_cmpabs(&r, small, x->x.mpz[inew])); + SPEX_MPZ_CMPABS(&r, small, x->x.mpz[inew]); if (pivs[inew] < 0 && r > 0) { - SPEX_CHECK(SPEX_mpz_sgn(&sgn, x->x.mpz[inew])); + SPEX_MPZ_SGN(&sgn, x->x.mpz[inew]); if (sgn != 0) { // Current best pivot location *pivot = inew; // Current best pivot value - SPEX_CHECK(SPEX_mpz_set(small, x->x.mpz[inew])); + SPEX_MPZ_SET(small, x->x.mpz[inew]); } } } diff --git a/SPEX/SPEX_Left_LU/Source/spex_left_lu_reach.c b/SPEX/SPEX_LU/Source/spex_left_lu_reach.c similarity index 71% rename from SPEX/SPEX_Left_LU/Source/spex_left_lu_reach.c rename to SPEX/SPEX_LU/Source/spex_left_lu_reach.c index d3efec73d0..e73d84f413 100644 --- a/SPEX/SPEX_Left_LU/Source/spex_left_lu_reach.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_reach.c @@ -1,14 +1,14 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/spex_left_lu_reach: compute the set of nodes reachable from an input set +// SPEX_LU/spex_left_lu_reach: compute set of nodes reachable from an input set //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. 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 //------------------------------------------------------------------------------ -#include "spex_left_lu_internal.h" +#include "spex_lu_internal.h" /* Purpose: This function computes the reach of column k of A on the graph of L * mathematically that is: xi = Reach(A(:,k))_G_L @@ -16,14 +16,14 @@ * This function is derived from CSparse/cs_reach.c */ -void spex_left_lu_reach // compute the reach of column k of A on the graph of L +void spex_left_lu_reach // compute reach of column k of A on the graph of L ( int64_t *top, - SPEX_matrix* L, // matrix representing graph of L - const SPEX_matrix* A, // input matrix + SPEX_matrix L, // matrix representing graph of L + const SPEX_matrix A, // input matrix int64_t k, // column of A of interest - int64_t* xi, // nonzero pattern - const int64_t* pinv // row permutation + int64_t *xi, // nonzero pattern + const int64_t *pinv // row permutation ) { @@ -33,7 +33,7 @@ void spex_left_lu_reach // compute the reach of column k of A on the graph of if (top == NULL) { return ;} // inputs have been checked in spex_ref_triangular_solve int64_t p, n = L->n; - *top = n; + (*top) = n; //-------------------------------------------------------------------------- // Iterating across number of nonzero in column k diff --git a/SPEX/SPEX_Left_LU/Source/spex_left_lu_ref_triangular_solve.c b/SPEX/SPEX_LU/Source/spex_left_lu_ref_triangular_solve.c similarity index 77% rename from SPEX/SPEX_Left_LU/Source/spex_left_lu_ref_triangular_solve.c rename to SPEX/SPEX_LU/Source/spex_left_lu_ref_triangular_solve.c index 1fd62319da..f28161020e 100644 --- a/SPEX/SPEX_Left_LU/Source/spex_left_lu_ref_triangular_solve.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_ref_triangular_solve.c @@ -1,9 +1,9 @@ //------------------------------------------------------------------------------ -// SPEX_Left_LU/spex_left_lu_ref_triangular_solve: sparse REF triangular solve +// SPEX_LU/spex_left_lu_ref_triangular_solve: sparse REF triangular solve //------------------------------------------------------------------------------ -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. 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 //------------------------------------------------------------------------------ @@ -67,36 +67,28 @@ * output. */ -#include "spex_left_lu_internal.h" + +#include "spex_lu_internal.h" // Sorting function static inline int compare (const void * a, const void * b) { - int64_t delta = ( *(int64_t*)a - *(int64_t*)b ) ; - //return value for delta==0 won't matter since it's not happening here - if (delta < 0) - { - return (-1) ; - } - else// if (delta >= 0) - { - return (1) ; - } + return ( *(int64_t*)a - *(int64_t*)b ); } -SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangular solve +SPEX_info spex_left_lu_ref_triangular_solve // sparse REF triangular solve ( int64_t *top_output, // Output the beginning of nonzero pattern - SPEX_matrix* L, // partial L matrix - const SPEX_matrix* A, // input matrix + SPEX_matrix L, // partial L matrix + const SPEX_matrix A, // input matrix int64_t k, // constructing L(:,k) - int64_t* xi, // nonzero pattern vector - const int64_t* q, // column permutation, not modified - SPEX_matrix* rhos, // sequence of pivots - const int64_t* pinv, // inverse row permutation - const int64_t* row_perm, // row permutation - int64_t* h, // history vector - SPEX_matrix* x // solution of system ==> kth column of L and U + int64_t *xi, // nonzero pattern vector + const int64_t *q, // column permutation, not modified + SPEX_matrix rhos, // sequence of pivots + const int64_t *pinv, // inverse row permutation + const int64_t *row_perm, // row permutation + int64_t *h, // history vector + SPEX_matrix x // solution of system ==> kth column of L and U ) { @@ -104,7 +96,7 @@ SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangula // check inputs //-------------------------------------------------------------------------- - // inputs have been validated in SPEX_Left_LU_factorize.c + // inputs have been validated in SPEX_lu_factorize SPEX_info info ; SPEX_REQUIRE(L, SPEX_CSC, SPEX_MPZ); SPEX_REQUIRE(A, SPEX_CSC, SPEX_MPZ); @@ -151,7 +143,7 @@ SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangula // Reset x[i] = 0 for all i in nonzero pattern xi [top..n-1] for (i = top; i < n; i++) { - SPEX_CHECK (SPEX_mpz_set_ui (x_mpz[xi [i]], 0)) ; + SPEX_MPZ_SET_UI (x_mpz[xi [i]], 0); } // Set x[col] = 0. A(col,col) is the diagonal entry in the original // matrix. The pivot search prefers to select the diagonal, if it is @@ -159,7 +151,7 @@ SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangula // not in the pattern xi [top..n-1]. The value x[col] is set to zero // here, in case the entry A(col,col) is not present, so that the pivot // search query the value of the diagonal. - SPEX_CHECK(SPEX_mpz_set_ui(x_mpz[col], 0)); + SPEX_MPZ_SET_UI(x_mpz[col], 0); // Reset h[i] = -1 for all i in nonzero pattern xi [top..n-1] for (i = top; i < n; i++) @@ -171,7 +163,7 @@ SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangula for (i = A->p[col]; i < A->p[col + 1]; i++) { // Value of the ith nonzero - SPEX_CHECK(SPEX_mpz_set(x_mpz[A->i[i]], Ax_mpz[i])); + SPEX_MPZ_SET(x_mpz[A->i[i]], Ax_mpz[i]); } @@ -184,7 +176,7 @@ SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangula j = xi[p]; // First nonzero term jnew = pinv[j]; // Location of nonzero term // Check if x[j] == 0, if so continue to next nonzero - SPEX_CHECK(SPEX_mpz_sgn(&sgn, x_mpz[j])); + SPEX_MPZ_SGN(&sgn, x_mpz[j]); if (sgn == 0) {continue;} // x[j] = 0 no work must be done // x[j] is nonzero @@ -196,13 +188,13 @@ SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangula if (h[j] < jnew - 1) // HU must be performed { // x[j] = x[j] * rho[j-1] - SPEX_CHECK(SPEX_mpz_mul(x_mpz[j],x_mpz[j],rhos_mpz[jnew-1])); + SPEX_MPZ_MUL(x_mpz[j],x_mpz[j],rhos_mpz[jnew-1]); if (h[j] > -1) { // x[j] = x[j] / rho[h[j]] - SPEX_CHECK(SPEX_mpz_divexact(x_mpz[j],x_mpz[j], - rhos_mpz[h[j]])); + SPEX_MPZ_DIVEXACT(x_mpz[j],x_mpz[j], + rhos_mpz[h[j]]); } } @@ -218,11 +210,11 @@ SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangula if (inew > jnew) { /*************** If lij==0 then no update******************/ - SPEX_CHECK(SPEX_mpz_sgn(&sgn, Lx_mpz[m])); + SPEX_MPZ_SGN(&sgn, Lx_mpz[m]); if (sgn == 0) {continue;} // lij is nonzero. Check if x[i] is nonzero - SPEX_CHECK(SPEX_mpz_sgn(&sgn, x_mpz[i])); + SPEX_MPZ_SGN(&sgn, x_mpz[i]); //---------------------------------------------------------- /************* lij is nonzero, x[i] is zero****************/ @@ -236,8 +228,8 @@ SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangula if (jnew < 1) { // x[i] = 0 - lij*x[j] - SPEX_CHECK(SPEX_mpz_submul(x_mpz[i], Lx_mpz[m], - x_mpz[j])); + SPEX_MPZ_SUBMUL(x_mpz[i], Lx_mpz[m], + x_mpz[j]); h[i] = jnew; // Entry is up to date } @@ -245,12 +237,12 @@ SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangula else { // x[i] = 0 - lij*x[j] - SPEX_CHECK(SPEX_mpz_submul(x_mpz[i], Lx_mpz[m], - x_mpz[j])); + SPEX_MPZ_SUBMUL(x_mpz[i], Lx_mpz[m], + x_mpz[j]); // x[i] = x[i] / rho[j-1] - SPEX_CHECK(SPEX_mpz_divexact(x_mpz[i], x_mpz[i], - rhos_mpz[jnew-1])); + SPEX_MPZ_DIVEXACT(x_mpz[i], x_mpz[i], + rhos_mpz[jnew-1]); h[i] = jnew; // Entry is up to date } } @@ -265,12 +257,11 @@ SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangula if (jnew < 1) { // x[i] = x[i]*rho[0] - SPEX_CHECK(SPEX_mpz_mul(x_mpz[i],x_mpz[i], - rhos_mpz[0])); + SPEX_MPZ_MUL(x_mpz[i], x_mpz[i], rhos_mpz[0]); // x[i] = x[i] - lij*xj - SPEX_CHECK(SPEX_mpz_submul(x_mpz[i], Lx_mpz[m], - x_mpz[j])); + SPEX_MPZ_SUBMUL(x_mpz[i], Lx_mpz[m], + x_mpz[j]); h[i] = jnew; // Entry is now up to date } // There is a previous pivot @@ -280,24 +271,23 @@ SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangula if (h[i] < jnew - 1) { // x[i] = x[i] * rho[j-1] - SPEX_CHECK(SPEX_mpz_mul(x_mpz[i], x_mpz[i], - rhos_mpz[jnew-1])); + SPEX_MPZ_MUL(x_mpz[i], x_mpz[i], + rhos_mpz[jnew-1]); if (h[i] > -1) { // x[i] = x[i] / rho[h[i]] - SPEX_CHECK(SPEX_mpz_divexact(x_mpz[i], - x_mpz[i], rhos_mpz[h[i]])); + SPEX_MPZ_DIVEXACT(x_mpz[i], + x_mpz[i], rhos_mpz[h[i]]); } } // x[i] = x[i] * rho[j] - SPEX_CHECK(SPEX_mpz_mul(x_mpz[i],x_mpz[i], - rhos_mpz[jnew])); + SPEX_MPZ_MUL(x_mpz[i], x_mpz[i], rhos_mpz[jnew]); // x[i] = x[i] - lij*xj - SPEX_CHECK(SPEX_mpz_submul(x_mpz[i], Lx_mpz[m], - x_mpz[j])); + SPEX_MPZ_SUBMUL(x_mpz[i], Lx_mpz[m], + x_mpz[j]); // x[i] = x[i] / rho[j-1] - SPEX_CHECK(SPEX_mpz_divexact(x_mpz[i], x_mpz[i], - rhos_mpz[jnew-1])); + SPEX_MPZ_DIVEXACT(x_mpz[i], x_mpz[i], + rhos_mpz[jnew-1]); h[i] = jnew; // Entry is up to date } } @@ -312,18 +302,18 @@ SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangula if (h[j] < k-1) { // x[j] = x[j] * rho[k-1] - SPEX_CHECK(SPEX_mpz_mul(x_mpz[j], x_mpz[j], rhos_mpz[k-1])); + SPEX_MPZ_MUL(x_mpz[j], x_mpz[j], rhos_mpz[k-1]); if (h[j] > -1) { // x[j] = x[j] / rho[h[j]] - SPEX_CHECK(SPEX_mpz_divexact(x_mpz[j], x_mpz[j], - rhos_mpz[h[j]])); + SPEX_MPZ_DIVEXACT(x_mpz[j], x_mpz[j], + rhos_mpz[h[j]]); } } } } // Output the beginning of nonzero pattern - *top_output = top; + (*top_output) = top; return SPEX_OK; } diff --git a/SPEX/SPEX_LU/Source/spex_lu_internal.h b/SPEX/SPEX_LU/Source/spex_lu_internal.h new file mode 100644 index 0000000000..577e4bf463 --- /dev/null +++ b/SPEX/SPEX_LU/Source/spex_lu_internal.h @@ -0,0 +1,183 @@ +//------------------------------------------------------------------------------ +// SPEX_LU/Source/spex_left_lu_internal: include file for internal use in +// SPEX_LU +//------------------------------------------------------------------------------ + +// 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 + +//------------------------------------------------------------------------------ + +// This file is not intended to be #include'd in user applications. Use +// SPEX.h instead. + +#ifndef SPEX_LEFT_LU_INTERNAL_H +#define SPEX_LEFT_LU_INTERNAL_H + +#include "spex_util_internal.h" + +// ============================================================================ +// Internal Functions +// ============================================================================ + +/* Purpose: This function performs sparse REF forward substitution. This is + * essentially the same as the sparse REF triangular solve applied to each + * column of the right hand side vectors. Like the normal one, this function + * expects that the matrix x is dense. As a result,the nonzero pattern is not + * computed and each nonzero in x is iterated across. The system to solve is + * LDx = x. On output, the mpz_t** x structure is modified. + */ + +SPEX_info spex_left_lu_forward_sub +( + const SPEX_matrix L, // lower triangular matrix + SPEX_matrix x, // right hand side matrix of size n*numRHS + const SPEX_matrix rhos // sequence of pivots used in factorization +) ; + +/* Purpose: This function performs sparse REF backward substitution. In essense + * it solves the sysem Ux = x. Note that prior to this, we expect x to be + * multiplied by the determinant of A. The input argument bx is modified on + * output. + */ + +SPEX_info spex_left_lu_back_sub // performs sparse REF backward substitution +( + const SPEX_matrix U, // input upper triangular matrix + SPEX_matrix bx // right hand side matrix +) ; + +/* Purpose: This function performs a depth first search of the graph of the + * matrix starting at node j. The output of this function is the set of nonzero + * indices in the xi vector. + */ + +void spex_left_lu_dfs // dfs of the graph of the matrix starting at node j +( + int64_t *top, // beginning of stack + int64_t j, // What node to start DFS at + SPEX_matrix L, // matrix which represents the Graph of L + int64_t *xi, // the nonzero pattern + int64_t *pstack, // workspace vector + const int64_t *pinv // row permutation +) ; + +/* This function performs the pivoting for the SPEX Left LU factorization. + * The optional Order is: + * 0: Smallest pivot + * 1: Natural/Diagonal pivoting + * 2: Choose first nonzero (not recommended, for comparison only) + * 3: Diagonal with tolerance and smallest pivot (default) + * 4: Diagonal with tolerance and largest pivoting + * 5: Largest pivot (not recommended, for comparison only) + * + * On output, the pivs, pinv, and row_perm arrays and rhos matrix are all + * modified. + */ + +SPEX_info spex_left_lu_get_pivot +( + int64_t *pivot, // found index of pivot entry + SPEX_matrix x, // kth column of L and U + int64_t *pivs, // vector indicating which rows have been pivotal + int64_t n, // dimension of the problem + int64_t top, // nonzero pattern is located in xi[top..n-1] + int64_t *xi, // nonzero pattern of x + int64_t col, // current column of A (real kth column i.e., q[k]) + int64_t k, // iteration of the algorithm + SPEX_matrix rhos, // vector of pivots + int64_t *pinv, // row permutation + int64_t *row_perm, // opposite of pinv. + // if pinv[i] = j then row_perm[j] = i + const SPEX_options option // command options +) ; + +/* Purpose: This function selects the pivot element as the largest in the + * column. This is activated if the user sets option->pivot = SPEX_LARGEST. + * NOTE: This pivoting scheme is NOT recommended for SPEX Left LU. On output + * the index of the largest pivot is returned. + */ + +SPEX_info spex_left_lu_get_largest_pivot +( + int64_t *pivot, // the index of largest pivot + SPEX_matrix x, // kth column of L and U + int64_t *pivs, // vector which indicates whether each row + // has been pivotal + int64_t n, // dimension of problem + int64_t top, // nonzero pattern is located in xi[top..n-1] + int64_t *xi // nonzero pattern of x +) ; + +/* This function obtains the first eligible nonzero pivot. This is enabled if + * the user sets option->pivot = SPEX_FIRST_NONZERO. NOTE: This pivoting + * scheme is not recommended. On output, the kth pivot is returned. + */ + +SPEX_info spex_left_lu_get_nonzero_pivot // find first eligible nonzero pivot +( + int64_t *pivot, // the index of first eligible nonzero pivot + SPEX_matrix x, // kth column of L and U + int64_t *pivs, // vector indicating which rows are pivotal + int64_t n, // size of x + int64_t top, // nonzero pattern is located in xi[top..n-1] + int64_t *xi // nonzero pattern of x +) ; + +/* Purpose: This function selects the pivot element as the smallest in the + * column. This is activated by default or if the user sets option->pivot = + * SPEX_SMALLEST. This is a recommended pivoting scheme for SPEX Left LU. + * On output, the index of kth pivot is returned. + */ + +SPEX_info spex_left_lu_get_smallest_pivot +( + int64_t *pivot, // the index of smallest pivot + SPEX_matrix x, // kth column of L and U + int64_t *pivs, // vector indicating if each row has been pivotal + int64_t n, // dimension of problem + int64_t top, // nonzeros are stored in xi[top..n-1] + int64_t *xi // nonzero pattern of x +) ; + +/* Purpose: This function computes the reach of column k of A on the graph of L + * mathematically that is: xi = Reach(A(:,k))_G_L. + */ + +void spex_left_lu_reach // compute reach of column k of A on the graph of L +( + int64_t *top, + SPEX_matrix L, // matrix representing graph of L + const SPEX_matrix A, // input matrix + int64_t k, // column of A of interest + int64_t *xi, // nonzero pattern + const int64_t *pinv // row permutation +) ; + +/* Purpose: This function performs the sparse REF triangular solve; that is, + * (LD) x = A(:,k). The algorithm is described in the paper; however in essence + * it computes the nonzero pattern xi, then performs a sequence of IPGE + * operations on the nonzeros to obtain their final value. All operations are + * gauranteed to be integral. There are various enhancements in this code used + * to reduce the overall cost of the operations and minimize operations as much + * as possible. + */ + +SPEX_info spex_left_lu_ref_triangular_solve // sparse REF triangular solve +( + int64_t *top_output, // Output the beginning of nonzero pattern + SPEX_matrix L, // partial L matrix + const SPEX_matrix A, // input matrix + int64_t k, // constructing L(:,k) + int64_t *xi, // nonzero pattern vector + const int64_t *q, // column permutation, not modified + SPEX_matrix rhos, // sequence of pivots + const int64_t *pinv, // inverse row permutation + const int64_t *row_perm, // row permutation + int64_t *h, // history vector + SPEX_matrix x // solution of system ==> kth column of L and U +) ; + +#endif + diff --git a/SPEX/SPEX_Left_LU/Demo/.gitignore b/SPEX/SPEX_Left_LU/Demo/.gitignore deleted file mode 100644 index e360d332e1..0000000000 --- a/SPEX/SPEX_Left_LU/Demo/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# Ignore these files: -example -example2 -example3 -example4 -example5 -spexlu_demo diff --git a/SPEX/SPEX_Left_LU/Demo/demos.c b/SPEX/SPEX_Left_LU/Demo/demos.c deleted file mode 100644 index 50ec654175..0000000000 --- a/SPEX/SPEX_Left_LU/Demo/demos.c +++ /dev/null @@ -1,464 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Left_LU/Demo/demos.c: support functions for the demo programs -//------------------------------------------------------------------------------ - -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -// SPEX_print_options: print user options. -// SPEX_process_command_line: process command line for demo programs. -// SPEX_tripread: read a matrix from a file in triplet format. -// SPEX_tripread_double: read a double matrix from a file in triplet format. -// SPEX_read_dense: read a dense matrix from a file. - -#include "demos.h" - -#if defined (__GNUC__) -// ignore warnings about unused parameters in this file -#pragma GCC diagnostic ignored "-Wunused-parameter" -#endif - -//------------------------------------------------------------------------------ -// SPEX_print_options -//------------------------------------------------------------------------------ - -/* Purpose: This function prints out the user specified/default options. - * this is primarily intended for debugging - */ - -void SPEX_print_options // display specified/default options to user -( - SPEX_options* option // options (cannot be NULL) -) -{ - - char *piv, *order; - if (option->order == SPEX_COLAMD) - { - order = "the COLAMD"; - } - else if (option->order == SPEX_AMD) - { - order = "the AMD"; - } - else if (option->order == SPEX_NO_ORDERING) - { - order = "No"; - } - else - { - order = "(undefined)"; - } - - if (option->pivot == SPEX_SMALLEST) - { - piv = "smallest"; - } - else if (option->pivot == SPEX_DIAGONAL) - { - piv = "diagonal"; - } - else if (option->pivot == SPEX_FIRST_NONZERO) - { - piv = "first nonzero"; - } - else if (option->pivot == SPEX_TOL_SMALLEST) - { - piv = "diagonal small tolerance"; - } - else if (option->pivot == SPEX_TOL_LARGEST) - { - piv = "diagonal large tolerance"; - } - else - { - piv = "largest"; - } - - printf("\n\n****COMMAND PARAMETERS****"); - printf("\nUsing %s ordering and selecting the %s pivot", order, piv); - if (option->pivot == SPEX_TOL_SMALLEST || - option->pivot == SPEX_TOL_LARGEST) - { - printf("\nTolerance used: %lf\n",option->tol); - } -} - -//------------------------------------------------------------------------------ -// SPEX_process_command_line -//------------------------------------------------------------------------------ - -/* Purpose: This processes the command line for user specified options */ - -SPEX_info SPEX_process_command_line //processes the command line -( - int argc, // number of command line arguments - char* argv[], // set of command line arguments - SPEX_options* option, // options (cannot be NULL) - char** mat_name, // Name of the matrix to be read in - char** rhs_name, // Name of the RHS vector to be read in - SPEX_type *rat // data type of output solution: - // 1:SPEX_MPZ (default), 2:SPEX_FP64, 3:SPEX_MPFR -) -{ - (*rat) = SPEX_MPZ ; - - for (int i = 1; i < argc; i++) - { - char* arg = (char*) argv[i]; - if ( strcmp(arg,"p") == 0 || strcmp(arg,"piv") == 0) - { - if (!argv[++i]) - { - printf("\n****ERROR! There must be a pivot argument between" - " 0-5 following p\n"); - return SPEX_INCORRECT_INPUT; - } - option->pivot = atoi(argv[i]); - if (option->pivot < 0 || option->pivot > 5) - { - printf("\n****ERROR! Invalid pivot selection!" - "\nDefaulting to smallest pivot\n\n"); - option->pivot = SPEX_SMALLEST; - } - } - else if ( strcmp(arg, "q") == 0 || strcmp(arg,"col") == 0) - { - if (!argv[++i]) - { - printf("\n****ERROR! There must be an argument between 0-2" - "following q\n"); - return SPEX_INCORRECT_INPUT; - } - option->order = atoi(argv[i]); - if (option->order < 0 || option->order > 2) - { - printf("\n****ERROR! Invalid column ordering" - "\nDefaulting to COLAMD\n\n"); - option->order = SPEX_COLAMD; - } - } - else if ( strcmp(arg,"t") == 0 || strcmp(arg, "tol") == 0) - { - if (!argv[++i]) - { - printf("\n****ERROR! There must be a non negative tolerance" - " value following t\n"); - return SPEX_INCORRECT_INPUT; - } - else if (!atof(argv[i])) - { - printf("\n****ERROR! There must be a non negative tolerance" - " value following t\n"); - return SPEX_INCORRECT_INPUT; - } - option->tol = atof(argv[i]); - if (option->tol < 0) - { - printf("\n****ERROR! Invalid Tolerance, tolerance must be" - " non-negative\n"); - return SPEX_INCORRECT_INPUT; - } - } - else if ( strcmp(arg,"out") == 0 || strcmp(arg, "o") == 0) - { - if (!argv[++i]) - { - printf("\n****ERROR! o or out must be followed by" - " 0 (print nothing) 1 (print err) or 2 (terse) \n"); - return SPEX_INCORRECT_INPUT; - } - else if (!atoi(argv[i])) - { - printf("\n****ERROR! o or out must be followed by" - " 0 (print nothing) 1 (print err) or 2 (terse) \n"); - return SPEX_INCORRECT_INPUT; - } - option->print_level = atoi(argv[i]); - } - else if ( strcmp(arg, "f") == 0 || strcmp(arg, "file") == 0) - { - if (!argv[++i]) - { - printf("\n****ERROR! Matrix name must be entered\n"); - return SPEX_INCORRECT_INPUT; - } - *mat_name = argv[i]; - if (!argv[++i]) - { - printf("\n****ERROR! Right hand side vector name must" - " be entered\n"); - return SPEX_INCORRECT_INPUT; - } - *rhs_name = argv[i]; - } - else - { - printf("\n\n**ERROR! Unknown command line parameter: %s" - "\nIgnoring this parameter\n",arg); - return SPEX_INCORRECT_INPUT; - } - } - - return SPEX_OK; -} - -//------------------------------------------------------------------------------ -// SPEX_tripread -//------------------------------------------------------------------------------ - -/* Purpose: This function reads in a matrix stored in a triplet format - * This format used can be seen in any of the example mat files. - * - * The first line of the file contains three integers: m, n, nnz, - * where the matrix is m-by-n with nnz entries. - * - * This is followed by nnz lines, each containing a single triplet: i, j, aij, - * which defines the row index (i), column index (j), and value (aij) of - * the entry A(i,j). The value aij is an integer. - */ - -SPEX_info SPEX_tripread -( - SPEX_matrix **A_handle, // Matrix to be constructed - FILE* file, // file to read from (must already be open) - SPEX_options* option // Command options -) -{ - - SPEX_info info ; - if (A_handle == NULL || file == NULL) - { - printf ("invalid input\n") ; - return SPEX_INCORRECT_INPUT; - } - - (*A_handle) = NULL ; - - int64_t m, n, nz; - - // Read in size of matrix & number of nonzeros - int s = fscanf(file, "%"PRId64" %"PRId64" %"PRId64"\n", &m, &n, &nz); - if (feof(file) || s < 3) - { - printf ("premature end-of-file\n") ; - return SPEX_INCORRECT_INPUT; - } - - // Allocate memory for A - // A is a triplet mpz_t matrix - SPEX_matrix* A = NULL; - info = SPEX_matrix_allocate(&A, SPEX_TRIPLET, SPEX_MPZ, m, n, nz, - false, true, option); - if (info != SPEX_OK) - { - return (info) ; - } - - // Read in first values of A - info = SPEX_gmp_fscanf(file, "%"PRId64" %"PRId64" %Zd\n", - &A->i[0], &A->j[0], &A->x.mpz[0]); - if (feof (file) || info != SPEX_OK) - { - printf ("premature end-of-file\n") ; - SPEX_matrix_free(&A, option); - return SPEX_INCORRECT_INPUT; - } - - // Matrices in this format are 1 based, so we decrement by 1 to get - // 0 based for internal functions - A->i[0] -= 1; - A->j[0] -= 1; - - // Read in the values from file - for (int64_t p = 1; p < nz; p++) - { - info = SPEX_gmp_fscanf(file, "%"PRId64" %"PRId64" %Zd\n", - &A->i[p], &A->j[p], &A->x.mpz[p]); - if ((feof(file) && p != nz-1) || info != SPEX_OK) - { - printf ("premature end-of-file\n") ; - SPEX_matrix_free(&A, option); - return SPEX_INCORRECT_INPUT; - } - // Conversion from 1 based to 0 based if necessary - A->i[p] -= 1; - A->j[p] -= 1; - } - - // the triplet matrix now has nz entries - A->nz = nz; - - // A now contains our input matrix in triplet format. We now - // do a matrix copy to get it into CSC form - // C is a copy of A which is CSC and mpz_t - SPEX_matrix* C = NULL; - SPEX_matrix_copy(&C, SPEX_CSC, SPEX_MPZ, A, option); - - // Free A, set A_handle - SPEX_matrix_free(&A, option); - (*A_handle) = C; - return (info) ; -} - -//------------------------------------------------------------------------------ -// SPEX_tripread_double -//------------------------------------------------------------------------------ - -/* Purpose: This function reads in a double matrix stored in a triplet format - * This format used can be seen in any of the example mat files. - * - * The first line of the file contains three integers: m, n, nnz, - * where the matrix is m-by-n with nnz entries. - * - * This is followed by nnz lines, each containing a single triplet: i, j, aij, - * which defines the row index (i), column index (j), and value (aij) of - * the entry A(i,j). The value aij is a floating-point number. - */ - -SPEX_info SPEX_tripread_double -( - SPEX_matrix **A_handle, // Matrix to be populated - FILE* file, // file to read from (must already be open) - SPEX_options* option -) -{ - - SPEX_info info ; - if (A_handle == NULL || file == NULL) - { - printf ("invalid input\n") ; - return SPEX_INCORRECT_INPUT; - } - (*A_handle) = NULL ; - - // Read in triplet form first - int64_t m, n, nz; - - // Read in size of matrix & number of nonzeros - int s = fscanf(file, "%"PRId64" %"PRId64" %"PRId64"\n", &m, &n, &nz); - if (feof(file) || s < 3) - { - printf ("premature end-of-file\n") ; - return SPEX_INCORRECT_INPUT; - } - - // First, we create our A matrix which is triplet double - SPEX_matrix *A = NULL; - info = SPEX_matrix_allocate(&A, SPEX_TRIPLET, SPEX_FP64, m, n, nz, - false, true, option); - if (info != SPEX_OK) - { - return (info) ; - } - - info = fscanf (file, "%"PRId64" %"PRId64" %lf\n", - &(A->i[0]), &(A->j[0]), &(A->x.fp64[0])) ; - if (feof(file) || info != SPEX_OK) - { - printf ("premature end-of-file\n") ; - SPEX_matrix_free(&A, option); - return SPEX_INCORRECT_INPUT; - } - - // Matrices in this format are 1 based. We decrement - // the indices by 1 to use internally - A->i[0] -= 1; - A->j[0] -= 1; - - // Read in the values from file - for (int64_t k = 1; k < nz; k++) - { - s = fscanf(file, "%"PRId64" %"PRId64" %lf\n", - &(A->i[k]), &(A->j[k]), &(A->x.fp64[k])); - if ((feof(file) && k != nz-1) || s < 3) - { - printf ("premature end-of-file\n") ; - SPEX_matrix_free(&A, option); - return SPEX_INCORRECT_INPUT; - } - // Conversion from 1 based to 0 based - A->i[k] -= 1; - A->j[k] -= 1; - } - - // the triplet matrix now has nz entries - A->nz = nz; - - // At this point, A is a double triplet matrix. We make a copy of it with C - - SPEX_matrix* C = NULL; - SPEX_matrix_copy(&C, SPEX_CSC, SPEX_MPZ, A, option); - - // Success. Set A_handle = C and free A - - SPEX_matrix_free(&A, option); - (*A_handle) = C; - return (info) ; -} - -//------------------------------------------------------------------------------ -// SPEX_read_dense -//------------------------------------------------------------------------------ - -/* Purpose: Read a dense matrix for RHS vectors. - * the values in the file must be integers - */ - -SPEX_info SPEX_read_dense -( - SPEX_matrix **b_handle, // Matrix to be constructed - FILE* file, // file to read from (must already be open) - SPEX_options* option -) -{ - - if (file == NULL) - { - printf ("invalid inputs\n") ; - return SPEX_INCORRECT_INPUT; - } - int64_t nrows, ncols; - SPEX_info info ; - - // First, we obtain the dimension of the matrix - int s = fscanf(file, "%"PRId64" %"PRId64, &nrows, &ncols) ; - if (feof(file) || s < 2) - { - printf ("premature end-of-file\n") ; - return SPEX_INCORRECT_INPUT; - } - - // Now, we create our dense mpz_t matrix - SPEX_matrix* A = NULL; - info = SPEX_matrix_allocate(&A, SPEX_DENSE, SPEX_MPZ, nrows, ncols, - nrows*ncols, false, true, option); - if (info != SPEX_OK) - { - return (info) ; - } - - // We now populate the matrix b. - for (int64_t i = 0; i < nrows; i++) - { - for (int64_t j = 0; j < ncols; j++) - { - info = SPEX_gmp_fscanf(file, "%Zd", &(SPEX_2D(A, i, j, mpz))); - if (info != SPEX_OK) - { - printf("\n\nhere at i = %"PRId64" and j = %"PRId64"", i, j); - return SPEX_INCORRECT_INPUT; - } - } - } - - //-------------------------------------------------------------------------- - // Success, set b_handle = A - //-------------------------------------------------------------------------- - - (*b_handle) = A; - return (info) ; -} diff --git a/SPEX/SPEX_Left_LU/Demo/demos.h b/SPEX/SPEX_Left_LU/Demo/demos.h deleted file mode 100644 index fc77d659df..0000000000 --- a/SPEX/SPEX_Left_LU/Demo/demos.h +++ /dev/null @@ -1,76 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Left_LU/Demo/demos.h: #include file the demo programs -//------------------------------------------------------------------------------ - -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -#include "SPEX.h" -#include -#include -#include - -#define OK(method) \ -{ \ - ok = method ; \ - if (ok != SPEX_OK) \ - { \ - printf ("Error: %d line %d file %s\n", ok, __LINE__, __FILE__) ; \ - 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_process_command_line //processes the command line -( - int argc, // number of command line arguments - char* argv[], // set of command line arguments - 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 - SPEX_type *rat // data type of output solution: - // 1:SPEX_MPZ (default), 2:SPEX_FP64, 3:SPEX_MPFR -); - -/* Purpose: This function prints out the user specified/default options*/ -void SPEX_print_options // display specified/default options to user -( - SPEX_options* option // struct containing all of the options -); - -/* Purpose: This function shows the usage of the code.*/ -void SPEX_show_usage(void); - -/* Purpose: This function reads in a matrix stored in a triplet format. - * This format used can be seen in any of the example mat files. - */ -SPEX_info SPEX_tripread -( - SPEX_matrix **A_handle, // Matrix to be constructed - FILE* file, // file to read from (must already be open) - SPEX_options* option -) ; - -/* Purpose: This function reads in a double matrix stored in a triplet format. - * This format used can be seen in any of the example mat files. - */ -SPEX_info SPEX_tripread_double -( - 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. */ -SPEX_info SPEX_read_dense -( - SPEX_matrix **b_handle, // Matrix to be constructed - FILE* file, // file to read from (must already be open) - SPEX_options* option -) ; diff --git a/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_demo.m b/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_demo.m deleted file mode 100644 index c9b75f71dd..0000000000 --- a/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_demo.m +++ /dev/null @@ -1,109 +0,0 @@ -% SPEX_Left_LU_DEMO a demo of SPEX_Left_LU_backslash -% SPEX_Left_LU_LU is a package for solving sparse linear systems of equations -% with a roundoff-free integer-preserving method. The result is -% always exact, unless the matrix A is perfectly singular. -% -% See also vpa, SPEX_Left_LU_backslash, SPEX_Left_LU_install, SPEX_Left_LU_test. -% -% SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -% Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -% SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -format compact - -%% SPEX_Left_LU_backslash vs MATLAB backslash: first example -% In this first example, x = SPEX_Left_LU_backslash (A,b) returns an approximate -% solution, but not because it was computed incorrectly in SPEX_Left_LU_backslash. -% It is computed exactly as a rational result in SPEX_backslash with -% arbitrary precision, but then converted to double precision on output. - -format long g -load west0479 -A = west0479 ; -n = size (A, 1) ; -xtrue = rand (n,1) ; -b = A*xtrue ; -x = SPEX_Left_LU_backslash (A, b) ; -% error is nonzero: x is computed exactly in rational arbitrary-precision, -% but then lost precision when returned to MATLAB: -err_spex = norm (x-xtrue) -x = A\b ; -% error is nonzero: MATLAB x=A\b experiences floating-point error -% throughout its computations: -err_matlab = norm (x-xtrue) - -%% SPEX_Left_LU_backslash: exact, vs MATLAB backslash: approximate -% In this example, x = SPEX_Left_LU_backslash (A,b) is returned exactly in the -% MATLAB vector x, because x contains only integers representable exactly -% in double precision. x = A\b results in floating-point roundoff error. - -amax = max (abs (A), [ ], 'all') ; -A = floor (2^20 * (A / amax)) + n * speye (n) ; -xtrue = floor (64 * xtrue) ; -b = A*xtrue ; -x = SPEX_Left_LU_backslash (A, b) ; -% error will be exactly zero: -err_spex = norm (x-xtrue) -x = A\b ; -% error will be small but nonzero: -err_matlab = norm (x-xtrue) - -%% SPEX_Left_LU_backslash on ill-conditioned problems -% x = SPEX_Left_LU_backslash (A,b) is able to solve problems that x=A\b cannot. -% Consider the following matrix in the MATLAB gallery: - -[U, b] = gallery ('wilk', 3) - -%% vpa can find a good but not perfect solution: -xvpa = vpa (U) \ b - -% but MATLAB's numerical x = U\b computes a poor solution: -xapprox = U \ b - -%% SPEX_Left_LU_backslash computes the exact answer -% It returns it to MATLAB as a double vector, obtaining the exact results, -% except for a final floating-point error in x(2): - -xspex = SPEX_Left_LU_backslash (U, b) -err = xvpa - xspex -relerr = double (err (2:3) ./ xvpa (2:3)) - -%% SPEX_Left_LU_backslash with exact results -% SPEX_Left_LU_backslash can also return x as a cell array of strings, which -% preserves the exact rational result. The printing option is also -% enabled in this example. The floating-point matrices U and b are -% converted into a scaled integer matrix before solving U*x=b with -% SPEX Left LU. -% -% The value U(1,2)=0.9 is a floating-point number, and 0.9 cannot be -% exactly represented in IEEE floating-point representation. It is -% converted exactly into the rational number, -% fl(0.9) = 45000000000000001 / 50000000000000000. - -option.print = 3 ; % also print the details -option.solution = 'char' ; % return x as a cell array of strings - -%% - -xspex = SPEX_Left_LU_backslash (U, b, option) - -%% Converting an exact rational result to vpa or double -% If SPEX_backslash returns x as a cell array of strings, it cannot -% be immediately used in computations in MATLAB. It can be converted -% into a vpa or double matrix, as illustrated below. The solution -% differs slightly from the vpa solution xvpa = vpa (U)\b, since -% the MATLAB vpa converts fl(0.9) into a decimal representation 0.9, -% or exactly 9/10; this is not exactly equal to fl(0.9), since the -% value 9/10 is not representable in IEEE floating-point. SPEX_backslash, -% by contrast, converts fl(0.9) into its exact rational representation, -% 45000000000000001 / 50000000000000000. - -xspex_as_vpa = vpa (xspex) -xspex_as_double = double (vpa (xspex)) -xvpa_as_double = double (xvpa) - -%% Comparing the VPA and SPEX_Left_LU_BACKSLASH solutions in double -% Both vpa(U)\b and SPEX_backslash(U,b) compute the same result -% in the end, when their results are converted to double. -err = xvpa_as_double - xspex_as_double - diff --git a/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_install.m b/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_install.m deleted file mode 100644 index 2446672404..0000000000 --- a/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_install.m +++ /dev/null @@ -1,85 +0,0 @@ -function SPEX_Left_LU_install(run_demo) -% SPEX_Left_LU_INSTALL: install and test the MATLAB interface to SPEX_backslash. -% This function installs the SPEX Left LU mexFunction for use by the m-file -% SPEX_Left_LU_backslash.m. -% -% Usage: SPEX_Left_LU_install -% -% Required Libraries: GMP, MPFR, AMD, COLAMD. If -lamd and -lcolamd are not -% available, install them with 'make install' first, in the top-level -% SuiteSparse/lib folder, and add SuiteSparse/lib to your LD_LIBRARY_PATH -% and restart MATLAB. -% -% See also SPEX_Left_LU_backslash, SPEX_Left_LU_test, SPEX_Left_LU_demo. - -% SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -% Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -% SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -help SPEX_Left_LU_install - -if (nargin < 1) - run_demo = true ; -end - -fprintf ('Compiling the SPEX Left LU mexFunction for use in SPEX_Left_LU_backslash:\n') ; - -% Find all source files and add them to the src string -src = ''; -path = './Source/'; -files = dir('./Source/*.c'); -[m n] = size(files); -for k = 1:m - tmp = [' ', path, files(k).name]; - src = [src, tmp]; -end -path = '../Source/'; -files = dir('../Source/*.c'); -[m n] = size(files); -for k = 1:m - tmp = [' ', path, files(k).name]; - src = [src, tmp]; -end -path = '../../SPEX_Util/Source/'; -files = dir('../../SPEX_Util/Source/*.c'); -[m n] = size(files); -for k = 1:m - tmp = [' ', path, files(k).name]; - src = [src, tmp]; -end - -% Compiler flags -flags = 'CFLAGS=''-std=c99 -fPIC'''; - -% External libraries: GMP, MPRF, AMD, and COLAMD -libs = '-L../../../lib -lgmp -lmpfr -lamd -lcolamd -lsuitesparseconfig' ; - -% Path to headers -includes = '-ISource/ -I../Source/ -I../../Include -I../../../SuiteSparse_config -I../../../COLAMD/Include -I../../../AMD/Include -I../../SPEX_Util/Source'; - -% verbose = ' -v ' -verbose = '' ; - -% Generate the mex commands here -% having -R2018a here for function mxGetDoubles -m1 = ['mex ', verbose, ' -R2018a ', includes, ' SPEX_Left_LU_mex_soln.c ' , src, ' ', flags, ' ', libs]; - -if (~isempty (verbose)) - fprintf ('%s\n', m1) ; -end - -% Now, we evaluate each one -eval (m1) ; - -if (run_demo) - % Test SPEX_backslash. - SPEX_Left_LU_test ; -end - -fprintf ('To use SPEX_Left_LU_backslash in future MATLAB sessions, add the following\n') ; -fprintf ('line to your startup.m file:\n') ; -fprintf (' addpath (''%s'') ;\n', pwd) ; -fprintf ('Type ''doc startup'' for more info on how to use startup.m\n') ; -fprintf ('To run a demo, type:\n') ; -fprintf (' echodemo SPEX_Left_LU_demo ;\n') ; - diff --git a/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_test.m b/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_test.m deleted file mode 100644 index 4de9424f3b..0000000000 --- a/SPEX/SPEX_Left_LU/MATLAB/SPEX_Left_LU_test.m +++ /dev/null @@ -1,89 +0,0 @@ -function SPEX_Left_LU_test -%SPEX_Left_LU_test: run a set of tests for SPEX_Left_LU_backslash -% -% Usage: SPEX_Left_LU_test -% -% See also SPEX_install, SPEX_demo. - -% SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -% Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -% SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -maxerr = 0 ; -rng ('default') ; - -fprintf ('Testing SPEX_Left_LU_backslash: ') ; - -% First, check if we can use a real life sparse matrix via ssget -if (exist ('ssget') ~= 0) - fprintf ('. (please wait) ') ; - % 159 is a square SPD matrix - prob = ssget(159); - A = prob.A; - [m n] = size(A); - b = rand(m, 1); - fprintf ('.') ; - x = SPEX_Left_LU_backslash(A,b); - x2 = A\b; - err = norm(x-x2)/norm(x); - maxerr = max (maxerr, err) ; - - % now convert to an integer problem (x will not be integer) - A = floor (2^20 * A) ; - b = floor (2^20 * b) ; - fprintf ('.') ; - x = SPEX_Left_LU_backslash (A, b) ; - x2 = A\b; - err = norm(x-x2)/norm(x); - maxerr = max (maxerr, err) ; - fprintf ('.') ; -end - -orderings = { 'none', 'colamd', 'amd' } ; -pivotings = { 'smallest', 'diagonal', 'first', ... - 'tol smallest', 'tol largest', 'largest' } ; - -for n = [1 10 100] - for density = [0.001 0.05 0.5 1] - - % construct a well-conditioned problem to solve - A = sprand(n,n,density); - A = A+A' + n * speye (n) ; - b = rand(n,1); - - for korder = 1:length (orderings) - for kpiv = 1:length (pivotings) - for tol = [0.1 0.5] - - clear option - option.order = orderings {korder} ; - option.pivot = pivotings {kpiv} ; - option.tol = tol ; - - fprintf ('.') ; - x = SPEX_Left_LU_backslash(A,b, option); - x2 = A\b; - err = norm(x-x2)/norm(x); - maxerr = max (maxerr, err) ; - - % now convert to an integer problem (x will not be integer) - A = floor (2^20 * A) ; - b = floor (2^20 * b) ; - x = SPEX_Left_LU_backslash(A,b, option); - x2 = A\b; - err = norm(x-x2)/norm(x); - maxerr = max (maxerr, err) ; - end - end - end - end -end - -fprintf ('\nmaxerr: %g\n', maxerr) ; - -if (maxerr < 1e-6) - fprintf('\nTesting complete, installation successful\n') -else - error ('SPEX_Left_LU_backslash:test', '\nTesting failure! error too high\n') -end - diff --git a/SPEX/SPEX_Left_LU/MATLAB/Source/SPEX_Left_LU_mex.h b/SPEX/SPEX_Left_LU/MATLAB/Source/SPEX_Left_LU_mex.h deleted file mode 100644 index be95af676a..0000000000 --- a/SPEX/SPEX_Left_LU/MATLAB/Source/SPEX_Left_LU_mex.h +++ /dev/null @@ -1,94 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Left_LU/MATLAB/SPEX_Left_LU_mex.h: include file for MATLAB functions -//------------------------------------------------------------------------------ - -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -#ifndef SPEX_LEFT_LU_MEX_H -#define SPEX_LEFT_LU_MEX_H - -#include "spex_left_lu_internal.h" -#include "matrix.h" - -#define SPEX_MEX_OK(method) \ -{ \ - status = method ; \ - if (status != SPEX_OK) \ - { \ - spex_left_lu_mex_error (status, "") ; \ - } \ -} - -typedef enum -{ - SPEX_SOLUTION_DOUBLE = 0, // x as double - SPEX_SOLUTION_VPA = 1, // return x as vpa - SPEX_SOLUTION_CHAR = 2 // x as cell strings -} -SPEX_solution ; - -typedef struct spex_mex_options -{ - SPEX_solution solution ; // how should x be returned to MATLAB - int32_t digits ; // # of digits to use for vpa -} -spex_mex_options ; - -/* Purpose: A GMP reallocation function - * This allows GMP to use MATLAB's default realloc function - */ -void* SPEX_gmp_mex_realloc -( - void* x, // void* to be reallocated - size_t a, // Previous size - size_t b // New size -); - -/* Purpose: A GMP free function. This allows GMP to use - * MATLAB's mxFree instead of free - */ -void SPEX_gmp_mex_free -( - void* x, // void* to be freed - size_t a // Size -); - -void spex_left_lu_get_matlab_options -( - SPEX_options* option, // Control parameters - spex_mex_options *mexoptions, // MATLAB-specific options - const mxArray* input // options struct, may be NULL -) ; - -// Purpose: This function checks if the array x contains Inf's, NaN's, or -// if its values can be represented as int64_t values. - -bool spex_left_lu_mex_check_for_inf // true if x can be represented as int64_t -( - double* x, // The array of numeric values - mwSize n // size of array -) ; - -/* Purpose: This function reads in the A matrix and right hand side vectors. */ -void spex_left_lu_mex_get_A_and_b -( - SPEX_matrix **A_handle, // Internal SPEX Mat stored in CSC - SPEX_matrix **b_handle, // mpz matrix used internally - const mxArray* pargin[], // The input A matrix and options - SPEX_options* option -) ; - -/* Purpose: Report errors if they arise - */ -void spex_left_lu_mex_error -( - SPEX_info status, - char *message -) ; - -#endif - diff --git a/SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_mex_check_for_inf.c b/SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_mex_check_for_inf.c deleted file mode 100644 index 2fe2711fc0..0000000000 --- a/SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_mex_check_for_inf.c +++ /dev/null @@ -1,58 +0,0 @@ -// //------------------------------------------------------------------------------ -// SPEX_Left_LU/MATLAB/spex_left_lu_mex_check_for_inf: Check A and b for inf -//------------------------------------------------------------------------------ - -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -// Purpose: This function checks if the array x contains Inf's, NaN's, or -// if its values can be represented as int64_t values, useful for input arguments. - -#include "SPEX_Left_LU_mex.h" - -bool spex_left_lu_mex_check_for_inf // true if x can be represented as int64_t -( - double* x, // The array of numeric values - mwSize n // size of array -) -{ - - bool x_is_int64 = true ; - - for (mwSize k = 0; k < n; k++) - { - double xk = x [k] ; - - if (mxIsInf (xk)) - { - spex_left_lu_mex_error (1, "A must not have any Inf values") ; - } - - if (mxIsNaN (xk)) - { - spex_left_lu_mex_error (1, "A must not have any NaN values") ; - } - - if (x_is_int64) - { - if (xk < INT64_MIN || xk > INT64_MAX) - { - x_is_int64 = false ; - } - else - { - int64_t xi = (int64_t) xk ; - if ((double) xi != xk) - { - x_is_int64 = false ; - } - } - } - } - - return (x_is_int64) ; -} - diff --git a/SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_mex_error.c b/SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_mex_error.c deleted file mode 100644 index fd3185fe19..0000000000 --- a/SPEX/SPEX_Left_LU/MATLAB/Source/spex_left_lu_mex_error.c +++ /dev/null @@ -1,52 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Left_LU/MATLAB/spex_left_lu_mex_error: Return error messages to matlab -//------------------------------------------------------------------------------ - -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -/* Purpose: This function prints error messages for MATLAB for debugging*/ - -#include "SPEX_Left_LU_mex.h" - -void spex_left_lu_mex_error -( - SPEX_info status, - char *message -) -{ - - switch (status) - { - case SPEX_OK : // all is well - return ; - - case SPEX_OUT_OF_MEMORY : // out of memory - SPEX_finalize ( ) ; - mexErrMsgTxt ("out of memory") ; - - case SPEX_SINGULAR : // the input matrix A is singular - SPEX_finalize ( ) ; - mexErrMsgTxt ("input matrix is singular") ; - - case SPEX_INCORRECT_INPUT : // one or more input arguments are incorrect - SPEX_finalize ( ) ; - mexErrMsgTxt ("invalid inputs") ; - - case SPEX_INCORRECT : // The solution is incorrect - SPEX_finalize ( ) ; - mexErrMsgTxt ("result invalid") ; - - case SPEX_PANIC : // SPEX_Left_LU used without proper initialization - SPEX_finalize ( ) ; - mexErrMsgTxt ("panic") ; - - default : - SPEX_finalize ( ) ; - mexErrMsgTxt (message) ; - } -} - diff --git a/SPEX/SPEX_Left_LU/Source/SPEX_Left_LU_solve.c b/SPEX/SPEX_Left_LU/Source/SPEX_Left_LU_solve.c deleted file mode 100644 index b1daa9bbfe..0000000000 --- a/SPEX/SPEX_Left_LU/Source/SPEX_Left_LU_solve.c +++ /dev/null @@ -1,176 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Left_LU/SPEX_Left_LU_solve: exact solution of Ax=b -//------------------------------------------------------------------------------ - -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -/* Purpose: This function solves the linear system LD^(-1)U x = b. It - * essnetially serves as a wrapper for all forward and backward substitution - * routines. This function always returns the solution matrix x as a rational - * matrix. If a user desires to have double or mpfr output, they must create - * a matrix copy. - * - * Input/output arguments: - * - * x_handle: A pointer to the solution vectors. Unitialized on input. - * on output, contains the exact rational solution of the system - * - * b: Set of RHS vectors - * - * A: Input matrix. Unmodified on input/output - * - * L: Lower triangular matrix. Unmodified on input/output - * - * U: Upper triangular matrix. Unmodified on input/output - * - * rhos: dense mpz_t matrix of pivots. Contains the sequence of pivots - * encountered during factorization and is used for forward/back - * substitution. Unmodified on input/output. - * - * S: symbolic analysis struct, used for vector permutation - * - * pinv: inverse row permutation vector, used to permute the b vectors. - * unmodified on input/output. - * - * option: command options - */ - -#define SPEX_FREE_WORK \ - SPEX_matrix_free (&b2, NULL) ; \ - SPEX_matrix_free (&x2, NULL) ; \ - SPEX_MPQ_CLEAR (scale) ; - -#define SPEX_FREE_ALL \ - SPEX_FREE_WORK \ - SPEX_matrix_free (&x, NULL) ; - -#include "spex_left_lu_internal.h" - -SPEX_info SPEX_Left_LU_solve // solves the linear system LD^(-1)U x = b -( - // Output - SPEX_matrix **x_handle, // rational solution to the system - // input: - const SPEX_matrix *b, // right hand side vector - const SPEX_matrix *A, // Input matrix - const SPEX_matrix *L, // lower triangular matrix - const SPEX_matrix *U, // upper triangular matrix - const SPEX_matrix *rhos,// sequence of pivots - const SPEX_LU_analysis *S,// symbolic analysis struct - const int64_t *pinv, // inverse row permutation - const SPEX_options* option // Command options -) -{ - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - SPEX_info info ; - if (!spex_initialized ( )) return (SPEX_PANIC) ; - - SPEX_REQUIRE (b, SPEX_DENSE, SPEX_MPZ) ; - SPEX_REQUIRE (A, SPEX_CSC, SPEX_MPZ) ; - SPEX_REQUIRE (L, SPEX_CSC, SPEX_MPZ) ; - SPEX_REQUIRE (U, SPEX_CSC, SPEX_MPZ) ; - SPEX_REQUIRE (rhos, SPEX_DENSE, SPEX_MPZ) ; - - if (!x_handle || !S || !pinv || L->m != A->m || L->n != U->m || - U->n != A->n || A->n != A->m || A->m != b->m ) - { - return SPEX_INCORRECT_INPUT; - } - *x_handle = NULL; - - //-------------------------------------------------------------------------- - // Declare and initialize workspace - //-------------------------------------------------------------------------- - - int64_t i, n = L->n; - mpq_t scale ; - SPEX_MPQ_SET_NULL (scale) ; - - SPEX_matrix *x = NULL; // final solution - SPEX_matrix *x2 = NULL; // unpermuted solution - SPEX_matrix *b2 = NULL; // permuted b - - //-------------------------------------------------------------------------- - // b2 (pinv) = b - //-------------------------------------------------------------------------- - - SPEX_CHECK (spex_left_lu_permute_b (&b2, b, pinv, option)) ; - - //-------------------------------------------------------------------------- - // b2 = L\b2, via forward substitution - //-------------------------------------------------------------------------- - - SPEX_CHECK(spex_left_lu_forward_sub(L, b2, (SPEX_matrix*) rhos)); - - //-------------------------------------------------------------------------- - // b2 = b2 * det, where det=rhos[n-1] - //-------------------------------------------------------------------------- - - SPEX_CHECK(SPEX_matrix_mul(b2, rhos->x.mpz[n-1])); - - //-------------------------------------------------------------------------- - // b2 = U\b2, via back substitution - //-------------------------------------------------------------------------- - SPEX_CHECK(spex_left_lu_back_sub(U, b2)); - - //-------------------------------------------------------------------------- - // x2 = b2/det, where det=rhos[n-1] - //-------------------------------------------------------------------------- - - SPEX_CHECK (SPEX_matrix_div (&x2, b2, rhos->x.mpz[n-1], option)) ; - - //-------------------------------------------------------------------------- - // x = Q*x2 - //-------------------------------------------------------------------------- - - SPEX_CHECK (spex_left_lu_permute_x (&x, x2, (SPEX_LU_analysis *) S, option)) ; - SPEX_matrix_free (&x2, NULL) ; - - //-------------------------------------------------------------------------- - // Check the solution if desired (debugging only) - //-------------------------------------------------------------------------- - - bool check = SPEX_OPTION_CHECK (option) ; - if (check) - { - SPEX_CHECK (SPEX_check_solution (A, x, b, option)) ; - } - - //-------------------------------------------------------------------------- - // Scale the solution if necessary. - //-------------------------------------------------------------------------- - - SPEX_CHECK(SPEX_mpq_init(scale)); - - // set the scaling factor scale = A->scale / b->scale - SPEX_CHECK( SPEX_mpq_div(scale, A->scale, b->scale)); - - // Determine if the scaling factor is 1 - int r; - SPEX_CHECK(SPEX_mpq_cmp_ui(&r, scale, 1, 1)); - int64_t nz = x->m * x->n; - if (r != 0 ) - { - for (i = 0; i < nz; i++) - { - SPEX_CHECK(SPEX_mpq_mul(x->x.mpq[i], x->x.mpq[i], scale)); - } - } - - //-------------------------------------------------------------------------- - // free workspace and return result - //-------------------------------------------------------------------------- - - SPEX_FREE_WORK ; - (*x_handle) = x ; - return (SPEX_OK) ; -} - diff --git a/SPEX/SPEX_Left_LU/Source/spex_left_lu_internal.h b/SPEX/SPEX_Left_LU/Source/spex_left_lu_internal.h deleted file mode 100644 index c7aa29e67b..0000000000 --- a/SPEX/SPEX_Left_LU/Source/spex_left_lu_internal.h +++ /dev/null @@ -1,199 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Left_LU/Source/spex_left_lu_internal: include file for internal use in -// SPEX_Left_LU -//------------------------------------------------------------------------------ - -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -// This file is not intended to be #include'd in user applications. Use -// SPEX.h instead. - -#ifndef SPEX_LEFT_LU_INTERNAL_H -#define SPEX_LEFT_LU_INTERNAL_H - -#include "spex_util_internal.h" -#include "SPEX.h" - -// ============================================================================ -// Internal Functions -// ============================================================================ - - -/* Purpose: This function performs sparse REF forward substitution. This is - * essentially the same as the sparse REF triangular solve applied to each - * column of the right hand side vectors. Like the normal one, this function - * expects that the matrix x is dense. As a result,the nonzero pattern is not - * computed and each nonzero in x is iterated across. The system to solve is - * LDx = x. On output, the mpz_t** x structure is modified. - */ -SPEX_info spex_left_lu_forward_sub -( - const SPEX_matrix *L, // lower triangular matrix - SPEX_matrix *x, // right hand side matrix - const SPEX_matrix *rhos // sequence of pivots used in factorization -); - -/* Purpose: This function performs sparse REF backward substitution. In essense - * it solves the sysem Ux = x. Note that prior to this, we expect x to be - * multiplied by the determinant of A. The input argument bx is modified on - * output. - */ -SPEX_info spex_left_lu_back_sub // performs sparse REF backward substitution -( - const SPEX_matrix *U, // input upper triangular matrix - SPEX_matrix *bx // right hand side matrix of size n*numRHS -) ; - - -/* Purpose: This function performs a depth first search of the graph of the - * matrix starting at node j. The output of this function is the set of nonzero - * indices in the xi vector. - */ -void spex_left_lu_dfs // performs a dfs of the graph of the matrix starting at node j -( - int64_t *top, // beginning of stack - int64_t j, // What node to start DFS at - SPEX_matrix* L, // matrix which represents the Graph of L - int64_t* xi, // the nonzero pattern - int64_t* pstack, // workspace vector - const int64_t* pinv // row permutation -); - - -/* This function performs the pivoting for the SPEX Left LU factorization. - * The optional Order is: - * 0: Smallest pivot - * 1: Natural/Diagonal pivoting - * 2: Choose first nonzero (not recommended, for comparison only) - * 3: Diagonal with tolerance and smallest pivot (default) - * 4: Diagonal with tolerance and largest pivoting - * 5: Largest pivot (not recommended, for comparison only) - * - * On output, the pivs, pinv, and row_perm arrays and rhos matrix are all modified. - */ -SPEX_info spex_left_lu_get_pivot -( - int64_t *pivot, // found index of pivot entry - SPEX_matrix* x, // kth column of L and U - int64_t* pivs, // vector indicating which rows have been pivotal - int64_t n, // dimension of the problem - int64_t top, // nonzero pattern is located in xi[top..n-1] - int64_t* xi, // nonzero pattern of x - int64_t col, // current column of A (real kth column i.e., q[k]) - int64_t k, // iteration of the algorithm - SPEX_matrix* rhos, // vector of pivots - int64_t* pinv, // row permutation - int64_t* row_perm, // opposite of pinv. if pinv[i] = j then row_perm[j] = i - const SPEX_options *option // command option -); - -/* Purpose: This function selects the pivot element as the largest in the - * column. This is activated if the user sets option->pivot = SPEX_LARGEST. - * NOTE: This pivoting scheme is NOT recommended for SPEX Left LU. On output - * the index of the largest pivot is returned. - */ -SPEX_info spex_left_lu_get_largest_pivot -( - int64_t *pivot, // the index of largest pivot - SPEX_matrix* x, // kth column of L and U - int64_t* pivs, // vector which indicates whether each row has been pivotal - int64_t n, // dimension of problem - int64_t top, // nonzero pattern is located in xi[top..n-1] - int64_t* xi // nonzero pattern of x -); - -/* This function obtains the first eligible nonzero pivot. This is enabled if - * the user sets option->pivot = SPEX_FIRST_NONZERO. NOTE: This pivoting - * scheme is not recommended. On output, the kth pivot is returned. - */ -SPEX_info spex_left_lu_get_nonzero_pivot // find the first eligible nonzero pivot -( - int64_t *pivot, // the index of first eligible nonzero pivot - SPEX_matrix* x, // kth column of L and U - int64_t* pivs, // vector indicating which rows are pivotal - int64_t n, // size of x - int64_t top, // nonzero pattern is located in xi[top..n-1] - int64_t* xi // nonzero pattern of x -); - -/* Purpose: This function selects the pivot element as the smallest in the - * column. This is activated by default or if the user sets option->pivot = - * SPEX_SMALLEST. This is a recommended pivoting scheme for SPEX Left LU. - * On output, the index of kth pivot is returned. - */ -SPEX_info spex_left_lu_get_smallest_pivot -( - int64_t *pivot, // index of smallest pivot - SPEX_matrix *x, // kth column of L and U - int64_t* pivs, // vector indicating whether each row has been pivotal - int64_t n, // dimension of problem - int64_t top, // nonzeros are stored in xi[top..n-1] - int64_t* xi // nonzero pattern of x -); - - -/* Purpose: This function permutes b for forward substitution. - * That is, b = P'*b. - */ -SPEX_info spex_left_lu_permute_b -( - SPEX_matrix **b_handle, // permuted RHS vector - const SPEX_matrix *b2, // unpermuted RHS vector (not modified) - const int64_t *pinv, // inverse row permutation - const SPEX_options* option -); - -/* Purpose: SPEX_permute_x permutes x to get it back in its original form. - * That is x = Q*x. - */ -SPEX_info spex_left_lu_permute_x -( - SPEX_matrix **x_handle, // permuted Solution vector - SPEX_matrix *x2, // unpermuted Solution vector (not modified) - SPEX_LU_analysis *S, // symbolic analysis with the column ordering Q - const SPEX_options* option // Command options - // has been checked in the only caller SPEX_Left_LU_solve -) ; - -/* Purpose: This function computes the reach of column k of A on the graph of L - * mathematically that is: xi = Reach(A(:,k))_G_L. - */ -void spex_left_lu_reach // compute the reach of column k of A on the graph of L -( - int64_t *top, - SPEX_matrix* L, // matrix representing graph of L - const SPEX_matrix* A, // input matrix - int64_t k, // column of A of interest - int64_t* xi, // nonzero pattern - const int64_t* pinv // row permutation -) ; - -/* Purpose: This function performs the sparse REF triangular solve; that is, - * (LD) x = A(:,k). The algorithm is described in the paper; however in essence - * it computes the nonzero pattern xi, then performs a sequence of IPGE - * operations on the nonzeros to obtain their final value. All operations are - * gauranteed to be integral. There are various enhancements in this code used - * to reduce the overall cost of the operations and minimize operations as much - * as possible. - */ -SPEX_info spex_left_lu_ref_triangular_solve // performs the sparse REF triangular solve -( - int64_t *top_output, // Output the beginning of nonzero pattern - SPEX_matrix* L, // partial L matrix - const SPEX_matrix* A, // input matrix - int64_t k, // iteration of algorithm - int64_t* xi, // nonzero pattern vector - const int64_t* q, // column permutation - SPEX_matrix* rhos, // sequence of pivots - const int64_t* pinv, // inverse row permutation - const int64_t* row_perm, // row permutation - int64_t* h, // history vector - SPEX_matrix* x // solution of system ==> kth column of L and U -); - -#endif - diff --git a/SPEX/SPEX_Left_LU/Source/spex_left_lu_permute_b.c b/SPEX/SPEX_Left_LU/Source/spex_left_lu_permute_b.c deleted file mode 100644 index 403ffabb79..0000000000 --- a/SPEX/SPEX_Left_LU/Source/spex_left_lu_permute_b.c +++ /dev/null @@ -1,68 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Left_LU/spex_permute_b: permute b, as b = P'*b -//------------------------------------------------------------------------------ - -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -/* Purpose: This function permutes b for forward substitution. - * That is, b = P'*b. - */ - -#define SPEX_FREE_ALL \ - SPEX_matrix_free (&b, NULL) ; - -#include "spex_left_lu_internal.h" - -SPEX_info spex_left_lu_permute_b -( - SPEX_matrix **b_handle, // permuted RHS vector - const SPEX_matrix *b2, // unpermuted RHS vector (not modified) - const int64_t *pinv, // inverse row permutation - const SPEX_options* option -) -{ - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - SPEX_info info ; - SPEX_REQUIRE (b2, SPEX_DENSE, SPEX_MPZ) ; - - if (b_handle == NULL || !pinv) {return SPEX_INCORRECT_INPUT;} - (*b_handle) = NULL ; - - //-------------------------------------------------------------------------- - // b(pinv) = b2 - //-------------------------------------------------------------------------- - - int64_t m = b2->m ; - int64_t n = b2->n ; - - // allocate x - SPEX_matrix *b = NULL ; - SPEX_CHECK (SPEX_matrix_allocate (&b, SPEX_DENSE, SPEX_MPZ, m, n, - 0, false, true, option)) ; - - // Set b = P'*b2 - for (int64_t i = 0 ; i < m ; i++) - { - for (int64_t j = 0 ; j < n ; j++) - { - SPEX_CHECK(SPEX_mpz_set(SPEX_2D(b, pinv[i], j, mpz), - SPEX_2D(b2, i, j, mpz))); - } - } - - //-------------------------------------------------------------------------- - // return result - //-------------------------------------------------------------------------- - - (*b_handle) = b ; - return SPEX_OK; -} - diff --git a/SPEX/SPEX_Left_LU/Source/spex_left_lu_permute_x.c b/SPEX/SPEX_Left_LU/Source/spex_left_lu_permute_x.c deleted file mode 100644 index 55b0214e47..0000000000 --- a/SPEX/SPEX_Left_LU/Source/spex_left_lu_permute_x.c +++ /dev/null @@ -1,69 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Left_LU/spex_left_lu_permute_x: permute x, as x = Q*x -//------------------------------------------------------------------------------ - -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -/* Purpose: This function permutes x to get it back in its original form. - * That is, x = Q*x. - */ - -#define SPEX_FREE_ALL \ - SPEX_matrix_free (&x, NULL) ; - -#include "spex_left_lu_internal.h" - -SPEX_info spex_left_lu_permute_x -( - SPEX_matrix **x_handle, // permuted Solution vector - SPEX_matrix *x2, // unpermuted Solution vector (not modified) - SPEX_LU_analysis *S, // symbolic analysis with the column ordering Q - const SPEX_options* option -) -{ - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - SPEX_info info ; - SPEX_REQUIRE (x2, SPEX_DENSE, SPEX_MPQ) ; - - if (x_handle == NULL || !S || !S->q) {return SPEX_INCORRECT_INPUT;} - (*x_handle) = NULL ; - - //-------------------------------------------------------------------------- - // x (q) = x2 - //-------------------------------------------------------------------------- - - int64_t *q = S->q ; // column permutation - int64_t m = x2->m ; - int64_t n = x2->n ; - - // allocate x - SPEX_matrix *x = NULL ; - SPEX_CHECK (SPEX_matrix_allocate (&x, SPEX_DENSE, SPEX_MPQ, m, n, - 0, false, true, option)) ; - - // Set x = Q*x2 - for (int64_t i = 0 ; i < m ; i++) - { - for (int64_t j = 0 ; j < n ; j++) - { - SPEX_CHECK(SPEX_mpq_set(SPEX_2D(x, q[i], j, mpq), - SPEX_2D(x2, i, j, mpq))); - } - } - - //-------------------------------------------------------------------------- - // return result - //-------------------------------------------------------------------------- - - (*x_handle) = x ; - return SPEX_OK; -} - diff --git a/SPEX/SPEX_Left_LU/Tcov/.gitignore b/SPEX/SPEX_Left_LU/Tcov/.gitignore deleted file mode 100644 index 1397e8084b..0000000000 --- a/SPEX/SPEX_Left_LU/Tcov/.gitignore +++ /dev/null @@ -1,56 +0,0 @@ -# Ignore these files: -cov.out -cov.sort -cover.out -covs.out -spexlu_demo -spexlu_demo.c -tcov_test -demos.c -SPEX_calloc.c -SPEX_matrix_div.c -spex_cast_array.c -spex_cast_matrix.c -SPEX_check_solution.c -SPEX_create_default_options.c -spex_create_mpfr_array.c -spex_create_mpq_array.c -spex_create_mpz_array.c -SPEX_cumsum.c -spex_expand_double_array.c -spex_expand_mpfr_array.c -spex_expand_mpq_array.c -SPEX_finalize.c -SPEX_free.c -SPEX_gmp.c -SPEX_initialize.c -SPEX_initialize_expert.c -SPEX_LU_analysis_free.c -SPEX_LU_analyze.c -SPEX_malloc.c -SPEX_matrix_allocate.c -SPEX_matrix_check.c -SPEX_matrix_copy.c -SPEX_matrix_free.c -SPEX_matrix_mul.c -SPEX_matrix_nnz.c -SPEX_realloc.c -spex_sparse_collapse.c -spex_sparse_realloc.c -SPEX_Left_LU_analyze.c -SPEX_Left_LU_backslash.c -spex_left_lu_back_sub.c -spex_left_lu_dfs.c -SPEX_Left_LU_factorize.c -spex_left_lu_forward_sub.c -spex_left_lu_get_largest_pivot.c -spex_left_lu_get_nonzero_pivot.c -spex_left_lu_get_pivot.c -spex_left_lu_get_smallest_pivot.c -spex_left_lu_permute_b.c -spex_left_lu_permute_x.c -spex_left_lu_reach.c -spex_left_lu_ref_triangular_solve.c -SPEX_Left_LU_solve.c -SPEX_determine_symmetry.c -SPEX_transpose.c diff --git a/SPEX/SPEX_Left_LU/Tcov/Makefile b/SPEX/SPEX_Left_LU/Tcov/Makefile deleted file mode 100644 index f4b767b016..0000000000 --- a/SPEX/SPEX_Left_LU/Tcov/Makefile +++ /dev/null @@ -1,160 +0,0 @@ -#------------------------------------------------------------------------------- -# SPEX/SPEX/SPEX_Left_LU/Tcov/Makefile: compile and run SPEX test coverage -#------------------------------------------------------------------------------- - -# SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -# Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -# SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -#------------------------------------------------------------------------------- - -default: run - -SUITESPARSE ?= $(realpath $(CURDIR)/../../..) - -################################################################################ - - INSTALL_LIB ?= $(SUITESPARSE)/lib - - # use 8 jobs by default - JOBS ?= 8 - - LDFLAGS = --coverage - LDFLAGS += -L$(INSTALL_LIB) - LDFLAGS += -Wl,-rpath=$(INSTALL_LIB) - - # remove object files, but keep compiled libraries via 'make clean' - CLEAN = *.o *.obj *.ln *.bb *.bbg *.da *.tcov *.gcov gmon.out *.bak *.d \ - *.gcda *.gcno *.aux *.bbl *.blg *.log *.toc *.dvi *.lof *.lot - - # also remove compiled libraries, via 'make distclean' - PURGE = *.so* *.a *.dll *.dylib *.dSYM - -################################################################################ - -# Linux test coverage (gcc is required for test coverage) -CC = gcc -CFLAGS = -g -fprofile-arcs -ftest-coverage \ - -Wall -W -Wshadow -Wmissing-prototypes -Wstrict-prototypes \ - -Wredundant-decls -Wnested-externs -Wdisabled-optimization -std=c99 \ - -Wno-unused-parameter -I../../Include -I../Source -I../Demo \ - -I../../SPEX_Util/Include/ -I../../SPEX_Util/Source/ \ - -I../../../SuiteSparse_config -I../../../COLAMD/Include \ - -I../../../AMD/Include \ - -DSPEX_GMP_LIST_INIT=2 - -LDLIBS += -lmpfr -lgmp -lcolamd -lamd -lsuitesparseconfig -lm - -# run all statement coverage tests, and then check for 100% coverage -run: runtests - ./covall - -all: test SPEXLLU - -CS = \ - SPEX_calloc.o \ - SPEX_matrix_div.o \ - spex_cast_array.o \ - spex_cast_matrix.o \ - SPEX_check_solution.o \ - SPEX_create_default_options.o \ - spex_create_mpfr_array.o \ - spex_create_mpq_array.o \ - spex_create_mpz_array.o \ - SPEX_cumsum.o \ - spex_expand_double_array.o \ - spex_expand_mpfr_array.o \ - spex_expand_mpq_array.o \ - SPEX_finalize.o \ - SPEX_free.o \ - SPEX_gmp.o \ - SPEX_initialize.o \ - SPEX_initialize_expert.o \ - SPEX_malloc.o \ - SPEX_matrix_allocate.o \ - SPEX_matrix_check.o \ - SPEX_matrix_copy.o \ - SPEX_matrix_free.o \ - SPEX_matrix_mul.o \ - SPEX_matrix_nnz.o \ - SPEX_realloc.o \ - spex_sparse_collapse.o \ - spex_sparse_realloc.o \ - SPEX_LU_analysis_free.o \ - SPEX_LU_analyze.o \ - tcov_malloc_test.o \ - SPEX_Left_LU_backslash.o \ - spex_left_lu_back_sub.o \ - spex_left_lu_dfs.o \ - SPEX_Left_LU_factorize.o \ - spex_left_lu_forward_sub.o \ - spex_left_lu_get_largest_pivot.o \ - spex_left_lu_get_nonzero_pivot.o \ - spex_left_lu_get_pivot.o \ - spex_left_lu_get_smallest_pivot.o \ - spex_left_lu_permute_b.o \ - spex_left_lu_permute_x.o \ - spex_left_lu_reach.o \ - spex_left_lu_ref_triangular_solve.o \ - SPEX_Left_LU_solve.o - #SPEX_determine_symmetry.o SPEX_transpose.o \ - -$(CS): ../../Include/SPEX.h ../Source/spex_left_lu_internal.h ../../SPEX_Util/Source/spex_util_internal.h tcov_malloc_test.h ../Demo/demos.h - -.PRECIOUS: SPEX_Left_LU_%.c spex_left_lu_%.c spexlu_demo.c demos.c SPEX_%.c spex_%.c - -SPEX_Left_LU_%.c: - - ln -s ../Source/$@ - -spex_left_lu_%.c: - - ln -s ../Source/$@ - -spexlu_demo.c: - - ln -s ../Demo/$@ - -demos.c: - - ln -s ../Demo/$@ - -SPEX_%.c: - - ln -s ../../SPEX_Util/Source/$@ - -spex_%.c: - - ln -s ../../SPEX_Util/Source/$@ - -test: $(CS) tcov_test.c demos.c - $(CC) $(LDFLAGS) tcov_test.c demos.c $(CFLAGS) -o tcov_test $(CS) $(LDLIBS) - -SPEXLLU: $(CS) spexlu_demo.c demos.c - $(CC) $(LDFLAGS) spexlu_demo.c demos.c $(CFLAGS) -o spexlu_demo $(CS) $(LDLIBS) - -# run all statement coverage tests -runtests: all - - ./spexlu_demo p 2 q 0 - - ./spexlu_demo p 3 q 1 o 1 - - ./spexlu_demo p 4 q 2 o 1 f ../ExampleMats/test_mat.txt ../ExampleMats/test_rhs.txt - - ./spexlu_demo p 5 - - ./tcov_test - - ./tcov_test 0 1 1 - -# To run with valgrind: -V = valgrind #--leak-check=full - -# run all statement coverage tests but with valgrind -vtests: all - - $(V) ./spexlu_demo p 2 q 0 - - $(V) ./spexlu_demo p 3 q 1 o 1 - - $(V) ./spexlu_demo p 4 q 2 o 1 f ../ExampleMats/test_mat.txt ../ExampleMats/test_rhs.txt - - $(V) ./spexlu_demo p 5 - - $(V) ./tcov_test - - $(V) ./tcov_test 0 1 1 - -# remove all files not in the original distribution, including symbolic links -clean: - - $(RM) *.o *.bbg *.da *.gcov *.gcda *gcno - - $(RM) tcov_test spexlu_demo *.out *.a cov.sort out - - $(RM) -r SPEX_*.c spex_*.c *.dSYM spexlu_demo.c demos.c - -purge: distclean - -distclean: clean - diff --git a/SPEX/SPEX_Left_LU/Tcov/covall b/SPEX/SPEX_Left_LU/Tcov/covall deleted file mode 100755 index 413f422473..0000000000 --- a/SPEX/SPEX_Left_LU/Tcov/covall +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - ./gcovs SPEX_*.c spex_*.c 2>&1 | awk -f cov.awk | sort -n > cov.out - sort -n cov.out > cov.sort - ./covs > covs.out - echo -n "statments not yet tested: " - grep "#####" *.*.gcov | wc -l - ./cover *.*.gcov > cover.out diff --git a/SPEX/SPEX_Left_LU/Tcov/tcov_malloc_test.c b/SPEX/SPEX_Left_LU/Tcov/tcov_malloc_test.c deleted file mode 100644 index 9892b31551..0000000000 --- a/SPEX/SPEX_Left_LU/Tcov/tcov_malloc_test.c +++ /dev/null @@ -1,94 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX/SPEX/SPEX_Left_LU/Tcov/tcov_malloc_test.c -//------------------------------------------------------------------------------ - -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -#include "tcov_malloc_test.h" - -int64_t malloc_count = INT64_MAX ; - -// Note that only the ANSI C memory manager is used here -// (malloc, calloc, realloc, free) - -// wrapper for malloc -void *tcov_malloc -( - size_t size // Size to alloc -) -{ - if (--malloc_count < 0) - { - /* pretend to fail */ - printf("malloc pretend to fail\n"); - return (NULL) ; - } - return (malloc (size)) ; -} - -// wrapper for calloc -void *tcov_calloc -( - size_t n, // Size of array - size_t size // Size to alloc -) -{ - if (--malloc_count < 0) - { - /* pretend to fail */ - printf ("calloc pretend to fail\n"); - return (NULL) ; - } - // ensure at least one byte is calloc'd - return (calloc (n, size)) ; -} - -// wrapper for realloc -void *tcov_realloc -( - void *p, // Pointer to be realloced - size_t new_size // Size to alloc -) -{ - if (--malloc_count < 0) - { - /* pretend to fail */ - printf("realloc pretend to fail\n"); - return (NULL); - } - return (realloc (p, new_size)) ; -} - -// wrapper for free -void tcov_free -( - void *p // Pointer to be free -) -{ - // This not really needed, but placed here anyway in case the Tcov tests - // want to do something different that free(p) in the future. - free (p) ; -} - -extern jmp_buf spex_gmp_environment ; // for setjmp and longjmp - -int spex_gmp_realloc_test -( - void **p_new, - void * p_old, - size_t old_size, - size_t new_size -) -{ - int spex_gmp_status = setjmp (spex_gmp_environment); - if (spex_gmp_status != 0) - { - return SPEX_OUT_OF_MEMORY; - } - *p_new = spex_gmp_reallocate(p_old, old_size, new_size); - return SPEX_OK; -} diff --git a/SPEX/SPEX_Left_LU/Tcov/tcov_malloc_test.h b/SPEX/SPEX_Left_LU/Tcov/tcov_malloc_test.h deleted file mode 100644 index 791793d4e0..0000000000 --- a/SPEX/SPEX_Left_LU/Tcov/tcov_malloc_test.h +++ /dev/null @@ -1,88 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX/SPEX/SPEX_Left_LU/Tcov/tcov_malloc_test.h -//------------------------------------------------------------------------------ - -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -#ifndef TCOV_SPEX_MALLOC_TEST_H -#define TCOV_SPEX_MALLOC_TEST_H - -#include "spex_left_lu_internal.h" -#include "spex_util_internal.h" -#include "SPEX_gmp.h" - -extern int64_t malloc_count ; - -#define GOTCHA \ - printf ("%s, line %d, spex_gmp_ntrials = %ld, malloc_count = %ld\n", \ - __FILE__, __LINE__, spex_gmp_ntrials, malloc_count); - -#define SPEX_PRINT_INFO(info) \ -{ \ - /*printf ("file %s line %d: ", __FILE__, __LINE__) ; */ \ - switch(info) \ - { \ - case SPEX_OK: printf("SPEX_OK\n"); break; \ - case SPEX_OUT_OF_MEMORY: printf("OUT OF MEMORY\n"); break; \ - case SPEX_SINGULAR: printf("Matrix is SINGULAR\n"); break; \ - case SPEX_INCORRECT_INPUT: printf("INCORRECT INPUT\n"); break; \ - case SPEX_INCORRECT: printf("SPEX_INCORRECT\n"); break; \ - default: printf("unknown!\n"); \ - } \ -} - -#ifdef SPEX_CHECK -#undef SPEX_CHECK -#endif - -#define SPEX_CHECK(method) \ -{ \ - info = (method) ; \ - if (info != SPEX_OK) \ - { \ - SPEX_PRINT_INFO (info) \ - SPEX_FREE_ALL ; \ - return (info) ; \ - } \ -} - -// wrapper for malloc -void *tcov_malloc -( - size_t size // Size to alloc -) ; - -// wrapper for calloc -void *tcov_calloc -( - size_t n, // Size of array - size_t size // Size to alloc -) ; - -// wrapper for realloc -void *tcov_realloc -( - void *p, // Pointer to be realloced - size_t new_size // Size to alloc -) ; - -// wrapper for free -void tcov_free -( - void *p // Pointer to be free -) ; - -// used to test spex_gmp_reallocate -int spex_gmp_realloc_test -( - void **p_new, - void * p_old, - size_t old_size, - size_t new_size -); -#endif - diff --git a/SPEX/SPEX_Util/Source/SPEX_LU_analysis_free.c b/SPEX/SPEX_Util/Source/SPEX_LU_analysis_free.c deleted file mode 100644 index 099a36689a..0000000000 --- a/SPEX/SPEX_Util/Source/SPEX_LU_analysis_free.c +++ /dev/null @@ -1,35 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Util/SPEX_LU_analysis_free: Free memory from symbolic analysis struct -//------------------------------------------------------------------------------ - -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -/* Purpose: This function frees the memory of the SPEX_LU_analysis struct - * - * Input is the SPEX_LU_analysis structure, it is destroyed on function - * termination. - */ - -#include "spex_util_internal.h" - -SPEX_info SPEX_LU_analysis_free -( - SPEX_LU_analysis **S, // Structure to be deleted - const SPEX_options *option -) -{ - if (!spex_initialized ( )) return (SPEX_PANIC) ; - - if ((S != NULL) && (*S != NULL)) - { - SPEX_FREE ((*S)->q) ; - SPEX_FREE (*S) ; - } - - return (SPEX_OK) ; -} - diff --git a/SPEX/SPEX_Util/Source/SPEX_LU_analyze.c b/SPEX/SPEX_Util/Source/SPEX_LU_analyze.c deleted file mode 100644 index ab16d9b689..0000000000 --- a/SPEX/SPEX_Util/Source/SPEX_LU_analyze.c +++ /dev/null @@ -1,187 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Util/SPEX_LU_analyze: symbolic ordering and analysis for sparse LU -//------------------------------------------------------------------------------ - -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -/* Purpose: This function performs the symbolic ordering for unsymmetric matrices. - * Currently, there are three options: user-defined order, COLAMD, or AMD. - * - * Input/output arguments: - * - * S: Symbolic analysis struct. Undefined on input; contains column - * permutation and estimates of nnz(L) and nnz(U) nnz on output - * - * A: Input matrix, unmodified on input/output - * - * option: option->order tells the function which ordering scheme to use - * - */ - -// SPEX_LU_analyze creates the SPEX_LU_analysis object S. Use -// SPEX_LU_analysis_free to delete it. - -#include "spex_util_internal.h" - -SPEX_info SPEX_LU_analyze -( - SPEX_LU_analysis** S_handle, // symbolic analysis (column perm. and nnz L,U) - const SPEX_matrix *A, // Input matrix - const SPEX_options *option // Control parameters, if NULL, use default -) -{ - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - if (!spex_initialized ( )) return (SPEX_PANIC) ; - - // A can have any data type, but must be in sparse CSC format - SPEX_REQUIRE_KIND (A, SPEX_CSC) ; - - if (!S_handle || A->n != A->m) - { - return SPEX_INCORRECT_INPUT; - } - (*S_handle) = NULL ; - - //-------------------------------------------------------------------------- - // allocate symbolic analysis object - //-------------------------------------------------------------------------- - - SPEX_LU_analysis *S = NULL ; - int64_t i, n = A->n, anz; - // SPEX enviroment is checked to be init'ed and A is checked to be not NULL - // and a SPEX_CSC kind, so there shouldnt be any error from this function - SPEX_matrix_nnz(&anz, A, option); - // ALlocate memory for S - S = (SPEX_LU_analysis*) SPEX_malloc(sizeof(SPEX_LU_analysis)); - if (S == NULL) {return SPEX_OUT_OF_MEMORY;} - - // Allocate memory for column permutation - S->q = (int64_t*) SPEX_malloc((n+1) * sizeof(int64_t)); - if (S->q == NULL) - { - SPEX_FREE(S); - return SPEX_OUT_OF_MEMORY; - } - - //-------------------------------------------------------------------------- - // No ordering is used. S->q is set to [0 ... n] and the number of nonzeros - // in L and U is estimated to be 10 times the number of nonzeros in A. This - // is a very crude estimate on the nnz(L) and nnz(U) - //-------------------------------------------------------------------------- - - SPEX_col_order order = SPEX_OPTION_ORDER (option) ; - int pr = SPEX_OPTION_PRINT_LEVEL (option) ; - - if (order == SPEX_NO_ORDERING) - { - for (i = 0; i < n+1; i++) - { - S->q[i] = i; - } - // estimates for number of L and U nonzeros - S->lnz = S->unz = 10*anz; - } - - //-------------------------------------------------------------------------- - // The AMD ordering is used. S->q is set to AMD's column ordering on - // A+A'. The number of nonzeros in L and U is given as AMD's computed - // number of nonzeros in the Cholesky factor L of A+A' - //-------------------------------------------------------------------------- - else if (order == SPEX_AMD) - { - double Control [AMD_CONTROL]; // Declare AMD control - amd_l_defaults (Control) ; // Set AMD defaults - double Info [AMD_INFO]; - // Perform AMD - amd_l_order(n, (int64_t *) A->p, (int64_t *) A->i, - (int64_t *) S->q, Control, Info) ; - S->lnz = S->unz = Info[AMD_LNZ]; // estimate for unz and lnz - if (pr > 0) // Output AMD info if desired - { - SPEX_PRINTF ("\n****Column Ordering Information****\n") ; - amd_l_control (Control) ; - amd_l_info (Info) ; - } - } - - //-------------------------------------------------------------------------- - // The COLAMD ordering is used. S->q is set as COLAMD's column ordering. - // The number of nonzeros in L and U is set as 10 times the number of - // nonzeros in A. This is a crude estimate. - //-------------------------------------------------------------------------- - else - { - // Declared as per COLAMD documentation - int64_t Alen = 2*anz + 6 *(n+1) + 6*(n+1) + n; - int64_t* A2 = (int64_t*) SPEX_malloc(Alen* sizeof(int64_t)); - if (!A2) - { - // out of memory - SPEX_LU_analysis_free (&S, option) ; - return (SPEX_OUT_OF_MEMORY) ; - } - // Initialize S->q as per COLAMD documentation - for (i = 0; i < n+1; i++) - { - S->q[i] = A->p[i]; - } - // Initialize A2 per COLAMD documentation - for (i = 0; i < anz; i++) - { - A2[i] = A->i[i]; - } - int64_t stats [COLAMD_STATS]; - colamd_l (n, n, Alen, (int64_t *) A2, - (int64_t *) S->q, (double *) NULL, - (int64_t *) stats) ; - // estimate for lnz and unz - S->lnz = S->unz = 10*anz; - - // Print stats if desired - if (pr > 0) - { - SPEX_PRINTF ("\n****Column Ordering Information****\n") ; - colamd_l_report ((int64_t *) stats) ; - SPEX_PRINTF ("\nEstimated L and U nonzeros: %" PRId64 "\n", S->lnz); - } - SPEX_FREE(A2); - } - - //-------------------------------------------------------------------------- - // Make sure appropriate space is allocated. It's possible to return - // estimates which exceed the dimension of L and U or estimates which are - // too small for L U. In this case, this block of code ensures that the - // estimates on nnz(L) and nnz(U) are at least n and no more than n*n. - //-------------------------------------------------------------------------- - // estimate exceeds max number of nnz in A - if (S->lnz > (double) n*n) - { - int64_t nnz = ceil(0.5*n*n); - S->lnz = S->unz = nnz; - } - // If estimate < n, first column of triangular solve may fail - if (S->lnz < n) - { - S->lnz = S->lnz + n; - } - if (S->unz < n) - { - S->unz = S->unz + n; - } - - //-------------------------------------------------------------------------- - // return result - //-------------------------------------------------------------------------- - - (*S_handle) = S ; - return SPEX_OK; -} - diff --git a/SPEX/SPEX_Util/Source/SPEX_finalize.c b/SPEX/SPEX_Util/Source/SPEX_finalize.c deleted file mode 100644 index 1627357ee1..0000000000 --- a/SPEX/SPEX_Util/Source/SPEX_finalize.c +++ /dev/null @@ -1,28 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Util/SPEX_finalize: finalize SPEX -//------------------------------------------------------------------------------ - -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -// SPEX_finalize frees the working environment for SPEX library. - -#include "spex_util_internal.h" - -SPEX_info SPEX_finalize -( - void -) -{ - if (!spex_initialized ( )) { return (SPEX_PANIC) ; } - - SPEX_mpfr_free_cache ( ) ; // Free mpfr internal cache - spex_gmp_finalize ( ) ; // Reset GMP memory variables - - spex_set_initialized (false) ; - return (SPEX_OK) ; -} - diff --git a/SPEX/SPEX_Util/Source/SPEX_gmp.h b/SPEX/SPEX_Util/Source/SPEX_gmp.h deleted file mode 100644 index f03f3686e2..0000000000 --- a/SPEX/SPEX_Util/Source/SPEX_gmp.h +++ /dev/null @@ -1,99 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Util/SPEX_gmp.h: definitions for SPEX_gmp.c -//------------------------------------------------------------------------------ - -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -// These macros are used by SPEX_gmp.c to create wrapper functions around all -// GMP functions used by SPEX, to safely handle out-of-memory conditions. -// They are placed in this separate #include file so that a future developer -// can use them to construct their own wrappers around GMP functions. See -// SPEX_gmp.c for more details. - -#ifndef SPEX_GMP_H -#define SPEX_GMP_H - -#define SPEX_GMP_WRAPPER_START \ -{ \ - spex_gmp_nmalloc = 0 ; \ - /* setjmp returns 0 if called from here, or > 0 if from longjmp */ \ - int spex_gmp_status = setjmp (spex_gmp_environment) ; \ - if (spex_gmp_status != 0) \ - { \ - /* failure from longjmp */ \ - spex_gmp_failure (spex_gmp_status) ; \ - return (SPEX_OUT_OF_MEMORY) ; \ - } \ -} - -#define SPEX_GMPZ_WRAPPER_START(x) \ -{ \ - spex_gmpz_archive = x; \ - spex_gmpq_archive = NULL; \ - spex_gmpfr_archive = NULL; \ - SPEX_GMP_WRAPPER_START; \ -} - -#define SPEX_GMPQ_WRAPPER_START(x) \ -{ \ - spex_gmpz_archive = NULL; \ - spex_gmpq_archive = x; \ - spex_gmpfr_archive = NULL; \ - SPEX_GMP_WRAPPER_START; \ -} - -#define SPEX_GMPFR_WRAPPER_START(x) \ -{ \ - spex_gmpz_archive = NULL; \ - spex_gmpq_archive = NULL; \ - spex_gmpfr_archive = x; \ - SPEX_GMP_WRAPPER_START; \ -} - -#define SPEX_GMP_WRAPPER_FINISH \ -{ \ - /* clear (but do not free) the list. The caller must ensure */ \ - /* the result is eventually freed. */ \ - spex_gmpz_archive = NULL ; \ - spex_gmpq_archive = NULL ; \ - spex_gmpfr_archive = NULL ; \ - spex_gmp_nmalloc = 0 ; \ -} - -// free a block of memory, and also remove it from the archive if it's there -#define SPEX_GMP_SAFE_FREE(p) \ -{ \ - if (spex_gmpz_archive != NULL) \ - { \ - if (p == SPEX_MPZ_PTR(spex_gmpz_archive)) \ - { \ - SPEX_MPZ_PTR(spex_gmpz_archive) = NULL ; \ - } \ - } \ - else if (spex_gmpq_archive != NULL) \ - { \ - if (p == SPEX_MPZ_PTR(SPEX_MPQ_NUM(spex_gmpq_archive))) \ - { \ - SPEX_MPZ_PTR(SPEX_MPQ_NUM(spex_gmpq_archive)) = NULL ; \ - } \ - if (p == SPEX_MPZ_PTR(SPEX_MPQ_DEN(spex_gmpq_archive))) \ - { \ - SPEX_MPZ_PTR(SPEX_MPQ_DEN(spex_gmpq_archive)) = NULL ; \ - } \ - } \ - else if (spex_gmpfr_archive != NULL) \ - { \ - if (p == SPEX_MPFR_REAL_PTR(spex_gmpfr_archive)) \ - { \ - SPEX_MPFR_MANT(spex_gmpfr_archive) = NULL ; \ - } \ - } \ - SPEX_FREE (p) ; \ -} - -#endif - diff --git a/SPEX/SPEX_Util/Source/SPEX_initialize.c b/SPEX/SPEX_Util/Source/SPEX_initialize.c deleted file mode 100644 index 4bc26d3f7d..0000000000 --- a/SPEX/SPEX_Util/Source/SPEX_initialize.c +++ /dev/null @@ -1,48 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Util/SPEX_initialize: initialize SPEX -//------------------------------------------------------------------------------ - -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -// SPEX_initialize initializes the working evironment for SPEX - -#include "spex_util_internal.h" - -//------------------------------------------------------------------------------ -// global variable access -//------------------------------------------------------------------------------ - -// a global variable, but only accessible within this file. -extern bool spex_initialize_has_been_called ; - -bool spex_initialize_has_been_called = false ; - -bool spex_initialized ( void ) -{ - return (spex_initialize_has_been_called) ; -} - -void spex_set_initialized (bool s) -{ - spex_initialize_has_been_called = s ; -} - -//------------------------------------------------------------------------------ -// SPEX_initialize -//------------------------------------------------------------------------------ - -SPEX_info SPEX_initialize ( void ) -{ - if (spex_initialized ( )) return (SPEX_PANIC) ; - - mp_set_memory_functions (spex_gmp_allocate, spex_gmp_reallocate, - spex_gmp_free) ; - - spex_set_initialized (true) ; - return (SPEX_OK) ; -} - diff --git a/SPEX/SPEX_Util/Source/SPEX_matrix_div.c b/SPEX/SPEX_Util/Source/SPEX_matrix_div.c deleted file mode 100644 index 8917281038..0000000000 --- a/SPEX/SPEX_Util/Source/SPEX_matrix_div.c +++ /dev/null @@ -1,86 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Util/SPEX_matrix_div: divide a matrix by a scalar -//------------------------------------------------------------------------------ - -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -/* Purpose: This function takes as input a dense SPEX_matrix x, which is MPZ, - * and divides it a scalar. This division is then stored in a dense MPQ - * matrix, which must have the same number of entries as x. This is used - * internally to divide the solution vector by the determinant of the matrix. - * - * On output, the contents of the matrix x2 are modified. - */ - -#define SPEX_FREE_WORK \ - SPEX_MPQ_CLEAR(scalar2); - -#define SPEX_FREE_ALL \ - SPEX_FREE_WORK \ - SPEX_matrix_free (&x2, NULL) ; - -#include "spex_util_internal.h" - - -SPEX_info SPEX_matrix_div // divides the x matrix by a scalar -( - SPEX_matrix **x2_handle, // x2 = x/scalar - SPEX_matrix* x, // input vector x - const mpz_t scalar, // the scalar - const SPEX_options *option -) -{ - if (!spex_initialized ( )) return (SPEX_PANIC) ; - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - SPEX_info info ; - SPEX_matrix *x2 = NULL ; - (*x2_handle) = NULL ; - SPEX_REQUIRE (x, SPEX_DENSE, SPEX_MPZ) ; - - //-------------------------------------------------------------------------- - // Set scalar2 = scalar - //-------------------------------------------------------------------------- - - mpq_t scalar2 ; - SPEX_MPQ_SET_NULL (scalar2) ; - SPEX_CHECK (SPEX_mpq_init (scalar2)) ; - SPEX_CHECK (SPEX_mpq_set_num (scalar2, scalar)) ; - - //-------------------------------------------------------------------------- - // allocate x2 - //-------------------------------------------------------------------------- - - SPEX_CHECK (SPEX_matrix_allocate(&x2, SPEX_DENSE, SPEX_MPQ, x->m, x->n, - 0, false, true, option)) ; - - //-------------------------------------------------------------------------- - // iterate each entry of x, copy to x2 and divide it by scalar - //-------------------------------------------------------------------------- - - int64_t nz; - SPEX_CHECK (SPEX_matrix_nnz (&nz, x, option)) ; - for (int64_t i = 0; i < nz; i++) - { - // Set x2[i] = x[i] - SPEX_CHECK (SPEX_mpq_set_num (x2->x.mpq[i], x->x.mpz[i])) ; - // x2[i] = x2[i] / scalar2 - SPEX_CHECK (SPEX_mpq_div (x2->x.mpq[i], x2->x.mpq[i], scalar2)) ; - } - - //-------------------------------------------------------------------------- - // free workspace and return result - //-------------------------------------------------------------------------- - - SPEX_FREE_WORK ; - (*x2_handle) = x2 ; - return (SPEX_OK) ; -} - diff --git a/SPEX/SPEX_Util/Source/SPEX_matrix_free.c b/SPEX/SPEX_Util/Source/SPEX_matrix_free.c deleted file mode 100644 index fcf5561d44..0000000000 --- a/SPEX/SPEX_Util/Source/SPEX_matrix_free.c +++ /dev/null @@ -1,114 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Util/SPEX_matrix_free: free a SPEX_matrix -//------------------------------------------------------------------------------ - -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. 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 -( - SPEX_matrix **A_handle, // matrix to free - const SPEX_options *option -) -{ - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - if (!spex_initialized ( )) { return (SPEX_PANIC) ; } ; - - if (A_handle == NULL || (*A_handle) == NULL) - { - // nothing to free (not an error) - return (SPEX_OK) ; - } - SPEX_matrix *A = (*A_handle) ; - - //-------------------------------------------------------------------------- - // 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 values - if (!(A->x_shallow)) - { - switch (A->type) - { - case SPEX_MPZ: - if ( A->x.mpz) - for (int64_t i = 0; i < A->nzmax; i++) - { - if ( A->x.mpz[i] != NULL) - { - SPEX_MPZ_CLEAR( A->x.mpz[i]); - } - } - SPEX_FREE (A->x.mpz); - break ; - - case SPEX_MPQ: - if ( A->x.mpq) - for (int64_t i = 0; i < A->nzmax; i++) - { - if ( A->x.mpq[i] != NULL) - { - SPEX_MPQ_CLEAR( A->x.mpq[i]); - } - } - SPEX_FREE (A->x.mpq); - break ; - - case SPEX_MPFR: - if ( A->x.mpfr) - for (int64_t i = 0; i < A->nzmax; i++) - { - if ( A->x.mpfr[i] != NULL) - { - 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) ; - - //-------------------------------------------------------------------------- - // free the header - //-------------------------------------------------------------------------- - - // the header is never shallow - SPEX_FREE (A) ; - (*A_handle) = NULL ; - return (SPEX_OK) ; -} - diff --git a/SPEX/SPEX_Util/Source/SPEX_version.c b/SPEX/SPEX_Util/Source/SPEX_version.c deleted file mode 100644 index 2687e3a98a..0000000000 --- a/SPEX/SPEX_Util/Source/SPEX_version.c +++ /dev/null @@ -1,19 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX/Source/amd_version: return SPEX version -//------------------------------------------------------------------------------ - -// SPEX_Util: (c) 2019-2023, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -#include "spex_util_internal.h" - -void SPEX_version (int version [3]) -{ - version [0] = SPEX_VERSION_MAJOR ; - version [1] = SPEX_VERSION_MINOR ; - version [2] = SPEX_VERSION_SUB ; -} - diff --git a/SPEX/SPEX_Util/Source/spex_expand_mpfr_array.c b/SPEX/SPEX_Util/Source/spex_expand_mpfr_array.c deleted file mode 100644 index 9a9d9d2deb..0000000000 --- a/SPEX/SPEX_Util/Source/spex_expand_mpfr_array.c +++ /dev/null @@ -1,65 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Util/spex_expand_mpfr_array: convert mpfr aray to mpz -//------------------------------------------------------------------------------ - -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -/* Purpose: This function converts a mpfr array of size n and precision prec to - * an appropriate mpz array of size n. To do this, the number is cast to an - * equivalent mpq_t (rational number) a conversion which MPFR gaurantees to be - * exact. Then, this rational array is converted to an mpz_t array - * This function allows mpfr arrays to be used within SPEX. - */ - -#define SPEX_FREE_ALL \ - SPEX_matrix_free(&x3, NULL); \ - -#include "spex_util_internal.h" - -SPEX_info spex_expand_mpfr_array -( - mpz_t* x_out, // full precision mpz array - mpfr_t* x, // mpfr array to be expanded - mpq_t scale, // scaling factor used (x_out = scale*x) - int64_t n, // size of x - const SPEX_options *option // command options containing the prec - // and rounding for mpfr -) -{ - - //-------------------------------------------------------------------------- - // Input has already been checked - //-------------------------------------------------------------------------- - ASSERT(n >= 0); - SPEX_info info ; - - //-------------------------------------------------------------------------- - // initializations - //-------------------------------------------------------------------------- - - int64_t i; - SPEX_matrix* x3 = NULL; - mpfr_rnd_t round = SPEX_OPTION_ROUND (option) ; - - SPEX_CHECK (SPEX_matrix_allocate(&x3, SPEX_DENSE, SPEX_MPQ, n, 1, n, - false, true, option)); - - // Cast the mpfr array to a rational array - for (i = 0; i < n; i++) - { - // x3[i] = x[i] - SPEX_CHECK(SPEX_mpfr_get_q(x3->x.mpq[i],x[i],round)); - } - - // Expand the mpq array - SPEX_CHECK( spex_expand_mpq_array( x_out, x3->x.mpq, scale, n, option)); - - // Free memory - SPEX_FREE_ALL; - return SPEX_OK; -} - diff --git a/SPEX/SPEX_Util/Source/spex_expand_mpq_array.c b/SPEX/SPEX_Util/Source/spex_expand_mpq_array.c deleted file mode 100644 index d6aa6fe948..0000000000 --- a/SPEX/SPEX_Util/Source/spex_expand_mpq_array.c +++ /dev/null @@ -1,62 +0,0 @@ -//------------------------------------------------------------------------------ -// SPEX_Util/spex_expand_mpq_array: convert mpq array to mpz -//------------------------------------------------------------------------------ - -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. -// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later - -//------------------------------------------------------------------------------ - -/* Purpose: This function converts a mpq array of size n into an appropriate - * mpz array of size n. To do this, the lcm of the denominators is found as a - * scaling factor. This function allows mpq arrays to be used in SPEX. - */ - -#define SPEX_FREE_ALL \ - SPEX_MPZ_CLEAR(temp); - -#include "spex_util_internal.h" - -SPEX_info spex_expand_mpq_array -( - mpz_t* x_out, // mpz array, on output x_out = x*scale - mpq_t* x, // mpq array that needs to be converted - mpq_t scale, // scaling factor. x_out = scale*x - int64_t n, // size of x - const SPEX_options* option // Command options -) -{ - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - // inputs have been checked in the only caller spex_cast_array - ASSERT(n >= 0); - SPEX_info info ; - - //-------------------------------------------------------------------------- - // Define temporary mpz_t variable - //-------------------------------------------------------------------------- - mpz_t temp; - SPEX_MPZ_SET_NULL(temp); - SPEX_CHECK (SPEX_mpz_init(temp)) ; - - // Find LCM of denominators of x - SPEX_CHECK(SPEX_mpz_set(temp, SPEX_MPQ_DEN(x[0]))); - for (int64_t i = 1; i < n; i++) - { - SPEX_CHECK(SPEX_mpz_lcm(temp, SPEX_MPQ_DEN(x[i]), temp)); - } - SPEX_CHECK(SPEX_mpq_set_z(scale,temp)); - - for (int64_t i = 0; i < n; i++) - { - // x_out[i] = x[i]*temp - SPEX_CHECK(SPEX_mpz_divexact(x_out[i], temp, SPEX_MPQ_DEN(x[i]))); - SPEX_CHECK(SPEX_mpz_mul(x_out[i], x_out[i], SPEX_MPQ_NUM(x[i]))); - } - SPEX_FREE_ALL; - return SPEX_OK; -} - diff --git a/SPEX/SPEX_Utilities/License/CONTRIBUTOR-LICENSE.txt b/SPEX/SPEX_Utilities/License/CONTRIBUTOR-LICENSE.txt new file mode 100644 index 0000000000..c6fa3b44dc --- /dev/null +++ b/SPEX/SPEX_Utilities/License/CONTRIBUTOR-LICENSE.txt @@ -0,0 +1,170 @@ +SPEX_Utilities Individual Contributor License Agreement + +Thank you for your interest in contributing to SPEX_Utilities ("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 +All SPEX co-authors: +Christopher Lourenco +Jinhao Chen +Lorena Mejia Domenzain +Timothy A. Davis +Erick Moreno-Centeno diff --git a/SPEX/SPEX_Utilities/License/GPLv2.txt b/SPEX/SPEX_Utilities/License/GPLv2.txt new file mode 100644 index 0000000000..d159169d10 --- /dev/null +++ b/SPEX/SPEX_Utilities/License/GPLv2.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/SPEX/SPEX_Utilities/License/lesserv3.txt b/SPEX/SPEX_Utilities/License/lesserv3.txt new file mode 100644 index 0000000000..fc8a5de7ed --- /dev/null +++ b/SPEX/SPEX_Utilities/License/lesserv3.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/SPEX/SPEX_Utilities/License/license.txt b/SPEX/SPEX_Utilities/License/license.txt new file mode 100644 index 0000000000..44cb885689 --- /dev/null +++ b/SPEX/SPEX_Utilities/License/license.txt @@ -0,0 +1,41 @@ +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. +All Rights Reserved. + +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. Each distributor and end-user of SPEX may +select either license, at their option. + +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/. diff --git a/SPEX/SPEX_Util/README.md b/SPEX/SPEX_Utilities/README.md similarity index 60% rename from SPEX/SPEX_Util/README.md rename to SPEX/SPEX_Utilities/README.md index 469e7fca26..360e1a6a4c 100644 --- a/SPEX/SPEX_Util/README.md +++ b/SPEX/SPEX_Utilities/README.md @@ -2,14 +2,11 @@ This folder contains utility functions for the SPEX software package. These functions are shared amongst all other SPEX packages. Key subroutines within this folder: - + -All SPEX GMP/MPFR wrapper functions -All SPEX matrix functions -All SPEX memory handling functions - -General Ax = b sanity check function Other functions that may be useful can be added in the future. -Note that all of these functions are test covered by the respective -packages that use them. For example, SPEX Left LU performs test coverage -on every used utility function. +Note that all of these functions are test covered in SPEX/Tcov. diff --git a/SPEX/SPEX_Util/Source/SPEX_calloc.c b/SPEX/SPEX_Utilities/Source/SPEX_calloc.c similarity index 64% rename from SPEX/SPEX_Util/Source/SPEX_calloc.c rename to SPEX/SPEX_Utilities/Source/SPEX_calloc.c index 8497fbd74c..49bdc9d4f8 100644 --- a/SPEX/SPEX_Util/Source/SPEX_calloc.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_calloc.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_calloc: wrapper for calloc +// SPEX_Utilities/SPEX_calloc: wrapper for calloc //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -18,8 +19,7 @@ void *SPEX_calloc size_t size // size of each item ) { - if (!spex_initialized ( )) return (NULL) ; - return (SuiteSparse_calloc (nitems, size)) ; + return (SuiteSparse_calloc (nitems, size)); } diff --git a/SPEX/SPEX_Util/Source/SPEX_create_default_options.c b/SPEX/SPEX_Utilities/Source/SPEX_create_default_options.c similarity index 55% rename from SPEX/SPEX_Util/Source/SPEX_create_default_options.c rename to SPEX/SPEX_Utilities/Source/SPEX_create_default_options.c index 544172cb95..e521a3e8df 100644 --- a/SPEX/SPEX_Util/Source/SPEX_create_default_options.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_create_default_options.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_create_default_options: set defaults +// SPEX_Utilities/SPEX_create_default_options: set defaults //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -14,34 +15,33 @@ #include "spex_util_internal.h" - -SPEX_info SPEX_create_default_options (SPEX_options **option ) +SPEX_info SPEX_create_default_options (SPEX_options *option_handle) { - if (!spex_initialized ( )) return (SPEX_PANIC) ; + if (!spex_initialized ( )) return (SPEX_PANIC); //-------------------------------------------------------------------------- // allocate the option struct //-------------------------------------------------------------------------- - *option = SPEX_malloc(sizeof(SPEX_options)) ; - if (!(*option)) + (*option_handle) = SPEX_malloc(sizeof(SPEX_options_struct)); + if (!(*option_handle)) { // out of memory - return (SPEX_OUT_OF_MEMORY) ; + return (SPEX_OUT_OF_MEMORY); } //-------------------------------------------------------------------------- // set defaults //-------------------------------------------------------------------------- - (*option)->pivot = SPEX_DEFAULT_PIVOT ; - (*option)->order = SPEX_DEFAULT_ORDER ; - (*option)->print_level = SPEX_DEFAULT_PRINT_LEVEL ; - (*option)->prec = SPEX_DEFAULT_PRECISION ; - (*option)->tol = SPEX_DEFAULT_TOL ; - (*option)->round = SPEX_DEFAULT_MPFR_ROUND ; - (*option)->check = false ; + (*option_handle)->pivot = SPEX_DEFAULT_PIVOT ; + (*option_handle)->order = SPEX_DEFAULT_ORDER ; + (*option_handle)->print_level = SPEX_DEFAULT_PRINT_LEVEL ; + (*option_handle)->prec = SPEX_DEFAULT_PRECISION ; + (*option_handle)->tol = SPEX_DEFAULT_TOL ; + (*option_handle)->round = SPEX_DEFAULT_MPFR_ROUND ; + (*option_handle)->algo = SPEX_DEFAULT_ALGORITHM ; //-------------------------------------------------------------------------- // return result diff --git a/SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c b/SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c new file mode 100644 index 0000000000..a6f14b86d8 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c @@ -0,0 +1,114 @@ +//------------------------------------------------------------------------------ +// SPEX_Utilities/SPEX_determine_symmetry: Determine if given matrix is +// *numerically* (thus pattern-wise) symmetric +//------------------------------------------------------------------------------ + +// 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: Determine if the input A is *numerically* (thus pattern-wise) + * symmetric. Since SPEX is an exact framework, it doesn't make sense to check + * only pattern symmetry. + * + * If the matrix is determined to be symmetric, is_symmetric is returned as + * true. + */ + +#define SPEX_FREE_ALL \ +{ \ + SPEX_matrix_free(&T,NULL); \ + SPEX_matrix_free(&R,NULL); \ +} + +#include "spex_util_internal.h" + +SPEX_info SPEX_determine_symmetry +( + bool *is_symmetric, // true if matrix is symmetric, false otherwise + const SPEX_matrix A, // Input matrix to be checked for symmetry + const SPEX_options option // Command options +) +{ + + SPEX_info info; + + // Check for null pointers + if (!A || !option || !is_symmetric) + { + return SPEX_INCORRECT_INPUT; + } + (*is_symmetric) = false ; + + // A must be CSC and mpz_t + if (A->kind != SPEX_CSC || A->type != SPEX_MPZ) + { + return SPEX_INCORRECT_INPUT; + } + + if (A->n != A->m) + { + // matrix is rectangular (and thus unsymmetric) + return SPEX_OK ; + } + + // Only used index + int64_t j; + + // Declare matrices T and R. T = A' and R = T' = A'' + SPEX_matrix T = NULL, R = NULL ; + // T = A' + SPEX_CHECK( SPEX_transpose(&T, A, option) ); + + // Check if the number of nonzeros in the columns + // of A are equal to the number of nonzeros in + // the rows of A. This is a quick check to + // ensure the matrix is candidate to be symmetric. + // Moreover, this check is important becuase + // otherwise the ensuing block could seg-fault + for (j = 0; j <= A->n; j++) + { + if (T->p[j] != A->p[j]) + { + // Number of nonzeros in column k of A + // is not the same as the number of nonzeros + // in row k of A. So free all and exit + // nnz( A(:,k)) != nnz( A(k,:)) + SPEX_FREE_ALL; + return SPEX_OK ; + } + } + + // Set R = T' + SPEX_CHECK( SPEX_transpose(&R, T, option) ); + + // Check whether A[i][j] = A[j][i] in both pattern and numerics + for (j = 0; j < R->p[R->n]; j++) + { + // Check pattern + if (T->i[j] != R->i[j]) + { + // Not pattern symmetric as row indices do not match + SPEX_FREE_ALL; + return SPEX_OK ; + } + // Check numerics + int r; + SPEX_MPZ_CMP(&r, R->x.mpz[j], T->x.mpz[j]); + if (r != 0) + { + // Not numeric symmetric + SPEX_FREE_ALL; + return SPEX_OK ; + } + } + + // Free memory and return OK, and return is_symmetric as true + SPEX_FREE_ALL; + (*is_symmetric) = true ; + return SPEX_OK; +} + diff --git a/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c b/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c new file mode 100644 index 0000000000..c9ae0116cc --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c @@ -0,0 +1,48 @@ +//------------------------------------------------------------------------------ +// SPEX_Utilities/SPEX_factorization_free: Free memory for the +// SPEX_factorization data type. +//------------------------------------------------------------------------------ + +// 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 frees the memory of the SPEX_factorization struct + * + * Input is the SPEX_factorization structure, it is destroyed on function + * termination. + */ + +#include "spex_util_internal.h" + +SPEX_info SPEX_factorization_free +( + SPEX_factorization *F_handle, // Structure to be deleted + const SPEX_options option +) +{ + + if (!spex_initialized ( )) return (SPEX_PANIC); + + if ((F_handle != NULL) && (*F_handle != NULL)) + { + SPEX_MPQ_CLEAR((*F_handle)->scale_for_A); + + SPEX_matrix_free(&((*F_handle)->L), option); + SPEX_matrix_free(&((*F_handle)->U), option); + SPEX_matrix_free(&((*F_handle)->rhos), option); + + SPEX_FREE((*F_handle)->P_perm); + SPEX_FREE((*F_handle)->Pinv_perm); + SPEX_FREE((*F_handle)->Q_perm); + SPEX_FREE((*F_handle)->Qinv_perm); + + SPEX_FREE (*F_handle); + } + + return (SPEX_OK); +} + diff --git a/SPEX/SPEX_Utilities/Source/SPEX_finalize.c b/SPEX/SPEX_Utilities/Source/SPEX_finalize.c new file mode 100644 index 0000000000..9276f9fcef --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/SPEX_finalize.c @@ -0,0 +1,34 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +// SPEX_finalize frees the working environment for SPEX library. +// This function must be called by the same user thread that called +// SPEX_initialize or SPEX_initialize_expert. + +#include "spex_util_internal.h" + +SPEX_info SPEX_finalize +( + void +) +{ + + if (!spex_initialized ( )) { return (SPEX_PANIC); } + + SPEX_mpfr_free_cache ( ); // Free mpfr internal cache + + // the primary thread always frees the spex_gmp object + spex_gmp_finalize (1); + + spex_set_initialized (false); + return (SPEX_OK); +} + diff --git a/SPEX/SPEX_Util/Source/SPEX_free.c b/SPEX/SPEX_Utilities/Source/SPEX_free.c similarity index 67% rename from SPEX/SPEX_Util/Source/SPEX_free.c rename to SPEX/SPEX_Utilities/Source/SPEX_free.c index d0187e6420..28db44e25e 100644 --- a/SPEX/SPEX_Util/Source/SPEX_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_free.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_free: wrapper for free +// SPEX_Utilities/SPEX_free: wrapper for free //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -17,6 +18,6 @@ void SPEX_free void *p // pointer to memory space to free ) { - SuiteSparse_free (p) ; + SuiteSparse_free (p); } diff --git a/SPEX/SPEX_Util/Source/SPEX_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c similarity index 60% rename from SPEX/SPEX_Util/Source/SPEX_gmp.c rename to SPEX/SPEX_Utilities/Source/SPEX_gmp.c index 0f065799ae..a7c8e35180 100644 --- a/SPEX/SPEX_Util/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_gmp.c: interface to the gmp library +// SPEX_Utilities/SPEX_gmp.c: interface to the gmp library //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -31,9 +32,9 @@ SPEX_info SPEX_gmpfunc (args) { SPEX_GMP_WRAPPER_START ; - gmpfunc (args) ; + gmpfunc (args); SPEX_GMP_WRAPPER_FINISH ; - return SPEX_OK ; + return (SPEX_OK); } */ @@ -47,84 +48,230 @@ // is passed as the first argument to the SPEX_gmpfunc: /* - SPEX_info SPEX_gmfunc (result, args) + SPEX_info SPEX_gmpfunc (int *result, args) { SPEX_GMP_WRAPPER_START ; - (*result) = gmpfunc (args) ; + (*result) = gmpfunc (args); SPEX_GMP_WRAPPER_FINISH ; - return SPEX_OK ; + return (SPEX_OK); } */ -// The SPEX_GMP*_WRAPPER_START macros also take an single 'archive' parameter, +// The SPEX_GMP*_WRAPPER_START macros also take one or two 'archive' parameters, // for the current mpz, mpq, or mpfr object being operated on. A pointer // parameter to this parameter is kept so that it can be safely freed in case -// a memory error occurs (avoiding a double-free), in SPEX_GMP_SAFE_FREE. +// a memory error occurs (avoiding a double-free), in spex_gmp_safe_free. +// See the examples below. #include "spex_util_internal.h" -#include "SPEX_gmp.h" -#if defined (__GNUC__) // ignore warnings about unused parameters in this file +#if defined (__GNUC__) #pragma GCC diagnostic ignored "-Wunused-parameter" #endif //------------------------------------------------------------------------------ -// global variables +// thread-local-storage //------------------------------------------------------------------------------ -jmp_buf spex_gmp_environment ; // for setjmp and longjmp -int64_t spex_gmp_nmalloc = 0 ; // number of malloc'd objects in SPEX_gmp_list -int64_t spex_gmp_nlist = 0 ; // size of the SPEX_gmp_list -void **spex_gmp_list = NULL ; // list of malloc'd objects +// SPEX is thread-safe as long as all of the following conditions hold: +// +// (1) GMP and MPFR are both thread-safe. This is the typical case, but it is +// possible to compile GMP and MPFR with thread-safety disabled. See: +// https://gmplib.org/manual/Reentrancy +// https://www.mpfr.org/mpfr-3.1.0/ +// +// (2) only one user thread calls SPEX_initialize and SPEX_finalize. +// +// (3) each subsequent user thread must call SPEX_thread_initialize when it +// starts, and SPEX_thread_finalize when it finishes. +// +// (4) Multiple user threads may not write to the same SPEX objects. If +// declared as an input-only variable, multiple user threads may access +// them in parallel. +// +// (5) SPEX is compiled with either OpenMP, or a compiler that supports +// thread-local-storage (most of them do). + +#if defined ( _OPENMP ) + + // OpenMP threadprivate is preferred + #include + spex_gmp_t *spex_gmp = NULL ; + #pragma omp threadprivate (spex_gmp) + +#elif defined ( HAVE_KEYWORD__THREAD ) + + // gcc and many other compilers support the __thread keyword + __thread spex_gmp_t *spex_gmp = NULL ; + +#elif defined ( HAVE_KEYWORD__DECLSPEC_THREAD ) + + // Windows: __declspec (thread) + __declspec ( thread ) spex_gmp_t *spex_gmp = NULL ; + +#elif defined ( HAVE_KEYWORD__THREAD_LOCAL ) + + // ANSI C11 threads + #include + _Thread_local spex_gmp_t *spex_gmp = NULL ; -int64_t spex_gmp_ntrials = -1 ; // number of malloc's allowed (for - // testing only): -1 means unlimited. +#else -mpz_ptr spex_gmpz_archive = NULL ; // current mpz object -mpq_ptr spex_gmpq_archive = NULL ; // current mpq object -mpfr_ptr spex_gmpfr_archive = NULL ; // current mpfr object + // SPEX will not be thread-safe. + spex_gmp_t *spex_gmp = NULL ; + +#endif //------------------------------------------------------------------------------ -// spex_gmp_init: initialize gmp +// GMP/MPFR wrapper macros //------------------------------------------------------------------------------ -/* Purpose: Create the list of malloc'd objects. This should be called before - * calling any GMP function. It is also called by SPEX_gmp_allocate when - * SPEX_gmp_list is NULL - */ +#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 ; \ + /* setjmp returns 0 if called from here, or > 0 if from longjmp */ \ + int status = setjmp (spex_gmp->environment) ; \ + if (status != 0) \ + { \ + /* failure from longjmp */ \ + return (spex_gmp_failure (status)) ; \ + } + +#define SPEX_GMP_WRAPPER_START \ + SPEX_GMP_WRAPPER_START_HELPER (NULL, NULL, NULL, NULL) ; + +#define SPEX_GMPZ_WRAPPER_START(z1) \ + SPEX_GMP_WRAPPER_START_HELPER (z1, NULL, NULL, NULL) ; + +#define SPEX_GMPZ_WRAPPER_START2(z1,z2) \ + SPEX_GMP_WRAPPER_START_HELPER (z1, z2, NULL, NULL) ; + +#define SPEX_GMPQ_WRAPPER_START(q) \ + SPEX_GMP_WRAPPER_START_HELPER (NULL, NULL, q, NULL) ; + +#define SPEX_GMPFR_WRAPPER_START(fr) \ + SPEX_GMP_WRAPPER_START_HELPER (NULL, NULL, NULL, fr) ; + +#define SPEX_GMP_WRAPPER_FINISH \ + spex_gmp->nmalloc = 0 ; \ + spex_gmp->mpz_archive = NULL ; \ + spex_gmp->mpz_archive2 = NULL ; \ + spex_gmp->mpq_archive = NULL ; \ + spex_gmp->mpfr_archive = NULL ; + +//------------------------------------------------------------------------------ +// spex_gmp_initialize: initialize the SPEX GMP interface +//------------------------------------------------------------------------------ + +// Called by SPEX_initialize* with primary == 1, and by SPEX_thread_initialize +// with primary == 0. The object is not allocated if it already exists. + +SPEX_info spex_gmp_initialize (int primary) +{ + if (spex_gmp == NULL) + { + // allocate the spex_gmp object + spex_gmp = SPEX_calloc (1, sizeof (spex_gmp_t)); + if (spex_gmp == NULL) + { + // out of memory + return (SPEX_OUT_OF_MEMORY); + } + + // allocate an empty spex_gmp->list + spex_gmp->list = (void **) SPEX_calloc (SPEX_GMP_LIST_INIT, + sizeof (void *)); + + if (spex_gmp->list == NULL) + { + // out of memory + SPEX_FREE (spex_gmp); + return (SPEX_OUT_OF_MEMORY); + } + + // initialize the spex_gmp + spex_gmp->nlist = SPEX_GMP_LIST_INIT ; + spex_gmp->nmalloc = 0 ; + spex_gmp->mpz_archive = NULL ; + spex_gmp->mpz_archive2 = NULL ; + spex_gmp->mpq_archive = NULL ; + spex_gmp->mpfr_archive = NULL ; + spex_gmp->primary = primary ; + } + return (SPEX_OK); +} + +//------------------------------------------------------------------------------ +// spex_gmp_finalize: finalize the SPEX GMP interface +//------------------------------------------------------------------------------ + +// called by SPEX_finalize* with primary == 1, and by SPEX_thread_finalize with +// primary == 0. -bool spex_gmp_init ( ) +void spex_gmp_finalize (int primary) { - spex_gmp_nmalloc = 0 ; - spex_gmp_nlist = SPEX_GMP_LIST_INIT ; - spex_gmp_list = (void **) SPEX_malloc (spex_gmp_nlist * sizeof (void *)) ; - return (spex_gmp_list != NULL) ; + // free the spex_gmp object for this thread, if it exists. If this function + // is called by SPEX_finalize, then primary == 1 on input, and the spex_gmp + // object is always freed. If primary == 0 on input, then the caller is + // SPEX_thread_finalize, and in this case the spex_gmp object is freed only + // if spex_gmp->primary is also zero. + + if (spex_gmp != NULL && primary >= spex_gmp->primary) + { + // free the spex_gmp->list, if it exists + SPEX_FREE (spex_gmp->list) ; + // free the spex_gmp object itself + SPEX_FREE (spex_gmp); + } } //------------------------------------------------------------------------------ -// SPEX_gmp_finalize: finalize gmp +// spex_gmp_get: get the thread-local spex_gmp object and initialize it //------------------------------------------------------------------------------ -/* Purpose: Free the list. Must be called when all use of GMP is done */ -void spex_gmp_finalize ( ) +spex_gmp_t *spex_gmp_get (void) { - spex_gmpz_archive = NULL ; - spex_gmpq_archive = NULL ; - spex_gmpfr_archive = NULL ; - spex_gmp_nmalloc = 0 ; - spex_gmp_nlist = 0 ; - SPEX_FREE (spex_gmp_list) ; + if (spex_gmp != NULL) + { + // clear the list of allocated objects in the spex_gmp->list + spex_gmp->nmalloc = 0 ; + } + + // return the spex_gmp object for this thread (or NULL if none) + return (spex_gmp); } //------------------------------------------------------------------------------ -// SPEX_gmp_allocate: malloc space for gmp +// spex_gmp_ntrials: pretend to fail, for test coverage only +//------------------------------------------------------------------------------ + +#ifdef SPEX_GMP_TEST_COVERAGE +static int64_t spex_gmp_ntrials = -1 ; // for test coverage only + +void spex_set_gmp_ntrials (int64_t ntrials) +{ + spex_gmp_ntrials = ntrials ; +} + +int64_t spex_get_gmp_ntrials (void) +{ + return (spex_gmp_ntrials) ; +} +#endif + +//------------------------------------------------------------------------------ +// spex_gmp_allocate: malloc space for gmp //------------------------------------------------------------------------------ /* Purpose: malloc space for gmp. A NULL pointer is never returned to the GMP - * library. If the allocation fails, all memory allocated since the start of - * the SPEX_gmp_wrapper is freed and an error is thrown to the GMP wrapper via - * longjmp + * library. If the allocation fails, all memory allocated since the + * SPEX_GMP*_WRAPPER_START is freed and an error is thrown to the GMP wrapper + * via longjmp */ void *spex_gmp_allocate @@ -133,88 +280,134 @@ void *spex_gmp_allocate ) { - #ifdef SPEX_GMP_MEMORY_DEBUG - SPEX_PRINTF ("spex_gmp_malloc (%g): ", (double) size) ; - #endif - //-------------------------------------------------------------------------- - // for testing only: + // check inputs //-------------------------------------------------------------------------- - if (spex_gmp_ntrials == 0) - { - // pretend to fail - #ifdef SPEX_GMP_MEMORY_DEBUG - SPEX_PRINTF ("spex_gmp_allocate pretends to fail\n") ; - #endif - longjmp (spex_gmp_environment, 1) ; - } - else if (spex_gmp_ntrials > 0) - { - // one more malloc has been used up - spex_gmp_ntrials-- ; - } + // if spex_gmp does not exist, memory cannot be allocarted + if (spex_gmp == NULL) return (NULL) ; //-------------------------------------------------------------------------- - // ensure the SPEX_gmp_list is large enough + // for testing only: //-------------------------------------------------------------------------- - if (spex_gmp_list == NULL) + #ifdef SPEX_GMP_TEST_COVERAGE { - // create the initial SPEX_gmp_list - if (!spex_gmp_init ( )) + if (spex_gmp_ntrials == 0) + { + // pretend to fail + #ifdef SPEX_GMP_MEMORY_DEBUG + SPEX_PRINTF ("spex_gmp_allocate pretends to fail\n"); + #endif + longjmp (spex_gmp->environment, 1); + } + else if (spex_gmp_ntrials > 0) { - // failure to create the SPEX_gmp_list - longjmp (spex_gmp_environment, 2) ; + // one more malloc has been used up + spex_gmp_ntrials-- ; } } - else if (spex_gmp_nmalloc == spex_gmp_nlist) + #endif + + //-------------------------------------------------------------------------- + // ensure the spex_gmp->list is large enough + //-------------------------------------------------------------------------- + + if (spex_gmp->nmalloc == spex_gmp->nlist) { - // double the size of the SPEX_gmp_list + // double the size of the spex_gmp->list bool ok ; - int64_t newsize = 2 * spex_gmp_nlist ; - spex_gmp_list = (void **) - SPEX_realloc (newsize, spex_gmp_nlist, sizeof (void *), - spex_gmp_list, &ok) ; + int64_t newsize = 2 * spex_gmp->nlist ; + spex_gmp->list = (void **) + SPEX_realloc (newsize, spex_gmp->nlist, sizeof (void *), + spex_gmp->list, &ok); if (!ok) { - // failure to double the size of the SPEX_gmp_list. - // The existing SPEX_gmp_list is still valid, with the old size, - // (SPEX_gmp_nlist). This is required so that the error handler - // can traverse the SPEX_gmp_list to free all objects there. - longjmp (spex_gmp_environment, 3) ; + // failure to double the size of the spex_gmp->list. + // The existing spex_gmp->list is still valid, with the old size, + // (spex_gmp->nlist). This is required so that the error handler + // can traverse the spex_gmp->list to free all objects there. + longjmp (spex_gmp->environment, 3); } - // success; the old SPEX_gmp_list has been freed, and replaced with + // success: the old spex_gmp->list has been freed, and replaced with // the larger newlist. - spex_gmp_nlist = newsize ; + spex_gmp->nlist = newsize ; } //-------------------------------------------------------------------------- // malloc the block //-------------------------------------------------------------------------- - void *p = SPEX_malloc (size) ; + #ifdef SPEX_GMP_MEMORY_DEBUG + SPEX_PRINTF ("spex_gmp_malloc (%g): ", (double) size); + #endif + + void *p = SPEX_malloc (size); if (p == NULL) { // failure to allocate the new block - longjmp (spex_gmp_environment, 4) ; + longjmp (spex_gmp->environment, 4); } //-------------------------------------------------------------------------- - // save p in the SPEX_gmp_list and return result to GMP + // save p in the spex_gmp->list and return result to GMP //-------------------------------------------------------------------------- - spex_gmp_list [spex_gmp_nmalloc++] = p ; + spex_gmp->list [spex_gmp->nmalloc++] = p ; #ifdef SPEX_GMP_MEMORY_DEBUG - SPEX_PRINTF (" %p\n", p) ; - spex_gmp_dump ( ) ; + SPEX_PRINTF (" %p\n", p); + spex_gmp_dump ( ); #endif // return p to SPEX_gmp_function (NEVER return a NULL pointer to GMP!) - ASSERT (p != NULL) ; - return (p) ; + ASSERT (p != NULL); + return (p); +} + +//------------------------------------------------------------------------------ +// spex_gmp_safe_free: free a block of memory and remove it from the archive +//------------------------------------------------------------------------------ + +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))) + { + SPEX_MPZ_PTR((spex_gmp->mpz_archive)) = NULL ; + } + } + if (spex_gmp->mpz_archive2 != NULL) + { + if (p == SPEX_MPZ_PTR((spex_gmp->mpz_archive2))) + { + 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))) + { + SPEX_MPZ_PTR(SPEX_MPQ_NUM(spex_gmp->mpq_archive)) = NULL ; + } + if (p == SPEX_MPZ_PTR(SPEX_MPQ_DEN(spex_gmp->mpq_archive))) + { + 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 ; + } + } + } + SPEX_FREE (p) ; } //------------------------------------------------------------------------------ @@ -228,36 +421,58 @@ void spex_gmp_free size_t size // Size of p (currently an unused parameter) ) { - #ifdef SPEX_GMP_MEMORY_DEBUG - SPEX_PRINTF ("\n=================== free %p\n", p) ; - spex_gmp_dump ( ) ; - #endif - if (p != NULL && spex_gmp_list != NULL) + //-------------------------------------------------------------------------- + // quick return if p is NULL + //-------------------------------------------------------------------------- + + if (p == NULL) { - // remove p from the SPEX_gmp_list - for (int64_t i = 0 ; i < spex_gmp_nmalloc ; i++) + return ; + } + + //-------------------------------------------------------------------------- + // remove the block from the spex_gmp->list + //-------------------------------------------------------------------------- + + if (spex_gmp != NULL) + { + + #ifdef SPEX_GMP_MEMORY_DEBUG + SPEX_PRINTF ("\n=================== free %p\n", p); + spex_gmp_dump ( ); + #endif + + if (spex_gmp->list != NULL) { - if (spex_gmp_list [i] == p) + // remove p from the spex_gmp->list + for (int64_t i = 0 ; i < spex_gmp->nmalloc ; i++) { - #ifdef SPEX_GMP_MEMORY_DEBUG - SPEX_PRINTF (" found at i = %d\n", i) ; - #endif - spex_gmp_list [i] = spex_gmp_list [--spex_gmp_nmalloc] ; - break ; + if (spex_gmp->list [i] == p) + { + #ifdef SPEX_GMP_MEMORY_DEBUG + SPEX_PRINTF (" found at i = %d\n", i); + #endif + spex_gmp->list [i] = spex_gmp->list [--spex_gmp->nmalloc] ; + break ; + } } } + + #ifdef SPEX_GMP_MEMORY_DEBUG + spex_gmp_dump ( ); + #endif } - #ifdef SPEX_GMP_MEMORY_DEBUG - spex_gmp_dump ( ) ; - #endif + //-------------------------------------------------------------------------- + // free the block + //-------------------------------------------------------------------------- - // free p, even if it is not found in the SPEX_gmp_list. p is only in the - // SPEX_gmp_list if it was allocated inside the current GMP function. + // free p, even if it is not found in the spex_gmp->list. p is only in the + // spex_gmp->list if it was allocated inside the current GMP function. // If the block was allocated by one GMP function and freed by another, // it is not in the list. - SPEX_GMP_SAFE_FREE (p) ; + spex_gmp_safe_free (p); } //------------------------------------------------------------------------------ @@ -272,31 +487,43 @@ void *spex_gmp_reallocate size_t new_size // New size of p ) { + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + // if spex_gmp does not exist, memory cannot be allocated + if (spex_gmp == NULL) return (NULL) ; + + //-------------------------------------------------------------------------- + // reallocate the space + //-------------------------------------------------------------------------- + #ifdef SPEX_GMP_MEMORY_DEBUG SPEX_PRINTF ("spex_gmp_realloc (%p, %g, %g)\n", p_old, - (double) old_size, (double) new_size) ; + (double) old_size, (double) new_size); #endif if (p_old == NULL) { // realloc (NULL, size) is the same as malloc (size) - return (spex_gmp_allocate (new_size)) ; + return (spex_gmp_allocate (new_size)); } else if (new_size == 0) { // realloc (p, 0) is the same as free (p), and returns NULL - spex_gmp_free (p_old, old_size) ; - return (NULL) ; + spex_gmp_free (p_old, old_size); + return (NULL); } else { // change the size of the block - void *p_new = spex_gmp_allocate (new_size) ; - // Note that p_new will never be NULL here, since SPEX_gmp_allocate + void *p_new = spex_gmp_allocate (new_size); + // Note that p_new will never be NULL here, since spex_gmp_allocate // does not return if it fails. - memcpy (p_new, p_old, SPEX_MIN (old_size, new_size)) ; - spex_gmp_free (p_old, old_size) ; - return (p_new) ; + memcpy (p_new, p_old, SPEX_MIN (old_size, new_size)); + spex_gmp_free (p_old, old_size); + return (p_new); } } @@ -305,19 +532,36 @@ void *spex_gmp_reallocate //------------------------------------------------------------------------------ /* Purpose: Dump the list of malloc'd objects */ + #ifdef SPEX_GMP_MEMORY_DEBUG void spex_gmp_dump ( ) { - // dump the SPEX_gmp_list - SPEX_PRINTF ("nmalloc = %g, SPEX_gmp_nlist = %g\n", - (double) spex_gmp_nmalloc, (double) spex_gmp_nlist) ; - if (spex_gmp_list != NULL) + + //-------------------------------------------------------------------------- + // dump the spex_gmp->list + //-------------------------------------------------------------------------- + + if (spex_gmp == NULL) + { + SPEX_PRINTF ("spex_gmp is NULL\n") ; + return ; + } + + SPEX_PRINTF ("nmalloc = %g, spex_gmp->nlist = %g\n", + (double) spex_gmp->nmalloc, (double) spex_gmp->nlist); + if (spex_gmp->list != NULL) { - for (int64_t i = 0 ; i < spex_gmp_nmalloc ; i++) + for (int64_t i = 0 ; i < spex_gmp->nmalloc ; i++) { - SPEX_PRINTF (" spex_gmp_list [%d] = %p\n", i, spex_gmp_list [i]); + SPEX_PRINTF (" spex_gmp->list [%d] = %p\n", i, + spex_gmp->list [i]); } } + + SPEX_PRINTF (" spex_gmp->mpz_archive : %p\n", spex_gmp->mpz_archive); + SPEX_PRINTF (" spex_gmp->mpz_archive2 : %p\n", spex_gmp->mpz_archive2); + SPEX_PRINTF (" spex_gmp->mpq_archive : %p\n", spex_gmp->mpq_archive); + SPEX_PRINTF (" spex_gmp->mpfr_archive : %p\n", spex_gmp->mpfr_archive); } #endif @@ -326,28 +570,50 @@ void spex_gmp_dump ( ) //------------------------------------------------------------------------------ /* Purpose: Catch an error from longjmp */ -void spex_gmp_failure + +SPEX_info spex_gmp_failure ( int status // Status returned from longjmp // (unused parameter unless debugging) ) { + + //-------------------------------------------------------------------------- + // get the spex_gmp object for this thread + //-------------------------------------------------------------------------- + #ifdef SPEX_GMP_MEMORY_DEBUG - SPEX_PRINTF ("failure from longjmp: status: %d\n", status) ; + SPEX_PRINTF ("failure from longjmp: status: %d\n", status); #endif - // first free all caches - mpfr_free_cache ( ) ; + //-------------------------------------------------------------------------- + // free all MPFR caches + //-------------------------------------------------------------------------- - // Free the list - if (spex_gmp_list != NULL) + mpfr_free_cache ( ); + + //-------------------------------------------------------------------------- + // free the contents of the spex_gmp_t list + //-------------------------------------------------------------------------- + + if (spex_gmp != NULL) { - for (int64_t i = 0 ; i < spex_gmp_nmalloc ; i++) + if (spex_gmp->list != NULL) { - SPEX_GMP_SAFE_FREE (spex_gmp_list [i]) ; + for (int64_t i = 0 ; i < spex_gmp->nmalloc ; i++) + { + spex_gmp_safe_free (spex_gmp->list [i]); + spex_gmp->list [i] = NULL ; + } } + SPEX_GMP_WRAPPER_FINISH ; } - spex_gmp_finalize ( ) ; + + //-------------------------------------------------------------------------- + // tell the caller that the GMP/MPFR function ran out of memory + //-------------------------------------------------------------------------- + + return (SPEX_OUT_OF_MEMORY); } //------------------------------------------------------------------------------ @@ -378,15 +644,15 @@ SPEX_info SPEX_gmp_fprintf SPEX_GMP_WRAPPER_START ; // call gmp_vfprintf - va_list args; - va_start (args, format) ; - int n = gmp_vfprintf (fp, format, args) ; - va_end (args) ; + va_list args ; + va_start (args, format); + int n = gmp_vfprintf (fp, format, args); + va_end (args); // Finish the wrapper SPEX_GMP_WRAPPER_FINISH ; // gmp_vfprintf returns -1 if an error occurred. - return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK) ; + return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK); } #endif @@ -397,6 +663,7 @@ SPEX_info SPEX_gmp_fprintf /* Safely print to the standard output stdout. Return positive value (the number * of characters written) upon success, otherwise return negative value (error * code) */ + #if 0 /* This function is currently unused, but kept here for future reference. */ SPEX_info SPEX_gmp_printf @@ -409,18 +676,19 @@ SPEX_info SPEX_gmp_printf SPEX_GMP_WRAPPER_START ; // call gmp_vprintf - va_list args; - va_start (args, format) ; - int n = gmp_vprintf (format, args) ; - va_end (args) ; + va_list args ; + va_start (args, format); + int n = gmp_vprintf (format, args); + va_end (args); // Finish the wrapper SPEX_GMP_WRAPPER_FINISH ; // gmp_vprintf returns -1 if an error occurred. - return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK) ; + return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK); } #endif + //------------------------------------------------------------------------------ // SPEX_gmp_asprintf //------------------------------------------------------------------------------ @@ -440,15 +708,15 @@ SPEX_info SPEX_gmp_asprintf (char **str, const char *format, ... ) SPEX_GMP_WRAPPER_START ; // call gmp_vasprintf - va_list args; - va_start (args, format) ; - int n = gmp_vasprintf (str, format, args) ; - va_end (args) ; + va_list args ; + va_start (args, format); + int n = gmp_vasprintf (str, format, args); + va_end (args); // Finish the wrapper SPEX_GMP_WRAPPER_FINISH ; // gmp_vasprintf returns a negative value if an error occurred - return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK) ; + return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK); } #endif @@ -471,17 +739,17 @@ SPEX_info SPEX_gmp_fscanf SPEX_GMP_WRAPPER_START ; // call gmp_vfscanf - va_list args; - va_start (args, format) ; - int n = gmp_vfscanf (fp, format, args) ; - va_end (args) ; + va_list args ; + va_start (args, format); + int n = gmp_vfscanf (fp, format, args); + va_end (args); // Finish the wrapper SPEX_GMP_WRAPPER_FINISH ; // If end of input (or a file error) is reached before a character // for a field or a literal, and if no previous non-suppressed fields have // matched, then the return value is EOF instead of 0 - return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK) ; + return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK); } //------------------------------------------------------------------------------ @@ -500,15 +768,15 @@ SPEX_info SPEX_mpfr_asprintf (char **str, const char *format, ... ) SPEX_GMP_WRAPPER_START ; // call mpfr_vasprintf - va_list args; - va_start (args, format) ; - int n = mpfr_vasprintf (str, format, args) ; - va_end (args) ; + va_list args ; + va_start (args, format); + int n = mpfr_vasprintf (str, format, args); + va_end (args); // Finish the wrapper SPEX_GMP_WRAPPER_FINISH ; // mpfr_vasprintf returns a negative value if an error occurred - return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK) ; + return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK); } //------------------------------------------------------------------------------ @@ -516,19 +784,20 @@ SPEX_info SPEX_mpfr_asprintf (char **str, const char *format, ... ) //------------------------------------------------------------------------------ /* Safely free a string allocated by SPEX_mpfr_asprintf. */ -/* DONT TRY TO FREE NULL PONITER USING THIS FUNCTION*/ SPEX_info SPEX_mpfr_free_str (char *str) { + if (str == NULL) return (SPEX_OK); // nothing to do + // Start the GMP wrapper SPEX_GMP_WRAPPER_START ; // call mpfr_free_str - mpfr_free_str (str) ; + mpfr_free_str (str); // Finish the wrapper and return 0 if successful SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -553,19 +822,19 @@ SPEX_info SPEX_mpfr_fprintf SPEX_GMP_WRAPPER_START ; // call mpfr_vfprintf - va_list args; - va_start (args, format) ; - int n = mpfr_vfprintf (fp, format, args) ; - va_end (args) ; + va_list args ; + va_start (args, format); + int n = mpfr_vfprintf (fp, format, args); + va_end (args); // Free cache from mpfr_vfprintf. Even though mpfr_free_cache is // called in SPEX_finalize ( ), it has to be called here to // prevent memory leak in some rare situations. - mpfr_free_cache ( ) ; + mpfr_free_cache ( ); // Finish the wrapper SPEX_GMP_WRAPPER_FINISH ; // mpfr_vfprintf returns -1 if an error occurred. - return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK) ; + return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK); } #endif @@ -589,19 +858,19 @@ SPEX_info SPEX_mpfr_printf SPEX_GMP_WRAPPER_START ; // call mpfr_vprintf - va_list args; - va_start (args, format) ; - int n = mpfr_vprintf (format, args) ; - va_end (args) ; + va_list args ; + va_start (args, format); + int n = mpfr_vprintf (format, args); + va_end (args); // Free cache from mpfr_vprintf. Even though mpfr_free_cache is // called in SPEX_finalize ( ), it has to be called here to // prevent memory leak in some rare situations. - mpfr_free_cache ( ) ; + mpfr_free_cache ( ); // Finish the wrapper SPEX_GMP_WRAPPER_FINISH ; // mpfr_vprintf returns -1 if an error occurred. - return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK) ; + return ((n < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK); } #endif //------------------------------------------------------------------------------ @@ -615,16 +884,19 @@ SPEX_info SPEX_mpfr_printf //------------------------------------------------------------------------------ /* Purpose: Safely initialize an mpz_t number */ +// NOTE: This function never returns out-of-memory error with GMP-6.2.1 or +// later versions (since there will be no memory allocation). But it could +// return such error for GMP-6.1.2 or ealier versions. SPEX_info SPEX_mpz_init ( mpz_t x ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpz_init (x) ; + SPEX_GMPZ_WRAPPER_START (x); + mpz_init (x); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -636,13 +908,13 @@ SPEX_info SPEX_mpz_init SPEX_info SPEX_mpz_init2 ( mpz_t x, // Number to be initialized - const size_t size // size of the number + const uint64_t size // size of the number ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpz_init2 (x, (mp_bitcnt_t) size) ; + SPEX_GMPZ_WRAPPER_START (x); + mpz_init2 (x, (mp_bitcnt_t) size); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -657,10 +929,10 @@ SPEX_info SPEX_mpz_set const mpz_t y ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpz_set (x, y) ; + SPEX_GMPZ_WRAPPER_START (x); + mpz_set (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -675,10 +947,10 @@ SPEX_info SPEX_mpz_set_ui const uint64_t y ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpz_set_ui (x, (unsigned long int) y) ; + SPEX_GMPZ_WRAPPER_START (x); + mpz_set_ui (x, (unsigned long int) y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -693,18 +965,18 @@ SPEX_info SPEX_mpz_set_si const int64_t y ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpz_set_si (x, (signed long int) y) ; + SPEX_GMPZ_WRAPPER_START (x); + mpz_set_si (x, (signed long int) y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } -#if 0 -/* This function is currently unused, but kept here for future reference. */ //------------------------------------------------------------------------------ // SPEX_mpz_set_d //------------------------------------------------------------------------------ /* Purpose: Safely set an mpz number = a double */ +#if 0 +/* This function is currently unused, but kept here for future reference. */ SPEX_info SPEX_mpz_set_d ( @@ -712,10 +984,10 @@ SPEX_info SPEX_mpz_set_d const double y ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpz_set_d (x, y) ; + SPEX_GMPZ_WRAPPER_START (x); + mpz_set_d (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } #endif @@ -732,9 +1004,9 @@ SPEX_info SPEX_mpz_get_d ) { SPEX_GMP_WRAPPER_START ; - *x = mpz_get_d (y) ; + *x = mpz_get_d (y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -750,109 +1022,122 @@ SPEX_info SPEX_mpz_get_si ) { SPEX_GMP_WRAPPER_START ; - *x = mpz_get_si (y) ; + *x = (int64_t) mpz_get_si (y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } + //------------------------------------------------------------------------------ -// SPEX_mpz_set_q +// SPEX_mpz_mul //------------------------------------------------------------------------------ -/* Purpose: Safely set an mpz number = mpq number */ +/* Purpose: Safely compute a = b*c */ -SPEX_info SPEX_mpz_set_q +SPEX_info SPEX_mpz_mul ( - mpz_t x, - const mpq_t y + mpz_t a, + const mpz_t b, + const mpz_t c ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpz_set_q (x, y) ; + SPEX_GMPZ_WRAPPER_START (a); + mpz_mul (a, b, c); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } + //------------------------------------------------------------------------------ -// SPEX_mpz_mul +// SPEX_mpz_addmul //------------------------------------------------------------------------------ -/* Purpose: Safely compute a = b*c */ - -SPEX_info SPEX_mpz_mul +/* Purpose: Safely set an mpz number += product of two mpz numbers, + * i.e., x = x + y*z */ +#if 0 +SPEX_info SPEX_mpz_addmul ( - mpz_t a, - const mpz_t b, - const mpz_t c + mpz_t x, + const mpz_t y, + const mpz_t z ) { - SPEX_GMPZ_WRAPPER_START (a) ; - mpz_mul (a, b, c) ; + SPEX_GMPZ_WRAPPER_START (x); + mpz_addmul (x, y, z); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } +#endif -#if 0 //------------------------------------------------------------------------------ -// SPEX_mpz_add +// SPEX_mpz_sub //------------------------------------------------------------------------------ -/* Purpose: Safely compute a = b+c */ +/* Purpose: Safely compute a = b-c */ -SPEX_info SPEX_mpz_add +SPEX_info SPEX_mpz_sub ( mpz_t a, const mpz_t b, const mpz_t c ) { - SPEX_GMPZ_WRAPPER_START (a) ; - mpz_add (a,b,c) ; + SPEX_GMPZ_WRAPPER_START (a); + mpz_sub (a,b,c); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } + //------------------------------------------------------------------------------ -// SPEX_mpz_addmul +// SPEX_mpz_submul //------------------------------------------------------------------------------ -/* Purpose: Safely set an mpz number += product of two mpz numbers, - * i.e., x = x + y*z */ +/* Purpose: Safely set an mpz number = itself minus a product of + * mpz numbers, i.e., x = x - y*z + */ -SPEX_info SPEX_mpz_addmul +SPEX_info SPEX_mpz_submul ( mpz_t x, const mpz_t y, const mpz_t z ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpz_addmul (x, y, z) ; + SPEX_GMPZ_WRAPPER_START (x); + mpz_submul (x, y, z); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } -#endif //------------------------------------------------------------------------------ -// SPEX_mpz_submul +// SPEX_mpz_cdiv_qr //------------------------------------------------------------------------------ -/* Purpose: Safely set an mpz number = itself minus a product of - * mpz numbers, i.e., x = x - y*z +/* Purpose: Safe version of dividing n by d, forming a quotient q and/or + * remainder r. + * cdiv rounds q up towards +infinity, and r will have the opposite sign to d. + * The c stands for “ceil”. That is, q = ceil(n/d) */ -SPEX_info SPEX_mpz_submul +SPEX_info SPEX_mpz_cdiv_qr ( - mpz_t x, - const mpz_t y, - const mpz_t z + mpz_t q, + mpz_t r, + const mpz_t n, + const mpz_t d ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpz_submul (x, y, z) ; + SPEX_GMPZ_WRAPPER_START2 (q, r); + if (mpz_sgn (d) == 0) + { + SPEX_GMP_WRAPPER_FINISH ; + return (SPEX_PANIC); + } + mpz_cdiv_qr (q, r, n, d); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -868,15 +1153,32 @@ SPEX_info SPEX_mpz_divexact const mpz_t z ) { - SPEX_GMPZ_WRAPPER_START (x) ; - if (mpz_sgn(z) == 0) + SPEX_GMPZ_WRAPPER_START (x); + if (mpz_sgn (z) == 0) { - SPEX_GMP_WRAPPER_FINISH; - return SPEX_PANIC; + SPEX_GMP_WRAPPER_FINISH ; + return (SPEX_PANIC); } - mpz_divexact (x, y, z) ; + + #ifdef SPEX_DEBUG + mpq_t r ; + mpq_init (r); // r = 0/1 + mpz_fdiv_r (SPEX_MPQ_NUM (r), y, z); + if (mpz_sgn (SPEX_MPQ_NUM (r)) != 0) + { + mpq_set_den (r, z); + mpq_canonicalize (r); + gmp_printf ("not exact division! remainder=%Qd\n", r); + mpq_clear (r); + SPEX_GMP_WRAPPER_FINISH ; + return (SPEX_PANIC); + } + mpq_clear (r); + #endif + + mpz_divexact (x, y, z); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -892,10 +1194,10 @@ SPEX_info SPEX_mpz_gcd const mpz_t z ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpz_gcd (x, y, z) ; + SPEX_GMPZ_WRAPPER_START (x); + mpz_gcd (x, y, z); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -911,10 +1213,28 @@ SPEX_info SPEX_mpz_lcm const mpz_t y ) { - SPEX_GMPZ_WRAPPER_START (lcm) ; - mpz_lcm (lcm, x, y) ; + SPEX_GMPZ_WRAPPER_START (lcm); + mpz_lcm (lcm, x, y); + SPEX_GMP_WRAPPER_FINISH ; + return (SPEX_OK); +} + +//------------------------------------------------------------------------------ +// SPEX_mpz_neg +//------------------------------------------------------------------------------ + +/* Purpose: Safely set x = -y */ + +SPEX_info SPEX_mpz_neg +( + mpz_t x, + const mpz_t y +) +{ + SPEX_GMPZ_WRAPPER_START (x); + mpz_neg (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -929,10 +1249,10 @@ SPEX_info SPEX_mpz_abs const mpz_t y ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpz_abs (x, y) ; + SPEX_GMPZ_WRAPPER_START (x); + mpz_abs (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -950,9 +1270,9 @@ SPEX_info SPEX_mpz_cmp ) { SPEX_GMP_WRAPPER_START ; - *r = mpz_cmp (x, y) ; + *r = mpz_cmp (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -970,9 +1290,9 @@ SPEX_info SPEX_mpz_cmpabs ) { SPEX_GMP_WRAPPER_START ; - *r = mpz_cmpabs (x, y) ; + *r = mpz_cmpabs (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -989,11 +1309,12 @@ SPEX_info SPEX_mpz_cmp_ui ) { SPEX_GMP_WRAPPER_START ; - *r = mpz_cmp_ui (x, (unsigned long int) y) ; + *r = mpz_cmp_ui (x, (unsigned long int) y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } + //------------------------------------------------------------------------------ // SPEX_mpz_sgn //------------------------------------------------------------------------------ @@ -1007,9 +1328,9 @@ SPEX_info SPEX_mpz_sgn ) { SPEX_GMP_WRAPPER_START ; - *sgn = mpz_sgn (x) ; + *sgn = mpz_sgn (x); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1026,9 +1347,9 @@ SPEX_info SPEX_mpz_sizeinbase ) { SPEX_GMP_WRAPPER_START ; - *size = mpz_sizeinbase (x, (int) base) ; + *size = mpz_sizeinbase (x, (int) base); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1048,10 +1369,10 @@ SPEX_info SPEX_mpq_init mpq_t x ) { - SPEX_GMPQ_WRAPPER_START (x) ; - mpq_init (x) ; + SPEX_GMPQ_WRAPPER_START (x); + mpq_init (x); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1066,10 +1387,10 @@ SPEX_info SPEX_mpq_set const mpq_t y ) { - SPEX_GMPQ_WRAPPER_START (x) ; - mpq_set (x, y) ; + SPEX_GMPQ_WRAPPER_START (x); + mpq_set (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1084,10 +1405,10 @@ SPEX_info SPEX_mpq_set_z const mpz_t y ) { - SPEX_GMPQ_WRAPPER_START (x) ; - mpq_set_z (x, y) ; + SPEX_GMPQ_WRAPPER_START (x); + mpq_set_z (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1102,10 +1423,10 @@ SPEX_info SPEX_mpq_set_d const double y ) { - SPEX_GMPQ_WRAPPER_START (x) ; - mpq_set_d (x, y) ; + SPEX_GMPQ_WRAPPER_START (x); + mpq_set_d (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1123,10 +1444,10 @@ SPEX_info SPEX_mpq_set_ui const uint64_t z ) { - SPEX_GMPQ_WRAPPER_START (x) ; - mpq_set_ui (x, (unsigned long int) y, (unsigned long int) z) ; + SPEX_GMPQ_WRAPPER_START (x); + mpq_set_ui (x, (unsigned long int) y, (unsigned long int) z); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1145,7 +1466,7 @@ SPEX_info SPEX_mpq_set_si SPEX_GMPQ_WRAPPER_START (x) ; mpq_set_si (x, (signed long int) y, (unsigned long int) z) ; SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1160,10 +1481,10 @@ SPEX_info SPEX_mpq_set_num const mpz_t y ) { - SPEX_GMPQ_WRAPPER_START (x) ; - mpq_set_num (x, y) ; + SPEX_GMPQ_WRAPPER_START (x); + mpq_set_num (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1178,16 +1499,19 @@ SPEX_info SPEX_mpq_set_den const mpz_t y ) { - SPEX_GMPQ_WRAPPER_START (x) ; - mpq_set_den (x, y) ; + SPEX_GMPQ_WRAPPER_START (x); + mpq_set_den (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ // SPEX_mpq_get_den //------------------------------------------------------------------------------ +#if 0 +/* This function is currently unused, but kept here for future reference. */ + /* Purpose: Safely set an mpz number = denominator of an mpq number */ SPEX_info SPEX_mpq_get_den @@ -1196,11 +1520,12 @@ SPEX_info SPEX_mpq_get_den const mpq_t y ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpq_get_den (x, y) ; + SPEX_GMPZ_WRAPPER_START (x); + mpq_get_den (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } +#endif //------------------------------------------------------------------------------ // SPEX_mpq_get_d @@ -1215,9 +1540,50 @@ SPEX_info SPEX_mpq_get_d ) { SPEX_GMP_WRAPPER_START ; - *x = mpq_get_d (y) ; + *x = mpq_get_d (y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); +} + +//------------------------------------------------------------------------------ +// SPEX_mpq_swap +//------------------------------------------------------------------------------ + +#if 0 +/* This function is currently unused, but kept here for future reference. */ + +/* Purpose: Safely swap the values x and y efficiently */ + +SPEX_info SPEX_mpq_swap +( + mpq_t x, + mpq_t y +) +{ + SPEX_GMP_WRAPPER_START ; + mpq_swap (x, y); + SPEX_GMP_WRAPPER_FINISH ; + return (SPEX_OK); +} + +#endif + +//------------------------------------------------------------------------------ +// SPEX_mpq_neg +//------------------------------------------------------------------------------ + +/* Purpose: Safely set an mpq number x = -y */ + +SPEX_info SPEX_mpq_neg +( + mpq_t x, + const mpq_t y +) +{ + SPEX_GMPQ_WRAPPER_START (x); + mpq_neg (x, y); + SPEX_GMP_WRAPPER_FINISH ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1232,10 +1598,10 @@ SPEX_info SPEX_mpq_abs const mpq_t y ) { - SPEX_GMPQ_WRAPPER_START (x) ; - mpq_abs (x, y) ; + SPEX_GMPQ_WRAPPER_START (x); + mpq_abs (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1251,10 +1617,10 @@ SPEX_info SPEX_mpq_add const mpq_t z ) { - SPEX_GMPQ_WRAPPER_START (x) ; - mpq_add (x, y, z) ; + SPEX_GMPQ_WRAPPER_START (x); + mpq_add (x, y, z); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1269,10 +1635,10 @@ SPEX_info SPEX_mpq_mul const mpq_t z ) { - SPEX_GMPQ_WRAPPER_START (x) ; - mpq_mul (x, y, z) ; + SPEX_GMPQ_WRAPPER_START (x); + mpq_mul (x, y, z); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1288,10 +1654,10 @@ SPEX_info SPEX_mpq_div const mpq_t z ) { - SPEX_GMPQ_WRAPPER_START (x) ; - mpq_div (x, y, z) ; + SPEX_GMPQ_WRAPPER_START (x); + mpq_div (x, y, z); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1309,9 +1675,9 @@ SPEX_info SPEX_mpq_cmp ) { SPEX_GMP_WRAPPER_START ; - *r = mpq_cmp (x, y) ; + *r = mpq_cmp (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1330,11 +1696,36 @@ SPEX_info SPEX_mpq_cmp_ui ) { SPEX_GMP_WRAPPER_START ; - *r = mpq_cmp_ui (x, (unsigned long int) num, (unsigned long int) den) ; + *r = mpq_cmp_ui (x, (unsigned long int) num, (unsigned long int) den); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } +//------------------------------------------------------------------------------ +// SPEX_mpq_cmp_z +//------------------------------------------------------------------------------ + +#if 0 +/* This function is currently unused, but kept here for future reference. */ + +/* Purpose: Safely check if a mpq number equals to a mpz number, + * r = 0 (r = false) if x != y, r < 0 if x < y, or r > 0 if x > y */ + +SPEX_info SPEX_mpq_cmp_z +( + int *r, + const mpq_t x, + const mpz_t y +) +{ + SPEX_GMP_WRAPPER_START ; + *r = mpq_cmp_z (x, y); + SPEX_GMP_WRAPPER_FINISH ; + return (SPEX_OK); +} + +#endif + //------------------------------------------------------------------------------ // SPEX_mpq_equal //------------------------------------------------------------------------------ @@ -1350,9 +1741,9 @@ SPEX_info SPEX_mpq_equal ) { SPEX_GMP_WRAPPER_START ; - *r = mpq_equal (x, y) ; + *r = mpq_equal (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1368,9 +1759,9 @@ SPEX_info SPEX_mpq_sgn ) { SPEX_GMP_WRAPPER_START ; - *sgn = mpq_sgn (x) ; + *sgn = mpq_sgn (x); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1388,13 +1779,17 @@ SPEX_info SPEX_mpq_sgn SPEX_info SPEX_mpfr_init2 ( mpfr_t x, // Floating point number to initialize - uint64_t size // # of bits in x + const uint64_t size // # of bits in x ) { - SPEX_GMPFR_WRAPPER_START (x) ; - mpfr_init2 (x, (unsigned long int) size) ; + // ensure the mpfr number is not too big + if (size > MPFR_PREC_MAX/2) return (SPEX_PANIC); + + // initialize the mpfr number + SPEX_GMPFR_WRAPPER_START (x); + mpfr_init2 (x, (mpfr_prec_t) size); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1410,10 +1805,10 @@ SPEX_info SPEX_mpfr_set const mpfr_rnd_t rnd ) { - SPEX_GMPFR_WRAPPER_START (x) ; - mpfr_set (x, y, rnd) ; + SPEX_GMPFR_WRAPPER_START (x); + mpfr_set (x, y, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1429,10 +1824,10 @@ SPEX_info SPEX_mpfr_set_d const mpfr_rnd_t rnd // MPFR rounding scheme used ) { - SPEX_GMPFR_WRAPPER_START (x) ; - mpfr_set_d (x, y, rnd) ; + SPEX_GMPFR_WRAPPER_START (x); + mpfr_set_d (x, y, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } @@ -1449,10 +1844,10 @@ SPEX_info SPEX_mpfr_set_si const mpfr_rnd_t rnd // MPFR rounding scheme used ) { - SPEX_GMPFR_WRAPPER_START (x) ; - mpfr_set_si (x, y, rnd) ; + SPEX_GMPFR_WRAPPER_START (x); + mpfr_set_si (x, (long int) y, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1468,10 +1863,10 @@ SPEX_info SPEX_mpfr_set_q const mpfr_rnd_t rnd ) { - SPEX_GMPFR_WRAPPER_START (x) ; - mpfr_set_q (x, y, rnd) ; + SPEX_GMPFR_WRAPPER_START (x); + mpfr_set_q (x, y, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1487,10 +1882,10 @@ SPEX_info SPEX_mpfr_set_z const mpfr_rnd_t rnd ) { - SPEX_GMPFR_WRAPPER_START (x) ; - mpfr_set_z (x, y, rnd) ; + SPEX_GMPFR_WRAPPER_START (x); + mpfr_set_z (x, y, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1506,10 +1901,10 @@ SPEX_info SPEX_mpfr_get_z const mpfr_rnd_t rnd // MPFR rounding scheme used ) { - SPEX_GMPZ_WRAPPER_START (x) ; - mpfr_get_z (x, y, rnd) ; + SPEX_GMPZ_WRAPPER_START (x); + mpfr_get_z (x, y, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1525,10 +1920,10 @@ SPEX_info SPEX_mpfr_get_q const mpfr_rnd_t rnd // MPFR rounding scheme used ) { - SPEX_GMPQ_WRAPPER_START (x) ; - mpfr_get_q (x, y) ; + SPEX_GMPQ_WRAPPER_START (x); + mpfr_get_q (x, y); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1545,9 +1940,9 @@ SPEX_info SPEX_mpfr_get_d ) { SPEX_GMP_WRAPPER_START ; - *x = mpfr_get_d (y, rnd) ; + *x = mpfr_get_d (y, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1564,9 +1959,9 @@ SPEX_info SPEX_mpfr_get_si ) { SPEX_GMP_WRAPPER_START ; - *x = mpfr_get_si (y, rnd) ; + *x = (int64_t) mpfr_get_si (y, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1583,10 +1978,10 @@ SPEX_info SPEX_mpfr_mul const mpfr_rnd_t rnd // MPFR rounding mode ) { - SPEX_GMPFR_WRAPPER_START (x) ; - mpfr_mul (x, y, z, rnd) ; + SPEX_GMPFR_WRAPPER_START (x); + mpfr_mul (x, y, z, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1605,10 +2000,10 @@ SPEX_info SPEX_mpfr_mul_d const mpfr_rnd_t rnd // MPFR rounding scheme used ) { - SPEX_GMPFR_WRAPPER_START (x) ; - mpfr_mul_d (x, y, z, rnd) ; + SPEX_GMPFR_WRAPPER_START (x); + mpfr_mul_d (x, y, z, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1627,10 +2022,10 @@ SPEX_info SPEX_mpfr_div_d const mpfr_rnd_t rnd // MPFR rounding scheme used ) { - SPEX_GMPFR_WRAPPER_START (x) ; - mpfr_div_d (x, y, z, rnd) ; + SPEX_GMPFR_WRAPPER_START (x); + mpfr_div_d (x, y, z, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1649,10 +2044,10 @@ SPEX_info SPEX_mpfr_ui_pow_ui const mpfr_rnd_t rnd // MPFR rounding mode ) { - SPEX_GMPFR_WRAPPER_START (x) ; - mpfr_ui_pow_ui (x, (unsigned long int) y, (unsigned long int) z, rnd) ; + SPEX_GMPFR_WRAPPER_START (x); + mpfr_ui_pow_ui (x, (unsigned long int) y, (unsigned long int) z, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1671,10 +2066,10 @@ SPEX_info SPEX_mpfr_log2 const mpfr_rnd_t rnd ) { - SPEX_GMPFR_WRAPPER_START (x) ; - mpfr_log2 (x, y, rnd) ; + SPEX_GMPFR_WRAPPER_START (x); + mpfr_log2 (x, y, rnd); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } #endif @@ -1692,9 +2087,9 @@ SPEX_info SPEX_mpfr_sgn ) { SPEX_GMP_WRAPPER_START ; - *sgn = mpfr_sgn (x) ; + *sgn = mpfr_sgn (x); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } //------------------------------------------------------------------------------ @@ -1706,8 +2101,8 @@ SPEX_info SPEX_mpfr_sgn SPEX_info SPEX_mpfr_free_cache ( void ) { SPEX_GMP_WRAPPER_START ; - mpfr_free_cache ( ) ; + mpfr_free_cache ( ); SPEX_GMP_WRAPPER_FINISH ; - return (SPEX_OK) ; + return (SPEX_OK); } diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c new file mode 100644 index 0000000000..424802b4d2 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c @@ -0,0 +1,62 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +// SPEX_initialize initializes the working evironment for SPEX + +#include "spex_util_internal.h" + +//------------------------------------------------------------------------------ +// global variable access +//------------------------------------------------------------------------------ + +// a global variable, but only accessible within this file. + +bool spex_initialize_has_been_called ; +bool spex_initialize_has_been_called = false; + +bool spex_initialized ( void ) +{ + return (spex_initialize_has_been_called); +} + +void spex_set_initialized (bool s) +{ + spex_initialize_has_been_called = s; +} + +//------------------------------------------------------------------------------ +// SPEX_initialize +//------------------------------------------------------------------------------ + +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); + + // tell GMP and MPFR which memory allocation functions to use + mp_set_memory_functions + ( + spex_gmp_allocate, // malloc function + spex_gmp_reallocate, // realloc function + spex_gmp_free // free function + ); + + // initialize the SPEX GMP interface for the primary thread + SPEX_info info = spex_gmp_initialize (1) ; + if (info == SPEX_OK) + { + spex_set_initialized (true); + } + return (info) ; +} + diff --git a/SPEX/SPEX_Util/Source/SPEX_initialize_expert.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c similarity index 51% rename from SPEX/SPEX_Util/Source/SPEX_initialize_expert.c rename to SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c index 2d783f2f44..5d1d7e58b3 100644 --- a/SPEX/SPEX_Util/Source/SPEX_initialize_expert.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_initialize_expert: intialize SPEX memory functions for GMP +// SPEX_Utilities/SPEX_initialize_expert: intialize SPEX memory functions for GMP //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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,37 +17,37 @@ // That is: // #include -// void *malloc (size_t size) ; -// void *calloc (size_t nmemb, size_t size) ; -// void *realloc (void *ptr, size_t size) ; -// void free (void *ptr) ; +// void *malloc (size_t size); +// void *calloc (size_t nmemb, size_t size); +// void *realloc (void *ptr, size_t size); +// void free (void *ptr); #include "spex_util_internal.h" SPEX_info SPEX_initialize_expert ( - void* (*user_malloc) (size_t), // user-defined malloc - void* (*user_calloc) (size_t, size_t), // user-defined calloc - void* (*user_realloc) (void *, size_t), // user-defined realloc - void (*user_free) (void *) // user-defined free + void *(*MyMalloc) (size_t), // user-defined malloc + void *(*MyCalloc) (size_t, size_t), // user-defined calloc + void *(*MyRealloc) (void *, size_t), // user-defined realloc + void (*MyFree) (void *) // user-defined free ) { - if (spex_initialized ( )) return (SPEX_PANIC) ; + if (spex_initialized ( )) return (SPEX_PANIC); //-------------------------------------------------------------------------- - // define the malloc/calloc/realloc/free functions + // define the malloc/calloc/realloc/free functions //-------------------------------------------------------------------------- - SuiteSparse_config_malloc_func_set (user_malloc) ; - SuiteSparse_config_calloc_func_set (user_calloc) ; - SuiteSparse_config_realloc_func_set (user_realloc) ; - SuiteSparse_config_free_func_set (user_free) ; + SuiteSparse_config_malloc_func_set (MyMalloc); + SuiteSparse_config_calloc_func_set (MyCalloc); + SuiteSparse_config_realloc_func_set (MyRealloc); + SuiteSparse_config_free_func_set (MyFree); //-------------------------------------------------------------------------- // Set GMP memory functions //-------------------------------------------------------------------------- - return (SPEX_initialize ( )) ; + return (SPEX_initialize ( )); } diff --git a/SPEX/SPEX_Util/Source/SPEX_malloc.c b/SPEX/SPEX_Utilities/Source/SPEX_malloc.c similarity index 62% rename from SPEX/SPEX_Util/Source/SPEX_malloc.c rename to SPEX/SPEX_Utilities/Source/SPEX_malloc.c index 69dafd7ef4..422a138f61 100644 --- a/SPEX/SPEX_Util/Source/SPEX_malloc.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_malloc.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_malloc: wrapper for malloc +// SPEX_Utilities/SPEX_malloc: wrapper for malloc //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -17,7 +18,7 @@ void *SPEX_malloc size_t size // size of memory space to allocate ) { - if (!spex_initialized ( )) return (NULL) ; - return (SuiteSparse_malloc (1, size)) ; + + return (SuiteSparse_malloc (1, size)); } diff --git a/SPEX/SPEX_Util/Source/SPEX_matrix_allocate.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c similarity index 67% rename from SPEX/SPEX_Util/Source/SPEX_matrix_allocate.c rename to SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c index eaf97f30e8..52da8ab0d2 100644 --- a/SPEX/SPEX_Util/Source/SPEX_matrix_allocate.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c @@ -1,23 +1,31 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_matrix_allocate: allocate a SPEX_matrix +// SPEX_Utilities/SPEX_matrix_allocate: allocate a SPEX_matrix //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ -// Allocate an m-by-n SPEX_matrix, in one of 15 data structures: +// Allocate an m-by-n SPEX_matrix, in either dynamic_CSC x mpz or one of +// 15 data structures: // (sparse CSC, sparse triplet, or dense) x -// (mpz, mpz, mfpr, int64, or double). +// (mpz, mpq, mfpr, int64, or double). -// 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. +// If the matrix is not dynamic_CSC, then it 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. -#define SPEX_FREE_ALL \ - SPEX_matrix_free (&A, option) ; +// 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. + +#define SPEX_FREE_ALL \ +{ \ + SPEX_matrix_free (&A, option); \ +} #include "spex_util_internal.h" @@ -32,8 +40,8 @@ SPEX_info SPEX_matrix_allocate ( - SPEX_matrix **A_handle, // matrix to allocate - SPEX_kind kind, // CSC, triplet, or dense + SPEX_matrix *A_handle, // matrix to allocate + SPEX_kind kind, // CSC, triplet, dense, dynamic_CSC SPEX_type type, // mpz, mpq, mpfr, int64, or double int64_t m, // # of rows int64_t n, // # of columns @@ -42,14 +50,14 @@ SPEX_info SPEX_matrix_allocate bool shallow, // if true, matrix is shallow. A->p, A->i, A->j, // A->x are all returned as NULL and must be set // by the caller. All A->*_shallow are returned - // as true. + // as true. Ignored if kind is dynamic_CSC. bool init, // If true, and the data types are mpz, mpq, or // mpfr, the entries are initialized (using the // appropriate SPEX_mp*_init function). If false, // the mpz, mpq, and mpfr arrays are malloced but // not initialized. Utilized internally to reduce // memory. Ignored if shallow is true. - const SPEX_options *option + const SPEX_options option ) { @@ -58,36 +66,35 @@ SPEX_info SPEX_matrix_allocate //-------------------------------------------------------------------------- SPEX_info info ; - if (!spex_initialized ( )) return (SPEX_PANIC) ; + if (!spex_initialized ( )) return (SPEX_PANIC); if (A_handle == NULL) { - return (SPEX_INCORRECT_INPUT) ; + return (SPEX_INCORRECT_INPUT); } (*A_handle) = NULL ; if (m < 0 || n < 0 || kind < SPEX_CSC || kind > SPEX_DENSE || - type < SPEX_MPZ || type > SPEX_FP64) - + type < SPEX_MPZ || type > SPEX_FP64) { - return (SPEX_INCORRECT_INPUT) ; + return (SPEX_INCORRECT_INPUT); } //-------------------------------------------------------------------------- // allocate the header //-------------------------------------------------------------------------- - SPEX_matrix *A = (SPEX_matrix *) SPEX_calloc (1, sizeof (SPEX_matrix)) ; + SPEX_matrix A = (SPEX_matrix) SPEX_calloc (1, sizeof (SPEX_matrix_struct)); if (A == NULL) { - return (SPEX_OUT_OF_MEMORY) ; + return (SPEX_OUT_OF_MEMORY); } if (kind == SPEX_DENSE) { nzmax = m*n ; } - nzmax = SPEX_MAX (nzmax, 1) ; + nzmax = SPEX_MAX (nzmax, 1); A->m = m ; A->n = n ; @@ -103,15 +110,14 @@ SPEX_info SPEX_matrix_allocate A->x_shallow = false ; // A->scale = 1 - SPEX_MPQ_SET_NULL (A->scale) ; - SPEX_CHECK (SPEX_mpq_init (A->scale)) ; - SPEX_CHECK (SPEX_mpq_set_ui (A->scale, 1, 1)) ; + SPEX_CHECK (spex_create_mpq (A->scale)); + SPEX_MPQ_SET_UI (A->scale, 1, 1); //-------------------------------------------------------------------------- // allocate the p, i, j, and x components //-------------------------------------------------------------------------- - if (shallow) + if(shallow) { // all components are shallow. The caller can modify individual @@ -131,20 +137,19 @@ SPEX_info SPEX_matrix_allocate switch (kind) { case SPEX_CSC: - A->p = (int64_t *) SPEX_calloc (n+1, sizeof (int64_t)) ; - A->i = (int64_t *) SPEX_calloc (nzmax, sizeof (int64_t)) ; - ok = (A->p != NULL && A->i != NULL) ; + A->p = (int64_t *) SPEX_calloc (n+1, sizeof (int64_t)); + A->i = (int64_t *) SPEX_calloc (nzmax, sizeof (int64_t)); + ok = (A->p != NULL && A->i != NULL); break ; case SPEX_TRIPLET: - A->i = (int64_t *) SPEX_calloc (nzmax, sizeof (int64_t)) ; - A->j = (int64_t *) SPEX_calloc (nzmax, sizeof (int64_t)) ; - ok = (A->i != NULL && A->j != NULL) ; + A->i = (int64_t *) SPEX_calloc (nzmax, sizeof (int64_t)); + A->j = (int64_t *) SPEX_calloc (nzmax, sizeof (int64_t)); + ok = (A->i != NULL && A->j != NULL); break ; - case SPEX_DENSE: - // nothing to do - break ; + default: //SPEX_DENSE or SPEX_DYNAMIC_CSC + ;// nothing to do } @@ -157,44 +162,56 @@ SPEX_info SPEX_matrix_allocate // allocate the array but do not allocate the individual // mpz, mpq, or mpfr if (init) - A->x.mpz = spex_create_mpz_array (nzmax) ; + { + A->x.mpz = spex_create_mpz_array (nzmax); + } else + { A->x.mpz = SPEX_calloc(nzmax, sizeof(mpz_t)); - ok = ok && (A->x.mpz != NULL) ; + } + ok = ok && (A->x.mpz != NULL); break ; case SPEX_MPQ: if (init) - A->x.mpq = spex_create_mpq_array (nzmax) ; + { + A->x.mpq = spex_create_mpq_array (nzmax); + } else + { A->x.mpq = SPEX_calloc(nzmax, sizeof(mpq_t)); - ok = ok && (A->x.mpq != NULL) ; + } + ok = ok && (A->x.mpq != NULL); break ; case SPEX_MPFR: if (init) - A->x.mpfr = spex_create_mpfr_array (nzmax, option) ; + { + A->x.mpfr = spex_create_mpfr_array (nzmax, option); + } else + { A->x.mpfr = SPEX_calloc(nzmax, sizeof(mpfr_t)); - ok = ok && (A->x.mpfr != NULL) ; + } + ok = ok && (A->x.mpfr != NULL); break ; case SPEX_INT64: - A->x.int64 = (int64_t *) SPEX_calloc (nzmax, sizeof (int64_t)) ; - ok = ok && (A->x.int64 != NULL) ; + A->x.int64 = (int64_t *) SPEX_calloc (nzmax, sizeof (int64_t)); + ok = ok && (A->x.int64 != NULL); break ; case SPEX_FP64: - A->x.fp64 = (double *) SPEX_calloc (nzmax, sizeof (double)) ; - ok = ok && (A->x.fp64 != NULL) ; + A->x.fp64 = (double *) SPEX_calloc (nzmax, sizeof (double)); + ok = ok && (A->x.fp64 != NULL); break ; } if (!ok) { - SPEX_FREE_ALL ; - return (SPEX_OUT_OF_MEMORY) ; + SPEX_FREE_ALL; + return (SPEX_OUT_OF_MEMORY); } } @@ -203,6 +220,6 @@ SPEX_info SPEX_matrix_allocate //-------------------------------------------------------------------------- (*A_handle) = A ; - return (SPEX_OK) ; + return (SPEX_OK); } diff --git a/SPEX/SPEX_Util/Source/SPEX_matrix_check.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c similarity index 72% rename from SPEX/SPEX_Util/Source/SPEX_matrix_check.c rename to SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c index 0c1108be96..a1c5da5342 100644 --- a/SPEX/SPEX_Util/Source/SPEX_matrix_check.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c @@ -1,15 +1,18 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_matrix_check: check if a matrix is OK +// SPEX_Utilities/SPEX_matrix_check: check if a matrix is OK //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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_FREE (work); \ + SPEX_MPZ_CLEAR(q); \ + SPEX_MPZ_CLEAR(r); #include "spex_util_internal.h" @@ -18,11 +21,11 @@ lines++ ; \ if (pr == 2 && lines > 30) \ { \ - SPEX_PRINTF (" ...\n") ; \ + SPEX_PRINTF (" ...\n"); \ pr = 1 ; \ } -int compar (const void *x, const void *y) ; +int compar (const void *x, const void *y); int compar (const void *x, const void *y) { @@ -31,23 +34,23 @@ int compar (const void *x, const void *y) int64_t *b = (int64_t *) y ; if (a [0] < b [0]) { - return (-1) ; + return (-1); } else if (a [0] > b [0]) { - return (1) ; + return (1); } else if (a [1] < b [1]) { - return (-1) ; + return (-1); } else if (a [1] > b [1]) { - return (1) ; + return (1); } else { - return (0) ; + return (0); } } @@ -61,12 +64,12 @@ int compar (const void *x, const void *y) SPEX_info SPEX_matrix_check // returns a SPEX status code ( - const SPEX_matrix *A, // matrix to check - const SPEX_options* option + const SPEX_matrix A, // matrix to check + const SPEX_options option ) { - if (!spex_initialized ( )) return (SPEX_PANIC) ; + if (!spex_initialized ( )) return (SPEX_PANIC); //-------------------------------------------------------------------------- // check the dimensions @@ -74,7 +77,7 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code SPEX_info status = 0 ; char * buff = NULL ; - int pr = SPEX_OPTION_PRINT_LEVEL (option) ; + int pr = SPEX_OPTION_PRINT_LEVEL (option); int64_t nz; // Number of nonzeros in A status = SPEX_matrix_nnz(&nz, A, option); if (status != SPEX_OK) {return status;} @@ -85,18 +88,18 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code if (m < 0) { - SPEX_PR1 ("m invalid\n") ; - return (SPEX_INCORRECT_INPUT) ; + SPEX_PR1 ("m invalid\n"); + return (SPEX_INCORRECT_INPUT); } if (n < 0) { - SPEX_PR1 ("n invalid\n") ; - return (SPEX_INCORRECT_INPUT) ; + SPEX_PR1 ("n invalid\n"); + return (SPEX_INCORRECT_INPUT); } if (nzmax < 0) { - SPEX_PR1 ("nzmax invalid\n") ; - return (SPEX_INCORRECT_INPUT) ; + SPEX_PR1 ("nzmax invalid\n"); + return (SPEX_INCORRECT_INPUT); } //-------------------------------------------------------------------------- @@ -106,24 +109,27 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code if (A->type < SPEX_MPZ || A->type > SPEX_FP64) // A->kind < SPEX_CSC || A->kind > SPEX_DENSE // checked in SPEX_matrix_nnz { - SPEX_PR1 ("A has invalid type.\n") ; - return (SPEX_INCORRECT_INPUT) ; + SPEX_PR1 ("A has invalid type.\n"); + return (SPEX_INCORRECT_INPUT); } SPEX_PR2 ("SPEX_matrix: nrows: %"PRId64", ncols: %"PRId64", nz:" - "%"PRId64", nzmax: %"PRId64", kind: %s, type: %s\n", m, n, nz, - nzmax, A->kind < 1 ? "CSC" : A->kind < 2 ? "Triplet" : "Dense", + "%"PRId64", nzmax: %"PRId64", kind: %s, type: %s\n", m, n, nz, nzmax, + A->kind < 1 ? "CSC" : A->kind < 2 ? "Triplet" : + "Dense", A->type < 1 ? "MPZ" : A->type < 2 ? "MPQ" : A->type < 3 ? - "MPFR" : A->type < 4 ? "int64" : "double") ; + "MPFR" : A->type < 4 ? "int64" : "double"); if (pr >= 2) { - SPEX_PR2 ("scale factor: ") ; - status = SPEX_mpfr_asprintf (&buff,"%Qd\n", A->scale) ; + SPEX_PR2 ("scale factor: "); + // use mpfr_asprintf so that we can use SPEX_PR*, which + // employs either printf or mexprintf + status = SPEX_mpfr_asprintf (&buff,"%Qd\n", A->scale); if (status >= 0) { - SPEX_PR2 ("%s", buff) ; - SPEX_mpfr_free_str (buff) ; + SPEX_PR2 ("%s", buff); + SPEX_mpfr_free_str (buff); } } @@ -132,8 +138,13 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code //-------------------------------------------------------------------------- int64_t i, j, p, pend ; - int64_t* work = NULL; // used for checking duplicates for CSC and triplet + int64_t *work = NULL; // used for checking duplicates for CSC and triplet uint64_t prec = SPEX_OPTION_PREC (option); + // 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); int64_t lines = 0 ; // # of lines printed so far @@ -150,8 +161,8 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code case SPEX_CSC: { - int64_t* Ap = A->p; - int64_t* Ai = A->i; + int64_t *Ap = A->p; + int64_t *Ai = A->i; //------------------------------------------------------------------ // check the column pointers @@ -160,8 +171,8 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code if (nzmax > 0 && (Ap == NULL || Ap [0] != 0)) { // column pointers invalid - SPEX_PR1 ("p invalid\n") ; - return (SPEX_INCORRECT_INPUT) ; + SPEX_PR1 ("p invalid\n"); + return (SPEX_INCORRECT_INPUT); } for (j = 0 ; j < n ; j++) { @@ -170,8 +181,8 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code if (pend < p || pend > nz) { // column pointers not monotonically non-decreasing - SPEX_PR1 ("p invalid\n") ; - return (SPEX_INCORRECT_INPUT) ; + SPEX_PR1 ("p invalid\n"); + return (SPEX_INCORRECT_INPUT); } } @@ -182,24 +193,24 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code if (nzmax > 0 && (Ai == NULL || SPEX_X(A) == NULL)) { // row indices or values not present - SPEX_PR1 ("i or x invalid\n") ; - return (SPEX_INCORRECT_INPUT) ; + SPEX_PR1 ("i or x invalid\n"); + return (SPEX_INCORRECT_INPUT); } // allocate workspace to check for duplicates - work = (int64_t *) SPEX_calloc (m, sizeof (int64_t)) ; + work = (int64_t *) SPEX_calloc (m, sizeof (int64_t)); if (work == NULL) { // out of memory - SPEX_PR1 ("out of memory\n") ; + SPEX_PR1 ("out of memory\n"); SPEX_FREE_ALL; - return (SPEX_OUT_OF_MEMORY) ; + return (SPEX_OUT_OF_MEMORY); } for (j = 0 ; j < n ; j++) // iterate across columns { SPEX_PR_LIMIT ; - SPEX_PR2 ("column %"PRId64" :\n", j) ; + SPEX_PR2 ("column %"PRId64" :\n", j); int64_t marked = j+1 ; for (p = Ap [j] ; p < Ap [j+1] ; p++) { @@ -207,26 +218,29 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code if (i < 0 || i >= m) { // row indices out of range - SPEX_PR1 ("index out of range: (%ld,%ld)\n", i, j) ; - SPEX_FREE_ALL ; - return (SPEX_INCORRECT_INPUT) ; + SPEX_PR1 ("index out of range: (%ld,%ld)\n", i, j); + SPEX_FREE_ALL; + return (SPEX_INCORRECT_INPUT); } else if (work [i] == marked) { // duplicate - SPEX_PR1 ("duplicate index: (%ld,%ld)\n", i, j) ; - SPEX_FREE_ALL ; - return (SPEX_INCORRECT_INPUT) ; + SPEX_PR1 ("duplicate index: (%ld,%ld)\n", i, j); + SPEX_FREE_ALL; + return (SPEX_INCORRECT_INPUT); } if (pr >= 2) { SPEX_PR_LIMIT ; - SPEX_PR2 (" row %"PRId64" : ", i) ; + SPEX_PR2 (" row %"PRId64" : ", i); switch ( A->type) { case SPEX_MPZ: { + // use mpfr_asprintf so that we can use + // SPEX_PR*, which employs either printf or + // mexprintf status = SPEX_mpfr_asprintf(&buff, "%Zd \n", A->x.mpz[p]); if (status >= 0) @@ -251,7 +265,7 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code { status = SPEX_mpfr_asprintf(&buff, "%.*Rf \n", prec, A->x.mpfr [p]); - if (status >= 0) + if (status >= 0) { SPEX_PR2("%s", buff); SPEX_mpfr_free_str (buff); @@ -271,9 +285,9 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code } if (status < 0) { - SPEX_FREE_ALL ; - SPEX_PRINTF (" error: %d\n", status) ; - return (status) ; + SPEX_FREE_ALL; + SPEX_PRINTF (" error: %d\n", status); + return (status); } } work [i] = marked ; @@ -289,8 +303,8 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code case SPEX_TRIPLET: { - int64_t* Aj = A->j; - int64_t* Ai = A->i; + int64_t *Aj = A->j; + int64_t *Ai = A->i; //------------------------------------------------------------------ // basic pointer checking @@ -299,8 +313,8 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code if (nzmax > 0 && (Ai == NULL || Aj == NULL || SPEX_X(A) == NULL)) { // row indices or values not present - SPEX_PR1 ("i or j or x invalid\n") ; - return (SPEX_INCORRECT_INPUT) ; + SPEX_PR1 ("i or j or x invalid\n"); + return (SPEX_INCORRECT_INPUT); } //------------------------------------------------------------------ @@ -311,25 +325,21 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code { i = Ai[p]; j = Aj[p]; - if (i < 0 || i >= m || j < 0 || j >= n) - { - // row indices out of range - SPEX_PR1 ("invalid index\n") ; - SPEX_FREE_ALL ; - return (SPEX_INCORRECT_INPUT) ; - } + if (pr >= 2) { SPEX_PR_LIMIT ; - SPEX_PR2 (" %"PRId64" %"PRId64" : ", i, j) ; + SPEX_PR2 (" %"PRId64" %"PRId64" : ", i, j); switch ( A->type) { case SPEX_MPZ: { + // use mpfr_asprintf so that we can use SPEX_PR*, + // which employs either printf or mexprintf status = SPEX_mpfr_asprintf(&buff, "%Zd \n", A->x.mpz [p]); - if (status >= 0) + if (status >= 0) { SPEX_PR2("%s", buff); SPEX_mpfr_free_str (buff); @@ -340,10 +350,10 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code { status = SPEX_mpfr_asprintf (&buff,"%Qd \n", A->x.mpq [p]); - if (status >= 0) - { - SPEX_PR2("%s", buff); - SPEX_mpfr_free_str (buff); + if (status >= 0) + { + SPEX_PR2("%s", buff); + SPEX_mpfr_free_str (buff); } break; } @@ -351,10 +361,10 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code { status = SPEX_mpfr_asprintf(&buff, "%.*Rf \n", prec, A->x.mpfr [p]); - if (status >= 0) - { - SPEX_PR2("%s", buff); - SPEX_mpfr_free_str (buff); + if (status >= 0) + { + SPEX_PR2("%s", buff); + SPEX_mpfr_free_str (buff); } break; } @@ -371,11 +381,19 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code } if (status < 0) { - SPEX_FREE_ALL ; - SPEX_PRINTF (" error: %d\n", status) ; - return (status) ; + SPEX_FREE_ALL; + SPEX_PRINTF (" error: %d\n", status); + return (status); } } + + if (i < 0 || i >= m || j < 0 || j >= n) + { + // row indices out of range + SPEX_PR1 ("invalid index\n"); + SPEX_FREE_ALL; + return (SPEX_INCORRECT_INPUT); + } } //------------------------------------------------------------------ @@ -383,13 +401,13 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code //------------------------------------------------------------------ // allocate workspace to check for duplicates - work = (int64_t *) SPEX_malloc (nz * 2 * sizeof (int64_t)) ; + work = (int64_t *) SPEX_malloc (nz * 2 * sizeof (int64_t)); if (work == NULL) { // out of memory - SPEX_PR1 ("out of memory\n") ; + SPEX_PR1 ("out of memory\n"); SPEX_FREE_ALL; - return (SPEX_OUT_OF_MEMORY) ; + return (SPEX_OUT_OF_MEMORY); } // load the (i,j) indices of the triplets into the workspace @@ -400,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++) @@ -411,9 +429,9 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code int64_t last_i = work [2*(p-1)+1] ; if (this_j == last_j && this_i == last_i) { - SPEX_PR1 ("duplicate index: (%ld, %ld)\n", this_i, this_j) ; - SPEX_FREE_ALL ; - return (SPEX_INCORRECT_INPUT) ; + SPEX_PR1 ("duplicate index: (%ld, %ld)\n", this_i, this_j); + SPEX_FREE_ALL; + return (SPEX_INCORRECT_INPUT); } } @@ -433,8 +451,8 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code if (nzmax > 0 && SPEX_X(A) == NULL) { // row indices or values not present - SPEX_PR1 ("x invalid\n") ; - return (SPEX_INCORRECT_INPUT) ; + SPEX_PR1 ("x invalid\n"); + return (SPEX_INCORRECT_INPUT); } //------------------------------------------------------------------ @@ -444,24 +462,27 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code for (j = 0 ; j < n ; j++) { SPEX_PR_LIMIT ; - SPEX_PR2 ("column %"PRId64" :\n", j) ; + SPEX_PR2 ("column %"PRId64" :\n", j); for (i = 0; i < m; i++) { if (pr >= 2) { SPEX_PR_LIMIT ; - SPEX_PR2 (" row %"PRId64" : ", i) ; + SPEX_PR2 (" row %"PRId64" : ", i); switch ( A->type) { case SPEX_MPZ: { + // use mpfr_asprintf so that we can use + // SPEX_PR*, which employs either printf or + // mexprintf status = SPEX_mpfr_asprintf (&buff, "%Zd \n" , - SPEX_2D(A, i, j, mpz)) ; - if (status >= 0) - { - SPEX_PR2("%s", buff); - SPEX_mpfr_free_str (buff); + SPEX_2D(A, i, j, mpz)); + if (status >= 0) + { + SPEX_PR2("%s", buff); + SPEX_mpfr_free_str (buff); } break; } @@ -469,10 +490,10 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code { status = SPEX_mpfr_asprintf (&buff, "%Qd \n", SPEX_2D(A, i, j, mpq)); - if (status >= 0) - { - SPEX_PR2("%s", buff); - SPEX_mpfr_free_str (buff); + if (status >= 0) + { + SPEX_PR2("%s", buff); + SPEX_mpfr_free_str (buff); } break; } @@ -480,10 +501,10 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code { status = SPEX_mpfr_asprintf (&buff, "%.*Rf \n", prec, SPEX_2D(A, i, j, mpfr)); - if (status >= 0) - { - SPEX_PR2("%s", buff); - SPEX_mpfr_free_str (buff); + if (status >= 0) + { + SPEX_PR2("%s", buff); + SPEX_mpfr_free_str (buff); } break; } @@ -500,21 +521,23 @@ SPEX_info SPEX_matrix_check // returns a SPEX status code } if (status < 0) { - SPEX_PR2 (" error: %d\n", status) ; - return (status) ; + SPEX_PR2 (" error: %d\n", status); + return (status); } } } } } break; + + } //-------------------------------------------------------------------------- // free workspace and return result //-------------------------------------------------------------------------- - SPEX_FREE_ALL ; - return (SPEX_OK) ; + SPEX_FREE_ALL; + return (SPEX_OK); } diff --git a/SPEX/SPEX_Util/Source/SPEX_matrix_copy.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c similarity index 79% rename from SPEX/SPEX_Util/Source/SPEX_matrix_copy.c rename to SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c index 5c98c14ed9..efb5fafe75 100644 --- a/SPEX/SPEX_Util/Source/SPEX_matrix_copy.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_matrix_copy: create a copy of a matrix +// SPEX_Utilities/SPEX_matrix_copy: create a copy of a matrix //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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,56 +17,61 @@ // SPEX_matrix_check, if desired. If the input matrix A is not valid, results // are undefined. -#define SPEX_FREE_WORK \ - SPEX_matrix_free (&T, option) ; \ - SPEX_matrix_free (&Y, option) ; \ - SPEX_FREE (W) ; +// SPEX supports 16 matrix formats: 15 of them are all combinations of +// (CSC, triplet, dense) x (mpz, mpq, mpfr, int64, double). +// 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. -#define SPEX_FREE_ALL \ - SPEX_FREE_WORK ; \ - SPEX_matrix_free (&C, option) ; +#define SPEX_FREE_WORK \ + SPEX_matrix_free(&T, option); \ + SPEX_matrix_free(&Y, option); \ + SPEX_FREE(W); + +#define SPEX_FREE_ALL \ + SPEX_FREE_WORK; \ + SPEX_matrix_free(&C, option); #include "spex_util_internal.h" SPEX_info SPEX_matrix_copy ( - SPEX_matrix **C_handle, // matrix to create (never shallow) + SPEX_matrix *C_handle, // matrix to create (never shallow) // inputs, not modified: - SPEX_kind C_kind, // C->kind: CSC, triplet, or dense + SPEX_kind C_kind, // C->kind: CSC, triplet, dense SPEX_type C_type, // C->type: mpz_t, mpq_t, mpfr_t, int64_t, or double - SPEX_matrix *A, // matrix to make a copy of (may be shallow) - const SPEX_options *option + const SPEX_matrix A, // matrix to make a copy of (may be shallow) + const SPEX_options option ) { //-------------------------------------------------------------------------- // check inputs //-------------------------------------------------------------------------- - SPEX_info info ; - if (!spex_initialized ( )) return (SPEX_PANIC) ; + if (!spex_initialized ( )) return (SPEX_PANIC); int64_t nz; - SPEX_matrix *C = NULL ; - SPEX_matrix *Y = NULL ; - SPEX_matrix *T = NULL ; + SPEX_matrix C = NULL ; + SPEX_matrix Y = NULL ; + SPEX_matrix T = NULL ; int64_t *W = NULL ; - SPEX_CHECK (SPEX_matrix_nnz (&nz, A, option)) ; + SPEX_CHECK (SPEX_matrix_nnz (&nz, A, option)); ASSERT( nz >= 0); if (C_handle == NULL || nz < 0 || - //checked in SPEX_matrix_nnz - //A == NULL || A->kind < SPEX_CSC || A->kind > SPEX_DENSE || + // checked in SPEX_matrix_nnz: + //A == NULL || A->kind < SPEX_CSC A->type < SPEX_MPZ || A->type > SPEX_FP64 || C_kind < SPEX_CSC || C_kind > SPEX_DENSE || - C_type < SPEX_MPZ || C_type > SPEX_FP64) + C_type < SPEX_MPZ || C_type > SPEX_FP64 ) { - return (SPEX_INCORRECT_INPUT) ; + return (SPEX_INCORRECT_INPUT); } (*C_handle) = NULL ; int64_t m = A->m ; int64_t n = A->n ; - mpfr_rnd_t round = SPEX_OPTION_ROUND (option) ; + mpfr_rnd_t round = SPEX_OPTION_ROUND (option); //-------------------------------------------------------------------------- // copy and convert A into C @@ -92,13 +98,13 @@ SPEX_info SPEX_matrix_copy { // allocate C SPEX_CHECK (SPEX_matrix_allocate (&C, SPEX_CSC, C_type, - m, n, nz, false, true, option)) ; + m, n, nz, false, true, option)); // copy the pattern of A into C - memcpy (C->p, A->p, (n+1) * sizeof (int64_t)) ; - memcpy (C->i, A->i, nz * sizeof (int64_t)) ; + memcpy (C->p, A->p, (n+1) * sizeof (int64_t)); + memcpy (C->i, A->i, nz * sizeof (int64_t)); // copy and typecast A->x into C->x SPEX_CHECK (spex_cast_array (SPEX_X (C), C->type, - SPEX_X (A), A->type, nz, C->scale, A->scale, option)) ; + SPEX_X (A), A->type, nz, C->scale, A->scale, option)); } break ; @@ -111,24 +117,24 @@ SPEX_info SPEX_matrix_copy // Y = typecast the values of A into the type of C // (not the pattern; Y is SPEX_DENSE) - SPEX_CHECK (spex_cast_matrix (&Y, C_type, A, option)) ; + SPEX_CHECK (spex_cast_matrix (&Y, C_type, A, option)); // allocate workspace - W = (int64_t *) SPEX_calloc (n, sizeof (int64_t)) ; + W = (int64_t *) SPEX_calloc (n, sizeof (int64_t)); if (W == NULL) { - SPEX_FREE_ALL ; - return (SPEX_OUT_OF_MEMORY) ; + SPEX_FREE_ALL; + return (SPEX_OUT_OF_MEMORY); } // allocate C SPEX_CHECK (SPEX_matrix_allocate (&C, SPEX_CSC, - C_type, m, n, nz, false, true, option)) ; + C_type, m, n, nz, false, true, option)); // Scaling factor of C is currently in Y, set it // here SPEX_mpq_set(C->scale, Y->scale); - + // count the # of entries in each column for (int64_t k = 0 ; k < nz ; k++) { @@ -136,7 +142,7 @@ SPEX_info SPEX_matrix_copy } // C->p = cumulative sum of W - SPEX_cumsum (C->p, W, n) ; + spex_cumsum (C->p, W, n); // build the matrix switch (C->type) @@ -146,9 +152,9 @@ SPEX_info SPEX_matrix_copy { int64_t p = W [A->j [k]]++ ; C->i [p] = A->i [k] ; - SPEX_CHECK (SPEX_mpz_set ( + SPEX_MPZ_SET ( SPEX_1D (C, p, mpz), - SPEX_1D (Y, k, mpz))) ; + SPEX_1D (Y, k, mpz)); } break ; @@ -157,9 +163,9 @@ SPEX_info SPEX_matrix_copy { int64_t p = W [A->j [k]]++ ; C->i [p] = A->i [k] ; - SPEX_CHECK (SPEX_mpq_set ( + SPEX_MPQ_SET ( SPEX_1D (C, p, mpq), - SPEX_1D (Y, k, mpq))) ; + SPEX_1D (Y, k, mpq)); } break ; @@ -168,10 +174,10 @@ SPEX_info SPEX_matrix_copy { int64_t p = W [A->j [k]]++ ; C->i [p] = A->i [k] ; - SPEX_CHECK (SPEX_mpfr_set ( + SPEX_MPFR_SET ( SPEX_1D (C, p, mpfr), SPEX_1D (Y, k, mpfr), - round)) ; + round); } break ; @@ -181,7 +187,7 @@ SPEX_info SPEX_matrix_copy int64_t p = W [A->j [k]]++ ; C->i [p] = A->i [k] ; SPEX_1D (C, p, int64) = - SPEX_1D (Y, k, int64) ; + SPEX_1D (Y, k, int64); } break ; @@ -191,7 +197,7 @@ SPEX_info SPEX_matrix_copy int64_t p = W [A->j [k]]++ ; C->i [p] = A->i [k] ; SPEX_1D (C, p, fp64) = - SPEX_1D (Y, k, fp64) ; + SPEX_1D (Y, k, fp64); } break ; @@ -207,7 +213,7 @@ SPEX_info SPEX_matrix_copy case SPEX_DENSE: { // Y = typecast the values of A into the type of C - SPEX_CHECK (spex_cast_matrix (&Y, C_type, A, option)) ; + SPEX_CHECK( spex_cast_matrix(&Y, C_type, A, option) ); int s ; // count the actual nonzeros in Y @@ -218,8 +224,8 @@ SPEX_info SPEX_matrix_copy case SPEX_MPZ: for (int64_t k = 0 ; k < nz ; k++) { - SPEX_CHECK (SPEX_mpz_sgn (&s, - SPEX_1D (Y, k, mpz))) ; + SPEX_MPZ_SGN (&s, + SPEX_1D (Y, k, mpz)); if (s != 0) actual++ ; } break ; @@ -227,8 +233,8 @@ SPEX_info SPEX_matrix_copy case SPEX_MPQ: for (int64_t k = 0 ; k < nz ; k++) { - SPEX_CHECK (SPEX_mpq_sgn (&s, - SPEX_1D (Y, k, mpq))) ; + SPEX_MPQ_SGN (&s, + SPEX_1D (Y, k, mpq)); if (s != 0) actual++ ; } break ; @@ -236,8 +242,8 @@ SPEX_info SPEX_matrix_copy case SPEX_MPFR: for (int64_t k = 0 ; k < nz ; k++) { - SPEX_CHECK (SPEX_mpfr_sgn (&s, - SPEX_1D (Y, k, mpfr))) ; + SPEX_MPFR_SGN (&s, + SPEX_1D (Y, k, mpfr)); if (s != 0) actual++ ; } break ; @@ -259,8 +265,8 @@ SPEX_info SPEX_matrix_copy } // allocate C SPEX_CHECK (SPEX_matrix_allocate (&C, SPEX_CSC, C_type, - m, n, actual, false, true, option)) ; - + m, n, actual, false, true, option)); + // C's scaling factor is currently in Y. Set it here SPEX_mpq_set(C->scale, Y->scale); @@ -275,12 +281,14 @@ SPEX_info SPEX_matrix_copy C->p [j] = nz ; for (int64_t i = 0 ; i < m ; i++) { - SPEX_CHECK( SPEX_mpz_sgn( &s, Y->x.mpz[ i + j*A->m])); + SPEX_MPZ_SGN(&s, + Y->x.mpz[ i + j*A->m]); if (s != 0) { C->i [nz] = i ; - SPEX_CHECK( SPEX_mpz_set ( SPEX_1D (C, nz, mpz), - Y->x.mpz[ i + j*A->m] )); + SPEX_MPZ_SET ( + SPEX_1D (C, nz, mpz), + Y->x.mpz[ i + j*A->m] ); nz++ ; } } @@ -293,14 +301,14 @@ SPEX_info SPEX_matrix_copy C->p [j] = nz ; for (int64_t i = 0 ; i < m ; i++) { - SPEX_CHECK (SPEX_mpq_sgn (&s, - Y->x.mpq[ i + j*A->m])) ; + SPEX_MPQ_SGN (&s, + Y->x.mpq[ i + j*A->m]); if (s != 0) { C->i [nz] = i ; - SPEX_CHECK(SPEX_mpq_set ( + SPEX_MPQ_SET ( SPEX_1D(C, nz, mpq), - Y->x.mpq[ i + j*A->m])); + Y->x.mpq[ i + j*A->m]); nz++ ; } } @@ -313,16 +321,16 @@ SPEX_info SPEX_matrix_copy C->p [j] = nz ; for (int64_t i = 0 ; i < m ; i++) { - SPEX_CHECK (SPEX_mpfr_sgn (&s, - Y->x.mpfr[i + j*A->m])) ; + SPEX_MPFR_SGN (&s, + Y->x.mpfr[i + j*A->m]); if (s != 0) { - C->i [nz] = i ; - SPEX_CHECK (SPEX_mpfr_set ( + C->i [nz] = i ; + SPEX_MPFR_SET ( SPEX_1D (C, nz, mpfr), Y->x.mpfr[i + j*A->m], - round)) ; - + round); + nz++ ; } } @@ -390,12 +398,12 @@ SPEX_info SPEX_matrix_copy { // allocate C SPEX_CHECK (SPEX_matrix_allocate (&C, SPEX_TRIPLET, C_type, - m, n, nz, false, true, option)) ; + m, n, nz, false, true, option)); // copy and typecast A->x into C->x SPEX_CHECK (spex_cast_array (SPEX_X (C), C->type, - SPEX_X (A), A->type, nz, C->scale, A->scale, option)) ; + SPEX_X (A), A->type, nz, C->scale, A->scale, option)); // copy the row indices A->i into C->i - memcpy (C->i, A->i, nz * sizeof (int64_t)) ; + memcpy (C->i, A->i, nz * sizeof (int64_t)); // construct C->j for (int64_t j = 0 ; j < n ; j++) { @@ -417,13 +425,13 @@ SPEX_info SPEX_matrix_copy { // allocate C SPEX_CHECK (SPEX_matrix_allocate (&C, SPEX_TRIPLET, C_type, - m, n, nz, false, true, option)) ; + m, n, nz, false, true, option)); // copy the pattern of A into C - memcpy (C->j, A->j, nz * sizeof (int64_t)) ; - memcpy (C->i, A->i, nz * sizeof (int64_t)) ; + memcpy (C->j, A->j, nz * sizeof (int64_t)); + memcpy (C->i, A->i, nz * sizeof (int64_t)); // copy and typecast A->x into C->x SPEX_CHECK (spex_cast_array (SPEX_X (C), C->type, - SPEX_X (A), A->type, nz, C->scale, A->scale, option)) ; + SPEX_X (A), A->type, nz, C->scale, A->scale, option)); // set C->nz C->nz = nz; } @@ -437,11 +445,11 @@ SPEX_info SPEX_matrix_copy { // convert A to a temporary CSC matrix SPEX_CHECK (SPEX_matrix_copy (&T, SPEX_CSC, C_type, - A, option)) ; + A, option)); // convert T from CSC to triplet SPEX_CHECK (SPEX_matrix_copy (&C, SPEX_TRIPLET, C_type, - T, option)) ; - SPEX_matrix_free (&T, option) ; + T, option)); + SPEX_matrix_free (&T, option); // set C->nz C->nz = nz; } @@ -459,10 +467,6 @@ SPEX_info SPEX_matrix_copy case SPEX_DENSE: { - // allocate C - SPEX_CHECK (SPEX_matrix_allocate (&C, SPEX_DENSE, C_type, - m, n, nz, false, true, option)) ; - switch (A->kind) { @@ -472,9 +476,13 @@ SPEX_info SPEX_matrix_copy case SPEX_CSC: { + // allocate C + SPEX_CHECK (SPEX_matrix_allocate (&C, SPEX_DENSE, C_type, + m, n, nz, false, true, option)); + // Y = typecast the values of A into the type of C - SPEX_CHECK (spex_cast_matrix (&Y, C->type, A, option)) ; - + SPEX_CHECK (spex_cast_matrix (&Y, C->type, A, option)); + // Set C's scaling factor SPEX_mpq_set(C->scale, Y->scale); @@ -487,9 +495,9 @@ SPEX_info SPEX_matrix_copy for (int64_t p = A->p [j] ; p < A->p [j+1] ;p++) { int64_t i = A->i [p] ; - SPEX_CHECK (SPEX_mpz_set ( + SPEX_MPZ_SET ( SPEX_2D (C, i, j, mpz), - SPEX_1D (Y, p, mpz))) ; + SPEX_1D (Y, p, mpz)); } } break ; @@ -500,9 +508,9 @@ SPEX_info SPEX_matrix_copy for (int64_t p = A->p [j] ; p < A->p [j+1] ;p++) { int64_t i = A->i [p] ; - SPEX_CHECK (SPEX_mpq_set ( + SPEX_MPQ_SET ( SPEX_2D (C, i, j, mpq), - SPEX_1D (Y, p, mpq))) ; + SPEX_1D (Y, p, mpq)); } } break ; @@ -513,10 +521,10 @@ SPEX_info SPEX_matrix_copy for (int64_t p = A->p [j] ; p < A->p [j+1] ;p++) { int64_t i = A->i [p] ; - SPEX_CHECK (SPEX_mpfr_set ( + SPEX_MPFR_SET ( SPEX_2D (C, i, j, mpfr), SPEX_1D (Y, p, mpfr), - round)) ; + round); } } break ; @@ -528,7 +536,7 @@ SPEX_info SPEX_matrix_copy { int64_t i = A->i [p] ; SPEX_2D (C, i, j, int64) = - SPEX_1D (Y, p, int64) ; + SPEX_1D (Y, p, int64); } } break ; @@ -540,7 +548,7 @@ SPEX_info SPEX_matrix_copy { int64_t i = A->i [p] ; SPEX_2D (C, i, j, fp64) = - SPEX_1D (Y, p, fp64) ; + SPEX_1D (Y, p, fp64); } } break ; @@ -556,8 +564,12 @@ SPEX_info SPEX_matrix_copy case SPEX_TRIPLET: { + // allocate C + SPEX_CHECK (SPEX_matrix_allocate (&C, SPEX_DENSE, C_type, + m, n, nz, false, true, option)); + // Y = typecast the values of A into the type of C - SPEX_CHECK (spex_cast_matrix (&Y, C->type, A, option)) ; + SPEX_CHECK (spex_cast_matrix (&Y, C->type, A, option)); // Set C's scaling factor SPEX_mpq_set(C->scale, Y->scale); @@ -569,9 +581,9 @@ SPEX_info SPEX_matrix_copy { int64_t i = A->i [k] ; int64_t j = A->j [k] ; - SPEX_CHECK (SPEX_mpz_set ( + SPEX_MPZ_SET ( SPEX_2D (C, i, j, mpz), - SPEX_1D (Y, k, mpz))) ; + SPEX_1D (Y, k, mpz)); } break ; @@ -580,9 +592,9 @@ SPEX_info SPEX_matrix_copy { int64_t i = A->i [k] ; int64_t j = A->j [k] ; - SPEX_CHECK (SPEX_mpq_set ( + SPEX_MPQ_SET ( SPEX_2D (C, i, j, mpq), - SPEX_1D (Y, k, mpq))) ; + SPEX_1D (Y, k, mpq)); } break ; @@ -591,10 +603,10 @@ SPEX_info SPEX_matrix_copy { int64_t i = A->i [k] ; int64_t j = A->j [k] ; - SPEX_CHECK (SPEX_mpfr_set ( + SPEX_MPFR_SET ( SPEX_2D (C, i, j, mpfr), SPEX_1D (Y, k, mpfr), - round)) ; + round); } break ; @@ -604,7 +616,7 @@ SPEX_info SPEX_matrix_copy int64_t i = A->i [k] ; int64_t j = A->j [k] ; SPEX_2D (C, i, j, int64) = - SPEX_1D (Y, k, int64) ; + SPEX_1D (Y, k, int64); } break ; @@ -614,7 +626,7 @@ SPEX_info SPEX_matrix_copy int64_t i = A->i [k] ; int64_t j = A->j [k] ; SPEX_2D (C, i, j, fp64) = - SPEX_1D (Y, k, fp64) ; + SPEX_1D (Y, k, fp64); } break ; @@ -628,9 +640,13 @@ SPEX_info SPEX_matrix_copy case SPEX_DENSE: { + // allocate C + SPEX_CHECK (SPEX_matrix_allocate (&C, SPEX_DENSE, C_type, + m, n, nz, false, true, option)); + // copy and typecast A->x into C->x SPEX_CHECK (spex_cast_array (SPEX_X (C), C->type, - SPEX_X (A), A->type, nz, C->scale, A->scale, option)) ; + SPEX_X (A), A->type, nz, C->scale, A->scale, option)); } break ; @@ -639,15 +655,16 @@ SPEX_info SPEX_matrix_copy } break ; + + } //-------------------------------------------------------------------------- // free workspace and return result //-------------------------------------------------------------------------- - SPEX_FREE_WORK ; - (*C_handle) = C ; - - return (SPEX_OK) ; + SPEX_FREE_WORK; + (*C_handle) = C; + return (SPEX_OK); } diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c new file mode 100644 index 0000000000..500ac8a2d0 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c @@ -0,0 +1,113 @@ +//------------------------------------------------------------------------------ +// 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. +// 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 +( + SPEX_matrix *A_handle, // matrix to free + const SPEX_options option +) +{ + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + if (!spex_initialized ( )) { return (SPEX_PANIC); } ; + + if (A_handle == NULL || (*A_handle) == NULL) + { + // nothing to free (not an error) + return (SPEX_OK); + } + SPEX_matrix A = (*A_handle); + + //-------------------------------------------------------------------------- + // 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 values + if (!(A->x_shallow)) + { + 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); + + //-------------------------------------------------------------------------- + // free the header + //-------------------------------------------------------------------------- + + // the header is never shallow + SPEX_FREE (A); + (*A_handle) = NULL ; + return (SPEX_OK); +} + diff --git a/SPEX/SPEX_Util/Source/SPEX_matrix_nnz.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c similarity index 60% rename from SPEX/SPEX_Util/Source/SPEX_matrix_nnz.c rename to SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c index dbb7a6040c..12ee7faca6 100644 --- a/SPEX/SPEX_Util/Source/SPEX_matrix_nnz.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_matrix_nnz: find # of entries in a matrix +// SPEX_Utilities/SPEX_matrix_nnz: find # of entries in a matrix //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -11,15 +12,13 @@ #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 +SPEX_info SPEX_matrix_nnz // find the # of entries in A ( - int64_t *nnz, // # of entries in A, -1 if A is NULL - const SPEX_matrix *A, // matrix to query - const SPEX_options *option // command options, currently unused + int64_t *nnz, // # of entries in A, -1 if A is NULL + const SPEX_matrix A, // matrix to query + const SPEX_options option // command options, currently unused ) { @@ -27,19 +26,25 @@ SPEX_info SPEX_matrix_nnz // find the # of entries in A // check inputs //-------------------------------------------------------------------------- - if (!spex_initialized ( )) return (SPEX_PANIC) ; + if (!spex_initialized ( )) return (SPEX_PANIC); + + if (nnz == NULL) + { + return (SPEX_INCORRECT_INPUT); + } + + (*nnz) = -1 ; if (A == NULL) { - *nnz = -1; - return (SPEX_INCORRECT_INPUT) ; + return (SPEX_INCORRECT_INPUT); } //-------------------------------------------------------------------------- // find nnz (A) //-------------------------------------------------------------------------- - // In all three cases, SPEX_matrix_nnz(&nnz, A, option) returns + // If kind != SPEX_DYNAMIC_CSC, SPEX_matrix_nnz(&nnz, A, option) returns // with nnz <= A->nzmax. switch (A->kind) @@ -61,13 +66,15 @@ SPEX_info SPEX_matrix_nnz // find the # of entries in A case SPEX_DENSE: { // dense matrices: nnz(A) is always m*n. A->nz is ignored. - *nnz = (A->m < 0 || A->n < 0)? (-1) : (A->m * A->n) ; + *nnz = (A->m < 0 || A->n < 0)? (-1) : (A->m * A->n); } break; + default: - return (SPEX_INCORRECT_INPUT) ; + return (SPEX_INCORRECT_INPUT); } - return ((*nnz < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK) ; + + return ((*nnz < 0) ? SPEX_INCORRECT_INPUT : SPEX_OK); } diff --git a/SPEX/SPEX_Util/Source/SPEX_realloc.c b/SPEX/SPEX_Utilities/Source/SPEX_realloc.c similarity index 76% rename from SPEX/SPEX_Util/Source/SPEX_realloc.c rename to SPEX/SPEX_Utilities/Source/SPEX_realloc.c index 70aaaf0036..b5e9ebcede 100644 --- a/SPEX/SPEX_Util/Source/SPEX_realloc.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_realloc.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_realloc: wrapper for realloc +// SPEX_Utilities/SPEX_realloc: wrapper for realloc //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -25,14 +26,14 @@ // of size 10. // // int *p ; -// p = SPEX_malloc (10 * sizeof (int)) ; +// p = SPEX_malloc (10 * sizeof (int)); // if (p == NULL) { error here ... } -// printf ("p points to an array of size 10 * sizeof (int)\n") ; +// printf ("p points to an array of size 10 * sizeof (int)\n"); // bool ok ; -// p = SPEX_realloc (20, 10, sizeof (int), p, &ok) ; -// if (ok) printf ("p has size 20 * sizeof (int)\n") ; -// else printf ("realloc failed; p still has size 10 * sizeof (int)\n") ; -// SPEX_FREE (p) ; +// p = SPEX_realloc (20, 10, sizeof (int), p, &ok); +// if (ok) printf ("p has size 20 * sizeof (int)\n"); +// else printf ("realloc failed; p still has size 10 * sizeof (int)\n"); +// SPEX_FREE (p); void *SPEX_realloc // pointer to reallocated block, or original block // if the realloc failed @@ -44,16 +45,11 @@ void *SPEX_realloc // pointer to reallocated block, or original block bool *ok // true if success, false on failure ) { - if (!spex_initialized ( )) - { - (*ok) = false ; - return (p) ; - } int result ; void *pnew = SuiteSparse_realloc ((size_t) nitems_new, (size_t) nitems_old, - size_of_item, p, &result) ; - (*ok) = (result != 0) ; - return (pnew) ; + size_of_item, p, &result); + (*ok) = (result != 0); + return (pnew); } diff --git a/SPEX/SPEX_Utilities/Source/SPEX_symbolic_analysis_free.c b/SPEX/SPEX_Utilities/Source/SPEX_symbolic_analysis_free.c new file mode 100644 index 0000000000..7666123b80 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/SPEX_symbolic_analysis_free.c @@ -0,0 +1,45 @@ +//------------------------------------------------------------------------------ +// SPEX_Utilities/SPEX_symbolic_analysis_free: Free memory for the +// SPEX_symbolic_analysis data type. +//------------------------------------------------------------------------------ + +// 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 frees the memory of the SPEX_symbolic_analysis struct + * + * Input is the SPEX_symbolic_analysis structure, it is destroyed on function + * termination. + */ + +#include "spex_util_internal.h" + +SPEX_info SPEX_symbolic_analysis_free +( + SPEX_symbolic_analysis *S_handle, // Structure to be deleted + const SPEX_options option +) +{ + + if (!spex_initialized ( )) return (SPEX_PANIC); + + if ((S_handle != NULL) && (*S_handle != NULL)) + { + + SPEX_FREE((*S_handle)->P_perm); + SPEX_FREE((*S_handle)->Pinv_perm); + SPEX_FREE((*S_handle)->Q_perm); + SPEX_FREE((*S_handle)->Qinv_perm); + + SPEX_FREE((*S_handle)->parent); + SPEX_FREE((*S_handle)->cp); + SPEX_FREE (*S_handle); + } + + return (SPEX_OK); +} + diff --git a/SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c b/SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c new file mode 100644 index 0000000000..2e53c7a85e --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +// SPEX_thread_finalize frees the working evironment for SPEX for a +// single user thread. + +#include "spex_util_internal.h" + +SPEX_info SPEX_thread_finalize ( void ) +{ + if (!spex_initialized ( )) return (SPEX_PANIC); + spex_gmp_finalize (0); + return (SPEX_OK); +} + diff --git a/SPEX/SPEX_Utilities/Source/SPEX_thread_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_thread_initialize.c new file mode 100644 index 0000000000..67ab3bd2b5 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/SPEX_thread_initialize.c @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +// SPEX_thread_initialize initializes the working evironment for SPEX for a +// single user thread. + +#include "spex_util_internal.h" + +SPEX_info SPEX_thread_initialize ( void ) +{ + if (!spex_initialized ( )) return (SPEX_PANIC); + return (spex_gmp_initialize (0)) ; +} + diff --git a/SPEX/SPEX_Utilities/Source/SPEX_transpose.c b/SPEX/SPEX_Utilities/Source/SPEX_transpose.c new file mode 100644 index 0000000000..177ee8c361 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/SPEX_transpose.c @@ -0,0 +1,106 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#define SPEX_FREE_WORK \ + SPEX_FREE(w); + +#define SPEX_FREE_ALL \ + SPEX_FREE_WORK; \ + SPEX_matrix_free(&C, option); + +#include "spex_util_internal.h" + +/* Purpose: This function sets C = A', where A must be a SPEX_CSC matrix + * C_handle is NULL on input. On output, C_handle contains a pointer to A' + */ + +SPEX_info SPEX_transpose +( + SPEX_matrix *C_handle, // C = A' + SPEX_matrix A, // Matrix to be transposed + const SPEX_options option +) +{ + + SPEX_info info; + if (!spex_initialized ( )) return (SPEX_PANIC); + // Check input + SPEX_REQUIRE_KIND (A, SPEX_CSC); + if (!C_handle) { return SPEX_INCORRECT_INPUT;} + + // Declare workspace and C + int64_t *w = NULL; + SPEX_matrix C = NULL; + int64_t nz; // Number of nonzeros in A + int64_t p, q, j, n, m; + info = SPEX_matrix_nnz(&nz, A, option); + if (info != SPEX_OK) {return info;} + m = A->m ; n = A->n ; + ASSERT( m >= 0); + ASSERT( n >= 0); + + // C is also CSC and its type is the same as A + SPEX_CHECK(SPEX_matrix_allocate(&C, SPEX_CSC, A->type, n, m, nz, + false, true, option)); + + // Declare workspace + w = (int64_t*) SPEX_calloc(m, sizeof(int64_t)); + if (!w) + { + SPEX_FREE_ALL; + return SPEX_OUT_OF_MEMORY; + } + // Compute row counts + for (p = 0 ; p < nz ; p++) + { + w [A->i [p]]++ ; + } + + // Compute row pointers + spex_cumsum (C->p, w, m); + // Populate C + for (j = 0 ; j < n ; j++) + { + for (p = A->p [j] ; p < A->p [j+1] ; p++) + { + q = w [A->i [p]]++; + C->i [q] = j ; // place A(i,j) as entry C(j,i) + + // assign C->x[q] = A->x[p] + if (A->type == SPEX_MPZ) + { + SPEX_MPZ_SET(C->x.mpz[q], A->x.mpz[p]); + } + else if (A->type == SPEX_MPQ) + { + SPEX_MPQ_SET(C->x.mpq[q], A->x.mpq[p]); + } + else if (A->type == SPEX_MPFR) + { + SPEX_MPFR_SET(C->x.mpfr[q], A->x.mpfr[p], + SPEX_OPTION_ROUND(option)); + } + else if (A->type == SPEX_INT64) + { + C->x.int64[q] = A->x.int64[p]; + } + else + { + C->x.fp64[q] = A->x.fp64[p]; + } + } + } + SPEX_MPQ_SET(C->scale, A->scale); + + (*C_handle) = C; + SPEX_FREE_WORK; + return SPEX_OK; +} diff --git a/SPEX/SPEX_Utilities/Source/SPEX_version.c b/SPEX/SPEX_Utilities/Source/SPEX_version.c new file mode 100644 index 0000000000..de4c09d4a4 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/SPEX_version.c @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +// Returns the library version and date. + +#include "spex_util_internal.h" + +SPEX_info SPEX_version +( + // output + int version [3], // SPEX major, minor, and sub version + char date [128] // date of this version +) +{ + + if (version != NULL) + { + version [0] = SPEX_VERSION_MAJOR ; + version [1] = SPEX_VERSION_MINOR ; + version [2] = SPEX_VERSION_SUB ; + } + + if (date != NULL) + { + strncpy (date, SPEX_DATE, 127); + } + + return (SPEX_OK); +} + diff --git a/SPEX/SPEX_Utilities/Source/spex_amd.c b/SPEX/SPEX_Utilities/Source/spex_amd.c new file mode 100644 index 0000000000..7f41ab8949 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/spex_amd.c @@ -0,0 +1,76 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +#define SPEX_FREE_ALL \ +{ \ + SPEX_free (perm); \ +} + +#include "spex_util_internal.h" + +/* Purpose: SPEX interface to AMD + */ + +SPEX_info spex_amd +( + int64_t **perm_handle, + int64_t *nnz, + const SPEX_matrix A, + const SPEX_options option +) +{ + + (*nnz) = 0 ; + (*perm_handle) = NULL ; + + int pr = SPEX_OPTION_PRINT_LEVEL(option); + int64_t n = A->n; + int64_t *perm = NULL ; + + // Allocate memory for permutation + perm = (int64_t*)SPEX_malloc( (n+1)*sizeof(int64_t) ); + if (perm == NULL) + { + SPEX_FREE_ALL; + return (SPEX_OUT_OF_MEMORY); + } + + double Control[AMD_CONTROL]; // Declare AMD control + amd_l_defaults(Control); // Set AMD defaults + double Info [AMD_INFO]; + // Perform AMD + int64_t amd_result = amd_l_order(n, + (int64_t *)A->p, (int64_t *)A->i, + (int64_t *)perm, Control, Info); + if (pr > 0) // Output AMD info if desired + { + SPEX_PRINTF("\n****Ordering Information****\n"); + amd_l_control(Control); + amd_l_info(Info); + } + if (!(amd_result == AMD_OK || amd_result == AMD_OK_BUT_JUMBLED)) + { + // AMD failed: either out of memory, or bad input + SPEX_FREE_ALL; + if (amd_result == AMD_OUT_OF_MEMORY) + { + // AMD ran out of memory + return (SPEX_OUT_OF_MEMORY); + } + // input matrix is invalid + return (SPEX_INCORRECT_INPUT); + } + + (*nnz) = Info[AMD_LNZ]; // Exact number of nonzeros for Cholesky + (*perm_handle)=perm; + return SPEX_OK; +} + diff --git a/SPEX/SPEX_Util/Source/spex_cast_array.c b/SPEX/SPEX_Utilities/Source/spex_cast_array.c similarity index 79% rename from SPEX/SPEX_Util/Source/spex_cast_array.c rename to SPEX/SPEX_Utilities/Source/spex_cast_array.c index 5b436d6ca4..2f08588cac 100644 --- a/SPEX/SPEX_Util/Source/spex_cast_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_cast_array.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/spex_cast_array: scale and typecast an array +// SPEX_Utilities/spex_cast_array: scale and typecast an array //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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,7 +39,6 @@ SPEX_MPQ_CLEAR(temp); \ #include "spex_util_internal.h" - #if defined (__GNUC__) #pragma GCC diagnostic ignored "-Wunused-variable" #endif @@ -51,8 +51,8 @@ SPEX_info spex_cast_array SPEX_type xtype, // type of X int64_t n, // size of Y and X mpq_t y_scale, // scale factor applied if Y is mpz_t - mpq_t x_scale, // scale factor applied if x is mpz_t - const SPEX_options *option// Command options. If NULL, set to default values + const mpq_t x_scale, // scale factor applied if x is mpz_t + const SPEX_options option // Command options. If NULL, use defaults ) { @@ -63,13 +63,13 @@ SPEX_info spex_cast_array if (Y == NULL || X == NULL) { - return (SPEX_INCORRECT_INPUT) ; + return (SPEX_INCORRECT_INPUT); } SPEX_info info ; int r; mpq_t temp; SPEX_MPQ_SET_NULL(temp); - mpfr_rnd_t round = SPEX_OPTION_ROUND (option) ; + mpfr_rnd_t round = SPEX_OPTION_ROUND (option); //-------------------------------------------------------------------------- // Y [0:n-1] = (ytype) X [0:n-1] @@ -95,10 +95,10 @@ SPEX_info spex_cast_array mpz_t *x = (mpz_t *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpz_set (y [k], x[k])) ; + SPEX_MPZ_SET (y [k], x[k]); } // y is a direct copy of x. Set y_scale = x_scale - SPEX_CHECK(SPEX_mpq_set(y_scale, x_scale)); + SPEX_MPQ_SET(y_scale, x_scale); } break ; @@ -113,7 +113,7 @@ SPEX_info spex_cast_array { mpfr_t *x = (mpfr_t *) X ; SPEX_CHECK (spex_expand_mpfr_array (Y, X, y_scale, n, - option)) ; + option)); } break ; @@ -122,9 +122,9 @@ SPEX_info spex_cast_array int64_t *x = (int64_t *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpz_set_si (y [k], x [k])) ; + SPEX_MPZ_SET_SI(y [k], x [k]); } - SPEX_CHECK (SPEX_mpq_set_ui (y_scale, 1, 1)) ; + SPEX_MPQ_SET_UI(y_scale, 1, 1); } break ; @@ -132,7 +132,7 @@ SPEX_info spex_cast_array { double *x = (double *) X ; SPEX_CHECK (spex_expand_double_array (y, x, y_scale, n, - option)) ; + option)); } break ; @@ -157,7 +157,7 @@ SPEX_info spex_cast_array // 1, each value in y is divided by x_scale // Check if x_scale == 1 - SPEX_CHECK(SPEX_mpq_cmp_ui(&r, x_scale, 1, 1)); + SPEX_MPQ_CMP_UI(&r, x_scale, 1, 1); mpz_t *x = (mpz_t *) X ; if (r == 0) @@ -165,7 +165,7 @@ SPEX_info spex_cast_array // x_scale = 1. Simply do a direct copy. for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpq_set_z (y [k], x [k])) ; + SPEX_MPQ_SET_Z(y [k], x [k]); } } else @@ -174,8 +174,8 @@ SPEX_info spex_cast_array // of Y by x_scale for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpq_set_z (y [k], x [k])) ; - SPEX_CHECK (SPEX_mpq_div(y[k], y[k], x_scale)); + SPEX_MPQ_SET_Z(y [k], x [k]); + SPEX_MPQ_DIV(y[k], y[k], x_scale); } } } @@ -186,7 +186,7 @@ SPEX_info spex_cast_array mpq_t *x = (mpq_t *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpq_set (y [k], x [k])) ; + SPEX_MPQ_SET (y [k], x [k]); } } break ; @@ -196,7 +196,7 @@ SPEX_info spex_cast_array mpfr_t *x = (mpfr_t *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpfr_get_q( y[k], x[k], round)); + SPEX_MPFR_GET_Q( y[k], x[k], round); } } break ; @@ -206,7 +206,7 @@ SPEX_info spex_cast_array int64_t *x = (int64_t *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpq_set_si (y [k], x [k], 1)) ; + SPEX_MPQ_SET_SI (y [k], x [k], 1); } } break ; @@ -216,7 +216,7 @@ SPEX_info spex_cast_array double *x = (double *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpq_set_d (y [k], x [k])) ; + SPEX_MPQ_SET_D (y [k], x [k]); } } break ; @@ -241,14 +241,14 @@ SPEX_info spex_cast_array // case, if the scaling factor of x is not equal to 1, the // values of y must be scaled. mpz_t *x = (mpz_t *) X ; - SPEX_CHECK(SPEX_mpq_cmp_ui(&r, x_scale, 1, 1)); + SPEX_MPQ_CMP_UI(&r, x_scale, 1, 1); if (r == 0) { // x_scale = 1. Simply do a direct copy. for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpfr_set_z (y [k], x [k], round)) ; + SPEX_MPFR_SET_Z(y [k], x [k], round); } } else @@ -257,12 +257,12 @@ SPEX_info spex_cast_array // of Y by x_scale. To do this, we will cast each // x_k to mpq_t, then divide by the scale, then // cast the result to mpfr_t - SPEX_CHECK(SPEX_mpq_init(temp)); + SPEX_MPQ_INIT(temp); for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK( SPEX_mpq_set_z( temp, x[k])); - SPEX_CHECK( SPEX_mpq_div(temp, temp, x_scale)); - SPEX_CHECK(SPEX_mpfr_set_q(y[k], temp, round)); + SPEX_MPQ_SET_Z( temp, x[k]); + SPEX_MPQ_DIV(temp, temp, x_scale); + SPEX_MPFR_SET_Q(y[k], temp, round); } } } @@ -273,7 +273,7 @@ SPEX_info spex_cast_array mpq_t *x = (mpq_t *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpfr_set_q (y [k], x [k], round)) ; + SPEX_MPFR_SET_Q(y [k], x [k], round); } } break ; @@ -283,7 +283,7 @@ SPEX_info spex_cast_array mpfr_t *x = (mpfr_t *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpfr_set (y [k], x [k], round)) ; + SPEX_MPFR_SET(y [k], x [k], round); } } break ; @@ -293,7 +293,7 @@ SPEX_info spex_cast_array int64_t *x = (int64_t *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK(SPEX_mpfr_set_si(y[k], x[k], round)); + SPEX_MPFR_SET_SI(y[k], x[k], round); } } break ; @@ -303,7 +303,7 @@ SPEX_info spex_cast_array double *x = (double *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpfr_set_d (y [k], x [k], round)) ; + SPEX_MPFR_SET_D(y [k], x [k], round); } } break ; @@ -327,14 +327,14 @@ SPEX_info spex_cast_array // x is mpz_t and y is int64_t. Same as above, // if x_scale > 1 it is applied mpz_t *x = (mpz_t *) X ; - SPEX_CHECK(SPEX_mpq_cmp_ui(&r, x_scale, 1, 1)); + SPEX_MPQ_CMP_UI(&r, x_scale, 1, 1); if (r == 0) { // x_scale = 1. Simply do a direct copy. for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK(SPEX_mpz_get_si( &(y[k]), x[k])); + SPEX_MPZ_GET_SI( &(y[k]), x[k]); } } else @@ -343,13 +343,13 @@ SPEX_info spex_cast_array // of Y by x_scale. To do this, we will cast each // x_k to mpq_t, then divide by the scale, then // cast the result to double and cast the double to int - SPEX_CHECK(SPEX_mpq_init(temp)); + SPEX_MPQ_INIT(temp); for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK( SPEX_mpq_set_z( temp, x[k])); - SPEX_CHECK( SPEX_mpq_div(temp, temp, x_scale)); + SPEX_MPQ_SET_Z( temp, x[k]); + SPEX_MPQ_DIV(temp, temp, x_scale); double temp2; - SPEX_CHECK(SPEX_mpq_get_d(&temp2, temp)); + SPEX_MPQ_GET_D(&temp2, temp); y[k] = spex_cast_double_to_int64(temp2); } } @@ -362,8 +362,8 @@ SPEX_info spex_cast_array for (int64_t k = 0 ; k < n ; k++) { double t ; - SPEX_CHECK (SPEX_mpq_get_d (&t, x [k])) ; - y [k] = spex_cast_double_to_int64 (t) ; + SPEX_MPQ_GET_D(&t, x [k]); + y [k] = spex_cast_double_to_int64 (t); } } break ; @@ -373,14 +373,14 @@ SPEX_info spex_cast_array mpfr_t *x = (mpfr_t *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK( SPEX_mpfr_get_si( &(y[k]),x[k], round)); + SPEX_MPFR_GET_SI( &(y[k]),x[k], round); } } break ; case SPEX_INT64: // int64_t to int64_t { - memcpy (Y, X, n * sizeof (int64_t)) ; + memcpy (Y, X, n * sizeof (int64_t)); } break ; @@ -389,7 +389,7 @@ SPEX_info spex_cast_array double *x = (double *) X ; for (int64_t k = 0 ; k < n ; k++) { - y [k] = spex_cast_double_to_int64 (x [k]) ; + y [k] = spex_cast_double_to_int64 (x [k]); } } break ; @@ -413,14 +413,14 @@ SPEX_info spex_cast_array // Same as above, x is mpz_t, y is double. Must // divide by x_scale if x_scale != 1. mpz_t *x = (mpz_t *) X ; - SPEX_CHECK(SPEX_mpq_cmp_ui(&r, x_scale, 1, 1)); + SPEX_MPQ_CMP_UI(&r, x_scale, 1, 1); if (r == 0) { // x_scale = 1. Simply do a direct copy. for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK(SPEX_mpz_get_d( &(y[k]), x[k])); + SPEX_MPZ_GET_D( &(y[k]), x[k]); } } else @@ -429,12 +429,12 @@ SPEX_info spex_cast_array // of Y by x_scale. To do this, we will cast each // x_k to mpq_t, then divide by the scale, then // cast the result to double - SPEX_CHECK(SPEX_mpq_init(temp)); + SPEX_MPQ_INIT(temp); for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK( SPEX_mpq_set_z( temp, x[k])); - SPEX_CHECK( SPEX_mpq_div(temp, temp, x_scale)); - SPEX_CHECK(SPEX_mpq_get_d(&(y[k]), temp)); + SPEX_MPQ_SET_Z(temp, x[k]); + SPEX_MPQ_DIV(temp, temp, x_scale); + SPEX_MPQ_GET_D(&(y[k]), temp); } } } @@ -445,7 +445,7 @@ SPEX_info spex_cast_array mpq_t *x = (mpq_t *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpq_get_d (&(y [k]), x [k])) ; + SPEX_MPQ_GET_D(&(y[k]), x[k]); } } break ; @@ -455,8 +455,7 @@ SPEX_info spex_cast_array mpfr_t *x = (mpfr_t *) X ; for (int64_t k = 0 ; k < n ; k++) { - SPEX_CHECK (SPEX_mpfr_get_d (&(y [k]), x [k], - round)); + SPEX_MPFR_GET_D(&(y[k]), x[k], round); } } break ; @@ -466,14 +465,14 @@ SPEX_info spex_cast_array int64_t *x = (int64_t *) X ; for (int64_t k = 0 ; k < n ; k++) { - y [k] = (double) (x [k]) ; + y [k] = (double) (x[k]); } } break ; case SPEX_FP64: // double to double { - memcpy (Y, X, n * sizeof (double)) ; + memcpy (Y, X, n * sizeof (double)); } break ; @@ -482,6 +481,6 @@ SPEX_info spex_cast_array break ; } - SPEX_FREE_ALL - return (SPEX_OK) ; + SPEX_FREE_ALL; + return (SPEX_OK); } diff --git a/SPEX/SPEX_Util/Source/spex_cast_matrix.c b/SPEX/SPEX_Utilities/Source/spex_cast_matrix.c similarity index 80% rename from SPEX/SPEX_Util/Source/spex_cast_matrix.c rename to SPEX/SPEX_Utilities/Source/spex_cast_matrix.c index 746b8a4f77..223971e2c0 100644 --- a/SPEX/SPEX_Util/Source/spex_cast_matrix.c +++ b/SPEX/SPEX_Utilities/Source/spex_cast_matrix.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/spex_cast_matrix: create a dense typecasted matrix +// SPEX_Utilities/spex_cast_matrix: create a dense typecasted matrix //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -13,16 +14,16 @@ // kind (CSC, triplet, or dense) and any type. #define SPEX_FREE_ALL \ - SPEX_matrix_free (&Y, option) ; + SPEX_matrix_free (&Y, option); #include "spex_util_internal.h" SPEX_info spex_cast_matrix ( - SPEX_matrix **Y_handle, // nz-by-1 dense matrix to create + SPEX_matrix *Y_handle, // nz-by-1 dense matrix to create SPEX_type Y_type, // type of Y - SPEX_matrix *A, // matrix with nz entries - const SPEX_options *option // Command options, if NULL defaults are used + const SPEX_matrix A, // matrix with nz entries + const SPEX_options option // Command options, if NULL defaults are used ) { @@ -34,19 +35,19 @@ SPEX_info spex_cast_matrix #if 0 if (Y_handle == NULL || A == NULL) { - return (SPEX_INCORRECT_INPUT) ; + return (SPEX_INCORRECT_INPUT); } if (nz < 0) { - return (SPEX_INCORRECT_INPUT) ; + return (SPEX_INCORRECT_INPUT); } (*Y_handle) = NULL ; #endif int64_t nz; SPEX_info info = SPEX_OK ; - SPEX_matrix *Y = NULL ; - SPEX_CHECK (SPEX_matrix_nnz (&nz, A, option)) ; + SPEX_matrix Y = NULL ; + SPEX_CHECK (SPEX_matrix_nnz (&nz, A, option)); //-------------------------------------------------------------------------- @@ -54,7 +55,7 @@ SPEX_info spex_cast_matrix //-------------------------------------------------------------------------- SPEX_CHECK (SPEX_matrix_allocate (&Y, SPEX_DENSE, Y_type, - nz, 1, nz, Y_type == A->type, true, option)) ; + nz, 1, nz, Y_type == A->type, true, option)); //-------------------------------------------------------------------------- // typecast the values from A into Y @@ -90,7 +91,7 @@ SPEX_info spex_cast_matrix //---------------------------------------------------------------------- SPEX_CHECK (spex_cast_array (SPEX_X (Y), Y->type, - SPEX_X (A), A->type, nz, Y->scale, A->scale, option)) ; + SPEX_X (A), A->type, nz, Y->scale, A->scale, option)); } @@ -99,7 +100,7 @@ SPEX_info spex_cast_matrix //-------------------------------------------------------------------------- (*Y_handle) = Y; - SPEX_CHECK (info) ; - return (SPEX_OK) ; + SPEX_CHECK (info); + return (SPEX_OK); } diff --git a/SPEX/SPEX_Utilities/Source/spex_colamd.c b/SPEX/SPEX_Utilities/Source/spex_colamd.c new file mode 100644 index 0000000000..ff9cfb27f1 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/spex_colamd.c @@ -0,0 +1,101 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + + +#define SPEX_FREE_ALL \ +{ \ + SPEX_FREE (perm); \ + SPEX_FREE (A2); \ +} + +#include "spex_util_internal.h" + +/* Purpose: SPEX interface to COLAMD + */ + +SPEX_info spex_colamd +( + int64_t **perm_handle, + int64_t *nnz, + const SPEX_matrix A, + const SPEX_options option +) +{ + + SPEX_info info; + (*nnz) = 0 ; + (*perm_handle) = NULL ; + int64_t *A2 = NULL, *perm = NULL ; + + int64_t anz; // Number of nonzeros in A + SPEX_CHECK (SPEX_matrix_nnz(&anz, A, option)); + int64_t i, n = A->n; + + int pr = SPEX_OPTION_PRINT_LEVEL(option); + + // Allocate memory for permutation + perm = (int64_t*)SPEX_malloc( (n+1)*sizeof(int64_t) ); + if (perm == NULL) + { + SPEX_FREE_ALL; + return (SPEX_OUT_OF_MEMORY); + } + + // determine workspace required for COLAMD + int64_t Alen = colamd_l_recommended (anz, n, n) + 2*n ; + A2 = (int64_t*) SPEX_malloc (Alen*sizeof(int64_t)); + if (!A2) + { + // out of memory + SPEX_FREE_ALL; + return (SPEX_OUT_OF_MEMORY); + } + + // Initialize S->p as per COLAMD documentation + for (i = 0; i < n+1; i++) + { + perm[i] = A->p[i]; + } + + // Initialize A2 per COLAMD documentation + for (i = 0; i < anz; i++) + { + A2[i] = A->i[i]; + } + + // find the colamd ordering + int64_t stats[COLAMD_STATS]; + int64_t colamd_result = colamd_l (n, n, Alen, A2, perm, + (double *) NULL, stats); + if (!colamd_result) + { + printf("fail\n"); + // COLAMD failed: matrix is invalid + SPEX_FREE_ALL; + return (SPEX_INCORRECT_INPUT); + } + + // very rough estimate for lnz and unz + (*nnz) = 10*anz; + + // Print stats if desired + if (pr > 0) + { + SPEX_PRINTF ("\n****Ordering Information****\n"); + colamd_l_report ((int64_t *) stats); + } + + // free workspace and return result + SPEX_FREE (A2); + (*perm_handle) = perm ; + return SPEX_OK; +} + diff --git a/SPEX/SPEX_Util/Source/spex_create_mpfr_array.c b/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c similarity index 60% rename from SPEX/SPEX_Util/Source/spex_create_mpfr_array.c rename to SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c index 72ba801111..7b737460fe 100644 --- a/SPEX/SPEX_Util/Source/spex_create_mpfr_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/spex_create_mpfr_array: create a dense mpfr array +// SPEX_Utilities/spex_create_mpfr_array: create a dense mpfr array //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -13,10 +14,10 @@ #include "spex_util_internal.h" -mpfr_t* spex_create_mpfr_array +mpfr_t *spex_create_mpfr_array ( - int64_t n, // size of the array - const SPEX_options *option // command options containing the prec for mpfr + int64_t n, // size of the array + const SPEX_options option // command options containing the prec for mpfr ) { @@ -25,23 +26,22 @@ mpfr_t* spex_create_mpfr_array //-------------------------------------------------------------------------- if (n <= 0) {return NULL;} - uint64_t prec = SPEX_OPTION_PREC (option) ; + uint64_t prec = SPEX_OPTION_PREC (option); + // paranoia: check prec here: cast to mprf_prec_t, and back, assert + // equality, if not equal then return SPEX_PANIC //-------------------------------------------------------------------------- - mpfr_t* x = (mpfr_t*) SPEX_calloc(n, sizeof(mpfr_t)); + mpfr_t *x = (mpfr_t*) SPEX_calloc(n, sizeof(mpfr_t)); if (!x) {return NULL;} for (int64_t i = 0; i < n; i++) { if (SPEX_mpfr_init2(x[i], prec) != SPEX_OK) { SPEX_MPFR_SET_NULL(x[i]); - for (int64_t j = 0; j < n; j++) + for (int64_t j = 0; j < i; j++) { - if ( x[j] != NULL) - { - SPEX_MPFR_CLEAR( x[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 0000000000..1571e204e2 --- /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_Util/Source/spex_create_mpq_array.c b/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c similarity index 70% rename from SPEX/SPEX_Util/Source/spex_create_mpq_array.c rename to SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c index 8e205f3cc3..4e28bc6944 100644 --- a/SPEX/SPEX_Util/Source/spex_create_mpq_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/spex_create_mpq_array: create a dense mpq array +// SPEX_Utilities/spex_create_mpq_array: create a dense mpq array //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -14,7 +15,7 @@ #include "spex_util_internal.h" -mpq_t* spex_create_mpq_array +mpq_t *spex_create_mpq_array ( int64_t n // size of the array ) @@ -28,8 +29,8 @@ mpq_t* spex_create_mpq_array //-------------------------------------------------------------------------- - // Malloc space - mpq_t* x = (mpq_t*) SPEX_calloc(n, sizeof(mpq_t)); + // calloc space + mpq_t *x = (mpq_t*) SPEX_calloc(n, sizeof(mpq_t)); if (!x) {return NULL;} for (int64_t i = 0; i < n; i++) { @@ -37,12 +38,9 @@ mpq_t* spex_create_mpq_array { // Out of memory SPEX_MPQ_SET_NULL(x[i]); - for (int64_t j = 0; j < n; j++) + for (int64_t j = 0; j < i; j++) { - if ( x[j] != NULL) - { - SPEX_MPQ_CLEAR( x[j]); - } + SPEX_MPQ_CLEAR( x[j]); } SPEX_FREE(x); return NULL; diff --git a/SPEX/SPEX_Util/Source/spex_create_mpz_array.c b/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c similarity index 56% rename from SPEX/SPEX_Util/Source/spex_create_mpz_array.c rename to SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c index a61cede806..1e87b38724 100644 --- a/SPEX/SPEX_Util/Source/spex_create_mpz_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/spex_create_mpz_array: create a dense mpz array +// SPEX_Utilities/spex_create_mpz_array: create a dense mpz array //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -14,7 +15,7 @@ #include "spex_util_internal.h" -mpz_t* spex_create_mpz_array +mpz_t *spex_create_mpz_array ( int64_t n // size of the array ) @@ -29,15 +30,24 @@ mpz_t* spex_create_mpz_array //-------------------------------------------------------------------------- // Malloc space - mpz_t* x = (mpz_t*) SPEX_calloc(n, sizeof(mpz_t)); + mpz_t *x = (mpz_t*) SPEX_calloc(n, sizeof(mpz_t)); if (!x) {return NULL;} for (int64_t i = 0; i < n; i++) { - if (SPEX_mpz_init(x[i]) != SPEX_OK) + #if __GNU_MP_RELEASE < 60200 + SPEX_info info = + #endif + SPEX_mpz_init (x [i]); + #if __GNU_MP_RELEASE < 60200 + if (info != SPEX_OK) { - // Out of memory + // 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 + // in SPEX/Tcov, when using GMP v6.2.0 or later. SPEX_MPZ_SET_NULL(x[i]); - for (int64_t j = 0; j < n; j++) + for (int64_t j = 0; j < i; j++) { if ( x[j] != NULL) { @@ -47,6 +57,7 @@ mpz_t* spex_create_mpz_array SPEX_FREE(x); return NULL; } + #endif } return x; } diff --git a/SPEX/SPEX_Util/Source/SPEX_cumsum.c b/SPEX/SPEX_Utilities/Source/spex_cumsum.c similarity index 73% rename from SPEX/SPEX_Util/Source/SPEX_cumsum.c rename to SPEX/SPEX_Utilities/Source/spex_cumsum.c index 72b4ff4b63..d7f8ccd887 100644 --- a/SPEX/SPEX_Util/Source/SPEX_cumsum.c +++ b/SPEX/SPEX_Utilities/Source/spex_cumsum.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_cumsum: cumulative sum +// SPEX_Utilities/spex_cumsum: cumulative sum //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -14,17 +15,18 @@ #include "spex_util_internal.h" -SPEX_info SPEX_cumsum +SPEX_info spex_cumsum ( int64_t *p, // vector to store the sum of c int64_t *c, // vector which is summed int64_t n // size of c ) { - if (!spex_initialized ( )) return (SPEX_PANIC) ; + + if (!spex_initialized ( )) return (SPEX_PANIC); if (!p || !c) return SPEX_INCORRECT_INPUT; - ASSERT(n >= 0); + ASSERT(n >= 0); int64_t i, nz = 0 ; for (i = 0 ; i < n ; i++) { diff --git a/SPEX/SPEX_Util/Source/spex_expand_double_array.c b/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c similarity index 55% rename from SPEX/SPEX_Util/Source/spex_expand_double_array.c rename to SPEX/SPEX_Utilities/Source/spex_expand_double_array.c index a14306b926..ce6de0d8dc 100644 --- a/SPEX/SPEX_Util/Source/spex_expand_double_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/spex_expand_double_array: convert double vector to mpz +// SPEX_Utilities/spex_expand_double_array: convert double vector to mpz //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -12,24 +13,26 @@ * mpz array of size n. To do this, the number is multiplied by an appropriate * power, then, the GCD is found. This function allows the use of matrices in * double precision to work with SPEX. - * */ -#define SPEX_FREE_ALL \ +#define SPEX_FREE_WORKSPACE \ SPEX_MPZ_CLEAR(gcd); \ SPEX_MPZ_CLEAR(one); \ SPEX_MPQ_CLEAR(temp); \ SPEX_matrix_free(&x3, NULL); \ +#define SPEX_FREE_ALL \ + SPEX_FREE_WORKSPACE \ + #include "spex_util_internal.h" SPEX_info spex_expand_double_array ( - mpz_t* x_out, // integral final array - double* x, // double array that needs to be made integral + mpz_t *x_out, // integral final array + double *x, // double array that needs to be made integral mpq_t scale, // the scaling factor used (x_out = scale * x) int64_t n, // size of x - const SPEX_options* option // Command options + const SPEX_options option // Command options ) { @@ -45,61 +48,72 @@ SPEX_info spex_expand_double_array int r1, r2 = 1; bool nz_found = false; SPEX_info info ; - // Machine epsilon is about 2e-16. We multiply by 10e16 to convert - // which is a slight overestimate to be safe but preserves the 16 decimal digits - // If more than 16 decimal digits are desired by the user, one should use the - // MPFR input which allows an arbitrary number of decimal digits. + + // Double precision accurate to about 2e-16. We multiply by 1e16 to convert + // Note that this conversion allows a number like 0.9 to be represented + // exactly fl(0.9) is not exact in double precision; in fact the exact + // conversion is fl(0.9) = 45000000000000001 / 50000000000000000. + // Multiplying by 1e16 gives the actual value of 9/10 when scaled. Note + // that if this type of conversion is not desired by the user it is + // suggested they first convert from double to MPFR then from MPFR to MPQ + // as that will be fully exact. + double expon = pow(10, 16); - // Quad precision in case input is huge - SPEX_matrix* x3 = NULL; + + // Convert the input x into a quad precision matrix. This is to handle the + // (rare) case that the user gives an input double which is close to + // 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); - mpfr_rnd_t round = SPEX_OPTION_ROUND (option) ; + mpfr_rnd_t round = SPEX_OPTION_ROUND (option); - SPEX_CHECK(SPEX_mpq_init(temp)); - SPEX_CHECK(SPEX_mpz_init(gcd)); - SPEX_CHECK(SPEX_mpz_init(one)); + SPEX_MPQ_INIT(temp); + SPEX_MPZ_INIT(gcd); + SPEX_MPZ_INIT(one); SPEX_CHECK (SPEX_matrix_allocate(&x3, SPEX_DENSE, SPEX_MPFR, n, 1, n, false, true, option)); - SPEX_CHECK(SPEX_mpq_set_d(scale, expon)); // scale = 10^16 + SPEX_MPQ_SET_D(scale, expon); // scale = 10^16 for (i = 0; i < n; i++) { - // Set x3[i] = x[i] - SPEX_CHECK(SPEX_mpfr_set_d(x3->x.mpfr[i], x[i], round)); + // x3[i] = x[i], cast double to MPFR + SPEX_MPFR_SET_D(x3->x.mpfr[i], x[i], round); - // x3[i] = x[i] * 10^16 - SPEX_CHECK(SPEX_mpfr_mul_d(x3->x.mpfr[i], x3->x.mpfr[i], expon, round)); + // x3[i] = x[i] * 10^16, multiply MPFR by 10^16 + SPEX_MPFR_MUL_D(x3->x.mpfr[i], x3->x.mpfr[i], expon, round); - // x_out[i] = x3[i] - SPEX_CHECK(SPEX_mpfr_get_z(x_out[i], x3->x.mpfr[i], round)); + // x_out[i] = x3[i], cast MPFR to integer truncating remaining decimal + // component + SPEX_MPFR_GET_Z(x_out[i], x3->x.mpfr[i], round); } //-------------------------------------------------------------------------- // Compute the GCD to reduce the size of scale //-------------------------------------------------------------------------- - SPEX_CHECK(SPEX_mpz_set_ui(one, 1)); + SPEX_MPZ_SET_UI(one, 1); // Find an initial GCD for (i = 0; i < n; i++) { if (!nz_found) { - SPEX_CHECK(SPEX_mpz_cmp_ui(&r1, x_out[i], 0)); // Check if x[i] == 0 + SPEX_MPZ_CMP_UI(&r1, x_out[i], 0); // Check if x[i] == 0 if (r1 != 0) { nz_found = true; k = i; - SPEX_CHECK(SPEX_mpz_set(gcd, x_out[i])); + SPEX_MPZ_SET(gcd, x_out[i]); } } else { // Compute the GCD, stop if gcd == 1 - SPEX_CHECK(SPEX_mpz_gcd(gcd, gcd, x_out[i])); - SPEX_CHECK(SPEX_mpz_cmp(&r2, gcd, one)); + SPEX_MPZ_GCD(gcd, gcd, x_out[i]); + SPEX_MPZ_CMP(&r2, gcd, one); if (r2 == 0) { break; @@ -122,12 +136,12 @@ SPEX_info spex_expand_double_array { for (i = k; i < n; i++) { - SPEX_CHECK(SPEX_mpz_divexact(x_out[i], x_out[i], gcd)); + SPEX_MPZ_DIVEXACT(x_out[i], x_out[i], gcd); } - SPEX_CHECK(SPEX_mpq_set_z(temp, gcd)); - SPEX_CHECK(SPEX_mpq_div(scale, scale, temp)); + SPEX_MPQ_SET_Z(temp, gcd); + SPEX_MPQ_DIV(scale, scale, temp); } - SPEX_FREE_ALL; + SPEX_FREE_WORKSPACE; return SPEX_OK; } diff --git a/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c b/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c new file mode 100644 index 0000000000..b3f06e2f9c --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c @@ -0,0 +1,135 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This function converts a mpfr array of size n and precision prec to + * an appropriate mpz array of size n. To do this, the number is multiplied by + * the appropriate power of 10 then the gcd is found. This function allows mpfr + * 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); + +#include "spex_util_internal.h" + +SPEX_info spex_expand_mpfr_array +( + mpz_t *x_out, // full precision mpz array + mpfr_t *x, // mpfr array to be expanded + mpq_t scale, // scaling factor used (x_out = scale*x) + int64_t n, // size of x + const SPEX_options option // command options containing the prec + // and rounding for mpfr +) +{ + + //-------------------------------------------------------------------------- + // Input has already been checked + //-------------------------------------------------------------------------- + ASSERT(n >= 0); + SPEX_info info ; + + //-------------------------------------------------------------------------- + // initializations + //-------------------------------------------------------------------------- + + int64_t i, k ; + int r1, r2 = 1 ; + 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_MPQ_INIT(temp); + SPEX_MPZ_INIT(gcd); + SPEX_MPZ_INIT(one); + + x_mpq = spex_create_mpq_array (n); + if (x_mpq == NULL) + { + SPEX_FREE_ALL; + return SPEX_OUT_OF_MEMORY; + } + + SPEX_CHECK(spex_cast_array(x_mpq, SPEX_MPQ, x , SPEX_MPFR,n, NULL, NULL, + option)); + SPEX_CHECK(spex_cast_array(x_out, SPEX_MPZ, x_mpq, SPEX_MPQ, n, scale, NULL, + option)); + + //-------------------------------------------------------------------------- + // Find the gcd to reduce scale + //-------------------------------------------------------------------------- + + SPEX_MPZ_SET_UI(one, 1); + // Find an initial GCD + for (i = 0; i < n; i++) + { + if (!nz_found) + { + SPEX_MPZ_CMP_UI(&r1, x_out[i], 0); + if (r1 != 0) + { + nz_found = true; + k = i; + SPEX_MPZ_SET(gcd, x_out[i]); + } + } + else + { + // Compute the GCD of the numbers, stop if gcd == 1 + SPEX_MPZ_GCD(gcd, gcd, x_out[i]); + SPEX_MPZ_CMP(&r2, gcd, one); + if (r2 == 0) + { + break; + } + } + } + + if (!nz_found) // Array is all zeros + { + SPEX_mpq_set_z(scale, one); + SPEX_FREE_ALL; + return SPEX_OK; + } + + //-------------------------------------------------------------------------- + // Scale all entries to make as small as possible + //-------------------------------------------------------------------------- + + if (r2 != 0) // If gcd == 1 stop + { + for (i = k; i < n; i++) + { + SPEX_MPZ_DIVEXACT(x_out[i],x_out[i],gcd); + } + SPEX_MPQ_SET_Z(temp,gcd); + SPEX_MPQ_DIV(scale,scale,temp); + } + SPEX_FREE_ALL; + return SPEX_OK; +} + diff --git a/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c b/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c new file mode 100644 index 0000000000..a7097fba2c --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c @@ -0,0 +1,56 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This function converts a mpq array of size n into an appropriate + * mpz array of size n. To do this, the lcm of the denominators is found as a + * scaling factor. This function allows mpq arrays to be used in SPEX. + */ + +#define SPEX_FREE_ALL \ + SPEX_MPZ_CLEAR(temp); + +#include "spex_util_internal.h" + +SPEX_info spex_expand_mpq_array +( + mpz_t *x_out, // mpz array, on output x_out = x*scale + mpq_t *x, // mpq array that needs to be converted + mpq_t scale, // scaling factor. x_out = scale*x + int64_t n, // size of x + const SPEX_options option // Command options +) +{ + + // inputs have checked in the only caller spex_cast_array + ASSERT(n >= 0); + SPEX_info info ; + mpz_t temp; + SPEX_MPZ_SET_NULL(temp); + SPEX_MPZ_INIT(temp); + + // Find LCM of denominators of x + SPEX_MPZ_SET(temp,SPEX_MPQ_DEN(x[0])); + for (int64_t i = 1; i < n; i++) + { + SPEX_MPZ_LCM(temp, SPEX_MPQ_DEN(x[i]), temp); + } + SPEX_MPQ_SET_Z(scale,temp); + + for (int64_t i = 0; i < n; i++) + { + // x_out[i] = x[i]*temp + SPEX_MPZ_DIVEXACT(x_out[i], temp, SPEX_MPQ_DEN(x[i])); + SPEX_MPZ_MUL(x_out[i], x_out[i], SPEX_MPQ_NUM(x[i])); + } + SPEX_FREE_ALL; + return SPEX_OK; +} + diff --git a/SPEX/SPEX_Utilities/Source/spex_gmp.h b/SPEX/SPEX_Utilities/Source/spex_gmp.h new file mode 100644 index 0000000000..3e684c51f0 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/spex_gmp.h @@ -0,0 +1,246 @@ +//------------------------------------------------------------------------------ +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +// These macros are used by SPEX_gmp.c to create wrapper functions around all +// GMP functions used by SPEX, to safely handle out-of-memory conditions. +// They are placed in this separate #include file so that a future developer +// can use them to construct their own wrappers around GMP functions. See +// SPEX_gmp.c for more details. + +#ifndef SPEX_GMP_H +#define SPEX_GMP_H + +#include "SPEX.h" + +//------------------------------------------------------------------------------ +// spex_gmp environment +//------------------------------------------------------------------------------ + +#include + +typedef struct +{ + jmp_buf environment ; // for setjmp and longjmp + 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 + int primary ; // 1 if created by SPEX_initialize; 0 for + // SPEX_thread_initialize +} spex_gmp_t ; + +#ifndef SPEX_GMP_LIST_INIT +// Initial size of the spex_gmp->list. A size of 32 ensures that the list +// never needs to be increased in size (at least in practice; it is possible +// that GMP or MPFR could exceed this size). The test coverage suite in +// SPEX/Tcov reduces this initial size to exercise the code, in +// SPEX/Tcov/Makefile. +#define SPEX_GMP_LIST_INIT 32 +#endif + +#ifdef SPEX_GMP_TEST_COVERAGE +// For testing only +void spex_set_gmp_ntrials (int64_t ntrials) ; +int64_t spex_get_gmp_ntrials (void) ; +#endif + +//------------------------------------------------------------------------------ +// SPEX GMP functions +//------------------------------------------------------------------------------ + +// uncomment this to print memory debugging info +// #define SPEX_GMP_MEMORY_DEBUG + +int spex_gmp_initialize (int primary) ; + +void spex_gmp_finalize (int primary) ; + +spex_gmp_t *spex_gmp_get (void) ; + +void *spex_gmp_allocate (size_t size) ; + +void spex_gmp_free (void *p, size_t size) ; + +void *spex_gmp_reallocate (void *p_old, size_t old_size, size_t new_size ); + +#ifdef SPEX_GMP_MEMORY_DEBUG +void spex_gmp_dump ( void ) ; +#endif + +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------------------------ +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +// GMP/MPFR wrapper macros that already incorporate the SPEX_CHECK macro, which +// is use to prevent segmentation faults in case gmp runs out of memory inside +// a gmp call. +//------------------------------------------------------------------------------ + +#define SPEX_MPZ_INIT(x) SPEX_CHECK( SPEX_mpz_init (x) ) +#define SPEX_MPZ_INIT2(x,size) SPEX_CHECK( SPEX_mpz_init2 (x,size) ) +#define SPEX_MPZ_SET(x,y) SPEX_CHECK( SPEX_mpz_set (x,y) ) +#define SPEX_MPZ_SET_UI(x,y) SPEX_CHECK( SPEX_mpz_set_ui (x,y) ) +#define SPEX_MPZ_SET_SI(x,y) SPEX_CHECK( SPEX_mpz_set_si (x,y) ) +#define SPEX_MPZ_SET_D(x,y) SPEX_CHECK( SPEX_mpz_set_d (x,y) ) +#define SPEX_MPZ_GET_D(x,y) SPEX_CHECK( SPEX_mpz_get_d (x,y) ) +#define SPEX_MPZ_GET_SI(x,y) SPEX_CHECK( SPEX_mpz_get_si (x,y) ) +#define SPEX_MPZ_MUL(a,b,c) SPEX_CHECK( SPEX_mpz_mul (a,b,c) ) +#define SPEX_MPZ_ADDMUL(x,y,z) SPEX_CHECK( SPEX_mpz_addmul (x,y,z) ) +#define SPEX_MPZ_SUB(x,y,z) SPEX_CHECK( SPEX_mpz_sub (x,y,z) ) +#define SPEX_MPZ_SUBMUL(x,y,z) SPEX_CHECK( SPEX_mpz_submul (x,y,z) ) +#define SPEX_MPZ_CDIV_QR(q,r,n,d) SPEX_CHECK( SPEX_mpz_cdiv_qr (q,r,n,d) ) +#define SPEX_MPZ_DIVEXACT(x,y,z) SPEX_CHECK( SPEX_mpz_divexact (x,y,z) ) +#define SPEX_MPZ_GCD(x,y,z) SPEX_CHECK( SPEX_mpz_gcd (x,y,z) ) +#define SPEX_MPZ_LCM(lcm,x,y) SPEX_CHECK( SPEX_mpz_lcm (lcm,x,y) ) +#define SPEX_MPZ_NEG(x,y) SPEX_CHECK( SPEX_mpz_neg (x,y) ) +#define SPEX_MPZ_ABS(x,y) SPEX_CHECK( SPEX_mpz_abs (x,y) ) +#define SPEX_MPZ_CMP(r,x,y) SPEX_CHECK( SPEX_mpz_cmp (r,x,y) ) +#define SPEX_MPZ_CMPABS(r,x,y) SPEX_CHECK( SPEX_mpz_cmpabs (r,x,y) ) +#define SPEX_MPZ_CMP_UI(r,x,y) SPEX_CHECK( SPEX_mpz_cmp_ui (r,x,y) ) +#define SPEX_MPZ_SGN(sgn,x) SPEX_CHECK( SPEX_mpz_sgn (sgn,x) ) +#define SPEX_MPZ_SIZEINBASE(size,x,base) SPEX_CHECK( SPEX_mpz_sizeinbase (size,x,base) ) +#define SPEX_MPQ_INIT(x) SPEX_CHECK( SPEX_mpq_init (x) ) +#define SPEX_MPQ_SET(x,y) SPEX_CHECK( SPEX_mpq_set (x,y) ) +#define SPEX_MPQ_SET_Z(x,y) SPEX_CHECK( SPEX_mpq_set_z (x,y) ) +#define SPEX_MPQ_SET_D(x,y) SPEX_CHECK( SPEX_mpq_set_d (x,y) ) +#define SPEX_MPQ_SET_UI(x,y,z) SPEX_CHECK( SPEX_mpq_set_ui (x,y,z) ) +#define SPEX_MPQ_SET_SI(x,y,z) SPEX_CHECK( SPEX_mpq_set_si (x,y,z) ) +#define SPEX_MPQ_SET_NUM(x,y) SPEX_CHECK( SPEX_mpq_set_num (x,y) ) +#define SPEX_MPQ_SET_DEN(x,y) SPEX_CHECK( SPEX_mpq_set_den (x,y) ) +#define SPEX_MPQ_GET_DEN(x,y) SPEX_CHECK( SPEX_mpq_get_den (x,y) ) +#define SPEX_MPQ_GET_D(x,y) SPEX_CHECK( SPEX_mpq_get_d (x,y) ) +#define SPEX_MPQ_SWAP(x,y) SPEX_CHECK( SPEX_mpq_swap (x,y) ) +#define SPEX_MPQ_NEG(x,y) SPEX_CHECK( SPEX_mpq_neg (x,y) ) +#define SPEX_MPQ_ABS(x,y) SPEX_CHECK( SPEX_mpq_abs (x,y) ) +#define SPEX_MPQ_ADD(x,y,z) SPEX_CHECK( SPEX_mpq_add (x,y,z) ) +#define SPEX_MPQ_MUL(x,y,z) SPEX_CHECK( SPEX_mpq_mul (x,y,z) ) +#define SPEX_MPQ_DIV(x,y,z) SPEX_CHECK( SPEX_mpq_div (x,y,z) ) +#define SPEX_MPQ_CMP(r,x,y) SPEX_CHECK( SPEX_mpq_cmp (r,x,y) ) +#define SPEX_MPQ_CMP_UI(r,x,num,den) SPEX_CHECK( SPEX_mpq_cmp_ui (r,x,num,den) ) +#define SPEX_MPQ_CMP_Z(r,x,y) SPEX_CHECK( SPEX_mpq_cmp_z (r,x,y) ) +#define SPEX_MPQ_EQUAL(r,x,y) SPEX_CHECK( SPEX_mpq_equal (r,x,y) ) +#define SPEX_MPQ_SGN(sgn,x) SPEX_CHECK( SPEX_mpq_sgn (sgn,x) ) +#define SPEX_MPFR_INIT2(x,size) SPEX_CHECK( SPEX_mpfr_init2 (x,size) ) +#define SPEX_MPFR_SET(x,y,rnd) SPEX_CHECK( SPEX_mpfr_set (x,y,rnd) ) +#define SPEX_MPFR_SET_D(x,y,rnd) SPEX_CHECK( SPEX_mpfr_set_d (x,y,rnd) ) +#define SPEX_MPFR_SET_SI(x,y,rnd) SPEX_CHECK( SPEX_mpfr_set_si (x,y,rnd) ) +#define SPEX_MPFR_SET_Q(x,y,rnd) SPEX_CHECK( SPEX_mpfr_set_q (x,y,rnd) ) +#define SPEX_MPFR_SET_Z(x,y,rnd) SPEX_CHECK( SPEX_mpfr_set_z (x,y,rnd) ) +#define SPEX_MPFR_GET_Z(x,y,rnd) SPEX_CHECK( SPEX_mpfr_get_z (x,y,rnd) ) +#define SPEX_MPFR_GET_Q(x,y,rnd) SPEX_CHECK( SPEX_mpfr_get_q (x,y,rnd) ) +#define SPEX_MPFR_GET_D(x,y,rnd) SPEX_CHECK( SPEX_mpfr_get_d (x,y,rnd) ) +#define SPEX_MPFR_GET_SI(x,y,rnd) SPEX_CHECK( SPEX_mpfr_get_si (x,y,rnd) ) +#define SPEX_MPFR_MUL(x,y,z,rnd) SPEX_CHECK( SPEX_mpfr_mul (x,y,z,rnd) ) +#define SPEX_MPFR_MUL_D(x,y,z,rnd) SPEX_CHECK( SPEX_mpfr_mul_d (x,y,z,rnd) ) +#define SPEX_MPFR_DIV_D(x,y,z,rnd) SPEX_CHECK( SPEX_mpfr_div_d (x,y,z,rnd) ) +#define SPEX_MPFR_UI_POW_UI(x,y,z,rnd) SPEX_CHECK( SPEX_mpfr_ui_pow_ui (x,y,z,rnd) ) +#define SPEX_MPFR_LOG2(x,y,rnd) SPEX_CHECK( SPEX_mpfr_log2 (x,y,rnd) ) +#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_Util/Source/SPEX_matrix_mul.c b/SPEX/SPEX_Utilities/Source/spex_matrix_mul.c similarity index 66% rename from SPEX/SPEX_Util/Source/SPEX_matrix_mul.c rename to SPEX/SPEX_Utilities/Source/spex_matrix_mul.c index 801ac85f72..bb7ba8a0c0 100644 --- a/SPEX/SPEX_Util/Source/SPEX_matrix_mul.c +++ b/SPEX/SPEX_Utilities/Source/spex_matrix_mul.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/SPEX_matrix_mul: multiplies a matrix by a scalar +// SPEX_Utilities/spex_matrix_mul: multiplies a MPZ matrix by a scalar //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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,35 +17,36 @@ #include "spex_util_internal.h" -SPEX_info SPEX_matrix_mul // multiplies x by a scalar +SPEX_info spex_matrix_mul // multiplies x by a scalar ( - SPEX_matrix *x, // matrix to be multiplied + SPEX_matrix x, // matrix to be multiplied const mpz_t scalar // scalar to multiply by ) { - if (!spex_initialized ( )) return (SPEX_PANIC) ; //-------------------------------------------------------------------------- // check inputs //-------------------------------------------------------------------------- + if (!spex_initialized ( )) return (SPEX_PANIC); SPEX_info info ; - SPEX_REQUIRE_TYPE (x, SPEX_MPZ) ; + SPEX_REQUIRE_TYPE (x, SPEX_MPZ); + //-------------------------------------------------------------------------- // x = x * scalar //-------------------------------------------------------------------------- int64_t nz; - info = SPEX_matrix_nnz (&nz, x, NULL) ; + info = SPEX_matrix_nnz (&nz, x, NULL); if (info != SPEX_OK) {return info;} for (int64_t i = 0; i < nz; i++) { // x[i] = x[i]*scalar - SPEX_CHECK( SPEX_mpz_mul( x->x.mpz[i], x->x.mpz[i], scalar)); + SPEX_MPZ_MUL( x->x.mpz[i], x->x.mpz[i], scalar); } - return (SPEX_OK) ; + return (SPEX_OK); } diff --git a/SPEX/SPEX_Utilities/Source/spex_permute_dense_matrix.c b/SPEX/SPEX_Utilities/Source/spex_permute_dense_matrix.c new file mode 100644 index 0000000000..0e886696a4 --- /dev/null +++ b/SPEX/SPEX_Utilities/Source/spex_permute_dense_matrix.c @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// SPEX_Utilities/spex_permute_dense_matrix: permute rows of a dense matrix A, +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//------------------------------------------------------------------------------ + +/* Purpose: This function gets a copy of a row-wise permuted dense matrix as + * A_out = P*A_in. + */ + +#define SPEX_FREE_ALL \ + SPEX_matrix_free (&Atmp, NULL); + +#include "spex_util_internal.h" + +SPEX_info spex_permute_dense_matrix +( + SPEX_matrix *A_handle, // permuted A + const SPEX_matrix A_in, // unpermuted A (not modified) + const int64_t *P, // row permutation + const SPEX_options option +) +{ + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + SPEX_info info ; + SPEX_REQUIRE (A_in, SPEX_DENSE, SPEX_MPZ); + + if (A_handle == NULL || !P) {return SPEX_INCORRECT_INPUT;} + (*A_handle) = NULL ; + + //-------------------------------------------------------------------------- + // b(pinv) = b2 + //-------------------------------------------------------------------------- + + int64_t m = A_in->m ; + int64_t n = A_in->n ; + + // allocate x + SPEX_matrix Atmp = NULL ; + SPEX_CHECK (SPEX_matrix_allocate (&Atmp, SPEX_DENSE, SPEX_MPZ, m, n, + 0, false, true, option)); + + // Set Atmp = P*A + for (int64_t i = 0 ; i < m ; i++) + { + for (int64_t j = 0 ; j < n ; j++) + { + SPEX_MPZ_SET(SPEX_2D(Atmp, P[i], j, mpz), + SPEX_2D(A_in, i , j, mpz)); + } + } + + //-------------------------------------------------------------------------- + // return result + //-------------------------------------------------------------------------- + + (*A_handle) = Atmp ; + return SPEX_OK; +} + diff --git a/SPEX/SPEX_Util/Source/spex_sparse_collapse.c b/SPEX/SPEX_Utilities/Source/spex_sparse_collapse.c similarity index 81% rename from SPEX/SPEX_Util/Source/spex_sparse_collapse.c rename to SPEX/SPEX_Utilities/Source/spex_sparse_collapse.c index d5fc43d2d2..3754bf6d92 100644 --- a/SPEX/SPEX_Util/Source/spex_sparse_collapse.c +++ b/SPEX/SPEX_Utilities/Source/spex_sparse_collapse.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/spex_sparse_collapse: shrink space required by a CSC mpz matrix +// SPEX_Utilities/spex_sparse_collapse: shrink space required by CSC mpz matrix //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -19,7 +20,7 @@ SPEX_info spex_sparse_collapse ( - SPEX_matrix* A // matrix to be shrunk + SPEX_matrix A // matrix to be shrunk ) { @@ -27,7 +28,7 @@ SPEX_info spex_sparse_collapse // check inputs //-------------------------------------------------------------------------- - SPEX_REQUIRE (A, SPEX_CSC, SPEX_MPZ) ; + SPEX_REQUIRE (A, SPEX_CSC, SPEX_MPZ); //-------------------------------------------------------------------------- @@ -40,14 +41,14 @@ SPEX_info spex_sparse_collapse bool ok ; A->i = (int64_t *) - SPEX_realloc (anz, A->nzmax, sizeof (int64_t), A->i, &ok) ; + SPEX_realloc (anz, A->nzmax, sizeof (int64_t), A->i, &ok); if (!ok) {return SPEX_OUT_OF_MEMORY;} A->x.mpz = (mpz_t *) - SPEX_realloc (anz, A->nzmax, sizeof (mpz_t), A->x.mpz, &ok) ; + SPEX_realloc (anz, A->nzmax, sizeof (mpz_t), A->x.mpz, &ok); if (!ok) {return SPEX_OUT_OF_MEMORY;} A->nzmax = anz ; - return (SPEX_OK) ; + return (SPEX_OK); } diff --git a/SPEX/SPEX_Util/Source/spex_sparse_realloc.c b/SPEX/SPEX_Utilities/Source/spex_sparse_realloc.c similarity index 78% rename from SPEX/SPEX_Util/Source/spex_sparse_realloc.c rename to SPEX/SPEX_Utilities/Source/spex_sparse_realloc.c index 6d003fbf0a..0607a5cd6e 100644 --- a/SPEX/SPEX_Util/Source/spex_sparse_realloc.c +++ b/SPEX/SPEX_Utilities/Source/spex_sparse_realloc.c @@ -1,9 +1,10 @@ //------------------------------------------------------------------------------ -// SPEX_Util/spex_sparse_realloc: double the space for a sparse mpz matrix +// SPEX_Utilities/spex_sparse_realloc: double the space for a sparse mpz matrix //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ @@ -18,7 +19,7 @@ SPEX_info spex_sparse_realloc ( - SPEX_matrix* A // the matrix to be expanded + SPEX_matrix A // the matrix to be expanded ) { @@ -26,7 +27,7 @@ SPEX_info spex_sparse_realloc // check inputs //-------------------------------------------------------------------------- - SPEX_REQUIRE (A, SPEX_CSC, SPEX_MPZ) ; + SPEX_REQUIRE (A, SPEX_CSC, SPEX_MPZ); //-------------------------------------------------------------------------- // double the size of A->x and A->i @@ -36,12 +37,12 @@ SPEX_info spex_sparse_realloc bool okx, oki ; A->x.mpz = (mpz_t *) - SPEX_realloc (2*nzmax, nzmax, sizeof (mpz_t), A->x.mpz, &okx) ; + SPEX_realloc (2*nzmax, nzmax, sizeof (mpz_t), A->x.mpz, &okx); A->i = (int64_t *) - SPEX_realloc (2*nzmax, nzmax, sizeof (int64_t), A->i, &oki) ; + SPEX_realloc (2*nzmax, nzmax, sizeof (int64_t), A->i, &oki); if (!oki || !okx) { - return (SPEX_OUT_OF_MEMORY) ; + return (SPEX_OUT_OF_MEMORY); } A->nzmax = 2*nzmax ; @@ -52,9 +53,9 @@ SPEX_info spex_sparse_realloc for (int64_t p = nzmax ; p < 2*nzmax ; p++) { - SPEX_MPZ_SET_NULL (A->x.mpz [p]) ; + SPEX_MPZ_SET_NULL (A->x.mpz [p]); } - return (SPEX_OK) ; + return (SPEX_OK); } diff --git a/SPEX/SPEX_Util/Source/spex_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h similarity index 57% rename from SPEX/SPEX_Util/Source/spex_util_internal.h rename to SPEX/SPEX_Utilities/Source/spex_util_internal.h index 7fe654e93d..8bbc742928 100644 --- a/SPEX/SPEX_Util/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -1,15 +1,16 @@ //------------------------------------------------------------------------------ -// SPEX_Util/spex_util_internal: include file for internal use in SPEX_Utility functions +// SPEX_Utilities/spex_util_internal: include file for internal use in SPEX_Utility functions //------------------------------------------------------------------------------ -// SPEX_Util: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 //------------------------------------------------------------------------------ // This file is not intended to be #include'd in user applications. Use -// SPEX_Util.h instead. +// SPEX.h instead. #ifndef SPEX_UTIL_INTERNAL_H #define SPEX_UTIL_INTERNAL_H @@ -32,6 +33,12 @@ #include #include +// user-callable functions +#include "SPEX.h" + +// SPEX interface to GMP and MPFR +#include "spex_gmp.h" + // SuiteSparse headers #include "SuiteSparse_config.h" #include "colamd.h" @@ -41,31 +48,42 @@ // debugging //------------------------------------------------------------------------------ -#ifdef SPEX_DEBUG +#undef SPEX_DEBUG +// uncomment this line to enable debugging +// #define SPEX_DEBUG -#ifdef MATLAB_MEX_FILE +#ifdef SPEX_DEBUG -#define ASSERT(x) \ -{ \ - if (!(x)) \ - { \ - mexErrMsgTxt ("assertion failed: %s line %d\n", __FILE__, __LINE__) ; \ - } \ -} + // debugging enabled + #ifdef MATLAB_MEX_FILE + // debuging enabled for MATLAB interface + #define ASSERT(x) \ + { \ + if (!(x)) \ + { \ + mexErrMsgTxt ("assertion failed: %s line %d\n", \ + __FILE__, __LINE__) ; \ + } \ + } + #else + // debuging enabled for C library + #include + #define ASSERT(x) assert (x) + #endif #else -#include -#define ASSERT(x) assert (x) + // debugging disabled + #define ASSERT(x) #endif -#else - -// debugging disabled -#define ASSERT(x) - -#endif +#undef GOTCHA +#define GOTCHA \ +{ \ + printf ("GOTCHA: %s, line %d\n", __FILE__, __LINE__) ; \ + abort ( ) ; \ +} //------------------------------------------------------------------------------ //-------------------------Common Macros---------------------------------------- @@ -90,22 +108,75 @@ // frees all workspace if an error occurs. The method can be a scalar as well, // so that SPEX_CHECK(info) works. -// the default is to free nothing +// To create a SPEX_FREE_WORKSPACE and SPEX_FREE_ALL, use this approach: + +/* + #define SPEX_FREE_WORKSPACE \ + { \ + free all workspace \ + } + #define SPEX_FREE_ALL \ + { \ + SPEX_FREE_WORKSPACE ; \ + free all output objects \ + } + #include "this file.h" +*/ + +// then, since SPEX_FREE_ALL is already defined, it isn't #defined below. +// +// Definitions of these macros: +// +// SPEX_FREE_ALL: frees everything, including both workspace and the result +// SPEX_FREE_WORKSPACE: frees just the internal workspace of the method, not +// the final result + +// SPEX_FREE_ALL: Frees workspace and memory that would be returned. Only used +// when there is an error and we need to cleanly close things (like out of +// memory conditions and failed SPEX_CHECK) + #ifndef SPEX_FREE_ALL #define SPEX_FREE_ALL #endif -#define SPEX_CHECK(method) \ -{ \ - info = (method) ; \ - if (info != SPEX_OK) \ - { \ - SPEX_FREE_ALL ; \ - return (info) ; \ - } \ -} +// SPEX_FREE_WORKSPACE: Frees all workspace (but not memory that was allocated +// and meant to be returned). Used usually at the end of the function. This +// workspace mechanism should be used even if the function only has one +// workspace variable (it can be risky otherwise with further development) -#include "SPEX.h" +#ifndef SPEX_FREE_WORKSPACE +#define SPEX_FREE_WORKSPACE +#endif + +// 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); \ + } \ + } + +#else + + #define SPEX_CHECK(method) \ + { \ + info = (method); \ + if (info != SPEX_OK) \ + { \ + SPEX_FREE_ALL; \ + return (info); \ + } \ + } + +#endif #if !defined (SUITESPARSE_VERSION) || \ (SUITESPARSE_VERSION < SUITESPARSE_VER_CODE(7,5)) @@ -124,17 +195,17 @@ // printing control //------------------------------------------------------------------------------ -// SPEX uses the SuiteSparse_config printf_func instead of a mere call to -// printf (the default function is printf, or mexPrintf when in MATLAB). If -// this function pointer is NULL, no printing is done. +// SPEX uses SuiteSparse_config.printf_func instead of a mere call to printf +// (the default function is printf, or mexPrintf when in MATLAB). If this +// function pointer is NULL, no printing is done. #define SPEX_PRINTF(...) \ { \ - int (*printf_func) (const char *, ...) ; \ - printf_func = SuiteSparse_config_printf_func_get ( ) ; \ - if (printf_func != NULL) \ + int (*prfunc)(const char *, ...); \ + prfunc = SuiteSparse_config_printf_func_get( ); \ + if (prfunc != NULL) \ { \ - (void) (printf_func) (__VA_ARGS__) ; \ + prfunc(__VA_ARGS__); \ } \ } @@ -142,40 +213,13 @@ #define SPEX_PR2(...) { if (pr >= 2) SPEX_PRINTF (__VA_ARGS__) } #define SPEX_PR3(...) { if (pr >= 3) SPEX_PRINTF (__VA_ARGS__) } + + //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -//-------------------------functions for GMP wrapper---------------------------- +//----------------------------------------------------- //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// uncomment this to print memory debugging info -// #define SPEX_GMP_MEMORY_DEBUG - -#ifdef SPEX_GMP_MEMORY_DEBUG -void spex_gmp_dump ( void ) ; -#endif - -extern int64_t spex_gmp_ntrials ; - -#ifndef SPEX_GMP_LIST_INIT -// A size of 32 ensures that the list never needs to be increased in size. -// The test coverage suite in SPEX_Left_LU/Tcov reduces this initial size to -// exercise the code, in SPEX_Left_LU/Tcov/Makefile. -#define SPEX_GMP_LIST_INIT 32 -#endif - - -bool spex_gmp_init (void) ; - -void spex_gmp_finalize (void) ; - -void *spex_gmp_allocate (size_t size) ; - -void spex_gmp_free (void *p, size_t size) ; - -void *spex_gmp_reallocate (void *p_old, size_t old_size, size_t new_size ); - -void spex_gmp_failure (int status) ; - // Tolerance used in the pivoting schemes. This number can be anything in // between 0 and 1. A value of 0 selects the diagonal element exclusively and a @@ -183,9 +227,6 @@ void spex_gmp_failure (int status) ; // tolerance pivoting based method #define SPEX_DEFAULT_TOL 1 -// Check parameter. If this = 1 then the solution to the system is checked -// for accuracy -#define SPEX_DEFAULT_CHECK false // Pivoting scheme used for SPEX Left LU. // SPEX_SMALLEST = 0, Smallest pivot @@ -197,10 +238,11 @@ void spex_gmp_failure (int status) ; #define SPEX_DEFAULT_PIVOT SPEX_SMALLEST // Column ordering used. -// SPEX_NO_ORDERING = 0, None: Not recommended for sparse matrices -// SPEX_COLAMD = 1, COLAMD: Default -// SPEX_AMD = 2 AMD -#define SPEX_DEFAULT_ORDER SPEX_COLAMD +// SPEX_DEFAULT_ORDERING = 0, COLAMD for LU, AMD for Cholesky +// SPEX_NO_ORDERING = 1, None: Not recommended for sparse matrices +// SPEX_COLAMD = 2, COLAMD +// SPEX_AMD = 3 AMD +#define SPEX_DEFAULT_ORDER SPEX_DEFAULT // Defines printing to be done #define SPEX_DEFAULT_PRINT_LEVEL 0 @@ -208,6 +250,15 @@ void spex_gmp_failure (int status) ; // MPFR precision used (quad is default) #define SPEX_DEFAULT_PRECISION 128 +// Defines the algorithm used +// SPEX_DEFAULT = 0, Defaults: Left for LU, Up for Chol, Gram for QR looking +// LU factorization +// SPEX_LU_LEFT = 1, Left looking LU factorization +// SPEX_CHOL_LEFT = 2, Left looking Cholesky factorization +// SPEX_CHOL_UP = 3, Up looking Cholesky factorization +// SPEX_QR_GRAM = 4 Default factorization for QR +#define SPEX_DEFAULT_ALGORITHM SPEX_DEFAULT + //------------------------------------------------------------------------------ // Type of MPFR rounding used. //------------------------------------------------------------------------------ @@ -236,9 +287,6 @@ void spex_gmp_failure (int status) ; #define SPEX_OPTION_TOL(option) \ SPEX_OPTION (option, tol, SPEX_DEFAULT_TOL) -#define SPEX_OPTION_CHECK(option) \ - SPEX_OPTION (option, check, false) - #define SPEX_OPTION_PIVOT(option) \ SPEX_OPTION (option, pivot, SPEX_DEFAULT_PIVOT) @@ -254,88 +302,9 @@ void spex_gmp_failure (int status) ; #define SPEX_OPTION_ROUND(option) \ SPEX_OPTION (option, round, SPEX_DEFAULT_MPFR_ROUND) -//------------------------------------------------------------------------------ -// 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_OPTION_ALGORITHM(option) \ + SPEX_OPTION (option, algo, SPEX_DEFAULT_ALGORITHM) -#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); \ - } \ -} // ============================================================================ @@ -348,31 +317,43 @@ void spex_set_initialized (bool s) ; // set global initialzed flag to s //------------------------------------------------------------------------------ -// mpfr_vector: a 1D mpfr_t array +// spex_create_mpfr_array: create a 1D mpfr_t array //------------------------------------------------------------------------------ // Creates a simple 1D array, where A[i] is an entry of type mpfr_t. /* Purpose: This function creates a MPFR array of desired precision*/ -mpfr_t* spex_create_mpfr_array + +mpfr_t *spex_create_mpfr_array ( - int64_t n, // size of the array - const SPEX_options* option -); + int64_t n, // size of the array + const SPEX_options option // command options containing the prec for mpfr +) ; + +//------------------------------------------------------------------------------ +// spex_create_mpq_array: Creates a 1D array, whose entries are all mpq_t type. +//------------------------------------------------------------------------------ // Creates a simple 1D array, where A[i] is an entry of type mpq_t. /* Purpose: This function creates an mpq array of size n. * This function must be called for all mpq arrays created. */ -mpq_t* spex_create_mpq_array + +mpq_t *spex_create_mpq_array ( int64_t n // size of the array -); +) ; +// Create and initialize a single mpq_t variable + +SPEX_info spex_create_mpq +( + mpq_t x // mpq_t entry to be initialized +) ; //------------------------------------------------------------------------------ -// mpz_vector: a 1D mpz_t array +// spex_create_mpz_array: create a 1D mpz_t array //------------------------------------------------------------------------------ // Creates a simple 1D array, where A[i] is an entry of type mpz_t. @@ -380,52 +361,71 @@ mpq_t* spex_create_mpq_array /* Purpose: This function creates an mpz array of size n and allocates * default size. */ -mpz_t* spex_create_mpz_array + +mpz_t *spex_create_mpz_array ( - int64_t n // Size of x -); + int64_t n // size of the array +) ; + +//------------------------------------------------------------------------------ +// spex_delete_mpz_array: delete a 1D mpz_t array +//------------------------------------------------------------------------------ +// Delete a simple 1D array, where A[i] is an entry of type mpz_t. + +/* Purpose: This function deletes a mpz array of size n + */ + +void spex_delete_mpz_array +( + mpz_t **x, // mpz array to be deleted + int64_t n // Size of x +) ; /* 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 * to work with SPEX. */ + SPEX_info spex_expand_double_array ( - mpz_t *x_out, // integral final array - double* x, // double array that needs to be made integral - mpq_t scale, // the scaling factor used (x_out = scale * x) - int64_t n, // size of x - const SPEX_options* option -); + mpz_t *x_out, // integral final array + double *x, // double array that needs to be made integral + mpq_t scale, // the scaling factor used (x_out = scale * x) + int64_t n, // size of x + const SPEX_options option // Command options +) ; /* Purpose: This function converts a mpfr array of size n and precision prec to * an appropriate mpz array of size n. To do this, the number is multiplied by * the appropriate power of 10 then the gcd is found. This function allows mpfr * arrays to be used within SPEX. */ + SPEX_info spex_expand_mpfr_array ( - mpz_t *x_out, // integral final array - mpfr_t* x, // mpfr array to be expanded - mpq_t scale, // scaling factor used (x_out = scale*x) - int64_t n, // size of x - const SPEX_options *option // command options containing the prec for mpfr -); + mpz_t *x_out, // full precision mpz array + mpfr_t *x, // mpfr array to be expanded + mpq_t scale, // scaling factor used (x_out = scale*x) + int64_t n, // size of x + const SPEX_options option // command options containing the prec + // and rounding for mpfr +) ; /* Purpose: This function converts a mpq array of size n into an appropriate mpz * array of size n. To do this, the lcm of the denominators is found as a * scaling factor. This function allows mpq arrays to be used in SPEX */ + SPEX_info spex_expand_mpq_array ( - mpz_t *x_out, // integral final array - mpq_t* x, // mpq array that needs to be converted - mpq_t scale, // scaling factor. x_out = scale*x - int64_t n, // size of x - const SPEX_options* option // Command options -); + mpz_t *x_out, // mpz array, on output x_out = x*scale + mpq_t *x, // mpq array that needs to be converted + mpq_t scale, // scaling factor. x_out = scale*x + int64_t n, // size of x + const SPEX_options option // Command options +) ; /* Purpose: This function converts a mpq matrix of size m*n into an appropriate * mpz matrix of size m*n. To do this, the lcm of the denominators is found as a @@ -470,36 +470,89 @@ SPEX_info spex_cast_array void *X, // input array, of size n SPEX_type xtype, // type of X int64_t n, // size of Y and X - mpq_t y_scale, // scale factor applied if y is mpz_t - mpq_t x_scale, // scale factor applied if x is mpz_t - const SPEX_options *option + mpq_t y_scale, // scale factor applied if Y is mpz_t + const mpq_t x_scale, // scale factor applied if x is mpz_t + const SPEX_options option // Command options. If NULL, use defaults ) ; SPEX_info spex_cast_matrix ( - SPEX_matrix **Y_handle, // nz-by-1 dense matrix to create + SPEX_matrix *Y_handle, // nz-by-1 dense matrix to create SPEX_type Y_type, // type of Y - SPEX_matrix *A, // matrix with nz entries - const SPEX_options *option + const SPEX_matrix A, // matrix with nz entries + const SPEX_options option // Command options, if NULL defaults are used ) ; + + /* Purpose: This function collapses a SPEX matrix. Essentially it shrinks the * size of x and i. so that they only take up the number of elements in the * matrix. For example if A->nzmax = 1000 but nnz(A) = 500, i and x are of size * 1000, so this function shrinks them to size 500. */ + SPEX_info spex_sparse_collapse ( - SPEX_matrix* A // matrix to be shrunk -); + SPEX_matrix A // matrix to be shrunk +) ; /* Purpose: This function expands a SPEX matrix by doubling its size. It * merely expands x and i and does not initialize/allocate the values. */ + SPEX_info spex_sparse_realloc ( - SPEX_matrix* A // the matrix to be expanded -); + SPEX_matrix A // the matrix to be expanded +) ; + +/* Purpose: This function gets a copy of a row-wise permuted dense matrix as + * A_out = P*A_in. + */ + +SPEX_info spex_permute_dense_matrix +( + SPEX_matrix *A_handle, // permuted A + const SPEX_matrix A_in, // unpermuted A (not modified) + const int64_t *P, // row permutation + const SPEX_options option +) ; + +/* Purpose: This function multiplies matrix x a scalar + */ + +SPEX_info spex_matrix_mul // multiplies x by a scalar +( + SPEX_matrix x, // matrix to be multiplied + const mpz_t scalar // scalar to multiply by +) ; + +/* Purpose: p [0..n] = cumulative sum of c [0..n-1], and then copy p [0..n-1] + * into c. This function is lightly modified from CSparse. + */ + +SPEX_info spex_cumsum +( + int64_t *p, // vector to store the sum of c + int64_t *c, // vector which is summed + int64_t n // size of c +) ; + + +SPEX_info spex_colamd +( + int64_t **perm_handle, + int64_t *nnz, + const SPEX_matrix A, + const SPEX_options option +) ; + +SPEX_info spex_amd +( + int64_t **perm_handle, + int64_t *nnz, + const SPEX_matrix A, + const SPEX_options option +) ; // (void *) pointer to the values of A. A must be non-NULL with a valid type #define SPEX_X(A) \ @@ -532,5 +585,19 @@ SPEX_info spex_sparse_realloc 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/SPEX_Left_LU/Tcov/README.txt b/SPEX/Tcov/README.txt similarity index 69% rename from SPEX/SPEX_Left_LU/Tcov/README.txt rename to SPEX/Tcov/README.txt index ced74e3281..8cab5f01b7 100644 --- a/SPEX/SPEX_Left_LU/Tcov/README.txt +++ b/SPEX/Tcov/README.txt @@ -1,8 +1,8 @@ -SPEX/SPEX/SPEX_Left_LU/Tcov: comprehensive test coverage for SPEX Left LU. +SPEX/Tcov: comprehensive test coverage for SPEX. -Requires Linux. Type "make" to compile, and then "make run" to run the +Requires Linux. Type "make" to compile, and run the tests, or "make vtests" to run the tests with valgrind for memory leakage -checking. +checking. The test coverage is in cover.out. The test output is printed on stdout, except for cov_test (which prints its output in various diff --git a/SPEX/SPEX_Left_LU/Tcov/cov.awk b/SPEX/Tcov/cov.awk similarity index 100% rename from SPEX/SPEX_Left_LU/Tcov/cov.awk rename to SPEX/Tcov/cov.awk diff --git a/SPEX/Tcov/covall b/SPEX/Tcov/covall new file mode 100755 index 0000000000..4eca3df2e9 --- /dev/null +++ b/SPEX/Tcov/covall @@ -0,0 +1,6 @@ +#!/bin/bash + ./gcovs SPEX_*.c spex_*.c 2>&1 > gcovs.out + ./covs > covs.out + echo -n "statements not yet tested: " + grep "#####" *.*.gcov | wc -l + ./cover *.*.gcov > cover.out diff --git a/SPEX/SPEX_Left_LU/Tcov/cover b/SPEX/Tcov/cover similarity index 100% rename from SPEX/SPEX_Left_LU/Tcov/cover rename to SPEX/Tcov/cover diff --git a/SPEX/SPEX_Left_LU/Tcov/covs b/SPEX/Tcov/covs similarity index 100% rename from SPEX/SPEX_Left_LU/Tcov/covs rename to SPEX/Tcov/covs diff --git a/SPEX/SPEX_Left_LU/Tcov/gcovs b/SPEX/Tcov/gcovs similarity index 86% rename from SPEX/SPEX_Left_LU/Tcov/gcovs rename to SPEX/Tcov/gcovs index 6a24317170..bc58c6d990 100755 --- a/SPEX/SPEX_Left_LU/Tcov/gcovs +++ b/SPEX/Tcov/gcovs @@ -3,6 +3,6 @@ echo '=================================================================' for file in $* do - gcov -f $file + gcov -f $file 2>&1 echo '=================================================================' -done +done diff --git a/SPEX/Tcov/simple_rand.c b/SPEX/Tcov/simple_rand.c new file mode 100644 index 0000000000..c61c65a414 --- /dev/null +++ b/SPEX/Tcov/simple_rand.c @@ -0,0 +1,64 @@ +// ---------------------------------------------------------------------------- +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//----------------------------------------------------------------------------- + +// The POSIX.1-2001 example of rand, duplicated here so that the same sequence +// will be generated on different machines. The purpose is not to generate +// high-quality random numbers, but to ensure the same sequence is generated +// on any computer or operating system. This allows the test coverage to be +// repeatable. + +// Since the simple_rand ( ) function is replicated from the POSIX.1-2001 +// standard, no copyright claim is intended for this specific file. The +// copyright statement above applies to all of SPEX, not this file. + +#include "simple_rand.h" + +/* simple_rand is not thread-safe */ +uint64_t simple_rand_next = 1 ; + +#define SIMPLE_RAND_MAX 32767 + +/* return a random number between 0 and SIMPLE_RAND_MAX */ +uint64_t simple_rand (void) +{ + simple_rand_next = simple_rand_next * 1103515245 + 12345 ; + return ((simple_rand_next/65536) % (SIMPLE_RAND_MAX + 1)); +} + +/* set the seed */ +void simple_rand_seed (uint64_t seed) +{ + simple_rand_next = seed ; +} + +/* get the seed */ +uint64_t simple_rand_getseed (void) +{ + return (simple_rand_next); +} + +/* return a random double between 0 and 1, inclusive */ +double simple_rand_x (void ) +{ + return (((double) simple_rand ( )) / ((double) SIMPLE_RAND_MAX)); +} + +/* return a random uint64_t */ +uint64_t simple_rand_i (void ) +{ + uint64_t i = 0 ; + for (int k = 0 ; k < 5 ; k++) + { + i = SIMPLE_RAND_MAX * i + simple_rand ( ); + } + return (i); +} + diff --git a/SPEX/Tcov/simple_rand.h b/SPEX/Tcov/simple_rand.h new file mode 100644 index 0000000000..ba362469b3 --- /dev/null +++ b/SPEX/Tcov/simple_rand.h @@ -0,0 +1,34 @@ +// ---------------------------------------------------------------------------- +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//----------------------------------------------------------------------------- + +// Since the simple_rand ( ) function is replicated from the POSIX.1-2001 +// standard, no copyright claim is intended for this specific file. The +// copyright statement above applies to all of SPEX, not this file. + +#include + +#define SIMPLE_RAND_MAX 32767 + +/* return a random number between 0 and SIMPLE_RAND_MAX */ +uint64_t simple_rand (void) ; + +/* set the seed */ +void simple_rand_seed (uint64_t seed) ; + +/* get the seed */ +uint64_t simple_rand_getseed (void) ; + +/* return a random double between 0 and 1, inclusive */ +double simple_rand_x ( void) ; + +/* return a random uint64_t */ +uint64_t simple_rand_i (void ) ; + diff --git a/SPEX/Tcov/tcov_for_cholesky.c b/SPEX/Tcov/tcov_for_cholesky.c new file mode 100644 index 0000000000..3d4f774855 --- /dev/null +++ b/SPEX/Tcov/tcov_for_cholesky.c @@ -0,0 +1,564 @@ +// ---------------------------------------------------------------------------- +// 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. +// 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 Cholesky factorization. + */ + +#include "tcov_utilities.h" +#include "spex_demos.h" + +// 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 +//------------------------------------------------------------------------------ + +// The method must return a bool (true if successful, false if failure). + +#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 ; \ + printf ("\nBrutal Cholesky trials %ld: tests passed\n", trial); \ +} + +//------------------------------------------------------------------------------ +// read_test_matrix: read in a matrix from a file +//------------------------------------------------------------------------------ + +void read_test_matrix (SPEX_matrix *A_handle, char *filename); + +void read_test_matrix (SPEX_matrix *A_handle, char *filename) +{ + FILE *f = fopen (filename, "r"); + OK (f == NULL ? SPEX_PANIC : SPEX_OK); + OK (spex_demo_tripread (A_handle, f, SPEX_FP64, NULL)); + fclose (f); +} + +//------------------------------------------------------------------------------ +// create_test_rhs: create a right-hand-side vector +//------------------------------------------------------------------------------ + +void create_test_rhs (SPEX_matrix *b_handle, int64_t n); + +void create_test_rhs (SPEX_matrix *b_handle, int64_t n) +{ + OK (SPEX_matrix_allocate (b_handle, SPEX_DENSE, SPEX_MPZ, n, 1, n, false, + true, NULL)); + SPEX_matrix b = *(b_handle); + // b(0)=0 + OK (SPEX_mpz_set_ui (b->x.mpz [0], 0)); + for (int64_t k = 1 ; k < n ; k++) + { + // b(k) = 1 + OK (SPEX_mpz_set_ui (b->x.mpz [k], 1)); + } +} + +//------------------------------------------------------------------------------ +// spex_test_chol_backslash: test SPEX_cholesky_backslash +//------------------------------------------------------------------------------ + +#undef SPEX_FREE_ALL +#define SPEX_FREE_ALL \ +{ \ + OK (SPEX_matrix_free (&x, option)); \ +} + +SPEX_info spex_test_chol_backslash (SPEX_matrix A, SPEX_matrix b, + SPEX_options option); + +SPEX_info spex_test_chol_backslash (SPEX_matrix A, SPEX_matrix b, + SPEX_options option) +{ + SPEX_matrix x = NULL ; + // solve Ax=b + OK2 (SPEX_cholesky_backslash (&x, SPEX_MPQ, A, b, option)); + // disable memory testing when checking the solution + int64_t save = malloc_count ; malloc_count = INT64_MAX ; + OK (spex_demo_check_solution (A, x, b, option)); + // re-enable memory testing + malloc_count = save ; + SPEX_FREE_ALL; + return (SPEX_OK) ; +} + +//------------------------------------------------------------------------------ +// spex_test_cdiv_qr: test SPEX_cdiv_qr +//------------------------------------------------------------------------------ + +#undef SPEX_FREE_ALL +#define SPEX_FREE_ALL \ +{ \ + SPEX_MPZ_CLEAR(q1); \ + SPEX_MPZ_CLEAR(r1); \ +} + +SPEX_info spex_test_cdiv_qr (mpz_t n, mpz_t d) ; + +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); + OK2 (SPEX_mpz_init2(q1,1)); + OK2 (SPEX_mpz_init2(r1,1)); + + OK2 (SPEX_mpz_cdiv_qr(q1,r1,n,d)); + + SPEX_FREE_ALL ; + return (SPEX_OK) ; +} + +// BRUTAL ( spex_test_cdiv_qr ()) ; + + +//------------------------------------------------------------------------------ +// spex_test_chol_afs: test SPEX_cholesky_[analyze,factorize,solve] +//------------------------------------------------------------------------------ + +#undef SPEX_FREE_ALL +#define SPEX_FREE_ALL \ +{ \ + OK (SPEX_symbolic_analysis_free (&S, option)); \ + OK (SPEX_factorization_free (&F, option)); \ + OK (SPEX_matrix_free (&x, option)); \ +} + +SPEX_info spex_test_chol_afs +( + SPEX_matrix A, + SPEX_matrix b, + SPEX_options option +) ; + +SPEX_info spex_test_chol_afs (SPEX_matrix A, SPEX_matrix b, SPEX_options option) +{ + SPEX_symbolic_analysis S = NULL ; + SPEX_factorization F = NULL ; + SPEX_matrix x = NULL ; + // solve Ax=b + OK2 (SPEX_cholesky_analyze (&S, A, option)); + OK2 (SPEX_cholesky_factorize (&F, A, S, option)); + OK2 (SPEX_cholesky_solve (&x, F, b, option)); + // disable memory testing when checking the solution + int64_t save = malloc_count ; malloc_count = INT64_MAX ; + OK (spex_demo_check_solution (A, x, b, option)); + // re-enable memory testing + malloc_count = save ; + SPEX_FREE_ALL; + return (SPEX_OK); +} + +//------------------------------------------------------------------------------ +// tcov_for_cholesky: main program +//------------------------------------------------------------------------------ + +#undef SPEX_FREE_ALL +#define SPEX_FREE_ALL \ +{ \ + OK (SPEX_symbolic_analysis_free (&S, option)); \ + OK (SPEX_factorization_free (&F, option)); \ + OK (SPEX_matrix_free (&x, option)); \ + OK (SPEX_matrix_free (&A, option)); \ + OK (SPEX_matrix_free (&b, option)); \ + SPEX_FREE (option); \ +} + +int main (int argc, char *argv []) +{ + + //-------------------------------------------------------------------------- + // start SPEX + //-------------------------------------------------------------------------- + + SPEX_matrix A = NULL, b = NULL, x = NULL ; + SPEX_symbolic_analysis S = NULL ; + SPEX_factorization F = NULL, F2 = NULL ; + SPEX_options option = NULL ; + + if (argc < 2) + { + printf ("usage: tcov_for_cholesky matrixfilename\n"); + TEST_ABORT (SPEX_INCORRECT_INPUT); + } + + SPEX_info info ; + 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)); + + //-------------------------------------------------------------------------- + // test a few small invalid matrices + //-------------------------------------------------------------------------- + + // unsymmetric matrix (row counts != col counts) + printf ("Cholesky: error handling for unsymmetric matrix (1)\n"); + read_test_matrix (&A, "../ExampleMats/test1.mat.txt"); + create_test_rhs (&b, A->n); + ERR (SPEX_cholesky_backslash (&x, SPEX_MPQ, A, b, option), SPEX_NOTSPD); + OK (SPEX_matrix_free (&A, option)); + OK (SPEX_matrix_free (&b, option)); + + // unsymmetric matrix (unsymmetric pattern) + printf ("Cholesky: error handling for unsymmetric matrix (2)\n"); + read_test_matrix (&A, "../ExampleMats/test2.mat.txt"); + create_test_rhs (&b, A->n); + ERR (SPEX_cholesky_backslash (&x, SPEX_MPQ, A, b, option), SPEX_NOTSPD); + OK (SPEX_matrix_free (&A, option)); + OK (SPEX_matrix_free (&b, option)); + + // unsymmetric matrix (unsymmetric values) + printf ("Cholesky: error handling for unsymmetric matrix (3)\n"); + read_test_matrix (&A, "../ExampleMats/test3.mat.txt"); + create_test_rhs (&b, A->n); + ERR (SPEX_cholesky_backslash (&x, SPEX_MPQ, A, b, option), SPEX_NOTSPD); + OK (SPEX_matrix_free (&A, option)); + OK (SPEX_matrix_free (&b, option)); + + // symmetric indefinite matrix + printf ("Cholesky: error handling for symmetric indefinite matrix (4)\n"); + read_test_matrix (&A, "../ExampleMats/test4.mat.txt"); + create_test_rhs (&b, A->n); + option->algo = SPEX_CHOL_UP ; + ERR (SPEX_cholesky_backslash (&x, SPEX_MPQ, A, b, option), SPEX_NOTSPD); + option->algo = SPEX_CHOL_LEFT ; + ERR (SPEX_cholesky_backslash (&x, SPEX_MPQ, A, b, option), SPEX_NOTSPD); + option->algo = SPEX_CHOL_UP ; + OK (SPEX_matrix_free (&A, option)); + OK (SPEX_matrix_free (&b, option)); + + //-------------------------------------------------------------------------- + // symetry check + //-------------------------------------------------------------------------- + read_test_matrix (&A, "../ExampleMats/test5.mat.txt"); + SPEX_cholesky_analyze( &S, A, option); + OK (SPEX_matrix_free (&A, option)); + OK (SPEX_matrix_free (&b, option)); + + //-------------------------------------------------------------------------- + // load the test matrix and create the right-hand-side + //-------------------------------------------------------------------------- + + read_test_matrix (&A, argv [1]); + int64_t n = A->n ; + int64_t m = A->m ; + int64_t anz = -1 ; + OK (SPEX_matrix_nnz (&anz, A, option)); + 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); + + //-------------------------------------------------------------------------- + // test SPEX_transpose + //-------------------------------------------------------------------------- + + printf("\n Test SPEX_transpose \n"); + SPEX_matrix A_mpq = NULL, A_mpfr = NULL, A_int = NULL, A_fp = NULL; + SPEX_matrix T_mpq = NULL, T_mpfr = NULL, T_int = NULL, T_fp = NULL; + // T = A' + OK ( SPEX_matrix_copy(&A_mpq, SPEX_CSC, SPEX_MPQ, A, option)); + OK ( SPEX_transpose(&T_mpq, A_mpq, option) ); + + OK ( SPEX_matrix_copy(&A_mpfr, SPEX_CSC, SPEX_MPFR, A, option)); + OK ( SPEX_transpose(&T_mpfr, A_mpfr, option) ); + + OK ( SPEX_matrix_copy(&A_int, SPEX_CSC, SPEX_INT64, A, option)); + OK ( SPEX_transpose(&T_int, A_int, option) ); + + OK ( SPEX_matrix_copy(&A_fp, SPEX_CSC, SPEX_FP64, A, option)); + OK ( SPEX_transpose(&T_fp, A_fp, option)); + + SPEX_matrix_free(&A_mpq,option); + SPEX_matrix_free(&A_mpfr,option); + SPEX_matrix_free(&A_int,option); + SPEX_matrix_free(&A_fp,option); + SPEX_matrix_free(&T_mpq,option); + SPEX_matrix_free(&T_mpfr,option); + SPEX_matrix_free(&T_int,option); + SPEX_matrix_free(&T_fp,option); + + //-------------------------------------------------------------------------- + // 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_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)); + + //-------------------------------------------------------------------------- + // missing gmp coverage + //-------------------------------------------------------------------------- + mpz_t gmp_x, gmp_y, gmp_0; + mpq_t gmp_a, gmp_b, gmp_c; + mpfr_t gmp_e, gmp_f, gmp_g, gmp_h ; + uint64_t num1=2; + uint64_t num2=3; + int r; + + //Initialization + SPEX_MPZ_INIT(gmp_x); + SPEX_MPZ_INIT(gmp_y); + SPEX_MPZ_INIT(gmp_0); + + SPEX_MPQ_INIT(gmp_a); + SPEX_MPQ_INIT(gmp_b); + SPEX_MPQ_INIT(gmp_c); + + SPEX_MPFR_INIT2(gmp_e, 128); + SPEX_MPFR_INIT2(gmp_f, 128); + SPEX_MPFR_INIT2(gmp_g, 128); + SPEX_MPFR_INIT2(gmp_h, 128); + + //set values + SPEX_MPZ_SET_SI(gmp_y, -4); + SPEX_MPQ_SET_UI(gmp_b, 2, 7); + SPEX_MPFR_SET_SI(gmp_f, 10, round); + SPEX_MPFR_SET_SI(gmp_g, 7, round); + + SPEX_MPZ_SET_SI(gmp_0, 0); + + //Test + FILE *fil = fopen ("../ExampleMats/test4.mat.txt", "r"); + SPEX_gmp_fscanf(fil,"c"); + fclose (fil); + + SPEX_MPZ_ABS(gmp_x,gmp_y); + + SPEX_MPQ_SET_NUM(gmp_c,gmp_x); + + SPEX_MPQ_ABS(gmp_a,gmp_b); + + SPEX_MPQ_CMP(&r,gmp_b,gmp_a); + + SPEX_MPFR_MUL(gmp_e,gmp_f,gmp_g,round); + + SPEX_MPFR_UI_POW_UI(gmp_h,num1,num2,round); + + SPEX_MPQ_NEG(gmp_a,gmp_b); + + printf("Brutal test of SPEX_cdiv_qr: \n"); + mpz_t gmp_n,gmp_d,tmpz; + SPEX_MPZ_INIT2(gmp_n,1); + SPEX_MPZ_INIT(gmp_d); + SPEX_MPZ_INIT(tmpz); + SPEX_MPZ_SET_SI(tmpz, 1); //tmpz=1 + SPEX_MPZ_SET_SI(gmp_n, INT64_MAX); + for (int ii = 0; ii<3;ii++){ + SPEX_MPZ_MUL(gmp_n, gmp_n, gmp_n); + }// gmp_n = INT64_MAX^8 + SPEX_MPZ_SET(gmp_d, gmp_n); //gmp_d = gmp_n = INT64_MAX^8 + SPEX_MPZ_MUL(gmp_n, gmp_n, gmp_n); + SPEX_MPZ_SUB(gmp_n, gmp_n, tmpz);// gmp_n = (INT64_MAX^8)^2-1 + // we should get q = r = INT64_MAX^8-1 + BRUTAL(spex_test_cdiv_qr (gmp_n,gmp_d)); + + ERR(SPEX_mpz_cdiv_qr(gmp_x,gmp_y,gmp_n,gmp_0),SPEX_PANIC); + 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); + + //-------------------------------------------------------------------------- + // error handling + //-------------------------------------------------------------------------- + + // inputs cannot be NULL + ERR (SPEX_matrix_nnz (NULL, NULL, NULL), + SPEX_INCORRECT_INPUT); + ERR (SPEX_matrix_nnz (NULL, A, NULL), + SPEX_INCORRECT_INPUT); + ERR (SPEX_matrix_nnz (&anz, NULL, NULL), + SPEX_INCORRECT_INPUT); + ERR (SPEX_cholesky_analyze (NULL, NULL, NULL), + SPEX_INCORRECT_INPUT); + ERR (SPEX_cholesky_backslash (NULL, SPEX_MPQ, NULL, NULL, NULL), + SPEX_INCORRECT_INPUT); + ERR (SPEX_cholesky_factorize (NULL, NULL, NULL, NULL), + SPEX_INCORRECT_INPUT); + ERR (SPEX_determine_symmetry (NULL, NULL, NULL ), + SPEX_INCORRECT_INPUT); + + // type cannot be int64 + ERR (SPEX_cholesky_backslash (&x, SPEX_INT64, A, b, option), + SPEX_INCORRECT_INPUT); + + // mangle the matrix: invalid dimensions + A->n = 0 ; + A->m = 0 ; + ERR (SPEX_cholesky_backslash (&x, SPEX_MPQ, A, b, option), + SPEX_INCORRECT_INPUT); + A->n = n ; + A->m = n ; + + // mangle the matrix: invalid type + A->type = SPEX_INT64 ; + ERR (SPEX_cholesky_backslash (&x, SPEX_MPQ, A, b, option), + SPEX_INCORRECT_INPUT); + bool is_symmetric ; + ERR (SPEX_determine_symmetry (&is_symmetric, A, option), + SPEX_INCORRECT_INPUT); + A->type = SPEX_MPZ ; + + // valid analysis, but break the factorization + OK (SPEX_cholesky_analyze (&S, A, option)); + A->type = SPEX_INT64 ; + ERR (SPEX_cholesky_factorize (&F, A, S, option), + SPEX_INCORRECT_INPUT); + A->type = SPEX_MPZ ; + OK (SPEX_symbolic_analysis_free (&S, option)); + + // valid analysis and factorization, but break the solve + OK (SPEX_cholesky_analyze (&S, A, option)); + OK (SPEX_cholesky_factorize (&F, A, S, option)); + b->type = SPEX_INT64 ; + ERR (SPEX_cholesky_solve (&x, F, b, option), + SPEX_INCORRECT_INPUT); + b->type = SPEX_MPZ ; + OK (SPEX_symbolic_analysis_free (&S, option)); + OK (SPEX_factorization_free (&F, option)); + + // invalid algorithm + option->algo = 99 ; + ERR (SPEX_cholesky_backslash (&x, SPEX_MPQ, A, b, option), + SPEX_INCORRECT_ALGORITHM); + option->algo = SPEX_CHOL_UP ; + + //-------------------------------------------------------------------------- + // solve Ax=b with SPEX_cholesky_backslash and check the solution + //-------------------------------------------------------------------------- + + option->order = SPEX_AMD ; + option->algo = SPEX_CHOL_UP ; + option->print_level = 3 ; + printf ("Cholesky backslash, up-looking, no malloc testing:\n"); + OK (spex_test_chol_backslash (A, b, option)); + option->print_level = 0 ; + + printf ("Cholesky backslash, up-looking, no malloc testing, colamd:\n"); + option->order = SPEX_COLAMD ; + option->print_level = 3 ; + OK (spex_test_chol_backslash (A, b, option)); + option->order = SPEX_AMD ; + option->print_level = 0 ; + + printf ("Cholesky backslash, no malloc testing, natural ordering:\n"); + option->order = SPEX_NO_ORDERING ; + OK (spex_test_chol_backslash (A, b, option)); + + printf ("Cholesky backslash, no malloc testing, return x as MPFR:\n"); + OK (SPEX_cholesky_backslash (&x, SPEX_MPFR, A, b, option)); + //NOTE: mpfr solution can't be checked because mpfr->mpz isn't guaranteed + // to be exact + OK (SPEX_matrix_free (&x, option)); + + printf ("Cholesky backslash, up-looking with malloc testing, colamd:\n"); + option->order = SPEX_COLAMD ; + BRUTAL (spex_test_chol_backslash (A, b, option)); + + printf ("Cholesky backslash, up-looking with malloc testing, amd:\n"); + option->order = SPEX_AMD ; + BRUTAL (spex_test_chol_backslash (A, b, option)); + + printf ("Cholesky backslash, up-looking with malloc testing, " + " no ordering:\n"); + option->order = SPEX_NO_ORDERING ; + BRUTAL (spex_test_chol_backslash (A, b, option)); + + printf ("Cholesky backslash, left-looking with malloc testing:\n"); + option->algo = SPEX_CHOL_LEFT ; + BRUTAL (spex_test_chol_backslash (A, b, option)); + + //-------------------------------------------------------------------------- + // solve Ax=b with SPEX_cholesky_[analyze,factorize,solve]; check solution + //-------------------------------------------------------------------------- + + option->algo = SPEX_CHOL_UP ; + + printf ("Cholesky analyze/factorize/solve, no malloc testing:\n"); + spex_set_gmp_ntrials (INT64_MAX) ; + malloc_count = INT64_MAX ; + OK (spex_test_chol_afs (A, b, option)); + + printf ("Cholesky analyze/factorize/solve, with malloc testing:\n"); + // also check a different RHS, with b(0) = 0 + OK (SPEX_mpz_set_ui (b->x.mpz [0], 0)); + BRUTAL (spex_test_chol_afs (A, b, option)); + + //-------------------------------------------------------------------------- + // error handling + //-------------------------------------------------------------------------- + + // SPEX not initialized + spex_set_initialized (false); + ERR (SPEX_cholesky_factorize (&F2, A, S, option), SPEX_PANIC); + ERR (SPEX_cholesky_analyze (NULL, NULL, NULL), SPEX_PANIC); + ERR (SPEX_cholesky_solve (NULL, NULL, NULL, NULL), SPEX_PANIC); + ERR (SPEX_cholesky_backslash (NULL, SPEX_MPQ, NULL, NULL, NULL), + SPEX_PANIC); + spex_set_initialized (true); + SPEX_FREE_ALL; + + printf ("%s: all tests passed\n\n", __FILE__); + fprintf (stderr, "%s: all tests passed\n\n", __FILE__); + return 0; +} + diff --git a/SPEX/SPEX_Left_LU/Tcov/tcov_test.c b/SPEX/Tcov/tcov_for_lu.c similarity index 74% rename from SPEX/SPEX_Left_LU/Tcov/tcov_test.c rename to SPEX/Tcov/tcov_for_lu.c index ff8cf6d1ec..d967ac744d 100644 --- a/SPEX/SPEX_Left_LU/Tcov/tcov_test.c +++ b/SPEX/Tcov/tcov_for_lu.c @@ -1,12 +1,13 @@ -//------------------------------------------------------------------------------ -// SPEX/SPEX/SPEX_Left_LU/Tcov/tcov_test.c: test coverage for SPEX_Left_LU -//------------------------------------------------------------------------------ +// ---------------------------------------------------------------------------- +// SPEX/Tcov/tcov_for_lu.c: test coverage for SPEX_LU +// ---------------------------------------------------------------------------- -// SPEX_Left_LU: (c) 2019-2022, Chris Lourenco (US Naval Academy), Jinhao Chen, -// Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +// 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 -//------------------------------------------------------------------------------ +//----------------------------------------------------------------------------- /* * When the test is run without input argument, brutal test is used and simple @@ -18,8 +19,8 @@ * int64, 4 double. For Ab_type >= 5, it corresponds to 15 type of original * matrix A (i.e., (csc, triplet, dense) x (mpz, mpq, mpfr, int64, double)), * specifically, A->type=(Ab_type-5)%5, and A->kind=(Ab_type-5)/5. - * N and list1 specify the test list for spex_gmp_ntrials (in SPEX_gmp.h) - * M and list2 specify the test list for malloc_count (in tcov_malloc_test.h) + * N and list1 specify the test list for spex_gmp_ntrials (in SPEX_gmp.c) + * M and list2 specify the test list for malloc_count (in tcov_utilities.h) * N, list1, M, list2 are optional, but N and list1 are required when M and * list2 is wanted * @@ -36,70 +37,25 @@ */ // #define SPEX_TCOV_SHOW_LIST -/* This program will exactly solve the sparse linear system Ax = b by performing - * the SPEX Left LU factorization. Refer to README.txt for information on how - * to properly use this code. +/* This program will exactly solve the sparse linear system A*x = b by + * performing the SPEX Left LU factorization. Refer to README.txt for + * information on how to properly use this code. */ -#define SPEX_FREE_ALL \ -{ \ - /*SPEX_MPZ_CLEAR(mpz1);*/ \ - /*SPEX_MPZ_CLEAR(mpz2);*/ \ - /*SPEX_MPZ_CLEAR(mpz3);*/ \ - TEST_OK (SPEX_matrix_free(&A,option)) ; \ - TEST_OK (SPEX_matrix_free(&b, option)); \ - TEST_OK (SPEX_matrix_free(&B, option)); \ - TEST_OK (SPEX_matrix_free(&Ax, option)); \ - TEST_OK (SPEX_matrix_free(&sol, option)); \ - SPEX_FREE(option); \ - TEST_OK (SPEX_finalize()) ; \ +#define SPEX_FREE_ALL \ +{ \ + OK (SPEX_matrix_free (&A, option)); \ + OK (SPEX_matrix_free (&b, option)); \ + OK (SPEX_matrix_free (&B, option)); \ + OK (SPEX_matrix_free (&Ax, option)); \ + OK (SPEX_matrix_free (&sol, option)); \ + OK (SPEX_matrix_free (&sol_doub, option)); \ + OK (SPEX_symbolic_analysis_free (&S, option)); \ + SPEX_FREE (option); \ + OK (SPEX_finalize ()); \ } -#include "tcov_malloc_test.h" - -#define TEST_OK(method) \ -if (!pretend_to_fail) \ -{ \ - info = (method) ; assert (info == SPEX_OK) ; \ -} - -#define TEST_CHECK(method) \ -if (!pretend_to_fail) \ -{ \ - info = (method) ; \ - if (info == SPEX_OUT_OF_MEMORY) \ - { \ - SPEX_FREE_ALL; \ - pretend_to_fail = true ; \ - } \ - else if (info != SPEX_OK) \ - { \ - SPEX_PRINT_INFO (info) ; \ - printf ("test failure at line %d\n", __LINE__) ; \ - abort ( ) ; \ - } \ -} - -#define TEST_CHECK_FAILURE(method,expected_error) \ -if (!pretend_to_fail) \ -{ \ - info = (method) ; \ - if (info == SPEX_OUT_OF_MEMORY) \ - { \ - SPEX_FREE_ALL; \ - pretend_to_fail = true ; \ - } \ - else if (info != 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") ; \ - SPEX_PRINT_INFO (info) ; \ - printf ("test failure at line %d (wrong error)\n", __LINE__) ; \ - abort ( ) ; \ - } \ -} +#include "tcov_utilities.h" #define MAX_MALLOC_COUNT 1000 @@ -114,35 +70,51 @@ int64_t Axden3[11] = {3, 3, 6, 1, 7, 1, 1, 1, 5, 1, 1}; // Denominator of x int64_t bxnum3[4] = {17, 182, 61, 67}; // Numerator of b int64_t bxden3[4] = {15, 3, 6, 7}; // Denominator of b -#include -#include - -int main( int argc, char* argv[]) +int main ( int argc, char *argv[]) { - bool IS_SIMPLE_TEST = true; + bool is_simple_test = true; int Ab_type = 0; int64_t malloc_count_list[20]= { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; - int64_t NUM_OF_TRIALS = 0 ; - int64_t NUM_OF_MALLOC_T = 0; + int64_t num_of_trials = 0 ; + int64_t num_of_malloc_t = 0; int64_t *gmp_ntrial_list=NULL; // only used in simple test int64_t *malloc_trials_list=NULL; // only used in simple test bool pretend_to_fail = false ; + //------------------------------------------------------------------ + // Define variables + //------------------------------------------------------------------ + + // used in as source in different Ab_type for A and b + SPEX_matrix B = NULL ; + SPEX_matrix Ax = NULL ; + + // matrix A, b and solution + SPEX_matrix A = NULL ; + SPEX_matrix b = NULL ; + SPEX_matrix sol = NULL ; + SPEX_matrix sol_doub = NULL ; + + // Column permutation + SPEX_symbolic_analysis S = NULL ; + + SPEX_options option = NULL ; + //-------------------------------------------------------------------------- // parse input arguments //-------------------------------------------------------------------------- if (argc == 1) // brutal test { - IS_SIMPLE_TEST = false; - NUM_OF_TRIALS = 20; + is_simple_test = false; + num_of_trials = 20; } else // simple test { - IS_SIMPLE_TEST = true; + is_simple_test = true; int64_t arg_count = 0; // type of Matrix A and vector b: @@ -150,16 +122,16 @@ int main( int argc, char* argv[]) Ab_type = atoi(argv[++arg_count]); if (!argv[++arg_count]) { - NUM_OF_TRIALS=1; - gmp_ntrial_list= malloc (NUM_OF_TRIALS* sizeof(int64_t)); + num_of_trials=1; + gmp_ntrial_list= malloc (num_of_trials* sizeof(int64_t)); gmp_ntrial_list[0]=-1; arg_count--; } else { - NUM_OF_TRIALS=atoi(argv[arg_count]); - gmp_ntrial_list= malloc (NUM_OF_TRIALS* sizeof(int64_t)); - for (int64_t k=0; k0 at the end of inner loop. - for (int64_t k=0; kprint_level = 3; @@ -325,12 +300,16 @@ int main( int argc, char* argv[]) // Solve A*x=b where A and b are created from mpz entries //-------------------------------------------------------------- + TEST_ASSERT (B == NULL); + TEST_ASSERT (Ax == NULL); TEST_CHECK(SPEX_matrix_allocate(&B, SPEX_DENSE, (SPEX_type) Ab_type, n, numRHS, n*numRHS, false, true, option)); if (pretend_to_fail) continue ; + TEST_CHECK(SPEX_matrix_allocate(&Ax, SPEX_CSC, (SPEX_type) Ab_type, n, n, nz, false, true, option)); + if (pretend_to_fail) continue ; // fill Ax->i and Ax->p @@ -348,36 +327,40 @@ int main( int argc, char* argv[]) { // create empty A and b using uninitialized double mat/array // to trigger all-zero array condition + TEST_ASSERT (A == NULL); + TEST_ASSERT (b == NULL); + TEST_ASSERT (sol == NULL); TEST_CHECK(SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, Ax, option)); if (pretend_to_fail) continue ; TEST_CHECK(SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, B, option)); if (pretend_to_fail) continue ; - // to trigger SPEX_SINGULAR - TEST_CHECK_FAILURE(SPEX_Left_LU_backslash(&sol, SPEX_MPQ, A, + // to trigger SPEX_SINGULAR + TEST_CHECK_FAILURE(SPEX_lu_backslash(&sol, SPEX_MPQ, A, b, option), SPEX_SINGULAR); if (pretend_to_fail) continue ; option->pivot = SPEX_LARGEST; - TEST_CHECK_FAILURE(SPEX_Left_LU_backslash(&sol, SPEX_MPQ, A, + TEST_CHECK_FAILURE(SPEX_lu_backslash(&sol, SPEX_MPQ, A, b, option), SPEX_SINGULAR); if (pretend_to_fail) continue ; option->pivot = SPEX_FIRST_NONZERO; - TEST_CHECK_FAILURE(SPEX_Left_LU_backslash(&sol, SPEX_MPQ, A, + TEST_CHECK_FAILURE(SPEX_lu_backslash(&sol, SPEX_MPQ, A, b, option), SPEX_SINGULAR); if (pretend_to_fail) continue ; //free the memory alloc'd - TEST_OK (SPEX_matrix_free (&A, option)) ; - if (pretend_to_fail) continue ; - TEST_OK (SPEX_matrix_free (&b, option)) ; - if (pretend_to_fail) continue ; + OK (SPEX_matrix_free (&A, option)); + OK (SPEX_matrix_free (&b, option)); + TEST_ASSERT (A == NULL); + TEST_ASSERT (b == NULL); + TEST_ASSERT (sol == NULL); // trigger gcd == 1 int32_t prec = option->prec; option->prec = 17; double pow2_17 = pow(2,17); - assert (B != NULL) ; + TEST_ASSERT (B != NULL); for (j = 0; j < n && !pretend_to_fail; j++) // Get B { TEST_CHECK(SPEX_mpfr_set_d(SPEX_2D(B,j,0,mpfr), @@ -387,8 +370,8 @@ int main( int argc, char* argv[]) TEST_CHECK(SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ,B, option)); if (pretend_to_fail) continue ; - TEST_OK (SPEX_matrix_free (&b, option)) ; - if (pretend_to_fail) continue ; + OK (SPEX_matrix_free (&b, option)); + TEST_ASSERT (b == NULL); // restore default precision option->prec = prec; @@ -400,23 +383,26 @@ int main( int argc, char* argv[]) { // create empty A using uninitialized double mat/array // to trigger all-zero array condition - assert (Ax!= NULL) ; + TEST_ASSERT (Ax != NULL); + TEST_ASSERT (A == NULL); TEST_CHECK(SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, Ax, option)); if (pretend_to_fail) continue ; - TEST_OK (SPEX_matrix_free (&A, option)) ; - if (pretend_to_fail) continue ; + OK (SPEX_matrix_free (&A, option)); + TEST_ASSERT (A == NULL); // trigger gcd == 1 - assert (B != NULL) ; + TEST_ASSERT (B != NULL); for (j = 0; j < n; j++) // Get b { SPEX_2D(B,j,0,fp64) = bxnum[j]/1e17; } + TEST_ASSERT (b == NULL); TEST_CHECK(SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ, B, option)); if (pretend_to_fail) continue ; - TEST_OK (SPEX_matrix_free (&b, option)) ; + OK (SPEX_matrix_free (&b, option)); + TEST_ASSERT (b == NULL); if (pretend_to_fail) continue ; // use smallest entry as pivot @@ -426,7 +412,7 @@ int main( int argc, char* argv[]) // fill Ax->x and b->x for (j = 0; j < n && !pretend_to_fail; j++) // Get b { - assert (B != NULL) ; + TEST_ASSERT (B != NULL); if (Ab_type == 0) //MPZ { TEST_CHECK(SPEX_mpz_set_ui(SPEX_2D(B, j, 0, mpz), @@ -461,7 +447,7 @@ int main( int argc, char* argv[]) for (j = 0; j < nz; j++) // Get Ax { - assert (Ax!= NULL) ; + TEST_ASSERT (Ax != NULL); if (Ab_type == 0) { TEST_CHECK(SPEX_mpz_set_ui(Ax->x.mpz[j],Axnum3[j])); @@ -494,13 +480,16 @@ int main( int argc, char* argv[]) if (pretend_to_fail) continue ; // successful case + TEST_ASSERT (A == NULL); + TEST_ASSERT (b == NULL); TEST_CHECK(SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, Ax,option)); if (pretend_to_fail) continue ; TEST_CHECK(SPEX_matrix_copy(&b, SPEX_DENSE, SPEX_MPZ,B,option)); if (pretend_to_fail) continue ; - TEST_OK (SPEX_matrix_free(&B, option)); - if (pretend_to_fail) continue ; - TEST_OK (SPEX_matrix_free(&Ax, option)); + OK (SPEX_matrix_free(&B, option)); + OK (SPEX_matrix_free(&Ax, option)); + TEST_ASSERT (Ax == NULL); + TEST_ASSERT (B == NULL); if (pretend_to_fail) continue ; } else // 5 =< Ab_type < 20 @@ -530,7 +519,7 @@ int main( int argc, char* argv[]) double x_doub2[11] = {1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4}; int64_t x_int64[11] = {1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4}; - + // find the type and kind of the source matrix to copy from Ab_type = Ab_type > 19 ? 19:Ab_type; int tk = Ab_type-5; @@ -548,6 +537,7 @@ int main( int argc, char* argv[]) n1 = 1; nz1 = nz1; } + TEST_ASSERT (Ax == NULL); TEST_CHECK(SPEX_matrix_allocate(&Ax, (SPEX_kind) kind, (SPEX_type)type, m1, n1, nz1, false, true, option)); if (pretend_to_fail) continue ; @@ -565,7 +555,7 @@ int main( int argc, char* argv[]) // fill Ax->i and Ax->j for (j = 0; j < nz && !pretend_to_fail ; j++) { - assert(Ax != NULL); + TEST_ASSERT(Ax != NULL); if (kind != 2) {Ax->i[j] = I[j];} // triplet if (kind == 1){ Ax->j[j] = J[j];} @@ -617,11 +607,6 @@ int main( int argc, char* argv[]) TEST_CHECK (SPEX_matrix_check (Ax, option)); if (pretend_to_fail) continue ; - /*if (kind == 0) // CSC - { - TEST_CHECK (SPEX_determine_symmetry(Ax, true)); - }*/ - // convert to all different type of matrix for (int tk1 = 0; tk1 < 15 && !pretend_to_fail; tk1++) { @@ -635,8 +620,9 @@ int main( int argc, char* argv[]) "double",type, kind1 < 1 ? "CSC" : kind1 < 2 ? "Triplet" : "Dense", kind1,type1 < 1 ? "MPZ" : type1 < 2 ? "MPQ" : type1 < 3 ? "MPFR" : type1 < 4 - ? "int64" : "double",type1) ; + ? "int64" : "double",type1); + TEST_ASSERT (A == NULL); TEST_CHECK(SPEX_matrix_copy(&A, (SPEX_kind)kind1, (SPEX_type) type1, Ax, option)); if (pretend_to_fail) break ; @@ -647,30 +633,31 @@ int main( int argc, char* argv[]) // just perform once to try some failure cases if (tk == 0 && tk1 == 0) { - // fail SPEX_Left_LU_solve + // fail SPEX_lu_solve + TEST_ASSERT (b == NULL); TEST_CHECK(SPEX_matrix_allocate(&b, SPEX_DENSE, SPEX_MPZ, 1, 1, 1, true, true, option)); if (pretend_to_fail) break ; - TEST_CHECK_FAILURE(SPEX_Left_LU_solve(NULL, b, A, A, A, - b, NULL, NULL, option), SPEX_INCORRECT_INPUT); - if (pretend_to_fail) break ; - TEST_OK (SPEX_matrix_free (&b, option)) ; - if (pretend_to_fail) break ; + TEST_CHECK_FAILURE(SPEX_lu_solve(NULL, NULL, + b, option), SPEX_INCORRECT_INPUT); + OK (SPEX_matrix_free (&b, option)); + TEST_ASSERT (b == NULL); } else if (tk == 0 && (tk1 == 1 || tk1 == 2 || tk1 == 4)) { // test SPEX_matrix_copy with scale - TEST_OK (SPEX_matrix_free (&A, option)) ; + OK (SPEX_matrix_free (&A, option)); + TEST_ASSERT (A == NULL); if (pretend_to_fail) break ; - TEST_CHECK (SPEX_mpq_set_ui (Ax->scale, 2, 5)) ; + TEST_CHECK (SPEX_mpq_set_ui (Ax->scale, 2, 5)); if (pretend_to_fail) break ; TEST_CHECK(SPEX_matrix_copy(&A, (SPEX_kind)kind1, (SPEX_type) type1, Ax, option)); if (pretend_to_fail) break ; - TEST_CHECK (SPEX_mpq_set_ui (Ax->scale, 1, 1)) ; + TEST_CHECK (SPEX_mpq_set_ui (Ax->scale, 1, 1)); if (pretend_to_fail) break ; } - else if (tk == 0 && tk1 == 3)//A = CSC int64 + else if (tk == 0 && tk1 == 3) //A is CSC int64 { // test SPEX_matrix_check A->i[0] = -1; @@ -707,34 +694,34 @@ int main( int argc, char* argv[]) if (pretend_to_fail) break ; // Incorrect calling with NULL pointer(s) - TEST_CHECK_FAILURE(SPEX_LU_analyze(NULL,A,NULL), + TEST_CHECK_FAILURE(SPEX_lu_analyze(NULL,A,NULL), SPEX_INCORRECT_INPUT); if (pretend_to_fail) break ; // test SPEX_matrix_copy with scale - TEST_OK (SPEX_matrix_free (&A, option)) ; + OK (SPEX_matrix_free (&A, option)); if (pretend_to_fail) break ; - TEST_CHECK (SPEX_mpq_set_ui (Ax->scale, 5, 2)) ; + TEST_CHECK (SPEX_mpq_set_ui (Ax->scale, 5, 2)); if (pretend_to_fail) break ; TEST_CHECK(SPEX_matrix_copy(&A, (SPEX_kind)kind1, (SPEX_type) type1, Ax, option)); if (pretend_to_fail) break ; - TEST_CHECK (SPEX_mpq_set_ui (Ax->scale, 1, 1)) ; + TEST_CHECK (SPEX_mpq_set_ui (Ax->scale, 1, 1)); if (pretend_to_fail) break ; } else if (tk == 0 && tk1 == 8) // A= Triplet int64 { // test SPEX_matrix_check A->i[0] = -1; - TEST_CHECK_FAILURE(SPEX_matrix_check(A, option), + TEST_CHECK_FAILURE(SPEX_matrix_check(A, option), SPEX_INCORRECT_INPUT); if (pretend_to_fail) break ; SPEX_FREE(A->x.int64); - TEST_CHECK_FAILURE(SPEX_matrix_check(A, option), + TEST_CHECK_FAILURE(SPEX_matrix_check(A, option), SPEX_INCORRECT_INPUT); if (pretend_to_fail) break ; A->n = -1; - TEST_CHECK_FAILURE(SPEX_matrix_check(A, option), + TEST_CHECK_FAILURE(SPEX_matrix_check(A, option), SPEX_INCORRECT_INPUT); if (pretend_to_fail) break ; } @@ -748,7 +735,7 @@ int main( int argc, char* argv[]) else if (tk == 4 && tk1 == 3)// converting double to int64 { // test spex_cast_array - TEST_OK (SPEX_matrix_free (&A, option)) ; + OK (SPEX_matrix_free (&A, option)); if (pretend_to_fail) break ; Ax->x.fp64[0] = 0.0/0.0;//NAN Ax->x.fp64[1] = DBL_MAX; //a value > INT64_MAX; @@ -761,7 +748,7 @@ int main( int argc, char* argv[]) Ax->x.fp64[1] = x_doub2[1]; Ax->x.fp64[2] = x_doub2[2]; } - TEST_OK (SPEX_matrix_free (&A, option)) ; + OK (SPEX_matrix_free (&A, option)); if (pretend_to_fail) break ; } if (pretend_to_fail) continue; @@ -769,11 +756,13 @@ int main( int argc, char* argv[]) if (tk == 3) { // fail SPEX_matrix_copy + TEST_ASSERT (A == NULL); TEST_CHECK_FAILURE(SPEX_matrix_copy(&A, 7, (SPEX_type) type, Ax, option), SPEX_INCORRECT_INPUT); if (pretend_to_fail) continue ; // failure case: Ax->x = NULL SPEX_FREE(Ax->x.int64); + TEST_ASSERT (A == NULL); TEST_CHECK_FAILURE(SPEX_matrix_copy(&A, SPEX_CSC, SPEX_MPZ, Ax,option), SPEX_INCORRECT_INPUT); if (pretend_to_fail) continue ; @@ -783,21 +772,24 @@ int main( int argc, char* argv[]) SPEX_DENSE, SPEX_MPZ, 1, 1, 1, true, true, option), SPEX_INCORRECT_INPUT); if (pretend_to_fail) continue ; + TEST_ASSERT (b == NULL); TEST_CHECK_FAILURE(SPEX_matrix_allocate(&b, SPEX_DENSE, SPEX_MPZ, -1, 1, 1, true, true, option), SPEX_INCORRECT_INPUT); if (pretend_to_fail) continue ; // test SPEX_matrix_allocate + TEST_ASSERT (b == NULL); TEST_CHECK(SPEX_matrix_allocate(&b, SPEX_DENSE, SPEX_MPQ, 1, 1, 1, false, false, option)); if (pretend_to_fail) continue ; - TEST_OK (SPEX_matrix_free (&b, option)) ; - if (pretend_to_fail) continue ; + OK (SPEX_matrix_free (&b, option)); + TEST_ASSERT (b == NULL); TEST_CHECK(SPEX_matrix_allocate(&b, SPEX_DENSE, SPEX_MPFR, 1, 1, 1, false, false, option)); if (pretend_to_fail) continue ; - TEST_OK (SPEX_matrix_free (&b, option)) ; + OK (SPEX_matrix_free (&b, option)); + TEST_ASSERT (b == NULL); if (pretend_to_fail) continue ; //test coverage for spex_gmp_reallocate() @@ -812,46 +804,47 @@ int main( int argc, char* argv[]) // test SPEX_matrix_check on a triplet matrix with bad triplets //-------------------------------------------------------------- - printf ("\n[ SPEX_matrix_check -------------------------\n") ; - TEST_OK (SPEX_matrix_free (&A, option)) ; - if (pretend_to_fail) continue ; +// printf ("\n[ SPEX_matrix_check -------------------------\n"); + OK (SPEX_matrix_free (&A, option)); int64_t I2 [4] = { 1, 2, 1, 1 } ; int64_t J2 [4] = { 1, 0, 0, 1 } ; + TEST_ASSERT (A == NULL); TEST_CHECK (SPEX_matrix_allocate (&A, SPEX_TRIPLET, - SPEX_INT64, 3, 3, 4, true, false, option)) ; + SPEX_INT64, 3, 3, 4, true, false, option)); if (pretend_to_fail) continue ; A->i = I2 ; A->j = J2 ; A->x.int64 = I2 ; A->nz = 4 ; - printf ("invalid triplet matrix expected:\n") ; +// printf ("invalid triplet matrix expected:\n"); TEST_CHECK_FAILURE (SPEX_matrix_check (A, option), - SPEX_INCORRECT_INPUT) ; - if (pretend_to_fail) continue ; - TEST_OK (SPEX_matrix_free (&A, option)) ; + SPEX_INCORRECT_INPUT); if (pretend_to_fail) continue ; + OK (SPEX_matrix_free (&A, option)); + TEST_ASSERT (A == NULL); TEST_CHECK (SPEX_matrix_allocate (&A, SPEX_CSC, - SPEX_INT64, 3, 3, 4, true, false, option)) ; + SPEX_INT64, 3, 3, 4, true, false, option)); if (pretend_to_fail) continue ; int64_t P3 [4] = { 0, 2, 4, 4 } ; int64_t I3 [4] = { 0, 0, 0, 0 } ; A->p = P3 ; A->i = I3 ; A->x.int64 = I3 ; - printf ("invalid CSC matrix expected:\n") ; +// printf ("invalid CSC matrix expected:\n"); TEST_CHECK_FAILURE (SPEX_matrix_check (A, option), - SPEX_INCORRECT_INPUT) ; + SPEX_INCORRECT_INPUT); if (pretend_to_fail) continue ; - TEST_OK (SPEX_matrix_free (&A, option)) ; - printf ("-----------------------------------------------]\n") ; + OK (SPEX_matrix_free (&A, option)); + TEST_ASSERT (A == NULL); +// printf ("-----------------------------------------------]\n"); //-------------------------------------------------------------- SPEX_FREE_ALL; // for miscellaneous test, continue to next loop directly - if (!IS_SIMPLE_TEST) + if (!is_simple_test) { if (malloc_count > 0) { @@ -868,23 +861,23 @@ int main( int argc, char* argv[]) if (Ab_type%2 == 0) { + //-------------------------------------------------------------- // SPEX Left LU backslash // solve Ax=b in full precision rational arithmetic //-------------------------------------------------------------- - TEST_CHECK(SPEX_Left_LU_backslash(&sol, SPEX_MPQ, A, b,option)); + + TEST_ASSERT (sol == NULL); + TEST_CHECK(SPEX_lu_backslash(&sol, SPEX_MPQ, A, b,option)); if (pretend_to_fail) continue ; - if (Ab_type == 4) - { - // This would return SPEX_INCORRECT since sol has been - // scaled down so that sol->scale = 1. Therefore sol is - // solution for original unscaled Ax=b, while this is - // checking if x is the solution for scaled Ax=b - TEST_CHECK_FAILURE(SPEX_check_solution(A, sol, b, option), - SPEX_INCORRECT); - if (pretend_to_fail) continue ; - } + // perform solution check if user wish to do so + bool Is_correct; + TEST_CHECK(spex_check_solution(&Is_correct, A, sol, b, option)); + if (pretend_to_fail) continue ; + OK (SPEX_matrix_free(&sol, option)); + TEST_ASSERT (sol == NULL); + if (pretend_to_fail) continue ; } else @@ -893,24 +886,27 @@ int main( int argc, char* argv[]) // SPEX Left LU backslash // solve Ax=b in double precision //-------------------------------------------------------------- - SPEX_matrix *sol_doub; - TEST_CHECK(SPEX_Left_LU_backslash(&sol_doub, SPEX_FP64, A, b, + + TEST_ASSERT (sol_doub == NULL); + TEST_CHECK(SPEX_lu_backslash(&sol_doub, SPEX_FP64, A, b, option)); if (pretend_to_fail) continue ; - TEST_OK (SPEX_matrix_free(&sol_doub, option)); + OK (SPEX_matrix_free(&sol_doub, option)); + TEST_ASSERT (sol_doub == NULL); // failure case if (Ab_type == 1) { - TEST_CHECK_FAILURE(SPEX_Left_LU_factorize(NULL, NULL, - NULL, NULL, A, NULL, NULL), SPEX_INCORRECT_INPUT); + TEST_CHECK_FAILURE(SPEX_lu_factorize(NULL, + A, NULL, NULL), SPEX_INCORRECT_INPUT); if (pretend_to_fail) continue ; // incorrect solution type - TEST_CHECK_FAILURE(SPEX_Left_LU_backslash(&sol, SPEX_MPZ, + TEST_CHECK_FAILURE(SPEX_lu_backslash(&sol, SPEX_MPZ, A, b, option), SPEX_INCORRECT_INPUT); + TEST_ASSERT (sol == NULL); if (pretend_to_fail) continue ; // NULL solution pointer - TEST_CHECK_FAILURE(SPEX_Left_LU_backslash(NULL, SPEX_MPZ, + TEST_CHECK_FAILURE(SPEX_lu_backslash(NULL, SPEX_MPZ, A, b, option), SPEX_INCORRECT_INPUT); if (pretend_to_fail) continue ; // invalid kind @@ -923,14 +919,51 @@ int main( int argc, char* argv[]) } } + //------------------------------------------------------------------ + // test SPEX_lu_analyze + //------------------------------------------------------------------ + if (A != NULL && option != NULL) + { + SPEX_preorder saved_order = option->order; + option->order = SPEX_NO_ORDERING; + TEST_ASSERT (S == NULL); + TEST_CHECK(SPEX_lu_analyze(&S, A, option)); + if (pretend_to_fail) continue ; + if (option != NULL) option->order = saved_order; + } + + //------------------------------------------------------------------ + // test spex_amd and spex_colamd + //------------------------------------------------------------------ + + int64_t *ignore = NULL, nnz = 0 ; + + if (A != NULL) + { + int64_t nsave = A->n ; + A->n = -1 ; + TEST_CHECK_FAILURE (spex_amd (&ignore, &nnz, A, NULL), + SPEX_INCORRECT_INPUT); + if (pretend_to_fail) continue ; + if (A != NULL) A->n = nsave ; + } + + if (A != NULL) + { + A->p [0] = 1 ; + TEST_CHECK_FAILURE (spex_colamd (&ignore, &nnz, A, NULL), + SPEX_INCORRECT_INPUT); + if (pretend_to_fail) continue ; + if (A != NULL) A->p [0] = 0 ; + } + //------------------------------------------------------------------ // Free Memory //------------------------------------------------------------------ SPEX_FREE_ALL; - if(!IS_SIMPLE_TEST) + if(!is_simple_test) { - printf("im here %ld\n",malloc_count); if (malloc_count > 0) { malloc_count_list[k] = kk; @@ -945,11 +978,11 @@ int main( int argc, char* argv[]) // wrapup //-------------------------------------------------------------------------- - if (IS_SIMPLE_TEST) + if (is_simple_test) { free(gmp_ntrial_list); free(malloc_trials_list); - printf ("tests finished\n") ; + printf ("\nSPEX LU tests finished, tests passed\n"); } else { @@ -958,9 +991,11 @@ int main( int argc, char* argv[]) { printf("%ld ", malloc_count_list[i]); } - printf("\nbrutal tests finished\n"); + printf("\nSPEX LU: brutal tests finished, tests passed\n"); } + 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_lu2.c b/SPEX/Tcov/tcov_for_lu2.c new file mode 100644 index 0000000000..673aeb366b --- /dev/null +++ b/SPEX/Tcov/tcov_for_lu2.c @@ -0,0 +1,183 @@ +// ---------------------------------------------------------------------------- +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//----------------------------------------------------------------------------- + +/* This program will cover what isn't covered by tcov_for_lu + */ + +#include "tcov_utilities.h" +#include "spex_demos.h" + +// 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) ; \ + } \ +} +//------------------------------------------------------------------------------ +// read_test_matrix: read in a matrix from a file +//------------------------------------------------------------------------------ + +void read_test_matrix (SPEX_matrix *A_handle, char *filename); + +void read_test_matrix (SPEX_matrix *A_handle, char *filename) +{ + FILE *f = fopen (filename, "r"); + OK (f == NULL ? SPEX_PANIC : SPEX_OK); + OK (spex_demo_tripread (A_handle, f, SPEX_FP64, NULL)); + fclose (f); +} + +//------------------------------------------------------------------------------ +// create_test_rhs: create a right-hand-side vector +//------------------------------------------------------------------------------ + +void create_test_rhs (SPEX_matrix *b_handle, int64_t n); + +void create_test_rhs (SPEX_matrix *b_handle, int64_t n) +{ + OK (SPEX_matrix_allocate (b_handle, SPEX_DENSE, SPEX_MPZ, n, 1, n, false, + true, NULL)); + SPEX_matrix b = *(b_handle); + // b(0)=0 + OK (SPEX_mpz_set_ui (b->x.mpz [0], 0)); + for (int64_t k = 1 ; k < n ; k++) + { + // b(k) = 1 + OK (SPEX_mpz_set_ui (b->x.mpz [k], 1)); + } +} + + +//------------------------------------------------------------------------------ +// spex_test_lu_backslash: test SPEX_lu_backslash +//------------------------------------------------------------------------------ + +#undef SPEX_FREE_ALL +#define SPEX_FREE_ALL \ +{ \ + OK (SPEX_matrix_free (&x, option)); \ +} + +SPEX_info spex_test_lu_backslash (SPEX_matrix A, SPEX_matrix b, + SPEX_options option); + +SPEX_info spex_test_lu_backslash (SPEX_matrix A, SPEX_matrix b, + SPEX_options option) +{ + SPEX_matrix x = NULL ; + // solve Ax=b + OK2 (SPEX_lu_backslash (&x, SPEX_MPQ, A, b, option)); + // disable memory testing when checking the solution + int64_t save = malloc_count ; malloc_count = INT64_MAX ; + OK (spex_demo_check_solution (A, x, b, option)); + // re-enable memory testing + malloc_count = save ; + SPEX_FREE_ALL; + return (SPEX_OK) ; +} + +#undef SPEX_FREE_ALL +#define SPEX_FREE_ALL \ +{ \ + OK (SPEX_matrix_free (&A, option)); \ + OK (SPEX_matrix_free (&b, option)); \ + OK (SPEX_matrix_free (&x, option)); \ + OK (SPEX_symbolic_analysis_free(&S, option)) \ +} + + +int main (int argc, char *argv []) +{ + + //-------------------------------------------------------------------------- + // start SPEX + //-------------------------------------------------------------------------- + + SPEX_matrix A = NULL, b = NULL, x = NULL ; + SPEX_symbolic_analysis S = NULL ; + //SPEX_factorization F = NULL, F2 = NULL ; + SPEX_options option = NULL ; + + if (argc < 2) + { + printf ("usage: tcov_for_cholesky matrixfilename\n"); + TEST_ABORT (SPEX_INCORRECT_INPUT); + } + + 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)); + + + //-------------------------------------------------------------------------- + // load the test matrix and create the right-hand-side + //-------------------------------------------------------------------------- + + read_test_matrix (&A, argv [1]); + int64_t n = A->n ; + int64_t m = A->m ; + int64_t anz = -1 ; + OK (SPEX_matrix_nnz (&anz, A, option)); + 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 ; + 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_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 ; + 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 ; + + 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_FREE_ALL; + +} diff --git a/SPEX/Tcov/tcov_utilities.c b/SPEX/Tcov/tcov_utilities.c new file mode 100644 index 0000000000..6c3ee5f16d --- /dev/null +++ b/SPEX/Tcov/tcov_utilities.c @@ -0,0 +1,245 @@ +// ---------------------------------------------------------------------------- +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//----------------------------------------------------------------------------- + +#include "tcov_utilities.h" + +//----------------------------------------------------------------------------- +// tcov malloc/calloc/realloc/free wrappers +//----------------------------------------------------------------------------- + +int64_t malloc_count = INT64_MAX ; + +// Note that only the ANSI C memory manager is used here +// (malloc, calloc, realloc, free) + +// wrapper for malloc +void *tcov_malloc +( + size_t size // Size to alloc +) +{ + if (--malloc_count < 0) + { + /* pretend to fail */ + return (NULL); + } + return (malloc (size)); +} + +// wrapper for calloc +void *tcov_calloc +( + size_t n, // Size of array + size_t size // Size to alloc +) +{ + if (--malloc_count < 0) + { + /* pretend to fail */ + return (NULL); + } + // ensure at least one byte is calloc'd + return (calloc (n, size)); +} + +// wrapper for realloc +void *tcov_realloc +( + void *p, // Pointer to be realloced + size_t new_size // Size to alloc +) +{ + if (--malloc_count < 0) + { + /* pretend to fail */ + return (NULL); + } + return (realloc (p, new_size)); +} + +// wrapper for free +void tcov_free +( + void *p // Pointer to be free +) +{ + // This not really needed, but placed here anyway in case the Tcov tests + // want to do something different that free(p) in the future. + free (p); +} + +//----------------------------------------------------------------------------- +// test for spex_gmp_realloc +//----------------------------------------------------------------------------- + +int spex_gmp_realloc_test +( + void **p_new, + void * p_old, + size_t old_size, + size_t new_size +) +{ + TEST_ASSERT (spex_initialized ( )); + + // get the spex_gmp object for this thread + spex_gmp_t *spex_gmp = spex_gmp_get ( ); + TEST_ASSERT (spex_gmp != NULL); + int status = setjmp (spex_gmp->environment); + if (status != 0) + { + return (SPEX_OUT_OF_MEMORY); + } + *p_new = spex_gmp_reallocate (p_old, old_size, new_size); + return (SPEX_OK); +} + +//------------------------------------------------------------------------------ +// spex_check_solution: check solution to Ax=b +//------------------------------------------------------------------------------ + +/* 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. + */ + +#undef SPEX_FREE_ALL +#define SPEX_FREE_ALL \ + SPEX_MPQ_CLEAR(temp); \ + SPEX_MPQ_CLEAR(scale); \ + SPEX_matrix_free(&b2, NULL); + +SPEX_info spex_check_solution +( + // output + bool *Is_correct, // true, if the solution is correct + // input + const SPEX_matrix A, // Input matrix of CSC MPZ + const SPEX_matrix x, // Solution vectors + const SPEX_matrix b, // Right hand side vectors + const SPEX_options option // Command options +) +{ + if (!spex_initialized ( )) 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 + //-------------------------------------------------------------------------- + + 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); + + 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_addmul in loops to compute b2 = A'*x, where A' is the + // scaled matrix with all entries in integer + //-------------------------------------------------------------------------- + + for (j = 0; j < b->n; j++) + { + for (i = 0; i < b->m; i++) + { + for (p = A->p[i]; p < A->p[i + 1]; p++) + { + // 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]); + + // temp = temp*x[i] + 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); + } + } + } + + //-------------------------------------------------------------------------- + // Apply scales of A and b to b2 before comparing the b2 with scaled b' + //-------------------------------------------------------------------------- + + 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); + if (r != 0) + { + for (i = 0; i < b2->m*b2->n; i++) + { + SPEX_MPQ_MUL(b2->x.mpq[i], b2->x.mpq[i], scale); + } + } + + //-------------------------------------------------------------------------- + // check if b==b2 + //-------------------------------------------------------------------------- + *Is_correct = true; + for (j = 0; j < b->n; j++) + { + for (i = 0; i < b->m; i++) + { + // temp = b[i] (correct b) + 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)); + if (r == 0) + { + *Is_correct = false; + j = b->n; + break; + } + } + } + + //-------------------------------------------------------------------------- + // Print info + //-------------------------------------------------------------------------- + + int pr = SPEX_OPTION_PRINT_LEVEL (option); + if (*Is_correct) + { + SPEX_PR1 ("Solution is verified to be exact.\n"); + } + else + { + // This can never happen. + SPEX_PR1 ("ERROR! Solution is wrong. This is a bug; please " + "contact the authors of SPEX.\n"); + } + + //-------------------------------------------------------------------------- + // Free memory + //-------------------------------------------------------------------------- + + SPEX_FREE_ALL; + return SPEX_OK; +} + diff --git a/SPEX/Tcov/tcov_utilities.h b/SPEX/Tcov/tcov_utilities.h new file mode 100644 index 0000000000..c1615b42f4 --- /dev/null +++ b/SPEX/Tcov/tcov_utilities.h @@ -0,0 +1,164 @@ +// ---------------------------------------------------------------------------- +// 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. +// All Rights Reserved. +// SPDX-License-Identifier: GPL-2.0-or-later or LGPL-3.0-or-later + +//----------------------------------------------------------------------------- + +#ifndef TCOV_UTILITIES_H +#define TCOV_UTILITIES_H + +#include "spex_lu_internal.h" +#include +#include + +extern int64_t malloc_count ; + +#define SPEX_PRINT_INFO(info) \ +{ \ + switch(info) \ + { \ + case SPEX_OK: printf("SPEX_OK\n"); break; \ + case SPEX_OUT_OF_MEMORY: printf("OUT OF MEMORY\n"); break; \ + case SPEX_SINGULAR: printf("Matrix is SINGULAR\n"); break; \ + case SPEX_INCORRECT_INPUT: printf("INCORRECT INPUT\n"); break; \ + case SPEX_NOTSPD: printf("Matrix is not SPD\n"); break; \ + case SPEX_PANIC: printf("SPEX_PANIC\n"); break; \ + default: printf("unknown!\n"); \ + } \ +} + +// abort the test if a test failure occurs +#define TEST_ABORT(info) \ +{ \ + SPEX_PRINT_INFO (info) ; \ + printf ("test failure: %s at line %d\n", __FILE__,__LINE__) ; \ + fprintf (stderr, "test failure: %s at line %d\n", __FILE__, __LINE__) ; \ + fflush (stdout) ; \ + fflush (stderr) ; \ + abort ( ) ; \ +} + +// assert something that should be true +#define TEST_ASSERT(ok) \ +{ \ + if (!(ok)) TEST_ABORT (SPEX_PANIC) ; \ +} + +// OK: call a method and assert that it succeeds +// The method must return a SPEX_info value. +#define OK(method) \ +{ \ + SPEX_info info3 = (method) ; \ + if (info3 != SPEX_OK) TEST_ABORT (info3) ; \ +} + +// OK2: call a method and assert that it succeeds or runs out of memory. +// If the method runs out of memory, all workspace is freed and control is +// returned to the caller. The method must return a SPEX_info value. +#define OK2(method) \ +{ \ + SPEX_info info4 = (method) ; \ + if (info4 == SPEX_OUT_OF_MEMORY) \ + { \ + SPEX_FREE_ALL; \ + return (info4) ; \ + } \ + if (info4 != SPEX_OK) TEST_ABORT (info4) ; \ +} + +// test wrapper for SPEX_initialize*, SPEX_finalize, and SPEX_*_free methods +#define TEST_OK(method) \ +if (!pretend_to_fail) \ +{ \ + OK (method) ; \ +} + +// test wrapper for all other SPEX_* functions +#define TEST_CHECK(method) \ +if (!pretend_to_fail) \ +{ \ + info = (method) ; \ + if (info == SPEX_OUT_OF_MEMORY) \ + { \ + SPEX_FREE_ALL; \ + pretend_to_fail = true ; \ + } \ + else if (info != SPEX_OK) \ + { \ + TEST_ABORT (info) ; \ + } \ +} + +// test wrapper for SPEX_* function when expected error would produce +#define TEST_CHECK_FAILURE(method,expected_error) \ +if (!pretend_to_fail) \ +{ \ + info = (method) ; \ + if (info == SPEX_OUT_OF_MEMORY) \ + { \ + SPEX_FREE_ALL; \ + pretend_to_fail = true ; \ + } \ + else if (info != 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 (info) ; \ + } \ +} + +// malloc function for test coverage +void *tcov_malloc +( + size_t size // Size to alloc +) ; + +// calloc function for test coverage +void *tcov_calloc +( + size_t n, // Size of array (# of entries) + size_t size // Size of each entry to alloc +) ; + +// realloc function for test coverage +void *tcov_realloc +( + void *p, // Pointer to be realloced + size_t new_size // Size to alloc +) ; + +// free function for test coverage +void tcov_free +( + void *p // Pointer to be freed +) ; + +// used to test spex_gmp_reallocate +int spex_gmp_realloc_test +( + void **p_new, + void * p_old, + size_t old_size, + size_t new_size +) ; + +SPEX_info spex_check_solution +( + // output + bool *Is_correct, // true, if the solution is correct + // input + const SPEX_matrix A, // Input matrix of CSC MPZ + const SPEX_matrix x, // Solution vectors + const SPEX_matrix b, // Right hand side vectors + const SPEX_options option // Command options +) ; + +#endif + diff --git a/SPEX/cmake_modules/FindGMP.cmake b/SPEX/cmake_modules/FindGMP.cmake index f51365269a..2fa7773c0e 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-2023, Timothy A. Davis. All Rights Reserved. # SPDX-License-Identifier: BSD-3-clause #------------------------------------------------------------------------------- @@ -27,123 +27,72 @@ if ( DEFINED ENV{CMAKE_PREFIX_PATH} ) # import CMAKE_PREFIX_PATH, typically created by spack - list ( PREPEND CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH} ) + set ( CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH} ) endif ( ) -# Try to get information from pkg-config file first. -find_package ( PkgConfig ) -if ( PKG_CONFIG_FOUND ) - set ( GMP_PC_OPTIONS "" ) - if ( GMP_FIND_VERSION ) - set ( GMP_PC_OPTIONS "gmp>=${GMP_FIND_VERSION}" ) - else ( ) - set ( GMP_PC_OPTIONS "gmp" ) - endif ( ) - if ( GMP_FIND_REQUIRED ) - # FIXME: Are there installations without pkg-config file? - # list ( APPEND GMP_PC_OPTIONS REQUIRED ) - endif ( ) - pkg_check_modules ( GMP ${GMP_PC_OPTIONS} ) - - if ( GMP_FOUND ) - # assume first is the actual library - # FIXME: Would it be possible to return all libraries in that variable? - list ( GET GMP_LINK_LIBRARIES 0 GMP_LIBRARY ) - set ( GMP_INCLUDE_DIR ${GMP_INCLUDEDIR} ) - endif ( ) - if (GMP_STATIC_FOUND) - # assume first is the actual library - list ( GET GMP_STATIC_LINK_LIBRARIES 0 GMP_STATIC ) - set ( GMP_INCLUDE_DIR ${GMP_INCLUDEDIR} ) - endif ( ) -endif ( ) - -if ( NOT GMP_FOUND ) - # Manual search if pkg-config couldn't be used. - - # include files for gmp - find_path ( GMP_INCLUDE_DIR - NAMES gmp.h - PATH_SUFFIXES include Include - ) - - # dynamic gmp library (or possibly static if no GMP dynamic library exists) - find_library ( GMP_LIBRARY - NAMES gmp - PATH_SUFFIXES lib build - ) - - # check if found - if ( GMP_LIBRARY MATCHES ".*NOTFOUND" OR GMP_INCLUDE_DIR MATCHES ".*NOTFOUND" ) - set ( FOUND_IT false ) - else ( ) - set ( FOUND_IT true ) - endif ( ) - - # static gmp library - if ( NOT MSVC ) - set ( save_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} ) - set ( CMAKE_FIND_LIBRARY_SUFFIXES - ${CMAKE_STATIC_LIBRARY_SUFFIX} ${CMAKE_FIND_LIBRARY_SUFFIXES} ) - endif ( ) - - find_library ( GMP_STATIC - NAMES gmp - PATH_SUFFIXES lib build - ) +# include files for gmp +find_path ( GMP_INCLUDE_DIR + NAMES gmp.h + PATH_SUFFIXES include Include +) - if ( NOT MSVC ) - # restore the CMAKE_FIND_LIBRARY_SUFFIXES variable - set ( CMAKE_FIND_LIBRARY_SUFFIXES ${save_CMAKE_FIND_LIBRARY_SUFFIXES} ) - endif ( ) +# dynamic gmp library +find_library ( GMP_LIBRARY + NAMES gmp + PATH_SUFFIXES lib build +) - # get version of the library from the filename - if ( GMP_LIBRARY ) - get_filename_component ( GMP_LIBRARY ${GMP_LIBRARY} REALPATH ) - endif ( ) +if ( MSVC ) + set ( STATIC_SUFFIX .lib ) +else ( ) + set ( STATIC_SUFFIX .a ) +endif ( ) - # look in the middle for 6.2.1 (/spackstuff/gmp-6.2.1-morestuff/libgmp.10.4.1) - string ( REGEX MATCH "gmp-[0-9]+.[0-9]+.[0-9]+" GMP_VERSION1 ${GMP_LIBRARY} ) - - if ( NOT FOUND_IT ) - # gmp has not been found - set ( GMP_VERSION 0.0.0 ) - message ( WARNING "GMP not found") - elseif ( GMP_VERSION1 STREQUAL "" ) - # gmp has been found, but not as a spack library. Hunt for the version - # number in gmp.h. The gmp.h file includes the following lines: - # #define __GNU_MP_VERSION 6 - # #define __GNU_MP_VERSION_MINOR 2 - # #define __GNU_MP_VERSION_PATCHLEVEL 0 - file ( STRINGS ${GMP_INCLUDE_DIR}/gmp.h GMP_VER_MAJOR_STRING - REGEX "define __GNU_MP_VERSION " ) - file ( STRINGS ${GMP_INCLUDE_DIR}/gmp.h GMP_VER_MINOR_STRING - REGEX "define __GNU_MP_VERSION_MINOR " ) - file ( STRINGS ${GMP_INCLUDE_DIR}/gmp.h GMP_VER_PATCH_STRING - REGEX "define __GNU_MP_VERSION_PATCHLEVEL " ) - message ( STATUS "major: ${GMP_VER_MAJOR_STRING}" ) - message ( STATUS "minor: ${GMP_VER_MINOR_STRING}" ) - message ( STATUS "patch: ${GMP_VER_PATCH_STRING}" ) - if ( GMP_VER_MAJOR_STRING STREQUAL "") - # look at the end of the filename for the version number - string ( - REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" - GMP_VERSION ${GMP_LIBRARY} ) - else ( ) - # get the version number from inside the gmp.h file itself - string ( REGEX MATCH "[0-9]+" GMP_VER_MAJOR ${GMP_VER_MAJOR_STRING} ) - string ( REGEX MATCH "[0-9]+" GMP_VER_MINOR ${GMP_VER_MINOR_STRING} ) - string ( REGEX MATCH "[0-9]+" GMP_VER_PATCH ${GMP_VER_PATCH_STRING} ) - set ( GMP_VERSION "${GMP_VER_MAJOR}.${GMP_VER_MINOR}.${GMP_VER_PATCH}") - endif ( ) +# static gmp library +set ( save ${CMAKE_FIND_LIBRARY_SUFFIXES} ) +set ( CMAKE_FIND_LIBRARY_SUFFIXES ${STATIC_SUFFIX} ${CMAKE_FIND_LIBRARY_SUFFIXES} ) +find_library ( GMP_STATIC + NAMES gmp + PATH_SUFFIXES lib build +) +set ( CMAKE_FIND_LIBRARY_SUFFIXES ${save} ) + +# get version of the library from the filename +get_filename_component ( GMP_LIBRARY ${GMP_LIBRARY} REALPATH ) + +# look in the middle for 6.2.1 (/spackstuff/gmp-6.2.1-morestuff/libgmp.10.4.1) +string ( REGEX MATCH "gmp-[0-9]+.[0-9]+.[0-9]+" GMP_VERSION1 ${GMP_LIBRARY} ) + +if ( GMP_VERSION1 STREQUAL "" ) + # gmp has been found, but not as a spack library. Hunt for the version + # number in gmp.h. The gmp.h file includes the following lines: + # #define __GNU_MP_VERSION 6 + # #define __GNU_MP_VERSION_MINOR 2 + # #define __GNU_MP_VERSION_PATCHLEVEL 0 + file ( STRINGS ${GMP_INCLUDE_DIR}/gmp.h GMP_VER_MAJOR_STRING + REGEX "define __GNU_MP_VERSION " ) + file ( STRINGS ${GMP_INCLUDE_DIR}/gmp.h GMP_VER_MINOR_STRING + REGEX "define __GNU_MP_VERSION_MINOR" ) + file ( STRINGS ${GMP_INCLUDE_DIR}/gmp.h GMP_VER_PATCH_STRING + REGEX "define __GNU_MP_VERSION_PATCH" ) + message ( STATUS "major from gmp.h: ${GMP_VER_MAJOR_STRING}" ) + message ( STATUS "minor from gmp.h: ${GMP_VER_MINOR_STRING}" ) + message ( STATUS "patch from gmp.h: ${GMP_VER_PATCH_STRING}" ) + if ( GMP_VER_MAJOR_STRING STREQUAL "") + # look at the end of the filename for the version number + string ( + REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" + GMP_VERSION ${GMP_LIBRARY} ) else ( ) - # look at gmp-6.2.1 for the version number (spack library) - string ( REGEX MATCH "[0-9]+.[0-9]+.[0-9]" GMP_VERSION ${GMP_VERSION1} ) + # get the version number from inside the gmp.h file itself + string ( REGEX MATCH "[0-9]+" GMP_VER_MAJOR ${GMP_VER_MAJOR_STRING} ) + string ( REGEX MATCH "[0-9]+" GMP_VER_MINOR ${GMP_VER_MINOR_STRING} ) + string ( REGEX MATCH "[0-9]+" GMP_VER_PATCH ${GMP_VER_PATCH_STRING} ) + set ( GMP_VERSION "${GMP_VER_MAJOR}.${GMP_VER_MINOR}.${GMP_VER_PATCH}") endif ( ) -endif ( ) - -if ( NOT GMP_STATIC ) - set ( GMP_STATIC ${GMP_LIBRARY} ) +else ( ) + # look at gmp-6.2.1 for the version number (spack library) + string ( REGEX MATCH "[0-9]+.[0-9]+.[0-9]" GMP_VERSION ${GMP_VERSION1} ) endif ( ) set ( GMP_LIBRARIES ${GMP_LIBRARY} ) @@ -151,7 +100,7 @@ set ( GMP_LIBRARIES ${GMP_LIBRARY} ) include (FindPackageHandleStandardArgs) find_package_handle_standard_args ( GMP - REQUIRED_VARS GMP_LIBRARY GMP_INCLUDE_DIR + REQUIRED_VARS GMP_LIBRARIES GMP_INCLUDE_DIR VERSION_VAR GMP_VERSION ) @@ -169,9 +118,5 @@ if ( GMP_FOUND ) message ( STATUS "gmp static: ${GMP_STATIC}" ) else ( ) message ( STATUS "gmp not found" ) - set ( GMP_INCLUDE_DIR "" ) - set ( GMP_LIBRARIES "" ) - set ( GMP_LIBRARY "" ) - set ( GMP_STATIC "" ) endif ( ) diff --git a/SPEX/cmake_modules/FindMPFR.cmake b/SPEX/cmake_modules/FindMPFR.cmake index d2d2ecb835..fae9cb258d 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-2023, Timothy A. Davis. All Rights Reserved. # SPDX-License-Identifier: BSD-3-clause #------------------------------------------------------------------------------- @@ -27,108 +27,61 @@ if ( DEFINED ENV{CMAKE_PREFIX_PATH} ) # import CMAKE_PREFIX_PATH, typically created by spack - list ( PREPEND CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH} ) + set ( CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH} ) endif ( ) -# Try to get information from pkg-config file first. -find_package ( PkgConfig ) -if ( PKG_CONFIG_FOUND ) - set ( MPFR_PC_OPTIONS "" ) - if ( MPFR_FIND_VERSION ) - set ( MPFR_PC_OPTIONS "mpfr>=${MPFR_FIND_VERSION}" ) - else ( ) - set ( MPFR_PC_OPTIONS "mpfr" ) - endif ( ) - if ( MPFR_FIND_REQUIRED ) - # FIXME: Are there installations without pkg-config file? - # list ( APPEND MPFR_PC_OPTIONS REQUIRED ) - endif ( ) - pkg_check_modules ( MPFR ${MPFR_PC_OPTIONS} ) - - if ( MPFR_FOUND ) - # assume first is the actual library - list ( GET MPFR_LINK_LIBRARIES 0 MPFR_LIBRARY ) - set ( MPFR_INCLUDE_DIR ${MPFR_INCLUDEDIR} ) - endif ( ) - if (MPFR_STATIC_FOUND) - # assume first is the actual library - list ( GET MPFR_STATIC_LINK_LIBRARIES 0 MPFR_STATIC ) - set ( MPFR_INCLUDE_DIR ${MPFR_INCLUDEDIR} ) - endif ( ) -endif ( ) - -if ( NOT MPFR_FOUND ) - # Manual search if pkg-config couldn't be used. - # include files for mpfr - find_path ( MPFR_INCLUDE_DIR - NAMES mpfr.h - PATH_SUFFIXES include Include - ) - - # dynamic mpfr library (or possibly static if no mpfr dynamic library exists) - find_library ( MPFR_LIBRARY - NAMES mpfr - PATH_SUFFIXES lib build - ) - - # check if found - if ( MPFR_LIBRARY MATCHES ".*NOTFOUND" OR MPFR_INCLUDE_DIR MATCHES ".*NOTFOUND" ) - set ( FOUND_IT false ) - else ( ) - set ( FOUND_IT true ) - endif ( ) - - # static mpfr library - if ( NOT MSVC ) - set ( save_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} ) - set ( CMAKE_FIND_LIBRARY_SUFFIXES - ${CMAKE_STATIC_LIBRARY_SUFFIX} ${CMAKE_FIND_LIBRARY_SUFFIXES} ) - endif ( ) +# include files for mpfr +find_path ( MPFR_INCLUDE_DIR + NAMES mpfr.h + PATH_SUFFIXES include Include +) - find_library ( MPFR_STATIC - NAMES mpfr - PATH_SUFFIXES lib build - ) +# dynamic mpfr library +find_library ( MPFR_LIBRARY + NAMES mpfr + PATH_SUFFIXES lib build +) - if ( NOT MSVC ) - # restore the CMAKE_FIND_LIBRARY_SUFFIXES variable - set ( CMAKE_FIND_LIBRARY_SUFFIXES ${save_CMAKE_FIND_LIBRARY_SUFFIXES} ) - endif ( ) +if ( MSVC ) + set ( STATIC_SUFFIX .lib ) +else ( ) + set ( STATIC_SUFFIX .a ) +endif ( ) - # get version of the library from the filename - get_filename_component ( MPFR_LIBRARY ${MPFR_LIBRARY} REALPATH ) - - # look in the middle for 4.1.0 (/spackstuff/mpfr-4.1.0-morestuff/libmpfr.10.4.1) - string ( REGEX MATCH "mpfr-[0-9]+.[0-9]+.[0-9]+" MPFR_VERSION1 ${MPFR_LIBRARY} ) - - if ( NOT FOUND_IT ) - # mpfr has not been found - set ( MPFR_VERSION 0.0.0 ) - message ( WARNING "MPFR not found") - elseif ( MPFR_VERSION1 STREQUAL "" ) - # mpfr has been found, but not a spack library. Hunt for the version - # number in mpfr.h. The mpfr.h file includes the following line: - # #define MPFR_VERSION_STRING "4.0.2" - file ( STRINGS ${MPFR_INCLUDE_DIR}/mpfr.h MPFR_VER_STRING - REGEX "MPFR_VERSION_STRING" ) - message ( STATUS "major/minor/patch: ${MPFR_VER_STRING}" ) - if ( MPFR_VER_STRING STREQUAL "") - # look at the end of the filename for the version number - string ( - REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" - MPFR_VERSION ${MPFR_LIBRARY} ) - else ( ) - # get the version number from inside the mpfr.h file itself - string ( REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" MPFR_VERSION ${MPFR_VER_STRING} ) - endif ( ) +# static mpfr library +set ( save ${CMAKE_FIND_LIBRARY_SUFFIXES} ) +set ( CMAKE_FIND_LIBRARY_SUFFIXES ${STATIC_SUFFIX} ${CMAKE_FIND_LIBRARY_SUFFIXES} ) +find_library ( MPFR_STATIC + NAMES mpfr + PATH_SUFFIXES lib build +) +set ( CMAKE_FIND_LIBRARY_SUFFIXES ${save} ) + +# get version of the library from the filename +get_filename_component ( MPFR_LIBRARY ${MPFR_LIBRARY} REALPATH ) + +# look in the middle for 4.1.0 (/spackstuff/mpfr-4.1.0-morestuff/libmpfr.10.4.1) +string ( REGEX MATCH "mpfr-[0-9]+.[0-9]+.[0-9]+" MPFR_VERSION1 ${MPFR_LIBRARY} ) + +if ( MPFR_VERSION1 STREQUAL "" ) + # mpfr has been found, but not a spack library. Hunt for the version + # number in mpfr.h. The mpfr.h file includes the following line: + # #define MPFR_VERSION_STRING "4.0.2" + file ( STRINGS ${MPFR_INCLUDE_DIR}/mpfr.h MPFR_VER_STRING + REGEX "MPFR_VERSION_STRING" ) + message ( STATUS "from mpfr.h file: ${MPFR_VER_STRING}" ) + if ( MPFR_VER_STRING STREQUAL "") + # look at the end of the filename for the version number + string ( + REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" + MPFR_VERSION ${MPFR_LIBRARY} ) else ( ) - # look at mpfr-4.1.0 for the version number (spack library) - string ( REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" MPFR_VERSION ${MPFR_VERSION1} ) + # get the version number from inside the mpfr.h file itself + string ( REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" MPFR_VERSION ${MPFR_VER_STRING} ) endif ( ) -endif ( ) - -if ( NOT MPFR_STATIC ) - set ( MPFR_STATIC ${MPFR_LIBRARY} ) +else ( ) + # look at mpfr-4.1.0 for the version number (spack library) + string ( REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" MPFR_VERSION ${MPFR_VERSION1} ) endif ( ) set ( MPFR_LIBRARIES ${MPFR_LIBRARY} ) @@ -136,7 +89,7 @@ set ( MPFR_LIBRARIES ${MPFR_LIBRARY} ) include (FindPackageHandleStandardArgs) find_package_handle_standard_args ( MPFR - REQUIRED_VARS MPFR_LIBRARY MPFR_INCLUDE_DIR + REQUIRED_VARS MPFR_LIBRARIES MPFR_INCLUDE_DIR VERSION_VAR MPFR_VERSION ) @@ -154,9 +107,5 @@ if ( MPFR_FOUND ) message ( STATUS "mpfr static: ${MPFR_STATIC}" ) else ( ) message ( STATUS "mpfr not found" ) - set ( MPFR_INCLUDE_DIR "" ) - set ( MPFR_LIBRARIES "" ) - set ( MPFR_LIBRARY "" ) - set ( MPFR_STATIC "" ) endif ( ) diff --git a/SuiteSparse_config/CMakeLists.txt b/SuiteSparse_config/CMakeLists.txt index 8e5c119b54..cc7beefbd6 100644 --- a/SuiteSparse_config/CMakeLists.txt +++ b/SuiteSparse_config/CMakeLists.txt @@ -15,9 +15,9 @@ cmake_minimum_required ( VERSION 3.22 ) # version of both SuiteSparse and SuiteSparse_config -set ( SUITESPARSE_DATE "Jan 20, 2024" ) +set ( SUITESPARSE_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 set ( SUITESPARSE_VERSION_MAJOR 7 ) -set ( SUITESPARSE_VERSION_MINOR 6 ) +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 ) diff --git a/SuiteSparse_config/SuiteSparse_config.h b/SuiteSparse_config/SuiteSparse_config.h index 01ce98c5c8..bcea44c1fe 100644 --- a/SuiteSparse_config/SuiteSparse_config.h +++ b/SuiteSparse_config/SuiteSparse_config.h @@ -420,19 +420,19 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_HAS_VERSION_FUNCTION -#define SUITESPARSE_DATE "Jan 20, 2024" +#define SUITESPARSE_DATE "Feb XX, 2024" #define SUITESPARSE_MAIN_VERSION 7 -#define SUITESPARSE_SUB_VERSION 6 +#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(7, 6) +#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,6,0) +#define SUITESPARSE__VERSION SUITESPARSE__VERCODE(7,7,0) //============================================================================== // SuiteSparse interface to the BLAS and LAPACK libraries From fc1b944e4bfd185718e57b810e215f8d084aa7ff Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 30 Jan 2024 18:10:01 -0600 Subject: [PATCH 03/98] SPEX: create MATLAB deps and Tcov Makefile only if building shared libs --- SPEX/CMakeLists.txt | 112 +++++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 54 deletions(-) diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index 89cb2fd554..017703637f 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -432,62 +432,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_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}" ) +if ( BUILD_SHARED_LIBS ) -configure_file ( - "Config/spex_deps.m.in" - "${PROJECT_SOURCE_DIR}/MATLAB/spex_deps.m" - @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_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/Tcov_Makefile.in" - "${PROJECT_SOURCE_DIR}/Tcov/Makefile" - @ONLY - NEWLINE_STYLE LF ) + 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 ) + +endif ( ) #------------------------------------------------------------------------------- # report status From 5f74bce6a59fd85882f723b84bf3a57fd37bab39 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 30 Jan 2024 18:20:55 -0600 Subject: [PATCH 04/98] SPEX: only create MATLAB deps and Tcov/Makefile when not in root CMakeLists.txt --- SPEX/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index 017703637f..b587bbb5aa 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -432,7 +432,7 @@ endif ( ) # configure MATLAB and Tcov #------------------------------------------------------------------------------- -if ( BUILD_SHARED_LIBS ) +if ( BUILD_SHARED_LIBS AND NOT SUITESPARSE_ROOT_CMAKELISTS ) # get paths to libraries get_filename_component ( GMP_PATH ${GMP_LIBRARY} DIRECTORY ) From d406ba20bdf0bde54cf34d29c7716ba1970de39f Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 31 Jan 2024 08:15:34 -0600 Subject: [PATCH 05/98] SPEX: building spexpython library (shared only) --- SPEX/CMakeLists.txt | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index b587bbb5aa..3368729dcb 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -346,31 +346,35 @@ 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 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 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 From f70295a2d3f0edcdc7ae1faed9942e733f5b6576 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 31 Jan 2024 08:20:22 -0600 Subject: [PATCH 06/98] SPEX_initialize: add debug printfs --- SPEX/SPEX_Utilities/Source/SPEX_initialize.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c index 424802b4d2..cf6d18bfb4 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c @@ -38,10 +38,18 @@ void spex_set_initialized (bool s) SPEX_info SPEX_initialize ( void ) { - if (spex_initialized( )) return (SPEX_PANIC); + if (spex_initialized( )) + { + printf ("SPEX PANIC: already initialized\n") ; + 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 (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) + { + printf ("SPEX PANIC: GMP misconfigured\n") ; + return (SPEX_PANIC); + } // tell GMP and MPFR which memory allocation functions to use mp_set_memory_functions @@ -53,6 +61,10 @@ SPEX_info SPEX_initialize ( void ) // initialize the SPEX GMP interface for the primary thread SPEX_info info = spex_gmp_initialize (1) ; + if (info != SPEX_OK) + { + printf ("SPEX ERROR: GMP not initialized: %d\n", info) ; + } if (info == SPEX_OK) { spex_set_initialized (true); From d2cae1eea09494dd55b19266266c303e8a2a2fa5 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 31 Jan 2024 08:24:27 -0600 Subject: [PATCH 07/98] SPEX: building demos --- SPEX/CMakeLists.txt | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index 3368729dcb..9d2d1c4ba1 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -406,24 +406,23 @@ if ( SUITESPARSE_DEMOS ) # Libraries required for Demo programs if ( BUILD_SHARED_LIBS ) - target_link_libraries ( spex_demo_backslash PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) - target_link_libraries ( spex_demo_cholesky_extended PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) - target_link_libraries ( spex_demo_cholesky_simple PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) - target_link_libraries ( spex_demo_lu_doub PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) - target_link_libraries ( spex_demo_lu_extended PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) - target_link_libraries ( spex_demo_lu_simple1 PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) - target_link_libraries ( spex_demo_lu_simple2 PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) - target_link_libraries ( spex_demo_threaded PUBLIC SPEX SuiteSparse::SuiteSparseConfig ${MPFR_LIBRARIES} ${GMP_LIBRARIES} ) - + 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 ) - target_link_libraries ( spex_demo_cholesky_extended PUBLIC SPEX_static ) - target_link_libraries ( spex_demo_cholesky_simple PUBLIC SPEX_static ) - target_link_libraries ( spex_demo_lu_doub PUBLIC SPEX_static ) - target_link_libraries ( spex_demo_lu_extended PUBLIC SPEX_static ) - target_link_libraries ( spex_demo_lu_simple1 PUBLIC SPEX_static ) - target_link_libraries ( spex_demo_lu_simple2 PUBLIC SPEX_static ) - target_link_libraries ( spex_demo_threaded PUBLIC SPEX_static ) + 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 ( ) else ( ) From bf14c7d05767d4484cece2d721bdac585a1f094c Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 31 Jan 2024 08:54:22 -0600 Subject: [PATCH 08/98] SPEX: temporarily disable check for sizeof(mp_bitcnt_t), for Windows --- SPEX/SPEX_Utilities/Source/SPEX_initialize.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c index cf6d18bfb4..a35d7dbcab 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c @@ -44,12 +44,15 @@ SPEX_info SPEX_initialize ( void ) return (SPEX_PANIC); } +#if 0 + // FIXME: why does SPEX 3.0 require sizeof (mp_bitcnt_t) to be sizeof (uint64_t)? // SPEX requires GMP to support bit counts that are 64-bit integers if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) { printf ("SPEX PANIC: GMP misconfigured\n") ; return (SPEX_PANIC); } +#endif // tell GMP and MPFR which memory allocation functions to use mp_set_memory_functions From 413fd1e8be5cb2fc5336d3e13c6f54b319109206 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 31 Jan 2024 10:16:42 -0600 Subject: [PATCH 09/98] FIXME comment in SPEX demos --- SPEX/Demo/spex_demos.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SPEX/Demo/spex_demos.h b/SPEX/Demo/spex_demos.h index 8d8a847343..3e85ebb368 100644 --- a/SPEX/Demo/spex_demos.h +++ b/SPEX/Demo/spex_demos.h @@ -11,7 +11,10 @@ #include "SPEX.h" +// FIXME: why include spex_util_internal.h?? #include "spex_util_internal.h" +// FIXME: why include spex_gmp.h?? It's not installed. Do we add it to +// the installed headers? #include "spex_gmp.h" #define DEMO_OK(method) \ From 0fbacda9bb8fac5796460946849e3a0f5a876bb1 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 31 Jan 2024 10:44:31 -0600 Subject: [PATCH 10/98] printf debug --- SPEX/SPEX_Utilities/Source/SPEX_initialize.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c index a35d7dbcab..a372abd415 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c @@ -44,6 +44,9 @@ SPEX_info SPEX_initialize ( void ) return (SPEX_PANIC); } + printf ("sizeof (mp_bitcnt_t): %d\n", (int) sizeof (mp_bitcnt_t)) ; + printf ("sizeof (uint64_t): %d\n", (int) sizeof (uint64_t)) ; + #if 0 // FIXME: why does SPEX 3.0 require sizeof (mp_bitcnt_t) to be sizeof (uint64_t)? // SPEX requires GMP to support bit counts that are 64-bit integers From 7998d0e9d1c9c290e8a3a76ef94c868513800d7a Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 31 Jan 2024 13:48:09 -0600 Subject: [PATCH 11/98] SPEX: demos --- SPEX/Demo/Utilities/spex_demo_check_solution.c | 5 ----- SPEX/Demo/spex_demo_backslash.c | 10 ++++++---- SPEX/Demo/spex_demo_cholesky_extended.c | 9 +++++---- SPEX/Demo/spex_demo_cholesky_simple.c | 15 ++++++++------- SPEX/Demo/spex_demo_lu_doub.c | 13 ++++++------- SPEX/Demo/spex_demo_lu_extended.c | 11 +++++------ SPEX/Demo/spex_demo_lu_simple1.c | 4 ++-- SPEX/Demo/spex_demo_lu_simple2.c | 16 ++++++++-------- SPEX/Demo/spex_demo_threaded.c | 10 ++++++---- SPEX/Demo/spex_demos.h | 18 +++++++++++++++++- SPEX/SPEX_Utilities/Source/SPEX_initialize.c | 17 ++++++----------- 11 files changed, 69 insertions(+), 59 deletions(-) diff --git a/SPEX/Demo/Utilities/spex_demo_check_solution.c b/SPEX/Demo/Utilities/spex_demo_check_solution.c index 9e2a8c8a13..f7e8684e3a 100644 --- a/SPEX/Demo/Utilities/spex_demo_check_solution.c +++ b/SPEX/Demo/Utilities/spex_demo_check_solution.c @@ -29,16 +29,12 @@ 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 @@ -54,7 +50,6 @@ SPEX_info spex_demo_check_solution SPEX_CHECK (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 // scaled matrix with all entries in integer diff --git a/SPEX/Demo/spex_demo_backslash.c b/SPEX/Demo/spex_demo_backslash.c index 31e838bbf3..76cdb94afa 100644 --- a/SPEX/Demo/spex_demo_backslash.c +++ b/SPEX/Demo/spex_demo_backslash.c @@ -33,12 +33,13 @@ 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(); + + DEMO_INIT (ok) ; //-------------------------------------------------------------------------- // Declare memory & Process Command Line //-------------------------------------------------------------------------- - int64_t n = 0, ok; + int64_t n = 0 ; SPEX_matrix A = NULL; SPEX_matrix b = NULL; @@ -66,7 +67,7 @@ int main( int argc, char *argv[] ) { 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 @@ -82,7 +83,7 @@ int main( int argc, char *argv[] ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); @@ -119,5 +120,6 @@ int main( int argc, char *argv[] ) // 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 cbfd154bd8..cba9ccecf0 100644 --- a/SPEX/Demo/spex_demo_cholesky_extended.c +++ b/SPEX/Demo/spex_demo_cholesky_extended.c @@ -31,12 +31,12 @@ int main( int argc, char *argv[] ) // done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_initialize(); + DEMO_INIT (ok) ; //-------------------------------------------------------------------------- // Declare memory & Process Command Line //-------------------------------------------------------------------------- - int64_t n = 0, ok; + int64_t n = 0 ; SPEX_symbolic_analysis S = NULL; SPEX_factorization F = NULL ; @@ -65,7 +65,7 @@ int main( int argc, char *argv[] ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); @@ -82,7 +82,7 @@ int main( int argc, char *argv[] ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); @@ -148,5 +148,6 @@ int main( int argc, char *argv[] ) //-------------------------------------------------------------------------- FREE_WORKSPACE; + return (0) ; } diff --git a/SPEX/Demo/spex_demo_cholesky_simple.c b/SPEX/Demo/spex_demo_cholesky_simple.c index 2cf702914c..42a2f8bfdf 100644 --- a/SPEX/Demo/spex_demo_cholesky_simple.c +++ b/SPEX/Demo/spex_demo_cholesky_simple.c @@ -35,7 +35,8 @@ 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(); + + DEMO_INIT (ok) ; //-------------------------------------------------------------------------- // Get matrix file name @@ -52,7 +53,7 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- // Declare our data structures //-------------------------------------------------------------------------- - 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 @@ -63,7 +64,7 @@ int main (int argc, char **argv) { fprintf (stderr, "Error! OUT of MEMORY!\n"); FREE_WORKSPACE; - return 0; + return (1) ; } option->order = SPEX_AMD; //AMD is default for Cholesky @@ -82,7 +83,7 @@ int main (int argc, char **argv) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); @@ -99,7 +100,7 @@ int main (int argc, char **argv) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); @@ -110,7 +111,7 @@ 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 @@ -140,6 +141,6 @@ int main (int argc, char **argv) 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 203f90793f..690f50544f 100644 --- a/SPEX/Demo/spex_demo_lu_doub.c +++ b/SPEX/Demo/spex_demo_lu_doub.c @@ -72,7 +72,7 @@ int main (int argc, char *argv[]) // is done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_initialize(); + DEMO_INIT (ok) ; //-------------------------------------------------------------------------- // We first initialize the default parameters. These parameters are modified @@ -111,7 +111,6 @@ int main (int argc, char *argv[]) SPEX_matrix A = NULL; SPEX_symbolic_analysis S = NULL; SPEX_factorization F = NULL; - SPEX_info ok ; // Initialize option, command options for the factorization SPEX_options option = NULL; @@ -145,7 +144,7 @@ int main (int argc, char *argv[]) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_FP64, option)); @@ -158,7 +157,7 @@ int main (int argc, char *argv[]) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } DEMO_OK(SPEX_read_dense(&b, rhs_file, option)); fclose(rhs_file); @@ -168,7 +167,7 @@ int main (int argc, char *argv[]) { fprintf (stderr, "Error! Size of A and b do not match!\n"); FREE_WORKSPACE; - return 0; + return (1) ; } #endif @@ -205,7 +204,7 @@ int main (int argc, char *argv[]) { printf("\nSingular"); } - return 0; + return (1) ; } double end_factor = SuiteSparse_time (); @@ -229,6 +228,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 b0d67ccdb2..9190d58791 100644 --- a/SPEX/Demo/spex_demo_lu_extended.c +++ b/SPEX/Demo/spex_demo_lu_extended.c @@ -83,7 +83,7 @@ int main (int argc, char *argv[]) // is done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_initialize(); + DEMO_INIT (ok) ; //-------------------------------------------------------------------------- // We first initialize the default parameters. These parameters are modified @@ -124,7 +124,6 @@ int main (int argc, char *argv[]) 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; @@ -159,7 +158,7 @@ int main (int argc, char *argv[]) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); fclose(mat_file); @@ -170,7 +169,7 @@ int main (int argc, char *argv[]) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); @@ -180,7 +179,7 @@ int main (int argc, char *argv[]) { fprintf (stderr, "Error! Size of A and b do not match!\n"); FREE_WORKSPACE; - return 0; + return (1) ; } //-------------------------------------------------------------------------- @@ -271,6 +270,6 @@ 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; + return (0) ; } diff --git a/SPEX/Demo/spex_demo_lu_simple1.c b/SPEX/Demo/spex_demo_lu_simple1.c index cd92f8e41b..4f8fde794c 100644 --- a/SPEX/Demo/spex_demo_lu_simple1.c +++ b/SPEX/Demo/spex_demo_lu_simple1.c @@ -37,7 +37,7 @@ int main (void) // is done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_info ok = SPEX_initialize(); + DEMO_INIT (ok) ; //-------------------------------------------------------------------------- // Declare and initialize essential variables @@ -115,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 674a2d7ea5..b36716a014 100644 --- a/SPEX/Demo/spex_demo_lu_simple2.c +++ b/SPEX/Demo/spex_demo_lu_simple2.c @@ -40,7 +40,8 @@ int main (int argc, char **argv) // Prior to using SPEX Left LU, its environment must be initialized. This is // done by calling the SPEX_initialize() function. //-------------------------------------------------------------------------- - SPEX_initialize(); + + DEMO_INIT (ok) ; //-------------------------------------------------------------------------- // Get matrix and right hand side file names @@ -50,17 +51,16 @@ int main (int argc, char **argv) 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 //-------------------------------------------------------------------------- - SPEX_info ok; + SPEX_matrix A = NULL ; // input matrix SPEX_matrix b = NULL ; // Right hand side vector SPEX_matrix x = NULL ; // Solution vectors @@ -79,7 +79,7 @@ int main (int argc, char **argv) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } DEMO_OK(spex_demo_tripread(&A, mat_file, SPEX_MPZ, option)); fclose(mat_file); @@ -91,7 +91,7 @@ int main (int argc, char **argv) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); @@ -102,7 +102,7 @@ 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) ; } //-------------------------------------------------------------------------- @@ -131,6 +131,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_threaded.c b/SPEX/Demo/spex_demo_threaded.c index 64eefa863a..be424fbf0c 100644 --- a/SPEX/Demo/spex_demo_threaded.c +++ b/SPEX/Demo/spex_demo_threaded.c @@ -34,12 +34,13 @@ 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(); + + DEMO_INIT (ok) ; //-------------------------------------------------------------------------- // Declare memory & Process Command Line //-------------------------------------------------------------------------- - int64_t n = 0, ok ; + int64_t n = 0 ; SPEX_matrix A = NULL; SPEX_matrix b = NULL; @@ -65,7 +66,7 @@ int main( int argc, char *argv[] ) { 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 @@ -81,7 +82,7 @@ int main( int argc, char *argv[] ) { perror("Error while opening the file"); FREE_WORKSPACE; - return 0; + return (1) ; } DEMO_OK(spex_demo_read_dense(&b, rhs_file, option)); fclose(rhs_file); @@ -179,5 +180,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 3e85ebb368..777c2c9ee3 100644 --- a/SPEX/Demo/spex_demos.h +++ b/SPEX/Demo/spex_demos.h @@ -24,12 +24,28 @@ { \ spex_demo_determine_error (ok) ; \ FREE_WORKSPACE ; \ - return 0 ; \ + return (1) ; \ } \ } #define SPEX_MIN(a,b) (((a) < (b)) ? (a) : (b)) +#define DEMO_INIT(ok) \ + if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) \ + { \ + /* return 0 so the github CI does not fail */ \ + printf ("SPEX ERROR: GMP configuration not supported:\n") ; \ + printf ("sizeof (mp_bitcnt_t): %d\n", (int) sizeof (mp_bitcnt_t)) ; \ + printf ("sizeof (uint64_t): %d\n", (int) sizeof (uint64_t)) ; \ + return (0) ; \ + } \ + SPEX_info ok = SPEX_initialize ( ) ; \ + if (ok != SPEX_OK) \ + { \ + fprintf (stderr, "SPEX ERROR: failed to initialize\n") ; \ + return (1) ; \ + } + /* Purpose: This processes the command line for user specified options */ SPEX_info spex_demo_process_command_line //processes the command line ( diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c index a372abd415..739a1e954c 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c @@ -40,22 +40,17 @@ SPEX_info SPEX_initialize ( void ) { if (spex_initialized( )) { - printf ("SPEX PANIC: already initialized\n") ; +// printf ("SPEX PANIC: already initialized\n") ; return (SPEX_PANIC); } - printf ("sizeof (mp_bitcnt_t): %d\n", (int) sizeof (mp_bitcnt_t)) ; - printf ("sizeof (uint64_t): %d\n", (int) sizeof (uint64_t)) ; - -#if 0 // FIXME: why does SPEX 3.0 require sizeof (mp_bitcnt_t) to be sizeof (uint64_t)? // SPEX requires GMP to support bit counts that are 64-bit integers if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) { - printf ("SPEX PANIC: GMP misconfigured\n") ; +// printf ("SPEX ERROR: GMP configuration not supported\n") ; return (SPEX_PANIC); } -#endif // tell GMP and MPFR which memory allocation functions to use mp_set_memory_functions @@ -67,10 +62,10 @@ SPEX_info SPEX_initialize ( void ) // initialize the SPEX GMP interface for the primary thread SPEX_info info = spex_gmp_initialize (1) ; - if (info != SPEX_OK) - { - printf ("SPEX ERROR: GMP not initialized: %d\n", info) ; - } +// if (info != SPEX_OK) +// { +// printf ("SPEX ERROR: GMP not initialized: %d\n", info) ; +// } if (info == SPEX_OK) { spex_set_initialized (true); From c924f40c9b6358574076c73893274959d9682655 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 31 Jan 2024 13:50:58 -0600 Subject: [PATCH 12/98] SPEX: printf format --- SPEX/Demo/spex_demo_cholesky_extended.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SPEX/Demo/spex_demo_cholesky_extended.c b/SPEX/Demo/spex_demo_cholesky_extended.c index cba9ccecf0..8997201ff1 100644 --- a/SPEX/Demo/spex_demo_cholesky_extended.c +++ b/SPEX/Demo/spex_demo_cholesky_extended.c @@ -133,8 +133,8 @@ int main( int argc, char *argv[] ) 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); From b09df583d4826b1731dae7dabe008013b894b4d6 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 31 Jan 2024 15:29:45 -0600 Subject: [PATCH 13/98] Example: link with GMP and MPFR; SPEX: append to prefix path, do not reset it --- Example/CMakeLists.txt | 45 ++++++++++++++++--------------- Example/Include/my_internal.h | 4 +++ Example/Source/my.c | 24 ++++++++++++----- Example/Source/my_cxx.cc | 30 ++++++++++++++++----- SPEX/cmake_modules/FindGMP.cmake | 2 +- SPEX/cmake_modules/FindMPFR.cmake | 2 +- 6 files changed, 70 insertions(+), 37 deletions(-) diff --git a/Example/CMakeLists.txt b/Example/CMakeLists.txt index 72ea5b5a5f..5f885241d0 100644 --- a/Example/CMakeLists.txt +++ b/Example/CMakeLists.txt @@ -107,6 +107,10 @@ find_package ( SPEX 3.1.0 REQUIRED ) # requires GMP and MPFR find_package ( SPQR 4.3.2 REQUIRED ) find_package ( UMFPACK 6.3.2 REQUIRED ) +# for GMP and MPFR +find_package ( MPFR 4.0.2 REQUIRED ) # from SPEX/cmake_modules +find_package ( GMP 6.1.2 REQUIRED ) # from SPEX/cmake_modules + #------------------------------------------------------------------------------- # configure files #------------------------------------------------------------------------------- @@ -506,15 +510,12 @@ endif ( ) # other libraries #------------------------------------------------------------------------------- -# The "MY" library does not directly rely on the OpenMP, libm, BLAS, LAPACK, -# GMP, and MPFR libraries. However, if you wish to create a library that -# uses those libraries, uncomment the corresponding section. For example, -# when using SPEX, it would be common to also need direct access to GMP and -# MPFR. These direct dependencies are left out of the MY CMakeLists.txt, as -# a test for the other SuiteSparse cmake build system, to ensure that the -# libraries should be linked via the libraries that depend on them. For -# example, linking with SPEX (above) should bring in GMP and MPRF for use in -# SPEX (but not in MY). +# The "MY" library does not directly rely on the OpenMP, libm, BLAS, and +# LAPACK, libraries. However, if you wish to create a library that uses those +# libraries, uncomment the corresponding section. These direct dependencies +# are left out of the MY CMakeLists.txt, as a test for the other SuiteSparse +# cmake build system, to ensure that the libraries should be linked via the +# libraries that depend on them. if ( 0 ) @@ -571,19 +572,9 @@ if ( 0 ) endif ( ) include_directories ( ${LAPACK_INCLUDE_DIRS} ) - # gmp: - message ( STATUS "GMP library: ${GMP_LIBRARIES}" ) - if ( BUILD_SHARED_LIBS ) - target_link_libraries ( my PRIVATE ${GMP_LIBRARIES} ) - target_link_libraries ( my_cxx PRIVATE ${GMP_LIBRARIES} ) - endif ( ) - if ( BUILD_STATIC_LIBS ) - target_link_libraries ( my_static PUBLIC ${GMP_STATIC} ) - target_link_libraries ( my_cxx_static PUBLIC ${GMP_STATIC} ) - endif ( ) - include_directories ( ${GMP_INCLUDE_DIR} ) +endif ( ) - # mpfr: + # MPFR: message ( STATUS "MPFR library: ${MPFR_LIBRARIES}" ) if ( BUILD_SHARED_LIBS ) target_link_libraries ( my PRIVATE ${MPFR_LIBRARIES} ) @@ -595,7 +586,17 @@ if ( 0 ) endif ( ) include_directories ( ${MPFR_INCLUDE_DIR} ) -endif ( ) + # GMP (must be linked after MPFR) + message ( STATUS "GMP library: ${GMP_LIBRARIES}" ) + if ( BUILD_SHARED_LIBS ) + target_link_libraries ( my PRIVATE ${GMP_LIBRARIES} ) + target_link_libraries ( my_cxx PRIVATE ${GMP_LIBRARIES} ) + endif ( ) + if ( BUILD_STATIC_LIBS ) + target_link_libraries ( my_static PUBLIC ${GMP_STATIC} ) + target_link_libraries ( my_cxx_static PUBLIC ${GMP_STATIC} ) + endif ( ) + include_directories ( ${GMP_INCLUDE_DIR} ) #------------------------------------------------------------------------------- # installation location diff --git a/Example/Include/my_internal.h b/Example/Include/my_internal.h index e1c1b60c5f..b3c6520217 100644 --- a/Example/Include/my_internal.h +++ b/Example/Include/my_internal.h @@ -112,6 +112,10 @@ // OpenMP include file: #include +// GMP and MPFR +#include +#include + #include "my.h" #endif diff --git a/Example/Source/my.c b/Example/Source/my.c index 83caa38f13..f47ace8b4e 100644 --- a/Example/Source/my.c +++ b/Example/Source/my.c @@ -373,13 +373,25 @@ int my_function (void) // returns 0 on success, -1 on failure // SPEX //-------------------------------------------------------------------------- - OK (SPEX_initialize ( ) == SPEX_OK) ; - char spex_date [128] ; - OK (SPEX_version (version, spex_date) == SPEX_OK) ; - OK (my_check_version ("SPEX", + // SPEX 3.0 requires GMP to support bit counts that are 64-bit integers + if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) + { + printf ("\n------------------------------------------------------------\n") ; + printf ("SPEX %d.%d.%d (%s) not supported on this platform.\n" + "GMP sizeof (mp_bitcnt_t) is %d, which is < sizeof (uint64_t) = %d\n", SPEX_VERSION_MAJOR, SPEX_VERSION_MINOR, SPEX_VERSION_SUB, SPEX_DATE, - version, SPEX__VERSION)) ; - OK (SPEX_finalize ( ) == SPEX_OK) ; + (int) sizeof (mp_bitcnt_t), (int) sizeof (uint64_t)) ; + } + else + { + OK (SPEX_initialize ( ) == SPEX_OK) ; + char spex_date [128] ; + OK (SPEX_version (version, spex_date) == SPEX_OK) ; + OK (my_check_version ("SPEX", + SPEX_VERSION_MAJOR, SPEX_VERSION_MINOR, SPEX_VERSION_SUB, SPEX_DATE, + version, SPEX__VERSION)) ; + OK (SPEX_finalize ( ) == SPEX_OK) ; + } //-------------------------------------------------------------------------- // SPQR diff --git a/Example/Source/my_cxx.cc b/Example/Source/my_cxx.cc index ffeb1484bd..74ebd057cf 100644 --- a/Example/Source/my_cxx.cc +++ b/Example/Source/my_cxx.cc @@ -380,13 +380,29 @@ int my_function (void) // returns 0 on success, -1 on failure // SPEX //-------------------------------------------------------------------------- - OK (SPEX_initialize ( ) == SPEX_OK) ; - char spex_date [128] ; - OK (SPEX_version (version, spex_date) == SPEX_OK) ; - OK (my_check_version ("SPEX", - SPEX_VERSION_MAJOR, SPEX_VERSION_MINOR, SPEX_VERSION_SUB, SPEX_DATE, - version, SPEX__VERSION)) ; - OK (SPEX_finalize ( ) == SPEX_OK) ; + // SPEX 3.0 requires GMP to support bit counts that are 64-bit integers + if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) + { + std::cout << + "\n------------------------------------------------------------" + << std::endl ; + std::cout << "SPEX " << SPEX_VERSION_MAJOR << "." << SPEX_VERSION_MINOR + << "." << SPEX_VERSION_SUB << " (" << SPEX_DATE << + ") not supported on this platform." << std::endl ; + std::cout << "GMP sizeof (mp_bitcnt_t) is " << sizeof (mp_bitcnt_t) + << ", which is < sizeof (uint64_t) = " << sizeof (uint64_t) + << std::endl ; + } + else + { + OK (SPEX_initialize ( ) == SPEX_OK) ; + char spex_date [128] ; + OK (SPEX_version (version, spex_date) == SPEX_OK) ; + OK (my_check_version ("SPEX", + SPEX_VERSION_MAJOR, SPEX_VERSION_MINOR, SPEX_VERSION_SUB, SPEX_DATE, + version, SPEX__VERSION)) ; + OK (SPEX_finalize ( ) == SPEX_OK) ; + } //-------------------------------------------------------------------------- // SPQR diff --git a/SPEX/cmake_modules/FindGMP.cmake b/SPEX/cmake_modules/FindGMP.cmake index 2fa7773c0e..a772d89515 100644 --- a/SPEX/cmake_modules/FindGMP.cmake +++ b/SPEX/cmake_modules/FindGMP.cmake @@ -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 fae9cb258d..4f0589617b 100644 --- a/SPEX/cmake_modules/FindMPFR.cmake +++ b/SPEX/cmake_modules/FindMPFR.cmake @@ -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 From 2e8c9b6f35afb3a019155a9fccf16da1d15b7b48 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 31 Jan 2024 16:45:18 -0600 Subject: [PATCH 14/98] more info printed for SPEX demos --- SPEX/Demo/spex_demos.h | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/SPEX/Demo/spex_demos.h b/SPEX/Demo/spex_demos.h index 777c2c9ee3..4ca8c9badb 100644 --- a/SPEX/Demo/spex_demos.h +++ b/SPEX/Demo/spex_demos.h @@ -30,20 +30,22 @@ #define SPEX_MIN(a,b) (((a) < (b)) ? (a) : (b)) -#define DEMO_INIT(ok) \ - if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) \ - { \ - /* return 0 so the github CI does not fail */ \ - printf ("SPEX ERROR: GMP configuration not supported:\n") ; \ - printf ("sizeof (mp_bitcnt_t): %d\n", (int) sizeof (mp_bitcnt_t)) ; \ - printf ("sizeof (uint64_t): %d\n", (int) sizeof (uint64_t)) ; \ - return (0) ; \ - } \ - SPEX_info ok = SPEX_initialize ( ) ; \ - if (ok != SPEX_OK) \ - { \ - fprintf (stderr, "SPEX ERROR: failed to initialize\n") ; \ - return (1) ; \ +#define DEMO_INIT(ok) \ + if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) \ + { \ + /* return 0 so the github CI does not fail */ \ + printf ("SPEX ERROR: GMP configuration not supported:\n") ; \ + printf (" sizeof (mp_bitcnt_t): %d\n", (int) sizeof (mp_bitcnt_t)) ; \ + printf (" sizeof (uint64_t): %d\n", (int) sizeof (uint64_t)) ; \ + printf (" sizeof (mp_bitcnt_t) is too small;\n") ; \ + printf (" it must be >= sizeof (uint64_t)\n" ) ; \ + return (0) ; \ + } \ + SPEX_info ok = SPEX_initialize ( ) ; \ + if (ok != SPEX_OK) \ + { \ + fprintf (stderr, "SPEX ERROR: failed to initialize\n") ; \ + return (1) ; \ } /* Purpose: This processes the command line for user specified options */ From 7ae56de7bd8bb46203f3e5818a70113a04aa4fa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Fri, 2 Feb 2024 18:52:55 +0100 Subject: [PATCH 15/98] CMake: Use MSVC naming convention for compilers that simulate a MSVC backend. There are different versions of Clang on Windows: Some of those versions use a GNU-compatible command line interface. Other versions use a MSVC-compatible command line interface (`clang-cl`). Additionally, either of those versions could use a MSVC-compatible backend or a MinGW-compatible backend. CMake sets the MSVC variable if the compiler uses a MSVC-compatible command line interface *and* a MSVC-compatible backend. The naming convention for import libraries differs between the MSVC-compatible (`.lib`) and MinGW-compatible backends (`.dll.a`). Use the same naming conventions for static libraries that are used for MSVC also for the Clang that uses a GNU-compatible command line interface but a MSVC-compatible backend. This should be fixing #749. --- AMD/CMakeLists.txt | 2 +- BTF/CMakeLists.txt | 2 +- CAMD/CMakeLists.txt | 2 +- CCOLAMD/CMakeLists.txt | 2 +- CHOLMOD/CMakeLists.txt | 2 +- COLAMD/CMakeLists.txt | 2 +- CSparse/CMakeLists.txt | 2 +- CXSparse/CMakeLists.txt | 2 +- Example/CMakeLists.txt | 4 ++-- GraphBLAS/CMakeLists.txt | 2 +- KLU/CMakeLists.txt | 4 ++-- LAGraph/experimental/CMakeLists.txt | 2 +- LAGraph/experimental/test/CMakeLists.txt | 2 +- LAGraph/src/CMakeLists.txt | 2 +- LAGraph/src/test/CMakeLists.txt | 2 +- LDL/CMakeLists.txt | 2 +- Mongoose/CMakeLists.txt | 2 +- ParU/CMakeLists.txt | 2 +- RBio/CMakeLists.txt | 2 +- SPEX/CMakeLists.txt | 2 +- SPQR/CMakeLists.txt | 2 +- SPQR/GPUQREngine/CMakeLists.txt | 2 +- SPQR/GPURuntime/CMakeLists.txt | 2 +- SuiteSparse_config/CMakeLists.txt | 2 +- UMFPACK/CMakeLists.txt | 2 +- 25 files changed, 27 insertions(+), 27 deletions(-) diff --git a/AMD/CMakeLists.txt b/AMD/CMakeLists.txt index 3253759112..3255eca23d 100644 --- a/AMD/CMakeLists.txt +++ b/AMD/CMakeLists.txt @@ -113,7 +113,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME amd PUBLIC_HEADER "Include/amd.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( AMD_static PROPERTIES OUTPUT_NAME amd_static ) endif ( ) diff --git a/BTF/CMakeLists.txt b/BTF/CMakeLists.txt index 059bb80c25..19afabefd9 100644 --- a/BTF/CMakeLists.txt +++ b/BTF/CMakeLists.txt @@ -104,7 +104,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME btf PUBLIC_HEADER "Include/btf.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( BTF_static PROPERTIES OUTPUT_NAME btf_static ) endif ( ) diff --git a/CAMD/CMakeLists.txt b/CAMD/CMakeLists.txt index e65d546d00..70e620eec5 100644 --- a/CAMD/CMakeLists.txt +++ b/CAMD/CMakeLists.txt @@ -107,7 +107,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME camd PUBLIC_HEADER "Include/camd.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( CAMD_static PROPERTIES OUTPUT_NAME camd_static ) endif ( ) diff --git a/CCOLAMD/CMakeLists.txt b/CCOLAMD/CMakeLists.txt index 5aa7439bfd..f6e7be6f7c 100644 --- a/CCOLAMD/CMakeLists.txt +++ b/CCOLAMD/CMakeLists.txt @@ -104,7 +104,7 @@ if ( BUILD_STATIC_LIBS ) C_STANDARD_REQUIRED ON PUBLIC_HEADER "Include/ccolamd.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( CCOLAMD_static PROPERTIES OUTPUT_NAME ccolamd_static ) endif ( ) diff --git a/CHOLMOD/CMakeLists.txt b/CHOLMOD/CMakeLists.txt index 7dce63fb3f..a04fc2e0c6 100644 --- a/CHOLMOD/CMakeLists.txt +++ b/CHOLMOD/CMakeLists.txt @@ -363,7 +363,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME cholmod PUBLIC_HEADER "Include/cholmod.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( CHOLMOD_static PROPERTIES OUTPUT_NAME cholmod_static ) endif ( ) diff --git a/COLAMD/CMakeLists.txt b/COLAMD/CMakeLists.txt index 39ac72edac..129f0d579a 100644 --- a/COLAMD/CMakeLists.txt +++ b/COLAMD/CMakeLists.txt @@ -104,7 +104,7 @@ if ( BUILD_STATIC_LIBS ) C_STANDARD_REQUIRED ON PUBLIC_HEADER "Include/colamd.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( COLAMD_static PROPERTIES OUTPUT_NAME colamd_static ) endif ( ) diff --git a/CSparse/CMakeLists.txt b/CSparse/CMakeLists.txt index 9740c1bf0b..79544508a3 100644 --- a/CSparse/CMakeLists.txt +++ b/CSparse/CMakeLists.txt @@ -113,7 +113,7 @@ if ( BUILD_STATIC_LIBS ) C_STANDARD_REQUIRED ON PUBLIC_HEADER "Include/cs.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( csparse_static PROPERTIES OUTPUT_NAME csparse_static ) endif ( ) diff --git a/CXSparse/CMakeLists.txt b/CXSparse/CMakeLists.txt index 141e4ee7c5..805b623e74 100644 --- a/CXSparse/CMakeLists.txt +++ b/CXSparse/CMakeLists.txt @@ -144,7 +144,7 @@ if ( BUILD_STATIC_LIBS ) C_STANDARD_REQUIRED ON PUBLIC_HEADER "Include/cs.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( CXSparse_static PROPERTIES OUTPUT_NAME cxsparse_static ) endif ( ) diff --git a/Example/CMakeLists.txt b/Example/CMakeLists.txt index 5f885241d0..0fe1d9ac32 100644 --- a/Example/CMakeLists.txt +++ b/Example/CMakeLists.txt @@ -154,7 +154,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME my SOVERSION ${MY_VERSION_MAJOR} ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( my_static PROPERTIES OUTPUT_NAME my_static ) endif ( ) @@ -189,7 +189,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME my_cxx SOVERSION ${MY_VERSION_MAJOR} ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( my_cxx_static PROPERTIES OUTPUT_NAME my_cxx_static ) endif ( ) diff --git a/GraphBLAS/CMakeLists.txt b/GraphBLAS/CMakeLists.txt index 0889cb19b6..2c3cbcb348 100644 --- a/GraphBLAS/CMakeLists.txt +++ b/GraphBLAS/CMakeLists.txt @@ -325,7 +325,7 @@ if ( BUILD_STATIC_LIBS ) C_STANDARD_REQUIRED ON PUBLIC_HEADER "Include/GraphBLAS.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( GraphBLAS_static PROPERTIES OUTPUT_NAME graphblas_static ) endif ( ) diff --git a/KLU/CMakeLists.txt b/KLU/CMakeLists.txt index 05025e37f1..818aaa2a05 100644 --- a/KLU/CMakeLists.txt +++ b/KLU/CMakeLists.txt @@ -162,7 +162,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME klu PUBLIC_HEADER "Include/klu.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( KLU_static PROPERTIES OUTPUT_NAME klu_static ) endif ( ) @@ -213,7 +213,7 @@ if ( KLU_HAS_CHOLMOD ) OUTPUT_NAME klu_cholmod PUBLIC_HEADER "User/klu_cholmod.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( KLU_CHOLMOD_static PROPERTIES OUTPUT_NAME klu_cholmod_static ) endif ( ) diff --git a/LAGraph/experimental/CMakeLists.txt b/LAGraph/experimental/CMakeLists.txt index 2caaa1c6d9..217abb9b92 100644 --- a/LAGraph/experimental/CMakeLists.txt +++ b/LAGraph/experimental/CMakeLists.txt @@ -61,7 +61,7 @@ if ( BUILD_STATIC_LIBS ) C_STANDARD 11 PUBLIC_HEADER "include/LAGraphX.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( LAGraphX_static PROPERTIES OUTPUT_NAME lagraphx_static ) endif ( ) diff --git a/LAGraph/experimental/test/CMakeLists.txt b/LAGraph/experimental/test/CMakeLists.txt index 3f72d74b9e..0df29008ae 100644 --- a/LAGraph/experimental/test/CMakeLists.txt +++ b/LAGraph/experimental/test/CMakeLists.txt @@ -62,7 +62,7 @@ if ( BUILD_STATIC_LIBS ) C_STANDARD_REQUIRED ON C_STANDARD 11 ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( lagraphxtest_static PROPERTIES OUTPUT_NAME lagraphxtest_static ) endif ( ) diff --git a/LAGraph/src/CMakeLists.txt b/LAGraph/src/CMakeLists.txt index 09177c73ee..451f0bd2ba 100644 --- a/LAGraph/src/CMakeLists.txt +++ b/LAGraph/src/CMakeLists.txt @@ -63,7 +63,7 @@ if ( BUILD_STATIC_LIBS ) C_STANDARD 11 PUBLIC_HEADER "include/LAGraph.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( LAGraph_static PROPERTIES OUTPUT_NAME lagraph_static ) endif ( ) diff --git a/LAGraph/src/test/CMakeLists.txt b/LAGraph/src/test/CMakeLists.txt index 37e56418ae..db36bd3581 100644 --- a/LAGraph/src/test/CMakeLists.txt +++ b/LAGraph/src/test/CMakeLists.txt @@ -64,7 +64,7 @@ if ( BUILD_STATIC_LIBS ) C_STANDARD_REQUIRED ON C_STANDARD 11 ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( lagraphtest_static PROPERTIES OUTPUT_NAME lagraphtest_static ) endif ( ) diff --git a/LDL/CMakeLists.txt b/LDL/CMakeLists.txt index cd492dbcca..370ec9ada5 100644 --- a/LDL/CMakeLists.txt +++ b/LDL/CMakeLists.txt @@ -116,7 +116,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME ldl PUBLIC_HEADER "Include/ldl.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( LDL_static PROPERTIES OUTPUT_NAME ldl_static ) endif ( ) diff --git a/Mongoose/CMakeLists.txt b/Mongoose/CMakeLists.txt index b8820f4601..0c96ee48cc 100644 --- a/Mongoose/CMakeLists.txt +++ b/Mongoose/CMakeLists.txt @@ -205,7 +205,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME suitesparse_mongoose PUBLIC_HEADER "Include/Mongoose.hpp" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( Mongoose_static PROPERTIES OUTPUT_NAME suitesparse_mongoose_static ) endif ( ) diff --git a/ParU/CMakeLists.txt b/ParU/CMakeLists.txt index e11ae60866..b6b715a2b6 100644 --- a/ParU/CMakeLists.txt +++ b/ParU/CMakeLists.txt @@ -181,7 +181,7 @@ if ( BUILD_STATIC_LIBS ) PUBLIC_HEADER "Include/ParU.hpp;Include/ParU_C.h;Include/ParU_definitions.h" WINDOWS_EXPORT_ALL_SYMBOLS ON ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( ParU_static PROPERTIES OUTPUT_NAME ParU_static ) endif ( ) diff --git a/RBio/CMakeLists.txt b/RBio/CMakeLists.txt index 216aa23945..0528992b1f 100644 --- a/RBio/CMakeLists.txt +++ b/RBio/CMakeLists.txt @@ -104,7 +104,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME rbio PUBLIC_HEADER "Include/RBio.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( RBio_static PROPERTIES OUTPUT_NAME rbio_static ) endif ( ) diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index 9d2d1c4ba1..4143a5d7cc 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -129,7 +129,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME spex PUBLIC_HEADER "Include/SPEX.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( SPEX_static PROPERTIES OUTPUT_NAME spex_static ) endif ( ) diff --git a/SPQR/CMakeLists.txt b/SPQR/CMakeLists.txt index 02ed8ba491..4ab38cf296 100644 --- a/SPQR/CMakeLists.txt +++ b/SPQR/CMakeLists.txt @@ -138,7 +138,7 @@ if ( BUILD_STATIC_LIBS ) C_STANDARD_REQUIRED ON OUTPUT_NAME spqr ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( SPQR_static PROPERTIES OUTPUT_NAME spqr_static ) endif ( ) diff --git a/SPQR/GPUQREngine/CMakeLists.txt b/SPQR/GPUQREngine/CMakeLists.txt index e1b3383d0d..9622cfb262 100644 --- a/SPQR/GPUQREngine/CMakeLists.txt +++ b/SPQR/GPUQREngine/CMakeLists.txt @@ -125,7 +125,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME gpuqrengine PUBLIC_HEADER "Include/GPUQREngine.hpp" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( GPUQREngine_static PROPERTIES OUTPUT_NAME gpuqrengine_static ) endif ( ) diff --git a/SPQR/GPURuntime/CMakeLists.txt b/SPQR/GPURuntime/CMakeLists.txt index 6d06047144..48cd7d256d 100644 --- a/SPQR/GPURuntime/CMakeLists.txt +++ b/SPQR/GPURuntime/CMakeLists.txt @@ -98,7 +98,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME suitesparse_gpuruntime PUBLIC_HEADER "Include/SuiteSparse_GPURuntime.hpp" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( GPURuntime_static PROPERTIES OUTPUT_NAME suitesparse_gpuruntime_static ) endif ( ) diff --git a/SuiteSparse_config/CMakeLists.txt b/SuiteSparse_config/CMakeLists.txt index cc7beefbd6..7c06afcb53 100644 --- a/SuiteSparse_config/CMakeLists.txt +++ b/SuiteSparse_config/CMakeLists.txt @@ -174,7 +174,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME suitesparseconfig PUBLIC_HEADER "SuiteSparse_config.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( SuiteSparseConfig_static PROPERTIES OUTPUT_NAME suitesparseconfig_static ) endif ( ) diff --git a/UMFPACK/CMakeLists.txt b/UMFPACK/CMakeLists.txt index 1b39240ed5..9b98e1454f 100644 --- a/UMFPACK/CMakeLists.txt +++ b/UMFPACK/CMakeLists.txt @@ -157,7 +157,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME umfpack PUBLIC_HEADER "Include/umfpack.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( UMFPACK_static PROPERTIES OUTPUT_NAME umfpack_static ) endif ( ) From bfc7d0d697fcf2a253be3d0eeea5941b3917ce0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Fri, 2 Feb 2024 20:01:43 +0100 Subject: [PATCH 16/98] GraphBLAS: Correctly identify `clang-cl` as MSVC-compatible compiler For `clang-cl`, both `_MSC_VER` and `__clang__` are set. Move check for `_MSC_VER` to before check for `__clang__` to allow identifying `clang-cl` as a MSVC compatible compiler. --- GraphBLAS/Source/Template/GB_compiler.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/GraphBLAS/Source/Template/GB_compiler.h b/GraphBLAS/Source/Template/GB_compiler.h index 4ee1d72b87..ecccdc96a1 100644 --- a/GraphBLAS/Source/Template/GB_compiler.h +++ b/GraphBLAS/Source/Template/GB_compiler.h @@ -55,6 +55,17 @@ #define GB_COMPILER_SUB 0 #define GB_COMPILER_NAME __VERSION__ +#elif defined ( _MSC_VER ) + + // Microsoft Visual Studio (cl compiler) + #undef GB_COMPILER_MSC + #define GB_COMPILER_MSC 1 + + #define GB_COMPILER_MAJOR ( _MSC_VER / 100 ) + #define GB_COMPILER_MINOR ( _MSC_VER - 100 * GB_COMPILER_MAJOR) + #define GB_COMPILER_SUB 0 + #define GB_COMPILER_NAME "Microsoft Visual Studio " GB_XSTR (_MSC_VER) + #elif defined ( __clang__ ) // clang @@ -89,17 +100,6 @@ #define GB_COMPILER_NAME "GNU gcc " GB_XSTR (__GNUC__) "." \ GB_XSTR (__GNUC_MINOR__) "." GB_XSTR (__GNUC_PATCHLEVEL__) -#elif defined ( _MSC_VER ) - - // Microsoft Visual Studio (cl compiler) - #undef GB_COMPILER_MSC - #define GB_COMPILER_MSC 1 - - #define GB_COMPILER_MAJOR ( _MSC_VER / 100 ) - #define GB_COMPILER_MINOR ( _MSC_VER - 100 * GB_COMPILER_MAJOR) - #define GB_COMPILER_SUB 0 - #define GB_COMPILER_NAME "Microsoft Visual Studio " GB_XSTR (_MSC_VER) - #else // other compiler From aa8d539ad016865bed200b768df889d0ae614ffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Sat, 3 Feb 2024 17:11:50 +0100 Subject: [PATCH 17/98] GraphBLAS: Avoid possibility of compatible types in `_Generic` selections --- GraphBLAS/Config/GraphBLAS.h.in | 4 ++-- GraphBLAS/Include/GraphBLAS.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/GraphBLAS/Config/GraphBLAS.h.in b/GraphBLAS/Config/GraphBLAS.h.in index 9b05ad4dbe..d28cb37b5b 100644 --- a/GraphBLAS/Config/GraphBLAS.h.in +++ b/GraphBLAS/Config/GraphBLAS.h.in @@ -3965,7 +3965,7 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; _Generic \ ( \ (arg1), \ - int : GxB_Global_Option_set , \ + default : GxB_Global_Option_set , \ GxB_Option_Field : GxB_Global_Option_set , \ GrB_Vector : GxB_Vector_Option_set , \ GrB_Matrix : GxB_Matrix_Option_set , \ @@ -3978,7 +3978,7 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; _Generic \ ( \ (arg1), \ - int : GxB_Global_Option_get , \ + default : GxB_Global_Option_get , \ GxB_Option_Field : GxB_Global_Option_get , \ GrB_Vector : GxB_Vector_Option_get , \ GrB_Matrix : GxB_Matrix_Option_get , \ diff --git a/GraphBLAS/Include/GraphBLAS.h b/GraphBLAS/Include/GraphBLAS.h index 21e2eed47f..7956ade39b 100644 --- a/GraphBLAS/Include/GraphBLAS.h +++ b/GraphBLAS/Include/GraphBLAS.h @@ -3965,7 +3965,7 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; _Generic \ ( \ (arg1), \ - int : GxB_Global_Option_set , \ + default : GxB_Global_Option_set , \ GxB_Option_Field : GxB_Global_Option_set , \ GrB_Vector : GxB_Vector_Option_set , \ GrB_Matrix : GxB_Matrix_Option_set , \ @@ -3978,7 +3978,7 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; _Generic \ ( \ (arg1), \ - int : GxB_Global_Option_get , \ + default : GxB_Global_Option_get , \ GxB_Option_Field : GxB_Global_Option_get , \ GrB_Vector : GxB_Vector_Option_get , \ GrB_Matrix : GxB_Matrix_Option_get , \ From 918d24174ebf2872c928c8995472895493a404dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Sat, 3 Feb 2024 17:16:36 +0100 Subject: [PATCH 18/98] LAGraph: Avoid using incompatible command line flags for compiler --- LAGraph/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LAGraph/CMakeLists.txt b/LAGraph/CMakeLists.txt index c62160797c..6770753fb1 100644 --- a/LAGraph/CMakeLists.txt +++ b/LAGraph/CMakeLists.txt @@ -247,13 +247,13 @@ elseif ( "${CMAKE_C_COMPILER_ID}" STREQUAL "Intel" ) #if ( CMAKE_C_COMPILER_VERSION VERSION_LESS 18.0 ) # message ( FATAL_ERROR "icc version must be at least 18.0" ) #endif ( ) -elseif ( "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" ) +elseif ( "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" AND NOT "${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "MSVC" ) # options for clang set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 " ) #if ( CMAKE_C_COMPILER_VERSION VERSION_LESS 3.3 ) # message ( FATAL_ERROR "clang version must be at least 3.3" ) #endif ( ) -elseif ( "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC" ) +elseif ( "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "MSVC" ) # options for MicroSoft Visual Studio elseif ( "${CMAKE_C_COMPILER_ID}" STREQUAL "PGI" ) # options for PGI pgcc compiler From 0e4d97c7faace8af37cfe4dd652dc0d0a8e4b048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Sat, 3 Feb 2024 19:11:34 +0100 Subject: [PATCH 19/98] Root CMakeLists.txt: Automatically pull in UMFPACK when building ParU. ParU depends on UMFPACK. Add rules to automatically add UMFPACK to the list of packages to be built if ParU is selected unless `SUITESPARSE_USE_SYSTEM_UMFPACK` is set. --- CMakeLists.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a23a5a480..34c469bfce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,6 +85,7 @@ option ( SUITESPARSE_USE_SYSTEM_CAMD "ON: use CAMD libraries installed on the bu option ( SUITESPARSE_USE_SYSTEM_CCOLAMD "ON: use CCOLAMD libraries installed on the build system. OFF (default): Automatically build CCOLAMD as dependency if needed." OFF ) option ( SUITESPARSE_USE_SYSTEM_GRAPHBLAS "ON: use GraphBLAS libraries installed on the build system. OFF (default): Automatically build GraphBLAS as dependency if needed." OFF ) option ( SUITESPARSE_USE_SYSTEM_SUITESPARSE_CONFIG "ON: use SuiteSparse_config libraries installed on the build system. OFF (default): Automatically build SuiteSparse_config as dependency if needed." OFF ) +option ( SUITESPARSE_USE_SYSTEM_UMFPACK "ON: use UMFPACK libraries installed on the build system. OFF (default): Automatically build UMFPACK as dependency if needed." OFF ) #------------------------------------------------------------------------------- # global variables @@ -134,6 +135,19 @@ else ( ) endif ( ) endif ( ) +if ( SUITESPARSE_USE_SYSTEM_UMFPACK ) + list ( REMOVE_ITEM SUITESPARSE_ENABLE_PROJECTS "umfpack" ) + find_package ( UMFPACK 6.3.2 REQUIRED ) +else ( ) + if ( "paru" IN_LIST SUITESPARSE_ENABLE_PROJECTS ) + # ParU requires UMFPACK. + if ( NOT "umfpack" IN_LIST SUITESPARSE_ENABLE_PROJECTS ) + message ( STATUS "Adding \"umfpack\" to the list of built targets." ) + list ( APPEND SUITESPARSE_ENABLE_PROJECTS "umfpack" ) + endif ( ) + endif ( ) +endif ( ) + if ( SUITESPARSE_USE_SYSTEM_CHOLMOD ) list ( REMOVE_ITEM SUITESPARSE_ENABLE_PROJECTS "cholmod" ) find_package ( CHOLMOD 5.2.0 REQUIRED ) From 17859f00dfb1db94bdcd63483615ae7127f51b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Sun, 4 Feb 2024 14:11:27 +0100 Subject: [PATCH 20/98] GraphBLAS: Add feature test for supported complex number type. --- GraphBLAS/CMakeLists.txt | 9 ++++ GraphBLAS/Config/GraphBLAS.h.in | 15 ++++++- GraphBLAS/Config/GxB_config.h.in | 20 +++++++++ GraphBLAS/Include/GraphBLAS.h | 15 ++++++- GraphBLAS/Source/Factories/GB_ops_template.h | 2 +- GraphBLAS/Source/GB_ops.c | 2 +- GraphBLAS/Source/Shared/GB_complex.h | 2 +- GraphBLAS/Source/Shared/GxB_complex.h | 11 ++++- GraphBLAS/Source/Shared/GxB_config.h | 20 +++++++++ .../cmake_modules/GraphBLAS_complex.cmake | 42 +++++++++++++++++++ 10 files changed, 129 insertions(+), 9 deletions(-) create mode 100644 GraphBLAS/Config/GxB_config.h.in create mode 100644 GraphBLAS/Source/Shared/GxB_config.h create mode 100644 GraphBLAS/cmake_modules/GraphBLAS_complex.cmake diff --git a/GraphBLAS/CMakeLists.txt b/GraphBLAS/CMakeLists.txt index 0889cb19b6..392c62f90e 100644 --- a/GraphBLAS/CMakeLists.txt +++ b/GraphBLAS/CMakeLists.txt @@ -162,6 +162,12 @@ if ( DEFINED GBAVX512F ) endif ( ) endif ( ) +#------------------------------------------------------------------------------- +# check compiler features +#------------------------------------------------------------------------------- + +include ( GraphBLAS_complex ) + #------------------------------------------------------------------------------- # determine build type #------------------------------------------------------------------------------- @@ -186,6 +192,9 @@ endif ( ) configure_file ( "Config/GraphBLAS.h.in" "${PROJECT_SOURCE_DIR}/Include/GraphBLAS.h" NEWLINE_STYLE LF ) +configure_file ( "Config/GxB_config.h.in" + "${PROJECT_SOURCE_DIR}/Source/Shared/GxB_config.h" + NEWLINE_STYLE LF ) configure_file ( "Config/GraphBLAS_version.tex.in" "${PROJECT_SOURCE_DIR}/Doc/GraphBLAS_version.tex" diff --git a/GraphBLAS/Config/GraphBLAS.h.in b/GraphBLAS/Config/GraphBLAS.h.in index 9b05ad4dbe..b61949036a 100644 --- a/GraphBLAS/Config/GraphBLAS.h.in +++ b/GraphBLAS/Config/GraphBLAS.h.in @@ -146,7 +146,13 @@ #ifndef GXB_COMPLEX_H #define GXB_COMPLEX_H - #if defined (_MSC_VER) && !(defined (__INTEL_COMPILER) || defined(__INTEL_CLANG_COMPILER)) +// Compiler has support for C99 floating point number arithmetic +#cmakedefine GXB_HAVE_COMPLEX_C99 + +// Compiler has support for MSVC-style complex numbers +#cmakedefine GXB_HAVE_COMPLEX_MSVC + + #if defined (GXB_HAVE_COMPLEX_MSVC) // Microsoft Windows complex types for C #include @@ -156,7 +162,7 @@ #define GxB_CMPLX(r,i) ( _Cbuild (r,i)) #define GB_HAS_CMPLX_MACROS 1 - #else + #elif defined (GXB_HAVE_COMPLEX_C99) // C11 complex types #include @@ -175,6 +181,11 @@ #define GxB_CMPLXF(r,i) \ ((GxB_FC32_t)((float)(r)) + (GxB_FC32_t)((float)(i) * _Complex_I)) #endif + + #else + + #error "Unknown or unsupported complex number arithmetic" + #endif #endif diff --git a/GraphBLAS/Config/GxB_config.h.in b/GraphBLAS/Config/GxB_config.h.in new file mode 100644 index 0000000000..f36e8aa435 --- /dev/null +++ b/GraphBLAS/Config/GxB_config.h.in @@ -0,0 +1,20 @@ +//------------------------------------------------------------------------------ +// GxB_config.h: configuration header +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2024, All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + + +#ifndef GXB_COMPLEX_H +#define GXB_COMPLEX_H + +// Compiler has support for C99 floating point number arithmetic +#cmakedefine GXB_HAVE_COMPLEX_C99 + +// Compiler has support for MSVC-style complex numbers +#cmakedefine GXB_HAVE_COMPLEX_MSVC + +#endif \ No newline at end of file diff --git a/GraphBLAS/Include/GraphBLAS.h b/GraphBLAS/Include/GraphBLAS.h index 21e2eed47f..a42ee32da6 100644 --- a/GraphBLAS/Include/GraphBLAS.h +++ b/GraphBLAS/Include/GraphBLAS.h @@ -146,7 +146,13 @@ #ifndef GXB_COMPLEX_H #define GXB_COMPLEX_H - #if defined (_MSC_VER) && !(defined (__INTEL_COMPILER) || defined(__INTEL_CLANG_COMPILER)) +// Compiler has support for C99 floating point number arithmetic +#define GXB_HAVE_COMPLEX_C99 + +// Compiler has support for MSVC-style complex numbers +/* #undef GXB_HAVE_COMPLEX_MSVC */ + + #if defined (GXB_HAVE_COMPLEX_MSVC) // Microsoft Windows complex types for C #include @@ -156,7 +162,7 @@ #define GxB_CMPLX(r,i) ( _Cbuild (r,i)) #define GB_HAS_CMPLX_MACROS 1 - #else + #elif defined (GXB_HAVE_COMPLEX_C99) // C11 complex types #include @@ -175,6 +181,11 @@ #define GxB_CMPLXF(r,i) \ ((GxB_FC32_t)((float)(r)) + (GxB_FC32_t)((float)(i) * _Complex_I)) #endif + + #else + + #error "Unknown or unsupported complex number arithmetic" + #endif #endif diff --git a/GraphBLAS/Source/Factories/GB_ops_template.h b/GraphBLAS/Source/Factories/GB_ops_template.h index a417d016ca..7a728717f4 100644 --- a/GraphBLAS/Source/Factories/GB_ops_template.h +++ b/GraphBLAS/Source/Factories/GB_ops_template.h @@ -858,7 +858,7 @@ inline void GB_FUNC (POW) (GB_Z_X_Y_ARGS) } inline void GB_FUNC (CMPLX) (GxB_FC32_t *z, const float *x, const float *y) { - #if defined ( __cplusplus ) || GB_COMPILER_MSC || defined (CMPLX) + #if defined ( __cplusplus ) || defined (GXB_HAVE_COMPLEX_MSVC) || defined (CMPLX) (*z) = GxB_CMPLXF ((*x),(*y)) ; #else ((float *) z) [0] = (*x) ; diff --git a/GraphBLAS/Source/GB_ops.c b/GraphBLAS/Source/GB_ops.c index 1d82758af8..7cc6f4c05d 100644 --- a/GraphBLAS/Source/GB_ops.c +++ b/GraphBLAS/Source/GB_ops.c @@ -568,7 +568,7 @@ const GxB_Format_Value GxB_FORMAT_DEFAULT = GxB_BY_ROW ; // predefined built-in monoids //------------------------------------------------------------------------------ -#if GB_COMPILER_MSC +#if defined (GXB_HAVE_COMPLEX_MSVC) #define GB_FC32_ONE {1.0f, 0.0f} #define GB_FC64_ONE {1.0 , 0.0 } #define GB_FC32_ZERO {0.0f, 0.0f} diff --git a/GraphBLAS/Source/Shared/GB_complex.h b/GraphBLAS/Source/Shared/GB_complex.h index d201c05913..18a313f9db 100644 --- a/GraphBLAS/Source/Shared/GB_complex.h +++ b/GraphBLAS/Source/Shared/GB_complex.h @@ -205,7 +205,7 @@ // macros for basic complex operations: mult, add, minus, ainv //------------------------------------------------------------------------------ -#if GB_COMPILER_MSC +#if defined (GXB_HAVE_COMPLEX_MSVC) //-------------------------------------------------------------------------- // Microsoft Visual Studio compiler with its own complex type diff --git a/GraphBLAS/Source/Shared/GxB_complex.h b/GraphBLAS/Source/Shared/GxB_complex.h index 813614e30c..d9fcc1587c 100644 --- a/GraphBLAS/Source/Shared/GxB_complex.h +++ b/GraphBLAS/Source/Shared/GxB_complex.h @@ -17,7 +17,9 @@ #ifndef GXB_COMPLEX_H #define GXB_COMPLEX_H - #if defined (_MSC_VER) && !(defined (__INTEL_COMPILER) || defined(__INTEL_CLANG_COMPILER)) +#include "GxB_config.h" + + #if defined (GXB_HAVE_COMPLEX_MSVC) // Microsoft Windows complex types for C #include @@ -27,7 +29,7 @@ #define GxB_CMPLX(r,i) ( _Cbuild (r,i)) #define GB_HAS_CMPLX_MACROS 1 - #else + #elif defined (GXB_HAVE_COMPLEX_C99) // C11 complex types #include @@ -46,6 +48,11 @@ #define GxB_CMPLXF(r,i) \ ((GxB_FC32_t)((float)(r)) + (GxB_FC32_t)((float)(i) * _Complex_I)) #endif + + #else + + #error "Unknown or unsupported complex number arithmetic" + #endif #endif diff --git a/GraphBLAS/Source/Shared/GxB_config.h b/GraphBLAS/Source/Shared/GxB_config.h new file mode 100644 index 0000000000..b584fe8be0 --- /dev/null +++ b/GraphBLAS/Source/Shared/GxB_config.h @@ -0,0 +1,20 @@ +//------------------------------------------------------------------------------ +// GxB_config.h: configuration header +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2024, All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + + +#ifndef GXB_COMPLEX_H +#define GXB_COMPLEX_H + +// Compiler has support for C99 floating point number arithmetic +#define GXB_HAVE_COMPLEX_C99 + +// Compiler has support for MSVC-style complex numbers +/* #undef GXB_HAVE_COMPLEX_MSVC */ + +#endif diff --git a/GraphBLAS/cmake_modules/GraphBLAS_complex.cmake b/GraphBLAS/cmake_modules/GraphBLAS_complex.cmake new file mode 100644 index 0000000000..a0d32cc3b2 --- /dev/null +++ b/GraphBLAS/cmake_modules/GraphBLAS_complex.cmake @@ -0,0 +1,42 @@ +#------------------------------------------------------------------------------- +# GraphBLAS/cmake_modules/GraphBLAS_complex.cmake +#------------------------------------------------------------------------------- + +# SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2024, All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +#------------------------------------------------------------------------------- + +# Check for C compiler support for complex floating point numbers and used API + +include ( CheckSourceCompiles ) + +# Check for C99 complex number arithmetic + +check_source_compiles ( C + "#include + int main(void) { + double _Complex z1 = 1.0; + double _Complex z2 = 1.0 * I; + double _Complex z3 = z1 * z2; + return 0; + }" + GXB_HAVE_COMPLEX_C99 ) + +if ( NOT GXB_HAVE_COMPLEX_C99 ) + # Check for complex number arithmetic as implemented by MSVC + + check_source_compiles ( C + "#include + int main(void) { + _Dcomplex z1 = {1., 0.}; + _Dcomplex z2 = {0., 1.}; + _Dcomplex z3 = _Cmulcc(z1, z2); + return 0; + }" + GXB_HAVE_COMPLEX_MSVC ) +endif ( ) + +if ( NOT GXB_HAVE_COMPLEX_C99 AND NOT GXB_HAVE_COMPLEX_MSVC ) + message ( FATAL_ERROR "Complex floating point numbers are not supported by the used compiler." ) +endif ( ) From 881e4844357f58064ceaae5f481d86a1751ca1e3 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Sun, 4 Feb 2024 13:22:58 -0600 Subject: [PATCH 21/98] GraphBLAS: revise cmake configuration for complex type definitions --- GraphBLAS/CMakeLists.txt | 3 - GraphBLAS/Config/GraphBLAS.h.in | 11 ++-- GraphBLAS/Config/GxB_config.h.in | 20 ------- GraphBLAS/Doc/ChangeLog | 11 ++++ GraphBLAS/Doc/GraphBLAS_UserGuide.pdf | Bin 1126299 -> 1127284 bytes GraphBLAS/Doc/GraphBLAS_UserGuide.tex | 14 +++++ GraphBLAS/Doc/GraphBLAS_version.tex | 4 +- GraphBLAS/Include/GraphBLAS.h | 19 +++---- GraphBLAS/README.md | 2 +- GraphBLAS/Source/Factories/GB_ops_template.h | 4 +- GraphBLAS/Source/GB_ops.c | 2 +- GraphBLAS/Source/Shared/GB_complex.h | 2 +- GraphBLAS/Source/Shared/GxB_complex.h | 52 ++---------------- GraphBLAS/Source/Shared/GxB_config.h | 20 ------- GraphBLAS/Source/Template/GB_add_sparse_noM.c | 3 +- GraphBLAS/Test/test128.m | 2 +- .../cmake_modules/GraphBLAS_complex.cmake | 8 +-- .../cmake_modules/GraphBLAS_version.cmake | 6 +- 18 files changed, 58 insertions(+), 125 deletions(-) delete mode 100644 GraphBLAS/Config/GxB_config.h.in delete mode 100644 GraphBLAS/Source/Shared/GxB_config.h diff --git a/GraphBLAS/CMakeLists.txt b/GraphBLAS/CMakeLists.txt index 9d4f5bd38b..9157a4b906 100644 --- a/GraphBLAS/CMakeLists.txt +++ b/GraphBLAS/CMakeLists.txt @@ -192,9 +192,6 @@ endif ( ) configure_file ( "Config/GraphBLAS.h.in" "${PROJECT_SOURCE_DIR}/Include/GraphBLAS.h" NEWLINE_STYLE LF ) -configure_file ( "Config/GxB_config.h.in" - "${PROJECT_SOURCE_DIR}/Source/Shared/GxB_config.h" - NEWLINE_STYLE LF ) configure_file ( "Config/GraphBLAS_version.tex.in" "${PROJECT_SOURCE_DIR}/Doc/GraphBLAS_version.tex" diff --git a/GraphBLAS/Config/GraphBLAS.h.in b/GraphBLAS/Config/GraphBLAS.h.in index b61949036a..f609f5c63d 100644 --- a/GraphBLAS/Config/GraphBLAS.h.in +++ b/GraphBLAS/Config/GraphBLAS.h.in @@ -140,19 +140,16 @@ // definitions for complex types //------------------------------------------------------------------------------ -// This is a copy of GraphBLAS/Source/Shared/GxB_complex.h. It is included -// here as a full copy so that the GraphBLAS.h file can be self contained. - #ifndef GXB_COMPLEX_H #define GXB_COMPLEX_H // Compiler has support for C99 floating point number arithmetic -#cmakedefine GXB_HAVE_COMPLEX_C99 +#cmakedefine GxB_HAVE_COMPLEX_C99 // Compiler has support for MSVC-style complex numbers -#cmakedefine GXB_HAVE_COMPLEX_MSVC +#cmakedefine GxB_HAVE_COMPLEX_MSVC - #if defined (GXB_HAVE_COMPLEX_MSVC) + #if defined (GxB_HAVE_COMPLEX_MSVC) // Microsoft Windows complex types for C #include @@ -162,7 +159,7 @@ #define GxB_CMPLX(r,i) ( _Cbuild (r,i)) #define GB_HAS_CMPLX_MACROS 1 - #elif defined (GXB_HAVE_COMPLEX_C99) + #elif defined (GxB_HAVE_COMPLEX_C99) // C11 complex types #include diff --git a/GraphBLAS/Config/GxB_config.h.in b/GraphBLAS/Config/GxB_config.h.in deleted file mode 100644 index f36e8aa435..0000000000 --- a/GraphBLAS/Config/GxB_config.h.in +++ /dev/null @@ -1,20 +0,0 @@ -//------------------------------------------------------------------------------ -// GxB_config.h: configuration header -//------------------------------------------------------------------------------ - -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2024, All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - - -#ifndef GXB_COMPLEX_H -#define GXB_COMPLEX_H - -// Compiler has support for C99 floating point number arithmetic -#cmakedefine GXB_HAVE_COMPLEX_C99 - -// Compiler has support for MSVC-style complex numbers -#cmakedefine GXB_HAVE_COMPLEX_MSVC - -#endif \ No newline at end of file diff --git a/GraphBLAS/Doc/ChangeLog b/GraphBLAS/Doc/ChangeLog index d19fa51cf8..b28f5011b8 100644 --- a/GraphBLAS/Doc/ChangeLog +++ b/GraphBLAS/Doc/ChangeLog @@ -1,3 +1,14 @@ +Feb XX, 2024: version 9.1.0 + + * minor updates to build system + * C11 complex type detection: this is now detected and configured by + cmake, instead of using an #if ... in the GraphBLAS.h header. + This change was required to port GraphBLAS to the clang-cl compiler + on Windows when it simulates the MSVC compiler. Also added a new + feature (thus the minor version update to 9.1.0): GxB_HAVE_COMPLEX* to + GraphBLAS.h to indicate which kind of complex data types are available + in C11 or MSVC. Contributed by Markus Mützel. + Jan 20, 2024: version 9.0.1 * minor updates to build system diff --git a/GraphBLAS/Doc/GraphBLAS_UserGuide.pdf b/GraphBLAS/Doc/GraphBLAS_UserGuide.pdf index 7a7ab7a64f75af132298a76f0fb54cba9177ae2f..2560e6e7aa986bb7b6b4bd036319dd95bcf191a8 100644 GIT binary patch delta 713523 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�tFt!NJtw1+ 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%0Dtt!?+UPl#daCG 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%0AN~^5nQmKqw^k7?6#4uic__Z=CK< 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�M>5`35YAQ)rOlpw=47q`cJCiWola>&O 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ð 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

j~txj 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

sB9ctd;5V-M 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
Z;x&(3qv zjMh;cFt0T2+)F~&+Cvq=8W?V&-(Dw$#eiu50~=ofZu`Zu)0WpA^8{v?VvVlj3w-%J z9W%-?610_b-h=YkFKtL*zY9l$<9{He6kLg@qJfl9kuLQZ!>t#vjW-*=anW14@WZVm z%|;zy3`xQtO`u@yWzg0`@^zWqRAUA>L5$Py&l6uI7QU_7)K;y1aES?C#Qrfb7KkxO zGSep}(1@G}QAmh^!24{Ies-}PL(L?T^s%gPBy<~MJ1mHCDK(;>LXl(DmVayL8$*>; z!)1i`l7=Wp0g>IrbjP=8b?x8yG$yX5nqB%W?Bdc3#eqEFgi6)trp-qxJNZamdl+#> z0!;CkPT(vHi413b!wZX?D%{LAyX`dMvHXSWx)I$ElaI%5-{CP3!hTZpO3+!l%JL#v zJ)7A)^3)9g0MU9+2Y~ybF@LT5^=Na3-aNFM~VK?`sUY@v-2^HiosQb_3HBuF2s%gem-m>s9xu??r&`r zY%H{mg(D=y!m~6U3r{Fa;XVL++&-KSa3#XD%^w>Jo6x>F0*)pY_xCkBaHZNG3+%qd z_s4=DrFtFe{OqsC#G<_^MsxeO2*}N;9ostG4k_b3v6qXqkB`lvP6^bFDHLY>?+U(EQ*QY#&MKV2lMshjYON`#4nTSvMM1W}B` zXcfGl{2R6Fi(@ed9;~n3hbfQ3bY5+yJPwP83UDTgHtZk@e{dEPPDNjVq%5H%L$B2!bpe2ky0DgNns3@A8n zcz9#XM5Mw5Kjl1GB?XSbOTC}AzfA=Tzt}(4h3Gyyh|_*Nfn*91s+cAMEb)X@ft*J! zoYAgBzI~=#e}P}6B$V=}m`cH12+#pj246PHw4g|LbtHjL)lCBj@)h5etw$<@wTfqlczI4c!^`J=0?W!urzCQnu^#X!_8?g+Q}woDgZ%O!q)_|Lm{d+6{g%ah{%$D58#fvM1)bNAKgn7z^C z&lhfWe_uCrR5+>bZ_<}IzB?MYzb+tlT=`h3l* z&U#7EW{A(SfAvZ-+z!3_BO(l{#f)p$2MqGZe<$-N?_76v@Thm8D@wHN-yJ2~RuKG& z{jjji@~c&fOLZLBvGuwAJ;`yN=Ju+qvZAJin*|oWU~@2Kp}$<kP`ks6q@nrKZ`i6-wFA zX5n>Oq$u3G&_MF6w(A_n8D^&)x{MGqe?|kEIz%d5Hr@~LUEi#-d1hTPa)=q@hDag% zX88Pqj)r**H@)rzL!`J1hB3E9M71eVXX%h52#=!1GuB@Ub|py3G1WS!zt znf>WUNjWB;Ndujx{HoZt$9X-Cc~~p3+!i3(PZnvFWGkZ}y5Ho1F)oNp%c#G*B39m}T!!w+p{&bG>_qKM}+LZkQ zyliPpYD>j!*WpMLmlLr07K;cAe^;y7BDMQ++b7tcpidZ!LI_!*n~*&pwIOwogf>@| zD?UkyeD8hsn5P^Oc#F}#v*;iQT}c49uQ!E{3m?m536%%C)Eh}i#qk{;xXgT6>U+`0CS#$PG!9%nRz7?V`_+%%#JrG(}-w-XY zTet0nl5NFNG2a34pg=`>f0Qhg1Rxq67A1Ey?V)7Q%@(4)QL^PDVsSW>d;k-EJxUhR zT7`WTN3IwMbbFFI=y{Zlt{KkUs+{ccooC2PvQZO_1_`Tco_h z5&GL;<*w9kik8*?4J~(demj&=gM;U*{dpg?cZtyl$N6UioPY5xasK}8HZ;DPKLGkd z8@$|Ti(_G_xdUO0cOZ2@-_E;0-_hDjaaKcn<9di*7l#!C+5qd66mh^MS|o6`6Ym@$ zvko#h*sbGbZ?}L22vGq9NDDsRmyt9F69O?em$7966aqOhm$8!qDVHe+2u^?LLI{={ zBNum@g^(H3LM^P(OzL!TS1x`_?zV3E@4I&|-=yM{S8B$s0!g0fL(%`2xaJZ;pyBz* zwJrMPN=cgxAQKj8(ib~Nq`vxJSOHVyJi#r?g&9S?j-6(ifJNY7$gx-nYnW9zEHu;F z(ziFuOeSr&TxrEg8C(=gk*t5$husnsJJiKcwGDmf2e-e1r7=h5eqGeKp^JjUB@>`q zP~~e(Sy;*}8(FG8D6^DV@~~g7;NjK*CWgQ)-@z>i2I3=%*yGSg~vC4B2|Hv z#B^{QRPBnvTM5K_fZ*A*11*aEzOGyu4o4WcNvZ+u1Wq(lu22doq-ET!jTd{7D-$_TrRcgb1+ErJcPMTk0)qNcuJA{ z^3V70uZXts=mE_UdR^suA`IJqVj!NPb3`iY&K2cDh_)2G!`L}M`_A=25=A%|CFUub zsiP5|9pGAm?Zo`VOF2ujOin=k4bA-b<;n;hk5D66mQEQ5fC?!=!u1h8DOJ*fOLg~E z?}+Tv1JWt6A?ZRovnk{GblaQm)#ncd0R8oI?}ndiw{y)9bwO!zri==I_cgTrcW!v^ zFn?N|+(ME-Jz+N_d%h5h4l_P3KHa=n{N|a!;hErphYAA85eyK~d2;Oy_CO;4TpA6A zK7NYUl&!EJdMZ`P`=WRb4MJ z0{y8zk11o5(hYE5S6&5wO{;>KE`+*}0H2+V`uWB+uB+Bj^DCy)DPA_N7!I8y;TZCG z_-ocz=S|eqXE| zEw^o5R?U|gcMpU*d>>O#NHD2_0wo?NV8xZ+%_UXljz~dEpi=JvB=@zTB1+#~*hGy8 zkRDl$%k%o_59`CHZ6NG?_{P&e)WH0QS{EPHEb3VQm?gPjxZa8UR5?dFW<(3GyLA3Sb<_&$aTuFEzgb0CLUOTmz5 zowIKjl;9^}B*dvB;Wvs2F*y>5Ji;v=sft_Tz9c1QBK?7$;A%VoTd{^-p!+z~J}<#J zzHRZUHIol8YN3A#z9*$+O3knBx{i{&fnfj&K~L+kCYgCn!c6C&T7;}`Mi0ktHyut5 z`|Ydu*SAD}*%lshzi!$f7!fM`EI-sdABSU;h zf?CagQZw1>Z4418vJUt{YWn~gJJgq9`B1fa(rpp&L=h8e(S=x3I^;}aN{&Y)2~YfnXvLu@kdlx7 zd?9y%6RM{J5@w!bXX48%%r(BG;bQ2DrVphU3hqyEy*$6*PJ%0N`AOEdx8I_Fe+j0K zllgdHzbon*UE5}q#K<*(*=E@sZp>^_DcTCp4gMq4kHifoaQ*J%r3e4d;R33HrKvbY z_4UX1&qS4xes`nN?S6FUYH;&bdFT!}*rm|R1v5wu1yTP%iL1u{cgIM|yb}Ud_{Oqi z^W*|G7kW&b=Oox1G7yQ8%Fg(HzI*Y1&>5qRmyt9F69O?fm!X9L6qm~m2tfj5ZI=!Y z2sQ(}34E7F4+tQC+isg@i=;`X9uK9P70Yaq*6m<=JC9$y35P0GL>ObRqgM8|y1-eJ z*YnAj2?Z%kb~xvRM|xKw0%x(A+}!%k628TbPq>Pl2R(D+fLT;PFL$mde;5yj+i@Ne zsSZ3y>N@*uts6Qld?Ng)H7+TZV=iz?s8pQ?k0TxkE(xW7;ZJcva78$$Ll^4Zr@j{~ zgj^9NrC#B277-DKj>jNZfn73NEXrz`6`vtJLb^?ft#F%lY6NeqWV^n2H@h~&OY?d5 z;mVA!w^NUWZo0@m`cy#9v$8N>vX#|nGzo-3`e=3&yB~_MI?;63@^Y3FtAAgtPm{UUG4$R7&U;NQa7#7 zKp>d$5x-Pvy~~^0tV${?-GS#Ao+4eEFRO8TSqObbd#B*;ebQ9fzAW=6R7Nl#B%MZ&an(D2R0k0ua-U_?{b%`bvTg!sQ_B6l z$iKlZG_-l5ky|g4JkdFT-~f~)6T{$`EjFnEf>~W!tXCT4wbAs^m;RXLlq$mf;Ak%I z=6`>9JsNS~CMEdyY%>fDB_g0dqFn-obVLi*QxgS2IZQf$h(<7%zWbmLY@T~PAZz(L zEljU}J0i6iCtDjW2(uP+#6R?daUwZ??x+J{KNk>Ae9?t_^o#>GBkf8T2_%pUymX<3wn1R=t-u?45kmsDXVlzv?>blhC5>r z^BFDzU?pf7Rc`v&q(yCL6~vmLvDLH+-|G>720k;Nu6J3JUT>4CPG9zU96oK)q!OL{ znk}`RAWV#ZV^-O`XNKQd7`WxiwCmEuOAq=)8TO)p14D`=8%>O=F)$;VR!2^@H8ZN?A+bwilHVb8KTc5DW%w6Gn2 zlMm?RN!^&S=@7)+h#I@m z9tJRYKbuC>oqJ_kZzC}UE8%Un}W zGF`i2b8eb_t*D0>mCG~Jzp`y?+gW!_U@n2Mh1LH{r)r~bA2aOk&c=)%vSw|1kR`7! zD=Wu<>Fw+?#ID}<)q$W&H|5vV^n3S=H3(`1A1dd*LCZ8xo9`Fs@v15}LpSf!bgK(s z9B71L$DCtrXJJKk+B=86Fx*^!F{_c?-wuP^Ijd2p>>b3p*LD;bfrds@GT+0^(%MLTMJGQ!rgBd<{rb??E|(PuwA zTH$pxeC|G8+&%gKNT`SkW$#@ogwjb9OdNGjLYJT5T<6;{*AyjGsb@TcH>EFS|J8Tg zoq&?TYbRt%=O4Ynw}oy^br`xk&lWa5CqZ~n``gNqtDye`ZbiCku2J#;I`Ev-fZ5Lo z@JX0wx^RZ+$*M`M22<3jVEBeq_Qimcu>jC-75xldTK!2qR$pSgSK2rzq|(P^v&~Zs z`pf@bMMWnb&Epe(J@M@J>^VSu!1Vtw9#bTWtU-*2gGI0BlYaqfH))rUGzSy{F*uVE zq7;{@f(9#>8Wspne}*F=Sgf@i%`QhmM$8v#6lkAGKOD^#qYH1gG?f`oWT3o-`N)Nz zr*&H76@ij0E5Z$}dmGOc4+edhZCDOj3%Q|9A|7~(O>$4!;2>@I@O)h4Se z0$&y-GCDX3MYsPJ2r&YGz&(Ymig_$-VhE)f*8#rXEbs-1M(6?L(9|$Dh|_+7;e}Pd(t>yOi4pD7)%XD|J`u`5$Lz zop3{8?}fY((cEI$A^Sf$sVfv-pCn8FH9P8d*CU;DZ?^OD_n}93qM6cwu9;SDg89q# zRM>LCNJ1@~Z9(ve60gf5zk*sPoK%E&Ix_@tH`&03<_W@o!UhImyI!x0d4D$p^o+~4 z_T8W+_G%pJ!D13XDHomIM#kK$;6-huQcsS}rK^EZN&Hy$YoP1SZC?T$e6KQQg*#2Q zz`C;q4wQ*zVGFxx3cK%Y1ca6Cq+xTrfdr&ow|tjz$G^5GZxsOE$v-ra49o^prnN%3 z=?c*{D*|ADKcb*?;|xhie%B`q3pEZjSjzAlt%~|}+$`Iv1`dOBfx`nQWYitp)^4#` zXX!ktaelfpySSvC=2dMHbf{ErUd0&$r<1a(Y0PN((6^M{Y5YPB&Yi9#gyhiT-qtl@ z;jT4K-R!hTt9eo`nyJWMzXARM^xdM<8QY%cf@7_J5WcMy*tHJM$#5Hku$#4DG-lE8 zoUFsPwc7sBeLy_s@;-`KEN@L^Gz2I}(;S;x+)*mQrZUjTyU$JE?r?09sHX41-98tI z2%0^mZu>|))<;oyYEj`nA3;kg{IKUETmKHjy*`qCA5Hu~;9T$Av8mVC>)CzNJaffh zXc)LLchDXubc>7L9|r(mm&H|?tf;L{t5<{FZnJ{7+}osm7^qx1kSgj?y_r4v5Aj%} z^Oun{2NVK0G?O7RCzoBP1q=c>G?xKM2`PWoT1$@{w-LV2ui!Dca9A&r1qcRg3vvP^ zfMMy7WTAsB4-CP^uCZDH&cDxB+?_zP)4My})7~hTL3Oi8R!%0ZPxm0D1gsF?)CiF)inScQw&29zeIHu!pCVQgI*i0a9S5-VAZK_9II zD&AQet9jz;u@_;r4&@xY+(SE}l6dGq6w2Pdi=91|Bd8=YCD~sLB`rf$_N1&}AxNkUgE-h!BqWEiR9cTg zOt2CYFrameiX?5VV++9y$JQ#8EM?*seSh&Xy7^sSK@nF*$6O2P8hiV98#? zAp)|!4SNBMz1iTydR^ij1nYke8#+YlJ`CK#d3X#$B^vGmHwBKyJMeNZn-?!O+gDeY zH|fQTw0%|KL<)?Q^aGwC3qjtyCx8eTDEl#ru{|dw#F*Ya)o?qwdOUsg)n@zs_0{{= zyPI^8w%@;em9}qozu%;{8w|znZ~pz;4g>Fg-fgzuLXzF(&Burm9`k=U+aGoxuRdMB z-+jD|9OK>JcRzi2_s!Ms=_16b1S2`W#YXS0F*^bT-!guEd3lA^E^Z@K$TK2T5cl>U zoSW_IPe0y_=f8cp{AIKK=IZ*V-Sya|yxsm~``7Ka7c?G1u=h|25hNExGcKAP_F%Q# zU|qzRY~I25^*GwsY5RZO)tjrdeVP9B5i>trU1p*`$N8)x2N0MQs=@48DGWeaVRPy| zThnPdKK-~Cg|mDv%gb~zg8Q)NKmPeIL}kw%t_1`_T}hXpe*N|B!`xH`cda!?csPw4 z?v!KTfcrFT9^&s1n}@hv1)JWEvFWxPo5+8+*mPYJo8%>rgynw?Mx%jIK^jJ)$hFh6 zVN=wzMc4x-Ben`)fdm4%ETcYHf=#dY@k5Vb^O*ZFY))~DDcqXBd~8xV#wL~J*o?Yr zU^B|9JA(Iw?1`0O8zB`H1GiiyLTiLn)Dl`UO0j2ytv0v|suT4HsTy@q9+eDH285r2 zEphf0g%QMa6cT^hArwrZwdANx)oUI$d`gy8Pp0;fY_vvJu>YQncFy{AvI%L*deSgC zq(KdDoEg;aR8WmkEFF2TZ?u#u#HVkv}jG6;-!- zrr9U537wHmXx&T!Pj?hgXrp2Ns33ce_D}`R+LsxAme13K7o%}R)zuy{{9~T_xykNB zhHn=0+M52(6aLOK{r&Tk;#m&GG$)o$aYwC*FmNh2^<3e9f1tB2w?vysb>E~auZd+XuzXy5cgt}zsT`rDB|~dilul@P`id|%pa7}OtmgPcLM{3q zONMTY)StN*jBGrr&m;(F_+g&Uvf z0#$$KB%%ZEC!KqW+qfbT`4`y*TA6U*zTAPet$G)ajMEdtj*8&OXa-OiGs9(#m-GVa zbHe&D_oJ4d;HFk`B;o&2%eWjB6JgzEhV{?S#%6h(&GNV@?zoTcUB1ZbzfO3Z^)t?P z7N%_$rl+{S=(C;Ztm>(qRVzo)tnTl_tL}e^ReLQJK_#t8MRWW^K&y>1P!+vbZKtNV zy5a1S0wmD8S z#Vrj6mHvNM-?xcG&}6wowS6_;R;}jueV|pz79S4o`ao+fo9LoGa2-FAR>xPKy&ppf zitDoAgUUcw(>bBOO(jN+Yq7KML>A+zPb9zA=i%uwo${{whugJYMGGzSv`F*uh|F9{O^I5jYnai}SOwN_1!(>xHq_gDDnO2qiv zF%kzrfcQA@YI{L|P-wl|h%{N^ba(sj-?1lYw`_m|;!uq}emwKccxF;gt_UZu7kre@ zSBuB5Oi2W1o_j%7mqbX(6!*j$&7^i@wIQFVxD(65NJC%u)%EuI`)3!pt=mD#uLEvw z!g}cXN4SZ9*Hs?_uD=~nuDj;R^2_QixGscZ#-Q=L@k-mF4DHa@Ax=omnVopZf5Jn1 zw0;=x$cH?HVA^O>NXNJz;h(wT{1FEMq=a#XnmMZpCeC0k!-~mf4zT=}iJquTnHHx2 z4-dmDe-&Ql{rHu13Ga=Osa^`hl*vK(>6Jb%OG&$b{j!kS(ilQo7&>gLVOj+|>qFc( zqq2@@-HH3wMPg(i4&9LK{XU#=EE7Adcs zB=Z8EL=z=SR;rS$cZ*M7IN87<6dY4fKerjWgP$uI*Q6mAi~k;2JvS+hg49}Oo&TLl zRXXOhh4s%ylOayNlWFyC&cTUuI+%<(2k#+&Ngv4NA9!+Bj-gxi2c9MLotokKvr+9m z6L9md^LaMZEkAD~h+i0B1;c%sUl$)w(ytmAC69=3?uRZBq&?3j_!S;N3^zDpf{ z&S}*q$5zmrOehV<@gPQMyxrKNsH-Dls}}d+ZU}9xyB5_$hiaTrporIFW7a7~U=2{V zEVNK`g&2Oq6vwHXh*~6i?_%mz7>#XnNGnA*0b<15MbwPVF6WY%)VJHvA`*kkZ;}ow z6meZORgVam2{40FL>Z5OU6m6z!!x^8F#cW^VS*~_Fu&;pI6{ViGQ3^loAZ>WdOEy6 zonU*KPO#}9tp2u+<5?4`(PAbCa^Ie6XoeboDB}Edf+=U1Pyz<4(#%1d<9`L^&)_h` z{s+dkEtf%+3KRh`m!WJ66_?E?2zUWCmqsWEFMnn@TWBIItnH`$P`<@MH}CFm{(Hlq z6~->OVMGb%H;_^<)`y#4exr*Gbbee=BAi{E{m{b#Bw!Mr_KTly{t<*7ZpV!xMv0-Y zX;tN4jzPNN*(4>Bw$i1?&D0SDBTRKi_%?9_VFcku|6h(Ej3LquPf(p6`iI~KZiP6d z{C|WM*P3Xd;Q?+%$0_%_EFOmS2Xjdj4CxN@`-^K^kjwJt3L35nhwrUfzWsfEL9K}6 zx*1zME?3+nS((;(ajcdrp(ciIcb?SPqp zsD#_b1IS=Zu&nN!FvY1>CwLhvDS7fat^R{gBH5)?XiCFRkP=)9PMjT=f`f#9V3q%o zy`EAfvxexw4#KMB;CH~M{5W-4h7!iV%K(&VjUR>fiWZWCO4Lx%wUt=|4J480Dst&MBEZ5TZy(s8CDL)vaXA=*=pKYEhE~sYP<7W z-F}?gOfte1f412nt;>9!Rb;tRQY9ZIH4Wwho@_)^lDf)001Dgfz|IxbL9Nozc(wSH zSK+tq3L2N_CTK$WAK)snYewbT5r5^{tFuy+BI7U#WN>Dyj%u$^sWVzgidj(C~GsBp^zj z9udvh_0vW2VLPP|!6BqL*MFS%^Q2xe z>a;4!<4$z|Z162XiKA?I=;+o=_(M-@EDf=iT?xWqWz6;NL@=+zNi!D0N9X21mmG!? zt=!;jAal4MCNCeufLV6Bxd=}%+?m#!;bx>@@n#UD1fkG71}T4~Hh7URE;$zA9fd<> zIG%XJ!XevfyrQ7McH0j#mw&9SyBs-@8^l2$uUMy%{lU9WQST;g!4k=N-xl6{`ZRf4 zpdc;!hF~M8pkC@_2#dilprP>#7=(fZ7gZWi!c0X1z%GwQDLBm`!^`0=dB3!L222dB zp!-t)vpBzC#nutyE^-qNfGYco-WB_o7S;Xm=v{+>B3Lp*r!;t7JAd3;_jJhOrj@jd zRMAYKn`%A`6CU9?a+`?c@Ek!NW+NvEZJtFyOB!Ay{)IL)Vr&F3JROd)ZPK7QSefbE z?m8UD?J|(g-|+y>t%q~#q0$J8cg~_TCdMo;R@uNjgb_?J1~$~jh~l{El8b@Z8i3TQ zK3Jf|ya*VKI&irw{C`q+u!0Mt)qKywBW8OWubOh0;GR3n6v%*iUtw5O4$zic8#Ig$ z!C-*0MuWk&^x2@(!>TcxDKV4<(=Y?Vl)s4oLWv$}X!h{xh?Y3z`^YE9wCvw=yFgOu zSkD-Paut#hGh;;qrU4K%r0;$b6806xjE9BEe9ZAjsu^&64}Vzie){z0?p>E^_6`V1 zk{bklWIIi6f{Y(UjL?4+Fb-la>-!QMi-`xvW3Dze&w7Q$&d{l~on6PN- zcUmL=={92_3b3R}3OMo#C59JJoa!pypvwzAXX;u&-s-OArpL6b zW7{-ifkcLJap~$=%SGy48W&ur$FN6m;kfmo@NeD*Wwt>TN$KI#cO#|3-$#u7FN?-0 zCH8`7;M-s#T+f)6Fii?zOlJ_GJ&-(|WU-nM-n{r0#D53z!U>SoTRmewoMRs1u4mVL zz^TAt>b^84hRXuhc-S{Y3aE!NaOQQPl_~SA3Z2u5K6<+|7rY%Z zjSdhxSEVu<8En_;)5m-n$}Tt}S|3#rd$6UM(_pSQk9920FhQJ_*VLt zW1|>fKYx%7^YYJK5FFdK0`_1prd(atpT`oxBSeR&&Cr0JTlo5t5peLaG%s&=& z=x7##uo}+_u}F*=4Qg)E0f^RiKv94E{L|Da6a>i*IefU+00-qMi)pQd#OlqqMk~i2 zf1F1oAnAVpZYA*+3 zaesGpp%yT^+Y0fgYEIJZ6fLNXWPiE{1}w?3Ve#~uvZE97GE2A2UU?i%q#35sk^ypU z8Yft%``EOdArMMmdrO>XK49gzZk5&H0Wdw5Clmnm2=Mb7Rg3lDY@43;b$9_sQ_<1z zwb+K=ZMv^AL@U5fA9}GdkDVbP!b6j_!++y0jgXcdRTY! zrTUi8-(TM%VQCM@@Cz}qOB@+{o|RWw$adCPfruZdB(;!Y?LFZY4Hc(uWV@I$?Y|Ty z*zBQ6p*-Zk>;O5Yg&gcV#=L5m;(s!Msm67i4ZOQdI9yX_fM^I@YK{I1K9Kx~-g3^X z=|I2);;X*?D-h7%?mKD7Lm&r0IZta8c^6u?Y30cWK0^jE!%GdJSE4os8UKM{aO5*q zssT!45ktap_h}tAhQ=UPRfo6iTYAVnFYS+SP``}tF=Lnn74QYeE@n<$(SO5pcG#@t z?A?BmvqJ-7#CfLT4jjzFX-B8N9CR2RGF-!2Zs^kx9)kq5`yhe8b@)A?cwT4tw#m>k z@#zc}9G=p4V7POW#EyMhe!;|e8b}nq0*-qXhasH;Qp@DXG5=Py5hx3_Mo-vzA2U2n zIb`)NW~q^`4BZP`#)*obcz>$!%N|O=3{h>lE@Jl`-~jlrH#P}lXKIrcshXUkm4Er` z`$>jEf!q(iG)n)$#Dm3Ccx(9PI-CBe2lC1;0KT8IRVw?Ts@)4+1)|SwsMR#qiJ7VK zUs(p%08X2EV|dv61VSk5Z3KQ$mB+l!R#_LyLQlBe<{Mo2RO375B7Zs$DdQy*vcz^S z8a}AOW?9(vh2iaq*q_SrmOS!~$rKoPo&4j&7lWp1a>*qZHT!mf~I}^KVP6R>l z0eH*z7J!aEjOgg%gofwSo0BImxEV1<5~cX)=5EBeC6bAeR+4aOMmMw3+wtYy=|nO+ z&X;ACr8ECh&9l?@H&;(ye;C#!U=&e819|u7tF-*XkLpju6QZfAN9Cm_xyaJxDL3OP z%&_v$>B{$RPT6=>U|%x6hxR<5V*lKa%EF*L3)EJ3?Lu9n+}J>>2JWKv@G)v z%h((yA&F_kMu4qCjBn;3KNvik2xSPjvd=^mu1M^7oo=dpx-HU8@!9vln(nrRZ`Y%C zXcd!^BrU7=sFl#Vf2&qVGYzD(#kxqVtez;XeCuvi6suEi$M^O4VzvC>oA-G&?=1}W zW+V}8u*qWuX#^2UK2DC3gW=7xH7J$SayFjTGr&jT^c)A>&oifiI6i!G9Dw(9y)JU6 ziSPnu6={@dowJi{D z1O)>^qssitNBov;KKnOkX&Q8^^6&Z5KPv|krGJ^GW%wCZJPpm%KbF~jlqUd!R>*@| zCjrcCM`TjzfI2u^x@hM8Pd#lJn=S!ROziOzI15&172yfr$vnX|Y%mKg1XW;n%TDYB zge|Mhc3Rb=f9_TrKP*dYjK%H;YHs6d&J8D=C&%kK@mt}V63gqYsNj8;e)5Y=x}HCM zd4BCzwp>+dm9Nkq&U{aRRoEjg*>k{mEV61IK)Li|r)i+t zTPsG_CqGC1umF@v*hnc#0Bjs1g7b1qNta=5A5jR|w5kO*z;8`^R26VNN%pE(LJVs> z4LZOWAxV^K23>{`ea}KDZ6^9LMgz3A1&FJ-iX^RbYMrp=!=*HOG>uFfJHj`b%NFCdMqG5Wu@hUBEoykdc57 z125yPefYm{U ze+81forI8#X#!jB$1xtu&SI+(=w1$IHVoN1)A8}5olT>+Pxo< zPsy@`+bkp1ns55 zNd7@-0z2!{1h*n!3v@PdBya+Asq@S5|~cf5W>Q zI3Q+~5Zl&8divy%NP+{h1K^$eBqr`Ah-i6pgp%1dM94#$@# z0?KK%-DKsDA-QD`a%tAzKK$q`e~&gU4ByyzwJbtEIx>9LLUS+mZ_K6c`ON=DcX~St z;Rodh4FlXz4^H>dln^DfPUJuUU_h_i!NKuQS{1d__MIhW0Qi*|h%b{q&;C(|J*aH1 z`c)SytS?kR7F=Pyto^R*;(%$219luLA*;2IF*a!svCBv{p(Ie`WvGfYe>Ia(1K3jn z5C*Y&U+BoKhM+e&rUW1W_$f>L-mh_EG2j5?V?Et|ZpMhij8We;V*p2~ zB8eD;Ui?e6=`l>Zj#ddEf4Aa~PCX}zK{gR3Xlyr-*;Trb$>G|C{R(BRzhd*zIuXMR zXArE2!;<|qDp^L_la`~bVWJbk;#R>R(+8mYR*NCWmU*t@Y^TCGm>%2ZpJclwoF(55 zewfGb$?oS9WETnOK#xu8Fq{6y(&Qtn*1zr!1h|Dn1Hj}91A&^Fe}Q=u-3e(RDM}zD zfJZnBhS!jhB`&DOY!K2=pAB}tolmFR1x9n*BK2is=zKkQhke*Y6|85lV~%QoDHxDy zNMxVZ5T%z`gp06f5(`1E<1%GT9mGKjTFLj~AOfn=orIAmqH{C_5vYsIRY(og_&Rgh ziIbie+vY=%->DMnugRre|h=xsH&l$pt+TQ`piyH7Ea|$-|fz2X|0vee+ai#fS>h+m4PCG4QVU) zLY9Hm_9_q5_?j|K-^_GBUlmzhxP+gL?&o6uq{iL$P%dA0iBS-5WMxSLIKcilF$1iV zDm$z|Y|A=jYYW5fu-dVn8>iHrtWdj@_{p1WU8K{HC$14gLg9h|2H4^Kgqz*}0{(#9 zTv<44&!>kbe~kb7g_y%8jDsJVu%}TD_6k$_I?xZj;h@a2%RB070u#_yNke-1jx##= z=Rs6uXy*cp1%=+kOAaokIJVd#buVb}h|Q%LtAN;C2iw5T1r{(|%VC$)?F|>~L|ejV zS`_~4>Mp8Y7LdKIiX2Xd&;%f2zwyh^on_3^0C3!Te+CVUJczWmt`1?#)fKT-*A@F~ zgIGgbas2U|!(TnV+Lo0kyWZsJ4YBFi0nbJH2j123ef5$WMFruY-ZZzD+}DqJIv9_8 z4i`@n%<2bNv9kaL+F*_^7RhE~tF=EJ6HJCn8%%XBZ9s1@c4#>ah0oI>OEN6}u&5V)r|B=YA)8l^T-!9Z?eLqc>h*;ILM(T!{5;C}c?18wJt$ ze*sPOVk(!>MhF#`Q3VMTm+d_WFMp5Qwi15NukfQ5*kySUNfAXKnji@poJ-N{TYFGw zZ8=tAONJz8v;FmFhC^LV@9`D|4*FtI)MzxE`Q~cA`n2M!_pkWk`uhIWckgVv5`sCc ziO3ev^XV{OA6|@Zxvxq@BGbnB^%v^5pMsGJl!W4ZZ>F z#gtG=W{m6!-+z1kdwY7w+qV2v5&4{NrkOUjC;yFW{;?~LH+QMY68Ql4;`ZiFbCqX463%Z(_1J zW`&ySE5;~gS`S1&1&W!OG~?X$6yL{qXh6qc@DDLj40CY)Q4}y$>`;Q~7pNP|tprc< zY7@1d1KQzaKgPHT&V)7->!mVFJ|G&r=8sJYz$FXSbUox>%IXsttAFdwEWyl~RC6;E zjt@n3BW(f zs7dP*R16%tDT|gi%6}>f2`(Ae?pd6JJW^#nNw>?e_Ns(C(n;<%cYD zJp0=^6dlf68IL?z8Fvr0zuS~(ieeK`Yb=D{g*hJ(txwh|}ngYT%L|HIa(d2-q z83F zr2?4CXH9#jQU~cp&($#kN198(F`Vhq6c=%mUV|I?f58o$4HEAm2St8k1P;L!$ZP>6 zpbhW}Pk!&yR1YLoG)1-c-V4|WcQ`Xu5n zduMuzK~Je!NM938svsdd%SAvZ1mQa<{+uGJ^7DnHYk!4XP3eND;)zW9usxprAMF zZWr|#2ZgD=(hJcO7?y6e)zCQ)xdQ02kdDd6?6FzN7qHCXp!Dht9Wb&U8vV=%AAj|(*gwm*F2VO0Z_7FC9hS)eOo{t*ig#om5S>N3IRV< z<9}H%C`59okkv#Xo?~9o7xVS{bimAi+UFfcA>6Ec5AL@pbm5~<aP~$0kU^N2e@SY?$%mb#wrwv| zK{AY4*6(`|!1l2z+RzaNS>u(g;w)3*`hO-R=vHNrsGOLGypVFF*DYj>pj+6O=~jfA z10QVbQ_}^a!BzD|%|g+Tjm1_T(X3%2)uh=pXe>}!(7LnGZXzRKqu^JD5fqPbg8m_c z6g3ikjxd7S4~WhfEoThMflS;tyQ39#pL{fWR0GHYn^8;$Pot@Tmh&1C*rP3kDgt#0|>4rij@k1wXa}h{_8(7z?N$qEM79m1a>s&6&)~ zr%4qiE>>Z^@y*1r3JT8@$dt;SF&Z=hXtW90*xZZ*qIpd#m=wbaq7I#bx0x5H;i?Mo z&#OUQr3Q1R2G&Pd11+vR&%=?70Dpa-HA5Kj)lB4b5RMcds=Xm1WSTGzR}pTvbR`dh zMc>e45}-K+Y)*?RxUH8jg`#S<%J+LJ(4u2f1xJ=#{Eyb(qMhez@dH20r*jlebCfL1 zQG5l5u7=eK_ERBKaiX2YP=lG7Vm-eUEaB@DpF2cC9C*1@?z%i=Algspwtw*nyvU%t zw^ugfIGlCU7=wlCMc3j^z4R>4MSei%6`{YUdN%eiSSZ0jdc4a@n82PDwqyC+w-hI2n09oO&)hq--y;X(>1a!Dgqa zYUBan9R%}jrU_kv>HoRF1%DQ?2zBT|@B7VJlVp4>fQ#=?;mQLm-ycB^+@VL&dhsH4 zSCg+ztEh!E)AmQt{&B%fu8ujr`!rB|mj@p8H}Ob{_W71Bm2Hc)ks7cBJX6 z{2+Ri0oQ)|V<)oU{~?*BX^_Qf74RO*=QU66lDt$hqf^U15kdc`> zon=ecNo99S(>etG>_+{vYKx}phw&nVQrRucT@r^n`tO!vRz3gspHR$<^^MQK0AKQH z;5%tK*t~TXY33_VC>SiWQV;`~${E?)`&a)3@`6#(m(fND6_>$&0u-0}MhL3`K9{CP z2r4RF^+tzakVSQI$FYc$HQm=U(fSx{0A*IC=v6-X5~VsPXBDf^8PIZ@MVINpQd5y~6{rwR!J4t3VoV5xNV=yQ`M9RNkJB9}L4V{q0+ZJwyqR!TYfEfnDt7lQXB zf6>ikRD&i2>pAN$gg!SY5;u7BqoO6Rae>Xg0z;*oUISqXgR`_PgzL_FfN(WX+j)P< z1|>FGlfAmY~q@^)LP#xsalO*`zU%@>_lx6p;rm&T-XS`ZbS6CmxJEX z^<;QA-3Yi(t=#Lqzo^`@B!5U>C#jaF))?7E=s=8jFA9DON2$ zFAB+Ukl#-l$2MY`6#Yk_=QfAlzRH6%1Ul5J!}ZN{hQHgp;beH-L)V>yP%z~YXCUNN z#j~%y#f>0hLlNC4L1f<2Fb9d2e%>t&CI~$5U|pz|rxmec1{VCLiIuUSJnm}s#b>(u zZs28upmZuP69Ug`&CW7nr2HttI>n8K9SYhLy*91RGijLN*f3|Y%!@HNn6z6 zQgJp`3~KJxZv}syh&e{ebIaV4FgKQVH8`E7_pODiWp2A+Zp&$~PyV(S|7-_ffE;3y4+GfrkrzU6SwiNifsM`O37XHb7(wH7K?e1|4Y z3nydAF&sjtbGU@g2nTa6(es&F#1bX9-7vXJxxW>wT7nnwzqxGMfng`DS#?L}-N_%n zzdk-`%q@fv!dzHJ(X%`v5t5VQ+vxKS-)d*?>m4QT7j zjszgolUkd`A&b)keB!#2k>$6y<8S5ZAinw$Uu}^jyC3J%o4c|*mgS0R#WveR=|Lub zxlb9$c}Vqs1I1m!!0khZ9q$mQT20bFWFX6+yiU^~Qrx8qZhe2+ZcJ*41ucY$rWUt$ zjB6M9U9t@#nT4lB5sTYW!S8krINZHTLL+jid>wb&c2%^}Gdqerz$bd#MM{I&rev*| z7zPJK{3LP{b!f7Q$PLCl3C1S!)>gl?6bC&?R9u?QtQNPH;{4AkPIF?uaH1nYkjeW* z`Q%8hQOk7pvYmhWeEANt1@s|J>wrd%iZ{vON(=GG1cj)$M6FG%HOSm9{=09-5d-Lu z=*y{E+}h2C9W9Fo3^ozBCecG1j2klS_E;nmFhEoYDqx~?t9qbKw~bb?HL=m&i%xnH z3646*n5{{$bT`s@1&++=a-q!@YieQSSfV|*+ubt zaV)kOY3_}yT#Wu&;9>c@X~CBv zP!gqneD4m)l{tonYT^Q;?_TbTj+fC!2o#pD1{Ifpw*@PgL`?{R0Zo_2O$aIhW|#3z z2!1H4)T#U{IT411?U#!smx9C9TPpc}$F8D?NDOg?dI?DkY`SDb3mv4Fm`(^ae-QPj zv56_djX1SC%@f^e{uga~-5KTRe(0b)aB5Ek9c5sme40D=+oYT!TDc=^dYs~@L+TS{ zxB|P3iK+46D^m@pk=%T{d9JJ=hOyHGhB6Y)VdeoGh6fAbA?P8?3?)qS6IrGy(Z>EU zuKkndyn?o?nK(@k9|5?|%e=|we@-h#EaW*S^|yR@(qE{eS5R%hcdKky=YcS6ujj~u z0tCd6E4+L4<3C?qyqeod!wH>hg<%&TlgUy@K?E0ID`2FK3F-qr0i9IK=hZwQBKEM3 zV~U;-gxLwLX^;7r&Wr=4g*yW0KT&BxS}piIfJ?4~I;Q9WD^dDH6h~1Qe;X|SV_f@x z?PmuPi~{FpCn7o$iXY_1F|OTjnY0$DihWkPuU|f>} zSJ62|P~BAbq3=zUV3)E`2#*0_w?a_}P62=FWGGh$1Fo~uS8ce(69xMKyX&yF2M^B} z+!1g<)2G1L=y>y{+T|@Cv*lG;f+rnB!o|OS_;GdvAWXtcH^?^_rt4Tn1pp@|b>;UW z3q328P|TpbURA|?v#tDLSbE;|x6MdYkE$Eo_+4Q+P|}D@W4J`?pj<()?J6h&I3uU4ZMnPKgmq*|czsG5gV^J~3;NpDRmZKW?cGsI z)wDKXR%)o1#by=FM{sS+*KncO%#~&#DCw%pEX))c{Po8C}d$`XHXAS58JAq>BSr~9m^>LAf~!m!0${zH=-mio4L z@lhs1SctywP(G&!ZVj~u`xo2_)rkz+)?A0i+NNL>{d$K60nz7um*o?Z4cdg9{GoiJ zhZF0%b7mC+=b){vqf3faR)!@kM0FnDzxTZGK0JtU$-=z0#pnvLfO(Fz7{-627j+a0 zmU=Yd7%*$TyP!>c-P|7;Eqm{NF+j!c#cx)PfJ)P(6JwBuE|^N~@9g^$2uW80qX z&^YaI$cX}WsAgRZ6oU6iKdV{5eCy1kW&x($10FFgJ)hyJ4|sU9**1Wn(iX~3QFk07 z9AF#MCaarRw}8-6KgAB=iPL`tR1o%+3W8#D6$ICzmshcpdxu%?FnH=622yuuQNSFY zz(P#MDm-D`jIAJ6xp?NV==~82a68S6$kBYq#2A;OPWEp5`9Qt5&VN+->h!_KwDDqF zeod+Exsqp$d6gk9SY)jTsl~ywby?ipdcTzq;Z=)9J2&EgU#Q947}I|dvq>Ao;sJ9< zz>rw_J2@z>{wchMvVRjMdzn^od<(y;!eZOM{Mz+w5y5|H;YUpB(Z<({5XLj`B7@_{ z_)LR*2k&|8FcyXf$B$;vg44&X7Z(GRg1I!izb}1v#O07abo`kErFWu;hO9+B2N7egq^z@J|{M&Zr9Q6VCBH=1L7P# z%)=);Tsh=nW+{vt(;5Dti$|a?8H>FS<_RI=pUi<$j>KMFp8Xe`c9USL6azCdGm{ab z6qjpO2zLPzm*Z9lE&&>s5?2T;0g9JDR|u?s2Gfn)yV(?V_yomlB7z|y83czSt<)~l z7{W}nroHw$4bGVlfJ)?$;9DV-uCAI==86j%A!bQHSEmS#^=|{+2zwA}iAwY`m z6X#Q2e~YaH*)4E4>dZx`co{=cMzKN)wqOLKPtlzR4p8O^VH8jl0}&p)n=DF!8blmH zavVBHPzuuyta~|wH1Go=LKULGXKti_-Io|K0AyIVp>Jl0fwMu_GA49NFt(V|(qSrN zilr;J^Qz@1xB&Je>9V-zi$pH)XYsnF2)237Iglq+|b7pYm6KQGbx+ zeGbLu00bzZyF`t7JeuSb3yfo+gSyXg7rIwbQUFEJ*-Kz1VyQs488!i&0i27SmB{+f z4l_(X+As=`{ViT19h2|O1dNF2k_GV3IZwB>E83irIm(j+Nz4zF6%q;FEm8T}P;4BW zP|y+#2!PXoIx&z`mUf}&ZdZ+er~9&wQYPUVVIp7x4Vg{$6<)rVG3BEfQ%njkp)nA{ z+;}1?PH~HdNx=|Mm^w?NrJ7g?rajS;U&XWxC>Dy2rCM#|a4)2p$1Ve*spwwpiV1e@ zoCQ#7&|&xfiL1g=r`sE+otJq7L#zO`FFiZMg(qbgW{o1zgc2HXr4G-3C_J!gZH4Fq zla>V(h1Qh7`sew!4)H0WAjGu2Fi29hPb0t-u$4@V6TvRc8Bc%MAZ#iia3z%A5)MeK zAPyTpqVF*(|Dbik>0A52>Rb2Kx@!EB>&iLd`W9{-vu}X_&ZEVQY6Zot%g^nH-~5=;gSLvsNkLKUOZprYaVaN?u*H(I zw0k_24AoB6E5AZ7WZlgciCGDs?W>yQoqT~dV< zxA)^%*e6YERnaj;3|0ovxf7cjQ8H2p#G6~zEmDCW1$)p=es>1~ zJ}Qn?;PzruUHi%x;^13oi&y|7gvsL(?gw~;(L3>oA)SQShet`eAp;7S94TlhIz#Ze zFg|xNc#UTc7NqKb1R`pcCe#^8#}WC%pBaGLQiAMkB`TH5Bfvh+*ZHctthRBY<-sP#4z{=JgHEnzv8%l9o$(ID9Hul&Abd>Ho&&Yfj zY0z$iQ7|8iC9nj7ZRu|q(@=*%e~=ZIqSi_dWErt8pI1Zw%bUV#`8RP?RpIG%!mgeQ;d zuH(QLf=v!##*PSt`vbaHQCo&si=Mdv@$_f%9*owvR+B>Uwz5)icHbnZ2uF*^bWDT)Lo2P>L!#GVJ4 zp@pZ1VerqkEs=GHEB?Okah(R8wG0y^h&u2T$c{B54cPrSmr&q2d)`g3L_`N>0DV0g zb$s#$>_4r&g=m-2MhFxEGnY{>2@?V{Fq1J_DwjE42vL7YJmH*Kt;OVS3DuYxttN?9 zOsI5nx0t+-xL`0uOlO=69sO%6d6ZYnvf5eDc@LhX;Q%k{L5px=#lx zFy=#QnN9Vf3XE4|CN%^3`E-1>gu_+Yezh4$-asx#%Sy>&K3eyuPp9vU$C9PIJKH>S zG{9A+F|$UEnYVMdQr3;HZ1V-sBW>d7nMos~dAR}Z@AggZJF@i}E5PxF%F;m`*49~* zS8XSo&XQP0cdMeNu2p~LE17TO_3R(~++wrK=G}^+nVy2MN`7Jn{z5AV9c3 z?{gv!T7bWBOep)58vbr!x{W_9Cx{BV%TqM|CWVzC`P7Z2 zA-k-B>)QI={BXEkhC0Zj-};HDup!lR>dJY)5;h!Hu+nkG^#ViIPgB?d1zrNr_6>b0 z+OnpSuE6yysXRcC6cGeu@`1i~AcDD!n4qtKs@i*6I=?a zaopKu&zulW8pd_E)NL3TVY3dzA6I#WmnV}b&zxCWQLBHygAluU0{e7lyE(rPfgY|~ z{3j3bKuIQg+meO(30~qi^D{d}Tu=XF(X4{&BrNS|s)M4#wCL9H5?U2`jpjp|)|`RV z2(XOu!0Zt7L)QrIj?kyCk;54~iKv^bY8-Ibqo+Z8D>}B!kFX_Hq2mA+rd&ohb-mx@ zw2enSOVWQh&;9OM<-47I#7fyTg48s z@ijuUlF=BR(Oq*s9(-x-PfksT^5C20+YHRv!g+r`WY4g-@XHa8)zE}vH?WvTpZ7)O zm_8iWyL}RI?76-5^!Aoo+t!{t$3}z9F3Ed=F9S$`))knO*Q4kVYs4ztc0qsY znfnhelEI4C+WEfnG%Y)VX<~0I-0-D010Vw^E+b3(3|v(rh8ttkZH$#{vG6_lBUOCx zh#mrUxT{EfaD|mVBuYe|`Wrhtv0$;3U(d5^T5VM#(T_+${+F``6>!sl6}+jvb0K5! zhmAe}-~EQHvgYKE=$2mSc*KRu%7uSk8iTkxZ%1S((Feo(<3WRBPU0KRb#^h^KDe}w z>1H99nruyjysl~&_XSYkAWXZEF>As+7JWMAeP|7E(feD-!r*9PaT**sAPYZ>ju$Y5 zmL+|-@D;QiT||AuBJ=Qp603h0SH8h!d>p#95P?Y^@N0$EK3SsG09&xzB^iIPyYnYq zFBlfeli?=^m9F1K1lTn|<(fW)l11*ro)D&3AJCC+7stI@OmT_S=TWiJQjKXN<2{k_ z2vkYX@3n6^t;8C_GM3wt$`&8mX{&ISKqUAUz|VR$;+wphEG!r5oIetS$1N}HkbJH0 zNzA2kl?Tk)+I8 zb0i|UZqr2=Kk>v%m*kpqWIC$B+^oZ%wFV(D9pjJsJK$Al*-4X2ICHNIxFaZoCj#Ok zpQL;ihzOf7W9)aaC*juumh#hrX<09p^DtPYXX2~j5_NMVGD)TSCUbuhUdXaki38zQ zsly6%e`8DTuj?ZN-+soLIbz_s&@Apljtj*<#|*rxO!?_7zlzT|4`>f@JewDw@Qp(6|Kz%Jxa`BG64dmYs%5m1&S8>eA<>O> z0TSn~{M0(zEwSqfw;Ta?AGp$kDk=9 zFT-^Au5nN9ZZvI~xHQIczot>{y$Jfy?d=8t{dHRfHedo>13=yOdG7#C{&`JUgRTP> z5BN6$Rl{#5{&(%4Zu zWY8S$rpf5CsmFgy$-bR}uhdxjKKPt2|16K+{-<&VgeKa1l$)4U$K2ddD*ipA$1 zOcG(ghFgE9UtP^8977QhmXENYb`-Z+T>MI*K31G_?lZuOCF%f$TfZarXe03_iZ$pq zrS}H^Zprqy3wqbXDLxSbwjlgA#lh*ay(4lVSH)kViZM`4!9(xvP%$Yj4HBWf6gZk< zG8+u*oB%~|)jne4VZCn__jyljgwwiQCM?zZoa2Aj#|nMEv~@I;Wn3OO8ZP)1eE2j8 zt#L>WBs;`V?O#_Sj(mpriN>$+R1bc#_f9wgVI1`j&fFQ`DQ~ygRptFU-?+tP^m&1Abl~|3OHr&>uXoI3=T1mkUV&Lk(Mo{V=uaV zR2xP(VAoz_xdx4uW8?j}DmqKu`H*0k>nCrHTlWw=PG_-(qwzm0d^y0MPTSv|Aym{% zSx^kHJ!mpXfmAXY_44lOznD<=&X>_f2o#rr1p*WUGBq-n(VYV+mwIXlPF{))=d99N zY;JBhT$D_4xiMNXp^DATe)Ds7bEvPjN}6on{E~B74_7>^yPcnGI{JS<*xl67tj>1U zPk+7IiX!u}zg>wktA{7AZm>rSuUx~>$ZTv-=YMa0{NbbFmnLfnr+W}@SQ`66rWJ$!NM@0ruV3oyMp*Whp}cnRkQqHWvb>kmzLN3(aQW?#2WhrSiO z$i_o|YWK7jZN`Ni002aX+AlsF>W)@UBWiPQD$XHVmdungIO@~myD#JEs~yMYF6q{y zVpXAo_;pIP zDaiPSJAg}AAj6H@DJ?b>8j)zo^Fu7>K>Lra5Te>WQ8id%XFj} zr4=x2hptmvXG4!!>463S#ze@J5>iFv+xJNx2dbY5V9p3@o`5v0IZT%+2@JG34agZ8wr6R%T*fe2Sk&}iHdNqX{1rwze0c!NnScGWC#^p4ztPB16DPlWDuGd3-+CLOWyDsPwcs3F;=%!PA|1Da%@!-(i$sYD zIK3NscUQ0T2Ko1L0dhI>Q`mc!PSES?WQ;0?|2#VHJ5^*n! zN@t@z)~T~sB`ahMJqr|bOr1XviI|D252S9Veh7tQ4%OjlqOUCgfKgaDaw!`END1vyr^7n1cD}Cfou>(j&F`SuA0cf{u3ClRi9Xh}G$bEW zki|$jUvYp0+q>QGz#TBM1h-6r`zI`{p%1Y`8`7W92B9L<67xa^+Qp~yDqbID2sjd~D&&+NTt@XfIIN;_Vhdvd4kwb zH<(m{9`ueECs{ZZKuJrFbH@n+w6%m?Hv}280Az5Dc^x2&06Vh=OL4AikgR0&_@D!WV%c>YN$oU$Lio$8=w5~!vfT6nyDJx%!LVt~@ z>ymv36b@#tO)mB@;=67`Y_e@FUUy}`0&dRw=9n(s59wjdHQoLZC%YSEUM@Y(| z{0>_#Dyg1Tf+5Cup;j@KQl_DPD_*iFm+DXU&X~4kaq&iEg6Rxn3h@aoi-&7R3qT3& zY43|95_M&f4sj@;XL9#}AsK5ONdu=m5j3t@Lj4bidPtU2TLopmTsib&%M&~AOAS2Z zGYnpCy0>3lRBn@j1P5(i>VHkejHpZ3o}$3ID}M$l5RO%mXmOFy&82%QlS88#&-Cq| z;xK!mE1P@KS3AsJGALKy<*+gBuwv$~g~K3cXrV&gq_H|U`kF}>vBwv9n=e+Sa6OJ* zQDfT{vq}yPWz*Gmpl6pj@{l;-VQl{ApIlmBF8N4Ewf68$VV-Rq&wsk$Yya_dPhBu2 z?^IZX{WOW&Wm;ZQIBuwd|9QlA7X_RHl9^e*!1B}Rtg;MrgWB{E9b!Fz(} z5iN~(LOo6F`(x9^D}NX#QV+**U1JCd@m%urBEuw$4Cjre2%-Al<*n#FQoj=bt zMD`#5sRxQ~PM34d(uBTq!~{>+ad=Bz%K`uEM+-4k2gA~31uwy{d_`XGvDp25{i7>^ z64oim=rURd8-JlA#JmFi>qqRGP6K>#z&iXoea|UbZp16mq@g60iBmQldUcC@Yy{!f zJz0OLygV__)PNUtezo7);f^kM*EUMQ%$$V&VaIPN;~)*sRY|;)6F@+&ma}8>rvb$l zKc>Bgc4jg?SjRiu)syhgr6l4X*fUt^C?n5)3crjmZyHMllMutuTrvsG58alk;!Ntp z&71!NF{JXMm(fND6ah7p5uy~AATR|hf2~$cbK5u!z2{fxD9_j`Nl_BD+e1VG?D&@9?TEPA+MVZB@5e7F}y#CcL? znTXcgh)b4mUPgH)6CsOeT}NNzW^{{Hs?xaA?g=FsH$me%-L}Rq7vI-^f4DFBe}yk5 zlQM-!-pRwu-4A!%Xy=+;Pv)1Ql}xfsP3EJ1T8JVxAx>*tkjADnl*72!3m*6Lp;aP4 zHO01fKi&_#5@nGTSsAUkOr*?10s}-5d9167Vna6L-jEUtk)SU)!;^yL;G{^>QqkGR zJ^pf|{98L}v#c+(9s%EJ8g74(6M__-PP!*QfdHT15jjcxiJDd=V(==$d(gOtg; z-uVWAe%R955B+M>LT%u4g*HzoA027y;Hhq0b#%_uxK(&z%#>YL`O#Eke>3<`0819} z$RajT`0{WQeO*atITwJ*U_!`+lgVOLvLgNjH$s~VGWNm-l2Eas&GA4hHd6v*IAiRE zR9o#vW5ee?otE)Gw+kiW_2=6=`tn6EUT&6)RVLDSuya>9FSCmG&2EowQLfFwSH$#n zD3XeYU>6FmuzsOJRALpse?doGK?m-fG3JxxAxSi9hh0lY6~tcK1OhwKV(vzJzV6AM`W0L>Hh4vY=brQq(yW5_YN9s50#(pG zvNPbx1P9u^c8Ar>e@HqF)e({EM_DG~;Q-TIw@ciWNH4GTErb8##7@WE0Ra5q}{}z%WJ-zP;iy1$FK+aEpKxW5 z^1!VO7=gDRf2<4oN;?xwp8@%1HgpQ3g5__q!Cb{3KjK=vnGFEmqb+1Qw8st_?D;6*?^vE@S7QzjmlF9U$_$~Z2&(D~s%S7h zN+>&^9`+FB%@ht~3WvRC+@l|rbOG?~pRivp03W6tf37b8DoYc|&2iP!9$rID@!nw> z7@Xcykf+q~#FRSfLm;59gmL_-CyP$|q+i4CY$hz{nvVY?RiS=MPtKC8D9^j>!@uzY z0=>rz_^1+@75{-A*SN+76F5+4m~E3Ui=WB2_%u;UCasBmt9HBX z<2!OL4n+%ADsgbm>n$^7bz0$|(tTU?kIPc0Kalu)GZS<@jZIs-hm6$WoFucHX_I8a z!U2lRcRSD(sq3o|wh>eiJh)(t_a+NiWfH*5?S$ABe>vuNNPD`&lo0K~{bm6BGEc`F zhZCD#yVmv1nxt)Y>u9#|PQ!XBNicw8@Yk)IOD=TK-|XA<*mUjSft%_9eAbcA0HNh2 z_-r9l!RJdU_e?mj13z3yP`4rcEBbrueWdv% zH+)3(d;IB0c(*iAk$qE>fHPshA^DH9@`jMRy6|=Xc_)VP>djdkO~E1< zeXv?^3=)UH96z5SiK6=(*Sl!L(6kw$OSU6yf3LTwtjcs)SKA70sKVDj%65H+INde1 zt4UG~q=6}+TOf|xsMBlU;cS3{701$Q+TDI6+fW0OZ7-N2g?SVyTV~eEbmc>($a2F9 zS;nzd2!tw3syL01esh|BxOz0_X}yHI1nn14VRh49qc+?~E$yQ6!wK$s433b<7vQN5 zf5G@}nL)I^2B(@V!X4-R@RtN-h0lt;>#-_9(Uj=}4QNLwnCFoGeX||223&4QKwiQB z5CKM|awz%M(Qdk>V6q=vpVbbprWO+#b{A7jw6*Y;g5OcmK>qea;~@zq&)gcbP_XX5 zP+6U+gIq8(ea&7#M5~yT|2`3ATmQF2e>A5=)bdC~n0q2>F()Fdcp}31ED<#mM|dBf zA)*%LoQP<%JKFZgPmzM~2@#7YL^P0tS0cU=@nuB(5g&Y?ch8VeNoI5Lgod(2OwL5E z3wVV@4;OF$7b5$)Bg%s5<0lJ&=NhT%35n+%2q{bdWu$kCEt#5qN@pa6N3SQTe?1Th z1j9)ZW`up=| zh-%IipMW-@B$o7tZoN@~@nagAJg(eIQNk$vw2JGZq9w>^ zY<$1Q_X)nn9QkZFr=$Z24x}3yGR5V&oDr~LVHCNn=YFS7rBR;Mn(^~awE|PFdMZ0- z0!Fdubc7UNbPf=k@v79@|9=ZK(k*%s@Yz{t@(HY`4vm(eTJtRkd~R&zWkN4vk(IWU zHz-vKkT)bRxa|+sA8+$LXu(L+J~M1yu+a*(@pFGqkrk`5^}_>CeEXon@s%YUZ6D4H4uTDc#Y z@4HEro|;2_T8f_(`KcZf9!JA8DUl)hqO7wbj}L>zEL4|zlQ*Yy=TPox{N=;-^?$%{ zmEl?awH#3kPL&zDemOqXISXb5=^4^Lj_bR!kV(+npT4>Ueagv?wO3PPZDrnD`cZ8z#JP0BJ0eU0<~^;w#rM;pXW1xj`$ zObta(&VM=DSgTt)h%D$UCF}~3)z@sH+dEZRNTyD)O|}wG_(H#J6_h^H0eNsHaw_v^ zAoXs^iDp*!IUkpNV9Uz;)08by60oSRSeHvt;1`va_AFE|F{bx|L@YX@3+|ju4A9yc zVAB%FcIS~%s3yXPx$qN|a`q=4dmj%|%W_Uu?|(t0(Av056Z_-p)-}q%zgc-Vt&wDE za;tX1#8CGwmaW*$U{i&E=vJKugo;=&zrCQm9TBgzQ~(r6C@BujF{j1h9675D8jLjF z(F5uczc|KFjv!=`p4b#9{zTOgGz&_>?_BPbC#eS>|G@eO!2+`f3T19&b98cLVQmU! zZkOIh2nPW+mr*YX6aq9fmjOu$DVIuw2nv6pw@AQ&V!~tf!yAv<$4U*A5B=*AK zNR&lbBDEytBfmaXUERFIksZJf2?BV`zS#Bk*L70y?ENgB-CxE2dAGW{`ANq!#v-c} zpRKmgj3cAuOe-02naoz3*_%1z5&Ywe-&Q~0{FDsV!!ji`?B*8US9iGR>c`d9?^k~e zMq%xY85L>2rG&NX!_}ML;@Ji!f1bsWux9qjEj`Rcq!@?Re)e$nH-a}5$Bd1bRzrBN z)27Nlp9|(3UX<*+2rSl?K6&Y*&iO2g6H|2P6DWmxErc%Jt zShO^T%@{n{onyS7Bfloc1YAG|b zk=0x~l?E;43{)Bp&tlyg(z}<%7W6=I<$7L+tW@#*=7z>!{ONUCfA}+Xp3{FLU9V3E zYQBwC{NkG0e0=l$p@rtQ+TXWI6YfJ*eIS2^2`Q7SuMN z%!}ixxhYQ#JZR+5TfPk-s;oZkn|ezAx-9CZqoOYj37{i(w3NptFN<^^gw-ELq5>(W z;#6lFk8(@TUw(b{>KicJCQ{rzyur|CCyv?hy*4_BC#gf6n2A6$15TYlA z{E*e_DnGVI*g${8>}Is&>|zhCR?O34)0e#*sBov>-Xi`u@UjpDSl@rEClLb|u;e;2 zoQ<{LTc`^LJQ)P7Sb*!a{b+!EFNG1##ls`S188DA;7Jz`V93P-eC`$yD5#wk3s^-r zNAGP1I}+{JbZ7>rRvMr)iiCs%bhCV4p78zH=>^62!I5h_NM+2?h3Y&-;1No))`n1IC+7A0}JIjo=JT|rZ{0Q@=2 z!o}iP`HR>PMFOZ%aH|7~ka%u;WF!AIjp2dt=|E%Sm^MvTxlxX{F$G&dq~az(x}8F; zBi3aO5pDhQ07%z)L%oj+1>pCmfCOA?oo})M9Nvc`o`Pddq^y6u2**N1>=K#EODW36 z)22Akrbn9fHfADQH`xa8E1Aq!?qand&wx$Y%WBSGNf9MhT!aOoU)q+)LyGtFg=9Pe zL^JmSn<_18(x%e+dK3-tBsi-vxS>fov{UeS442sDyx#y1X(P509$BGAO6IV8jbEpA zgD|- zZY_bNDG{Bkm{z7Rzf0>8ggQM0nmEv85>Jzwpb73r>N#$K&nKwS%sD+T@Lw00F;?}N z346N632febXXu@gW2ILhshnQ9fR8KT9*@+@>!}if$4P&rMa$O2yQy7d zq-7gfUQg`-m0O}(7V;?ulE}8M^!bz&*h6x45h^SZ2@6Y*iOG#9>R#3nq1rS1_$8o( z1fMqYGI;x3`)nXsJ)5JE!xg!J1Je)Sh#(L1fgRKQ>b=kR|9*cpd*c=X_(9}%t`|kK zBvQ%_1-pOymdwr{Px-!CPJ0OqoR;?r<99EA`01|6B_tl7@@7YK%`UHLY)XPUxv~Z^yi1j7^G#lX5mVa-#jM(<>x_n6dTf0p5!OPj1^R>K7OXri zecpf1bd(q~j469Go*SwV`%2_{WI@tp6p%lV()r9~oq5G`1qL=gIs(>cjz|vxT203# z0UAo(hb*xG>z>h9A!~M}8{c?o&I!Zw;gmPovaNsqdKe#$X;o*>?yK~;yL)x}aE%G3@g~mk zGWUCGFfpm%8Vsomqi^GwPpU7Ay1W~90+0sl7@j0^rY%Vr;&;N2{+wy$PU*&Kf|wVZ z9LPICz^5V$)Ex5O;qih-)z=h_oUWn*BlV6%aDk|}Vc$Wve(4}}A5P@?JnWz`pA+QLB5g1*yU@{SPIL>CJFhn(Z>69uB^b_tc{Xd4A+ zldqmw{I{G~e?1(0k7zJpjvS>h7{jaOCUbeP3)aH+G#xb%!?R98#tv>-#Ze+hMuXeH zdZ@r$iM~$BC*y##i1M`GP`Ai3-*SIt64Z7f!rI{hX z;4>;@lj(L73V3xBgrnySfpNn1j=wZX@1Ecp!uhBcf&|T1H*0v=5jj-}Lg9ZUY?m-T zpHv~J@l;pjyC~{vI{#ZqU+e{-U2^MszJd?M+SYq!Ohe7c<9Wxa+YglJMBVl<*2VI# zlmSA=m>8hG3eD#Ccq^R>z(^0fQ(}Cc^hQ=um?ofuEvJiaE z0n#UDREd!106GxE=9um%-cNsblxWM;^ULf$v|+A7pH#|vvX~y`DyW|Z^7UQbmLMQ# zQ+j7WU1uTKsIuQrxhoC;TUvMrAwj-Wmo+!B{u?PU>Sw@^4}OM{RG4cp(PNmrDy!zV zHO;5=px+;^C%^b`U{{!LCc(%^u{OV3JDUaxkL|Y$z(T(~IQez>0?B{jq;}{~+`Aey z8@!rc=U%~SjBEzHX{RjuTv@!W=wMH<-YbUb6ay1rT+(R-u5->1hr0xL!i{tZhm1Wa z87JqlAU@AVmO9b%zm#37<4Z!+8!X`)dd<~%uqA!E#a8Mv*M)-gJKsa4m(fBBL@*yx z^y?|Wv#W6SxyYuW_ns`@g;Z8!H>U(wEUj2o#rLJOUJ!jtF~y zX~Y;wmEzIG9FLSFN=8~q!ety?%%V4A#tHt!$-9f^XHVlm9%4#rXtRRPs&gYW`t@S; zX~eJ#*@z{IXs=R2c6vQ}^NvO{{P;YgM5IY{YelakK@{V7x{6+n{&4U@b1X>-(<+4b z`h>^hd|H=gt#$!$&WL3CC;&K@B;`qe2q0T7uQmgA6(a(l9mOtmB)WGl=ZhknBuwkOTL=5u<=qd6=QFuYwp|C+ooX0j_ zUEun9L#14aNb{5^b?_{tfG8F1X*9|hRyL@#gVg-cC@|QhQc;yh^E<$~OK0@NlphAi zcYy6GRFdP$sbhq2-)eJICAY$l2t5HHSkOucL*bZkO%l%fm&sl1_O#Ig-s3P%*w~zh z?Mplkw;z!RG6MtOkY<;md;t>#Gcq?elY#sbmj-tVE0?L12uy#EXuudrl;Xi;4qHmJ zl0l>-;W7>;v*5#saRPs8{Au#?k)%fpbeN-Bx+bn zpq*YHefUI!8N7TMP$Ci?+#1sBKoG?^?5={hM}JxMd~r-Cghk3%@BNs^qikB2xK?)+ z;G7Z3qJt>Fxg>uH*S-SjVsW(@kgFIG@YzA+0uLSa?&YGGW$QPKNA_a;i$0*(;8I{6giL6V9>K<1VtE2htVTCu{Ah~b zpa*C##{5tK1u2ArqF@ET*CRmAV-t$jCw;y?Q?5i12}U}!zK^E_3Qon=&n+(oD;wnL zD2gvy2B?};DyXtxzDGBkPRNJy_9;MG2t)yY!`$8x z69#o81Vh_kmspTltoxB(yy!L_}r6k_S3Se zvap#s5>05#{h4FAFpMGZ^5P3@1viFr7(r6|_<5CI)nQ)P!y3)r*pD)QNMIPrfN;oG zsR@r&YsgKRV@5GG`fbQ+k&vi!y2(bA4JEt^XW2)}WC78O_1tLaDzR*|u;1*`M!@|u zcdWjA>s*tsOvFeRc*HtSz|4&a;5qLCijLsXC|}|VUWAfc-R8@zIi6(&YFg)0>=bxp z=f9!2fVS#t=az=SbkqcYW+zX{{=f>}h=_#I8u|xev2vkD^pns-!Wf3*+##R`^1>O` zNPV3`uUZd7jzqG92%+)Z3O?|~;;dm%7Ib{JtOt=t3}{RDkq1o6 zrVc1M`kdQxk4HVsfk&or8ERVwAiQP23|t$xpIQLIu$khftt7aA2O*|JJQ$L26_c1I zhlM1Vh9VM&#UzfVKZQw|BnR-|_d^m9LlckU?|~%ek6%CSrrq;ni#yiGXFr8I zno3|L?8hC~4*3t@4p-XiAHf~x{}bHtw|f(l2jUK2vcViZ>ko)ITnw-VNsQBYKgw`H z!1_Bc^sEnMb|DRaH;B%DG16!QrbD?M>Nxvlki)vAfgJ6%L%~Pb0Tb2^-KW(aTyK^WtE0Eg@b_8ovD1|sOFzY=f^59u&T3*ln~m{9EK z%b%d~^%rVdhb|SfS@4XaZDjC%pA8Ot#g30*6p!X^}#?!dP;3GO39h zoTg2VaZYXY+w*eXBlNDZnS+^znC$;>X`qkjnd65ev@#aSJ=P>zd%#C*&1v|jc5#6Z zKA+>#l?XgCz^4apMB@#IQwMI$%P}D3O#_&Zt-%o}u6X~4+MyvH2E-1+w0K7j;~fbg z69U)8J0hlD9^Szwf@gQY4#4bD`@s(AB?)B@$2u(Oa73se<_)d^?grPy%)>Q!?BN<) zsqlVf;=5@F*pWm~?P}-Nq@7sDgF4%)7r?Xy^fD1dF%G+nI_u>=*%_*daqF@1K`#c8ZJaZ}Peb(n2GvydEZi!NR!ypBa zQn3ldni+$Y4KnR$iXYYtP&cW6RMHg5{1)Z>J3~Gh<@=T6JBsZxRFcChQ-^TjO{+^! zWfDuQhGf9!2rrB?c#cdHtv5B`{8=@J1X5hNUm^RfR5U#~@#kj`UOsx5Pp7NPcT~}{ z<9dPXVG77PkD{6Lscqq^oMR zEM`H=xnF;M^Ww#j4|+PBx_A6);ZK}HfvM0PyJIyRNl%a8yOEgO&341>w<#6 z+K>++7rIC7r^0WF3jA4rEbkz@>-onZSR1~zcV0GYS{L$rM`H$-MbUmdB;-MRy(k`e zf@|Q)IPJJ`S%4C=n6Enz1<&2OL)QFUET>Jm*m!0Jzk3mz^+KZ4f^buAykMCKZY&VhE{8QW40knA-Gbq^y{ah zDg1fvsY135`9~R|xBj^rf7F3NkJ#8$EqJ>)KD`-YB*NZcvp@kU1AwWKo=sjA|kwA%nVuUNyv;jZ>$2<#~FGf`HsF zRSh;&<9d;QS%oiWkp^x*ts7_nUf`l*yjDFoFFvWVK{O>5bX0JfJY>BF%VKyrWE3*iUv8SOyKy z6?n(eVP%+9gqiMGfBw1?rdSyb$}qd8h45-F(r2v~k2!{G4H?pWEterp1Qjs$sGiSe zMTOe7;Lhy>f9iomxlQAKi5e^n2E5C*Iu1L$R`{mg8*(&uA>CaJ*>IhI{i+lhD)$Oi^HNCf003>XXdb|rlaY1p&H~v zwLBcEIe-hl9n}cvs1#XX=g!0mc_?ScDKzb_XFK8p7)AH0*-}OVq;Oxk($Lh+*G=5O_3vV}dG| z#gX$IYJjodp$7Eg1~vHOy8;9T83#@Bn-M~!6ahJx(VYV+mmQ)AM}Jrz3C)zYGP*fLLU5KE9a*E9)Jb%+ zkA9AYWI|p2dh`DJn`8!UB+Ix2TpsLg{RV+H|GwG$z7cQ>u#rep#;wPvwT*VC&CkE` zXb*4iBhFNoMh_nH6ahh@VRwu^ZoVhp=F~(cnM}-_x5gdau6<41&1KQZo$a|Jz^koH zRe$WtD<$H#E?h$ww|V3Cw5>{7^RO1>-aT%+GOwSINVH7^)6zs+k+4iDLSCJ(wt&&q zd0W-Qi%dY7EHlRQvJI-*O3!F7-n%X7 zBjYUL8uURH_KYBc1k}7Q%FkC@tun7xTp#Wn@Ke*FXv1TG2lb&vrtmo}ryQ(xCE~~M z8W7xH;oo+kbl^(c1gy5Fm%Ur%0XgP#UP(P#$1Ngz3V*{Z6IX}u)WbBp{Fv8kR(}(K zQ)WqTilq%8bnJ;G=LCv7eMeY5RiU<+ZD%lTa+sz zfTh;FODM)u-E(nY6`(OAbo`Gsj1IfP+gBqz$#XePB_Jf9s%;EjfrX(9e-Y6j@mKAW2AbX zIeEd@B|-yDkp;?sg9`s_^$umyC}WwG);l!#rWD}N2?S~?#*ltj9w3t#X{G_bO*6Q- zzNUwVFHU*$zpv=N+wzl7$C#uB)W+!sb*_dd5;N$;a`dhL_ z`)Ar;P=1G<^`|NI>WrktOaq~(_NO*@ODILtD_>-B<4Q_5FMrdYYQKAhWpUznhobIb zz1g8#6CmBp;@t~GzG$D$F1YT~tA%4X4j}h)3jUsY9s1K>km6sy5jYP_VPmkc-+loy zx=&DN&xiLg-}%hq!;bA0!TocVtCxj4VbC`L3d>R{mZ24*{I}I^6B7j=D=nItDu+(j zdqtfwWoDz&%zvrYNN~wa*8gKNcu?P+dWZ5Wwfrg8FcF7YN5ZgUbh;QILV2^2<^?N# zakHu)PvHN69vUyBRs8NiZ-gKJv)}=)9CU0t&W|0&~qSEmIg( zvuPLaaSkkih`>QxKdts*8B52x2Gc7q`Ut-u1fwe-#(xD2W|(kr%0nte6NU$iHX;6POk9JVh`UdR_$e$qnhW!2JV$^&N684n9H;gzGt zx;Il`eRbwap(z_?u0wuoR_&yqC=cGxa2~P!M*>nC*J`e|=QX1=OVzV_$$+4pb2#5Yf4Ktv`ou^@q2c;q#-2nVglKp&}s$`m}TTDS<JXr$6r>b^DYwy||zeOEEalqA_sjX4Wo5jM=D1#qLV`fk=)%*dH>RPjx(MAXq z0XdgJ90e2sIFmqlDu1n7ZFAeW5&rI9p>LHt76X8IA#zP;9LLG{#&Oz2X*h9pvuWU4fmp_kKlGYM z%WvC^g@6ww{~?TpP>ED&pK(>pi>vxM>7}p7R3|A@K`;4gHGepqq(+T%8t7A+FIO<~ zak0+p<(ii2Wq)t?U3)?{uwh@-AOQnaD-P^I$~`BB?ZP-y)0u~K`$PpEUCM+pv5%-s zVJk};MFwIVMjj>FkrZD90w|kQYP2p!*N+HC{)%+C%=QZ>wglTIsH6aIRX;+7yGG|; zDjV6vYN4H5gQp4(ZVkuhOgF*w+u7n8JV6QNo`Tb47Jn9=J);*V|9Jb)7x~rI=I$4! z*vZjyh2t^&;rI`o2DnbhH;FQCaO;94RtW#H!`4R>(LXwzSZi8_|gfp9f~umjSC2`eM9UY^q}B zrM#x`;(z1$`4eP#SuXPR!@Cu&ICTQiRCmtZ7sG8C$npQK9j3dqKj3_}m=)hXcDXNC z$eQ;w5RwBv)!rq1R_QL)w*^g#1?aT+UhN+PW1V%J>$+Trz0T~<4<{T>*R%L>kBN>l z`EZrbb1(kGkV#d*?pdFUTkn4Kgp<4~s;hOmYJc=JgXe(_XM-(UE_B!U-#8C4(E%sD zU}+h-3G z9adzCY1MNbxHJ;L(LjKD{SafJLAPnc0&^@Yk3NS$AF=`rU^x%FF{YImmo=#^HGrrx z(N|lE2h=Gz_Nv50hI6NUExm-W(1L-Xcz;}o#4-~&PGdqrnN*@H6Hs(Y02XM~Wli(0 z2$)NqC_#jwnPC6WOeA^COo*gRYk_=TMGcj*#58W7c%=c96n3DrsgsHs${je>dvs)> zyz@py$1%<}$#`SryBz)DfyiFMvBCT4peZf6a8CQ5DhfyrGE>K zMSScW&0(~j1yeZ)&s?n8N_f=i2XjWD+tSwju^Tw%9 z{2tL)nc*_*xQ$Vfp!OySzKzj1y`sXFv>}3uh|-}V zv@g=J4#;k#XWVB_%swm;+V&lRisL1j1^roQbPgEJ_ygDt(2p;22$a`19x=avb1?ek zHiO{3D%b=rH;Gb#o9c#bCilduP7|5!PiFxCjcgq5Hm`_g9f()?U6_@B_~5C} zZSRNvU9_}t4PAy*dxO$RB3rvD=2Bx31+JuS1ID;Oc5njze_| zDH5j@joWDq7QdFce;dARkrS3XSHGpVVW(>Ps;_q(D~04{Tc_M*QDOVZEuaTIt~Qrd zQFmEjQiDngiWr>OX;_$Shkq#0=4EY0IDWKLCPeHszrvH=($jvhpb}>FQ^A6SW6MtB zjFxxEKaZ6zX&U9Bg;B~?UOB@GV_llZwH;|5oTpXFGL9A@%2_wBh%9TuMh|LPB5k9= zKjH$5cE^ht5tlKW(7TRjT_#O8@?vykqFQTu82q$h44o7T)9Sn3H1BAW9{6?o;^FzSJaEb^x z#qYQ+7R`(%LxcxQL@&h_1R%wn&>=h{z*y20;~{G?j-c|V8ubqROM^AcUMJ0xjAgy30&44`-mDicu2R>Mz?iwV17kud zuT^~MPLGo|U%1E8e-yB`TMK9`h7IxPT74J3N1B@jC9QmMQ_KRC7J%sb71?!TSo3SD z`E@qbdNX#COR@j+K0Qm}TK z#=3%(jdKDnZXVC81`&6+VfHXJ#vXc?cJF;z-xA?EaJ$@;^LkQxekF9?5FOtp8|=Ql z4Bg18{60U<3g1+7r4l`ii2*v3hQh1uUSX17&i&N)D)S|p=-w6VEEH@retUeFiShLO z_@!^D0c|gDLVtg~_PbW=;;O9t1NO?XnlABPM7Mo+Ip5iLH(`blES~CYqO)}CGGP-X z36Q;w%Omo&%Z+!s>UO!VZwc$6|GG3LOzXT$nEADiO~6+wR933JvP4f=F}JkEK=6{>J1$mifVn6Nq#>0^DS&U7#DSxu6tCP6zE_n^rl_o6nU?764_WY1fmGTp_zQCB=+ zKpO*Il?^K6;}P5Q4zCXT*!dmNo*yv*&Bz(5;44k*Xq??iOnKBa1$?cI|~x91DnnQn$FFrD6TTwdRrxA1*^bjSuvLjQeg8 z_5$~-!hcC66lZz!!Fn<)+yzj;hrR2AP!zho`}26SnPj$SfcNkIdv@{a^ndZ2_6)E^ z3x5Qo&Sn68^pL{IyYs(Jv3FVj>g@Q<9+Flh!r1QV|FnoC8zd);(hTgq?y@T2?#GXP8tb2YMBL?UUnzHXE_GbE{h=C{Xk*tS_0Lbh{ zThLo`v29);{}fq6D`8xJ)GH*fF`2u{27i4m1hZNKv|8Lud_D7B4!+LDUk{bUUk-}O zWj+S!{%)18%WCPG5AL%>^tS})>TTn~7kRV>35b~%v~QJspifYX=C09k2rzYdFs3*l z2a1c}j{h8=e>{x_F2qsV;*PB($}$A3n>i*+W~g<-#WtD3s!yh@Nt?{Lw22?nZ-1px z9YKL?VO;b^0{`1cd;0{axhCSJ7p?exgO~BR6bA(O14JU&z?F8`13-#You76lk{fgw z?i>am>RZPdtZ|jQu2V|z3V@h(K^t-!2F1dC5q@L9_k&vuBJB9hEsYjiO@eQltGdXke{ZkY zQw`0l#9L5+^Zr6gDBat1Iz9Lkq`g0*m(fND6qiv?2^5zdwFsjD4Y$Fy2!jHDa_iK*1DEmztjD z@FFi(1VYaf2)mo3$S|Eu{u%`eUg8N`ihZbfmaanfM8R%zW0{{80+eB<`GOw)#v-`J z@XWtAmf2rLRfAy~Ic-@54@W{4E)+5r-UYeann_)4K6?y|_ya7naa@;?GzSv{F*z`k zAu=ZdH#V26Eekb&)mlq$8#fTX>sRpDUMO-n!x;iWfIN`4Knny(4sDGb@(_xkfmPTJ zkpBCALs^Lxt)1QV#z;@%E{EjIH*c;=HVrA1Y%MhN-x@MA28{wS`2bIxLaQ1IX7NG- zmp)Sit1oIf2!V`J3YBPuHyTuYUu<0Y07x(b zE4B1l4Oy%B$O2fk6-F&kD#dpxfpTA)Qy|K|B3qzhelFo%=aRAn+Oe4xBki-;Ma5T8 z4%EocAUr1VGpOu@!wAbtU+W|+>LVN}T{gm_`Z6jYHt}6DW?SlOad=~20d_f)%T|CP zmaUp*4AjMcfTWDme58Tdl|ZEh7HFX<=*3)$0?=#mNybvGem-Mg6Q9K@ZmG{=MUw<6 z7%N(He87YxS1Pe#)c4~SB=7c17G*@IBBLl1Dt4n4piRTyUoc5xh= z`oJxTqz17rMa6>F7l7NE%w@#x)p2XsyzT&~In*7005G-6>?lI%RjQv*Tc`@j8Vt5} z+al<^Y8MPB)>itc1Wgd9L2a5KO@p~=raqT2QWqa^Ds?UuhFV%(HJF?-yOAbr!5tfA zSaHV&8)@xW8wFKh4LS>IZnz01r`B15_-dUclVGXa1SGV~88U!%BlESe4lBji!ai+h zsm8&7xHAf)GQjTd;6Alm8~o7}ZiN+~Gj_y)q*;d(P71Y`)xCSG^^1T1*@X4eSAT6* z>qpzui_Pi9xqG(3(Vwl>&o<}V4`**S=R0rj?|$37efR3&_G36ncu`%RMlV;`n9FdftY>W z6KFrX83-#p)3gcAt%_(@p5*nGSQpH8?&;#Q6&hFQ#( z7%KQIaZZpp4@-OvHB7$N=mBpeb<)VN>T%RuEW*vM!~QCwKs!0w@>NaD#hy|gz`l)t z!ya*cNBH3Mbc@|iLQg2pPfsX5_~QIdxmrK}@cN=Z|N8Fq@74O@_U!HEte=uzu76(t zvVL@u`-3y~1|lKAMTH-da8yqQ)nbK(A_T?44RjAWe9y!Br|pYv0Q^6ke|UY4#qYMK zkz)DLF$*@0ci}p!27Mmgn)v7Kozu!bz&cL#2v~qP<}Son04XqvlxQy^N4oy_T*GiUAvz zB8t+n3hD7C=aCumbG*44DdtBXltYLg0$$}R)G(CpO)c+$@>!Jh?3`SA~JfD=*LGs7O?B+2hI zB*liFE-QEw8OuZunban}E z?egU4md39|Czu`QW9$TdkqzCu3{ta7OeSNglg5G`Y#cQxqqMPn6QVPXrv@fD<#G1_ z*9V{3dY6H4BQ#C#SL->+%T{I-H7RT%MZYx6mScehNh4&!uieFeWJ2mbNaQa`K+Tk+e|Y`=k+wX5beoT~r71RjOnnp5L)8Bto3;U)wuv@Gq8tCo={ngpsGi(FsE9#*m?(ow#!Nxo;3d~b+IT9QT1wsb#x)mmoTKpXHj zYqzk0Wj}Fe;EcwKsrXmEKn41QEiisnbWX9*CWV8RzPn=K@ZN2{;^kQJ`#+sb2($kI z;A}WkmthYH6ag@oK^z4Xmz=-|Eq~c=+{p1=U%|IffJC!Tc6;LhQY;(VNVc<@O&+`p zgPx%z!ZYM7$+4__eX6>e=TKuA@Pp9JX0h(BYZM1}K^(k2iv4=NIC}9$#{rX(keUaJ z+kmk+GD-$o$%xA&SgeANA>$E~$A2z!!E$r-@y|F|!Mk6BI1<(b4-Rq@06`{Uw+?QO{!P4%sWHnVo~SWzRkqqK zvzNr(SQcp_Yg^_B?)X$BDr`zxQ(C?r3l?U}rmX0>UF&7KPAkI96HrZLm2#L*nTR9F zSa8ZgHQKYXxCi_^;o)6YWPeq@q=(yGv260Ppr<0;WL}eOh>-~s@z@Sj`N?xULte`$ z0X=xwO?u3e@R9I;#wGN8?CNZVI}zTZOn8*8*R-j(1i8%rh?$)5S|e2uE(ZG=3F4CR z9Jy6qFLyOz<|fPwTAO1Q-sd$v)R{vQ9iPgWhyT6LS|Fz(*sQW9&41S(y1d0TL36l| z_c(*YffnH@tup$gW9Gzh9FJLbLJll56)3|Zp}ZH}e7N}M%eiYPS)>$eui=@ySjkX+Yg zyYo!d^xV<$&$~J=?mTGwab1&i%RFuJug7?`@QnpYSXiuRzbrQ!e6?!`C?O!wMP8)U z(A`n2&Y& z-~_SS@bj)A^kuPrB!amoNRq>W*Diq#_37bjdi8miubWeh-guf8EAkq~6?lH)B~(Ox zSyol%!*W@yYWl`yQT&#cFGY#ge()H__{p^~A7~lA!GAE?@{@f_H`{gQ1T=F}=w6D` zIiGQ&&Dj=;1S5ya{&4mC&8IgXw4Bqo5rDF@%@SRm+t}S(=iT_QbBPAFkficr=}#L< zdzOW?#{SOY*Io*IIk5%4c8L#OAv|e6hFB~3Sinw`GeSy8(3p z7M*i}S$~p*p;?$Siv&ZIz?0kBP6&6rt?BTOSjE5+gY39lxd4Hupf#5!Nf@o8IG#ix zP+@ht$}mzDlxe}fMOFhob}}cSg(A+dp@i?=FFsvff4I81zIeB|cs(y*93`d`uubk& z*6b=EJ5J%#Byh^1xMKns7g$S*K@A+Sz6$O?fPZpSxomr=3WlVOIZ=X6EIXJJ;okH8 zGI$`IfmEm!;8KyXoTy%>O_hJ!C(I$ES;>A1VGglDVu3Iu+*hd+!U|j&zWXVJHC7UG zBJm(}jtvNzkHxcvzc2VVq^$4s0?#h<1joLFf2Ss4$h&=ZnI}aO*~3Vs0MK~9dSbA$ zS%0JhPVq&H0C`i-FYFLYoQT7$@n;lu3c{CG>SrkMV3DUxU@=bWVT~ujo8v_HapkhO z1z%8H4ZE*X@HZ8{ctI~7{=P};FaMy2SG1(dSl5 z@A&xND|bq^X!f)}PuT|(lFjXbu;g(sf9nrD#Ds41YGU~3koAEGpU;4zHUnq7&3~&F z)>-@IG1LcOk6;`aHZma_UWAaI`JLQFOyU| zPVR~8>7a{=j7bJnv6IkW!2>liQ?M6&9O*IFE7wyAW&2PMM=sPWORu1LDc8GAL3?UX z{0K-{-}Lx0#zxXk${2?t>0L!=sDCcX-QE2fN}@;40k~;-SMF+p1?qEiADu*scXcP4 zjZtV}GOV3*GYTwce`}p;s)ocshE2L+ryzRQXIRfIuFlR+=pgs9QjHA8!xSzzWzYKz|}WeRVv$I~y!aKR2n<8V#r1FsNl0 z_C345bi<=r8yoQRcvQnKemi?Nrzs^O#(HIzZQbfi7?iZ{vUt)@xQMSh^2X$tSnXKG zMcb9QXhPdfS2pg|-H_v1H-BS1n>VZOdF`i=zH3U_uBoZgqHP{&YzT+g06=&{J980U zHokMp3X~3b%KQOM`lzS!Eg6mC+M!2Udk1C=Cq!)Ax#q4RaeB1UYs;!J3OaI)yH%~5 z?AZ`HGt=wi>Deq4pIUUbo;KjtPnUt2t|iuzk!|p_o4ydRyDYG#+gU9}mON|QbZMPo z$J3pXrUY)ri<^w3CvD=vd=qJ)`mzI4cOfS~dHGb#k>Jw(c%r4et^9Q)cNKnoC1gAr zrcYE0t(DPi5&|9lr>H}NmgqtIDiaAR%v&j!6Uhi6fA5{`Fxb8RdaNMMtatu%`bzis zIx{QI!^^?jxsinyk?cE{e0DArG1X<;z3LMksjwA z-Nq4@f95->3Uj@OaHWnz=i(EP18Xa9ZFlaE^UZdhyB`-QqQz+G*8&#&9=Aq?vL-Z=3rRCyLDYwA^MC*ih>*D+TD$=pVYT zGE%+Q`eEaq_hZgt&xo*a`KRSXLLPw|43)VXe=Xrddk7(sF26AlI+C&4=%*e(Y@fSB z5c?DJgVz$!`D^Kl84wF&f zVJ_F4OiHAu9hw^j@ksw@22z6ws*j2`QgWv15@1$0^2Ej!AL=IC(k`#(Mp#A1$Z?_1#-9K`XHkKqEylc`}SW6CWx02%Lo>K z%@(xY;E&O86UxH(qBwf0?)(hux3@>ZM+e6vF=|#@Dv(^hEwgPy*j&V<8q9#FtI3Z+ zRD1EZ06_oCs*Ud}=$4JTh$N(+&#;TA>7f5TiTf%9R#&J)b2}bgyScKo9DkXD>uiVz zuFMGPVsZ3;xM5SP3T19&b98cLVQmVRY!3+u0x&k0vC9Y*mjOu$DVOid2vC15UkSky zW8~_33q#IgqgU2wCUvyB&R6f&LNWo<%ipelxOy2a=z+{=3)~#xtL6m~U3`Ci@!typ zt3bOFv0>J;)Igi##}S2;BM+~Pjf%`VrN{lH63##k&B0Rh z?KVqyDcOx5A#@2OIFbX9w35uiEzYQuuOtuyE$Q=^?UJW7YGt)%oXdZ6JhcK+u0|sb z%mh3|km*cN+!z?3XhMrsQ>?a62uIF{e6)Q+IQdAh#|(`IfsFYA8a(xM$TcxQBC&vc zbXo8|DZpjn_JZ3nP~5z(wtxd8jhhXyi4$13x}uGY9^cX<&9Z(^!(X}K*)tl`n>Ss3 z)-*2lz!98_f7Y3D83_3U*SPQ7{f=onxgG@9gQdS z9-olaRohKBd{I_u^YHUwb{Sx-Y&6}sK6GVWrMpM>-PZnE*|%<$?%$od+tJBC)>U2R zG~c^19IPduF0`Lfblxhte|C4pOwlOdXB_#9cXyokaGH&0X1#x(Z4ReRG4u(}|0vq5 zDGwuq9Og%A%#TQ%w)&q7I0dfat%Gmc_tgL=dUKL;J>uMOOmIXi=CM$;?zH z5Pb^<;uh09KJI^qGOeLGDoyif*d_=%o5CxApZa~>w<9SPCJT`_BI1l&1p}-dfhtkiJ3Enqz67m$Aj=?1?7?!>mQ$A#&UiA=J|_fv`~D^ibIEE4uDEKS|xH0 z>PioHFWx+VOUr3>DdY76O|p8w$Lsf9+LiaXQ4CZ$+0HeKKv(e|khX2@Dz~hp*RY1$ zDA3OUb%mRk?l3pL^@W}zLU7P>S<#B~0vwE9z})E~V#XxPmu}Ap?SGJFX)o72S?;t8 z52sz!s#kDM%a62cWAFXPo3ymYnABs6!rAS7tIP`$tIRN|I|e9&NzQVtw|?smr1NXD z6cErIUtY8i+Lb}3nVS`S?)uJ|L@5_v#JZ|GnoieH5)2FDyCTDj{_f<+Y2(((PUBe& z$0VqIujV#@g>p+~B$<~`#%17Cs7Gv-(gLK7Ye1h#$(RrOLd=VJV`# zp0zrc^J2lK^bri=FjUbfv8y|(UD387ZXmU`_Iw6iu)~X?fZ^by0cpwS2grHy(pI}N z0hxaQ^W2r>Ftn1TZO}Y1WYft00dSETV`fAIJS6?lMs1|GFE*&n-?itPGB3I2=K zH6hp95xEao5r0A$F~+Qa2J1H;%C_)trMn#wQzRR_5V(xEM;N!X=1Q!IXj$$eK?=l8 z;Uj_*a&arFm~-#%wT}ceZOiKY&c}qIK~ydt!NwFJLb(kLBvtaX`z-4PHuMvUndB&R zxw;T*^m&7#vB-oAwlwT33YUfJ(TrH%_8q-cc0`dLe1FVKo7V4C^mI@ohQm9aqAH3U zHKct-i)-7y>j$ldLLynAX`$3@@j$XBKAoX(Ft6KT`uv}-8I35f;Aq=d)HAx7i-S0* zYI^R|_IDb!ex>X@3AMkdj9t1J8^c99Z?63NF<-Y`aiCFNLM~ASYDdOmy>03}ZIIkB zs1dI;oPS>dh-d*JHN9cU_XfLEjcZ0qH!o-WS~+y_&mMwMT%@ zvN=(?ZU~-li?PeTppTEud;b;k->)uK?;Hck)S@XRmz9YJ43dCUEpZ$L+19(A`_})# z!T(4$daZ)FJ}AL*|tSI9*34mac8Z0JJ#&sKCReI;=run6UC}O2dLk z%A`ngbo5s!39T_5BO~+2v*IKsm5^0>@-unGT=5@ z#{AQc0KD}GzFFL<8>c?&OK8IfJz^68$rfrrKRpGb7|Mnxzbz;g%?mAz(8#l_4n2KW zq-pC#2x*(oYQRCxkU$nf!{n(S&uM#VoPTTI0>D+65bAMc4WfxD`E&?^W_W5g7n;X- zADQ(}#m5efpuHO_&Cg(1s0hZRr+r#@+VBxq440`u8tc*k5Q_3hKPVz9ook!jJc0`7{;E3(W@DM!kvy<>qTDPhy;H_kFbkk za`-?jO|l^S{`%s7{@U{PmthYH6ag`pQ3VMVmvNg2ESGQ92o8Tq@etD_fQ>drf*M8R zeRBds)oN`4UTGs~)B4|c$f2%XISUkdXn{WQ8qV>}!673Lgpun73**&laq&(V!a21{ z39{M{E)ptvOtg|zNJCa@au>bdoPAz>xOivygp^UqI56@w8Inx7CDbU{Q54PDQt%{7 z-C&}!DwowR{jz`0aSf*&xbP@_O6zmjlMHC^EU)XT#@pMxY0`&qCreA*{R0Ld!$qC9 zd*D--`MNuW!{<30gf-L%(W!V{U)`gu8Do^9u{IqkbtGgNCzd8GCQB}3Gmrvns+PWwoz>ZkxsMxsC z_`7Z$Ld8uhFFDKhbwg2O&Bhuta381KC}hh81u1a=WkLzbpyU`7N3{55wfM4dJ^)(6 z6Gb6uh_Zjc!&s7S7k8f-S;OH6!f0$0@~0==k{I0Ky!=FN7r$c?PQ`HuDz261#S;{I zlY-TM9m^F0?n(Y#+4DD zvw9c83;jD~%c$wY{_RWrR7de@E=DXBL(T>)ma%_Pu8O%~i*E6A7t*7nrccPe;CACQ zazGq|$cc@h%BpW6$%p`AphYMT*-m*1=gB0dHvT402{|BG-210v#$n{MOh<~kgN}hy zjYA~XIoX_0j?p9-9NQDhi6h0187e6t_tbYl@TJiQtx6yqtQHy{O0b$kjvDY@Y=?6B zzT9a*94MjustcLK!p6k~9%MMY!6AhTwZ*Bcve`M#@#cM7-G@NxDK1?J?#i&MVi>Qe zf+O(z5d9Wjw#nh^_Ia1TMNU6DL7XeadcEqr**~>7AENhALROVcJ6L#Clxh9^+iqlx zE6v&rmtWWjA|6Y@27|UEiZ*y<9Y%NnM?gCTCnEK{$dK-CeF@TZm!H@OJ%2uGbx;wI zW$g&1|AY9X$p3N>>)9ag3-w_;Ybb~6zZ9A#Vie&BK?v>pP!{K!TE(a`)A!%C7)})mFipc%Q^OzGSl}Tz9W_j8Osp6u3Ojem#Ov-j}9L%8KQ6*pwTgOVQShR zR}al<`3>;D5+5l{tv@Va-FD;+~tn8fWa09g3QvKQ2lXesg)2h-mfe z(|4*A|(}vtWQ99rW<0%Yxm|XHcUL{sr(UK(taE zzMhFB$}=BoZtZyu#{R=ETyN?7t*!M2PfhwQ&k_l%xit>KW z-P4Z|4ekOOyqeKwyo_fTFEtIABtmK)#Or`DN+Kl#tt8>n1aTU?4;d#+%|FI(E?%0E zwBp244p>g?Re6a*v)|&`*BOIdkPTRW6cMT&o|HOR?Pl*k(jbMiHvuKWM!`2HxeGuc zlQ7!`x3fPyx3M;6IpIc)xz%N|uMYDCH(^m_&pgYqONIUg2?qt06_1%E*7A)u0+Xr=xS7d|$+2vSjCiPc=Y0ODXa zg8&kgXvw;${q%ajF6Ilxm0S4;alv7PqT$7bKYQ`>by9u##V?-wAz7`CJ3swE6@Bs4 z&zDbN#W0e9$^tIIf~`&+O1XW1PKo8bIn+IuYafJOBfwb;k=atn_lIMBQ5fj`|>DUg)P$HG_(Zxr~CY zG8)1l(H2~j2q3x;>=VFMQ*MUeM4TvNPOGUezZFbagyoboGbpF0dKm@MR<|I_DLoo` zPS;wVdf>m0=vc(w=3nN2pfmHUdXqJp%QC_J`(}T{Zjy-vA9U8l;56oQo5^rVo=g#2 z2<&B03>VDzH1}z~pD(10!t3Qc;$eKXyd-`jMs89XlmH%eR=POGBcG;zzMHe~QGbDH zBw~-SoFob5m21&{fmwked23(bYfqvQE!<21?*e+R~PiX-R354kxsvsf^>qC>tNg!X&x?r3jV+my9 zph8GxLU+mVv`ZnKTo8PQON~MoDuVhfh2z_7g$<=Cj`$!c@0yp%yH~T|y%PeSqw3je z(c!mEzQT~%c(hUYtdgppjvc9pp!TduFzte?HD#Y=De(7yNg)j6s2V4Q>j;ADFgYBy zITm5To0^EbzG=I2FKAo?1qbbr_i>v*o)Cx63{lFC(POM<1%4NWpW6(<1-7{yLfDrz zzxOS#0e9mU4Fgx_n)6~kA{RlsNe-LKtL3dnD@jU<(KALcKrZWjaB6+@E!4ueYk-6*oO{9DOpc1TApcAfxg~O7Cf*AGg zb>YA25vr`N^Zi|eu$k^zRuRjFzg?eR-@K*My$asf;ItDbwMyWb9oEHUF92~pQW3vf z-b{8H>)zCTy+hD=lVccK+x9r;2V7$YqD10{v^aiN-e&#?rP}%)p|ddCSR1xTb>jl| zk?aD-eF>ayH1O(R!$#v!_eI?#7c@Xhzt?dvk@6ck;hFMC+b%H^ckQUx#0+0-} zHiyJD8;QX$<$u7Fy=0eR4+#_jGM7;W2@?Y{F)^3%6$mPS8QYTEw)K6#f^X4wR#@B# z#&KpW*YP-w+i9#!XX<1!v_yH?U6CrujkEdso&$gva3N{qcG^DJ0D+@(zu_!RJ|;AI zeL?-YT3=j$qiMn<5mNJHy-OIQ#3-3)B?*^lvfd`|7mO38FMnEpd;LusKr2o%$^n-J zd)=%M=;GCX`r@A#3{C+yVa5=uEj}rAve{p}|A{7BxcfGtL}VuUWFhwn5M&Z|cgeep zzdGJRYAoY~rz+&_wyCRPb9>3tMbUiem<&bIniwv6CjVsNF9loN;(tYRxfH2d9GV(7 zY_YxHbXEvD(^V)GV}yd16jQ_)eo86;=c!exlWUHDH$=*nNVF70iS(qZ1b|X8D62=t zU}aIH6Hf7>M}WLZrIMydc4wG#et~$j5vQ5sj~IK5P)SZSQ2r07@YrfyNSP!fndaJh z5C^dtc#xn(OE$Re&u^+7*k5sFzr0VOZ=^!e#r3tjd->JdyuJO}eLQzdzS-RG-S$VS z=*ugAw?`EC{o-l`3&VftR>0R1ERuoXmNtUeb52RdxxdsSV{h}WDS!3k0e6;xv-bRy z)#1LouJ1co+{u0dzN;IzX^Qs#u4`lTH+9u^qu^6&D5?`?R6u>`%DT$$dSdPEj8rfF zeRba!ThHart$+UEyYHUB!>X+E=HV}giFyHlsn8R-LpCNB82I@6b9?G6vOcE$3FWWq zL($}2-F)4X0HWX~qwL#aS5`&qKEC+F7c+|M=QET4PIbRPdWMfe?#iZzwRZmUa>)RD zVB#0QlgMgLq%8n?8&aA3(JCOKqeT8#w40_pbiFpV@I5oyb_VjuXGVv!%CM&Gd2>8} zEQ2T+Lx?$`XF=kI>Vats0c{yb34@%n#Dr%i0XD|EEgd|a{>E^k(zGufn|co#LKomH zU351EZcJZMpa4M?GPa`Nv8^a@h!y2(tV<(umQpAp1NN65hEHKKlG>VRA#P$=BqXw| zhj<&q0o6N&Ea*YXn4Bre20orgdF4cZLJB>_Du9Rq$&ZxD7$I*sI@az!1I{UeowOJP zd*ML>i$Y0aYGCSF42yzBVIa4Pag-6I*~qq!+oi}ru|k8ZVc+6i?bA)s6!so^3hXYH zJR>w?|4nJ+S!sA64Y;7`Z5q&nSmF>6$QkqT!23vtGD-XLsQW_zRQ^oH1b`oZF|DED zBaAz++<{4I9gH&DjS&XwTr!eo!a-3QbtgtNbZrwj@F^bkO_!EJwai#cNh*dAz)Y%B zw`jXa&ZEoGk&C&lm)PXV zl>5-tp(~1$uDCy9y3erO2?vQ_fZVBuxTVKzpFP?3>SQ=DNE2Kh4F@A+R9}$nj5PlP zh5b7brO!sx=W8`oD!4buAf>Gg7EHwQX*$iP9#BOiQ~*i_xpawXhA(u-j+2Tz%Wy37;!{M%U9Kd1a5B*x)75k#XzN=fhqRmW3 z1eIare=1vS)VN&i^7aOQ-VN>pEA?IJ<_0lg47@mnn2a`lF8&6X-oi^N+Cjl1GgZ^d z3oR^EYu__ilCEQf%^~kVX3t2yo87keAAI{A3ta={RSu=>X=$zeN8I-%B!MURen#Zj zrpAkjNDZXrS) zc$zsDKZ)=5w7nBa|R0AUoh6zNWGTf#ZI~21oLfmS{BG_hAw9(MlP{GCr z!ZAK4Jup7)B8a#kLY{WEe-O{cDjAsl0MTO>o^uQ;T=U8aZ$GvrORTjWfgl8CQu~@mh+oRwoes_q z`|)*r6;%to6*E1!w0&MjR0CB&(?NS^PMR)WdG9M7^9=njLP85jf8P9@1%>2iEC|&q zBihWe@am}N4(J*i4Uh<}YJF|m$Bx%d__CNX3S7e=Nkn;&0uYBwM3$j(s=nu@3|GY)M6<4@4J zoaj6SRj+%3wll%`pH)Ct9NeyKV>uKa>C_Ip1O5H~k6YCFaSMAqZ#mVruHz#Eq2#oB zfFf;q#@Ut4NNCeySEWr?Grx$T+w;;zUsF#^4@uHcsz`YJnel48Ke#$tf62$1EzQe`CVdPh@el z_)Hi>+zx2#sxG%NtQx|e&yd!ByqL$!1mp=hMgFeXmrYrHJkK=g2Vd|w6tm*@rgFA- zSr@c;=Xy1JO$aHvxSHMXF%?6rTtff8$-DBGOJ5-Y$XeFUN!g-*d895;k0>Cld(Q2( zdlBdb{#k*9{=|%ew;=YO89W>Nu`t&>0DHB*_!n)W*SMEq4+#_kGB%eH69E(fGM7On z0V#jQ8C`SZHts#Y!jEz%){3O4kG?g%?atn`bM3_KOWVmX5@YF3UrR~Z^}j!Wpk&!m zCf%7%{bG?I2!i+`00*1HCfIzq3EcN?fAj8#DA=&r=S+s1{nLiAz)xTp$WY86AHTb&Y5Ta{Mcn(Z&W3*b=lu^jY$r%bQEUGRoz%DBT+RXMty`ZR8tr*Dy0WR8V?7)HdLs)nK+4+Y#T5ng|z zm8p(2wgf~HdhHVdhC-KyhFMFT;|1VeJt1bQp=G!UtZJI*FN0CpfcHS8XJDmNG_Exq zZgKOTkoz%1!j2u~#2d2<@h)%h!Q4Ikqy|%dd2mPV$F9<=nqgt=N1*V4w%)FhPkfQG z3F9U4_m!@7GptgV!jIGR>!=^}Dy@G|_(2q&NbN!qcwi4!hdU85pQrp>5Iu@g2(JYR zH$LnLLT7sbT$+jC-uLwR?&puRT&SKPjU!TPrw9h8mVHgor`8Z!hdzQ9V0{E3WN*Tn z2|<=d5_{w-m&&uY1-`WOu!x=c!Yw)-^B%{6)`p_&Y18yAbk#kL6)js95t@JN$MJ9g z{(Pjxy!|%e9(o`y4rsT>4j4^5z3V$N*bMzL%+45fPJCgiJhIAw0s1fed`5!p3|J69 z=tdhf`ixdrD51~dQfFG+`dsEZ{}#EpdB4B;bc6N+@oU3);)hIZq=@|lzFB?q`=7xk zhehBQ3@h1uwy5<+1TokTnqq&oxxe{^f}l(`sh>tXvc@VxYl@Pm5Ch#UKYY1+*dIIn z@PrC>hAGasai2>u87A35f-y{h?nx#BLIDB`Z9o4bkRoblOvI_rV!3n&Je_QugExdc z0X0~!I5GHZqs;L?-Sv2M47|bSU3qOjCl1yajZTbyY;yhO>Ox&|@rHk7e`=ey%&*5P zo&N@t_qs0O;KTLUoH%%c(SPYaGi5il=6bB2czA=^@7rd8hxkgIo)~z`LMdgqo`u@; z-|+k2;B~#G(&_xS+$d9(x+0Tw{_AgX7)U=2;=kuD7HRB@@O1gFzV*A)J!85j%D|>0 zG_i?QWD_d_4DBQhJH>zer_w8u*-b~jFr$Bj$CnH-$j$_xQ|W%l+i`eZPamTpPt;`W#{rw`yB-p_kfj&7UC0A3Z)v4z2LjY?y?i>-ip`gC&<|=D-8RgN5vCef z_Tj_|Mq0sOK@f7XZ^R!86yUTQNFK?rpy-t{JS=%UFq($4Pg}hKOdDf! zXc+c`p&}T@lvo4a*lU8gl60lY;X&j_?5xfqsw+yFSbzdu z(Wj;$XU7x6&nO0pD;93+8eC|wDjFufZMJV~0l>-H8tO$TP;Y5&6@mj-6*Re%0ilkd zrm}7N6#=`rW%GY|tk({sGRhS}SpOnyGG;Keg%DD-Cq4-Q)w3cg4knz;HQ`)jhk{M4 z8ck6z7EQRLFKdtpT-+ij-p66N9yp3^-5qRv2DbE1u=KaodWV{28hB_N z(OTE7InomNdk>WoE#N6D^(6_Z9UEI~G1tt1uQhi38l!CN0Tvj6Y)FJ}t(rrn9jtHz z7sRw_R7H@BGIx25u%-&rWqFIMr}B2aDPy0lBm!#8EA*O&fqw`QFEf*G7J>NOZlcI% zd~QozHeG+Bsc$2feVb@eRl~|aJKD-^u`MDMOUl?9PGlM%qZ}~ zD0<=BE4PH96Jt)NeD-yM&e0VoXTEKb;V6t6hGs;9U9>)M zWlCb=$d4hCoy7v`qPWMd#Lf)%OC)z~63Je+Ni2U94d@JQigpOJT^N8pZ*A8Cq8)@T z9z}@V5Xuv_{0z(u&29MYrxV92ca*GJvurf0hFCUPHRkgZpy&bU_2Ee&{c0eUuDvpM z*sF}v`Fck6_-gSaIO|14^k@RH*7i%#CJ_j#VO~z-c8YG3au7HaYM{~dhT-^m3lF5K zM(uyFoT}Q_Uqg&aJKK1Psqr%PWL#Y6>CTfOAeKGDl~q>MyHe!|jMyMowPlvDRnPTfcA@VE500Y&u_ z5+&U*|1_3!1cfO)R@#7^z+hawKqz%erT5v|J&sOpwC1_aswk>C%Y(RFlokFLK(l{b zQv|8nZaxYVLE1|1wFPuGRd7%C>puTpP2Kx2rVxf-mjJL!!2_gFZeWuKh`88pHVP0a zRhWn@8@BjBt)-ljLCVRO_JDun3=co*XI-rs1>{`mDMz*O1j~o%etr@V}4#}C* zIFG~`78D!*2mP|th6-hFWOHiD{YfD~9&SMYvzu!D4S#p$ZuDf4ia!3v5 z#ox>@-sooJjXu2c-0#Wa)zN!D8c8Vf6)2@-K0j_ZPdw`IoUH}b6#d zGqci-mjxJqKd%o2c&WkB9#=ojE>6xb`*Ns5vmco6y0OE32Ek3EAO0ewzWISCtD_V5=uFhDhTNOMogw*s7Swo z141oSBEQAoPlWQ@U5F*h3mgcd#Zo4i8h?EbXe3;-&2F+hCnQ1|MtyHnnpNAiK}L^E z_zGcvWGX-h_l@6JXEaTeNTl!7bivSKF&w7#cx~@+h5>+66xP=vqT!JKu@X_D8_hb< zI$(uR3N4dnFGwl*h^pWt>RaPvAl;BufCaP~)3qkT(tzu89y{ysWK)!uKendI){jp5 z)P)IWsFbZBF)F0$dmD@Zwu&0N#$!Og?G8?Vt1$wiWc+>-`(wOfyn+32U!*9lY3?6Sb@pa<-pS87uWy0MA+-%Cs0B|vdc+v8(58>X0)2RJDyJl&Ov)ZA4zh458Lh$a})R*NK3FYsfux5=NWFiDx! z?w6znN0-(RC?e5Rd)IM7gD8#EfrIUTX3P181EPg)6=;O+%7v0CT?iqZ5yh4z-f0{{ zb-}5o;z(-KT<080b4ttp2$ti90Z6yn ztr5F$ikF-Q_5pJ$Z38}cc#MTju|)eR03{2H4BEK^xUS?5=I?KL^+}5KgxcSK^Jn08WbWw{4s^*XFq{5zpDzsc@*gXTNQAOet~18 z?}Gw=SPul$tIy~2v&HOUNQ)#EDtK{F8CHQ%nj3PuDut^AZTStIz+^Ii2>&$az~3*k z;Y_Q9j)T2gg9%c0@- zZ6>XOcF%=8j7S$)X?qNtG9hzvWSi~UZX9<5$ro8q+xE00d1_seou~WO55+c(DEHZV z?WAr^!ShvFYU5VIBk)~+Oj zVdo8izN&h{x#ER?q*pN>1-^*KDK=(HG?Pj&mT|3g0YXn&NT*I&@k;{DyEg|H=)nY6 z?y`zX86;+T`&5BqfmShe&~wL&eFFoitlh_EyIp64A-lwY#>4$&j0K#vR4c-a^nqU} z?Mn7BDD~v7A(2BD_ZlX&VaHVW>_$tZ4$wH3mo>(4i8UgB;LENW>~;<$Mo|9im6K|* z+qzezC$J3NUlh0HT2nx`4I13)#uZ2Qq2m_Z)vuhnD5z>{QjoSmE-w&%a46bd?2NM0m zqG8Ex7Tlq-VuEqMMQ+;|5-jn8UWRzt=JbRyfCiGk!B6lXAQRajBtR|MB6#kSN{L-_ z*sYu@i*Lcu*5G3w5g}2>Ui}aMV7VZdVGjuu0W*^kq7?x%lRUtFR=Hi1StM8bf@PUm%OAVU&IUQB7_amS zBHXyHp3*g;iM7~Xo%(uMel71B4j@PBwEcIEF2U;R&G6EbyqpYj!bs=*WD3{HkE%sb z{h^*ec<Y)wphe*qD(>H!FZ zNz#8aN&1!oDc{KqYKUk_rpu&K6v3fD^2=|-VTuvNQDWUtovm5CD3=d+-XFSOEW+w4 zX5~$wuafdPj1_BmFYBA?A(PPc3IZ(lPpII6hh>r*M2R7WMeNOPg%*UnO8V-|j(zq1>D|xohnJ(v zGrv7?RU~Dk!AOxPe(Ufe4>UQ0e3Ntqm*|mji9>CnoSg(NSzefPe=l`6T4EZc>Z9RO z!gflOQ)1)N><6NlR)`C^8v{sjC@uulZ+==3)lswyqNG9+YV_V9%CezCoeo4D z@4&-B6bIRy>1`k?+)%>>J{Ut?T>lOU2NiQ~;3WP#z-f>xmbSUYO$WlAxGW~%PV4YQ zp%Vt~Chc_HoM9EZe5N)}ZGKFUa25s*7Kx^8*_~vs*TADK+1pz^Kmw=$D-X_=by?g5 zNkOzNpMvgajT-)&C_M~o5!_-2DsO&Y(u36waEP1`e;j9lLvS5n6QW`$+4Zva zL4c{Vib`h{Of8xKz>)?O1S`bUPCT*R^DXNwJ)c@;rkibhwEC?r9(p6eba#)3TtgU& z_ctet()mdn!M#@0fYayu_^IwKFA?p<)(ZaX6V!>kxz+1LYr9rQExH{pF*Qv zK}IOxn-(z(f61YhpTZ*eA_5@j36JgtTPP+-alX6j8qi(u4_m0QZ$Ip`u%)AD7q)P zzLGCR3|Q+`BW9V_FE zT04nym1H!EOg3s|QI+Y`efuuJgGq}zIKm{;nOu$a|Q7<3PT~P00())kA z2RMqc1T0W3h0iCYCiC0g`;Uy=;KNshQ4w46j}N^iCXco2Uejs)Asgm zH5+i#-~4;E-d5+rQe_~BI+vUptJ>=6+KVq%`Oigx+SSBYl&tD=jbQ@;{d^D!qx!S1 ziYi4_UC&KNJ%v^j!jx0!81Lo&aTp-$Wee4A{nk;l_lz)uxxLG#f;UE4PuS*axl$rs>)>_aJ|g1|JNE zML;>`ZfC2T;%5Fing3Oem1#D08rMqbC&FcjalT&j15?b8b4Fv%%ZK{WQ1z})cJF>< z>$5?G##!wo`}AirFRkR+A$J`v=Gp2luVQAK;_j!_>^4CuW6k5F-B>A_mV%#?mWz(` zu9R-y=hJcWC0SMm-85`>L6?6%t|Qgxa(q$RLwyj?ct2e%ODkzs&LO+c*Y|~|s8!*| z@)WTZb>;*#WXMoGTRbSh8%9q6xXZ$= z2nX=f>-T(sOND>mjM@co*9dKb^9DDMCwP_Tc!W1B)i3*WpB6R5@n;B#>mLyR_7LCd ztR}^;$M4=wN7q_bC|@t{?{>0W9?NodBFk%AT~c@yTT=tQ=+b{ML^qW4lYx$BORP-^ zbY25pp9pl}Y#?Dm5Z&c6P%hHt>Lz*E|5=V-o`{Da7P!GuSlzbp?Xezf%EHuCGK3R; zmLIO^QE2BZMnxSI?Sf%$roy7VVe|yFyDSV$IJBQ$zvrW!Tl|yA;$3L3nxS%GyOk~<$wB@VGjuum(ckH6#_Cemx1C5DSz!)+j8PY z5Pjz>RDKdE7^dg08kVL6Afng@O?lDk4*5V+qw!6 z5CpE4!F}gv&#evzMj|&|=XR54KQT+49M6ig|JEJB$!gpx~*L|bu)Dv_`cOD65{ z9s3d(&o{QL-EA5U27mr}c`ux-XMQpL5>J22?qyce+=?wEWYfnaMCh$U{75Br_ZcM- zW7$Jh(#c+RrdDp<>-IIT&`2JBji(upU2=?C1BYp{-tO`}lhm)iTTfQ8g)(?Nb0~W+ z1D$7pU*Z~z2J<$I_PFoH*YO|mGAD?(m0_|enoGB@!PMo|^?xv^ClEU zKo+WjG!4%_!`_I!3xgquQml|6=1dtPl)(ZOt;i5-OY$r~_wj0h)%3YZh-e~|ZUveN zbOWPXgZ}nHL}69oTxr82jy6z;9FFCSqzG3E&!cKpiU^cj*s4iG@qasAiU>Tm5sMBtl7E2S7XZYxvak45<|DY;psIXiY%yJb_Ci^0r?t24Y9v=9OilO!if~j)6&T4hKKlBX| z<z0L3k;bz6uFV0&7N>4GRe#e{34sic`lp+6rnfZ;!mv;KgL{c>pLy zT>{oo13Va%!jjo?@ctts=eYQqFe;oSe+Jbhk(7hPw*`4S_&EmGbO%mQ$4xW1Z`Z3L zyDfG-bIGW&winM_D#{pddY)g6xEbb`tK#ceoMtH{r%IN!`3coV0*1wCEQ}gXTdS$4 zf4aApLR;#b>m?&$1gePrwPah((mYiF$}l^n1U2%$Kp1gA9UeoBWZP=fBv%*^mRfOl zZ*l@vnW)k$jR8KP)#zQEUS96U$dn^_M&=Jh7Vm^Nq9oiO8Q+O&*Pz1I&`Nc$-o9rz zZ)J(2PIDcu4#$*15iQWQ5UI)XqqA45fBAYeR$Td(J4+34Hox+1JsL}c3x|hMA<6vf zbaftIW*6D)k0jeM1OgH%az*HC|gfqO$yt!E48;qqt4n|`w7^@;#fBHR} zC6!|RP;@O(%+{;xqSTq@@$IYCbeW+mW6fRCUY4BBlf#Rw5k-r6pNGHk#o0-=f5{eQ zfIbb|UeHC*tDDl%)bXp67b!gS4+3iY=a-8V%6y%2Sl<*^H!-GhTZOUw5H-JP-15U? zoU2hWj0Zyj+i=V^wH)Hs$;IV0PA@5k%dEJ-s^joGkAm5B?w z=@TAt8>XNaUnEUDjvx-_9t3$de=W-0Avte-TG`D@1E_a?5Yq)i6<+5t4ml}P^}0f3&4q9L!KJ2B1m6xyx!@divw!#jlgIUryhgd>8jL3kb|oX{-6a z#>yx;^bJGXU@_(#FQyd)^P<|zO7KEQ@Jg#F7|{!OF(K+qnjSw)i~RDoe}%gO$%4bD z564^>iZiI`_#fqN-o{(Gl2}}?~hf18a`Y86@|;7_biG1&bQy6zL^}v z)p>}$g>Bp!YF#yBBh>>^d&Y^YwBI+RG6P ztH$1ev%$N}s`Q_?!#Ir1q!PYH>h?b{kc(FG;|Dq_lpE)5wlxJ+f01|(+a;RvJuT2Q&S zpe7aci%8EsNSW)E^nziBIomJkYk_tky|==c>yPx^>-TulbH^w!zK`_pd>iClNgu7W z{bGEO^l57_wfUd)KTrA7ns+7rb~7c?Z?;Ll33~r}(r-L(s?Od)y>|H7Ug3E2^r){6 znT-8E2LaF38p>r<;o3HoaKir$m-B0&mthYH6_-Ii2Njo4ISMM5wGRnU0viRF2M`G$ zf4gKRZIs9&1-iW0kI!#V=<4m}>fcuqRzWt9X(ke>yuvuP!M3{k?T;wf!RAjvBy^Sr zPhPYNz@m&{R0elfzmRitb28H+Q_0-9yKP?PE0u)pYvW2~BIDEizs8l0g|zA1`2OfE z7j^#~#b+MPSP2sk;rRe!D=ou*wbqFVfAhtF8ezt8whQ6Z#tI|#UveUCBawV1oY4hj z=65Tlh~R+6NRhQ!~ut96z^&I}$j4}ZEXyU;gZ^J>BTwyC>*kQvN; zTj!MnQ%O28g==hd&jt@}=EZ_~e~ciedw>7leRAdCAn3NKGE0Fhz1)JTcen4~vU^}( zYB~A+z9`w1eZyyHPW|yjKCNe=J;z;=fVIiBfTSv~w~mVxW)cpL@R4x)eg06CMUS#Cw1cTs z>|C2;mkz6`jIp$sGb}ZJ6;uX3cr4Yk{d?D#=Ub9I4 z(K}4DuBq5SUsO)4)-m|9Ik=aRb|yYUVw}nyVf4X=f^j-rx8u#7dpJEl7WE_Jnc~)z z9f>zJL<@N1nzrkPf3wXK7Oo)f>%64Nsbebz=issBdpKi!Bd$G zTi2i38pl!iX=UOtFHer97-$s1KrcZEDr2m&DTKZy##(|>lzrw7Vm5F@ZC|`_%JLe@M6@;ebhm$0ll)*$P04 zv@oz$ziUp5htyVNQVw!dI(*7|fZ@QSF0UWi=Duwz9K|7JO4|{ePJEqg00d1c!`uCM zijGe%4Rk-r1!d2J49j8OIvTivQZTztd5Ib71$H|OHxALh{~r8rus_L;^X#51spE!a!aiby6Z&8x~j|D|RX8ssig(@pu@>4W>1_ z-qLhReK5`aXHn1rRzEpYW7P`eh&H29zwMr>*r$m zvLcGd@^#KE86uNFIoKQuv@La5`S$~oq*Q18;{@Def9@-M%7bvRr!Qd`WG455>t*rK z=Isj$vxNe>H#olMAovMHhble#s1^%7;Glp@B-X-W{|P)Vw(gqdPep$i80ySRC9@Ib z98=iHT-*YEo|Eo8;VOvDYcO=QF@{QMD1}9Lpk>dZ@SVT`1%N#d9$>ha_xvqOHnJxv zA4yW)f49XmZ+4>!PO+)O%q=e-ik_hr02-Z!i1~BtkdCdwKTjP?cot9?eji(IoD?{a z_ru81U~mP;hrFW!XBhmNst0tJyfkShE+I@EiA|A&sG7j|T%lkx28~=#(xJzIy}GH_ z4<)gPC$Ep3uxVH^x3CruHJgQqa0o<0_k>nfB&Rihb@ZaC3;n(CZ*9Ph$?@3hHaSUf|=3stK;<_{lKA ze;}Pa_Hc?I#$6&^3=GXZCUNlE-~}cZ@AvLh^zQDMx1IZLT36tFlh+8$$uIbn1!fTn zU{``GBRAV@7IaPjoEgY@1rPDjJp(Crf-GHZyAur=9#3vIhN3~OVv4Pz_r_Pyvvs(J z2p&_BoS%p-`ZBL~OnlO>si)QQRrt7EA;ABvS3cj#4>gGPa<9D_z_iOijEb}^t zr1MV#G5ZGuG#H7T7D3l*#WGe z-GAVZCCxV5I0C(5`07yWlrN<)RhQQvVv5Rhpq#m8L;c zx3=t=bSm4{_DugzWTLVyo9?N*I9^7l;kO5SZCTar(@atZJ7V2f-c2?kab^?J(Wcp! zp$1VW3yx4(5ghvN#B?{5{jjDysgP?rtF7G;w2X0gp~%0uME2zg9RbrGBD*_nf6M*e zI>)4QIe-I&?WLWt?hhG$5Y9y&CQA7TJveK>t_5-eVQ)sZlO2vIHw!A3e&{5~APz&F z>7}8)Jri^1YP@LjHAMkOA9zpjOY!72&<(Q%x?PS-K-bKNvdX}~i)g3wyg z`qEaG(h|+Y=<2NlPrH?vk{u6qyGNC@k7hny6FlH&G#JKYp!WC-s*BA?s)e6$5We1l zJnQZ6ml~AuGFyoUob4fYe`G-jPCLA;EJM!kvN+xZ&c@8ZiPRWj zJd|#L3&;u+yz6@}dyhOvOP{YCM0mdAulrh`IeTq&y>=V++uoiLY;!|M0|NmMq|6m( z3YSr2+CvHq1jz+}=rEM5i4eS~LvKYE<$gXj3Rt6*3O=qMv7%~OfBkUL~xlo17C%uYft|+jPFA-Vx9h^;Vhj`_-bpzxPInzk6Amg!|dJm>N)3|B2v#dh;xwn(l)e_0h zfpk8h8H@!m8zYdGe=Jdzl)s9p&&QfCo7dd2yEN6x?kP6&;4A4la!G0_Bm(L8`!OhurI_|l+Z)M zGGmZJl1&5{dV)%FlER9fAY#j04;KjG2dGodzWLCX=i}Rdf89JVOX>cqW>N9SI*}O2 z*K*%?j>mXohosR$YF;|yZ3H~DYdu8 z$lb!gl_wds<46J!rJT8m!3L8}O-!gF^XG! z`q-2%blsY%e+76qRkIC!3Ba4H03jDXyCY+&n$-!`ri2g}UZ~cc%ik|njLCIa=zM7m z1S-cti^+jesH24ZrXw#WQu8_jv&EwZ2~)Lz$qWE!YrEQ%Lbqv(Vti!zPz#T%Z!GLM z^YM)}INKbs2S^pC0G>l>%MEIjg;AEhK#=m=$qoD zm_I;p#u!NSgI{+%0K-mHhYS8Mr?Rl~RP*bs7-4L!lo%bRg_%mp+b>VpE}B@Aq?>CT zo8a$<)4*?!t>3axA2&Yi?(T0sy!&!@e}DV#)9z+>d-v(fKW{(n==N69H_q}($<<2$fzKb$|Ek$D3d7?pF(B66R{rAcay3VKn_&BcT3Z zrOAA-)GZ0PMVoljBf{a}9-#0u6^%Gr0_5jliH0P*FbJ7&MpW<_>i>Yuv7+w@e=?iP z30te;=ct)SVHCwP)Xc`W7xhDVJffz~C0CHR$1^Zrgo*l`oc}J#;|VuSTyUDoZcfy# z9J`1bkEIDF%am>^=fh-$|J^EP^(Xf=J%52}K=ATP-ZaNdn6g~VU>zf5VqJFBui(Fv zfO2c8iBO9FOEE6#VtFVMsD>EwIR$=3@YKZ!p0cWo(KaMaDUK^M;4~2fCkhwfG;>f} zmR*yE3T}CuKt^Rsf+$r&Hr7#hubWKW?ILj@EM#^ zX>^x^1mN|9$d%JeCD9j0&?Sv55&3Fmo5rq*x-W7%oD)rgXsKvzowv>ouv3-0N58(I zm7;BE0c|BfdP^i;c5N3^iUP;GqIANg1iipSk9h9&yF?6^lOhSUf4zPeXXD6$Y0@cY z%eH#A{c?n4C@F;tQeDzH;+{An5x ze}IAF2Sb)gbmo9wlwbX+-L7ZoTeJ=uZ-+)Yt}j+vcn7lx%=f zmd3r71jDxSD0My6BN5GalD{fGbD>vP-D=P$J(JS zfy+Gc8W=r=Xau+M5wT+cZ(Dml{iLWC}+Yl=3teOhBI%&fPtE2X4B;}gvQqs@_KH=IFkCc7tn zABECiwp_5inXvtFES}~!&N3;V0E|wdw6eD{s0Yq!(pQC$UU;6 z{Ci9WL1xSDpeKUKM0PAF!d+Xio)V}5 z(0v1pmO=I*zLDtcgL9X!VZ6tEXP;AF(Xpz?6k9gCrjjm2%2Iuha1hCw8cGKAUVs4AoN|>4UU?px&Wr>0(@e4VpGkzy*{0XW-H>thiLd6+MvpP{Fx_6CCM7 zg?a0yF-uKXiOn#FXfO`7QK@gEa3$Y070nvE15ORSzFc>t$0?q6{Hxz>K5UB>l3OC5 zv6f6A#m4bb)`BD~f?Xd9Y~{6kvHM>jNc34iVaZGme7m6*Tv4knz1<+D;#fz27kN;a zOW*VRw+Ak4s(n4_@E95^5w3uB=eJOJo^N!7Ou!ozTpf@|CE>#`x?`IKaQ`9NEc z9`u(`GOx-_^>TTKC&+%+9zF&YWKS_F!s1t+g6`c{Jz!7BU;beL6smS0N&&6i7 z4-^XOs-=hqq}8&Dj5BR4QX6ciwEuq3nKO3n;Lrr5eaU#P=bLZNHR0rX5>DPc3Aftg z`IBd_g_&^95~ajsel_7jF|Nf#E6Id3llgM;PaxRz-}ztNwr8((GT0;G)4-HloK002 zlKZ!lAS&D?DafqKR1)cDtVsBt1w}@g!l178@+)G=EGRaWHM?X;bBQi~o;0PSE5b)ZJQS zD?_&SQ#-*V2s}*fI8z|;Q2stzgta$+x4ZfKkv74!hyhW|wDgEB(C|zQSiWu={7izT zq}_%OR7kTp=?FxmN81=jWO5O)FzT2Cuu;N;W@X1j04~EtySBaP*s&^N=Hb+vsW8E& zZhz<|>AJG%@}4^OF0Y%Xcm!S>UPtQ540J(4>-Mfv+osOKsejmF+5;Ga`b_auZGdeiEB1t<4k`d!v?n#g~aksLjV|&y< zrIv>MBN^aBWJ>jej$8{7wS0p*Xn34NiHd+úFmY#0BDzX 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%0A7cqWjBIx@714En)a`@m^h-PuM>*;V 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 z z4eq!Ylm^`4(~zzYbRfASQZMLmh(dORVtW;R=TjgE+9zJFGmq(|q>YPS}P62GZ6bMgyrbxqvc}r4L8p*CfK&14H)M zG)SE9Y1;s&Kv=))(Iejr;YzQWcC9~+e}jpgFx3RUw&L2ct(LIovcJdnPu+&L{2B%T zi+UyZzAk4bOV{OGW)h+Y$>4l8o&AKqO(aDZ$w}jqheVG~DA<)WXe(?7f42xc z?s#(gxXZ@|Ek`04K)`fy%fhs8dIt75OE$9WEA27!Sks$s$|853a57m?rd5;GP{DZr zd1f7Fq2>YQm5#hzDCq(}Yf4$F<{Lqddmx7&wT3~^$C=WRj~EW@TSMj>^P2>9;lo@4 z-Vp4w+j^~FEvs5L@mhFwyVL3xe~$Xq(r%Ht%x){gIIzjlm7cc~wrlUYw!UcwjO6rT zKGhCBAN|>S)AOp0@kj0TD$NZanmWcpU7^kV^zF1Ob$&Cjes&j}*Q6 zRC^y`6eVB3w_+VGUo@HHY|I`Lm{qgbsmhrJ?L%GI?__9-g#9ts#+Nd$U*xieot2$! zkIW=62(Xq~%FNEZE!O5SexpHT|HlQh(w&puDpq9rk&wFQ<0RV@rK-0(7yh+%iJ>a9 zZq55fd_sM3yO&P}m~ljiwk3fFNNj~ik?8GuK7aBrvxoYAmyt9F69P9fm!X9L6qj;A z2`hiiSXp!1HV}T#uh1ivv0wruc%(0t633G?ZZol(JhUATEJ6~;6shp=G5z!1#e%e? z(30&onZ8Ik7R$Z&1Kh!4;0{h-xI6!o>5JpHfji)w#ZrpFbUxtHVAGh;b58! z{&4;t{xyByojQIi!mT5M$uNX1LpxVht;>Jm$P|wJbg9cDTDe)Knf1dB z9x2Kz^EqSaoc`;j^}zckOI5Gawhb5hTekK>=1Z`(@L3=uYd^u={pRK@bp6)cpNEkE zv8$A13LVKf^GFnQ1xRL<^{isT72JQgXI~g_kMS_Dl074|Rg!?)fF5+_n`EA3t{b;x zr?-=fGgX)A?L}G@M8C~8c9{%1dX@Jw6&~|kZb40A1Dl{d_6-H|1KBdL4qL0))y2zC4>&E3MN4lpqM)xR`dcZo z7mnAZzJ}yWi>AV0#U(P45s&iK*qsL+CCsMXXGPYmat!Vmv$RkCz-2Cwe=GmX*S+E4 zGbz87-h)iTNQk^ndK`BJ1-5_70w*_C7^)kMaW-s%ePz0)Ls&UTB_BQ(2iqzo=}PCA z(v_|H`-<2}nO;#8eKEBlo8jj2h<3-hniYAX*bfM*$OaXcHmG2*H>je{Cs$>WBaiXX zq^(W69|R|QU5?+R^^!h-DNciY-C*0`frF(SJv7r*-7tj%*R;6wqPj#u4GZP&2PZv_6QZqwu!+)F((>z&oa|L!9)t%{R@CjiT!eG zAsDaHYP5v{+TyIPjIDnjkx&21$om?6_}?{nvDx5r3sXGz*&RN5y8lhyd7-U^m}xNc zsqveR8e@^GG!dy%)BYy4XY$Gn2=-#Dw0v%sMSB(+qi-5x)#q8L&m$37EG7c!RBHv+ zs;x(HYprU)V>xXbNpMvm_QMr>GH@!jG64d`WV*y=jf?aT=j?xXI((Nad!E8Y# zc?HI6`xVfvSSx@Sw3sMB^JY}lWizXr5-nq>=J&_?N>~I4M0U3TQOe8ClO``8Qj)21 zu}bq}{8PQD&fSRlQJ2PTdYz4j5qG8^#*<@uK!`RT8bVXkqV~>uKv^l7^!WGJ7V_hz z!RW_Lj(?BPb|*^cGHw)HXQ&um&gOQ@gi3@r2JW=cg43G)e=P9v)4N}%7kn~4KY7z{ z00E%b+jW0;_b#!>ic4j2Or>jlVL2Ghe$2cue)0p*^Bla=tD?O7y;6$($~I^1Q24DOlLx~dN|YagIUW`lUP zWe4;eZYyTXJPz9eH$u=LUA}`)P=YRMdPMdGi=%(8E&dE;s83)KG0AuC%(k8o^I`)z zPd<##8Aa%~xE1Hd$RNPM>zbe`+VR#?v2`$dcVnvjlV~*e8L+Gk_ z)%SmzT50%{^jzn|7}>xfAYLzN%{q$H*9aq7@2!r+MZLhJaAz>jxj4F{7h;+u8t!g7IYP7!T=SV-w<@4? z3RS?hG@oTnVn8_FR9k)o-eG_(rdO2Bz7r=B8(^H6J1T0q)aA}=FhqmPdfx){3bZgBp5XE>C+GGuR)w5JcdrYLf5{N|gX{KanJ zFRq^XN57ZX&sHy^V8J;{!cZ)(w+k*}7VvPP!hne&T3ly~|9Za(?qB?V{qJ$(>ZOP# zyEu#d0DoTD<-c6S!ZS^q*VV;RipUF@&q5q3?>9g6-{=dN{6rHxdQJo33l4Ajks{?! z6iLP-wOERX$s{Iq|2uD*U||#urlESFtQwG^ygmMat=qaOb(I>L-Sj&gM6jF(58qxa z1MYi`$@C`&)Ct;XT>`@qgrx)r(Lt#pR%XO>3qmCM*cY;N>mZ zaBE{U*w^lL(^>`KyAsS-(PGI176gj6z4-7R%oKrlpLe%7lAflCuF+LXa_ZJ(G?|$; zZSuW!0oP(&XdHm37ssNidQKLG@wv6hcgBQdjIKb92m-IIOGBenw+1~6qzAE{i&PRa zP=7Im;i|d3DIdyJ`Ea+odnjka7BZfU8{iNsr>ZXZeV13eIW4hbK_rGvFaEXu=5kK9 zluShj*%$~Ld&zwksbCuWH3UaScw#Y~SbR7!c%xiIVF?Ci#wacY6I>1IW-WrDJQ%*o zyHf90+rB7BvOPdV;jGh;%b_}p!L#DkDSyM`nDH<=Yc~=Ah?dik&7vEk8zGPhSMU^j z-L0FxZ)!MDJC|3uxid|r3wl|a?zXnFGFozvD|Ab5H>4#W_P3^hso zz0c^UnzJach#o1GkWFnWu_Mx(viMR)z$uaA$-j`rgHtRnznI0Nc@{s)kO_-_59~09 zHIXns42M;3*66|Y>-FX8r?j)y-r+wCV^3+tV z+tk(cd-e8bH!#)G(K0EY9G+<0$lOMS+xjvld zKa>mdR4$0WIv1YoXhPS~0K08^IQboohxSFr+{^M-Z;BIDk%JXs5RVn&?SF3GtzW&L z%dwEN_)w}^Q|1i_MOa#@r7)m!ljWz1F!u$EWcIV$-7Ti;QBP>b@O-GJgPPx7EPSG?{Pd7Yat}_>>}JoPb9j;iDCA8YdEDXYA~8 zF5T%YIkYo@`26$COj$eKx^Wg_`-Kw))IiK~9B=xZe6mrG34Gv;A!q+q8!hGn!d&2U z>X!rG9|0G}fmfM(db{l_TRU4?gRFzocbG$h=Bm1*$;_k$xSi1xuz%fLOC4kXJA&0b zU@I^Om;iHlL|I7^UcO#`me(P_5}ARSEr0r!xnsk6-ws)&U7n?N11*ueDpVP*>l}_hRzt&MAIrL`^X#8$ zX~YQ{51-Q-0et#@BXUVeCE=Q6lS;yU#wFDZcvW(IWpYT-`+f0g1PX7vS*%2g$&txV zbofHBM2#(#7#1D%UEqk~<8A3cnczm>j{Ol_G5B!@VlUdhYk#*@GW7X4mqFmiYidh# zC+?0sh*=m<4zWh4Z9o1#I-pzg;5@7F` z=lBgzhESED95#L0O*%vrQCEXMrIqVIZtEpEW+&*vVL$zychC=594hCb{4x)Jv5G#= zL+FMYeb&Fhr}4FO_)qxr`CuKpG>AM9!m8aD`D`(YB#VVSa^}%@op#zmkT_GppYx>} z`gg10;2c|BvDnJoI@`q>|^4yu>YSp^dVGdD7qQ7;J-m;B8H zESKOd3le`{N$tUtT~Fd#R}MS7mrY6qk&wi-2xL=XVU zetg~iHR9Q37SC>8#b?*++gDd_vUtWhE7MfWZr3xOCQOv+EK4O5GN0Ynv;Rc@pZ{|E zc6{pUP0mjq5iHGfSn_+DcHi0lN20GOn=kUbjBdA$ zLy2aKAj5)7CS^vFRJeVs%mxHWia3J3aOIKJ{~H>sYr0!^mIkZ&0`}{^*I@z#0_ot^ zs2zXJw7Tu=V;C!=HoBdUa)G!>nMTUgUZnU`mUe~bIJlaOShJWQ82PaPx3|@lnU|IA>)k4$rIyQ!U7x39J-JeyT#> zbOueBdegu)j_xFj!53*F^E(kbR)>-8=<^>;~6SP1y%AS*AT)d1Mu(D>(=%ZG0X`2YOz-QRFF z2W`;uRo~g>SB2=HX+pB2C)>uk#%!iAAVk4LQ5?Px5jj-&78K+!m%VcDmzB9wJLhGZ zz{TS52C`xruw*6yCm6tH43Fz&t&M-vOE;_(2)HrJIIEYvZudI{YWJE|Q(qKu!eX8r zUc)ft%jkPGY_>iJkO3%zk^XNr*e;>@9|lN9mjRUErt<*1ofjg~4<6YN>94 z(srh6Y8p4j^;*@z5r?;)=`WcSPcu)#YiRl$^;jgF$}|X_tq97d(DBKS17$M{WP@(P`N<|(wChwo<%c|DaZw%~zhF?y zr+kq}NDJbrkaD?0LO_K(I2)4_O@(ZJT;9QHQ`vz73p>s>9|`gdq?N^&cO0K^ocx-8 z!vfu)Su15iolTM=Lb88`G30q8qOLhY0Q2g#3cuk@{|W&)TAtYM1B!PzUfw20iM(4 z%*;XB&;;!sq1%7mW4q%OTVp?9s(wrj)M~w4TOot-?DJH)So$Vll41b|%EgiN*q@*S z5Wl+)I{$#_%>dnKXyCEB- zOHX|td~}qd$s{NN)ORkU-{WPVt>sg%P4xF=#|bH!5TAb;P1@Q6?L8wz(EDV?G3tt= z!yxS4$M(LbNwgA8jOPk~M%csYaU%M#?0`N)8iEvFdecmMG-hQsX3J`;EZQ=SF5sOP zQvyq9`?8a4L|^lX6hEa*XzPlSCFNOPcSObhTn$wQ)m@D7vuoO>_f=8G#EkGXZfJJ> z!k_oRY)5~9)mA~%?`VfV@}O2KyzlfBuCrFV0CZEIa?$suqZ$KYdtmLJvVR3TT`ctj z6tb$n9riozo-eEUS$b^M5ree4A8e2vti+?bsfhc5x36gl@{tPcxx&UTX!iYhR=CB)Yl&k>&ve-oH1OA)NkB$sw0{J)J)} zK99o*r6d)CP3Fr96%k>nn8bn;#^q$bnEV#}IsM=KhY|sy6TPs#G8%7c8jks&15(g$rs0#m!c4K*+qw%T@afIUS!%y2l`;L?%(s;k*0O zoAZm;*Yk^;i=XBZv!5Ku6h32I_S1Qj$96Id^VlQC=S|xs_Ae;289OmEZxKzvRr_*j;1p~c~Ink7+2c^ z|F3{<0#SkifeTjmgHMeSLZ^LfCF-_yp}&CE2hQ8m8hy9Y-EpfspW9+dV#)f$UY zL(m?Q=8PnQk4ax&oxHxjnE!h7)JHu@Nt*1=zYRsWM#DYy!FhzPkAk*VO{>j+gqv&w z^Q+p;tH#Ao7!pDE4TvcTROyh2KA|N^#v-3y%r8%_Zmxg1n4f*`4`oio5dGv42gRJE z@#i_{`(LkKy!MGA1c~Bgfwx>vPNR*6W* z2T{EiCsORRDVyr9^-+ohNdOW@nCYR#B9ab=%B(6rf>xu!WVR+HfdM?ovtap_j3OpW)pi}K12%9j8oi>S=Avg;$e@RdQ zB-Jee{O57-a@%%xS7Ditd9YOd3fdHZf6Q%`-XCA8>>F51XiyrL+}Q)&TH8Tw80cmR zEUIRs%1rx&b7j8i+Fh!f{Qo5{7nW{IzJ4h={rUCjk1xEHL=ZVZl`SE&NC;~q0q|_6 z?Y7>j(jQrBWn*k6AUNmiytV6hf2h~)`_e9MQC}pGZC%Vd)_dmKSd`qg7mkJNHI~+f zb(0%E!;%fHriG+vzjCbKZdaBkg4w+nKR7^4x-;epR?a_*>S&$+h2`#fo2f!M!Odn- zJzMAFEsuj3Kx`cEs=#1dAoA*m!#Lo3DzhXeAr=89NtC)C`Yog3ht-BIe=^(w<(p~3 zoQ1)CkTem2KRZMnUT%vAJEQyv9UKQNWFcw=fx)Q=PSJ1-Qs(`JqiIZ%f#=<~oBupN zdAjx1Rz{+oPb@ef^9=xx9hFr%)0?_O0)eaqiXmDa-MwHu+Bt4 znD8+De7holv@7c)thX!9f1)FMU~E>XvX^<;XF-NRu~y}(zufdFbGyw8*JHE~ZKpS% zqF3?-;)NzgFN#Cy^eVO62r*uwbgWpErY>IKfQc9TrN2XBaC?#QaN%iAZ&ZtA(TjAP zQ1)2Sri90IjGXQE_WdLw!BP_OgTT65>(aTw6bqBENWy?y5_EPge|NrWq01`t;COF- z#DFX`?FBn~e&X%Mpyd-)Fiu zy$Du$WkwuEP~Wv3f4c%$JZ!3_Ugw$DQvy^PUA7=3?^NC)gMU@Gze9Iw{NnAU6T-rs zk6pFYZTW8}l&W3NVQL60JecCwed9nbrbIw8>?xLa*57xzeFc$@igZ+9D|f;Ah7)J# z-askbAY9Qnag9Ne1{r!l-`mMv9JO}sy+O=ElBRq2(DO6@f3pM_F^T2l9k!r!pIpp+ z!Q*OME{P^AoIR1b*T6?XxEktH4R;GM}^bG(Nn zb7jmF-gbx|siC9~jq86Q(Y)PLLgH|DDtFCgvxNJ_GxxmaR0ZY`*&|m=8SlS(*{BD` zqnAXS8C`Mk52rIuhuxt_yM>{eh;9Y3d)5Uo@Cbv)O>=_V&`5N%+|35jnjKYR5DZ@_;40v~3pLxq z*i0n$qJ{%sA+kHr53jTxLM(_%4O#f?4+D2 zp$@sZHT{*b9cUxOOO`MWEB^d{n-EDj!6)*4DtcQ#TwBxC|1}|^JXTC+@_(axWy-#_ z|0mVCOf!}%In^AJzq4&)$~$92q|=<`ss1kIl*ODM^84D^IcQ(bGeQaKq(!qEn6FunX8QHSU;72x!7*kk0B1V zW-`gXuStLA3DME|oA#Ueur?4JK`n3yj6|h}Y7j|OG(oo&U;wUz?(m{(lHsQe&y08h z*Qlv`$OJADv$+7N;*5UtRq*)eXGeE%md0aHU7ckj@)0$cDv2Z$EXJXZFzi3N{Ttd7 zF$%6@7zhUl5Wp%I5gY=4Z0ULvG%3%(i_=4OY#uft>6K)0qMmVFC9^51Z!aO`xISSn z83W2p`1|%^{=f)2VKJPWxE9_tS4u=n(h7_vMM3JKz@s@FK(*s$Wtz^=(guC9G~HXm zc=VhO;XISk7jPh4q#b`p*>1M=+M{heWu&h+NEK|j1NetKIV25#9$8vz!LC|G|Asp{ zT0xTsZ5VTwh*3umh!~Yw)=d!HQpvJCZlj}s1+<8xu5L=tProuwVDOxKCyn(RP21Bl z$_1*rSsT(cPc;aprULE(r^i%>fHdeF7o9F2X#Gh4=({rZ$!DYx3TLUo?xWY8|Kpz_ znT23H9dYs$G6(>F{ZTQ$pa1eDNGfAej_`cIwsQpXx;SGT3_`llo-;2>Iw%7MkcKPs zHRh^8yZhbBbfvAgNG}*=9P^HzB($GDT)w}4{d|G|t?DEXumZ;K?XK*1wpf!40*W1# zim5#}MR$jW!K49Z0-hW6eU(M;S4DH{d|sji%VM|g$%G|;`p*jg>>B@Lmv-G|-_lB= z-)O+gpj9#r<5A&%2YG{L$yuuRl@3)=#x9G}426ycXibg;YMuG28jWD8pF#|1!K4-k z>SlEl&c<3orI8+1TbPF$2MYH%Nzq?G>EPkT`kDLzl)z`D&mZ{@$RA*3V2}wIf)gN^ z{A@}@-wbnq2G4!Y(24Tq?C2yK3BSd9J&FR;%U#`@%WYvh^V5YbwySr)onKC1&U?Q5 zJs_E{gmIz=T&!rz0|ku8Az|>TE^XVj%bw0()!hz!(`{Y$yQ=m?JspdT^BhWQr*_&1 zg04FaoWPNatdDZy)L|PAy4{w-y0w1g1o&_XNk@!-;dOms8UxuO=o^BGebC-HPc8u)jc2RUAk6E9{A6 zHuwU6m8me@JCmDw-+<94zcTs)jL8>3f&`MtFP>mg1x;Vo$l4q750DEE+8Pxw2k~y* zEehP+TBo7MZkRi5WP<|piGP^N(?iSQsarSTUayAlcwPj*S) zN9UfqP)r|@a^*IC-*Zk-2UZ2o-mdFnbRD+}i$ll;LJIH6q2$Y+fqUpfco^*+7cT+! zJcmLk`9Z*LF@r<6SZtiX59~Qm)9DXv4B&bM_L$g0VE^n)2^0Q?_V@T6f-#janI+GE zrr2k6K0IwG31Mmc;tAx0dQq_~PmY^DANg-53FV0{M9gwIDr4EMD_2s=%r&ksz&DN_ z(5<6YSMj@5a*J|&XDJ3mP<(&t5^Xu+tH10CzIt=TGd{CuGaP)mcs2Xe$qfdX*z@^@ z(OdWjyTyT1{JL8|(o7^rZsA*I54A9V`s~4~`Sd%Tggg)V->mCy!$v^JU2o>DUQo`^ z9uvl%RYy+IyAA&J6@aA;7f1MQN^6Raz!E$Ll-~~R?$Fcv-UN^LtKo-Ft{OHxQYX<( zQ6lu-1=E4czJ+y_aDLd(xQfW@0(Pzhd%*GnQsm-99grqW>Flrr>&zPQH2fxi7wa_8 zK#&-jE15G7+<(Jdc{+-Of}VvRy~iw8SZN1th6+2*$7%&Fx-q^1PP{f;m2jXutyc=xt+cC+9lOsgTog7MTa{W~Hkw+@32X zwnI&hr`lzZbI5*jwAX3pLU%aSUJh7vPIo!&;SC4c!*$diE_>}cw%Txiy2uoZp@W|k zA*jStDO=@C@Z|7~Df9JInnvBAje7Y=D^QGrvMfzn|7}p$J&k>%oKk(awe-?c`$ifH z4g+rdUkS@?a9>E%$AF$V2Lv#sUoRF*|`FrNpQO=+LO7A zqaa%>iW44mMP1RrDzh_xDyVAunm*vL@R^(f!1`Z#$>R^qNV<}H4C_@(qZsWJ6bpPiF-{d|qdhu4!Wmq{at7Z$XF#3f>sG`RPh%Ex zF=Z=Tx5#{`21zccyIj}zR?LYAP$h&4vTAW^wF0J#ioPfk5BD4-sQK`Gm(BUzg=zDq z*mSUihx0^(xCX|7X{{5>v}bdvnUI5MuP?4X`*sv5Q!?#;so?Iut>zNcQGp+r2<7_y z)rVhiyh_QLmIGV0Q}ib5tbxiDoJE61pKA0PWK3KHUspwrFSa_M8Ohv^JEhQ*I|?C~ zj%9!7gYRDOvT*sm+JwH16vKui+WqZh&NUdTR}T{wN;y_Ty5MW?{UqbzAQP}lse{)$ z?~_O-_2Vah(N8@|^bFVW|CVb3k-*P&$V58gnn=X-dJ*UQ?LzPMcnFWXzn|}3n&~|U zpiv@$kYQR>z9cZY4NYHAy$qTwN9$2M4$dHKk+VcLlyjXeb*u`CSdyC37`Q=?i3pi6 zzULG@_VS3wmMqk2Z^J+`gkacJOT}TG-Mk$qp9vUJ@Wh znN_)=X)9uwErH>z>K_UQE}Lw#I{)SD#wXH|%SB~I|Ek~u6`E{p1|NQ5%KAv~P2wRS<+Z*4!n8f2iIX0G z(SQPET~qAnUKkVXAjvxK>~rCT%eg}_v4C(BP37-^Y15sW-Oz@GDd5;`l{>$u5+^Ey z&JQOuv^MMiu!jP_F_zj{O*rGT22BSW*OxD5zuQd!tMG|kxo`p67)egT1+sR#Ik=3) zXz=ae*p*k4D)SXK;bHKL^*GiRXaG%rY#v3ypNRQUoglajLCFE-j-u9m5b$L1%-s$-8r~HQq5wGe|Y>FZsw8p_`DHW5E@*z&ili*odOE5hi zGq0=}WhZ#kq!$xz3a$YB02(g#GWu+`?P|W+qK{b92&%WEr|*+qhf*~WDFpj}_WO{v z9eQzWlNYxw6kBgaIN)3c53ET}_ue5Q|>fUDc&eG}t;9n_K^F7SBXm zp*iGI>c^oMFcS#3h!7%ah48@zR679SHgOC@7P7U}f`ql1kCO<@aDgw_>`ySRmiDz} z2ABaG-xO;z?~2l(U?9eP0o5!rpUUIbemKaIZ~)yuu~HpT&S;-};r-Ts78a-|*sQbM zqAq1E!E;0mkXY?g$KEOZI^5`~)DiKq=HrYD55mmeHjda_95boJ*hYT3gCxJGjPFE% zDG^iAfeDmZ-qhAyQhLFUw{KtJZ6FAltlL_|4RZ||G=U|6?+c^A)M{A5X8YTqUP3ycD+v{ zqCT}aDr+7pcwadY_NFN+uS?R3C44xxG~LQ!iI&c=cn&XsJ6Ozx5YYN5a9b=sEaMO; zjRY72ksJE7G-^R9d`&iJ5A^o2fr#!Y5Zfq>1K$N4kdW$ozEB2#0sfQqw@Y)KRe#aG z3(yqrldiHo+MYNw@`3KA}zO?Ivr`mEnx_0y$x7 zTqV=}D%gv3@v$?YY!b-A@MyFJo!ldatJn8tSyZn~U#~eR!f*f$199yQ8eFn{?C$pi zq;_o26hdK~9+W{9DDh2Q8oK(@K|W|^eeT{m!xssQl7kd~!FnYXLAp`*ttvwtzHRzy zGT`dnrZH`669VYEl6u4kSz|8@T1ZQJn*Ld_O-b-qOiDp(ZRyofbt}JbCKGn*tvDaS zSL{)G1`X6ZuUrMR)pt5@&6HGo3r79KLM!AWxBWT$!ZvjJ&_eg>i^wUHNivOm)51Zj z$Vf#hNg;861l%(gHX7=U*lvl?;%b<=N5l9=Z88W(#pe%bc}Qt?;Il_7(Z3#0666yz@PgjOeE^Ru7thxZKlDU#^3WZ2yP`O)jxf#nhkoN2tMBQ z4F2A~z5V;gi=)UXdGeY795oAJ*+ina_4V0@%eUTtEFxl3C(klJ`3>mi_WJ7L?J?NF z(?|Sc-hM;`=^l7mgE)KhkKfL&FTC~q7$Q_09q#T77u#Tg1uAV40d8AoR4+`1%6;Lg z5&{fSX?+k3T!jjw@5282;i9yQ%!Lcq4mz|?B*H)iZ>0{=!^@|ZK<*qqUO@1G^ym0t zkLw$M|M&8v051|!MUZN_%>c=;G&ux(>;c^A{WdNfmu2lh;R>2VNpg(np!Evi7J*3Bv;Z?+vsY3qM)Rot6P;|*NKUfLDVm(Pzfbrtr=6TbZJ|J+2 zX*|aQe998==#~he&4ldj?Th~aw*A983T1AWlr#qr0yj06G1LJR0x>q1f#L}%mv2!E z1%Ed3o?oFOwJ%~w03^uXY{hY$#_nz{ci(p1mq$^Mg@z(kkc`&L^=vM`wc zw))gxeD{IL(XG&zfq)~6{>waJo-(zr%76KSGwFqXh>O^J45Hw@%4x%bPy!$%oP*K( z%;@5o4)y+EsyV>F%~|594IwomuA9o}JS%9Ql^a@Y)WN7cYn0n>+cIxJfck_7ug`?=6V5zwh`3Yg_5Uva zF+~}ikR`Ii>exoI(yI)SM-D-$Yk%trRY5>q6H>O>SQ`MSsocNy9XMOk{^FlEw77T9 zl$f-T|js(M1L52AFUf7 zZA5;X+W>rPJ!lbf=JQyLRbeF)0{v$*=?e@}4gXVLNc|)U$C4q@qb>?s^>X3ntL5v^ z&%?T4#D9hvKoch#o|jcapsb)YgFnxXN-sAeY${75Z};#Ngdk>1 z@GiF+~X_4d#IJc75A=Ny&>m~ymi~q zF%W#FV`3g*Cx3&@$u779J|-N3122-DTpbu#BM1I&GW|Gok|3f>R)4c1iHClWNGmr& zpDHrD{oT-+RcvLx+I)&gmD!-IxTJfo@F1YjYm=F0ECvu1DF(&B+K4eovUsygvS*q; z%U)>F$dwWbSRO@CK5RLJgOjNvtTFqpG)gLs5pjxlD9r)D1*jv?mW3vj5XlI9x^|e& zE^E4#a`<`HcE{Ny|9{Hps&z##uS!UrkSB@wUWS5;3fsojRlENZ{+ihE*z=%7nhPWqJ5ij%!c9m&t8KK-Z z!6jrg3WuQ6bM5M?gmkx^a_&UJTM-;cp16HMCu%AQmQ;nNc8;D+vjy3mrhn6kQZj zX|+E!Efb=R_g(eqdp9c56w0wyY!J^Rm8}a$^isuy+*o z_C8lM^uckE4u6W&mwRaO^5&<*m%d=1^^F08S{(nG0Xg*7Vv_FGC^bzu@zXe&wj_@S z(U90w5zB!k$x=z`$6SteFfcE6+Sr`(*p(;Z@k%4s)hh1@dVaeEMV@qEB z>&xon!`+Wl%9h+uSl^tyos4K-aB)WO*Q=j@nj#lVKR%VVzeeuv>aVl6fV+^XLvPyK zpgj{(o)LeISIE|ZpY)ZrOL^zEg_K@al<={=!hr0@AtSn+~MeeNKhcluLSx8t(0xqo@xK1I+V5&02(^$?ahh~K0|)2 zijqz~XRgp&<+-c(ZKqMpiET6O+*td#2)t$2(|;LM6b7jfE=YwNB5*P2+Hgxl4)n6i zYLAVfZW^V2z%b$7#q;JdU_nU;mu=BL20WMx2>zU4D9~qH9gaqI>HdttOJ!VNVe@^; zy*oQW*>(taXQDgiBOZAxy{{nmV?#@**EnXR!n@6yrbfp>Ao6hIM0X^Yl{xe@HTE7+ zIDgsA=2g>BQn}4yZ?p1|N@zke7w5^(r{v(FMi(tA&7TGs;#E}z&dm#X|d z+f(2E!Uqi1p&Uurz^7n%SkijvBc1m$PJUKsT?JyH1@jgoephc!he^TuwB)Ag7wjZ8~PLki;t?bc?U4Bv-KJ+ z5OA*#tbU*ScIos;ZzyeE?}Q=A6@w7hUBY(;k)1)})5p8IJ#;?n1_s+%z)8=~ch!TL zZ#XHz_M{#zBKqVbM5i8HeyaKj3V#r;AQzRR6e=*1?C=A}cU7Spf)e+Z7OKG>Pl)_d zJub{UbvWUrw|sbyS>b|q#5H7*qCR~g1rMY7-%WM)>uB|4vw;0vQTIXA>pAZ9j0QWo zjMZ%mR#3ePXa)gB!C}2Xzo3D+`B&G?t682cJWgXdqS`@3l#pH& zDi)~NyUV>l{F}ux2vh%g5yXDompQNz_simO5hT7LuB%CZsoUu4kwm|uzFr8wBmR9~ zl%=Ui@4jwGx+z+cWOZ5UHPCQKqr0N6NI_Tm^e6TVcWB%1cJ2q=;;*|m-crOY3{&_j zrc^}NukRO28ASfA?lvD6i2&`#mRbE{>R_$p30j*tYmv3q#%QhNv9%VZ&RQhj)Eh9h zBIdR3YDe0CTjOu6p(r_KC@KuUu;w9ARCtHZJUFc{TKHUa8?y12tkZbUr{S_7i%;7c z$!TPfo!APTwH3e4Rv>SS3>7w}B;H2aKybUlG$bOkfgrPiIBGV?ZG2^AOXScy0uS?z10=f>uWSV=One)X`fq&_LAXt1;Y>D`}=$s)H2}YIIP4P$+ zASM9YNRLEh8xU}h!ja@cxIA8(yX%GyfE5MeveH>y<@!6kB&hH3&M)1D*5fhW_R^<= z26vhUEs>LSM9u~cl!l;z=p$qw34boOThrJ`0Y}y(L!>}*G*ZbBsqttVDd4^yDX{%b zUl#g*Tg_CGPt8PjZzghRru~wcNJ1V~L|qpp8DXG0SjnF}ruFi=cVec|U(J4seCeyiT zmt|c&kOW|}&+4WfvuCmm1Z_D3pS#fKk%VY}42WxYx@ld6wz_MIPef<+cGq|I2gfR9 zI7TQ8#t4D;Fi0rb7ZBtyNcKxXLUM&M{F4WAp(4nxwQiwuRJ8Uxc8P7>5r-jrW!8nJ z;)EZh5Ux^DOV#RUaZhLVYY zK+K)j4p(DO?pCbQTjP$SF8Wyug$-gp9^&A{UH?J?>gKM%&?2)n^rae()YBq_xHe#L zQTKo%CAg2+g!Y+}M$xvtaVvmG;paqy(**3^IC#2?%q+@k>$4nB1z+xW8gBs75v#O- zF|atpHH}pSrPx+cu
tacb6z>+h6HyE-9&*g6KYgVrrt_khPCHr3T~SQ;MKSfS34}n6X+jIDe`p1MrW=>^IL@@R>{AN=@-LB zAB!rl(e~%BjE{itsndX+I1M;|yCHs^(}4U?7eu@*cF<*PlL-6|Cbtd(IVR!%EOUWK zSUN9rE!4RNH-mQ2GAQq-OBjdB5l$)RMKzqNEeO++Q4kT10_=v=(=@v)}cnuB7 zIM;J{tEqz$uyysl$1D$2=w3}qk%t&IkOZck*5tHqpINXx$$;;tvkK}=oNIOMlMUoH z4}p(3|8&gl_s~4;m)Sa<0(f6Rn-x$TH?W=fma_-M42x=HzD{AB8-i1)~1pT{gt z#9;tm=rz~%49h$e$BT3$-)FX#p1r<1`}<6|EmaUgU5z0wun`!NZO{Jri+edNf_+S; ziT7+(w_d9(BYE`f&Q_Y*Uyg(-MbKBZ}fg^p5<~+}9S>kjj~%mC3dP5Zlw(Rw80? zET-6I4!bGzIdL$X9EBhNK)D&yHeUtPj-due10WE&Q=(@uXw3c?uxs~Cy`{Bxzu&yN zxjZN4rdpn8Af`k$NX6Tme>)^%oJ3&IwjBz_61^VQr++OtnN1o;-(20E({Ef4i~Vz>*E+dO=weMJoXGVDRUBnrs)NKEJ32;aNgt(`BcqO(tO6iXOa zAD|Aw3w4<&`7IVm!IJc#1UcA8P(jo@pkN)~wqM(99&fg%u+a$mi={5G-Lxl-4-{wd zf$!XnFj6?sTTO_w%Zg#Md0Gq@036a#@%7i;5FacCeDLN456_F+7vtBK4@AtQFnVx% zKM;a52Tf}q13Vx`5Qd@z!NIVot+$Md0d z(c}_`j9G z(PWtwO~-A%-qcGR^R1bP1+`0uOUpnrSg_G!ARK^D}NrzcwD06@M%`{eI9Z3;G27q!oU^CNV4zU(0m0%2vZsY;^Rd zOt)y!3pB;M^C?PI^pL{}egE%U_+A`k#q|wMVxzYO9j{AT$1AO5+DcfFU&&-TksS8n zw1}o}&#(PzM~zZv(H}PD=W4mx;#L#bSrHnO&H4@xsYubdxMLCJ=_>S2XMcHC)cGea z^z1NTyQ}kJ(Str|I7_5%mWNxB+WMuv^z9hnC^-v&1Roldh)Qg{2WXC(2|7#nr&!n9 z>TEoIcz9q{p03%ZT#RR%qH(eDY(1X&4HU2el;R7vy)+xos+r_Rju5e~U}T*4#1XnS z7?3>j;^Ml;8!ZEyJi{BsV}EZ{27m#!awdr`O2YCC_xu@*mL%Lel`}57*sXS-xZ*>t zbu`0HmqfQ=rI*EWy;70Efb0A`rz#nENPV@2w!;Y zT5$9UNzZTI(tEY_>&|8bmbA_hVyNuOFCoyktDD_JQ4ue;Z#WM?Tn49 zp!X(U5v62h4I&5}GWxxsz8X!84cLB}At~cNf(1LXt+8jfs`KqCANeEOFS})j#`w;v zXmd|bV#07nWwlMqDu1J%by}A>co41%jNQ*W!a0^CqH*lEHg;hR=)PexV%t*7M>d;!q_4^N)h?YEDO%e;cM-tFoP z)#hQ4AF~;PL1);?s_Fze@r2npZuS5GgSTj#E+9aUEO(LkA%BFI!trj)d__{++Y^Kp zChho4o3Q3z*?g0G2ttwoi9#~=)?;yQ9o?(1vu}=j(9WweY~N#lc-lDZYNP&y4mT0slNSB)~os(&CQAcOWKbpL1Q;j(~N4Y|~1 zR^^L=x{w7?6`9rtIt_L_N;X^ZOLrUZ&{yPw)`Uz54=2Qa$IN=xuB@G`+ zpU>49;17|FAjHldzC&?}xf#+Mz8rHN5h{JH1JOMXiVhEg?>Nu3zPHMEYZ5j2U`4Np zR?kZx5HPa6?5UYL><|t?$EIOVtS8{ie^?`5;$Ao$Y)HMa3(fHqh0@F?bG}m)`hoe0 z1=yF+XA49D*q0S(3nYJV%$GRD`EMe594on_Gq8}6p8Kcubt}}td4&lmq!-sg-mQ?A zp_ft<=$?jYy2YqZcVSl_&_ZQiXQcGsT|UF=_;Z-0+!fSupH}tR$%r`(L0HQqnrCQT z4Ie79UFoA5NQ!7{u_SyFmVn2D(#aB&nPQPO38`f2*u0>#-sa?n09McY=mJ=`=Zhu1G&#uq5NqXi zT2OfzLc=u6PQwBl6_+__3nG8_Tr@L$pYC7gKDPJ>G^;T#fnQ|x(g&M)MFNVG(3tvA zLr}%{cX^SKB=mo)>TF&0oUMox79U~^3t0i(9^j&Hmia23XRGZp2j-)6O&O-`aV$iC zJKwVoBtcKHj{3`V3&Mkgu;5~-WSn?bv6gCLMpOZ&FEDiw$te z5=`jdy-(s8?~}*wcScH(LqIfGW%M@N0OJ7O>d_PF`2x+?8JpnFE_^Y#vjVm~xHIV&#fG>Uil1~8eB4;So6fF6 zX@VCQ4`_h2oP#4X^6h`;crSUb`x&0w7oj{f+BcaP!_PyEZ)3!09-TM9pl-oA7U-Cb z0Wx5lwda~Cv_c>e(HXqF!3JLYwGh)}3e-fzokq$Yi-uy2GLEh^P_V*zi^VQo1c6V* zLBn4PZ-)(0cwHb0BnfQ8C$l@hsNNb63MjN+fX(?(0w$o$Q%;xIY6~?WNt>i6`G4rA z%{|(Tm6EVq^G`TOs=ouQ#DseT-2oO@mn~}x8Gn)1DJ-?QO+&2kxeGi!p0ELlFo0r# z_QiWQ4=a@W90s1vMTOT5c)~W}sUJ*QF`?REf?98gnKz^knBB&4M0J|S6Uqor6o10# zPAz#7WPqkvwTmc3h)xhrY7ZwJRhZlnc%(W$YG;@+`uM2dPv42hpCZ~I7&#PK&oLx zd^mKU+W6#FM*rTevoiNpblMlQO#3brtx6(AB+VHVu|JHpjeraLMA56^6uJA`MK4rN z<0*#~=mc^o3)IeI`!p$xU(0wv(@Vc)0H2M)%raq+#?U8~?#}Y+_Qn4IYE}{-myt9F z69P9mm*Kbu6aqIjmm!1*DVO1F3r_*FmoaS%iGM6VIbtWSWOyC{3M%9edyEdsi_kcd9O(yQIL99jhM0>XnAhg1FU-W~tihA32cBpo}8)-W$Fq3C~uA(Dma8QWMM?6D$1R#X~ z(uIzLKXsB5pu#ZpRGwzvh0(`V6h-H-`RYGGP8_GX^7)hePx$%8ZUg-kKg8($3V+G0J^75N# z$h)a5mMAu+-dDC5sQ}oe>wgf2)VbP^>QDSAO-QVa#FH&vFSF3=+8uTZwRbL zi_%;mLj?lyURa9Gu@t)&wFjEhv|Y>Di&}OkxrM-8Gz?NV>u$w53eJ^7B?zSlIsg?o zQkbAMVB$By7D^t_U>1B!t|)*9^!n0r=4zG*g48h3#t0N%3o@c{ntxYipcu|Xa+#xb z`*y{^$u{Sl6)D!zPAH-bYLv91cs4V%Lfy6E7N%>2P}_Us3(ureB3Dupu)oRZo$PIz zS!Go%SRYsuig&};&5@1^EzHO3cK3(+$d9qQmp&I3Xt1~`iCc432@Y*nBB;BLh1<|RHIliuh7JyiEnGj$&1>e7(vAR25kE>=89zI zKdp|?@64PaZ38i~RK%dKK$RMMTh~-ap_5FbC&8QW6H`#I4XJ0x`T%2Rdd3-fI)H|V zE;9j3F!TpUoe^eZ#l&2_g&F%&0d1y)B=;qSgXhjR#Xtw-f`5oO35=ug z5@$XcY0@Vq&^g+Ub@yye6jrx}J{-*3y4`+5EbxVXd7@wRfqi_p4z@ZIoinl6lRb@F z(K^l@OWHV@Kw%&<)W5kEY%}M14xk%h{TZ533}b{7gg>~n%5hP`z&(dAw0_3{%$;PRvbF(1!zQ=p>8A}EBK@;Z5h86zAB zJJVMjtfd@;6R1M@Gcu%5;9(`fEt=wW%x^-uZnXfL4Hl~^Nw1FX_lY~}mvBSeq zNuTYIIEx8MA}d-I@P<)BcgdC`Vj-lyviE~f*b+pd8-GVp^JNZH3BB-%8G$64gb9gm zO5x(J6C(^yBd{-HZ-C!Xi_?tbrf2g>&U#iACt*F$T|f!Q$x19+S@T6!rm?MyfC4k2 zo$Q95i~Vr^qA86~5vS8BPBUNE9z*vmm^YU2l9Y5Y^X0~KTiIS(4u>MkXQ36F4aJz= zI2Lka4u2M0+v6CJvDunw1?Tb9CaBb{b?S>Hm(OTPvO!(1J~u8qaN1;d+#D$I4wJ`b zV~jt#2Qm_oa>fcVltt6Jk``SmX%QjCka7oQI^rw7E_%!bBsN<_^}%#cMu;sqnZp_K zkZ?zbpDvL^z_OU+!s>vVuv>=HKCzgMD2tko#(z&G=#TekCT;#%%x5yw@I5LH<*xlz z+D{Ma%YaxHElQ%M=%h`Er=qWb^K*B<$Kl#y${<9vvwC^3l#U@l4rS2!ddqJ@=yRDt zUlc#iclx1syiy<&ESfC|Vme2EsCZI9r;+T+ou(aRc&s7j9eYRUW3+{M8=z%3(&3tn z?tkh?UMtidbf1*cj0Rb{()iMoPzN0xhN|s)$5V}1MDMIahn(@M+BlnYEv}Q8;7^BV z@arTx3s@1($|#~c7Yqn?iD4r|iDxk4V2%CP!Suo;SrUWuzC;BCZ;$$ePu}7hErDLh z41AP4JbFJCHIfNCH8801wP6r=3fA%d87 z6!=W*V!5MqMj9Pmd8fL6BNL|_Lq0d>*5@S?l@0C@0=HSTv=bpb*HkgRS7@gf;eR+y z1CBbS5ZJ66tD#X$e@?2GzrDHm{sRaWtr%OwehiWq)L5gj-caj@FCuxavhQ3Av&fIr z=LNe5!{gxu`~9&h8+`vRj#v;rN#SIB}j7>Iv<3cd+#!O@D+oe7VMF z!o4HF_t2PLb0B`KwD+c&c{|aO_TxA^zMWj&y#HC{IG@si_dC_hEBDIhI3HhE_i~wn zK=@9tFMP{NGI<+eVp*ZGMlKoT8PkkBH{5OUvz7Tf+{@f38wP9hD~)@NX;$`UIoLSMal^-P-AE`K*3UoMIJ>`XdP`48SIRZMz0eXOh`8kGLNsr{`4i#2Ro zuc?suV%tN%#+r}c&j7nDMyzF_vYs1%?C1qV~{6|IbnhyJ{Vf}aJTO{Y)suT zzRbyV{TGOeN;_T+b|Hl^DBI-JQK_Mv}JCADHK{V8Ayj=fP>ErD3#W%UnFd+=wrGkN>8#XBsK&2Vw7)<1UN_KLS@&d?_gBZAxecP>TcR=7u z_TA80JAbi{O}!kNU>^ULiwH}-h}iSu0THCb=_JiC7*Y(H;Q>*UGRD9hrWva!_)@Rd znM*a{0t$kY3}aaFB5>KInak5GTeFpV?h+;hbS~ab8XM7XBfOQpsh_g2IEaFsX?=vn zFz>s6aI4k9bfH}ddewyE*U7hF4;(DAb@rj@>v?NbfTRhjqL?KQSX?lX5E6+Z+lYQ1s^^Afa6x7t+KDgdnP*I{>| zdu6oj>sHGqK&P!2zw7s08?gMZ_lRmxC%NObS}Fu|3_J?nc4%{boE0egt6w z132!w(As(J`3D-|*#j0ex1|%(I&c7zYL=I5BQ&+~(SkjuY&E z+RLTib;o(WXlvM-Rc^-*W5#o|8d=Y-;^}I%8?KvUC2l6mj-{;0KDwh(OHCy%sL6#?A$cK!oB7Oopv8`@=XT z1+Z#{ABYMQ1`!vpWQ7Y_f%2HK>JQ`P9>A3-|JluqkOC6S52+k<_X)mkFsf)?+rN+h z9c=RwGHBoXe~2b*o6$i>$9mx@es;%0=r{PV%3WWfmeU zVgf-{IW8>tJq7vV6er;!uY4*zqykBEiYih#0+Cgs!V^@A(%e~k z9k`$@f7!yu$~v?Ll^{welvmb6LKiuL${7Q=tZa=Zd4 zg<@z_lw_|cxY7bz#v&C5Mahc99&IxljN$QWL=5M_Y?6p3U0Ek%cyw>0=n=q2v9yJd z97NIpzCiM;mq!u_q-}Phkxz=zi;R&KQxXY+e^Km<1i>l}p-@RoEqcIU-oPo=;a6{( zF`V)+pmdLKM50k3<=Kf{U^*YH#~84`F9O8~zFhi)=>ps!l!No4NCg!F7u!d#f-gRX zf}v3%Mip}LR!l0IqHl8WH;X^O45!0U2?D{3Rwxe&np2jzU|1X!+A>DNuW0M3v_M-Q ze@hFapgo+Nzzm%cjmcyM4bl-P^de3HghJ&fe<$R~ zI>AxVur@Hr^zP>7L&yCZGN_XiRlP>UTgDtI?Or2BEJSbLN;sJAw0Y0YPeY~mF zrpBArIE=<=i^gGq#&MvJH{g8;4SuaZG=0o+D>P_|2xh*du&lsB6;52junh4s8 zEt1iI4M=@K8_(c7Emk{I)z7o{GX<;vu)MoiqVZ%l)oA=eOtayVuyYXpf6tx3TP7O! zooL=Xc0#k57C6@uwj-z`Tt{$6_(Qr5(V-212eXIEtbjG0V0`vjo0z`kI{16TcN@ZN z8y(X|+56FfDYOS5U}tnd0CDtM@GmoKpw$oe3Ke~-)02}jLUme3ugT0sOzPr%l*=_ane_}Mhe)-GkS@p|lpTa(o?~zd#h^FPu=wc~Jb%5b4YuSWxup5>FRPqpqWamgDV+|Cm zc{@gQ*NgdLvaG9BJ-(jKZe~|so8PVk08|6ailiM%mUY@=f30LsTJ~7**_*t(_+Mvt zt2=#BSNYogHlF?Ki}~%(!=sW?M&by{Q_?}44rxu`q1L^C9jj^m`S`!4JhsQ?cr?DA z)Sv3*aWLk~@ka!5y*QrNi;uI#?Pxl#j~mv@(Q1S!ua^VtZxJ^VFE(b_Uy)-i8+I0G z)tj{Qv@3#Lf830gdbYUQUn-6Oe6lmuNY$-Ydr9>qdcCKP-_9ly;mhHHVgW>~?7K1o z29k>cCeZ&w;*wwk_k=Q!x!ZJ12ysb7{eaIJfO!amWK-QG+LEgGPR?n|_CzxKC+E-= zgP}{ju}i$MOT4k;iCw`MyMi%xxjl9%J$5NQ4olZIe_)+Kvhm3xoKh)>P)I6|31H$L z$>#It&w4o--O9AA#N06Luy7Fo6AK?>vEfLEGwR=9RVnOk9AMGx zbveTcP6HxktECbt$j$rj7L^XUR?Y%N-ADycIux;vNcQ@67E7l1q^|4Z>v=sMC>mJ- zwHdg_=!_DEt<@%%BR6>YFfoXFB$<>`v?(P!e?V4-JEda4q9Yl?1*7Evkg(`P_nqw+ z#eVpLrAChM7=Ny*Me%u5DTG!V(~f_k~zeB$HAmX16E{!C@Oc2f3V)k{t~8?@e#-x>z#?iQ=16sv1C|X{)GXe zI!SC0RdAmq4~p7*xrmeZOdii?VMFl%&>wjt%MlJBmy;b6Mg}C>D+}LFR=U2ttN#6a zJ)hQ#t%dNfqt*5CqQ0p|%UaJbKMuh>8OT+pIctGq0)YfZm;lB6p{<>>O#@_we^7FX ztikI=ZDkM(?dqpxP43ckIm=8O8%WOlc#0KfAA@r9LyNBiN64xP;} z=MDHS)B^#_;-B3v`yd6BQs#a(3QN*FDP{E7F5iuHCK9`C;NNgZ_1T1j`Td(z0 zdTrXbBM`E=YCP1A&~TP#f6mg+`j=qKNNaXox5~Os%@^@m@!S1dYw!DS>uuy~hj+e}s807kkSyXR#XMiOVG)+dc(}i^W*`lB8mp zBS~x}>jFk#ojWeMZ3a1k)zO;di#K99GO`Tki_oJ3uz!MD6ax zAzn$5JV}-gY5U`=ukUecafwf{YgT5LQ3nqc0Wp&iq7(u)F_UqqDStDu&@(qxFiR0+0epB`s|34%VXdnh4Oh(uSwjAsXu!F!(gE$iGT#&=LTs^r0xd4%bq*<3y2M-jN zFF_0yx5tJHFHDyMcMKM{4AToJPM6-d3>CLYAq?jqm#Nqc6}Lq}48Ap&Df$c+w;6W~ z#6XvQUJVtu^0y4OAeU;q4Hmb)*bHnTm!ISf6t_P53_xU;q67{Uw~}5B*j<-j54i&evP*FepIT4Fcfh2k;7t@(PLa z@BsLDctrjp!dyfFvX<^(8-N-&Kp6%FxneTOz?{8Yz;^a$(0-CVkdvW z#tHBM!|eguAXku!JIDs`D`kMXr4#7S)VML30J`>I*FOY0Fk85Xr3(mv03cv%5Y!c+ z;s&(=xd0H}0Xj;m01aml^bfM?9|TUopO*vR<>vj{+@IRN41uA)l`XBUVNTALP%kjl z4qyw0fB+ius@!l-I48goYV(U|32}dgA@nWXEx`~=D+J+p=#~I^DJ_5{BEvuPbG3E> zJHuVMUBQrFIRbx~L0q#O)J6v8y+HYdF9PWCw;~{?9rB z2HE~`M%3R0>Zh=OT#|{~M9K8wB!O&iV)8|Bzcc zfgxUhG7z2X21iVR8VoTD(Em~mK!1#`8psCh=Ja2w65J9o4N_1$L`Q#f@jl_^dGZGi zc9jQvf^0OwaBKTNy5W_p44JhfVvD#UTJyIEgqWd! z`;~)Q!)$&H8=rt6z|zIV(hCz&Ys5(a;KPfUN*j>p?`8%7xuGyPLIr@x(GOq?bHV&o zSYAY&Kuf5dm5ZgdBM5)74Q=7S2!F~1{we#TpnnPZ`4KV~7nsMtVO~TB0<92ySBRyn z{Xa|z{(@cp0U&tRATT0JyZ<=l{af%K(|ia4*u@$GvVr}R{}<}y27!Z}5%=V>q0&1$CTEAQ~GOh26MNTGR&qw?r*!Tnpoe#w^JOv$tVFJ^X(=Z?=o?I$d{+L=FH>fYJ** zx>QQ|OR3z>1LPP(I>t5lkf8})9D$2*x|^<&-uNAI3^?vmx;>Ws+H1o&E@NnU`D1o} zUmE{up-OL!;OlTgaw2bKy4>NU0dnHRY~^NGBxY%W3z>?P1bXrkr*P&K6bqr1o9V*- zw!{H`w?=>s01oUFK}@x$)Bh+IhJTHQPEB#EhPa%umqA>+|Cl z=;F`ms_r1At3NUn4U-C-#={|WJgT66^SN4ZBwswZMLb0~kjH;<;`o8A*4KEvx{b$L zJ=cGzW(ig<$3Q*|GnKqfBYTT7brxm#lLTwBc0HvC!;Fp7c+>0CU1}f0I1h zmp5_Wcg`EX5BMl`o`a z0R*@#^I;oa=+csftLL^l_lN25pGsd(; zM7r zSgjQ;((uV@*;#lCexYIf%t+yLO}S&$JH8EbzShUDTPt9SDL$CIq@GjcM1%V*UF~k< zzHKna^6_nR2gAOAj+z{J zKikK5bfZr4I+&zl6A z=)s_`IzxJzO7*rrDq|I+t`vV^SVyCVHSGn5z_0G_VtN4FMlD2md;n|t( zo=?Pt8NRIj()rWPLZ6I`b?KDh{aL>s-Te!>u6(vEGG|^Z>$THZoGqt7>POgJe z2)$qlA>V$W5_$W?QA3>c@MqPtSv^2f`4WV4SraA~vqHMs70Ogi1I4}q50XUJ>S zM++16Ya~G(I`jo%@w+LvZe~b2QJ7K!rx}9M;`ob&?$E^y-3^S_8S!=F?et-jmlcGj zK(tY=06(9|$^OA-dDE#JF;tmgoCkLm)|O+=(80xxhUqUeK9zsi>J`CA-|U%OuPgVC za{)-Lb8G6wB*B|o)%u?|#|A>WEGsfi&vzwfII)lqPp#kukmPiGJi)|!jY#(%^D;E; zy^(s61Ra1Gism7mmh?eE1(>Wxx&yZSfX=V?S7vApo(NE#KByqv`- zWC!Oq0Lc#IhrEB;6Qal3p{CW#SytW(GLrO6!M>p75)ZoFy3|p@m%}C6n!AkK&8?#M z9iP|+JL2RR=66eMSgL!sx+u9?o3K9eApt4-08A%weh~{@l(F+mq*zYFVKqj#6dwvz zafHXa&lg@=51%!T!-y7;tE0126-z$7Q&~DcYszIy|BiqDB9~)s(b~`}rEj#YBrod$ zCZW07NbH>j*Ry(b9s+%|J4%-G?D4vZiwd|-`Cu`wjpTCObK-}DtRaRWVIM9X)eRaA zyAS2(pYBTg)u-+`)-U#=uWBE%ex4aO0&+fDY-#Gjeit}hbypn6Qj{Ed>0VPST|6mUI`huF|06rgv za;pf+3}4WcY1ngDKiZ*J5cI<;{fd2ro|kLd$Xg&qn$R8lioEE88@V@dslI8!drGy}DAcz# zO7;Ow{}V3U>op#^L+7Sw3L~8#EoV{#YZ28Lk@X+f$md(6Hea>A?|?%(>&6uC3XG9- zgFIcw)C#G?G^5xX@Pvruy9fxPyw7%o`}=&mN+fLV9lUfiUk3Fy>N^c=r>&8{C>ybp86r2Eh7~EpvxvrE+~KOy#2I;<>`cB$0{0#>nktt3MV#CC@7X) zPJkiJCgP+R7MJQ{DpM)J_!C9`k+&V)L?n9=>>biHszdZAF7=zB!_kt_*RWIJ_&ya6 zExYBH&e`m|W`sDw+_TY{I+%ec`-#{4?kSVi|0dU5%sHd;zqx2k+l)blppT33r%-G~LfC64zdjfJ z-nk<&(4HyEKDwexZHqkmlDJnSiPzNqKtJ@rc2X~T|Al6d-{tL;ulRjzCgS%@kAQ}+W-r>VYo^Fa z8BLtu=2kL0CN+nhvs55wE$4f2Uxz9_0eqRkV40z zt;0Npsc`M=wRh3T-1Jl)AS{1-3i2)-&A@!n=B$(R>5*~-tl?R0-Fj-!z4`IJ)Kma} z*}4|-UY9hD{<%Nnv4~vZJCXzkam*M~NkG+Zj*kawjXACW|7D5%k==Ax{gWK&jNQ$w zuTtez1Zy2H-i{v+`^PG5hX;Q2;7DpkHq zahY-A@_ToSFIer3bvG|b&$|LVFBKT?^C&}0_Q$#X3R=e=kGyIwCtVuvlpoD_WnEjB znHVfi_WHdo9q9vF_Ti37ZZzPI2ik`yZQ*yU&lVP9GQF{_TRNWgsxvD&rR6RcNj#_f z=#&CF8G1GbA;B@Yr=Ne)mr>lk$`StLNIH{<`qb+xTip%Y@)i1iNqI*fcWM7OWVm`m z$%jY?-&?#EM=2%K2sTo+E8Ku4ox<&V!_)<6BSr8_G_;KP8Rl|!vpDL3M3!6YXGpl~ zWVg)CgT7B!$NGxXE<0%^DGqB1?)MieIbK=gybf%7THx=+;`D#j^=XFQUXX}0op~p6 znO6Jf@0%>8>RAd6-_}smC2)}Y%165$OdANGXZ+74lncBi7i13u#nrFE9&}hiv8iAB zydbqQWR;*_5N6+v=^Pw&EcfESf~`kiAuRy{&!QAJda&bVJ=R;VOp61tIw%u}4{Y*% z~#3-hCk;b&6yUWRg<5rwVe_5&}yxm80dWVpz$o9N;mmMr~IVwL-U_AQus+-&;vrP zPw4lBPAYLe%-&*8XS#CHf}Bn_jKM-9<0K6S*+nNT>?D78FP;bLK7gLWpHj}mI-UYC zBrEuw$k}p-$8FDBYYtP^)(fw^7+5!IESNs~R8r!V(Y0&QWCMAaT~|F@&uw?4t2nA> zTw=b-t$s6xPky%3P@#IMRmAv%@vS%!#h2i@Y{`9_XZ+S|c&7Z76sb7-GgLE3OzdiY zid4N68GC;vxneRlMQiD(gD%b;XZ#4lv4n_+GJkyX<8SWWF6W@CLQ_KSXZ=BApVOPSRzes!cKRU_AW4_!?+ zpF|SZ_IKm8SDLvo99%iCD+=^t((2^D>s@Kmx2b=Og@xs>3oXrHJR2*q`AT*FWwg1Gte&`fp)QQQJ|nQ zuW5f@@2}oq-11Oq$b3ICPzK{zm&AKz%J$LDqo>oUuVQb59#}jN%?MOPZ@+ci&PAMc3=O24}vR zt?2jK*&6zgjINs(Dnu`3$GKV?~=a&uldH*Fug zpaxCNeQTA~ffQaAvat%lJ{d2Bo*ZVGj+yppA&(f4g=x$uQbao8aK{$Ky*_@VZQMyZ zkq%RT>cFs#@slNZ=R-U1Yr=V)ZZSVv+~Y74wSXM!Sys_`P<)-_MOgR-p;3Rv6B?CB zyNHJseY?dy6+5_u&tkK6t6u?TSS&B-nfg_HEwohpz7&4kICYZ^&rXiQ@jGJ5g^yaA&E68P#Vb$5jlU}swpu6wL5>LB)=mn*#mzypMa*Lr!i*T zkK@26<78a&rAk9cBFNF;hhu+9VMPb>@bem$khe$Fr6k$7#63^-%HGbYFAA%|Y#bI{ z=WzJ(A|$Xf7$_-DQYYao&r@uOML6Vy>WVugMBOiyE-T62IA?suU~qq`w($WC-dFog6w~NZtK+UmcYAI7Rp$GAPbaTN zQ~Nm{;(div^;Fgxk7s|^MUpEQ{H)M;R?MW9s1&@ihYc@noOeeH37;{cXa!nrO!l6t z>B|!j@d(_HaX2b%@fnCn*rxhbGz0J^u0AxK^TQ*Ws_x$vI8=t0_WIJ7HEf?BCCp;x z4GbC+Ppd}T=OM=#5)jw3&BFwQ9En$dCNnSvperVsAaPcEj`@F{yVkgR9+oKPK9yI& z-`I?pM;$%1FMHf-Bsf79hUCP#GHI{FWne@QkApI%Ovch&dpRUtzPaR~zLisN38@r~ zV!YB2Sk>GN_2@O9h?3)prc+trkD3^!H`|)LwtMkYgs09{uAf!RnO^+okgfF`cb21q z>*0*d@IlZ<^doyrZuf+37D=cII>meq14K~kAil{*;}phsSql181D!8AH?#?U+>YF z;Y#tlS3eq9*T{08s-bG)d*F_R>HT9%w`JwWFwep=krl&5)&t`#Z?EyB8ODbo-s(li z8G$q#ZK;2+7OZ_?&wLWZQN0W#x{f0^C4MB>EpVZ^0 zUeZ=V6%aaR&-i!8sLv`QK7C8U;Ib)rxY*&gxo?8hGm5-TpB`|@;&wFTOH3!R$bZAr z@RGE*y~u3l%_}lIePeVc;j(pX+jb_lZQHh;iQm|^ZQIVowl%TsWb);l@80{TR&{k% zSO4hs^m@8??cJIIN1taN^SYuPvrg#av2nx)4`|ON{Ef(HN!s$xIKx+bMS-%qdE{5Oc_EMCsH-W!gpP5&{cLB`w`{bdlSi~!=aF07} zlQ6wJ2w~klU}ghUgBEr><=zoAs9TNM?qc7irkHh4 z34l|eb~ym)kn2$o2xW}AdwzR7;Z_}F^(&(tTCH1dDFUWYM;y{g1QvfzRrUqf$3s(tPzKC?y{XBKQ?f7QGX*8Ry zij2lJgxj7%Mh3en9_QIYj&XV*P+S>d_=YqXsa#n08+R9u2}8KWWXXd}iZgbMu_1}| z99QGJO%lCS6Xh?7^)7YvAiIO+?O%m7Di{PaD+isy6?d*OQO7Tun2~46EgJJR41lzv zA=Ftv<&Wa$1fS=RinSwCu&|!@#QH`CR@LQ>%=EGpp1G|KL-1713HAjl`l4~f82MID z3sQkaGrO2^NrRMsYcJ_@x#C)r_#&AhgJh5;e#zlhqV*OJbl>(d%($JZ_4wn%RS}}C zZl;myV#$BYUW_a6(^y4u!E08A#Q?P9&@wVC)~#=b6avl6cx9A5{6E4EGv!T}mQMq( zX(KFX8+vP2PnGN2@vAhD6D}{5choXwK2}RQ(l3yA*_+)(^Cr8C;f3T>P#mWT5Tfxs zCs-KRyMDPqu_;yefXNRJ$*Xk%BsC^Z(lR-}H%+BE!h`;OYC;}?HWls91Hdqpn}OlU zST|VEQt@cnqYIyN&#`88Mv9W1gs>O=61A z65t%-rNi<$deZk|TJ&6NCqP}R?}-VYnVqn=XVZ=X-EBxHk`^wHMl1w%Wtvjz8SHbz!Jk~8}DIvcWxHA?KCJJLgtER2? z3`FFtZ~?CQmSkP39XNYlzl+vX3|uqXn6E}rGoe?+1fv#%y(o3w=K&@@m!a;xZna0r zXLm4DrjfcU#@JJbUDMKi8+zf)G^U!Gh4v%iTosWK5Awb&IAO_{duzkA^{i7Brj4;W zPNu$#*qR4fVqoOZj#edz+9*An{uVEN%Fo4W%dDcC=)KPa z){Rm=;N4kV+($OI=<0s2jB>xqVY39Aw61$xFq?YD<-n6PTrGt7eHO@v}}Hk{oo}6pSYZccmwkME1AHr@OZ5WF8jl(3{dlfyXycmpyDqNUts9qg@*VJP@+A%lIp8t`6CR(jcJJfB~T%(lC{;ZnTg zaL8w}sk^L0$f8e=%RZ$nLLoEz1GwqBzIbit_>;qgd6{loUFNW6w26{Pv(*rN>>uOx zS5ROafvM2*p0H?7adSHkS+1&leML!Qf_F6iSU9(Vf_T; zhSUhy5}91xnKep?-duh8U<13LIO+{Unk^UyHjFr3sbgG#bw?mLiC(bR*$Q0PatzPBlcU(I_?eyA)b$D+g#~{qaAGyIG9~WkDzO-D@ zpHcb1`^)g$2dm)rktKnl(O`ht`t#s&FRWu!A=d6ya4W(hnAJVV=cx*2C?mauzwJZDR%5 z+1=?>t;RK?TzK|icDKeL!~PrIPf=! z_W^bnSo5ajU%bFixs`9B$>7qAMWl9UM(njWI_`#RQJDWCce9whVUcZ`z+f(Gza~u= zqEXWQ@hRpD3x>zaUA9GU}3Wzv8Q7^*u;k5RyVM;sV$S_*SKuEQt(wYuAhOC_$ z!7BD)NwgimH^F#T_LK}oya>>qj{_2eX5wUKYX-Gr$EE^K@+<*`69M*%2P$j|+-xC# zg~+iB=uDSzZ>zg=%hYrKEAk#!!5xVCdqMBy6k0ZZy@xT<&oPqQdH_VFxkqUj@%WL`L29q^T_}gDiD() z4_MXTuo%ZD4YpO(*nn&{#&?FoiJq*fGQO&vs>dj+Hs}s?H1rEw); z^Rwk_-?tvL&IGwvNQTXJ zr18V!gflWO;{Z2AvSyzEv-qmYU7ESTa z%GFoq?ZV(77oeiw8rKfF%3aDTSQz}d(kfg$MK^m}kqq1jQBSJ3FV3E(_l$T#d6Jn#I#w7S&@uM_i<`Ra!-Ih!wC+%lTg(295W@vuCh z&42{TXiMSYrjI6{%R=v*P*YEN)_Z-;{j@JmYTl|bx&9FYmg zGh-?*Dr{6>juQ@wr>?Jb=}c$pTBi)`Mx(;V(iD$8!-&c%%s5&ZYHs!bIlPPTVZ#NixI$z0fXaJh7*70YPQ`EiX54@ z=mxW9?n=PsL)^A$TT&wv*#=MlM0oIA4N&Y#gNwy?_}Y<)e6Uh&C*;HrU7<(qXmd3~ zdTFf9#n1~Krp7XMa7k^iXLMNo+Z!}B(+VHTueCH)pT@#3Bmsy$+?AK3xd6;URBd5@ z4*tp8pu<`wI*BjS$k27S`c!`Ji5fUbwbXAzcGQ<&bQ%QveG?FyaPbXkoqpvHlNP9j zNR>84f{4@>35iILo0eaQh~73$f=G&+=C}Rhg7YKBDp|>>` zB2IFry`&?dwIyvM(rW!E3Ns18p|&lsBRTW^2cr7lBP~~?95P_eG{*nHCgC!WsBnSV zl8Bip5SbX++5Q)kNc2N&hCGBo1Gv)Da=?{J^jodlJD`WCnfL(00ex-VOtXEn=J*tp zX`aT9e2iam_4fN3!AuY{M;DVSUIP8q%B09mL(4+KLc&~IeY{q@B?xb;Y!rX1fTxKM zJePC_bWda<;;#-`69`%ixgjyNV4mMJ4VvRaG-g!#3|f@LPecV5Eyv4&0El)0RwSXa z63mdK?q&;~Am95TKtzjUG2avZlNgQff!{F;@52oDCgeDP1n&j6Zc;#j@FSZMAQhzf zeow@;6Q>qb{p-D&;IOeS{rQrC#1T!%LgA64pxc!j=Sm`SLtrAMbhVY6*HP8IhJgQ7uW6O~*r2GlSP{1ld zUz07hpUIH_hLAG`>dgqwMBL(t8832KTrwt1rIb!z6#vpspqK-wqX%HH5^EN9J43Q! z7y>aX(}NUIel;+mrlXjY0c%@@0T&Bt^H3N;u>yObvrd_NVOqh9dn-e30G(mgYz5$q zh>uMp;S@E2xK{_Ppw?622nJPEqboSl4>RJFi2!8fx8pfO^X($exyRVeZ{#R&G9I~ zuQ`V|7lK!Vv46c^_e^Ux4d+=8kG$%_4+eLgSmx);ugEsja%VK z0qDr3)?&chD=aWxN4H#rm2MH;0qiw8d?}Tkv3_F4sE82{ORK9D!?*5pv4=2){9B-K zy}ix&UlYrH;j}IC??YH~>Jn|&EIxd_O1FG#n_gpjRkYg0HIY|j30btYFgTJ`J7@*p z?0?qZyUp=F_loZ6odNwqw0P`!^AJ&_g)CO+A@~3vDAcK_fQ3@BFWW6uLsAon4D(|l zvLaBn6k?bODIrAtc={m25i7*V(nQ1%r`T9mUh&2rILO#5EP%gfI9Bj#tg$R8i%tvF zm!;y{C^QN@iavHW)CQ`RxBKbOG!yd3iV1Z(J}j-bo%}CWk<89K`g{x~u0L zULHXIo|OAa=)u?{^!Gget^di;k}yp0`vLxHg*iQA`z#f;iCV$ zK^#WY!`rwe)9c%bkPB;G4qjX;YdKfvwul(e(5B;DH(?%qA03&BV$dq&bkN!Or7Q0j_g->97b6ZBMj~&1+}yuoNt5pC*YCq` z)327XjUGbQmr;Y>=;I>l*N-fg={X_9%%L+|Pwsb+6*duT{s83kxR*b8v~WYTyqy5_ zIudWVJ6sSI=LTTCGP9e%le40zUs45V#;P~v4GD%(?# zyVXDmwKuF2gz1jKbPhnhm-{KeDb;vwml*9CQ6+`eRa|hv5V66SMWM~ba7!4+`fLA0 z&&4ongDK!qP;lR~#(+}i=YuaajFJH0T9Ol(nRKe-%)GtSsMJ`doyyzRTR+>T$gHNN zJwGF#a*M(yAAoOIAQLrzD;p}CdS{S8rXyFw%-3f`?TP)_!OL(3%Vms`%qD_LcOJrz zC8cdGAs+Oja3=UeZ(J(mdebH?hUvh5z^IZ+K5Gh}h# z4bub`rQ#CCV)!TDbZ1U2#BBUWz_8FstlV!hAi`nT@6?sp@~IVS5eKMj)JY+e*~YmGS=Z|z8S^1Sc7Uci=i_@E?P^`|H_#sLlwyyy&ZEv zKtL)_jx~hLIHYb1GY_X0DW2RkV+Niu%Rd1__f1oNDOwz$xs36)R6h>D)4zv1yOHFr zbt4krDVnMok+GqBwjnL_xwty7aY;aR{E>`IOYK$;-0{4}mmDjR6pjyxWAZyvI~Rbl zAOcJkAS2Uv_@c(=nA&W^7so)KRee32vj+-sdfRRG9`OKIT93MiP*!` zKmY7A9eNHNftjRYIdQYD&P})1He3~~?PzV*Y*I;v@#cx;iM0-@EhDbRm^CL0s3e$; zW$2nmdFaHbTJf8`!mwy54mak>XDYZHV>ol>okDBdWy$UoiTuPhw`}na#Ji6`3uBOs za;&R<*-cZHp*z3?9G|!nqZb|R95gaz-b(@uIK|_Z2Xyo@lMn=}PPy3Zu0txHiw`Mq6N(XNGG5RS~#;obxB(vJx3R6y5a=rfv}#j>V3V@wDI_390`vC?+|PAUm3fvADCjsZ%p? zY`SJn(1BBiCzdR*&TL02`svbE`S0NNY`zv#>esY~BJJMOD@i^Pff9-0!3TAdqn=mS z6D<9>zrP0o!~rs}bifewpLH%#+yaT+Qq}SO9Cf46xt(+!>3@a!+ZIT%wa7N3q3AHY z3uQ{t8|g}%4aBwi`*u8g_il&Vz`4K20;K&Y)3HSYP;Ikj@zfYogwu3t8n0c)N~EWw z<=Tg6#C6ZN(QUbqYe&({WdQz(7|&$xl)R+`3?|tC^P-}4=m?;ywnpNBj*x_>3< zbv7POsp=Gqm(eiZrURIAtHJR3`3NJo574G)rdl=#C18~b@Iu4_k~(3JP-!AAgYJ+a z@Z)}m68AA^((3`xu!?H?9&2ch(n{<%d{9ysu^#BBXhOdd{4_26GE(Y# zT+~s(2tq>AHJOIJRKuW?kyeBCL@plJ(iEHF?188sh93<%zxt~S&syXyqr zLTv}hiyPEmP|C;hNhWdnb?yCS7TK8FKMZVx4(O_4rt53RT{xPnOvG?Kr2LjA-ji4j~#KG8dC!@cJHq=)gCzCTsTB&DGGazoiQGfAQ)h zcN+g1r!hDjajUCvA0<7s2Y`$1Q!(Nl!Xkvq$ehU>Ca<+Qr+x%??-V2> zSK@}jx6|>|IQ%-VgNu}1?Yj5^{_gDGU0s?wNoAmMk(ghhX)UO1q4^rG)P}?av{Yg| zJL-|uRN5reXev?F3Wz!tm%F1m)x3;z73fC@z8`YJx-%h8-39`l=A*R|Uanfkyo!9w zje$vN7s~gfy|y+JDzpwHpD=~0=9vc@joSVuh!QPt7D_E+64U1Nml1W+NrKI6!aP)8 zpm}oaE7v;3e*1?A0LN@M9<*WrUS))|ayeipbU`N8T_*-E7G&$vyXmpM!=lF3oXTj( zG3B*JBbFo6YU!Q_6{Os4J(G`QNFxzFOO1L+GSY6kwSAbI_KrDGyBXS43ArO27mBaUc>hZ5XAKP>HG~m%m>Eq{*XF2 zN;-06=I>zn;>L!D`nq#=eMVqw4LTOd5IvUR#~Hw+{$Ad)x@La?WI|349VwI22j2*#9eglVGu$$+Tj@SCE+g;qUwCdE?KHD@~eDD-m=NzxQP&oR!b=Y_h~C z0?a=Szs8v}Vbk{l*e1>2?D%omCU-5SJs;|hUykFBB_3{$cZ=RG`$FsxN1L^xtnJ_O z54fFQj|Lu22y-LwrZBiP$AI%NH+*=U72jaEwipsUrW!puiDTNx;$EifG{#I>`M@tE zS>xrA=MLRXA7_vAPMVG+-$e~AOtePeMNfVsZ*Nk*?0nq=GDTkuFOZpIMZ<2sTOPvK zrnTMWmkU)=_5zi4z)pM{xN9>>g0_Yc*kv@n0>Ln7x`)XIpn1`pqD;( ztTtTo)+XGM8htQlOdt3Aq$%Ek_6;ohcyRM$%L|$~$wxNf&6buO48M%uN+{4cVOH>Z zzCE5D@Q|edP83?DhBJ-Vl4UgTsJzz$-l3mm$xx@&$M;zI4qbv#mvRZSv-b}_II{C* zi;m(Ekz*0@6OJ!@Sjo2S6-F!@_J$fXsaa_q<77NB>3iN^lWOSxtm+8`E+sWy{ z`%+|nx89x&xy$Fcdpy~hNvMC)lp0UBovZDmJK2AWTIxsX_|6Pa%8ZpmYOEO!|g z_=(Ovcx72RR;qcWI5c*oj3d0Eq}1tM6%n(0bqswe>R#U-`fyo?S`_a^?LRhS(>t-R zn0K21LY(x)%MQj(*IX9Mn#f}(+HdM4zIh4dBUjDae7kZ#J`R26J8u?eQ3;m$$NB{Z zn!0j)#^_ibVGSN1@Cy7~zEf7PVWFW_@qp#~0gvYgM(j z!`lqMn}*f#-M6$%ILy;H*wiTd)_94&yU2Dfz-Z#p{6J3E5GfKSFR#~b4ygpXdtUB_ z_%1yrL*;CJBbeHpWBz-9Pbk%FYq0C-`>3heGfeZY+MId8w`$SS zmzr_f4$Szjw7(v%$x5yszW-g+HC~^z-}msmUBvU^k)&g5bX!9QrwiBDz+cj?mbdfR z+L)vUczylq`B11&F=$iwyx*gwzqiyi7VX=C#eVx@CQ%J*)qLK6w83wzAski&Af7y| z-+=g)+AAH*4sn6I9E@YRS}F&~WOL-^$%>;*p`Tv*G~xmBKB?kt?={@AE5jE{cTk>U z$_z#p@9rUim)fv$>ca$msBS2m>Zo3b{{7lZrowP!cbFMbDQqg_EAhv`GW~L5jy(JaY~U5JD?zRc zS;v5Yv6>*0QfyacGm`Ubzvuw7E>4NS`@!7CH#*(qZrYB_T{V@_a(f@1K%<*!WUHCm zU9G!^#!Xc$Ht7zF;PO)zuy^F)%zeJf&rN{h=h|EugeKNq&AUKbCO3wvrwMzuEnh3M z!dFpCv+849dSa1h#d1)$s6!obsRP87m%BhCZ~ib}qU5+$Gx&VFK1qovx;*ua!`z#o{mF*+lg4yn|73!&IStUqn}4e{WdeaAzCD=*f1mX{ ztA5y1rSMJAc%xrxtB9zfxvTvYy_@6neQjg{jN4f@{oK?y`tJk%?H@?sh8eJTxj~(`mVc#1b*n&U3+|c;=XTE$vMUxsPe1U z;#fYYLtD1Q zfpvN=kASe(81w+~R;%3x?tNRnx;5utTDixHUIP4cPb9mboZdo4%MKQY_c-i^XZ9@q z$N?X+g9ub!z!LRZ<_BSADtsis+!v7eA@%?%4N`y@ZzjRWeXiDgB+)=%_r2x78tMoZ zS_9d|`G7YvR46{jYxkmm0Oyy?*>je7pelFdk5}3nc``q5!moyPPpqKBhYpMLRu16w6k@kFMd}aZ##7yQ ziY?~q?%L00r6${ruHhzFcO2>=XF9|=;wmF41|QSnzV?l_|6cw7>=m48PCB4eXB_$lP8&URc!f26sT*f~T|Rh&d*P)h%#lB3((qe-h(;;JWN$Zt9S zkka7VR;cZ+t14@F{#|(oay^|vkUL)M(I&A+*y#f3EKp0io6_`jsQHE+pR1pUif0E0 zqp+RZbD_DZzl?v~eIH7-AMe{dv$=e?Yod(XOS$cui7GE~iTc*O3n-5mEN2&mciByI zMS4jN=~2&I)N)CX1JWB^mO4uYxXwM+z9b7TZOlH4xc}|Ra}U1;y|UxRX*waed>5GNsjVQ%i)^^R}!>hyL2|l{Frfya|*%HVpO9WRAvOOJgk?rKsXK@L1F6 zwc=-5A5S-`N))ps)XuZ}H$B4|17IDM;wl{z7hZu9QAkcQSog z+q%c6i#z$Wz&GkR;^{n3(&4hA2VD3X!q9i9cJ5Jx5N-LnY_l|mdYp=R_9~^n zIIcTy^cFj45+-5a5`Dt!yttJ!M9P7m>-9y}v`@`b0#6sg=X^1w@;s)q!~66f19%$4 z%|M7!Iha<7>yC&$`P^40;|Y`4p@BDLcvF`ccPU+3!Y6SC&+-hJhbmzE9W*AhWHS(| zrZVfvyE;~LR~ds@?Z5z?(HE$DcJ^_T$N%*N`1X^}`}g@Ekk`lW`+jH8_w}CmI1T`K zy4%opXaBo@JbTIezGM4}sS0{^006YIiK7WZX_3Ucu+O`EyM&Llw++E+F{{x$l%U1Gpwwn*Q$WOp%n}6c_H6eqT>~bZO~;)Nr=e)k;3zZ` zoI_wdSq|;+-Z_deur!rAgntqN>qC~BLUK6P3%i4~s(g*CGfj*nGohIP+wyVus&R*6 zYpTPMeJ@&Uh;BjfRz!888dVs>7+1ET$N^Z9?3g-5HnOszCxUGJ;q`<~dFO!2qCy_# zb)^lxYg%MAhAS9!n$Duap0*GpsJej9)If)lb0zbh-EuOCPBIB<>E0tdEX>0DTo^-Q zEFAFx=>h4lwShmhYT(g;LAMr0IMoEHycK#SHq#17N;51`#`-~xa-V1@Ea=q=G^_#w zwdyVD6P=29dgeWBtip))01Iw|{J$OwzJugg3CgiW(wrM*xb7h^W+UhxY{poNnpm0* zaaQEC=#^2pgEpFHnh~BO7Armh6IFbM@q$7<&?X^wa4)o~b3%Us`AJMMVZbw)MyKdB zP$Uq%pp-O`FbnB_ELoz}9a_M+0X^20Pl3>t-%Oz<7R ztLU^aG-wtrGOC;aU8l2zND+`Uf`JkVR)YfNKnlO4l= zwsA%5$AhPZIr|NJ{RtsWbCPz7F?AkpuWcu;(v6fsZ`<+dL)yKmd6^`u)w9)T$3a8yndk9 z2Bs<@X$%9TbeWn~LtPRT`cfP{^JLJ=XvJN9V%K{i^N1HwM(&AiJ|eq;_m6vgMG#2; zTAk`$eO{nI3lND^;vjT{+ON$}@)OEXka=vz?F0*aJ>O5B7>usu@dMu86AR7$?Vr>! zw8brN&PpQgzWDjQ9eIB8?WFF)^R)JcE}864J^%prd0nHke1Wo1Z%o25cwcvKeMv4n z{Tl|rRk=XN=(lr2+LVI&KsQhybdQ}S&0+kG2EKyP9Bi%M#Eh_kc^pE$MSLy|5uWIW zDKv!)Vf(34@ri__V>Dw|e|AA9$ih#d4Yhy~`I4oO_EG!Uy7q4g92289O$1la>+yi^ zi$MT+<^A0t1Q=)vg|`t@&5?s)g>z&uIpM-pR6bNNa)opM2@3xwD9w*dURO9*K;?-- z{xdP4p>(R4%o~wN7&YjNPEHsx_@#z+?FG^vnfQiOFYkX7;Vj}G<{hko-ky_f+DQQ) zW|M9DJMMriYUrtPOOh{I_KPsbs((n?Y`uMIj0JhBAmpjqIR){+<=))(_1isQ%oA6Xuo` zhOzUN$3OUk2ndmHiW_(W0SU@}->6gste137FP2aEH9qc|Iyk~mq?}S{9B1iT6ArV$ zQJ>y!_YU`%nQ77Fc*Vk8v=wry&i_g@PhCTh3&i&4D$sk%UydG#oa1I+O!@0D9_6`m z=j#z(6tqP6Ao7K45mcR##=n*RAx=yYPybiJ1eA-B@dr;q3D3;&e`pFO&LqVk8bFBV z_5@i6e9ui;IVKeCq(GvPmL^CC3~_LGzy8#)u%sa~wC5+@@07_@ftCwnuPp-|32ts@ z{NG`U=Ry)tv#f%fVtpM2AC_UjV+=W-zpwE0saW1YC?3{}VNv=!bV+0- z6cR~fV#y$McG?1U6w&fl(ZF!+=8|eiRLSlnm+&R^eM1B~iG#_OBOs$#tpw04E~`z* z397myAPf2%TcYWbR?T|z1Ps`X>ISnRjM@$}&^yT+D8{(QSfGdS?lIuw1VG8MEOgAw z4LUwk!AVOh>2Z9$;VQDIb&rZNs>gpfck3W(CdanZq=(D>27 znuN8$2Xsj(;J{#wMA5)tLos0og^>^fLk0we>i=XLzyy*TZT!Tg|A1t%j0g+WqnWBB z{aTm-fx-|&MFW$;H3T0}X1a=G74FEv{)(Aps zQCCq8XCZn(e=pnZ1AKpss@~-RY#gvrpZq>X0bh`Y0I2TL8Sau9nLEDK6z;CayJl=C zqqz9WGjR+|M--}Y(0ufK0`FvbiRJh3M4|+@Oco3pG0#0 z@Im$D(?}FbrB@-e)EKP7d z-)b_QA;A98Wt*0N)=hxxr31l0S;1?*a5d-R9HQgV3MKq6XdrsHZh$3}Xp24Yrra=) z7rOE?G@}5}#lNs9~%BP6aU?s-X`MYvE&{M!yuACz9A7 zkj}y}vPfP)ILZ9~xZ%pxRDUCx^?=HG!;Kk$4)uX7JAo8Ek%o65$9fRwTnY0(iKJT# z(KM3BkEj7CC8X^%vh)g`A5=DN18?O|lt)iwU9i2mrmIaq>um``24zR;MSsrud5BFd z>$(8lb03H%E!paql`}wl`&+ynNROpt{2E}@^1%S5j=y?s)#$B#-jBx5jd-G|Cr-wbX7D^8$^XV?s?lGE>%gHdGw?q6aSl>+y}MdNAci?kQrd#+t5 z(I@uXMR!R)Xv)QB)icHk5NKdhEu)OxIaVm6;6i~OR}V)V{CS#G?@_~0^i*OCowf3! zuJ2PfDBsIBAEu%+saSqXZGC(>4Dd2@#<(Ppx7CSNMzdt0k?p);%0 zReV~czLG4G+#W7`Y}z1^76zx=Ixil2I^Hh=aZHz*Fi>YRhU6NC9!+%_fdUAnBDQOo zLN>gC3ZB2ZE!ebhy$#J3Z?k$KQ$CP?+0#2fo=Q4R{JZD@*H#;)wJTK{@py{huri!w z*No#(o6B}lZ?0GES#Y6NI27e}_qW7t1-OgK;^LZlcID|J7I3v>wBD)NS}Aunk55q( zCAEpN%wqN9=_IKi0DhA)06IsCybBR?ONI*F8Z6l`YI4Oc>Miwtc~Q?dS>j{V=tQmP z%3ef^RW(>{>og-ott=P1FyTLsIHfnzmv$#>cCTZVR&&{%H4Zcm>6&MqM)1$$@6>pD z`$hk*I@#v#)>%}iJJ>$=Y(uzNdE75`75BEU8LDw}x_E*Nv+UzF1v~@|=~;gBcYf~F z^QyY7b~X{CVuBhpL^J#8iDV4- zWBxMPJI8MSZvtKFl5KsrJ>q|oZ%&)&?=|5;H6}Js-!QS^_1mc7tLq06xxd*T3Ti)i zdR6ZlYAsJ_b$XVV3lCcR2I`qt6T7A!oX{>?$ZDu>c1=Vt=u2iG%aa;3D?w=;8VUzs z2-I;jjl#&AsCp*AZNf{Q8HytzLja@+# z*er7Wh_W9f=I{8 zbt!@S)$bD=ga?@V#fgT8wAe|oWjz2qU^jvls1|Pq#V%Y=ywjhDWb0uSjw*5hpT96a zd8rJsrz50W@G<#G$9(N%`H3Lil(r7+(jk?HPb9)}Cx^kU>L|+NG<2%Ou0ro*}MdLbIo%l)WvDN8Qt&;WwB_^oj34 zE;B@bh%kV01r4)i$M5s*`8sZP_upr58-Cl(%VrlMXY1%)Tb#kqX8y_#lJKU_=l#V` z=%nlAMx@olecR0B?dHbs>yhxEd*A)8Q3`C8R_xQ%4EMm$-o$Y_9R_zro#wO8%fktS zL7!(yHUGK-)4Z!~aw2u6YhMJV&jq2W3z#I^T%8=k;$*s@5!su%egTI;<%cFAI zKB2wzlqkmVS0mNKl&(wIcJnen&D5*mVz_%4#;e4)0anN)OiT!4#*{cMMEj?4tyb%U zOoBnoOF?Y@-}N<57?+x{&*ce()29XLN<551UeLj99QeGJu98vCVAtfzDDyK#W_d6T89 zb)aE>-+nSN7{FrCU6ye1~7em&=D%FB@#oqM-&$Y#QNLnr=) z@u(8S^nY5oG3}`>?)9%~^Re-L`21RU8>jd!eg_@@;2{V z@N3;n^Qt}ga_V#mUQ+{9zcC0d1Goyez7_(nArSb)w*&a%ERS}Dg@^RfM|kS;p1t7V zdlr)_ayI4uz2G$aRX6M?$&QEo+rKC@QX|1a>aBP8*>%{P{b>CKRLVuJ_@-VIRNY--cs-SFQy93)RCA^WVB2xh-($MfW%Aa zY`G2Z?EOo~>8NeLm{@T;2wDofkapFJsg;SkirlQNZuM68T$;L++j2K+*-po|)nML4 zZ`0GV`#k`|T)U}Rjr(cU+krEHqj2k&=r#xZ$yp4YKvNr!`2VL&*(1tU z4OD%^x8tAK2@|^}?;wf=#8eTF`lhi{e##L2?VEmN z7dM7OgMNoVmu`Kw_olN0Mtx$P#M*ydyn5#A>5ewK7o7ICXm6Kmx5*xe>#M*201Hfc z=l{F&Wd1LbpOc;a|F)jYjO?R( z$PNcF7O1j~;IoOO&yjCgz#IV9gEY1sXaJA*{R(a+I!fNDx?Rw50_xh>RG5*u0|@ls zZ{eZN7*wq;4{9v#5{x3*J5reIJO>ykZ77_nD>gL=g%@U5asV=3fu13l1R5L?4l5}3 zlktdiKN%AT7$lem5&=jctu_?F09~M)A^EP;obEjm`~&$I*nl31WE9{G<-}viks5_7 zSsK|13x2t9$dp=yDZdoNuOS&Gcv!Q7Hlji~NDzzWMK~RL;{;cH0yqm6)$BYAslvA| z|8A;*7KDn-Bs05{F&vcW)tReEAUYA2oqSOGi9>WbvSy?H|55grQE@y^{4lz(NN@=( z5}e=;iv|x6T!TA-u(-P{65I(E+$C6W4H6_cySTds2*C;ZY`(w$xzBy^+nmMPyN{31+5_-*)#Lv4m4x%~&)x3z0RP8ran+f#zuQN7+d}bb65pS~ zPGOSImnSWlF`QL1o_ZC`RhDMvc_w-`F$0)vdU_h)e&Dh-lO4f#Lw32U^qTb)%c-IeFB?XTN7!LQOVZY|ZcdARl{%HD|_fvBprXo?j3> z%8&@M)B>(y^LG*CUIf{CWBB{~mbl)E-{zWA+fB5elglaBZ|J7itE%5ed}+O6O{|D= zm$csW{)i4~+U|N2ZkA)rsYi12eiX#U!XE1PRsWlJ48I%Hv&{_S#%eTx1#@((>%~9H zJj}|)^b^7oinINW83-WweUWxw)yf6BvFJ$2bB0%qbjs2oFWsvV!1Hk~BI&4Jr#$%f828mvH(0YW$V@8Pz38ioEum&nvn zWb_ByxNM**{pHaQRNng8Z`iC)84RIB;xX9bxG8S6j`6EAF66iw@f@xb3 zl7FL`KbB!nSN++Tanud4CIGuxr=z<`@%^+LaMr;ts}*N8k&RF0fUY?St+reLbPyQF z@pCe-Gy6-aQ~fe+b^dU!M~ktsBV#I7QATm?NIO}L0(MqQ zeyCqvDMz7n)bg=@*wb}S4CYr@CTyUU#e_AmnUusAU+as5GR)>KH##k5|4Eimg8T5lx&jORSF@5!-FFA)Bzle zKe*=O3XAjWbuN$3)xmbM)0#=LFHOKuTK+eN)Ai*&f$1uWsLk(bG=k4TN)=|;vW3V= zaUPbROOT^5&5M3)clrK0Onp%-w|GCqf$sdW<>y-RGnMRM$JE>=% zGDWlJcq9h7Qq7K;A);jmA87KRi}eShxEp=XxmUSzz4Q|AWFi;$M0$;q=4@vGn%rh0 zv3;NKlgsz{j>m0+=a-d1;3zxlKr6}m#06~y8kxmXjP=o28{GDQR<)C~E`+5)Ku6GG zIELOXL!W6hejtv7PltOXnu7^MKk-T@mB}!TJwDqZ8t*TT&VWA22jgpvOdm0?v%0u* z|50J;8mf-+1KX|s7y_isCnJyK$uULmVpUVX@_^sL^fFqw(f&xogoh2w3DYB zy!*B$Wb?}d#NO6rdO(>t32u1$X;*toHOYrQ&u{Y#&95saTTT61MXAcuW$Ei0xn3>T zj_&D&Os$E%z68?le4kcI;%o=fk(5zxV{XxbsrDRw>}^Wex%Us=s$G#o=$p1e-%y8tE_$d!s_*STl!@lH>bfVvw_cIiJ! zMDgF}2&Ij5rVMK4q@U|)LdDY4pP*8<71t%(R04wDvt2)O8|UQ$GifT^JZN&+0#U~K z)Jc^tuxHw~`r0NKsFdKpYre~8tWpjn)wU~rP`H}nqrt=vxU`z()tiR|{o`%Auou@5$m8QXfSAHCA+BYmf!Mog^X`nVGxY}Pi6 z2B*fj=j)0M4rOFBnPlB&;>(&Rvy`}WQ&x>GfzINEbr&g+Jr>Vg!bwqCDy6TVh0=(0 z$d&9p=j}|*)s~KAtRzNB-)IPzoBYz#3|rRAR8Y$)7uaWz2sze*E18;mda=Yl=r_!K z8Bxsd|6uc*)1#D^d~&1|oVMqdJ^1G*u+RGBYDsqia_Uq`C)4|XVh0|+f3X8T4>up* z|0{R^BlabbVnjmhXkn<5@VW)(`@QZA&*we^ItC3)Y#;`*Q1A&w_FH@u@y7X=e#fi& z)?Rby&v%ivAKUM=6;`_znu^7Tn4+mI5}KKn^cn{m`?DYDxfF_^DJ3btsGDbOpES}* zv5S@oWtEAJqW(0=eV7hcO;KqsH7h;4VLN#w*53ooc4{hFc;$%`EGrN&e*pB*Fj$oo|p_csB$Ci+f1TS z2w^%a0a*X*+`)jDj_M9J4hd{D2IeiRhLX1gM;`0#kzg685_A%74r_NU*v?E?f=76%UBQ8c|5Om<|^FoXoO;3~{xqb=MyDm08P<8YMPcj+B9mF=I%U*147kAd{)q1i2 z_}u$2JVt|KKgM}h16IUIJ}pz)>(w#Y6GW+47tt@5sqKEZ2V5^QNx`^qJ^u z%ZB@>vzALmZSw5zdp{X*+AZ?6>T~C z_GI$>;!|C{ssF&IfeJl}i!`g-5o ze(j9L{TdEj`_V)1gX&!$TfB19u_{at^8boivY>X3)eB9eS+m{f7ii(R~$%=Yg zY?`V{RE>UJWEjAKv%eg6a>NuJYf?mf^+8^e8i{#qNkV7I6OQI5ug=P5WY_Y{)G2JM zRpMGZ{qiyYOsHiz#e-{~u~)#E@nauhV^ye4s(Q3!4N)Odo1Es4juJV8cMDSTFIkpX z2YRAXc+4?O=7L9)TD&&up)m71{$nt*m=4Ta>=rvG@{rIT$Yim#)%hvUTC?YC! zvolOi4O|(Z^Ox5oG#ZxdB`e0USr`~An3S~u!4FYES#>)-aVl?v4C%)67Iy07T&uKYA4GjG* z-{dmKDG+LHp~EiKV}(A!Tkr{m75d^4S9m1)lK|f`6X`RD%iyT5k z;Ofg>kG7{=n$(9Riq@QT9`qW^B6Rzr4(hWEbl zPY4>I#Nl=p?8Kt@Xu%Gg4W(^H+$bYUUnVRz(=3)s)fc#0jrjA0oP`KDswHPu( zgvjLa5)%O46)2;~SMBj8o@YDW zBKj-x1}hiV205a)waP7d7gqCdj|ayj&GW$q>(CLs)!IVD`MX(x)!DV2?A#ru%waY{ zM$C>e6G+0sL7;ZUUqj%9*oL(79-+#F?2^G-AD#1jRu}N|T@4@}$`ykw)C@!=^vHIU z3~|^{RtCJosLAJDNCHsIu5U#(V}_xey*CX@SkVedUF4s4Yu^MiY5H2_OWS<%wu0HX zcbSm6lgIq-!7z1GyVB;JbjXhrd-Hk$O|@Uf3I@@x#cm{#KtRWThpgu;bpjAiFNsFz zK|$YQJO6Y16N)1=RTtGUE}oEUSK6v>qr&L#kl6Go*kF?H5yZrlE67rYJAH(#-ArGL zB@$;8JCFMH7)x~gHyAWzt|dUDcKOD^)o%p!dK4`0Yn-oG5$26Zxi~e0UPYuLukf1N z^u%Eg1He$Wdol_#Ck%X=b(V!bbjHHQ>&woA`CN>^^@iT_i z?Nn2=66q_Wb7DB0Mg=Y>A%`bD`WDtIFooL~CRR<;9C}EZhV)#vOa3+1?&LhskxV;` z@+?cT@-3~6ihffeNvFo%;3!qE8fuB^{Ka1x)!7~$r-uilhfHAxK=IvK2}mg5lHq}s z>_GndRS>~Nu zpX6740U{?z%!;APr#`tsvNe-LB}ft!Y_5;WP)?RVyyXRy21AdPOa)`6xYHXWf3*=1Tp-XF?F_ z?z_Q^jTt5`Yp%}fgt9P1z{2||eaaE7yw0qlX?X`?)N~XB zsn^VVb3m94o}>n;-UmsF){%5UAoTST<=<*JbFt&htmbP557*unG{jI@3&r|eDA0`J z4dD-5eQICs2lr5raz4W1XK*V_wS2WVNGUMvOAv+3q4*xWtz}f-id$347ZhnUK@J1B zn@E#Om^;iaG?HFujan{2rcihVFCoaN!k0$36=)pkl53ch>1H1eC!RhUKtB}-zbrou zTEmv;%IAN{j9D;CIP{!9O*jNt5mh2xkE_1RG{(NPq(fzEw4^K9JQ$MUm37yn^PvRm z(Fs#t>TbP8U;kQT0}nG%er+hl#;6Iz%*l|q;TK^`iVo~VWk@^gb)21RT#&{K z&vS!?M7>`s0`}E%9+dyVf?|=gCK*T_lnw3N;25UzbJWB92$1orNzC!d<%+uR3SOcZA|W}jj?P8)tQ+ft%G{zR0l{sl$kb+Dn=6>N$h2b zC_2Z>nm=%!FT}To#QYqEFk=NSGI+%O{8L}G#MaOE`=%@oGgmpyzlXiQjz{p%%^NI# zK0|)<_b;aHSHw~}6@rW=4kzD4>yy(#t6yRTFG;AqOSg!Pua!0^jc?fUQQ^3|Si^3@ zzMR73BwSD1%EqP}H_(|YjQ}nzlL*s5rE}#gzG=#myz~-Y;Qhldky6%N(K?~Zp1Da^!RA_D zaTXQhW=7#Bcq#WQ1$xkgaX2~MDZBuLT2*k4>n{34b4hb#zJzndI!E~n)m4dJ&p4r(~2Sb^^e&M`#7}83ya~V?F!0|wtIr$n^ zgG{}*s!n+RsX!E;3437J3@7O+iu!nq06Un2qCU1?hY*ig^_H0PI@v8PWnwP@d z3!eOYDD4gs<@gUI$^@%FX|m zn9xHXS%4z>?F@2D^3Uve<(iYPiXE4AE35#_6{rT8cX$Zv#e>&}eyMg|LITH+{mx8$ z-$M93O~guF26c<#IPkmsO8ND`T_*w|Z&ST^nJ&Q)Gxw``;tN!t9 zm-ojBRn11T{lQ6sqB5uz6)AiZiG6aXhoI@JTi0Z*z`oa+L5y3V>r?7u!^JWVg$eje z)t@&(iC1y-MsOl0;(`hEjRCq5`<{!AnG$HsGG0&C#BNN_?^zdPsa*jI*Xs{I83NHM zjyhyvydo{9ff++waP&wU*zF z>z0+qxt2EzSlthN$)uMyiaBFM-p!V$+*?NjoYfDA692G@br`ws;BX^;u#Hh!TuXya zeZlB?Bl!J<^w$FN(kU`PwTmGKa})47tDZ7QRJRvt$Y;b8z$nOE3y{IsWJGrOB)Nuv zD=}Mn+=Xf7XzAweYGv;5k8-lG#RPK;2+?rU{3At0F}c)Toh&^*Sh>7h< z!wKf*zqv*F59XWAJi=dH8sFxCPUfp7F{5-?ER-__~t3 z+%(Jx9W=@|o>nxx+&scuGFBEg=8h~hcFyMR5H~Ax8c!=%HybBM8Uao|P97Faaq<7V zTs&aJE2vjw{9sHjIU83ucN%^^1gUK0XzdQ6;SuIZ58lFHf#w)2M^gym2dvk^KJ3vp zXs*5v=J`Y_J(OycD@`?bZ3a3v-ljx9ztK?8+IBJEU&SERdQ(;+vj5(rrI;)l<1IGP zOZ1K6V3c^-Pzu-I>KH6^cJJSYe5L76%(&u{r%gp6mkMImr^gOba5Ru{FgToVLSaaf zBjm=kO#yD*RzXpAs{R(BvF9_}o>wso0Is?tIS5F`gHMvB>vkn=W9{Avb0_2Wm4+zI zGNVrfd}I$+nh)l8md$BH{OO|*qnRiZO^AZ@iy2L-FsvOa-F1KJiJfD0yun(qMPlvy z8__U{F7LZr&1Xsz%2R6U>!=$KypB1vB!l$_!l$rN@snxJnP0&o0)-KUg^O=13RrxY z*+!zDeB7Y-kB=SqMQTuyhsmt{$y#|Q64_a~9gRp4eu55e#GC)tLwY%qk6{g1N}&wK z^G@V@+byJt{4r(U=5u-PoL3IN|JrsCEo0l3Iy>GTHxK7v+{qE_ZO1y{of6fxHyfxu zuphAKEaYPgl(n{LU5>!1jlTGb_cn^J4@BR%*)R!x*|@fI4=`}L4ggdOntm}o;^@N5 z_ekat@0rLli^1{zK#~`}wlHuC`d$~~l)Sbudn123^vkd~hj1DV-FZKD-6H7P@RBG* z9JCO?9+WxhND|EZVcuBXYte(m@3;ASG?K@Dtf?TN1EmGC`1R{(tQL53Ay(0kogc-{ zU;0*|_b5kqF1}bjpugNYD2pHRojjDOzB+lhkIYx5zYu$Wp?R%7K3Z9gr?n~Kt1aYt zew;kdfbmAq^EB%9;#+M4RjRL3ynf~NBOWT=))JK8S+n2#-Ade7?PA2!K2H^UKkRq( z4&I3$6VcoWyQX9N;nR*X1+V-eJN(x5_s+^864a-BDs-zrgfAo_xzKTK&PLKjrB#{w z+-G!2@W@WyOBOe{s+_I*`==md8*Pnu28U^wZ4g6qGb8P_!^wzRMXmt-X!t$=lZ3>v z^aC;pV_3l7>c$uFFj;ehX$kPyPbVH4JCLb)C0Ajk`m)JN@6z=m;;)cAW4Fc=r4<_S zQ|MlwAY{Ia%kiY?G^SGJzN>wy@wBq2+IF2@mSnbzdeA6c{OG>D;`Hd?e#;HkbyHPQ zbSmcb>%ea^TjcI3`b|5lN%!ed=jl;tSM7JFA;bB(wVNFWYrFNZq?W9ceSG;EzjhBg zr%J>7iKscRc8|5YfCse4_GdchtE20f9_Vas2bZ*NcQbn1Nx^EbqZh>OTU90c!gz!e zeyy60OO|O~x<9rSGX~)2vG%<5p2MS8E-g{t06 zEU0TkAx1zbbpJr~spEeB1hcBlZ6B0~Y9FkZ$f0-pxOFz0-c5BXPGK1Dln~*SKA5XD zGyP}Uu?uw=`CCst7Y^BU^P7hlsP4_rzNaj_h`zpEh3paqIYF}3>8EbgK|pNpIR_8p z^R0X5{n6nWt=)2Gx8Jm)_$cb&t1)qIB(v+_GqMOkdfQ;XvudwR@{gg=q<8cQAF0W4 z`h75;Qi_yWL*>Zhz~naImvC>hoPB0{VHy?k*jRotJKj0Vy`(ces>xhN=)^t+m<9bm zUe)l*hwVDiN79$jWDUk$Gx~A4%s6nCk3HDi#D#g^bz`^SPB9)eR567`)qq}19f(gYHeyUE-kmez53j7i)S|pKea?8NJ@~wHi!QAoO#!VaJI+;L zWU-2EuyE|i_#VD@2<3S*tP$(RGch1U(ojR1P|tk(7b(#9aUtEIHBY;X^wHw75?=e! zf?xU~bU6m)vNoI7k5yMoOGSmBf7Ym4u5!+frKG!%Q@r=FkYlOKlG#?O9>6Y%HH6%i z?ChyiVhT2)(#dIv9?#%l2F++C#_Ag^zPWrox?PA8VAnpB164NV4Jad)e3tEH;Wn_b z;+Xzye=E0_y)qMA0lc7$B_XZ7>Lc7A#sA`iTS}>=q#4IO-jGj%raoSSq!{v<2IQ0CC*8H$#Y z`}Awc&g(DHZ)o=>Y2Tt=L)}NdoH(?L)UrRN9Z_)-ub=`?_Hv3V-Y?q*2&U;uWtC%K zO`7Z<{aw6mNv^0<8_ll|ouJ(kpO$M+1aR+POl^#(s*?_HNA{A{_w+b$9j zCue(n`keCAg8O&#>}vD+rYzKW4XsN;)PGhs{L{8d4GYCHQb^!Q#s6bmA)G#pPCy40 zK|}gYfpDn2 z5`%0*1etF_0wDYF8m+nDM+gb5MuQ4~4(BWySDy=g3&C9iTLB?59r2#2=iCtK4rqdB zSUp)|zL;cIp*`w5)+ITV@dA6`J9r@^oh2dIv(cbYVFVWz)r@ySXoXmV%@hBG&Pq@y zcrH>v%7-vp+D^7ZauMhYSIy5UQx2JiC^Wi^h{F;Df&}D*0TcN+g>jm>sQWNEm>e^D zFMj5pxQZ~gCZqwvqKFflKVD=5B@sI$U7}mUFTp(!T`~rXeK#3H$=rLQC}Aw*eY=^_ zS^9SRwTawvf@ioUPKNZGPo?Q4d&aVMl1F9lx2<8|vP{A+dm>9bjngT-E9{w~6^AMM z`>=_^E6tIE3rHWtHVib3yu`f3qR8=0wh;r|bjH~lQTq3dR2xbf+_7*NihR=x1Xr(b zr{MKsX3o_fHyB72)Gq+@s@bpqWb(kG1}(U};hm7%+8zt8Te#(hry|IYHj)vzy^0+3 z9bc~U-5bSW3oaQrc=5IiA<~Z^-ZASRhuJoQz;nvM119CNpMwqmal{}ZKHt_b*{^?y zH{v!jBJ`L`WI|&n3^=|mV4=fR3;8wc7qB8=ss(iuSkm;FjQ98@x%n6;0-02$&z-0$ zp92y#(F0LbK36|$a@{d!s;1qu@SC4N@Zj#Pna8S)#Ek(d?v?5`A6gIIPAip6hrNUZ zHj1UR7CU3AJi@@6-=w(=u&dJuy+Eo(3^4G3PzNlb6dIm@LMbY(Qr!a9OGxH4 z4MWU##N*pOS-u1LAu5nw;qRgvqGFT_h9~QJW4=2Rb42d_Q}Yof4KYANsPSmz&WuQg z4wz)fRw^r~7#u|+$hX_Cb4&^lVta5sESotqME&VWz6rSwLflVJrfk636Fzhg*Vo z3!j2ur6A$UY_sQesgNO?gP{}WhyUT~3^%JwmJI09sPI2v4R$!*{fDfMXaU3o8b6rO zMVXWOZ`6C3cZ7;*Srzae&i(d|d>2Xm%+ivQuh^RTsFxNzmY7>=4~T(B5Hh*O%11} zXDFghD=|hsZxChf{X(|FJCH>@n7G;(lrp%`S@BPndr7OhcO#jhJR?ZXXgEb>?^q^7 z+#uP2Df*O9vlnqMB}M+j8T*!dv?h=q!rSf%{~TX1Jo7e1B>w`k3i0**o`C@-yQP4Z zFm4fM?!AvFRj{l}-`(d+u?56@ukx82)x6Lc5S_z~ zI3*4BHxT5fZ?`G5`xe2u2!|%61+d1fcD&a=ZgNW<@Q z)t}GmL_(v!|jgQ3PlF)zGqv6Foc=p9-rzl-xt{s8nW0)a%3{rh4CVm zr7@PWD_z05F0ir4Vm|5#1al5dN3h@pg+f|j<6(fL}-_Qw+Z61Sjl*3zp`yXd6o82KmM7IvxG z(Tf2VM=rim&qXPN{epp2#PUg09;-|KnL{I+68?dJeCjy1a(Dh+fKcclgT29tFxEst zMY_v~6!#}+DQe{$ZYWXaT3BI<4R^>~7^7iq2u~wbBloV5P{LdcqmnV;CB*+y9-W0N zMCl(f8vl8Nms}UsMxq2*3cJlnOG~W{s)QH_nT*(Qhc?HSS~=q&rj{MeE5P3R0LKd9 z7b$aa748T*E-ki{mL5@ZUG<8Hl$Ks(axq0QXnrRU1aC!_UoGpz`dv^LuQ{5cWJVTO zIhFDcS8-m~Gh&L5@7N$!)hW4OT@$;mM=aK#KSdy|mTbb@WcAgy2jL2LU{GBoo)w?)e5 z5$ejd5HZ*x^-IKxav>pHN^_q1Uwc`@KK_R+al?{QmRFMWOQcKMBYg<7NVh~h@(~s? zILyrdKWHT@2&Xt~Fq2!K&RC6n$fu0+TAg`qg?=D2ZDd^dud#%*%KitfO32F;CaIGB zv(`Q6>Hp9*Lhq5wi=kTNf-E1WbsZcCR{c})AGlQ9Bouu>*>AT|63GiFP~Jk=uit07 zk`}`($B0VM?1+5|_%m=*Yq4hs_t(j}>GxHOq!&3o5}8tM(q`>j$=z7g^$#Mhy|C*Ti2#pI3ZU;L{4 zRmsl*ddDRr7EV>y-1#J{|6G|5+`CL^vzsvH`_8*VpngSe@2&IUiix%FGD?-uEN%}mzTK*)_4+2XN% zMet@Z#8roF+3Oa(c4?c^QlUnOlfNv95Uwem_1S8+b?wm-3*={mtrCExg?N^IxI1rp z38ES?z*ijdh{`gS-d3b#c!M~V4!_+J+$}>~SPHxR&BWHQpri{2-qvwns9wYj+6ZfB~gBQml>%9$!<&*0jpS8c~&-zL#&x+gIK_vQJ;PFZP&EH zszbwpiu@)=Dh;&VL-MW}RZMClRjzf%9P3<}`|>dn92{{YnH6iBCBKW2Ue@v9qV*8> zy#D=X#OsoJ6^O8=E9iJVZ@(e4Qet;b1F^k>@ouF6C{iyzNukIkQpI`z$A?1ijXr{ z0EXI*7^kAva0OMGk&gx0ZHTlYee6}?Mt2PMael=f^u~-}1@)$fP!A0eAOFFx0{CyZ z`g4jqr{@wAkVB`ub;VolbE8au{rx(2LEhc${7LDpvHhk67Kvf&!jAzEXS4GWlDIR% zUJGIWiHSiqV&AYpBEf1^E{nl4^5573l2Eta_E_Z_k8SWSa>hHmd>U=+_&*ocg~f0f z{olIK5xVTg8uV(@!?cY$H@9#|oXA_f`vzWdt~sBD#|Zw9M~z^8$NmM@q044SD@ZXLoUQ0-J-n@WGq(|Ds8xi? z>V?SEJE=uI=sqP(f263Wch3I5C(wVVZTwBdGx#T`yQiKFt#hSQo1JB--tD;je@d36 z(0g9_wC9!G|NourBd(Az%N>t2L60Az2D)=Y6X?$yc@j9zFL@IL&%t1|w-+Dw{vP0n zfx36<6saozPa=z;tdS;$w?jq6hY-o?q$$s2-ghH4k1SN47p;Mdn}v{fx*SH=mQ1~} z&PdJ`NyY#pTgye^QGR)y$=HDN)X@~R)XOn1pReXUFOLzQ#kHwScXfx-q29rsT~4{( zQMPue``hL9MzL00S&tJ6c=vyUEQCh(Gkm(>~|!9^ZnyP1Qa*=$1gsk z;k*z2p6|N#G_YLEAT-2HlMFXT#|;IV<@t=%&IH~sTBUIe*pc^0@jX+<%>j39GJ`e2 z{U6(3jsK{HaaIQ{D0`tppnS_(b3HsT9FcMI-wH>_JErYw8BNrQp2_qySyL)6O0zyG zc_l1X?1M8cFBuK{joK%Xe{igZO5)M?P354y)@^^+%aE@tZsysnrY0L+;zz0+9P_d0 zbPmwG@a3aYtA)UoEshbYU{CB~9D~h#5H19F1^Hq_Ko8*6W6W*W4EQ5s5#$N%L0QL|~5kG*>{+P$_PHf6~0xf54!Rfk2Y07yREpSoD@_LQRrrmk>%F!$wXP_)|OdxL# zf>kv37|#3N9r|{d1!`Yc&`GqquCDm&b-CW|hwhS}Tgh=$`D4>84c*>xXhboZT@{nZ z4b-1YU!>G4TaSxBcY+6UQmm#3u(JaGn%YU`F+wH>QMo_rh!zC91SttHj&2C)}{^ubs(w zMy1E?wBa#zi6MV422k3IbF>A7+E;}{>{a{8En&W4Lzm@b-s5q4uz7N#tDX!61l7?x{vbbcy77fMK!Xao#rE0db`^r2nc_fOUEy@EaM4--5 zvXjx1@G=PZqU*TK7lkZKk1#PK>MHX_8(N4Y-f+5N9uui--_u$9w+>An-XGc5k2ZdP zr=~>D^OF9KP$}zX{4`Ncgi-F2!IL01>!$jIycIyC*8xQ)(#k@!9pTT9TxPg<>X4YC zXAHKm9myBoTfJ>Ub97D|Nn?pD?fY)Eh9@B&vTTOIo_RA#EwRPfibure_kxJgkfD6% zgWY0h-e0_tB%d+eH^m&XeGhw&Tcg?*;r#90IyN`!kIi6)fj_;OuBI90DmJw!>VsH( zRV<6L9rMtX{U7LdiWV$|#Db?ST^0LphU~VT=To{x?AK1e>jU-7RQ|GsRW6O)f9OVw zNAm5G`#j%1W@s=40O=JC+sTw5mQ6b`c?AHwpRngo+l2;&*Wds}zNevq-5rQvhfOY$ z(0RxKd2lJe$alF|o4B-U_#i(z>^J|?ce##v$PJYI#H47|uF>;^vHbQ_x6ETqu!loZ zcYbfo@b?TL$Aq4#wHYG5o(VQKOJp)a3{|tZN>e-KKF6Rz^y{Wzq0ec-h4cPic`%(9 zuueL*Hd3(Zkr%i}gllS)?mPQbi$&^Rk@Z3i14GL&(9zg@(ZKuS0@)=kQOho=rn+)I z2`D3bGqSI~#lJG5Q!w)Sh(jm44swCo?s451Mu(pT{V!a+gIWq^Q<31 zIUTr!056OfZnC%xi;#Hr6_9m@`|`=a8K;y`+PLI)#pd9VQRse3qYex;KGSLY^VFsJ zrMTg0P|*8&bPBGnNXk}jHyn%=*NOaV9J^t0()k3KhM`1nm8 zdI^EU)~gkH*D?RR=P!*e8$mI9%TLr(t$XWmQB&Zw*@!<>q72Tqfu`>Hhf&?)4@e!V z`bR)rF-Bo?!bF{xo1qkeK)N|0F-IWb{!Yf=3? zpW0Z7J~Gb_DES3BZ?AWE_cg{4A#aD)tWe~b=o}J);`LZ#Ib4Qy?|D4>~$&Bao?LO$htD{Dj zoZq#Rna_JM{6X|{XT2h;rrlOgVP*V59CN40{66ppyd(Y~skwCFM(t*If4s5hDf74~ zL2+`~kp+u@*@xPU_cox&09nJ^eC4kVv1B8G7td>rXwpHSrOEhGKI}oYOa_@QK zIVoIf#J$^p@j)UZHQaQBw74pEQ~Toik_G1gu^>~cl`87)t37C-EO3N!>al(*_+szb z!vu&)Y!QB*j4JAsSo)1doLSG1OO$@C(lU$f_Nld-Hq6Ca>V_sg5w4 z;5HJQMy$jLLt*paH#J}jcQyq{Z^sfm{4hhZZ#{ijOJRA7P*2Wpsc4^8b>xr;T2fsk zzd6Wu;9DD#p@o9HhwUy=`VVv%rACm|Qi_dHEN68%4L4@HnN+&ppf9u|m2&)<$pT9T zI_xs)peb~#<#sUT#Z45RU=7t2LAF=#z$ZQnNSs52U22%$}EosEl^rzJ)3t1Qr|8&H9 zI3`(=4OS?jxM%-UxnIokLiojm!A4lEqSk>%)F3Su8nm()-sw<6g4m$rG`%#4{&AJ6 z#cb;vxCBG*^>Q?us@^w86JVpKAy2=#ne+1kwdO@`L>0lf_AQ zM@(Jw-SZ)}q)CHfgbHHRKHr~!pfUgVK$*Kcyihc(u1&lWg7qUOV0Hd*h|>cf4mk9~ zMkMOG2y2|Z2^5_sV16BSXywW)lnUn9>-FFTJyHHs^9(*{+Q{=)CD)*?@&EAnXa>jz z27n$mwx2__q&$gYHE=_vumTHJi{45CS+K@p}zgZ`Tf5*oL?F>Y+Pr^5x-LhI)(~kiQj1BjJfSieO^O~F5(PE#R{x7>{vmC z-UK6;;RRciR?56gr8REekZ|T9SiaOdSaq5Q6~I;UP@z`|ti!2}gygIJud=jhENLf4 z!HOM%Ulvq$Wr-iEn$<5a$g7bsBa_Qje$|cm|89breEFzV2NOXI&h*O7^?@V77MbI3 zLALEQ)ktQEDhxtd>@!ayILtd0C`_EtMf(O=#f=Ss-hp*6%0@sfL>21_s#!GRKuDs* zx)_}#aNom%6=yWh`5hqWkc;{V%3LW!5^WTIp}CPAR-KBND{*WF(mD|yGZasv7b?5=k*R=UiivT z(qNEEVE^K{{BmQLj|2v~2An~oQFAHh0q|~bHkw9~TD^^!GJeT9F4a~pRadSWY{&Gl zE>F#(RY?#`gC#Bt1(^R+dR?^kk!V;O?S@@_#1o&{uyW&=3@hL{){_bibApxljcoyS zt&JIl5dgOpQt=cM$nrraL!q5{&SJf7ui&NcmYct7ZGskT{fXcEn%s1PW#1EvUFqGHf8_lDdKxuw zVA1{6;QUkYJ!|~e2NtwpvtVqoN!W#Q|Brz2rGyN=b?SaT#OTB_;~EuM&@-&l{~_>39l#3}na|U$j7hhlPz)L8iR7453oI0f2PN)&bfIl2C2l z*4J)xKWYQBsAAlBGZ^{oH|GNl$;rmCONY%8$I8P@pILCspqXQ`K~lUgK@*;Kl3F2x zyzybr%$#w|9&&&8$*?4fuCg?olZaE>a2yS8zpEj(GK5qm>my@<0-v40`8^i_G}P>d z-bYDj&J#6tO}3le8+80#M|F|gaL|6FG5fcpraui(4jiXr*N+R@LqhhOKk)c_PO22b zLQ=tl=pEW1XrQBZ5ve7~yJOpQG0@YssjVd3VmDlv_!wcVzx$E*yz030Z-M`ia4j(p zH%1LIWPiBeM3`RP-ZcTN=jn)&!}be+q2h_Be*Xm)4)bv(*fBvC*(s$IzgDvu2#N}n z&iv6;}~Bqaq4il^BSW=M+Ym02c|=(`#7stzoRj7Ol88E%OZ?@+eR_W zbn_Ul3J*7ad&IbR>E64DFO;ly2qNLE?v8yM6J|NUgF~QrY3|ag!@M@z{lk zjA{z25V>I4!8~}++x%nOlJ0e%xF26>H=2f;B-9Uqie+ekFEeK^XjDX~nui`dPTsxn z5QU<-BbQrO;?C$<9%7tG&$){t$!El$qV6dEeAN>eQzc&UhzkfQ-u4Aq6l}+Ve1_-w zeM#|=D4m)kYZNO76{6x_-cUF-3{{GA#>pIb3m$xv-*ds&?N!_=-xk~WBx`a{i<6D= zm_JYF11n$zBY@30v?4O;5*epvR%()shIR^+7wMgYS2L1 zI8P@QDI=?-eW+=s^q?XZ6T9ZMl2*Rn@P0sq-s(@QEj*_;o@JM?MP!o31V=&^vOXBKadUgIebmNue1XW zp3;Dv1~WdQL1fK{8N7A3)hsa+PwK$e`z?+kb|B-2H1KZ$1>4M_7AFG#^~{EYum0^} z+Rc9kK^524%bK&YlI#Azp_wf{LM$_d`&{?mSLy8uN&=42 zzJ9REwZ6t>anDoDNQWFiylpS{(rk0r?jfrLED1ki~iTw z_%r`GFk=V*G@WO;6V;|qu=5lM@v_+vkrKzO!m}yv!Nwbk`y$q!n{{;FuWZ)`FP+4G zr__pN2R`2XL$$kjlVf-3A0Mf_Q%SROjwIO@Uor?1yPo=3%=$BP<_^v7*_(cC+I1{R zdH)rL$Yve4Q$?CHk7nOwW-w3P=>JV1gQZ%xtp4W;xn;k_3xcParSV7Sd|NJcAT3hX zc7IrEp`Y0E6l=zPr{vggsCQ>>a@Q&Qe*SC3o5@!vCvDa_xkTsN$#0A`Q?Jf+yYDWb zd{QX#e9}6d%>O!f&s!}xp0qmt(&VI-I)&fYBxTJ|?3UbgouTi9kidycdvqixzL|0~ zZs(fgkD7IS>(ALSbcf!?*4)Ots$iEBrvu zw6_{O4yVibBH!fZU%6}^@kY8b*EH(S4FBkMUAvD>+h*zfTmLVvKKiWKe}DPwVckbd zeS`O2&iYvYbL+Ogh^wczY`eAQ)lJ1**{!SO_Xb5DUt{%0D|c)3*AJq(r4e5z|6jD$ zZ}q(e!xSs#%CI5T&$*s2eyWKA0<@@h(F$e8G%=SIo@lS8^KeO(C z2YA0n_P=;<^s+zUCI6Ne`nL+EcL!JAIA5W@vT%pt$%lR_?a}=*`@+k9a2|TNn+eFN zmw9Je^kcO%-+X47cg7_KaRy$(LSrrd5{ z{Gh;o+u>MaKJV)fyYlpn29|*(Sd2Q?35oRc@EQBJ(ex^>97!H@@ETj6KeeWu@K&7mXaV zHo3R(BVX_NN}Y$l%}wmw9~aY?EqmsGDL|EhoXlB+M4O)u0Jl;<`#Ffrg# KRdw}u;{pISjFHL! delta 712799 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 >d>+)s5ok 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

*2`$B$|e(ij#%*brL4HWEHB!7m)%X^`k)8+bY{A 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 z

HlJB&5n4nzWkOB3dEQ)n|RBA)mMvyNP=a!T?Ik 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 z%0Ad<+*T zF}{lHxk9Gu2E3i2ig{(Pu5n$*z0Kn5s*HWA-JJpP2Za^P20YDo6I>~^0o{q);1AtKKeHdF zsBpq$kL_HL0sNnC|v`T@pG?UU$bo&b@7u%1lS}c5e^M8iySo4umu`vn3O~swL~Kg zlH$fo9E6c|cg%nFh(?;&x6imywqd5gGm1NR?auQYXm#2&sc))Ds{Bxt?s`|%#rd8Z zA5Xl7F>1h1iH_d{q?&>p_WSpG(jw_2=Jt#d2>SC&CEWDY$@J~LpT4s7k%C~&Eeihb zA35s_7guqUCH|QW?)Lo&iE^gzBjo}DcYOI}?OsuPB=djrPl%3$I4HAkZ#vF(o%&N= zLkXvPeCX3S4wd%=+LzX0e1$>Nt-E>u8nyWH-Rn2*{#Yh6LDu?_J;rcd_;V*T71$sp z!r3D|C5OF1WnJB#ji@(Q7M#tbod6}$y`6yQFP{#j`(5nC52kHfVkU@!+=D9jM1L>h zyJ_dbS?_-qQ+EhfXKB-wn}MrQqmyNO9M7p2A;Ck}@c>WS8=JA=BNytc;J$e^xnf*$ z*cCEbGfne&6_RKYE!1J=} zq%42XR;G2=^8yhg!y?D1=Ow|=mq`_TUCStl^Mi#E?%lHC!Y^CSEt`gn=p$Tr%d8ut zUuuHO8$XNwU=%0Pxfgt4&sn=Ux9;B-2UU>R`a_%HA(sEzi;h(DakWtp1s$!+hw#&1 z!n4+3c*+LG6XVkn&ae)|lN)LqiIi<5f}4M1M*!TEmHXcw_Ic(jn}!VyE1(ilZB@tl zDl7Lsl z2|MTpH75~lsPB>4on+p2ny}eEQ^+`cWuypoWX&!G$EKL3iW5 z?w;2}eZ0E3{Hzm#QHC>;T-_#Gqm0Q!QHrq4lB+WLn*PyDri`fc8)1CaEb?MPb^4Ea zsU}mBmJ^cxVpiz%w(a0zZoYkg2j5Vf=KkKiEbG2*n|$W4yDm2t9w*mVe_np(ayJN) z38WZJu=C$MxkZCO2}c>>>m}{2GrO#xs*puS!Jyh0EZSMXB$bFsyPh zCsV?Z;GW)xpf#b@013g<@AZF{^u}G@9OO?3MAask#n&I#Z<{B04LA}CmTs5^oCTKY zCyS={+O)m-z|y9w%C+aIOFnZ^`*0xBY&>@DBJcXTSk3az{ju%J%76TZ1r7yGfhf$_ zHfnqw&JnfEk!?smN*9}dTF3TObuIWK?~J8n$~3msHGn_2xx`r7-&LKtkMVS#ub&0J z-##r|e9sq4x5hi_C-8c2d9lPeLvD%7$|bViaWbVCDdD{S)z$O7^B%f()z?k6bXTT` z?d`@+Fc&dmTcC=&b~bNqzFqu&b@A_oNmHB<0F)s@NFo)7q)Uo_`Nh|3oRsi42nMlC zC--*cJYk44lPuU zfA6143~B?)2N6L5C8#wb-Ob-92__4C)JmU(fN+ekNTeWer}!xd2!|z5lg5_9KD>N3 zYm2%h>;3m&Ej}f7{JH|UXSy__js`}o~Fa#58D`oJ;47< zRkTeRY$ISA3hrbl$&lvR=}y8al2j%VOCXm2Tr1%clnt|gwxFGi(@H?UNU1znB4)A* z4KxZJC0UIvB7EL-)!}ABF+m(`#BfeAw}~`x{<3CLm@V%vZ@yQ9{f;^HXA{nB@>UP5 z=H}IJp`BZ1MH{?Z4(%$)^J-}}>fwUi8GBw6C`>!3D-9}bgdQa%fl8rqXa`%8Gp}I6 z;#z^4Bzv%bHwN}&cs6Zg1dp%(y4eA7x3Tb}ASw!ikd0D0W(%Pz4u)Whz?SH|>9&5#1OV`LbC-U@0h3OZm*61qmmCB<`mjN|MGJm$XB zkU*~`dKB5lGf;uio?00OG zJ&7yOg>kkdV@hZefN9UOIUxYa6T@`|r7XnI^{QDu&d)9BAv>1~-yChHTy5m8Z->_M zyaJ+%mo>%_6)@)+qB72WVr*e4&Sx-&?=^+HzQY9CosGVVKu^~z*`uH&IUS|^%$Wp_ zGrt&rTf#@TINGKL=Qgjw@!Y;esGVEJNPCc?l(9I#fi29|<3!u_q2@u&$Nde@thK%RY_0C-tM!vSQl{s;3+`@ryeSzlE2xBrvZZZx1nZ(%}j4iPq zb8q|+XLz`d;?@t>1Gh)yGJUCBuC}8`P%+;j`(+XXY;ZZgWCZK8KIOB-1g)tk_ zdQRn3572Lle$Z8JHm9i$vlq9UK`F$=jDY~tamEj0%eI#0W!~@-tC? zp7&==-GTTOgukhSPm`&jBK^(1eR%WX*AN*3#yY+Ifh7!~fY`=JdYTa=MVt}J*y6&6 zSG0@A!$}{-txx)a+p|ws4{)asaCdUlc<1;0uFCf(it534L1s`fHTL+E$5;${;3!g+ zN)YNiPBuslf|?Ao;l#EPi4?U*%DP#9@pNH-lWUjD`ewHN4bCdI?O`R55 zktJ7_d+Pl9&XAO2*>r5*(6~SlJxI+*&U=Rb=JDafcS27XC5}2ad3>4}4u70b?Iw@Q z$!}A}2q$9p$KwwlzLTSwQW8z|gob&G=eAz8OPu)d?c>8=4-7`=gnvz#GDKM6sd8;6 zi`Bz#f6&Pi27j1PBAlIk@l#h5L8L%}_2id_pC7)##f>4Ero)Bi}HZ5jzVdZqQTg?QYeuO7JZR=`*uf-Gy`D=rN+f~_x0U1%Mm!hxQCV<&P ztU2R?FxcjtQ=*&-n1BD7%_Vcg68-(6Xu=IZb2}}=L)D}<;1m(m4IB9J$0!BhC2@uZ zjwphYVW%R@dQ2=1Zmoi)z0OKAj7h>l90T5eQ-E9&!}!gBPi?pQ3ic}Lv}l%L(`D5^ zmys=-?K<$IYg&J^Eb1^aFm6+=)*z>9c#jmxY!1tse&3u-fqylDObjE8X}A$YNjF{z zwbTB&+JJbSm=4#!XMPR4@U+6G?E?Qlhc|WgdBzP&4WEi|S>F zRrFo;4{%>|;eWZ0`%H@vM*_>eNQ8h@Dn1rTvHY`Glnt_{hcASjF4}qvTwTrP3~Z52 zH{tac&=|ZEDC(*%y717n%}d#}Va~efdsspkDY`Pw2Ltqiff>an4i2Q6PjwlFKGwK& zGmX;p18^YbvN0#2Pjq&UB{?adYE`Jq8ZN*EVgK^wR?`hM_R>Zo!<}cgr z$2u9K9PD*3_AW^Zl2);&^i;P+pCAOTRf~OU8(h3!;jc5u1>0>{`Zsr0UyE~437gfh_VniOz0a8jtFHdt*w#0@p0d18cw-;nfKCHg|tyNvD2)pR%Ml?Le25 zxok)Ff)R3iz@AG94**GrFnNF>3wB11fo~9~;bVbH69tMlD6ZXl=qm_mgD7FB z2$#K&fcsY;aohw@plUKt7l0ae*ad)Kl0rmT==Zldz`0s}2nS`pQ0%yBGqErQ_J8=` z2D}K3gZWURLNRm{q^qL-DjG$OKpi`ac}El@%em_lLa>`lqG=xQgtR0T*N2=O;6un6fd@uk z8*;jGQ@xC{lfx!UB!* z#bY?w@>bbws!g9xkp=)X;(x9y5-v8@has}&Hg z0QuU3kw6iDTe8WbrKN+D!a&->}$Sqi- z%@d`N7M8zPcAm39$IkNz`W*9MIJPfoG>_!6)_ zc^7SkAghJSqpd(ois< zCT&V|JdQJ#YnoNB9j;N@IWdw5sPUn^C44x(5N=?~zlM)07nkuM0Tcl@li^Vl0x>m{ zpnfWUT1%Is#ueW8ui#{b&auk%et73`k`w#Hagy#$j>ii|pdK6v6hN8o{`I-_00}in zYIiBgVg>}oz0`ev_oF{N+qKkBj7Suv2uqVZBPDnyHM%as_QYWkJ-Os<^B!_!HBp9^m zcl0Ko}kCE?|1Pg>2OP2OMm5Ay+j1e&`iua^3$QXW=_hP6G-W#dy>It1T__dCs z)DWa8A1iHlS>rc*5;cq?CizL!tePV0g5yId1ObOwc=Fd*_09&@^Kn%1SMkHbGc&=% z6jG)S9vL%uq|%6xIH@m{LIz}c#r5ugc|xmH2x}Hct-?qUGgdpq?1>wxM$(BpapPi1 z(yW8L9eeZGYka5$Gg&|9HTVI}x&I_&X1qjw?!VFuKe-4KmGLQAAkD&S3$(S3%A2@m4$T{!>TlYh|J56n8?+B z<9uu}D3nvKES^9j)HZMqEXF##ADn>l{!;CatGa5tX20qXBr}ug_np6L{q!3k_QYVY|m2{Mdqp*Tz_}|p>!sd; z=lfA6Yb{(Ze2zgX6Bub-{qB*{Uz>89H9=Za@4K=p+6mcHZU!-M`(idyz#xQ>L{J7h zG4IMo%52-#P8R8Z$%C`msOaGR8fvYO>957A`(_$T+Bs8MP(TnTQL&`J1R3ZzF|eeS zr9|kz7AISXJT-yaX_>}RZD0vR_DJ;^yIV9uP7vh?(T`@gL$$gzR&zi@l-~mEb7kD} z7!I}b$KlDWEQw!7?rF|& zL}et+S|NqWiRLM)%osOW$52W!bHIC~^gLC@ZbX&MMG%CH6i9M9uCwmlu&Ljdc`#xl37j?}0f3EPfrkDh5s6bi2WhH!(H z#0f`6ManLJkfl@zH;A9vreycSK}HPa6s99>Yv{4^3w7@bmcxHUuyJj_GN^t+YsTQW za4Y)p=Jkh$arArA(vDHHWmEvNQ8(eSn4w6UIIYdflE$3Yl~W>1Bf(T0#ei82ICrFY zx{7junUQvD6wKT7MCsci>va{KD2V?4*)n>ly_c|mkwMgQ1@S*QFlD)@IF-W6lJqL} zI*QtWjYewUh>a#(dG>3=k)Qeh3OX^ak>YWEXTW6-s+9nH5a{D)yoYqW#BHlD2+-<)^-s!THvY=y|z*E~`g>ZN0BnohN$X zSD=JTFSclckTTq!Ni=FK^Ei~R`+eCJ_cQQ;Q;9egkk|ql^S(;L?NlI%lckIr7|(V2 zIOSUn1#j@zE?e0>{&N8+9kK`9A;5%xFV;m9>~A39#h6WXZ0-R`@}8ZCOON|9FJ5tf zYYX=|+x<8wlvZIFed_QyWOLDfI_YAT(Y@bZH7&LX|nM7qiE*-$U`^+^ahBFLUo6KaV+RMg?>YIyv)VViLvagoVB3; zf~fn!pPwE4|I0CJISCet|Fg14PsFW%V#Vz0|2$^x?pY+Z&K?P77yIUT@VaEd^9}fb z1FtY62e5FPzd9ih+myyZ?p7A2`ql2Ik$V))0lAMfZviw~SUY8Sfi%(A7oOkZ!coh$ zWQ_d-(vAJ3?Ow`{a040Fg}zDzfDrq~4ger@*a*kH_5K40SykN%Wo~41baG{v8GQi^ zmvQI=6ahJxAu$3ff6ZD;bK5o$zWZ13R%#}K@dlV<(q__3J?X>krOAPoXq&Mlx+E2+ z{q@}iK#Fwfm}=m(Gnyd?0=vL|`z>}UzBoTQeI<0lD9LEXlJm>NaQJaTb(Wm3liyRu z2q$Lo{`}49D>)h|CDBwT)Q?+TSDS6M#(^i_ouB-1!r%!_e^|nlA;JnLm1~=teUy zHf{ZrkJttUizQ3T1xx*OnO2wn`ODXDe>i*lEeQq!^^9anac@mni_i+JnSoV#?_I)= z)_gcxfY0=<_42w{-Au_uW6B=hvkF$h()E5*JYOsof2HYdT>`)?ZBJKt0Wo;Ffni34 zZ9*fg+TT2o2hho(>Q$ArhIQ>kQ5QN!@J&XhjLFfS$+ya;wx3E}B%AJRDleRgU z8v&9O(5m)rxhuk5d!4soFv5eIgc&!!E8ngCC}#?fB=)<_WB)tKq=(htU*t`>@?+2x zN(WQ8e;yFw1_g^f!~G;M23*M_7wrm+0&I5f_+vtoPu{Pgth?vCurrX^Puc78nd zat;!_1qRCxPW*H6$G)tKK@6C1X$|8|&&yxia#OZ{J{oHVUhOq683ld^8kx?1Ki1_o zf3N=x5h?h12-n zh9fb?-UL--{?;@xwnyAWF@;eKLkva_e=a4kY_-|1%iWdVX@h~IY0FjP@9|*6>r0&T z`Ypr-jCbEO-g~*^Br|Hv{tF+7u5(AbvZ}owBRw6xH_OrmCfCPQbsNsuYVS=Ro>ld_ zsNK5oZd(7iupLk z$NUGt#nhU00Z~Oomu5s55eHq6#kxfG5p-jy?a&>nT^GAaa5?7E=6?w;oOaSa33a8_ z#3~yFT$H6j)*%)8r&b8x6e__ee`*aR;4B-f4T#L7uFuyV0N2NF8T{oQ-Xf%MgSiL9 zML=A7#Nq7t)ZGq27e{~|mC;gzF(i)zI>>_dEYM@9?LZ%@^|0`%EEM*eu>tCe^{8uK zLFnv&I&?YI;o6}N%^r0adRb%9yY)A@f8GNRZ3jGDd#bxOqHa9ua36Aaf1d_p`77>~ zPM9%FzHWhF#=Fg|tNq1h@{l?tKJ}!p2w*~AGGA^gzn0HN!$Zm7R;-vW;!PKfekq_# zUH{jqJ9rXNnnm$zlqEFp6o=A%@}!EQHk?#rwX;)q3}&wAceTHDFE}2q;hFpk+_uQveJF0a1L)C}O3a$E*MQsPsQ0;LLP1EPg;EBs1xMV6$HH)&060;Z- zLv07oP%Rt|x0|A!e^bqVod!7%`VISND|i-W8=42q$) zgJ`JsNQkB>)CoBbm#C4AWpE1cI0ZAxGJICS97S!wWu&&*Uo?}j99!IYIsM-^hd-(7 z{xb;U|DYbe?-S`&>7R5TRph%X_lNV>j)}~G0co776=iX%f9DV`irNm?q1xkseV{t( zL6!auoBO97Kdl(yY7e-|F|PJs;To5)3WmqY;Zc;%*et$A(AuFo)Ow2_ZA@hG9GkPr zir;@2|NV#QzW+E-H{bOP9a2~hpne!gxH0-k_z9JYFmXOIKv~SFS^SKlwnK8H_6Q_B zJ58671a?k+B*k+dMVU?oVnoqrI4nJY3CqAQ|B|IJgo?0C$vV^g4f=hOaF-E%0Th?< zTmcgUGBGljK_mhxf6ZD;liM~DzR$1FQB!3hct28=gJWm6HWgRA<;f||ftDx_Ya~&j zsEjASe!BsXA|)sz+fcG6id3^3_`ZGt;P-bo-~3Ce38TbO$0m2niM2#HH8GqMs@>#n zG5K}+o-=y;+ue^KtB11i(;7RWL27uol+*bwH&YnsEw|H$+nEqzT5Rwtr{$_zSDT`} zWz(vT&)TLee}mL}s%VfD(`tiS+VW%Bga?11x^mvu4T!PG(TL9(!}&8cnZZ@SH6x?i zIpUPa!YJx8N=9g#Dj=I=G>h5D=-BLMF^Ypk_}jo($5F>-q*C-$$`dN>flB#LQ)vv* zB2RFlE-7M^G-Z*pstuu5wshgx80l7nTGRsw6q`Z<_hy&e8oy`EkNMg9ViaQBGD9w}s z1SD#De^~~|VYYLpq1hc|^IdsqGCy&q`1-}Zlnj2R0S+74(plL8aqTh%KRlD5>k_td znC;janhkLCFV5GWOV_iZFR1uG3w>8SJ?EMJfV-e80fmdnX;IT&NMQ+C^yN- zA0vIvmBQP>lWu2h>KpSfjDJduz6xXDp;Yrce~f9UuKJ?z&tkS?Y-rYF&c8TW4=MZl z;1`5h{(SHo;+(r60mxhlKsloIRcgNiS1{7#aVNMc86)xIcAxSlMugINtZHb893NZV zwMDzTH2%Xf&P-$9`0uyB#BLIoaUWxK0fp7Bt>#fH7-9_8po+&PpApHi&O5?b90Ul+ ze;^G3Gmr+qIgH^I5L50Ro>FR+fKuB#*qa)L!lsM;s)T_nN)IK^sDmDVxAbWXvKFo; zt3Sh9^c0SnV?aJS6hx$p4s~}AD!KN!tc&I;+%)yRtv2N@+!eS6ieklT6@Ik$;N0O+ zxa@bhwDoV7zwfK2d%LZ}wQd$=^8$Vwe*=r>V)gWA>F+GuErQ6h2s0>0io1#X-%smx z2@yZX`2kilhJMiP(147c*1M{$!s;5};g~Hj4{WM7-p7>T0TN^HVvv5Q={R_q01@m_ z#s&)ogZKuMF)Q9B>}kRwIn542m@i)7L{z{He`kac z3l8Yit2pt*hzx_`r1}wkN=**@`QWVIr6GcB-fQ`gQi5%sz7Qe(EJEfKps}74gi&h0SUfZt%Y@%nX)Nf<^P zkD0!F^Ey1~|9bWFPcPrVG~@Ga5qCQkxaP-lhwyNR@H_kMj!x@kcyMmkToOk68vbs-Et^ff05u5~foIVJgmXzKgamI7f8GAuqG_u$ zNmW5tLsK{+QIe{FAC4W7`r+?SjWPz5bXdO^e5a#&{Vf^dHgb$F&%KuBW2)_ zuRKGq!_DC(jV~cP)OzPl0YDXT+@ASu_i3S-3J`WQ}}(BQ>a$@ zA_@d#36&TD2?&A{63)1)TW#28((;ApwZtk;vJG2?uU#RhBkP zI6%Sb&Z~WSJ-50(>WF+{?l!d--C0G@&>u$PeG``kkx>nO z?NxRLgmjQ(GI=EE5?#i^&g9}HdT3+Jv>YwwRuG{@^wZtbt}WN+yi-KfWklU{s9Qw+ z#c&OoXaxA7N&1v-Z@982^+O!j56n29*GwcAfz}YH=~v;J8^VRl!!_ulvfJ7_M|LXt z{4HD$_lA$jwuEv1e=OnVs|m-QRH{!H$MOV?xsl@n^X}06{euOH`y;kIyUwVK3wctY zjtpB#FaWbyhSQf{?n(o-_BSYng%{bZL5V z@aM4H1^>{p?{smO@4_SJK^NTbJtuiiwrMgPc3*=U++(qsA`|PIb%QqT?7qDC!rC3H za8vGg{TAyZf4*2Z4^W!tW!kr`BT}hrEEbqQJ<8+S=xENwvRnF(e=clu{jOv@*a!>% zbDtBP!AJPKbp`)ocvhqG_!sKZsyiU8ALsRIUhg-_4SQ(D4A&=L(#`M-ob4@xa4V1C z3TgQ98_>F6$9#+G{l`|j*dQ*`+mDtg(;NFKF&qO4Tv|Vqf2kwxDlyLd2}hnIKfDSV zeY99FQtc_MGb}s5GcX98GQS3L18z$cyN^4g&3!l2R^<-KNgB`Spq|ch}r5+qAr1 z2_cqEvE7%&rs&>*XIs_9A8A`uI}*-6!fIs`B9&UKKpMr=f1F_HBq2tLS-?VGO35Cq z$flYRq4YGJV|!-N(ye3Lwr$&H$41AtpV+o-+crDy*h$B>PxjvDz19y{U)HQOt7?pU z@O4>9%MFfoafG?*9D9mMdTa*goSd-!c1kP2Ic)5i?GbQWzKZLv{g@K4-RRzaO*{LO zRQiQ(AykLx2jANvKcXo$74f@=!;T~nyHIE&fT-3_n7ttq{PSGv(H?GZaJmSvD<1NQ zn_@h=eTBC#iuNANU2BH3906QbC0yvL|ReujJD}ckQiceHYEj zvjA-;nmj*8|IiWU5!hLafoNEAH=eB_i|7u&o(~opVS&Btm)T#SzN5qy^-Rp4ovwEV zAwxov7I?U)?choSA(u@E z20O~5vfDDscKu&Y39vzVcJe*~1w<-9qM>vbdQUER9n|f9DHE|GgjiDEue@>pih1-G z%gXkn3lWNrSr`js2YSgAC=|mBi)>C@?{ua0%UAuBiaC-*hiHGES>9iHO)prPi7W%c z&y8~1$o`fQ{IWlG6>$Ufhkdr#HkeEOOUN9a*Oh|K6 zRS}Rg`(7=Mwbdx8J_CP?|1JF=3qut@F2gDS4fN<6_hJm zjpi2To9fX%>#jeJ%cwUW%-UJaJSUS2ZfJKMFlt0oOo0ct89*cY+VcbR)L3vllo<#s zeN-$Tfp|T3f6;tXV}ubX@tzj^onZdebM}{isOWTefAt1m7^-A%#hMKeBKchsgWK)@ z2Rim|z=AzeMP^}uv-ey}4)sHv}zPNA_@a9_r^-uBCi9{S%ss<37{!cU!? zZ#Sy5%|1D)KWu2&fjOj}Ab}I%hgfLD0t&+*Hb9!!hu>CFjTS{0;9^{;M%N?H`oV~< zS3x)goYm-BSEAs%pifT#tm-JyEJWKwsL7%$@}wzVI#pfY#lgjXn41IhN{c1&bczS8 zHoNVRPVq?LgNe_EfwF%# z+j5D0wb_E|`m%tdyls4(yk*J{;UUCmfhk>hPSkB6^1+>K*~o2Z(f9Qc6b+4wH%zK{ z;anyA?$5o0nXtI)kEt+Xb9WAj0#kpW=!n%|xrb+*vxK(>YY)9iZ}h6YewT(=e@zLr z6z5cjM6dBd$&u>Ahxj$&c`=nX#+ zDE6CWdRxH1Js;Vwk38q(H*8jchuKE?h4kZ-JG3*WMk`HTg#CiFr zHGcf!cf`#7eXu)N^z)jKvYCB0;Jm-T40g_;MHmmO50JBkRGSUrb|3CZ+nZ~mb_B1o zunhX=1ek+$%3`trdDCmHu_b`ok8Fmz9CFSEZXII))YG@!bZIU@6SQ#>^uSn=0(?nY zEW&y*$5c3}nGpoNgK%VOP?AQxn(+)Tc+=KZU*t+>@wk zwjc^PK?OD=TG%kioaptoGH+&EN-yS;F8%3fFJ{)0k?DF&)-nBQx*cQH*C9!vQtJsD zL2EvM-HqRI#n2M|?2gTuG2!lA7B|$?A7_%XRJ7yK9ub2vG;SN7A~`nZ=CJ)4Fj!t= z-~e@5C=`?S#jAgN!~d{?hY#}4)qKL^!?)#CIQ@--_UQTCCH8h=gHmtxq5n({HyLHh zx)@&BJNDh9=GALj+GceXe=F|M?L^>*l%J@(o<}5 zmX+(~eT*k_+^Lj|o%>W#QA44liK*}J@$xI4S)+K%BAHQq;o z#dQ~TT37nW`_8;PJ;Wl8@u{Ag{o)oy+|H87McM_5Ga3aI+uQwv@px3Gl9nmE5DxRN z*toKzUzb)uK;+Za=Y_b^1h5w?xrL&lXulfVE|uo|SEN0mwhLA*G$NCBi@Y7s^DqwR zMa^|{FBwNLt3mI2k7x$Oc-T9N<*2_js9|sUvvng8F26x$Wa#G8_6+{NLE{Hc&61X| z^W)EG`Oo@i9Qi-Fs2Ebr37)h475w9WO078EE-4n&Yo?xnNr<7lh=f7&ZC_W)yuE+| z@8$|oZ%9DWg%t&RPp|CrF;~n1?_~?De-@&D`?&e?Iy0nX<1kVr`1`^nJw*gRcbxM5$1yWc>rIo1ExVUpHXyK>Cb7x!TCJ-MEVs16A)6M#Z2nn=?+LvH9WIfyj(f}$H zKCz7NxGBl!?$K4wxz$rwx~qpqoK#7j1qRI5zRy??&Q~@xF&Q%hrZbPpLQGnz+Vqsb zAd?H)_@KeksqjLpI;~rW@@UX10kF$SQVwH8dw1^%LP94d^8Pm#4#4oY{pKvcGvER^ zlOVR&e@XGm?+RliF>u)>XsFtZOaXd;=%zjp^mYo*85v0LYGlxftQ`ErdZlBq2c10| zC|OCA?|+F3#ip)GJfa|B2n2&8A;IQ=IUsZjHa<%8v-0}!#*j$k02lDUCpLquMp?## zHL{J902nkjDtVjJj&7B_njlNM*Ef$b{Rj<|6rSV0Wdu3J(+s*J=qAy_mH;XE$m7IQ z(dutg?)2d4$f<(J%CL`$T}f!*(7!V?EJ0^j>N5J{`;bBiN=ICBZKiedo~{mWyS``WHo|XhB4U*4#+Thx+0MN(G?)jlfH_QaR@f~Dla5+xga9*GWc%=ZDA1Al%<-V? z8qaV;27SQ}XqS12E&%r|lS=BoLp`lJ(%3s*XdGrHh;&&DK5t(_`C5PY-l2IDlPBUa zm4hdnfab8){C$$Om-oUB@YMNzQt7|KwZYhYmQ2o}Y267-#0JO9qB^abAniXbWQ4&D zJQEVbxhvMlu!8Y3F3QT(5*e`*#}%Mf_W^UaD}l+R0$HGqtn9I2cjFwm_e^?-Tz z6SoX<-e|yG`5*Im!FypL&HAuPw&cPL2B&wkw>p7MquKnsYkJ*`xMQ{C;x(wv;6F$nESTsc<9 zu`a}EVLs!5``FymuTxATKY;I zvGyh<=Z2=6c6z8i_|<|MnJ-bV)`tb+96T}t=4QJ-SHN#IH{~2O8!y~>>JwpJcuWy; zfdUnFekuXcUOm;=#t908-C)7l7U{dLLSF?xw2V;G%JDej&+g8T$4zMqM5C`MfUrY) z!S5T8%UeuFeLejWm)9wXMce@RYonmhHGcm$P7@#ySn<&~C`23e0$n^I2#&qqYI`!f zsM7}EdVsc(LVZSG#c&xoPZCYUO%;K4CEE`D;7}(iCYp||T1<=I8*Q0Jla+RZ(Ioa$ zG|8-Y{`Oo`N(%@Xi1baWlBGl?YD+#W5VN5f4<*A-qq>*VlD1y=d1IMKb{}gj&HWW- zNl!!zfmTj9PvMR27i**#1LKWC!3AD&jn(Y_Jb-(PwXkJ*y_6^u9YUH~hGqm&wGe-Q zvP}}suL{i50gx6TtIE2zTQ_AHL+Ul^H*sjNacBYg>UcSLbIzUEWwfcM1{}t&?b>_+ z1_bu6j}xWWJG@|JnU~HEZ#)X40t1Y)UFrOU>p)6q)bagkJoHlP)XO0@{nkN++jP~p zA%ODT_2lP}Cbxhe0G(G9n1h+7UU0Y=NV;DhqjYmPSg3CXBA1!1=N1)WylyZX43%k1 zK{V%Q4-+dg3>Nj|k43NT8V2O}(dvtXG;oYUTPoVhMz(xJ@z8TFVL-HGwfJ zxs`+1pnyScgRiraFZLj;FxxH=+>F3_0QP>lMt}kMm zfTb*xqBzIfV>l2gEP?m>kv)oLz`IS{5gtX9&&qE=Qre#RDkWlL3xA@g@%=r!*{37y z1qn=D1L%x%?!OG?hDBcE=SN8@DRCb|>^eaA*J-2zU4TT{MY%J8Zxg1U#jQ-q-)Q~b zX?0%WGRS-yvE;XlKPYwZRjBCCQXV4Y;CYzz)50U0#LBQYmth4FgrQO;;G;Vrb%TARsWh?l^?|oks||9IaJbW*n9svs&;a zI8l(0vewG}rs!suHuQcyD%B#fTBs5SI#N?_FHRl&s z0r@CT3`oFiL0@nQ?0|hu2kw*mfbxD1khEJZ~zg(Vd(o2)U)A;~7#?z*cQuC+zba{QH2>D2x5 z>;_^uo7grgHYU(yy_XnN#dpzc%LquZ+&~^K#8W->cU7s2hB-2Dd%tc(10RuaQLZ!6 zWc}=|E)1NxA^>NWI4xKg^u}a)!!?>UFXQVXYD>1>N#ms!$A>_%+R(%P_HEf45;Aw9 zYi8%>rNKfps-L>eK4#!wkueUF&ZHvuA(szgxJ(iGA&J=RKXboP;ktRYdTk?!IEwm# z!BI&$G?e(6>EXt^o}(a4H3!Qltw<>wbPTy}&H@oo0)VVYiY&~pnPe-$f-?CY@5{}a zAOyPoX6g_GO#9{im*&9}XD$~36YYo*2WhDV!+4p8IEYQNCTh2uD4?Ns&8b8p9VjES z$jwf@sy_+A6pFY0`#t}k zG@bi@Q8mk2vi1iOC_hp#q=^viXs*vIGX!9YH8_p|vY;);`Y<_!X0ezErQ+1$kMTN1 zH4W8bwq#51>>-fQ5j%{o^V{X3s=lsnk5BcE@G3DH(!wcuQ}B<7;0(4-UCF)?-5;em zEI#17?uQ%h_dPqJLXD}h)>b4vb zQ?EH~qPTvN7oXaqi;iw`>UjCQE0c;8TV>OB$|_bt!F=x?aj)9}siTwDnoL;vtw`e! zpbvkL*J4OrsBEuz)>A&>iXV4~rIRY#cm4ZYY=J&F>e~HBsg9@bjc}V4G%Tf!p&|cw z6R@~TdSEqhfYN?<;F}c&Ugx~8n!#M8ayN{F&TQ=Hs+YFm6_bo9sH^{R9XN!GaVtfg zVnI$~vPkC2qHW9Q_nsqe?eVHQjFQoL@;AwjG=s`=w<20V_v3w^m+dgYE*XN<>N2fS zVScoWLh|o*;)qHRePE?&_l&yyB|99CD_|PXeu&}$O+}RBK(InbT$gGy}6xVLid z6V&;=X$FJk-d$$hRXx?_kHaLivVg%UuA`g64d2Q0p&tgVl99;Ko2{>tMb`3fxOd_a%?zD0f@hi0ZcjYbFgm23NKUed763vC zA8Dm_wes3YIA4c}=OSE$e_C9k?4ILFN<*#2_{uq)ZImFZ0=g@fy*_LK`9+qP3_0zC z&jCIzg!Xbqw4srNu*R5=I`gnfe6*TZ{H#z<$YUXkN|<5RBc}B|(fYJs_q=N*)E|M? zXQO=Bjmg4ibJkdmEZZi)Lrh-|3ScHe{ zJ!3%t_D;o>1p>;);|-*(?24KhxH}3N@5|Z}9iq07yMHIx_r=r@&E!wKg<1gPSx3=7 z7J6v=T&1?%n&tZ%slSv&kWE5>h~@YGZ!4?<-*+7S0DrB%C=Q`bJgcaU3UFy~>|W&) zhHa!G#Q?-SDnP<=7EDWEIhOS6o>F2oNvTA)u;$TvO~AG~Dod?rE9G@7cy2uxY9@&~ z-rrv5#unYsI2Q_)S|BY8c9)$!;V*S~NuQJ*LaT|&OG_}^rhEXa{9$}`=>W)pwHW9$ zF8e^YDs&Lr6Uj6$ERFne24E!u-OYinpSak?3GBx4z&Bd}6bqkxI`}*xCM4HM=W0t3 zslik5zHbVtP2!3+$bcx|7~D^XpIc5PNFEcV48L{}02t%_d6l zp1KY#A_zuHbgw%7jm1zDE-jwck$(Ponh}hHx9;1%ESV97;YBrN7C=zu4FURvx4g47 zk{KBb;6sj8)1#-Ha)6Y6&W|wg^L@7CC|Ov`XDAn$2|DSe8Hu^uxcgFSRH|tVjO0MG z*znQee4dpV70DQedweMJ$Y}_6LGi!IK5^opbq+BPk-{FwQuoWieQDfyYiWmXF^3%+ z;}Apy@ozn_0|Tka06+#b9SZ|V(h5{*Qq2bY0D=8Mf-)?M4&}$le#L`jIzCt9YxEcM zJ%w4^sJ4#e^?E`I0FNV1EHx);JXA_$3cr%1jKCCz`Nd51$?D^VL5-3K@5~s4rWw^l z^hBZKij__fgO=nqMV*r?9*GihXiPv|!G(yXOBhfX4N39!3jk~HOW@s2G(fHIP>TuG zCuF#b2Mj6*?qK*0>`ha_g((6=pk0OirOzdv>3++h8j7)-In4*RbcVwIH(zWnh9C5IyWHvk*1cb=vOu(VIYHYA}#?bAHxI^H6m(th2X5fgP7XhgVZyfSw`A!^DpuGZfVBLyua)rbU3fWaapcoWdHZMqI{h6*< zgCVI=E}HTKc7FPzKgocmq!9PYUB8r{)XZvn_I`4}Z@`ERBdFfjZm(7l4om#RIRYV_ zKk&O#iU##`5I;q0AgkTkg^4y`3>kv`5(|&1Qf(FUmy058Y9?Fm9)&D_bvp zr!~pFFJpFLDU|}eyt2&z6n0-hZ7q=2ZL;IxzGxVpqePC#MeEUJCAG+bqr9^rzhYWw zsa8P!8-VR}3_*w`+_TrQWZ~7B+Bxo268;E}c?D%Q+wa2@9Lv1U3wV9**1&ZHo`wff z(uw6so))>Uq8`{=a3ayI7nYqg%YO{?ppNo=q!*lzbX`UIY&aVK)S&<+7QMiGo&DX% zXYPjke73v7AS9PkJ@=^Ha($6F!Cl7i7z$rd9nj^wLa6ez#gsn-h%+Y zG88k*ic@jrBXM(KIDAw@Z;^c&DBKiEF=v~_p=6?p4d`jZ^HmsXwCJi=>Vbwe{?=k< z?tC!z*=&R;$2z*<*cI@ZKQzII81Ny(er|w0tQI8D2d5-tKO$7Nneja# zdK%h@hMn|!KD0KNu&=C>A(8Tky-nL}GsR}OTnc%?f@v4Udpdvyd&_UTr^~a5QQoL3N^AdgR#X#7x8Fy+14QZ%lR3*O$@aWrwv;z zzwK0-whfizXH^tLB7#=%@N9fcBV9`YQH{dqb3A&%zIMEcpZmV!IpA3X%=Q_GlL`3q`Iu4nF17wv3AOta?KIu1ZcJCV?$Y&b@WK57P6J_geZeok^=JD`unYuxZYeg52gxB96 z=b!de%@cF`$1Mh&g(!-lP8$CvD+0LFODtmqeNO?KI8tZ{7X#C=q#TH(FZ>ee>vaqx zKHZ#-5I%dw)w@EB5I1hiA{Gklp*j;K<9dV)Pkh@4<{Jk*g!>;@CfJpibiIL!{>#pJ^*GnX5<-RfWSGXktHwHsfB>hVB`WTAnNI3|Y zqO-8oP*n(amYb3AQXJB2TYk}@T(Ez-gQ|c@KZV^$6z#L~{vn(mj@L4q8SOsNuD72ty3z*S_< z8~-`RNw-1hz-(!I6Tmcp7EN3GpHuvmYd~yBXl2epFY{N27tSIHL-t3yk$EMn0TwMb zrb|AbQqFbt^+6R;OqQ9TX9F83hEdUV+;M#6@=%r4G?Mk(Vu0Kst=D9$x~6}x525~Z zyi>Yb5%oktaHm_Zd#|cTuNE|$sPV#WR#HM`@ab~2fSVDh^>_*pbA94+H7Ko8^3pL; zeGNS3estv_x)@FIING$rX>Kq}WY9ow;kW|y2Cp!NSi{Bp{;<}H();wcF#tE@Z|z!! zmTbL?ReHta-bGuJ2K!clB&ACLCOq{R+mwZ!aZ|KEA(hXA9nbUDgaMb?mKhYutTo3h zJ|Tz8zdtBo1j)Amu==9yOE=KnH^~gqIKe-J4@E#fdX`Su4=4haYd(=#$bw^zR$aTP z@gB%INaSFYz5CP6rppNobgCgZ%%f;pT#uwgVhI@uV^7c{Y43(Crz6YTlFdRa-1H8H z-R^cg*^`s*!trYlaNS=qX+Iw9yU*XEQMiE#=C1+phEx`ShEEJij~QWJ_R+%qMD`Vu zg*N(Yord9gM?~jwes2=$FFU(Iq+q^+e+Y4~aO)`}#$SY=a(ltw%v=U^+RYn*rsbw8oC*awUUb8(_@cQYQ>`jMIO0vrWr9nzJ zBEOLLc+$MMh%vx0Azc8d&O;u~f8Wf#xNc1x&D=C)b4c5fk4Act3~ z;8cOK1eVrKw)QhqtC7JC6nJ)~*$EonYOdYa4H_f@J_JS%JU^Q`=lHld)$|E(_*aJ2 zwGKsMWo~hXBcDxC(Y7!?Fk5Br;CCATq&i2^Ut5Ig9|a?4yx8I{gXY+(qEzuiESsvB zp4=+d>Y}z_AEpH|l44(}ZHAkHe`zO(l&XVDmJThy0Tn$&5ptH(U@MpvvV~2t69hci z*^9scvLVi)7-9yPtNClxI-c30s2S~O_B#rA2S7$}J95>v1VSY_$OqUYJdefVH7-Y2 zZN*f{!i4E7yU%%8M?BFKhMv1)%ZaJ<2tGWJpsA5%RB@a&BPy7NhCp`T(5b!)W%>i$ zG(db3Ow}k(%57BmUn-Z6O zXz0(YaBe>cVr~ouXk66t?|vphk2RYX&K#(#aJ0`}b#)!xLpI@4+X(|YmM{Y-tAD-C z&GHt~e_XOA)34VRvAbT5ydJOK?w*duvaB7N_w<@aG&1@5lPO(#a&1VN`z%WPUS~T2 zuoWS}pL=Ip@5{?0%TvoX@!$tB&tMJ8ouco#H`+6_--J7TU!N=IQ=s2CcFqTc0|oCZ zO+9rwee>A_!KgxHmCv%<=gD?c;<XGP6DB<6KQ~m%hgLEnYj_=CAA!)!YqNI|u4l|9<9@P&qI{@4!v(cv@$sthKKO0^E;Y^^=QsQE>6pUD zc%Ia=q$e%n=j$)I^eyIu$3G+5L8}~xVK>jsiAb%LkhQex=takgZZNdVSQL2d=1_P2 zafL&#F-#O=q#xrj4-cm@?ds0V8%vDETJL&V7R#C!P#gxr+{ibiWBaF2`IoIPsRbVk z=Y(sig?0Z;eBtCs0)|3Ot2YIq1fd1nx&hKZ?nNv~!>G)*%LhX>hElC!;KEzK0;>aXIHlUOG4pBu*>}ic!HP*u%#oI_Y5$> zn9VQQkjQ1YLK}rMsQhW)kFK7c%Cm=D?b?7) z#Pl!{Y2)A-3Vy)c$cx$xP|=MCRS9MthuPR?0WT~3wTVM+DKQc0uWYPJ!?d9J42k!g zg$t(e`nUAmA3O|Yn3+sq4W}kr1Ji@njnWBYAxBN%XsP9--+9kCb+TK82A?gn-P5<(=7ZSlqy(3j+Hz4u z-JJGu_vD$ySsPAIAd3-F>=s8~<|LRxy(V6J@6zqmD+uTtfGbcyeS`5?Wv_W{m%MDF z5IV1uxvyC~WD*=SlIXoPpcM+BF~6awD3Z?~uQSz=x=?-+D?ENetC{2K?pd9HR?}jN z`aWr@9G>qAnub#1N1B7)g@`MK(F$RyO3@FalSZKDPDdr7!=w{(J$N223?XoAK3Vr} zcXpH^u$2-CU|cvP)=&A#ehgfL;cRN7(9t}dY~E{5KBWZbzu{U=l4~8TD3>rkGnMl0(?9iyOgp)C0%syq{mkX)J9K5EDXXeoVMo8`G#zwuI59fxp(!zR)_ z^tX+-FFpSyKhDoO$;=@O1_tg_X(FMJGLiz}qFA28XmhpA;ZuUdkFTLf(+0DvippRr ztbd-yKP9_KoO^2b-MEYan@9LB zk6=3s5bEjnt@+n0C1=xT2W07_V~%|OIowKa@JrOVD& zdASt1<$IeXGw340A1zv3KQta8)MCAs8*~Sr{7EVKsN-ArEcCBCneEsW$h3u@Pw0c8 zwMS@#!p)X#4&|(E%|MbV5c0Sx7UVqn6&)p|6lB`#{8s79C2%UVyn}nX?u90ld(>&# zQq8W`e0SU?A*Q77yW={oZg5lihnGDY{OC|QXL}a-+gdyROk|2i-%Q;XaPmI?>wh~@ zuK&8I(=>g5qO4jpb$$vP+D}mFjZP9tDml5E4J3a3QDBRdilKAvI!QkH>KhjR=JhYfN5>cEm9%9{ zM-CI8or?qnSA5`MkcLFsH>G>H41a5&x_8u6w0Q10Lyma|J3_Ut*UDn*O(T#c0KS&# z24kQ*MD{MN3~GXkeY|v!h^et4+PWs)d9>xzAjQ1a@7u@y`*qzF4yAC~u^PPLt@AGm z6gt@`z&m(gGb;@CQUD&+fe6%X0jTSb<^x(x3kO*3QNqd}- zP(9{*a^)rV-~FUSiA1KeOxcVlo8U&cv6}Q#6jq3?tOpzHh#H+8-pOUbfFAR3G?WRH zLQ>;jK+$NH-Pfpz*ckFZIU--@F9te0jFRum0FVy6yUik?F!u7b4Uv=5uMsV3bOd}K zM*}Z@zU?hfQ7d(7o6F;p(jj0vo*M@`8I&S@!+q@MtG0RxAbHKJ8o zj-=t{YLx82;k|GH*U3Wk`9$;1QBdMBHlekD$hh$a*f5lUHHa!W`wEzo=jO4%$i=cZ znOBk(ax2VVd6~h=`}r8vFfz~T84Egb05;cPx)3ggc!;*W-fxl=f0+z$>UgoamuGCYJ9WA~ywiFw}2b^0`0VgMy z3jEi>p3`!eXPyDiGg4iiF<_fPNZox}z909JaDw(isxiSu7jvkKt<17i1J!c`!KVef z_FOb7d!ax5D&kG4%mZ;q6QJs*yFjjs&a7r&GC7PMDWuQV75~4aVcJf5rY9GDc54A)$T{X22B@MiM*65-h_wv zf}ot-1BLtLFI#AS(R?4BVW!}O#kf*p!}*eJqjHMy%{xk56>fvi6*}LsHC+fgftN-x zYlGNa1ykuED$hwjK;K@t44{vuN4_kIJHoLNODtE8LU2vDoEi^R?u8(t0_;d??wKuZ#Sg5X8%J&tB;#wFj3wll(9TJ1nJ8n z;PBx<#^!y1`JHt%~Ixm2P8FL2C0jb}&<)JOJ>XJ+CEXV1MoZGo%=eRR+44 ze%<3m)_hEl&#IH0vZ{7!(zXqBB1G%(!+Pl;aq#|=$TcN4tGf|lWWMix-))W~0y})vB(4`XtWG58u5Ze zmJzv36me1$HX5~7;=R*Msy+4s2@%eJfoZ#H4QMhF*(|Dqm`(^kY!NwXz=2L`qkaiTTcA&1$5oa8by(HxpC1HRnHX2za z2moBn7L1CShc3~RIKd4QG1XWYRiedzuVJbF&N#P~mHBaQApbblhW=Zc+$)+|? zL$k8?&urD_?YNE}U@PGBX~Ju>z2yto^aJ?h2Nyg#uKH{WY<~KF+rIldwpzcqzQ5-g z06N}<^FVQmC$qxQwEuCc_rZBg@e@E+>Rq?lyA!sL$e#WSuw;2jj(i8i|GNs z$Td^fxv2$6`Veg@Om0HCT9)yys-q@}LX8{>q5k46Iou%+8FFTFhKN8*Bs6=f|E~C3?eG) zvPU|-7o0hZdg*A~pATOcsisg%dQVQ93){Ypb_0*J~Pub?gL#i&d6+c~+-sQI7JA%^5K2 zRFv1$bq>p)NSklx^2PSO1>3EU^|ELLnxkvvOmM*LAeR@T%$fzuB;jCuy-4X&HP&}B z#sqbN{Z@hTpzNFw(5ep%c^+KT^fv+-;T@*@5DTX^^Y!?w*vR3D+ftv^m~9k=wTVSI z9V+PJ>fqyE^z&_G%@LCWH-;T)pAev_nUk~Bwo}!0%Z}lo?0$zXt1980#s=PD+`#Nq zK`3k;?;f;%hlL_na40p#Ud`WQFw38r|JJ*MP>CskO}XliVKc9P5`qd~N%!gzK2a2P zww5b_7Wu=ynubWDK6E>0l(8|jq^_1gKXCgCvK+(b7)}g%4T?_tV80%U2nitVJq{_F z&Cm4s8)xPn;do8D>v|%voX2!lW(h7p%V$vtoC{i*xCPc!{CdyoWzCO;=81>o3vB^li=L(5ItiUu$c4g8fIV^*1k zS2BXxiZSBYI&5rt63?RJklc=4T6R)$C<1lu_`8xz?zv>+C z*HuR?Z;>dJVu@`l|7fpo@#Ns;Pj#qEZVzpT=UJNhXR$ISE6Nlrvt>lhOQ((hgsb8v zHS+Yzwtb8mgLzTqU!5aMt|qXxv%O`I2jdNlym2@uU$r9=dBYW9)(RW7^(>NLv#?H2 zDvLjE>?lfwmJWcTHc#8x#J{3d?EGlC3g&!B(Hf7uo((aYKIkfYg2`LlAG#{snp>a{p60@jH=7`3dOmYd> z$y!y|XOlm*awD+lz3{&3IQH}K%folAg-B&)%NfWwpXM79Xqz_rp60rClegZ*VqNjz zakRX~@!?EG1yeR`LiUMM znFfc}5H<5W-zq@F&MoKMb`XfoQ7-~}lPV;jdJ@w4Jc;^DFC)T{3BV4EP43-nRN zn*si=PwM`A@f>l)=@Meq%y^f+@@mZyDYic+&NKRbE78!Hn9opG*5>&GU5Exj<)X$qpXztBZVGT&kR?ZmX`Td3tUfd zvMKvFHlr}ILr6{(EI8V&?5`xXSipu{UeAagzj{MBwb8qP-m$4o>npDMB+OE>)n9-c zqnnL7gV?h850Nqc`rJdv!%6Gut~p|DaGp<;ZeqYo97BcfB1EjZzm}y3BZ~n49msVN zDXe?W{Vj>Ll@|t9P2p$51g%f`I(_O(@+@`By`LghDUGuRjL8Of8))KQMTeOYkwB7) z!Jf5O%BA+IynU=dJHiAPhcxz83Iiar#wbIV{A>AX%~H*`W!Wll)yR4o*R#!7d1>d) zsf>Rm9>XmgYlMI7zLo4pffwnHG%#-s|T(jr^nn>v}eA>vDG!;6p{Ig1}tN&#zN z*QP-q9F0vpcfE2Y4!I3{m7t;nRuEH+khe;=$`;s}tO#B$l;@j9$f`y0a@vMHL9r)R%)2FYMm~RAr^32>o$nvXvxGLvEp9*a7~lw?qI5)HVBZV;sNUH)4x`L{E1zK zW8r(i2Rs^s1&^E;TX>YpWuo~JSu``#9PfQ_Dtgn=a>N+mcD_S%?Dpca1>DlV?VXEh z)n}$yrMM|Gz3f~G(!7@+c}5o*dN(g(HaoG@N-{`v?+TyI=8US5)Dy=B;PcYJ!>vT<^Wr({q&wySpanpHno)lkK8WkJ!APh@9sx3bPjmMeY$6hZ0z$NeW@zaga zp0LT)-mj;udo&a>TM2O(?F%_F1W$5P%_&g*)dhC<)2Qq#U5qPFx zf+93&<2}sL#3ue%n@x;S26(gB5WT$jW$4AhXaK~F> zv7Ok0unKq&82!Wnj2}@SQDS0BKHOqtm=R_?2QD;fZ-i!O?Bb57i&#RTM_)xTAiV&y z{pd;l{*n{lJJ&s#b3`yc3`k)?BNL9yEOF`<@c@X+@+whi8YxZgn;OaZQ$@fJ>E{#q zo0cliYN>M_qa7j+w8nTV5zaU@Q{00rwdrCJKPJ@R{B~Lp{m0AZ57PVaDpBZm(l;ue zyechTR0_$&zkJ*a*jgfAF#Ep_`Mt8Z7tXd9!XwDUQ?XehM8Hsbl~$}K*_3pnDW1~K z7<5qfIjI^6XmTLF_3w@@MNUpoS(A%oG^2kJ6IGakb!Pk0swg))BN+~!;8A6Ic|G&J zg+xHdJYAB5fJpq~EbmJfmQcDRD*l4M05+N*eLOtOaSm6IzlbN9%(Z16fPal%5&zww zlChUvvRzN;!Y03mgw2b$D&0VBGCK_xLcU?T;lUF7d~nuremdWKX{x{OZknQ2FrxFx zsJSv%NLeBsPy99-b&mX+dBSww{aT;XQ|H%R{Sy0$?-Q5J!!16=?OKecqw!9`<7 zBeK#Qs_g#Y5_X^(C7<{pfHfcLjHF4qGfFs>+RP?}7Si{=OmWfsEFQBZjh+6d^sS-N z*~XAu*IFYca~AAVENIiZJMH|P#EARt+GEvQB-CfFTOJX6~+~ps3fM;diw)5`ETJ`d@ zly{vSK=0GY*!L{U$*z*s0N5|tH{5k-#i?-6#GyNJrfzUkV5f^$TM04vcdRUHAm*cz=RYZO8R;VKco)KT~bRgWXMK~7NuzrWapcv!~}fSg>ufNX`^CPS!@ol94XrCMOQMoZQgpp1jJCgazJeWQ90qWJc= z_UtW2P*Hbt=2A7n0sGk2*6x>$Ijmz2E$J59A^)ItdqHuQHgfq6O7cj>>d*$Wmg=vS z_)S!yQ7OWBj57r0R#+?71SNR*kb~#C#`juM{ccfTQk#h2;%Bo`S3p7}UHZ+`(~L%) z3@n~=@v2cgU`Uf)Ya5~#*kn?G9BkNIB|t+E+5e2?N&y_4p{^$lW6W{@HU(+l4Sskf zd#^UDPyj5c1mURUPCPY1i|a^;eRy;TEl3Vs8_T9$o0^ZCU)GO-K~ zx{Doaeqc;C5OU~rGO==SM5yN_$Mb(z>VFY-%xwRMu51jvykSQd_+N-~YL0{>jw=iXJ|eA&I&e#pg)EJffryi1XJm%e-BjFGGg(u)`N z`4Tgme_He}<)+vQ{~h|dnGH}0FeO(J@$ z{qB0w&S^lHeec54K_k0tbE@$$S7Y)N9h?{H#f_N>94#6<6kl0?HFUW8(er)M-empa z=EU3ev*LfVECd>S_bb0~aS&GjKL89bTUTklZ874hgfqxd83;bI@- z%zOFDwHY!82hm4@06Z+G66AzMzk)bf4G@8ar;|Q^lTN~BG63^8 zo%#)r6f1vzfW!#;z;lg9=VL@My+QY#4^kB7!N>Yg+5W`rIQ;q3;PTp}Hx*{{qv#lA zh}Y<22Dyu^KFOdO%RrTCSzX=DI=`kGOp_Q;qa-98DE^Q%%LzEAYWp zg!m$GAACR~xyvF8k9bPdjRQ3`%%1JsKe?Hv6t}>=346$*EL7Zo_1BsM4*_yG*1(ld z+)D^s*@LaZC3b*p&|?abV39$ZtK_cK>`35~yRkPTRVX+DOGR-f9{&jNLbIInaR~Zs zc_H3CV9bx4JnOz-(=VISQAA44bQE*PN}sUZM+xXI9l0HB@oBkwQsHF;nQ8K^qe|>oETaSW+!*E)p?zBy&EYT`A7%cSL4ATg zjY+vUx86{DaGu#dh1Yq8b`iNWq!l|6f0}+tfWL{!$EXyqb<0sc!2lMCpJ>Vd+^FTM zMqg9>kUb z!e3c+%9m%P-f1skGy|;BxA<%(6ewXZA1XeXH_uwBsO@-HvXPY1TuU4{0bhO=3y|eX z{1s7Zp5(&Blsfh~mOeI1iA^egzgriINv!9_{k1kEaZ13H{`UlCnok1@HS#-!DJ@dx zfGM2+J9K`=qqeqg+$x;V}hQPSynMYbAoukVgUpz-VE;%0Fb6u`Pl+JY1rPa|MKTOKJzws>!s6^V zvV4!;Zs`4>CVP?SgYBiPY2@_5`~+z};>+~^cztCbHtT{4SMYNRKHEJeMbQHaoH%04 zDDlGMrFH=s0M{_EBps-0uNJS6>JNrKKgTr2rANT+-3kUQl~6k7#)l4=I`x3o2ZA=o zo?b~u&)OgXj4gA>0EDf_jo1?V|5xKUOhbWcQi@Gy|-dY#KwA|Ip;%6Z&?oO3xD zMs8(DZ>2nKfA^tQ2yFrG)HmP(3j;SYElBrV+)sr&+CW4l;}=yMoXZ??JnRQ}RZAeZ z07O-B>ohCF-?#eyapn@-;*(=(C zNxl|z1NurLi4P!nRO>XejD8ifA!SU`BG24Sj{xElqC}f`Fs^W`zn1{|Lflu5frl*V zjLc2{4Wj4G7-eum0`%b`6_jhZXt01l$aAe54!n}g2CH1~{4+*XB;AmP&5#O<6HsLP z2$wjNx_9_C0{vzXYGGUnVo2E3#AvvrqV3)gM|@9Bn4qK@^t_a;nybI{cJ?@-8tl|h zESU)0>A}}3>cY-qcJqK6M06Ms(K8C0xD`&|Vs_r*OlbT=3`v_wEBEE&QoBk^CHZNT zCD#=hPB+W4QLeL8V%nU>IXa76UoBH7CI-i33XmDmgNV@aBssy>8160HOB6et#GETbIv>8SYd`&? z)>6)8pP1cO@67<5G}c>lnvFUXF(tgUEE~a3^_8EjCSM&}j+{W6rhUZKO?zE-Y)j+37#Xw;?kdo#;9KYT#+ac#3T>! zx*B8N6usD+CG`6MRkL>agms{FI*i;g50<)79ZrhKzVchsoO^9T_vwqZ`@^*lVpX>} zE>~-k$vUno7Q0VzfTwN$|zZ!GHc07|(;(LlMUzX%r;BbV+!Oq9U!^^_t6Vq?NP zzz>}Ge1Gk?p(in`ZNH&OCd%>gWuMrTx*R})`(DB}&!&Bzm3SztnBz=XEegfZ*;(p7 z+Sb(du|AB?DB&);*@G`2cT;U_okCBFxa&0!i1U|a$j!M;Bym+2=Xe^*q!8WoYz}?F z)RR|7s~mf=Nd#g1F2=Yld)iYX|JuUdZQ21M)0Na@Hx*@VV+()^^69c{TceeW$Gp?; z_M~ommt9EVM0+1u!~CcE)a_?>iEr=IwtI+(y@Jr?Vnb-+-bK%a{43${t=^=m2=meb zjO8kc=0SvQ&a17faql3qRBCnDEfS#|qa(t36eBA_%uWpdt(UO8M*)ITVWde~2=1e{ zqnYuglxhqt40%oB^5AX4U(=ti84FtIb1Isse2so=#LXj6vGl!5x4VNI@MT zChUTR!~^9D1bR4$VnMliC z$)C=s)Cb@XH-sI-&K)Cv`kxe8wI&W{&K7WH145=1fjZ8Et+sh4D|FG{v)%&D!5?1Z zPGL13>SFhGd-ACydb?y;IDwe2&B+@t=f)eEnp4QB?QA)XLds$s965=^8?iRL8?NKkiu&dZ4+B?y{Ro9Dm5!N zK2=t1$IUH;qLLC8QM3Ycoa?-@K;3z;vkM)QV_7o^Gv-#30z6f_!7he|2W>~3C^JP~ zsP8_HEei?ohb}JmP(@7W-hfJi0w>po^qchq9uW|MkLvF7u}F3l2DlE_w94O8Z}#9% z`JC)zCjrKlZ;F|}Cw*0uIy*_KUGim_g%2Fv0p$%uhVRL-*|; z2*Gu@KF%qsp5Bqx1tUL}&)P^RT*t^=L;#_EZLR(6#6sJB9mZ4mn2)s-{(-ECTF;Ru z8>~iDW0AefkEIWDCw~vFo}8T>qkzG#LaiboFIsR%FFQ9*>9Ss9it4^1%xZVIiHSuc zPcJ8y;`GI^9m9R&(!j5?Q>dX0F)BYjxXQF67TUGAsg+3XDQZcxRtVXP8pj$?!R{ z4acrYVwLQ5ZRDJ@kT}Mk(r)8m6+lfxBEcMKGBSNhH0pkPOZa(HRQYwCPiCWOjG z(vx*Fq_U73YjU>){CQhir|Yx(%Vq==68!5*6yU42QxYI<}|1c!-wG8b6v zp#AN)qYU)%)e1b=E>RHu`G;7iQ{5NpG&x>pGs8`$zmVA9M)Rq3Nwt#N#6SyYgY~$- z9+mjnMc$4$qArtMTEhTMUVygY9x>AJKMt5aRC?5Ce?&xIh1;s+C`_;Ok*m})sGPnh;h5MY#S`w88mD~@27 zq|qpyj_wLKjkX7)x}a7bBO%&o-WA}K1|+m=2!M1}kxakb3Y<~c!fXy>&A zNhSE*vEwC{3to2O67pReVZ5*^Kc8 z+sWlJ2X-UORkX|tFhMYDmne>Eg&>PVgWNf>7=8N~IG){{Em) zK6cZvm)1IQf`CEF=t;X{q>N4@=ez#7lfCs!(CopORY5QkuB}Qg=eAm+dpNhb9no%!dB?{lkjtKF2ILIRUq#l@lNTJ*&jATzYCn4xHC^s~9e!Y3Qsgt` zp`{TXz{eZKNo6frhE|8*WO0+~b}WyKRDYYdjsDK^`Rs-(V#4vP8Tdj(E*)3$ooDT^ zv4#vTJ#Ebdsh{T1%n?Mn&7u2M%BXWHe585+pIx7($LcUD3mLdzX1%VG`5WK13SM6g zLZRLKniksr2o%mJ{dH@OwO>0K&p=HC^%x}*NJ`O`&pzdp46SmdWhDIT5HvF!@o(T6 zNH}n5CJWzOI@LB0(GQ4$7-_dX<#U{e~~|7G7##tm@;4}z&|aeK5SiQ=Facj zALNqUI?`@i36W|ZJ-})zMp@g5+)VoU(p^fX(M+`!^}`ZNX&FU4_v4s%`tSYv8~7SB z@i>%l(LJ3C+P89WNyO;V*`YrZSy{orQ zhhyeRQoBs6wkq6a10S@t4AX%_{?I!IW3Shg3%wL~q859pCl4NUbWZjVGAStKRX8I zVSs5y`eR%0nDys_#DMO>=JARortcMP)_PRxY1TJvi{X5>y*XS z38IDrOD4Q7PeggR&?s@BD#JjhK~pwREF zL%FrcR|TsW#vVX2%w}m()7?0b=t#9)y&g)0oPiZxhi{8+%sJ8Iq_5G!$Dwv*{}1O4 z5vw+lRtyzcQV@*1bmyGWMvtbZ5#-u*E*%~(mfdQqtA0joqG6hUq>}ap>_s|@&7~>C z#zN)+z>i6*>fC9;N%q^|p<#&pW94hWLm&`J*K-r4I8FmY zJRErc$g)Gk%3 zV9ej1y>dE~sA}1N<743V9Dc(SHY3qhXJSejtrEk;QQq8WG089mtVYD5rM<>DC;^}X z$WOj|xZ;P&mdeW(b&)$i+8{#~L2%GkuELZlb>(j69ND%vf!-$|IIbFnQmTWJfsH@N04b>8qU?^m_Al-C^DH8>St zg4MmG2#fw&?rMw)Vgi;^0G9#{5d+Nz?8Jnca&|&(%*1P5ejs1xfL7lA>HJvR?I7gbD6!$0bA-07{o3 zcF=IMmIZ|Dyhec6MABDrl2N4>z0wkOKOk=@Yj4;Mb_d5F3%xjddhz;}O{=7sl{9^t zilIX|2Wr!@wnt_I|LCN^YvUe!@-9}yorZDpS2g+sZz~@-?h0$>ht#>_4Zr|c*3C6V z*n7OUGx_~%n-NtIqR!{_;Hj$((AVqj`Sh@zH@Dkc35~gJf6EB?0Pn@;f4D4?_#T`2 z5c)@g6C}$z2wuz(9vPOv=lvX-2F2RJ-U&N# zIx=l+a@A_ABK*-XA!FL)RUUMZa|N2vnMCbByV-Y+DHd%a3{cq0&MWc66A5OD0J#BQ z;q~anlv~g7HouI)g+vsUi4!T6PC>p(P2;+-vcM6@7S{;rGb zt0dQMC+pf4rzG83t!BW-PHxy@obSsaNa+pQawd+IG8BLrRT3t3rmYuCVLXvLBJDso zga0)VwdPhkExDm?^)pn-BRv;N0<3b@wNjyn`X^2;;WA2ZE(eDBWFfiZ)klK!7 zIm+B$d1YWD2r87jtv```xDJ9Dxx9ZoxzFud2v8&^Dpj%IjGwqaS?Mvx-yJ+XjeNjD z@Uod;15{(Rs`yoFZ8;1KKHqs~FzVm*BqAI*KK7*7GKeW*3JOY1#h`gk@DcGlQ zB#!f!SpJS!`sI}qfb2}Oq<}(MIBN#Jh_2bQ3HZip22x;!Kv66HjG?*xiq36w2K_*uH6t`>xM2epK?+MVl0?R z)zq=i^h6$QCzK$(iKIXXit*E$JIyMk#-LQ!PeF%ab|V8@8!X?bwvRkn5V@jmS{2_s z0klyivyP|epM{$jLnYNB?0!JFDscbX3;e8_6k-0ky4 zrx0ha<6KGJl-6WR(9{p<^X^Nc4wjsnXw&;MYkb`+~qt_sajHEt77>58%c! zFMe(<_%r(fC3(hO2df5bI--X>ii^fbW zQ%TJdO^pCEGkdpmax4LqMY7gLjByf12lkVjrcWP6XzCR#*}DH6nF zb;J|5SADz0Mq_kH^yq$wQBxCI7~t>Cv?W0q;Kh1^rz{tQioY*sqnw=sJc7<1EbEAY zCaJGBN#yAWYSt<>*iI4Kz>n1jO%w~br|PBpyV*IZX{5n8^m3tPo`~>Ce8ugchXeWk zq_LcpMez1MicO!zY$gIg5Q}*Bs&2ax6_S~>ieDP)FB&1kFJaobsi4Q31jHy!608oU zkZjugu07>Qt`4NO4qp%rW1DTZAlead4w<(GtV8($}C1l&o~kn&=l;^4wijzf;`J z?9F%32JSXX$GZx#@z7ol0hTD0VkqDtT}#qYFIjt7q2}pgtclTDu0S}4IQ+mkX~GRa zaAjt?H%nM!FY?Tcn-=)E3O$g%>mZr7hsfM`G-UnmUQl!=+(a2*SbnT6 z#wdm3v0}*ilD4?_D^+S(9b}>R0Jx%tbEeTG|05tV-J4Me(P&5|z!0C41NiA&FGTxd z1BAnR84tqho2|NAmN+t1{m1nc;s^+oE)h?g5x*W9ULfOH{Aitu`alGjODviIdctme zr1Bh1q-7xv@#W`lmdo^htB>hw*`R`Dhf9_)t?@bkkiosR9B|kKO+bO|k2)2agAkiW zE+|aM0a&NR_>+1L;8ssciJhjSrHyXHHz=G8_Qp;GCGJYn+2c@6GEhz&plw{d2q(h4y%Ag2-}Xmj`rb$8xyBzdxq ze54wv<$n))hHCCF5Syd_FCs?xfI>1jx?T3M@8$Er%xMIg-Ijhuz40O+w(@TZ8e`8t8l+0vTMl&h(EdsXM02*>Z4EWu!$poP=!i`P47fM#dQ(Q~{bK z^1BC8`Ka#}6jX5YAQOIj5Ip`o$LU1yh`;XSM(^4JCTl(1^EhoC&&0Vhkm1*35SUc> z&)H>^E#%@icxSWMRvNqIp)g{ZYGz5boC*t8ZlMTL&YW2hgZWD z&k8Il2tn9!1*>yhxSTVwO!8~?J}#DWf4IQniiX%ti&;MqcKd8Vh&l_{w@;m?+XTxT z4)5!TJ1tHc!ve(@j*lzhcNYG<=8NKjw_Q_-ckDFx0XHyCq9g&6p#n1}4YZ>ga?+Dh?=vw zHU2vHu6A>7mBTn4B$8=JNh~0LWWz z^VgG@4lG@)1*&Piy3CdKknplhadm$xV)axfD1%(=s4s8){vnwjoruU~XK&4rI}Skq zn5P@`>Fwel!MbH83yI8eb_`J;XFf|cpC0nHPAt(k8^chz0H0n=0tUUwXv4ZIWDz=~B9!M;t-{#njO`7UhM^Be#hG0;ju z#S3gO_s^HWuyx*&{U_=T44+=tQ2xrii>D4kS&RH`N(-*SWTh2nbXvFoDigqp3ja;_ z+3b{|O}i@#iz?8%UiRwAisFY48vGC1I>sSPznMR-XBy{IXLknBDvSijAsjrCH4QsOBzL)zTq3%4f4&)vA7H zcrvOj+$WmzXrw#5i!$QUJWp0XGTcbp>qEjhj;Sx#4}l~mXnWoG4m*gRkjuu#4RCw3 zp={QAsB8`&e`V9WGZT0nCk7t8mUcq z$Gk=&B{~XailkbqmDsSamxM&Ae-uXxrhI?xha;cej)!pj)21X=&iZ`Vdf9mPz7`*{ zAL70E`OLA^V`7)M+7m*B*&|C?7*hYwc_*3-M$bfwHxu$d>Zfo0_u&|y<8d}{h=(L4 zWhPb;kVpf+yd38MOXP7Wdsl03SC?>;sAGYt!4UDue8|w%BTjCf$65`1ABNmOVF4`+ zpEt3n8@H*9!6`X4UsIuW7UqLLOw%ryLjthgaY&8J5ZuXUi#EF zq#&}+Hb)@4K^u8M9HpF#e<0JZTJXHIe#O$Ey!Qtsm6`|vM7Y>`go6oy1HxqWv@UR3 zdc@=Xkwj+h9><^YP8|l)s-j_pO}qz|j3-Qed=;&!*QTiE5@*7xu|O@uANydHcjKAJ zVu*XAjpvZYV1%T?bvB662j-i?Z-ErMxB81i?-FizHb{pyRu$!&F7eClE0hFBBk#=HgZmf4$+00D`{Ug0~rj z=S-;p1+KH;O5Gpwm|qUh@}(|=+R2&alb}$e*+utrURa=l_V2(xb1 zBfqUpf+^Z-+Lcbig)0ShSF&I4&e*#fjb=P^ENZJ$yQ4HjG~IhklUwAG6(5spX>w8^ z4{s*VVnbQv3pI#d(K7TF%AX{v&{NXHIZ+k?InrZ!q&M0Ac=tb-M(F3HUGEi1bF1V` z8pq6xb}Ad!@om&`xhsU6hy2od$U(3oLHU};CywrI)qR%r*Gc^pkEwQdv^|Zim%IiF zKoU*wmL0vWRAIrv=QnK}FR9rG5B%cJ2Cr z5+C^{eOfBh!r!3ZB&XOhlvVdJB&}-__buTr*f?^cuJhysFbOZs8er~7!eSA>rH5}K z*{s&@OC|enbHI$;bYryRU#k9Ueu~X`NC&dE4k($O6=a>{W6lg zbAWxOa8+3w>)I8_1AKl?J>BM=$Zui*nz!8_f7zE>)(uB1KNWLg-w52johsfMfN94h z^+2_h!J`()Q;L}F&Di1|JBgXH=R`|XWRRs*B|mSjw{GA!t>%w(EpYVg*?OPE>cNm0 zxl`weq47<*?odgcu?^*Z+7)gyx!lUZ>z$X+^u(y(W7OU}x{{P)H$#?x!EG!8tirAJ zN+$4CUCSuii7~%kelzW8XaB_didlK_3OFW2`3K#x3OX`3BunDG!5j2U5*-2UzR(Z= z&@%7{nRt#w`ijA9JsE+Rm=Mu1D^JJ!4Wm~~BO5k-3a03{$yR>Fa9;Ra4e1k1-86s| z#o@CT#)tsvt#!NR-vTcEiNSyYehFm=C6RmY5kk*Ez2Qzg54}fHj$z$kjni6tlY(bN zf`1dlk?D75WLoEZ3&*iT-E=L#rBC6iE04??E33)fZ zHSq=mV?8HK&+iYxkg5DuE>XA`crKuO#9Ai+q~+~EA^emdpo<0TDHyXPP%`ACA4qgi zR_^~F1cd_J`~%tT6K@Vh4}2XV;`8JZC^iYozRhAOw2{+h6AlP&n%xjtka@`zrM zjMQ8+wT5a+XM#J|%Ym(H%`R?P!Pm@aqa08D*?3&a@Aa+<@CH23$--rCNLn9ol-qOu z?bE%wt(U2wE;g|z* z)*D}rt1hSa(X(-=$+K@m_7)2W!u#o*1fKkEb1VxB2N(QxL)cY4hxbvEjjZnUPR{}S zM-b zfg@X)dBR5^H`9nFU5F%x80nTsl-%RrJxp=#{Sf#JrfS4AmG(Nz;|P=pvK@d>LJ$-E zB2f+QtHF5B>@&T72r&`_In{8J&~jwdVg?C*B|Vb*i1h?OHVGUqw~s60V0lV_+Jrm= zNr3|^Xch)Drj*mKvxCXOF4>^`p=vTHT34*5MAC{(4cl2ak2siOCh9Mz!k{U3qOj#d z^~TGNm}YaXD3h4z?!>0d8FT>EU?eZz8KUzJO*wgnmBZ3Zz{X1cQJO*`1Fas`?&-Q? zqB&D`cYA3!cgUlmeoZ!`KWm}JQ>}dkCx*81CN3`UTn3-1rO!ck`F?LDnj4|}9L;FB zNZ^BS6_zu3;i9(@dJ>fEuh73ELMlY!dR|l|o&M(qk(QH{Agc-3qE&#Z83r4G+k#J> zJz|(4<^{Ey7bX1U@6!s~K=i>^qEcuz-t)xJb9}fU9XONt3;iCd@H%o_8m@W>Ua)ng zJ5tge*0;v{GhwQ-B!5ApGH9r)c>b@+ z!kI)}>CnT^cfH7DGxF#pdWcY?AmF4z21G_i#<`AnmO*_e!7C#f8IuM^J~mj%PESHG;l*puUwY8`Z801N?(VxYuMXJx)dPg@@MW4=zD2W zD|xL{et_g5i$?Z(xtht=2I#^}cclV*(xkpid=wp`*RYt2awDyu2Nfvjzw>TCBj5HGRg`Y)5qOV1Qk_Xm5Mol^_*}eyx z29(zIq2fpWJDynP|O^fk&REx0()mL}moEu0x6iKmR$aaa`O@%;7nxczonwRS4llc^9p z9aV)W*!^P%;0btX*IC|gf;~BK;mFeMy>(!qEL*AtxP9Lk^SrGKq^971kHEEApNoT} zjp+$YPw_FrW|5hn6yzMq1nqp;>)qVScZbOLTtmz#>zqO&I=Hl+J~sXh#Aejhi~@a; zLGMZS;a2iDyl^<`n#!R!1NyO=^#5%__YF}b!Dy}qfS{x5|3-?gY``+qmgteKYIL&= zQzp{y3{!oYKE0y?B{+sGP#)bc4L;CjvwCJHOR3~{S&FkYzMXE}wD`EJ?r31s%;dl~ z>0@gAAk04nUeqJl1wlJeCX~f;GA`wiU z@UAy6#zmnx(6DL^cZ76=PBSg@-Q|kqvl08M2w;Jd2iBv8D38DTy&2XJT#MPXQydZr z2Ou>Kow!&qGOtaKS0A1=LK&OV+l1p@&v;w){J9H-RC0e3{LSBY_G(wgdC`zjTebtw<@cOH4YEgH!HG*67i8cd8db{(9nMwu!H~Dv-p3tUq+GW-PSS9B4|ro z72T`SZ~OCR3p!ZjL4oF`8WLRFBxnDTuYEvs;?#efWMYikZF?`-bJ!c@aStFIqnad{ z=dyr(4BrUFFu~?@5RM`!VBAfl`>t7|RZSE9@z1>>o9D2r#r_az_pc^MneomJ2agAR z*^6u;q^b!Ebkn?0>^~k!10IG%1z}$0OUj4}yp`BZn1leWJnZRQN9o?D)F!;K>2s>VRvd&Q8 zvWavS&<5C1;FLSeicwHZJstTz-u$^LbEYnQH`G@UWB_#f<-ott&NO0CZ*2EvKL1e* zJJ&t(T;9ROGgaP1TLCT)hpU)3-k#s6+_`Q$ft9blxab?}Ds=U}>!ObH$BVmj=704O zoeM0-dlo-Ta}(c8Hu&R`D}_yei+fo7T2s9W$p;uPy$Q~Bo={6nI+Ic!#56HNWYcDY zfP}sadfP3diHUU5*|M97K3NL|V_WI0zOksS#S@PzG#6y(<~-3 zzTg~Sj>@r=KddED9_n!>W}(=FI2BR)=xQn(~Ccq?b)|9cmj}LhsjpZyR@f-mm3>%E*u{ z6(+^Uqc3+SJ1Fvv(ALk@t?{{MGG;>bmjH^!kl=#&@N?|Vsqv;}pYLQKTQT?SPX&f) z1c1J?skt_h9;rCl^fbKd*G(>WwkY}ohoEr;YOkU&9CU%@ZxkR=oKtDZp{8*1>Gm^N z2Xa^spr2yBC$-koxUoRHzke`y0?X*sO;*P)?%H9`l}F{Owk{zU^hX@sI}#6%^^<})XY61Q zS=?&E$+&Rq9W(C~FvfbQv(NsF5~q;Ut-f(W6td--(kU(t(_lf}<0(`CcTVOsRs(6s zPyxpBcwzt-Xh3WWEKbMKxWd+_1Ay({hWAAym)3=l`TVVnqIup5-*@dFBOu)Zke!FO zmVc~IlGP~rJH7Jr*{Bv(g|ddtSG?7I#LpL4dNSl5f*l6wlH!L3|0X`? zOZbEA_`IIvLAB}arIR+IM>)?&hK#2ksd&@QxC7kGr0@_h`po2R6V+Oc9|eHtfxz49 z{zcUFWfR2Lo3&7F@bxBWzmu(e<9~Q!xS<*g&fj`Ga6K4qKcHqG*EMNy)TwK8&mJsH0z&PZy~%1RNPTvr=)UA|6OdNjrOAhUdJp#q z9WqwnYK52kBTlC)A?BuSPat5v-pxQmblCt22xNNJ-p^5#5rdUjr#ZY)r?1a~Klk-H z;^_qgRi%F#cKf-A?VN};GZ<=hF3*|3Wxc6EjW|`Nc6(kZXXffgRu`NH&d5A9nzw z(Egb#SLxqE-E+l^y}qg;6Lvv1 zdqseR`x(CpiQrW$`abXdD?oK=sm6Tm~@o;iqsdK zXqTP83@aI;Ba(-0hyZwj)t2y5+2f1I01j|MEAR4?sGK#H>S9NB4tNc%3=|FT3Z&C> zGn={8jJg$}#N>L+`c2G}Nlgr4I$v+lnU6#xri$?*ZK%Z@F9?&HH@{_&KOyW}nT8@G zLy*Bp+a#&$2<)!vLfVZx%N&@_2!@;9D~=@)Y8FsQaUHxK+yr$eAu($pw9xgRduj%nu!;E~;H|;wz_1i1L#;`5Z}hpj#CqSt zpKtTX<8jrf+;til-#-+7zfY(~C`9;ax0YfF{fSLb@V3{E8WI{&Mi(c5c6p+OP>Yuvj0B-pg>>0u4r|A+;7WO*UoT8 zLdmvmS5!ecb;^?7Si-QAY4S{%k;5puIdfWla#|6?X=NU?9vQis;7OhVC{pS&%m%Xf zcFeumu6?_PW;PCQ&PCzU#`j(!&kgq*B{t-w>p-c~4%CTKe?~1RVu#u9t8ra-nvbRc z;NCZxqH-trz-1Ct2spE3(C>Ig_kX2MSm~hTA|OP+pfA;sljwAGhBF;ob*l05u7bpJ z&Cc{~Q;78EI(c8G$G==wB-8){9FQVI>I3NJNsp)D74^K{$BfzXcFsSB@)iM!i{>MI zKRvUAU=gQ(e-1p~bm()Qn%f3rM;necI(Dd^suaXj{>|Ea#+!JobZvICgGAFtWA6hx zU%?r;sS#jqY#YNS44V4)BFikYal&OJ**QnTZDo7WX@O-8lu0Rwj#lU)>h6D{1An1~WPQt48GD>WY?jln0w%Y3wNnf1Pv!#rSg>&DiN7FXbZ?V9e_z z7zMOsJXTLikN1)Qk$gN?FU(~w?cX&cA8xM|Gj{u*3X})}1<@dgvOTIax;?rT9(x)6 z5_x0zx}k*8(USCVt2|2RJ)A2Dkuce3;ID%?Fffxr&?OWoevGlF~QAMxehh4t9`PYiB)=Us3!|s3Q z(WdLvlDawGMyr~->_*V+s$K#!RZpa|(|KR)OpQq~mrP5ikE5inN^6Y;?EhWNOK-wew6z_>1u5Npd&QMj1Fd_Tp&EXPo z&&swqR!tq4b?VC0Nk$TBbiZ?R*X;Jq78hRpcysaR1%ny7Vk;>XF;uLy00|ST&Hm!$ zE4tdk9B`Hho3HNO%Kb_ZDG=Un_4~ztE`In_Sf#XptOZbvLJEF6lfwFIK4LV{enzpFOL*t^TM5P7z3JTp4%+N{20S#$L5O|w6oj-_Ac zZp<~>qV7Bgo32ELlN94P1-b{8KVN@ef7}--^nqMO^M2tTQ9E@3gEw%D$x7eZ746%A zLs>Vcw}F6T~*J)u;V0Z^LdY3>HY{`Gf?k34+1`1)% zU6~oLECE7;YVm%>^*J;)MeQkk<8{P$x~4sry@DZOpsdl&H^49fChP>dRQuInWQ69~ zeRV{sRVq6aP6_|OpK|NhNBi6YGhNU#xC3ESj4ucymjc^83AYIvEzwj@MFJ1)1<;vj zJgle#T6Ggf0^x2D@7#Z_>Nda@=Iq9{s^9jMY|Hk_vxqBT4O20TmZY0YVs-w|9a|zt z@ps5enVsqZH|U|2JKhzDwN$VMnJ-ON9sTsaKq^1@&IXZhJl%yO3I{!(edqoT%$x_+ zHn{HIkAriqHf30ZRuorwUco?d2u`MG`{iK*7*;z@IqnGXFN%N7B(Q{^|O6-8TcBW&Ua0Q4W;EPWauP&Syw zrta|t-;M%iu{KPDhTXsN|uqn!2Bi$()t zEu6 zVv>V3P?Bdq4$9|<2+Ep5M}RXMgXC&~FZPVn<-{0!j=6TuTpz53AXE@NcL03^#})M< z2z-46hpl3_3sWvCfkqs3D6en$eTV^uf;~_VF#w`KCC^43is^@9hA8Z~3i!TvvJ;T3 zl91tk%qV{@x98BS0_6u!^80FAZV4*0$!?stb0>9aCy`Hy0Le@-gR801q5n^YazxN+ z{P|Z1KhZ#hX7wr<1p z=$veh$?4Rtd41EAXl)`t7y^EDp{Q+=vXFwqKr-OR2@Lq%f~NjhwoT{vEwIceVig!}r-wzrOh8*MIhVUGNUWE(5~` z8a>>+J#7M9KO+-C70z~tqIF@rkf99FM}U7hT6C)vM}nxUVi^%AVUn=m+Cji3>m(%j zxjHKpOj(lW8kSRH9=;ZBS$r+=fy_l;xr3xAJ1Y{LK~@Ke(ceFrb3ufW@yUZY#O!0} zpazfe1T>M-p+F=U7Kk2Wi^HYwFX7|MNk$>SeTl(*==RqI?XhYzV=ijuN^(sU=*oYL zL~Hd(A{OmtBvSCDR)gfaz(_zm59-Dg+!pKWW=C&G!sWgmnEg5s?@FX_lConl&5biG z8rXR9@na9oh1pM1+xv5R(sA{p>#N`#qy4@)@?{Qcz#ZU~SkE-T#vTHH66)NieF^+V zH_+QlaFp+c8Z_jQOzJchY#9bPhc$n~AqeOyg*{qj={vZGB~DR*m%~Li4Sn1zI#x#df>a6VvNF+BLAvK`8c+;9PaNbh7B%%wtGpvlBCW^Nm&oBB>_|Uh1NsN zDzGaq!SR}4Iet5}-o^n-o+O;6*6zq)B%k@BdNMc0N?AThWTPjhZx+HDI;Qq*GBQ(O z&cy=IsXnAo2Quw6L{l2QGu(d@UJ;u=2H=?S3I%h$xAz&Y7h{-?w*;8?cV(N5#?~CN zBrJGG5y$oV`|kMRP^O;~tcHVKJ$SF4OvbGDRR_ghgF)LYE6EIiY{XoTGonTp(~p zUP%6|f$Sv8LV^baUD0^s{beAZfOYRYEAa{BZX7-JrNGwj1N#tGVS0iiKGKANDR_q) zjCIGR^=UGePNMV=W?l3-1+fd&gyBGxS3ssJ>bIv|5r%pkw5uiKV`t(8byCWSo_FvL z42J~q=%>7#XfTa$>wtf&T6}5(M@MqWKT|l29n#W&q=kcywR9Q~TNDlhaq=1AFjU5c zAmxMusGP=oT8&pV=)M~cBB1;90fweG;swUPDnOFUW~JNlTD)kO{$BM&G)xc;{iUMe z1<_38Vk#6mAr!7NiUE%*ddO|~dNF|IUJOujdof7J)Xz&5DsF%C$zyoRlyflU<1?$P zsM-fBs#csS`Y9gYwT&vOHaswVhlLhU)?TN*%HLz7LVu5qGF?q&L`wC=NKD>>pyz_W zKx(ou#-nP?({mmXGIeFf_rb12byW2p*0?)<4zz#m6mgiVo`Q(u&7faz%4rY^`&-7&u*|7vP zB{4?-tr84VkWowKU_t73KG&y^7(qz)HO}VL5KV1-_ELZOM}S7==6r!zjxx8%K!N`c z`6?s`Dx7EfT=oftnrOey*~$`0ReW}udCWi@%csu-CU_UF*^m}ud--oG7AR#8zV+q~ zjZXqpt~sQWZCPwT^nYB?BsY2?WRcRKuUcaU>c&DEDkXTV@OqAGd<|LR{BDOY{%Z+D z`FuW}Z`x6|+#LPrw%V6<2l+Yvlfi&bySjd1BASpiNojPqjWmOQj3g?J?l#fucvF;l)fRQt zE*C4od0cexOGR9?_{-y}_7BQ>v0@rN_%)#-f8UVBN*NjdyZewg_eGlzpKlj$?tZ*} zA=I%{#we^+lsKU;9L+>ASTe2$ia~mZLQPyd71}b}?Ytn6>q(ldYWI$;%}*%5uFHMD zpm7HTG~U4KDZG%vvH@kH72}Lh!J`%BL<;YnbzLohZT56 z0xi%Cl0VeDvbKD#ez?2(?Fw@+iD*Q*CJOwd4CDc1=DNIk{U(Vv@bbqfAv`tFf4wCw zBTfWIQ+Cm-tDmo)VQHE9Tu>-1-0~8PImxJhK&%o($@DT}l_5zgr()ZE*0gybAY4EK z^Fu~D*8vGsC@C3|fPWJrq=BN40%zq&sUVa(a>b6xAu5THU-z_3A$s6x$q1aN^Cqj5 zPEDSQqzW=X8_SC`ui)NQ!g?@!e`=JXMA9)IZs1fW$yhrf&)~CbTrtSKasfX*)=IAB z;7Yr8MJ1F*oUll70}+^8mVyUI%d{Y3W?2#$k}4&vVZeuCEEyIKJ#p#VK@qG+Plks_ zR)ZNbiLb96MU!`ZQ@M4O-@C;z3vY{EKes0=fzX4#5P2*2*F+}vIW@$vf7HM9=WY;F zRQtZWnS7p}QTrBZ98HeYwBJt@3a~1wfu!DGm6RG{F>qiv-pIbpn_`{q+!nQmiuqso zwP_ncMWk?Yf>zMeJgT}{As;d_O2Rx6&tso;(50#a2V0`-Zc}9MM>eaFLSQLpZ@slo zeu7+F&f>apw4Fp78CF#BG~*bBUSz z*%hs)!q$twLzi}O+!X7)9X37(v+8|5c<0tN)K$=lZSf@^l-S}1l~6}f{@YY^UO}$R z#i8=&G7(TvIe6{KbGNaP2qn0UlO=r`Ivi&Y6)B zJKxrgeiJl%W>%<-3C%2&`?fm9)eL6~3GI-2ZGY+;S6#s)H-WY!4Rn{WJpW>AR~zc< z&|`TzBFNkCLQq-)^cf)?3I(T5|CmbS%%msqLQfxZhYMcc_0BCa9{`8 zr>Fc1j-YDh+3jEL*}hu2gDo&!V62)z#`bf0aCTziJH+9^=|DqPLMD6e*nC1WjRX;+ z3UIbF;GRR(WsF&k@YiB`#(3PqTlXmQuePT$6vos;rVodCe+F`a9M0~85rwrrWXd*}%QO*_YzEeS zn{S@tQbQUYe;#JoT2bUC|Gmh%+`rg1b?KhFIT9ZI^LAlGeE0J9ncKsRXYm7O2v_m* z%-fLd+S+~U!J})AaHh@t4EY(A!{FFtXt5pF#NjqVL#4;EmIp_ST^w85`BPd#4$Vr zf+SSZfAlOvthHkytsKLBw#HKR5&z3K?iti|9I=GaasIn~;fV`xpS=)<-?qy}k7TXC zG=&jPv)OfEUrps$NGHLX(zXUCq;=)eU*)+`2Fqzt`8w(_iCq`(tGYpbkpPmcb1Pd< z;C1GTZjfu-hO&L*CPNY`VmyqwE zfQSQZ@&$ig_tk>a*jIfBD&FGyplaoUI#hn)3<|acY?%8DBHy^)`IzoNQvkq5T%tWt zqlh*%FkcRJ3{`)Nu30gfgzuUjGpPF;1?PyNj;?%BEQT+e20T$W5AI$5hfr-+c@ykbg^N}5{is}jw+1JIeWr*foUHe-sS3lk& z$N8{n(wOL71xZVS zn$69+sj8+vT?s1UZ?5diU)MiJE0Umurtril74D}`SP(0J`mGVd^Up=yOMcT^2|q!3 zbDPzho4WpD`(X_1zjfQJ?Q%EynSHuJf^WA?Q=XZbL+FAkEg+x#aDDRk2?69dA`xK> z(MT$Vcp{^9b@Jz5INHD`Pz|N2jGl~O6*0vThgKQ=e)8+d_u9lvMtX9b5^ZAz!w88e zb69@awcFEw6{B&}<>z|h4?iYTd66Q)D2!;NuOEsIq$Q85ynkp;S2T$?w&NjlU;2k! zH$>cJRc^bAdb{i0XAm>9@EI(kQp6bX^LPvC6$yZn2~t#gVX!$ySAP~v5RYtLyV@ zV+FjRovEnrt&E)u`s@73Hma;|i_hqE#kl~B<{^7fu2oFDieQU8Uyoye*@y8)-EbOznD*5yStdg+#d}kkpTR`k9iGa=qR;g`#;VfscmkG?7pe9vO7KvJ=-JW&_ZMa z5S6GA$VYtcjJ&JzwpeGSD+|7VoAnT;wd?(E(LI(Q9l0JZn zeQlZ4RwVKJ7fLP#0;#Vpl$j_KWD0fa#5NXOKMLKsrSnH(X!97Jd3q3W9gkr0#r;NdfdZm*lV zE4toRJ9sy#GQqCuLB|+r{=4x=sxabzkYT2k_EP7BG`?$_DukISMAM<7Jcd8MxV z1epfpQ#BM;NC<&p2w>v}4XD6b2NOSD;81bKNJ=)dA!ug}1C1)vc}cgtiR_!T&u=K!xRJWF1 zPA3A2rhphh92>{sE>GA>4HTwpEU9T~L$7%JQ_z}{>*gV20vnZlf-R^d6zO4*YR`%c zMp)fyZuPth4h1?TgJgYtagDNIs@i2DAb}I%70?b)Z$$+XK7D-xLa;}RWD*YKVinSa zQJ{W9KB)36oZ2Ayvh-D{4U*Y^B!4a7D@|)T;HTiQ@=f^ZMSYYf|5x~dTpWfEkce{d z#T(6!kHQ}b?R>{T3@aZEf&U*v=y)_H*i(MS?BU$h?aM-y5KqJKYEKx>vk?rK*%-HF z$W2l={p{mEI@n;Z)3mPMFoGE7E+*Wf{BfGV59KcJh8pCeG%k6TpUIHPf*1b1# zwtm+cR*68+B>Z41oTcXfuF=sf8?5_KR3yA4^ZFC6AVdvRWSyB>FJoKNa{FS)5E@vOezm04?LVI$PrFMIf0%8}yqFa_ZwK74nA1Xi}7PJO#`5memmDFs-PSK55Sn!gL%To*)d^Me$Pazu~WXOaipVV7or?T`l6 zO}VS;ZbFylEODcM4=`1nhv^+`=;Yx|(v07sFyod|9xHG!m2hW<+{cr~Tztt7B{!ga z6SSAFN^am1X#$J3aEX0KlCT3w)hkXUi3*-b!d_4}tD?3Qfy57u4xuOe;&gW5=MPS7 z*SwSvpY>q`2!K*&jSyZ4v6Rvy)@O?x4TFw3n&D~A(-V7t0Dd!q5yA8G;w5~kM)({1 zK5U?&trL6!2{fD~n3z`Ba1=~d)t$ksgCLy99-2b*!RTm|ahd1APUV!k1rsbqgbs-V zyORrZjOr2ShxDgjtEMiWN1KGnvH}+r$6as&?ZSqSo8PROKGq?E&Yiw-r{@09JhQJ0 zaL{wRb4>GpsesBiKjNS4CjsU0&Q$vf%PRzJ>fM} z$6;2Qf`Q|!rrMVI=lS<9)6R9)8JlbJ(Yo{ zba_}H$ecIoaE@4CHRv)TWpLBwO0sT~aMubWkIwupaBYE*cBPHS)DH#DfX>!K}}d38o}zrM-)zG!Q=`u*NA zO+Lmdt{WP!%6!4YTUg?A#Q1y5db91%n{5xjH*Jb#yt z;Z@3Fr2wOaexI)kgcg5c-Vv~zV3&f4!~;7npE4tO0-lgqLNfD&pCn6n{4fdhPxzVM zD7a=a%ce}BDra~B2ZW&~4^2|Yuy|M&o1U2J?{YihVd+-#>V6^8FvrhhM{5lT45me! z_eJNxYud8L!xoX0arjGJJ-XF=iRb^sPqCskYwpXUa~7-(lW~6vgM@*!NqjjXO_K1M zuA|8k>_wRHv&Gf+79A{?4%QJsssZLX7@ZQxJUD>J7?(~&Tr#c+PKz;|1QScuvpVD| zV`-`bWnw1M<0{k{pQ>Ls}ezNY)TVP(BbJFD~4< zBrsrHu~mF3nMr?mpja#&{;NYSrj%yf$glLVX}||WJX3*^2}{J0sOT4w*+^)yi|%dF zZ+(y+A8|p_jxXop8iuTcVP_J2zb<(5ct3bQ7quZcCc ziGN9gR%V1)?C0lQP5~eO?~rFRa6|}cvx?$}anwy6As&W^&W>g5gPH%n?C*x$|7_xq z_#r%Pv2H#WQ%pxGio{D%edjD?wW7gaD*mTa)I;CqgM;{t?KO5ea1+hR_v_rvD zQ4g=k#|M7{m@gN`CB}4-%yZO zO@tQWVg^SxriIdfoQ={yOm?M&p;7|YfHV8w*3*AN!^T?~c8x0&2-MoQ$T(9}ZAfP| z+nNCJRII{ljPN2e;To^nc5XHhBeFE?`ldz9xIw`LR|%w{DIDGSa*4LFG_xC3gP89Z zqdjm3H0_RNK9}vwF^QqdRCZe z)OC;~F_Zk;8U+V^y)*Rt4d|X<8cO_`~|5bvw634Sh#N6DqzUUliIU>#d-|sxLRt zf22w16mfOuP(1Xunb{1U3~OLHv;1f%V2_5Zlxe8`#~};RU5|15ByT+;$ui)4Dph|Q zzoY;k$}1#RXEqU3#RIL=J`cZ)7ngZwn=csVC>$JgWYi|~5f2Yj7Y4`6SssNER?m(F ztmNi8M-4!FScdllDNnR z-F|-4TMpnXD6c{y?RtNQdBkF9wtZR8ckq!T=1CuKUZIZ{(y;isx0n|;@8{hepv3%PT@T)Xz6CuB( zaeGRmd{NuQ@zK=iZ*9A{fczuU7r*NAba<%!-CB){K=kT}@1ps#_iv6HA7e4<-T0tY z__s&<9E8KcaR6>-YEP0yl0ki|j@1>4nO$AMNXHdL==fkZ(B!yp8Rq0R_iuB5(|oWDyIsr>g}V|Z)yl( zNF=G(?`*N;Nun1oD2^W&OPccdW5ScXD(u5bzqre*TLshD&b8aTX_Xys@~$Z#0tQlw zz-Ng>px)fPEE9uyDMNp3W?m9WlnKF%bsz|5JQ5j08O8V}PsBYI(c3i1@I~dCttO1Q+FSyN}sGVZwu|$$&)0bX;S#5XSS!jDu;fvRcB@r<4 z`va<&aaY@4AJl!)SM_F7JNsT;+6TRS8B*HDQ!hQA$du1;@p^yiWc^M%D7fdf)BTB# zEPl05hv$ZQv1BCqU&nWXKeKYirXSY#Jxysk0(AL#w6D=(hsEC;e`v~usQPtH_%R#-MBrGFwGPZfw zDIZWR;lAwd>{EYH=C{YhEb%@$joQ>-)d5LzCW$;((zzYxMPUd3@Z={uQV(5|_mEsE z4+$5nUWH}IyWf@J*|Qn`JZb}`o{UBcFK|5QJku#uG#FF_BGMNY4JsmSTmrSy)@#No zO0cu__g%Avf<@xGRcEd)PBsXF1e8@*7cZ@fzu2D(yFq`B*As~Z9O>4B(Ts}t{;pgt zh>Y*-W4>NP;)dr{-l;Zps^myAHk|tO92hc5{R&f-wP*-V85YSoDAsSd*e9|#6#xht zLWK#)A`lLS52?pdO61%NhNOD5HP+W{TVAh~Q{4DR_Y?LRl2zbfOau}DXD8Suw_`y- zi)G45e06`PEF~CCQI;|QJ@iM+0YP)Lu5?zSltExBJE*r^si)Vv2ckT_2F=r0*$2&W zt@c;_PZe+uW73>s_8JEc*-lR>m`h{G@DQUz2QhPyjGd$v)C*VvgegbIlukxd@4B*5 zJ(a;K?v47GV5%Ckkj6I+kS+ubiD*KP_ogX^9u|K`41$2k;ntKH_m5~eizD!q;}k@3 zl#yv?Iy*FjP7%}ZaVSZ!_RRQ9m$jZEh%!V49RXPT&(b*6G}e!s{BIL@=UpF3^^mVR zJEi+)Sm8pd>#td8fBJ42UfHUTLcv)=&Ih=rQ@Doso59ti52DcqixG}+YBhk#yz*+n zWM_ZI+hLtBi5*Ijeql{4PIr}=Nd1I%2}$A|U~=pBHm7SthkLyYo_1CHxY;PMY^Ae% z&^k&mN|`*AO2DkNXS~5YXgF2ITUA(#LdN@y5-llDQNrldpMyuB7PNDhz*R@PWEZeh zjx5zI?HbKeLs(PNumukRSggzf&En2Zb$5Tc8~ z?$&t|ENK#Pam3{#sV+r9iLBNO?0s}ScFri$$T=DAySm&=ocx<3K<6{$Q%BRDB^P#y z4Jtfe+8>|NUiYFL?VM1c*LK^~+oput>RDL1EUjVLmUU(4%hvO_P-vVzy}ppi8!vyf zQT~`ldAWJ()A&u@gv%A6oA<81Siad;u^1G5Ji2~cVSJhhfJ4CWC0yq@7Os^eII)X) zGOOh>?GOGrRP7-d;y%cU^QXpj>T!LhD-DF8ZJ~+<+Z50w6-V$nq*3qir)1GSwC#a@ z|9J<%2)Pr++Hxlj;I`JZyznjZ+^2sOnh-Jc3U#B3^BDpg)pkAZLKZ@46zrIVY;IwB zTj|q+VWdJpxh4DJDEEia2Wdn%6C!>fL>On|;{I$4MrWM6CZw*~vQUj9#CmN9uBCxM z4qZ)Ic@770Of%pZcMjk$0rHz?19`~R$5G6`$wR$=UIt%2g75AqeA6ERUwVH4zJOQo z4LdA$CHWrp5vE$I1bG{HVmDS%MG7j260Rht^&;&iCGeiW(OZWM!^`qy$>S7lQ?)VD`x?Z1(7U<`84?B z;J1Ub%Y);0agdNiF%?|i1c@LC6@g}gFhzsQaquC0dw;)}d>%*@rqe7RFdf!|A?G~& z`E(GA@NzJu;l=5heOJ|Koy~Ar9M;uf2zJr%s+#1tgO8W*kKYN^QO1-Yu~J}-(KEU$ zrn6#<3lH929^AM7@kEn|8KYqTHunhSE6(*4iYOvf#(noj#r$bqXA@Hv5uxSYG3}{s zf=Ve#B7beQo)3nS$?yj|oZ8|0!H`8Xis0EqtD6}nBoUN0!CK_i(`=U267IVHRMzgPFXNS`=#{R4_l{p_GcucQ}{<)kEjyH!*A))v_Jqp;J>W= za-SCeC!ZGcIlyBthpu*Z2#1R;DZP4gG^A@g`hNkt`0i>MAhsKdTc3R4;gql>c_uz= zM-;PILe1}+@i$A4Wb(~jdKSigr_`&#_$AY{6~^8yUF_UzaM%X=i#JDmp;+$}o^G1( zG%N=+^aYB=B#x37>dGu;L~HumUHNr<+X2{L;@$q$`bw$mVcbhB6lFxjU%=I91SBG% zMt`RjB@;zt6kFAocUfzGXDMS~UwhO5%gP!Tx{DN1x}{_Dv`hhh;KPs$8IEx}o8(!A z&nkSl%j&!4V`_(aTEn7zSme_u`v%ArGDi0_sq8pQ$Jr51ldy0SeBun*T+A}4fOLxX z21BI?RT^Nyi4;jo;4pun1NfcMf#WRw+ka#g^a!fMG#`V|Bmojz6?Vm)%e{F3-Qy{LN;q5A+eW3SMQU%e_v5`d+N1@a4*yjd~iC9AY z1X=>-YmDjFGOPgBm;;=ffR6ys>$Y=FSRkPw7#Ox>O~mTS0^tXLjFGf0#Y#uyMp z6B$TIXQXs5WS<&auxA}MFO8*e1b@o#_}G3bvwBhHzOyQw&hOGgcX{~E4%b0YxOCBk%HX*emh;k^K+uk_7mm$-MCm>PqR)q z?DPZsh~lJPhOvSs;uhYdqZ-S{%$v#S@-V3%3j2`d^`yj(hYyP?8#~Kx?0@KL+Z?PO zH@miBTDqn&yypFPrcLrDvW02IQgHO;7 zgYZgB;e_%+kZxAr^g8l&HV|J(8ugJ=?+!D2?)dC&V^|esosIFJ(VeoL+~!4@jr$~X z;u4k@4-IA?(x<9h=uIZms(&keTNy#FXN7AJhv)XeSnVtHE(_eXG@F-G+nri4_|_gd z{B8M$bpbqUx_rHu~;Man~b}|s>J9Seusi9Ajv+#!15#jNmwQ)w}%m~7mBM+f?}b=Uyu+# zOpx&T43CNC?TzDn_VLrNe)+5^1oCTUy|OA6+``iwsO-CRZhQ?yZ(; z8fOq~_;mx?CZ2^K9b<5xZM9XC5mN6P|3N0eP&DJj)k2QXL!lQwP*`@=DNoc$JMXnr7fIy*F zxJv(A{?z)n+h%1U-u1H3>Z^-Sk7HDVl|Vb}zRd0ySyeY|#~RX5IL8w<8Q0T)TrBFZ zyR&q^Ha)}I-o(tL^cyj-wNy>}$!h7>I{n#3#P+2|6yO70c~2zvyLA+q&XmAOBCK;d zYV`dJp|t~_lK~_X7c@5@Fd%PYY6?6&3NK7$ZfA68AU8BLm(d0SD}T#w+b|Hk=PPuS zfQl9$di9tWiXugNa8E@M&=wOBl_i0aW2ax=C6}_T!bVach^5^TcV{@e*UPKLJH!l9RD zP#D_C(da#i;xu-xZLOvMlFh zpu~|3ydar~h7+Hpw0vA{(Ctg(aZ`U)w_P>Lx95xlAWS`*Zi7NFmO_7X9Xwrta*n5Q zF|oyfF|JZvq`O%&76 z1u|zU`#aWpK!3}U{Z^z7h} z;IM!8EAX#GR;_c9~Ev4o%%vBK=ZkeR?_wJduRWHFYSh9&e(F) zjb7)=s6pi%L0K~4*sid#K=*I%AG9ia>djIDR?G` zNDdYlyJ@HWB{|ZRB=*jZi)S`v}|Gt9413ifZd?pk039jDU~?Twyh{A3{f zAWNe#wS{@??E;z<^#CvFs`0p;9_y)q_L$k6o%Y~8itB*ERi`2iVrU)iTwwb-waKfy z<<(zX=-?TX0VERvHJ5Sd0~7%?lTnl^f6Z9mZ`(Eye)nG?pf65i(V}EYc8l$y#R{~@ zfDOx@x*%XAI%Z0VnkYH8_s{Pnk<cG7k0iXx(=)7|&o9q*2McRiVZSS&5PK;9y7 zt?RWFy71pcPO!4BW9#!2`xiIYpXMLnX-CR)ksGcor;+)+V4M~EMzF8W50T>se_HTo zabbIS8kd~D8B-hh$PGL#9c=_pL|h3@e!8CgIl=J6v9JZE5e{mcZm_hXWb*mOv0`}k z$#RglT3U~_WMVDQ!mVI(>$l0TlXn%}zD0NGA%E4Uye3g0@-a4x6$(OwPuyMDfj51i zQPB!xwDSF0*meV4)3MzJ3Vp2oe~EBQy_NPte+S{E;#cf5 z8q+nvb^WO<@)BZKua(Ph8+5no5ugJLHU`VS%8tM4n|O(qkXg+WrCYKCy;bVc=JK}6 zci)-L=gse{=E9_svhVhGs;#)-Y&@bXVJU<}>%&e*-$%uy*wALtcdoj{IE|b29gRpS zm8?)Nr)5HO77?z&$&$)rf0l~BHvI?SFlG}{^zN3Wm{n0@Dw@v`8pP<@v}x5+x+dD56rXOO9$Iwhl};W#)7He;fU~z*G2hf{olK zcY?D>2Pua9(J?1FvLq#ZFPR)y^siv8-4Qk>wt^`juYaL=V)l=Vop%2~o_OvY{sxPg z&cA~SNUH9v8RvFR<1#WF4dW4N9lP%Ze-D|ilIHD8jJ|3vG=+UdrG8J{Bsw3v>8f}0 z)frG9d)~l4ROFWce~WTT3R6z@{o*MF-%|H&jUe=)tAykE6N$7SEH(Z#n}DTTnh)y} z?5`Sgo%ver_sV>hWRUnw7t4`dTNOrAuVk6gJQXqFRXO^vx5Bay{#v^^7mwQCF^hD5 z8Gly{-pn3q#LZUD)r%X-<9;$ia9FeY49iR{A8wijLdb{>f1h3UyfJ_Z^66plg56y3 zjV`=~Pu0QN2DT-<{70NjI!cn9>@-a`5~)1$$*#=>QxM^{qQustz0=f@q03D3)Sa-%N%Updx9VDG?x})6vW)5; z-u3D!n0Ze2f3i)gS?kN$G5y0)4s0li2Xatjc%PF&-TJ`HVwbpm{RB>32y-ekn0#Rt z;d^v$gi8+z*^Q5Iulfjk6~A@;Gd!X~Nz&74(P;%)JER8BZ3CBjrt0>dOjH9`F3;Fw zUtzCu-0X>}b=ul)+}fH8Qp{sf-f=o^u0MLZue%rqf3vbGH6w+r1LW{+fY2l>_DYZ? zY}S+Cb39~vIG zIU=$>e|$!?*EPpOVoI$+p^vYsg`=?(Nv|Q)irXX&T>q(#pdpNJ@UBwXCi8HU4|G=L z`o1dI!@1?Gjoq_tj8=#`OU{^p$`|#l^bRTQ6K#l-{GRG|US=_zPkLV^&YPo8n=@s2 zzz&+xfLa?TRa)pS;z&(Z)BIxAd%C0i_!?_vu=iLm1}FhW;&cSb#S98Nkx)cNalOG$Lr9rOmL zKNgz|=VJWnta~vW4NlL`#rcxtMSm%VA&oalD#k<}F$&jWRM|*rgwOs7e(QLhuJ5^% z!OOKWQZK{~UcC@WBfNuQNyTW<{i%>RXkOpMD?po}T!N!ZaYRR=*&T;wXP`+p3C>CQ zJ!sUDbt# zm795R{b*dfoj=a_#g>e~)PJkHg|Z1105|XN9)r7w+5BNXW1jeKWv~m_tq~-}*Ep`j z*B|v1S<8IGcrI#4O3h;NgM|g3;96Y31B)5VBxzA%6g7OafH35*kw%3B3IxTLH4Bnt zF$oEZZGqGmOK3_AQY^XwSOllBM_rfHZy|DG{%t5Es8f7oO_~Mtg4{mh0{zA=M?ZE zQgW=sfi$SS z54p+9^le^VN6Z}(f<>rM-XGe0v_)JlsJma+bKP(BT*PSQzJDXxwa~pc2>gZ~gQ?wc zP0qGJG|CMO2H>q3rY7G>%Hoq~f^`hbxU((n;{HkJQDM{`1n9*E#*DxlHZ&H_0DeG$ zzrRen+=hZ#U0b;uJHv;)>d;3q<82D{FrO|QbLVh#znK4VVC(QF+_l&1n}n{h5&vkN zt2p<5p?hRtV3!9CIi!CHCn4YcwWVEu=i*#;pqJFbSsp3{z5-1d%k51z-6v=#&1K++ z(+UQr@8vPA2Y6RH2FI9pTRjMM$!=02c^nb6qA4!t3GC7w)djlz#Y!w0we-Sf$7uf;>(x&M; zcuj}8pSmJYVxXF3AtR&VLDTFeMmiF|cGigxT4Lcc@V_6%uh31yf3p zCdw)U6f1wXR`JR<9_J>m>!i$`on;bdu6tQ5Z?fcWuz?3VI%atbw%7=E=e&?FoVJ0h z7scu#OZtdanty{a2iWW`8UU`U511#^rx?Cl06V?6lf1=3JOZ#;dU)DvLKE!oe zMvt(^e~RAXOn8lcMP?yaeRP5gxy@UC*%_Bg*N7Km#G(I$xCXqaJ4t96DU4$VFle{W2KLt}%q=h_&vNaJrs-h>dotkI)sDj7IJdizes5|AOX&SVI7lL=g6BxTgk zgbEBwfEXELVQjL3ac2??bWDOTV4^W|fPSzft-D6di2$xmmRDAp!{Fg6PwVL-Js{y4 zi*LdLiV<8sg+(CK6zOceLCcHU>b2WNE~3hae`_JASvjTLL<-I=RY-!tjRs&CYNaLZ zN<)G%`RoB80wMtm1&8DXN_g@BNKN_&ppQu4u2q6Hx+3B;s!Wm*SVa-hdOxsAAf*SW zEx!z%$Rq%^oc$753S(;|5R>RE9J`1F<48TGiDxdNUY%tW5iJ4%2UKV|xU$=85ez!- ze~{#$ruZET+>HAhcC=K=Z&vkDv8thYIi_Xo4u0`s2FIR9or>Wa>XK}5*E?F%3-i+(kT=+)>&S8*7IUBW&Ae2>%;!qo?!#vvBcm4BLa-I zV}-)uU~9wQTU96uh@`y*nrj30>-Z$Le~sPbIGecjLo#8zlL^PTDYW)MCPo+aMVl!^ zFXK8HyU0Nt%e_ETa59GlJ?Li`g$x+QSPCH^VPozV)WVcROzeYMSR@f)Pn~f;=-t`Q z_Rf8o)T=Td)b@FD+d1`cCpw+8-Dql*pQ`jBId_NJ6eE#}*4EAXe|{q**D3Vpr$8-kUb8Arz-1!9jS?70trudr6#K2P;mZFsOh*l3sA?KO?LT-hgYVm zf*(&3HXCnda#!qCN$twLw00#~VcT?(6*T`7~+5j<=ytzL`D=r-(*!SNd#zLaF*O>9djY z2|aw)Fu!Te688={@|e;7%C`(Me7It=-OyE5#Px_4L((krQYJR;4VPdu5u<>{HB!ns zG2%XCe*?0-o`;hGBohHPmvQI=69h6cGdYvtU@4bh8v+S`vA})kx|gNJS5Yo-K*Wf>gkPK?ZZ@Zd)r}!N7+Ns`6z1`N{*&om70mWByk%nX7B>K~wuXoP2oH<=5 zfaghv@@%?dvdx2c=;|?F4&EMkGlycG0Ea+6eI1H{U2t0wBqq_41{ui}?ecZs>;OJu zS-1HqrJx_GJywHNh)&_4J_-A~Uz*F(yb51IoB5&Co$E>7+;3~CPiG&F* z2f8+YovyXgOnwuxMom28!ERc8oFQrs+@vGr%#}0ExF@= z*Ka`4n#U}O`8{b&!TWynJQ(cii|g)Ymmkve**{;ce|z=f;`Q_M^OtY_<$2-a&CBQO zFg|)m?wj|@!*?%YB`dA9E>3P8q)87FG&-7S5>GM+`+q(LkH{F!7*XtjDexgxcw)w%k7waD$3trpr^5!sjPc`lqS9O+_ z_xdp6t4BQ9rJFzU3|-+5#{mWJDECg5{kCdH&iEx+9cpqn((#BxP}l0Nu8IwoPJK^! zJbD1954sfa9I%$<&Ht&!6EN9BO22b~pK`-c+(GhL*!|N+_jCaFvC8cBp3o70NGOO_ z{nds*0`=-dKCK}zoJDaQsQ%3Jy8^yJowMOig{`2C9!7D*1ZtYY*IAfZ!vN(JV?9(9wAR&u4swp@BuKy;LY;2lf<; z?65cBs2O`gv6zcT3>qe^7~2DXSSW5LDHy_m5o<9{7_prTh@(A}2QI)^{(-T|v+0_? zS`qX`60=A^|H38Hn(VoSHY|Kb%~x7w)M^d%L66j=DZCbd3oG=+OTZ%uL3h`sUGEz{ zyhl*uH`}B^^AX8Mdn9QrL>qn~A%uFQT~V&-8i9CfQ^tT`9y?u;l6TvGm1%!CbdWUw zP@Cl^*r$W)rt?)%iil}&&c#&uEIq%WVaLn7J@q!3fv~OMW~{kCM$V{}n&QUXO&=^KNwhqxtF~ynmZZ=!{&pz)1^?B4 zIb2p&vuDTAi6H~3`CNj3o-|0LO_QSHo7Q{aNC0iTi?}MwRg-7^rl>yBWPrExz6V4V z$aW-7P1m7E+#06ip|ym@<~1(A>z9gHlnio?J6%)(IZRnS$qttY(DIYFLJc=!df3!G z-5E&e5>E~1b4seKAcf_VL@?4gx2DJYHX|a-l!-^1IjhSvu-46gafkpSPsST!ND6xS zyez#{aNoNYz~weI0T;bb%hqqMs5WJv<(@hqZkoJ>L>9!E%ckDah|UlOX_b~YE%}}- z8@yci9js_Ec0hrDBC(F@+|In>;0W~)8n7LRG(=3H#@Ngw#Ks$Di`^l3!}kli|TITS+P zpNDk=nW5-^F6{tX)lj%+HYXzkjf#92Bhsizc%7Y&Y*3rA+ZWG-85#RhW@wR^DPZ{;>_bi6ciU{_s41x5N+=eUMJjMfet5>B+7n@DTKm zLNgut4|VSZk7j$;h}qbFkDm2(F5odULOdL9tCBHNgf-Bs65$#kiu7X*MD0SGEZ-2j z(YvC`ijAvSHm0M3Nq;7DXP-dHS3@=Z^q4cQXG4`E3dn-xIRhqUA|4Y^LD#XjFx>g! zr}s2}U@U+iTPOtosNa~8|NHQvrn((oy`Ss1pc57Q1_(<)g0&6^3%Si=Bhmnf32ilm z&{ZO<{58yF7EJ(ru@i8`3l~xo3okI%I6=$8>z2G~!%LIS0Tasz$0#c$C}36GjshfC9+FmW80fldSy0Wz2H zTmcjTGncSr0xN&5T1%7L#u2{jSMX-6Ey9==9(Gl#WGk-NQOZeaZ?X;$iCrQBfeip^ zclGPjj~NVr9WJHBCjv8#d35)D{dEt2x_#I+JrGi6bGP}HIxzJu)J&b>$!N3jSDVbI#f=(!8ETp*PgemON zEOe+8yMco9Re!F6yVh{3r=i>LMCh<&vB)Qxmpt%?)5s%tZS%-Y>}v4vM4!HjN9j1Tq+up^>MBvn8`=too*+Evsm#JCl3lgMQ}~4~AcCGdOv+5h{%iD^K-84#qC&Mls$Zi{ z0VtEsA&Yi$=$gIV9II0+=ZesT{`O;7mjKpcuFTKj!;$Lw;UGWN37qaivxW`#O{jk{ zl*eiYR@BCeg$K7-rTqu)kXZP^6+8Ge3&X;5o}pc{*eGqmRtg&i)avY$tlOO>53rRi zF0zD0452m{TiKu-P(T{XT*8hgp&zccsgV%C(WA7=BL2;zdT&v#-l6ibYwYarp$e`M z;$`Nc=gsTTDy60f{`@KhxCSDpm%4xH`Xj)MPE}Mr?5exbt)v`zxukwelv@J5>FFTah9i+bM8{ zc95uf{0i;B%=v+%avD4@10o_JLM7G%6#`q5M8oNhX<*-i*?%UwA_L~2=tMGGgIuNRX? zdyKp&a)a25BBfoNm)z1W!8WU-ZAakf1|yU^Fj);&APD6Z3&MBca=>gUwu2xB`4I8| zzRFz9X%#G@>O)2_aq3U;Qw@JtgPrwfTuIl!GQje~IWi#49PfD2t&t{r_wjvT_DsgP z{{jy4x$yX8Q06m*CMR2X`@4_diT7I(W~52x;k_qIvWr9F<}qXys{leg<^Fidk&&z5 zsI1Ct?jN8@4XU_i7lIhlp+nxgRqX2>yO4G+baqW5hi8@j8H?f$s|pYtq z!CDn5c5RK3fudx-HpY9FjAPinfB+ovC)O#*R3Xn03bG-Y&Z&(NHmOVDprYnZ$ExR0 zfK8vSjETzTLkFf1$Zy)45GR3nE20J0`cAjuz4^n7{BGuI&4%EP(r+qMeC_S)KoV zg(0nV0gnS11U%5up|;VF0oEpCG_b`z4nqlyn8%5W^qx@9b2opVAz?r~pCM(d4EN!S zQ&Jzd38XN11u`V)v>B3OTKau}?hP*&G*Pe8UUfG20o6htZ&n$T{1!KY-+VD~2eao& zUm)%>Rz80YPVy{&R~ehco%oar1w6=lHj!SI+(HhwMWT-9c^q?hL7;H?RJAm1`g{u(Y55Zc}>4@h2br z>CLORvCC|UQ~)9wk@7nAv%Ep4&=Gkv)WP zI}?s)CU9gMd)8#z4nbD)06N>L2T&Up;31s>X!2Y|0y6$26PFDjR{#owP5=teX8@Ff zmP8llQaXQ1+OG*3lk;UEk(yYl=i%yEOaycRKi2DN)VZ35G3oz4mjLoB@;NjXnWa;} zt9)??UY@!Z!G+;EAU~0g;Fpn%KUzVcNhb)z53F2G1$9O&lg61^6`jvO<2=TBXv{1$ zswdE>7tojhw4_UH{FPW4LVm*!xHpQDsm%vfnh<|O&yb;`1Tb`1e7&P2qPAW z*H^61yAY_%dr@GT4E)lMaIQ{}&pEcm)D($H9%9jH8u2y99kK8%8ptcT=cezD{M5Mo z3txYx{0m>Otc2ek&|Pm2{DKnjx}&NlrNzJ_t`D`nA_9qHRkm(~gI&n%9xhGK6iXB+ zA(?UFaFCSq`;X)dOhD}QmVJF@Ah|Lagql!8XKcRRAwh|oVVSRW@_%zIuUFpt` zFFG-mTQQMhVO5l{lGB~1uVulDyAiQhiFAKbvDu$gc;k}_woGMV;Sgn-`UnJ?3q>?T zUscQ1*_%m&OUiIbi@;~*caSnc3hwS}c~uy7xc-FQQ?cbt?w$Jr$iIUomHwda%9aQH zz?nY3+;k^GNWt^~n^(3;En4pVT98*d2ct zmFT(^t)O)h{c4qBK{QAS^!!5UqDl^K%M3=09*XbkmZ29MNNr~))|W)#OMkaEa#Bwz zfGeW}%Wyyt^o4b*RIT&Al4s#MWaN?zm#IzUf9a*TEb!7P8$fbiJiQVR8BfklvpaOn zv7?Ca;;+{){__G+C)o(#@-o(1Y*c?D>GE)QeDUsmve`o?_QVB`C~b423U5%kPS1xLYd7%Y#$4?A)wrl0))#-mUIO~2CD5{I@WD?fj_J$GQw zGy%h|DC14n*jQG#w~jtNndXPkm5+eT1tJgE+s*pMCqIAT^VU<4t(J?595;+O|D&xp z(hW{BZ4LV;e4-9cne1{YR?`?A|CTKEw0!Ai59B0%4Oh+(Sb@#dbhQKm_bAYvntdp3 z0hUFZYR0myy3@ed_mWBlgynx|XGd?a9LL@EfG$`Xy-ybkC}kO|SSk*C=D8mVSV>96 zon|?kh#-%JOcv(YhPD970jd(bYPc(rxk4o7sE=)YLxr7T#ir7&85EaOge1j5dp)$@ zj6B?FsBTVHd_6Sv_IOQJ*!l%_vJXIKTUC3vK>M$iz$SkF+wX7w@%w-4Z(PZWIJpI2 zdnj#J1xZ5HKYzD5&jP;4(|_mxZD>uvtZf3ESqElkQ`-2VB8VVETbLi(h*WAF%&#o{ zq1sc+55DG$t@HDNu7`YLoc;hd8@)U~3HQwXEuidq8t*fw*=^k0?ntIhSBI7`hC7Ib z;{y_6%XjdV{{f>d!Nz}I4+8Ll|5V|pDOraw>^^b-YNCPA%=~DbgJ0Mi-0>X9?+TaP zTl}PplQ~Np4g>(plAdQz@Zt^!UirG3>+~n9MM!r48M8v@{6uT03~8@a7uOKBR>+5w zN`QxMsN5~9RRjMxcF@~yV02vS_J0Kw(Pfa=U*Y;IShmqcyBsKr>c(@7Q^B*LtamDP zt`w;PRV8*onF#t<0VERwHa3&tQ4<0%G?zgn0xEx5TW{Pp z7Jm1y5U?+rMTQn{qL=~&+HC@K;fHSHeQF9r8POiK8p)M3YdgPw&*7nNV@;AKe({hL z$#cJa^pDpUmv5Dhc*1OAd31dnWf_xJM@9&iq&B)PqTk~8f+w5bum64dHk)sSVP>)@ zp-sD{-iR#zAO3M|U)Fb(H5vmnMPZonNAeZes{d5JDRrd==Qv-Xz0Ez_sOL$EeRK2J zKi#_(Z7a)oGH$%j+x*~qhq_DzahmY>*tvpMn!0+TwTHc{X>HX+uzuS%2in`ATAsiR zhmA1t2N2T4O;zq_pSKwN&WsX>wRHU12RPx4242O5B!y^_pnE#t?hjfd=%jUdh0dWg+~=+7XDJD% zMjOLkz9b(g73KScOK={~Ouyy>bN#INg5oUGYB2FRM-UlHAppWI(3%#Ow3Z5R`>vtU zsK1oQJ5<6x$N0K)^toSmM=ljhwH$6Q&hQ`w(-|LjHMfB{Q5%1Q9F|bC!M)&1(HuWi z0|SB24&1PEsOvO~Z-;a4F-L8qvP0YpX_ygesnEBZOvYnE**9H?T<;NP@QAK#>LKvK zdsgKZhAA=Xez$L`LsQ(4C}(4mbMWg)4`to;E-zRh09!e;S_|B|6-u)-(J-(~a7ib) zW`=gBV!j(>olJimn8AG)Z>}%?x(YuTPT>OZ6e@T(+6r4}`yZ8{J_xbM66|$LN+}f8Rn`xHWCDq_RD@v3p zvs?^%c@3_gB*^4O^7v1%uhHJG{b1Kr$3xxG#Cs_G=JbCvQ8e0JUy*CptK3f1CJ(OLD9ls78mG%9xzif^@{JdVfW$DUv=$}^@4O}PVHS@0+nfN|%;4h4z zC-L-_4DuAh$d0M%>Zhv^U@|hynuJP=Vg}+%L5F`8nwIspFHOL@)2<;{PbeyuOx5ga zjUJ>w-24UfvN=66e)%!)A+bXNOrb}+-uoU1HI~<;o~dhq)!U}38dUIuuL(scDmG&Y z3Nvd=J`DXTgoiKf7OwQ&BrH%vb6P!g#>7+x&gW~xK_xa)2HZ~YPbW_03&70bP6`%! zBxHXWyekpG>#&EZnqA(z=fnlnYz6js3F1Ox*5*s%^R&He7NAI)bZT))r>!fFI~TO- zy&V?2@?%&6S6?gB2{;45lEJA~s982S-9U@(hg+eo*!6+b5HBBb;0C7tI+iWLric)73C5(myV@5@7zc1HX$&{INtfzThtX{>TGse3!GyH&8%nBsI)J&96015^jc*trq4(?^nUwAy5-}G!o%UEC=V|>E)VF=2jyJr!M<(b+I7Um0WJ8Kq9x$Uz8!E$ zC}~+DUIcLAU1=h}pn!ABIDdZ;+Cm6_$AWf zXll(%fG-ImK!~pSqt(H$7Z&sctm2aU;Qye;-@aF zoh#tJOeGV93l)JlTDg*N-U#x1zl@`Q&<|P(e_h?TB}C>52cO5B*=K(+Ck!Trubx9s zI8@%2Ubc1qA!mRZif@Od_G@A3bH5qWF--JYmqFs3AEbZjAXGCS@~r^ zR^toUSSNoCNdXc!YN$IY&O_5e@AFOHyJGpjfIK|3`!~ViDKBJ_SutO7EL7(4`zMOI znYUiyK@p#3AO~)ZVI~Ub-IzhM{|5)`Nt3~<69O_ek_Z(6IG3?~0x5sJSzB-8wi15N zuh64X#Ef_qxdjTei&J2WeK;wMgzZNiN_|u*|sRu1tPOxn}PAx4WNie>CEhPUcLSBqO5rwr|?L zM7pd0++F>7#bGB)c*1|RWZck^!q{ZpUj6c0mXxshQ<5?1Z1TyIwuxlM;m?}n|5ra> z{eY6qIdW~7)p9Q0rdW^teu1%5OlR^kjGbk0-kkB+KV>T5M*^&J38sQ8=0rYcI_!%5 zP?0<4Zj**NE}}o)T(5MNMe>!*b=nr=zP_jNy5C((o<7j5-_U=zpwF`wm6CxYGq8n` zk5zNd997E|Q;$^363d)1%9|4o;!Y<9T;!yiMbPh2WG!_1O)x93c^7y->f z3?Kn|ZPDg8&-!vv_D8ZUMZR{LX~@wpi+n%>WS&8?6S#kBppjgWEdM?1caU`=?T6|O zrL{e!*Eutpi&_0YALrnCVLAE{KkL3ZwB4%T*AUrY6rOh1!loDzuz!RAq>T_jzazS$ z?&|I%t&Q72xGTo7!i>Tbims&9zpk}Oi{?-T2@p3D=wK<(eOUlq?9Ro z3BSW(hrfSKfmiPbWu)-J9olMNuj3NA_l723C>(&y9gVz3IY{Xb9EWND^yf6LN%uaS zg&!5<2P>}8ij%C67)boV%SRbtUF48D05)!PyRgHID?C;F3eS zHv6h55vjQWzpPP~KfH=1nu5C&g18_1u3m>ZnTD5;JOT%QP`53D;2Mp!rJcx(j0KF= zg}*jn=@Z&_K^-X^Q`yS}fHHV}$waH1DX!07iON?LC)qRSsSISGKS^+Ndi~d*tEJ?D z>&5CQ;bDNd^|7gxWePUD({#Aaz2?fyjRy0#pjb8h@j$c4t{7{C4qPglkFYXsTY?a& zbc{*Z9Jk(ov@qHOiq~CWvakL;)cY!I^<5K=FMNo5w|vYC z7_=S>+J66VZB>e)VKMH@Dr6jtrgMS3UyfM=6_?@Bgx!*nSuSiOU;v>;rSIaQq!^B3 zo)@FnI#;Q;Up~upS|A$_G{KmK1Zcbh3UVC0Q{4xDb$mJl(dWJmu)}k~w0(p-_zQFn zNT;B_@zN=omIOKE1(2in>%apA+7{i%YSAPDAl^(Gzh8ZKKR)c1!cRH4E>t8$MM98C z@c(dVMvuG5aVpbbYbw)VeOmo7#8&d!)59mOrgi~ z6SdGat|;5P4N2`|o)S%1CWW4R z^^EPYDqQS7_@nM)-esI`D->jlyF^m~R|qq?Ia7@v>%ZN@v?B~`o#`jM#i<(KgnD{g zJ*k!daZB-Ky#(CL$6jK&e~8ke2p-vd|I?TCrmjkVQ=NZd_`0gzeNk1v=z?bMgck~W zQtgS1>Q&Xd)Ntt=_qEl#lu&#K{>thdT4gJrRPR*35=vF~pku6GcX;zW(1vfyV{tkw zH=jUQU_%flju6H#0AUi^eUaIVKp38tWiPzjh>U}Q^NTPR8B~DW%^9Cuj*l=53Uuur zV;CYB6$5{#DCWoaqlY&P0c^dV2|R)Qb9Rvj6X?d6&4V6wH_kI6G{}>F7e=FrA9UdN zB{F%8L|D~UgYP_XN`erGc44i2PPhv{uq=Y&RMY(%xc9_8&D=o~*a6|qk|SS&z1KZj zaEno`z83Zn4sqL;X8oPHRO^315~>%AS0HjzdO}3qPNm4aF*S^f ziGBHODI6(0(1L6Tw3$2B;;=O9_ON@9CcRr$fh(}K5-(Ta6Y}~SAd3$Rfg?5LXfb-w zTS=!qsL$KI9%aeX&=^6zchVR^#pW9$B`r2axJuMhDS#6?!p4`LP{!x_Sp@||fH?O1 z&)Ps0%JwXuDT(YRC6VW`!7As%4A2oZ^o)g5(gF(j{_vrx=&1!RIV?=&+#o*4=ot$% z*zEh3M(e1*(78Vj7e61Dr$7Q7Em1OJL~xgWPbVwhdw}61awDQL3gCM z|7U^MB)2h>{|2{BckP$)Kmrt#!L}0wGchnTm$ByoDt}vV+%^_|&#y2FETRECiYSu0 zw8$=UY0wrf0;JxTZHj;%$sQpZX)0-AJHLLzbRg;DMo)?^Y z+@3SpHpu1|{8M(rDXXqoWG>A^`2Q4hIu2uPJymW*6Byw1_mOlXa?t3QV>FGg**&nuJDs=@pL~MUv+eqgb*p zP~T`ba*0oG-~apd#m@^nW>KgzHSqytmlS~f&ZLVoO^f2X<=OtQXO*_y(DTsIZF^oo zzL08i+XZH0;8q>2rube@wMiVjTV-HW9e<18m>8%v%il^sam3E&Tm0)fyh0p<)9%2F zs=B(W>H%l&SD6mZaZ*ck0jkFBsHNETU_?9#M&?q1fvxLh6@>{HnS?Le*?7kzUn8M=?nb@Zo3XXHy=;L_-k@+*F0RwK3i_I$Oti z7)Oe)p=_vP2nQ;*!7uGfE4D-nuGp+}9AHRHlc1yyI42vSl?yZ;U@}u+_VBgQe4|Z1Eq!p ze}j4k5)bzFoM^hO+n;Q3=s;V2)!bkTz=@4y!i8OimKV9Ezgxty)hGdM ziv;e;sG_+w&18Y(h6EdDqcYEVbl|9oO*b|MrmRcX4?L9chmDFnvX}L(tbZZyQ5t?< z7OEa^OSj5`cU9*%Mf0Myb&cHQV(d8dxoV1~dyz%j^z?q(X2HkEMyzxjorF(o$G~)P z!8F>OrD2{%9FGm9Q^<~1&WRSxCxO5YPCKFUS$2LP@SDVAyu5fzRSbqxcW2AJs8F*fN8^=feV6aOd&t3Dx80$_hktCr`VtIBwJ5W63+4-4I7gq0}qF$5^jph-L#FXdETeSlXD@DMCo|$#nQPdglO$4sz!pU z&5+_0S}k8L3$w`l&ol(E0Ak`)L#O7ceSm{TdAF$#MOhG-&4NE#nSV#jf(;J3)(3tI zVuJ`oF==z?kHMK87YV9{cI^GSN?JW(888U5Ax6&SByp{^fiwj8btbWoN}HwJXDMTS zLn}5+krB8D2uMO*>M}M?9V9Z7o31aO^$H@R;?hO;QUBSRK6C4Wbs;?!tC9q- z+z-4JBWxrnO4J9qgn-#BuuQUX(jUtg?9{Hi;nPw|1$5dDY{jzxJIgx#5addt1BJiv zSl?jq_>o9~0%f?4LAS9;LLqRAB8Hc7q5|^j!w&xnV;xUW@PAICx!=;J;WCaR+q8l`ispKm zqimO|ICukj|9>#ZT937mvI9X>T`6arRH-Aqo8~|}jV*$OTmFu~2-;Nh+%eeomFL6i zI}Kx%o)(b2^(O$fvf+YP!AfIC&m-gv(5tO$DLe261#==&UN}F26saE6uSEy-=ffjY zD6@~nt^ijroYS2FTtmLs*-0K~>!r*Jl*zn)SCQANR)3;b9D@+ma0_9nf=JBaT9Fkm zR(Ljyk2RjZVbgqF${%|Az@bz0K8o$IJ;iePHZ6bWg$)u2V@IH@7*pclhRmKCtWFv5<23$Bbo@q$3hLb;rRC8U#N zPCNhp3V#c}%Zpd9x$mwAe<(vlXj~njI9ylD4>-mGSo6Dnc!}~yE?zytg*5=OMlO)@ zc3W|Q$cG(z|A?ToBvdEiOH^o&F6@!;X_x^db%fq8>nHU9 zVd)6|&IP8RjevG$BKLtm*OVf1?F;Ct;O^Xnjv*4;K15>MzZ_y)fE0Gu_b+I~OebfYX1|AlTvDNlQqCz+=2KykBv?F;@$?JVg_vz1*!G7F_P4y$ z@qfo(3ELY)9}Xc4-3&J#0T_0`mHx!VTq%f*EMALnkM&T{m5qdD~kk z)JDr=ysuKojWyqcyO4Gv&y_u8kjU#(EA;TT7othD>tz||P3|yqRCr?)2p}_m*uHCh zbv}6iQ0XJjaXP_DMm>dY)9DkO!YED8rhmXOJ`p@PkfQ~ZQ2;qlWFt>eS6%y=B+_u7 zO0xLGyl{eR2bjSODNnRxj-^94?$FD#SnGGWb5sW6o0r%k+C>MvR%{`)ytX+IeO)_W zq#G6d2kek1OY(vNFDUHjBRgnfU||dD_lzUavu%)@3lbR7I(ic&hb-RZM|ImLT0fWaHR6zuiaftSfIO@A;sVX@~C zzYm8>Anxxc*KQ%HExE7!h6OZ6KcXy?PgC`)r()(g@5SOZ{-w`&8(DW{aoAAZLq}qb z4L!W5GQl71PN?UZ*T@qCHpa4<$T0R%$!WMyo6$(Hl)KTFw6$in0vOEme3q(7kN9jA zage}XvtBM7k}y-F zI|xW--b!vronjxWQ&RlZ=0P3kAZg!!T`K=F3(biGJ`T|M2P%~uf7swI7c_~4Gbplp zhr#B{SU9RAcm&krFVWFA(=`5UdknZkU)I;WN;T?M@9xs0SdBhTjWiQicyhyIt!albUFPU#`xjGNJk9^B9`Q;?R`)9l1g z^P_BPJwH2u*yo-#xeGs(VT)8iyVJ`nwp@R5{pm&QcVA?76Ek68D_;O6}sw@K3rtl#t%#7xhX^xc7e!hJ6U;Xd<8JF=u0u%u@m+`Rz69X_e zGn3(9D1WV5+mhV25q;NJ>`O|sRXY#~5WF}Qr{qMkm0H_X^5#iasjx%N4r2~E=Ed6G zuTM9+!OJYDl~Z{c;>HHh=stbWobPU4ym}kO7n#Un8DHG&FG3lJFpDk{DMb)x7dQFE zhs}pwGt~Xnsj+G1=xHJvNI|47fj(SM_RINt8fu9sB(HPFFp9w~%?YDks8 zUT#C3=*?fKdMxXLhxLboMVVu9`SIpo7s16g3`M3jEw8R0C*kj{NFF7X$in|&57&QY z4_tbA{c^Dzd_3LE=dwTW9Q3H0p7plaTI|`{wcFaOx9LR~h%CU(?O~fxmLWV-5oN5D zcYpPzOgDYe)~2c+F1Jw>kR~IQZElCM>bGT0%|E`rOry=s_3Q6QI2goCdKfE_=oD6F z)}aFthsq7y5B07uo0?|a!74hM?jJw=eEs9k{}fcaITYSmbtHUF4TrrPRjUUV_p$ z4XXMN{3)tXw5|iv`c~<1W36O3;xFx`XsM&w)3YEuYJbb3 zqXx7ZeD+R6H=N+j1m3J0DT<=m=oIqfmF6&YnFAH4?=cm_TLjQC5@$8*?<( z9sHoBgKkqTLASU@+xcq{s$$pM!GG}PEzbKueFfP|`_LcC`i}aoLqgxU8w8Dj%>xIR zs%vNnx$LhR-prMQgYBY%lxKv7 z;dB};1?w=@)OVF>X&eaeslzG^S|&@z+Ea5WsKc~8L2;YIq9|m<)PuA zo2LPrB6j%w93;5`yXJTrdVe=@c@{lzWInXkQn9~36u#|{5NBzzw4fBlYC{G9OD(8w zs2c-G(^AvEZH}(fhvZo*!YR7!4o!7z@=q+`DU_sINI8OyTZdP)grQM%F1Z6;cEz)j z8&Id#oBtF$bRr}WQ5K>8JQHnIrbG&xn8V6)C!hLeedaKNveIs9Q-9}voE3pi&bPC( z+F#cf5c|27m z;TWtU778X`+F9wM-o9y%6!-dr>6gLrGUHBA~W} z@jVJ-iwKI5I#MYkHGd3Xn1CTJas$qm7IFDii>olQchU)08H2)PjvThmz-nJ5fJDg7 zvy)g<(9E0RYSI18|j`YW93!0GJZ&BKPyP zMCeREV-XWwvn&EcKLuxdve1JkJL8D9?T<@vHB$|K${3}vgnx-&Y`?wl%156cMVU|& zlvr~C;f6NZmv;vXe$>hgZy;X-dyFF>DQB$E;&g;D(h7r;A8(-pEyjRHc0JWiWy6KB z)PP?ubEYU5*;sOOJ_G0?wz{x9Niyewj(7Cfnfj$|Nj7&7p$wT}QBcz)=W|(A=SxX& zDKmU$sN$V4-+yd}f3Rgs2{h*ikQYL=7DAR5c|r zYiOq_HQ-i0>{t>LRt;`+VDXf9_?3YUOBJ}(!VrzVGa9L3s3oxWa=mK;Zm}^5VFLNre{-I=T*N$ZH zIg}WU8Cm(p3(UQL$uI06#?ZCM&LlU#G(4p4`oi!8JpI8;K;fqGoYXnrXL8vVm=`al-qt=KYj>gy;EQ%UDt3M+qR94&5mu`w!LFpJ9g3? z+qOEkosMn({XXBhJ6BZ~bvswBsWC!-x9*LmLFnUv#9Fx8#4)&E&$L8w2T)ajLTWo< zqi`Bm!H=TKmCx)ucaby+6Eg@k04U+X*Mq1q`XEtygB;yaPW!oauj-WG6}jI&E^;Y< zB&qE{Qc4E_#%mQIV9`d{v1PVRN053IRA7l3U`Nt?Y0QNx3nt?Qz zhCrZXkjMOuqS+C@hzTm?-U{mV8s}RJv%lnI?%tux?G+x3B|3lMmMQP(JnwN#V+l-! zkOIwUyy)~D8}}Rk!eG-iBbnO)3^}4cS|+tdE?tsX%DKU7pfG&e2$9SiBvdfImn6I} zM)8ALdX!SGGEEPrO2hFqAct4srj1}esFTD1X>|RGik=7$tfh?glNF&!~DC_?#q9WhM+Nix=>zZQKG079=b=A8km0eKR8)x8ntyOE*5w1@ z`SnNcM0;bkKO1Mw&m|9*sCT?0u12Mkm-Y>Dl#v)KV0q~PEtkB$Edt0kDfmQsxl~nc zY1@sfINd?5;g;JPKxXt1t11!^1$bE>7%Q~d=V}ewR=tU)Dj|$3PR8r%-SUU`?_}Y+ zQnZi@%ekMbG+DCO-MS)m<9qd(e@3l1=WFY`(X7b`tlm*X8a^t@Mc#3~z6z$l;YpnQ z7u1A)g3;oi@%pTk5X?-z$phJ4Q!!r62;wx0hLJj z!Ik_5p5!Il8-^@VkDx4C6uXo~BY(|Qa?Kx=J5HjYVvS(|z(xbxIzM%4Vvzd+tDUih z7*<(Qhw9en;hw$ft znvf&Y+|at_D$z>>8j3dXxWfV;USmXillldgpBE4D1 z??e8_=_w&-I=8~;ckau>WM_U)Z@|GjH{>97XS!V*3lzT&Ftvf4Kq{&;Orw$icz^RBi#K1VQ!J zYI=Lq?`kspGTpWBEt`xW6DIW4Fw_oNC&CIC=!+WS1BT*c1JVs0 zi54ydTwoW-Od?+&ygOf8{JjEJ1A2F=PyusVY!e(pgF+NyGDO)u24JY!nhOsZzS5!b zfCx7sIbS{#W6KI_nA;IbdV8%m}OZ#j|o4b*3jn^t?<8JkUrv8VKXTFXONE= zoI-mn3{b7q7>;^K8KQ5h32UV41)mfBNMC2f}Y{cc4FsqYN->5COuG5EkH-D4^Mnb?{C|_3nzsKae;A)v|0F|(b~8o8zkVa&&z6k03}|;O zL591B6>3csi6GA;FH;PDz1Pr8_-F-Cu%M8ndb!UC01tT{Uj3N6P3HR$l&K7@sS1U4|jsF#Y6O9(7^lt9dHD;^dQ7Q39a9}QHdk0cz$noxI}-t*%-tKt^L%K zlKN4|#WM?Ujc?9(y9zcWD3ZypnrM9ka^C#SaCUjx=$P6GGlP+OUnZ-NM#lE^AhSbN zDJa81ML9>+`A};zSLPNa)Ced5@uZaD$YG}B@z1Qkq<*XL{jnAM1DTvtp@-q}sO-21 zO+RQA!;2e$o9PAfFe5?LT2%-iW6L(C-1XzGkDOS-p#_P^r%fq35cVP8c;0-UyU4<1 zkj^7RD_krdMGiGcY;`ZZjxn^9Dp{b$Z>Be70EW11jWU%%o!$z@|h1l7SQ0 zz76qR0n{Rc#s8f%SH7@2Zg^sM%loPm-vizPcB1g>$kpQ-2tH*P7t-|gr^}!Hz#Q!< zsFfrd2ho}4f!2li%!Rp?^Qcb@q{uWyL*oWdP=ZC|%%7)SV4 zgFOT|%^(S$hK`bWS=dhpd|gCbcM8Pasab}L-;-cGtKTT1ogf@!@wejJDlfJz6^d~M z#x6}pS=4OQ>%7x89fE8xD0_|mLNb|pE?n)+KKw)FewUVQ{>8g2z0!k!w#OQ!QD|7G z{*X7(>O0r9W!0hWP(^DyVvxKO9)M39#(|XP1rjUB1%XjApZ@IwKr%8leJ%%w)^?-u zE#nPL#A0Wh?VX?H{#}#kp*`~M*Bw0gGhA9HGtq9u6_&0+xdVRnw-^!|SLB|Z(nRWn zaz&a7;^bhEkG!xYTT}>489p*e?K23KJ%ybQ8ZwOwOLp3r0}hoe*S)XbO0bh`4n&sl zB(C3V@V31Wme$EJphx)?5u@S?y+X&FbE$&hfzTr4+Hr@_V4qJ8#C=3(a(Q#>;7osM zbvWGOSq#gj?UK)@fj9YQ*F4PwYE^6ga9k2JxRmd0wRU zL9C~VB9)3FqPfN2Iz2sGXiXIp@o8zFjXZk(7hjy%w$8T;fT@eOOVGFU*C5XED@=>S{Ou^&o+<-IJ<~^Rd3DP*)&=zTE&q@9l6H5e_ zOkf{T^m0il0Jp7F){DFix6+pxLB(A$pk8}+B^wg8VDskv7{fyO5N%!VdO09L(MVbt zH+P{xMvLedWXB4n*eHcs*vviD0PLahuNx>4!Xa(R;R-~XT=uUU z7NpXK6s(%$(tBAu^T3hE6b{Vcz8n0E0Z`UVaA?^BX_fkS;tX?}?EerV+`vLX(>uxKW}1~U`b4iNc*5PG*zf=Bi36&go0KI2sL}bJ>Iq#g%wLYwh3Sf#zu+?bA01rb)H-j$ik_}Tk3?LnsHoj+w)TfcdXtLptcyYo3E0N!k4gwZg1RueJ%=OxO`bx{bd5$!dPP%{s$+q z+=bMY68zs+h_(hwy`v|mBalwv2)>}oIg@o~G95AZLSZB*5y9zYoHKcaZvJWcdans& z+Fv8g8<6^$NPAj~$A?^duQ}0}^$ldAcK*9kjXGBQ!5LWR8Qx#{{$=;P*K^teVbkK# zUx?hQkwDgZ#vH_Cj1P*-ylF@^1Yb}(C2o+~&nXd@K$Le!mMKR#aQ>m{1N0R@2qypu5k}C(l_RAS;wg> zl}iT#4SS2F)`}Q5oEhzeQErdCJo%Gna+xBkxAAMhL=v%rp#~j)O6?_(F}O45KpC!! z71iClzqC9{%r_9gqo#nih@^Cy^+=UT)GQIVd^wO0-fRq zUN-odnShQ608->qXdnwj(&%p2zp{%JBNr$P&wd)nt}rPh<;*j3bR=vbwYFjhFIOyKFD6wcg|KhQ#Mcc1;!e^W=WJWwUofmo9VVaMG z;zmav)ns8B?OmQ6Uw(m8nQMnTx@>N-B@ST8HT*^m*l2Ty-v$sN2nQ~gLu;R<9h-c@(;7`*}b)VY}Deiq*;XupeQtAyu8N>X@47|IcOAG5XJp!eCf>2 zWh9wzq^MD4i^+{2wSICV#syGp(fF{3w7fPhwBXWq{kbZ-%UpX217ks3j#$fCSaMtm z@m#3|NY>U086v&?^)PujeSYpmdV6KzDfU&UtU5ORUMf&>asRv;EC3vINS}p&Hw~Wi z%~reCx8xc zp4IEs8Z9c4R6jXXv;;65;ZkFX^U`geIzR@eY&}3jnYe2O zIKkh_J~5}9xgNVrITV~(YO(avlzI4(b0p4ZfB*z@R>&SZ(i7GfTQsiIx|YyZ`NOI* zQDdE2t@3<4igbZbnZ5Pl1zE@Sh+Q}-5a4d${KF71mhw%ssEbAb85 zD>qi2WA0=sG9D1xNPMr`kkWYUj-#*+i288HaIw4RHJZrVS0-5c<(jGth3QX@!%-3X z+o{wdvz`9 zBbx0ot~&Cy$j80W)rxig)#8+sWDL|=wqpn~NnXMnGELLgd7}GYt+Yu>RVv<^03pA; zF>V&?`{>b+%5nR)(}z~{7kA^Wo7meODl_vccz0wZTQCC= zfm)Ipl|u9wA=o}R^_o)<#%5t03Ffsxc^Ym}+;saZIxfs*M4S>a5@pU-+R9cs`7zT_ zjT1dpPNEtPLj-fOg7lS9ku_fm1k>MR;svl|n;kV?#@B|{t)N!_PBx7Hleh73bN-j< z0+xW|@f+MI;nx9hM3)8fu7@0LOAyDBO(s*WTJ!hGbdyWN1*$WD z{+kX_!~CWTpxUXjtbC3p38_{AtL`P6;3?A}o5G=*C~}V$oZ><@@1b8{ilAE~ZWvZ! zsxO$65&l8Y zkIVcKL+4S{?O8LKxKVT!%zV`b_cH5>Xw1J@B=QucM_pwF*Xm@MsT0aacQdt9AAma? z@W}ZAQwfy{u5F$1_QtaY<(g+`u@%=ThdA!P5~;TnN9E##+>K*-z1(=s23LqC=3mZQ zl0y<*IOXtk%J!2Mq2Hjc8Se82-80fQ2(roL;r(J|4PWzKkMwVj)>*Ux8wKNVRy4{a z)2KfrtOW4fJtsqH*CT8o(t07rhbvMeT; zz}lXq1Z32 zh@3(CCCKNLmF;%I2^~J60H- zJ^d}3fL7dra@h{f&v~#v`9eSGN9J$<)`#12^@OQ^%yWYOwee@hJGy-`K?86kyI8h( z#)w_H3Ct$>jn&G)6S`~6Vtf2A<8Qz8q8qTb%lXmRn{01Vsmx-L5J2TOUWw5Qc~b{QS1h4)aqR~oeDf@s5}ZqK zTn@zrqW?wwe@Vf+J=hPx#y^J#g8z)>$sCl;QZj?#Q_D6p24RQsnyMy-Ox5xT0bfdP z+2u+CTG}5X6?PbuNs8ggJ>CX333>;$aY+C#z?%| zP18#uUj-4`5X-lU;CLm^5fl*(kT#LEj}NN=d3% zYhOAvEb8KByl&QZ?z;lX@4#l1nnKp{usKir@EJRo2X5@Xn{eIQ6~~s*72!b-k(_10 zn&UGO^KN0Y!*E(ZI3O&PXUa0D+AULt@YBJRlS_V9YFwrAP;0QNxhEv25z(y-7l^5s z%f~f)!>`Z*el@VyDLO%IvCqzzEkjlF6Zrp=aVq^aba3q1HrSnPnIHL8lm%su^gt=* z>JB0l^Zlzx1tR7gupNiJ<=%Qx%TAT?^FXSb#fkC*z;V{6E6@%5no$>Nt%3Xfw?p27 zT1hd3`9w%1vm)4L2L#?gzmD9kAq{Zmy81H$wUHR^%0dm%U6tv~q7F}T6ulB7;G++& zotj$|%=N0>l2TPmSgCw_$0cQS6#ti79{PKn@DiU=B!-~>Z628D^UWO*fr^S&2A}LI zLL&Vi{dCD-O!lO4jHtg#132vXD_BVv5onXm3)VKRHNsq3kwj?|R%-S}Zp)-@ei6U9 zZW4dsIkr|u*kBhtai;vl|GUc*{T?V;rto>is zz|Qu6YSdvZd&P53jIV7&RBJ<>#jI6@oRUtF{q49*183s}A0d`dkpmH>vxj3yt6!hb zxfCArB@PoH_GoA|mpOlVm;|4Ah%G}7*d{sZ!hR1&vgqO<1qlVq9pg6kwc(jqx(U3y z_(4_bcGCPDx{jaS9r`^A6Vf+ z50CWEH1)?z7S?NUk^&$&m zowcAw$tGPkt4}98VcuTU@!noq4UF9wv-gV%?!1AJ&$LV;QwgK6#Ps)x#K)y6qdGh| zdH__Rl|7XF?NpWWasId_#`!+}iuCr<{Dwl^KxpS=G*?b6 z)_;|r=wFBz(0e1fXvd2vdaE4*3Sl`nEdG|F1%vG8!J^WK6iDEJM{22-XCAD}BaL!ma{aEE{|c5KACA2y~?GxqVR4E+&DF zL+cEmf1&;~P2p7;oD{f#276cR`k6Z#s)guE@8(JV#7FUpz;R;WQlc@I|H@ED{G_;DL3>uLGwsvVgD7lEF_h|BJEUMR!D=ze1tmIA zV&#W>{7LewRxVWLTK?v-tyq?@f|NNUgySuU=s_4cB4`2zLx&+3GK9M~&TAtyhDL)_ zEz@b;y^`rafCIoy7tfn9caG5GBrl zsVyp+E{z(q(2^vgi;KtZswR*r<2-yzxCCY4+rr;Mm~`5oob{Q}dSk!;)Dvx>UqzuV@q==v|s zm9}l{>8Ia@9+WB!({)ZKyq^Jq=(OmNdnWxcz@JSLtU!M(#u2>2Z>{O;uGyjI#td9l6JmU5!?P<}aExwG#t5WBYvp0yFp&g1&ai? z4gNufCmB5}NSL6J)` z?N$U9Cz|WdXQEu+ZqBro^_mTMq;$ixV-$`BBkRoiBVtAWDFZ-K@zFspHMnZrZP^#G zyZ`J5Y9P!B%VzM_6ZM}+h(8Fx;| zFx^ZUG(MElb39)+n7->ViZd_z zzZMWFB{(_+3p*Fj|8|gQfkU2Pr~p=cI11|ycd6`}$3SC!RGgLut3*o0bl_y|4i5#T zZ1m=GV4t#VSlhwXC@+MVX^}d z@c8t3G<+SPl^XDd%w=z1m^7X^dcQ%YixqS3U9X4LuKT*biFiR)5oJ-5pqOHcOf6#rTZ>37J8fmbJ#PP&xGe&XhS8`xLC)04(NjI`k2ji0ek4eQgsqnT%o&*^N0eI=CGnTmh97)MUq2@~1 zz>9J3YaOUvG|Ho&42>}3GLH<{;1WqG&4RJY64DsiHFJ+P8Z{|}QwPyFtBpT8y>B^7 z*S@;6;&>2=H(_R2TN=Bgl$ZnAD2_qIXh^U|w15OQ-+W;a&(|GvS=V~Q8!B~j74oME z_PYJ)xnf>#0DjJ`5Q$%(GD~!;@_FFV`csD`ccVuaMBa1`;(FL7@_$@+y31pvv_j|F zm%P6sLsUze7^^9HR-unydfV6i2C*zfvp>x5u9koiKPY(mRN-&+94x8G=7)AhF5%3~ zT}y_MD5a1B#I76uZU?-#o}3tC^LR33_ht zp4!!F$Bf1oFt2<&p04;AfC?k&Ew0c=#3P|DR{9K{*6#4bkm`Fo+3rU^%Xl6IMo>G~ zBMe9>^YTA43~bb?&M728g_MbPb_W$2%9C#*?Hoo<50BObVXA+}@_N!RH^$nI6GMA| z=_O>v0U}X;XyM=D*}EIffYMug zSW^FiVUppDTEohH-je{uv-uscAtschvAr%<&Uel;Jq3UM)~iq>bKl#QH{hS&ZV}UL zkIM2-WkbARo;5Xb0UCom1|QM>FapcjW5*OVp?_e>d#X} zBm}Ok7NQ@h$>-cOL&*`mMd=3`D?Rqb?CXM%BSh^X9#9%0frclIJ%A3HUV(-LxPgSA zTW`ZxtqDco;>)9Bn~d}i8s*M{OA$-W&LMHEmMe$&H%*)k#^-X%Ro8Ju2|(kP$-}dD z0D@xGRlHo_A8xCR)H}C9#IQob>>dsa z8S)JWR0gAtZ-2^YEta+cnp34+0mvAsATmBE8%lbpg!MI-{`r&BnyVmq9fTW=MkOo+ zgwsgM%qpdku^!zYEz$yi-d_*T!?g1@1qmNzlrwD3m{wkE-u(gUV4 zWK*&^3Hq+TFbJG2lO843^RnbzPs)*Zl4B#lvL9m+k#?iH^Lqf&fsC=9m+R8LXg;6$ z^NMKK$0=*jQQ%=ssr(s2kYY-qw8$oKrHlRi@Pgr|uI)O&wW9L$Z1rt9@}J@_3m^Ud ze=KSqd{$u9JnbbT`~Yv>U%G)IkwzuM!qPf5E9P@&Ue|OMUSb$3YVRq6 z#y>Y_^GD5o#4P71yx2H14|qaT?D@QcRU?04?416z)KQT3GP~}}8?U_|Ux5W}bP@&| zz$prfrHsx*ntwbzup}^>h4dh=Houud(t~C=jvQQ}d$GM6J{Jq|=VT;2-oa6gt8cunf4>Pmi!aR7=!JG3F#+vjFo*|UZtAEBCH38a&aBKyRoDfjE~%A%~@ zrO=bJUaapp&`6We{!A1(cT%0pt1P`nnoK42T?j^VQ0TcDve*rxmts);Q$z}+sthER z-3nWG`bsp6;vU9(!g`0=hungaF$f9|`TaVwn2>7oY`z;$i=to8AOa}zw!XuNBWSF; zcg{#sz>w)ch}eqtm1?4_HS@k>$+vSyOCr-RH6m<0vCO(B>SJZw-@o7qb!usW2Y?!| zkU0qfVkc47{i(Zc??1fgDx2T4zG+-~iDs6h#C)R@p!WCd%p|LO0}sGL^|})kn5WYu z^yUB&w-&mXzaAXsrU3kI*_Yr9Tb;%p?{1B&#_tbZ#H03=J9FueO>vID7=bv><<}y* zjSB1+gTc{t{OmfQ}=K=B4b*3Jx^ro6=e?gTvmtRwmlShNeCn;l+{q=Hz)Jw6rk# zAV+lGOOQOm?E%soCS#NL?5iev9qv2E*)-k5S7%DBHX2+9+s#K2@D(cJ0LVfk0w{YcSFhrE01w>R2Wjxkbh?xsf#R+32& zIQLTs&xLAW(W-#(^mZB=rt=xX4Uz^PNz9@qriSxbYXI{;HC{ByoOvg~D-cqI49S}N zzArasJQY`}rrG*4SxtxJvhm7+txs|)S~QR_7&qAM8n%1Blm1+)I@Z1uech1R)w^L^ z$T*5W>zz-yniTx-OB=Ur0N&KU(H#3@n3W}N=G_cERW6=Q?q%jjPuJ=WV3Vb~RLo=U z0_sN8dJ-VK2Vf=F>+y2YnK0zAGy4avE@A<;}-okIk?y7~XAF?6_k9vv) z6>O8I$T z7cSx=hiX}$sKBe-L`KS1ZB-F5Ztn0I)yYU-8~0mg$V#QJf4N5)g6k+>pZt=+JAVF#6ke~k zlwUhG;ou$+eI94&TKkLpMQ?^%Vg>V=?}f=giY<%a_C+Hh)1ms)_3v&3pD(=+O*}(z z(o_5t2$jjaY}?qKHX=3;Ja|GziKlt5kxP?rCxV=(_cP`yBD0hikU^{T(F z3=0!nl>g`YG6tWo>DQr{YH1@5uc1-XRtTL)t^{JO)$ZJiHylmK^LFBdL(yDQEE$YnwMvCi+$nhP5{sNO+Wshbfe))pP}!mD38jA51)#~Iv&qOl=o zJ(K}sky|WP9jcX(vzhu@p@-8xe*b!S5ZZ@NkQfLP4#SYjD-!&hL|cBl zYq%fGpa+53LYWXR%Pxa{R%ucg;&$Oi9_T(Xl;`m%AUrHzbFNt|X(|HzSU*GUs}Nyuv_mhj^|W)}Z)rN)ep(XUrpbVTZ%r~ zYaA9^_%Sl$-x_$DA4Srtfp`+B;q|^<*V}S?y~qyJ7igtb*L>MLXHWA>r+va?h56Ro zq*w`@!Qg{9kNw)6iEo3MsKC=1N~?Rp=L5U6AuQbEuqE^(d`xB{Q6Gp z`DDZ{L)Jb{ElL&y%CeLq<-;9?fg?o$NF8F4Dw#9K;ynzJE-6Rmle%NCxe{e)5AU9n zBu&>t#hCjXVtxG@QV~L#Bs3}i;;EPG;j4$}2_y4nt~W!?kv|O5+6HQ6d5MP-hG`+0 zTt}I^K-cp_1xPYLzkCarWb&g-LYutG4<$QCQSczuvv+W}BiHl8RZypkF4m#|CW`}o zOn5*9i0UtT^T|B8>&=v?S$Y5a?!=|KMrMJvI15m z4+w?MEb%3~Tgjcuv-p+eNnU-mF`PTid_Z@?$?i(UL+26q~EC8`D*&ft0 z)sk;Q-{8}BM^N8nQ(mbR3qUNT9mV59!?E~!0bmD2zwI#<=(XNQzRI;j#V%c`KYH-I_K z$G+2VWX8AJLfR?4+0GtNts;!}CPrwQYxX_^^u;0CL}aF*AikRw&{l+YTX2VOQ(HrE zMH*JmP{gz-lM!ms2AHpwW=5>s%*SPCw>h&CE;TMl|C{we9(iWh?=+Ohe8!ye7Y}I? znEfL*uc3Z+#o#ay0LlvPStxDV+i(ra>~NlGJGh-6bnYaaMGrMtXF9@E;k+tf`W%P= zCUP|r4sYq6LU}w;kv7(ZI3aA|BAVkjgg(o}@?^b=n196q21zgz9FMaN?OGhaGm$0$0|A*UU z8+{u|2XzVi(T3;ZPWG?l;*m;PgdY}I+HAKi4yK|8wv4K|!^YHv>aOLF01 zWe0({!D_)d#tb_GibDWzD*OH}W-_E$Q~6>pFj83Q+GUTD^dpQSGR%|bIpE%MvO{m_ zew-Lsi>&Yi`O8UV=X6wx0Zt~uHGbT=J!BHXxbQAmjNme<-wiVz<$?hjub(0XPH9#cpf0~ zX@f=;@T=fa#NWbPTd~aeY^LEyKK*Jl1mz9Y$8))Q-wrqt%{G3K%kH%5;HP=F&eGBY zF+Bx#b_5 zYmp`)TnuLII6-v2#@YrlWS&=$MpL(8-7oLzZkm zd0g4izSCld6F~t9C!Lra8ZD{K8B6-5LS+rORk~%OOMSsdgnu(P*R5PIGEwrdH}MLj zqDrwQfch%uTo%BCFH%ooPJ-z#|G8d9WrO;e61;`ErQ%H;8i-;9Hp%CnMqWMS7*l(P zLElSeHFt=o<_1R=WnF@|xlKUUyC~L|UW=yC2GhHwi4Y3~VbTvPPvi-WLs>4Yf(ikE z_g_^H#J?w1jvY|9)=QT;=$Ay>TwID%6TGeUjeEZ{{A=kr4VYWTQqx&$Xek=Ox$pP$ ziu^DS-xO4A`rcD6BeJ5GR?4)@k8EKcQ;6Ed34}+%!%6BBBZma1YvLv-t`DsWarUe^ zj#ctvIVRonB|w3<;p?-I@|II!rb`BxMD1@Jiau?qk((q|Kw%Romhr=|3*rQ3Nh!AV z(tFUDLQq)Z{G2O00TVGs5r~p%BK6rV6&t!Cl0gdny=y=)LIILiDwcl^b_Idl{w=3_ zJz>RGN-)IBtCEo2b)GGgTlrDb#bp##6%7lvTQ)6NPEIBEp=TRzF#K|8GDZYo#q`g$%AU) zod})366t8q_adN@r6OrrsG1O9Eu_9Yn~`O)F=OGq(P75s%%38yJ^7opNyezgNYx!d z8L)2ZF507Kh+!&Xo;K)?fnX?ct(#!Ks^xOB1GUE$>UsoC%#$)E2VpW45uP*rz+Jq8V(&1+^}K%B!meMrj$? ze381#eV$E4tiu2@mVHDsYK$Swb1ad1wua~2=^8(h%N9-3DUjV5+aFY%`iS&?2KGo3 zr%++Xd)PlOVTH57fky5NG|Ne$!J!zWvE*k}?m3Z7O@p^0+k;a6mJrxp%IV{ghql#w zZ~|p=Xq0$_!OxWjX@&#fZO{}pC<#<>1>wZfKq!NK)F1z@Db~T@GHY=a1ey8CRFxR(-@%!to8K%z7_k|*{v+_9YT(44h2rb(YPD{QZ0_Kkk}u>psmJJ z24_`YOryrgN#)Oji=@4?sZ{!-Y*E9%Vg&IJUo!W+LHVS8Io6S|s6Qti;nwn`5=jIp z*D6znD%f0O>(JF+D#J=7X%z_N_)8TA2a;>!x@EGX$9)VuD2Y{<1d5jXdJ(ki$Ou(= zV4k!)PG|RDiTnVdb|$`yRKHc={}%^K1TBHGnqs-o?Q3toAEOr0>VZPfr5g32Nu?1^Rd!j+aG!=2l;%p?zriA``5+F5%d zk}E0TLl5UCrrA5$8$PsXiMYI2Lc{ZjJ{(xa)N6_p5_lbv*4BPkFt7S%db=x4SgiQ# zL4*p7KiDbYnl@ZzNEVXqJ$Bk5vKhA)sDree>pv<>ML*zdnZ1^Y63-6l2Z1_~hJy)EikWPPEQDEo@!T6iP{v513&tSqU8;-r9Mq?eYK(D zKNB78g2ex7s;P$IBc4aG(^eE*1NdZ%GZjyR_=4Lw?SFx(2iPZD`Dlin&~=x{T_vCe znX3vY_mb{Of8*f4*tbk9ox5bt${P4MFVbL$YOVwfiT^zqsk&Z#eq_?uA+{CE!0xq# zPCYu1*ADHq9rp)^d^D?!&$ElT6h6$y;ATIW-um!pY$l!c@9FyS`k{o3=0k;RFqyU4 zB^3J-NDU<6rewGm=~dwxmRB}^>(;1Q>^W}Oc^*LVd5xU>5|nq>Mk|E<^$prwzU%gX zSD*j0bpwSd{yEY#wH-GkPy$wJNfIMegqych^g2#Nb4H}VHmptCh4*kk$*ajYG0Kxu zb3fjvFG!4|RXZ?WwH!OUJP<0?fN@fMYHkBD){PA^nNVrIM@ja8LWi4=n?6DKYYqbCr>D=TAaB28!- z=^)w~_tk)B$38+@l6kU>lYf;whlNllyR4D6NbZ3cO~;w(ov&lg_qon%APPj+e6Z9A za`!}o*~57Rfu{b*zODyWhivUi>ZQado*mw4)SR+`0M0v%-#G*zCMAd_wimciFVaSK64 zvg!fEe_&`RtSG`hJk?dkV`;|pZSSwMEf8tP4>~wTf6P4!3Z?&?63y#{uiL+Y5=Ox` z0j^1P6S{U+$9U$%0VPSQ)>IC_PZT{3Sal6TG7 zb!F9P;WDjo<9~pbX)v#BS9w|wKm;kh;AI1VrPhHgA!LSprPUkj7lXsBlJyFlDqcA= z7G;li`j`2fbakuZkeuQi^jxlhyF6Cytn^rFmDv}!DsesEtz+399pFi1pic+Pp`Y+! zKmj<;Ge1}#iUl}X@VU~UuU2BTncW7w?{H59=(sdli=X$xs<7X1-NZ``jV!>rxf^iy zgNe?QqRYo2pLLoZ;Qa?Zx&j#l);S{^3VcwDUmvTQ&(N+y`!6V@$#S4p-ae(USr$u- zt|!VvIP==Zau&_+mhM$yvw~{{id75yWFy&3PmRVhy01xt@eyY&2C`9vZe6_hmkX&# z##3-RSU%Y#yB-Wi4PE|r`i`S`?_B^V#DUm^ea3Un$qLvw<{p0>M%Z3Zxud7Q^=M?b zjZ+{mtln(8cYPHba2=yK$0w~7iJu+;hth( zoVCifz0a}mUydHtb!~IDh&`* zbtCC4;jbJH>F+5-FNvH#-T@SOmV=Zrpn-k~+@$^wLb`@`twGKf=`tauyaWDMqTWFKg(D#4})e4}K85m0Nd+vU0 ztC;xP*s4K=bFvoV2%NG<7C5<0iD}bPJ^mz(VGOPe^)aC6#pBk>0kyw^Ak=nx?>mgx z%o4_!x{1_Vre4_}iG<^Wpu;xhO%whN5ozO|n=h8$UmD@Qpsl8IA$t-)%Ib%E-Hn;$ zx^wu;7?+#b(ZX5kZ!3~JjDFo#Y)?9r-v_1&{oCLF%0!s|*J=G(r*D3uU^FiNV+#7t z=@lY8A~AbONdp00X&P25ilw{mX%fxfaH?8vVV1O8`TW;OTAnIg3T;IcCVA#z|8*@l zYes3#V2Z;e8MMTcL01?wNJy!YY0(nKHVO>>HG%(5r`RMAx%A*QaL9*)i^WvE3_ywf!}Uqz>opyjdhYZcnj}eR_d&; z%d%?Aod((1?oZ_;waNkaZ2Lsy$Q{K09srX05sc0b7?i;@b4vERZ3y+h$ad z9*2a~iP}ItDTo~)h=qtKCxKwTeq59?AMXp@c4|O1?aom~K~B6q;n^3ZAi(as`A?RL zp;?e~6c&(xQu`f!JqRDjBghoG`SOF+P3Y4Gs%l`UAFf_Xw0iOApDnW$zQ|95IW|X( ze)yyD98pL+T=Sqtx$Q`&M(Wl@eQw&FMch6**|(*i&S|1Hz+r~?vTlnrZ|Ji^WZQ1r zEKus^_yrIw50+p)ywOef5kJ%6;}2XY`9YFNnwkvo{?HXb9Z^ z!vwv?lO4U*!epb`&-xe+;nzXsMa(4qLLjal)1WYGeP>oRuAshEmaNckLcu zxnR%j<1~$a2u09H#VIKN<1j>~(oln!?Hyxv2tWy9f(+g~negW@D&*Gz5$GwG zh~xyoQEkI!*zB;paS)uhm0us<{~4J~aK*$PW)80IwhzlBxjtXs1m1Rli?+iV9x{ z^z#synN@E)x~co0fshXN!1P}sG|ncmZV8g?K`$rDVpGKf814`&&~*ZiXx13 zE6>et=&Kqx7HORkMcNnhXzp=l>PaERg6XbYo)_|yIx**%xIPF33s^J>5a2CB$fZ31 zQ1>`rY?8xBNUL#v)i*YTz_j0!zhVb9kJ33*b6hPlUr{C8H@r{-_VwMthYM$#d9|a9 z4MfsDLNGj8gd2iV$sw1D2(hu5q}Jo(1Ck*s=gho-Yn-eg@z5gh#cP1^QhnrW=xm6;q2aq3E~Gb9 z6fI~e8QqQJ{c~&Wp4^J(tC{v$-Q6#1=!B5sX7+n~SPXCqy`}3it~G^7Er!|95VggK zu*5`B=#i7BI8GE&OCu`TLvpLd`JbN*h4#Qzdagz<>~kBFind--&61$594B7@Tq|HKW`c?q#Y9F9Z*9*1-uPybJY4JgT6mCd+@QJXJnoox%m-) z#OaPS=!4WgbG~SxUz~_!3&I%4s@b|71Dv;W|5vkcR@OmBX{A@X5ju zP+n$*1M(6a=I*iL{JP2*pZ}BtEQ$B2oOsEi4*5_}Y^G7@iDE-R?SN8)IU(@+Xw62u zZ%rF_;QIYNf$*}jxy*(!Mvfom9LvUBDUsih+$~!f+XT6SE|u{SE1_1Hw}||;4ev&F zBm0XPdYfuGNv{=Ok_d(<)1=|05&tfZS@QCM+wyJ)?urLsN~0!7yf)qfhMOoBP9X=> zg$!P7A6|8Lefr0op<0Sa-bVAlZPmW(-IqK`te@MFF}zuDR|g6xdT4m6v)9=OLAF$! zaAwu6a93F=THtNaTO+TfLyN6?NtXBo$%b#{3oW~>{Vpi14N~Zj?Vut!r%X7vWr3TN z&wEdC)<^CEyKw7NKevyGF5E~z!OnL&Kljm`EL{IHluf5f+iwUU`Q3a(@Mh4^zGwIr zl~PzCa23;pN?D>26TrZXph;}z?rPp-tc{Q<;E|&&Y+PP;xg9UQ7|osOQ%iG}A_&Cw zCt>;X3#Pl7FjBOJ8>qP5K&*cLqMLA9P$-9n6)Ft1$uTqjQ3Y|Iew;gO83v&uBsk%# zz}Svc0j{=on3zYVtphT$$pKFDNfH&={OpvwzjwJYcN!~15i+#mRG-BV6X%Tsb*;<6 zc4BlxpH%4RE{+_UbApCcP^s8lvoO=SZl3(=O_q{*1l2$9*RCW%gF`;J@a@zZd*KZw zB}*f)rJj0}O_gN}DH)1w^-i0rPUob=)uP+BS2)frtNXpNw|_5a7|D zIB^279_1luzjL*%f-CKw-UZif>U}n{IPe*!(Bi$%eZcaH2B3lVzW z0M?TEKte?EH?XscN7j($rWdWk*(eiic)1XdtS9gNip@+FyHk5if~Td`Dooh_Rmy}I zuB$QHp>rI4=T;BCb;8EMoisApo+s+DE~9Fc$k5^b4FtkGOkQ-%4RVxYy}2YmwK^E zQ0+k&CxgRvhE4GFx&%BXO1ybJ_-j@7W+YO|CQB0^IH9LEC z#wRCo+`xw%t^iG&8asnF&g|AWjVh9Y#RZos;NPv?PpP3)MKj8F41>&o#$Pn4%I)kF z$dK4S3ml9eKvj@nT+t;}0vDkkxC!_jU{>cD4RySdx7&US<5*SoyG3Ldau)(~rg4rW z83uP;`1xvL74G%zqD+GXmNmFm# zH>dACkR{JSq(6=p!oa587k0ge%61crHOWM=+K)UJ^C(dSxL*a%B=0I20bt` z;ccihSgQ?bE8 zoE(Och5=f!YXBc+X!~|$u+BH#phH<|p1Ce6~*69SDeM=35 zmf%9Y$|*D`)hFbbU_X?-Y8F%A0BG&53fN=TXNBrl%7m+=WxJ80g`;f`VV8L3sjT zpBQo5ZP!3?rs#g*Kn9Edrh0*HT^@mm2YeS!{rG!E^%KxJw_g8krkQuL$SZ_I*LO3{ zo+%x-?U!SAfwnlR}j*Bd|?tSXCO^%cMCq9%7f-Swosu(+B3eigywrxkmG|KrobufW1M z(p^p?_2=>{N39o@M0F498yX|+GtR$5H;OR+LAe6?Awb7)>D~g`|9Gx7prF#d*I#rH z^pN;(EB7mBw#fM*pkjm>zWX5@%(>la`dU7|-OhRPg{|j6)>B}95gra$bD=oVIcshn zb)!e9Fitg{ONmZUQA|B@ls3;f@Hav8m#Bto$ypbqt$1W-fwLno_aPDug>f~Z%W12Y zoH7h^mvjF|dz0wOjrg#j z#VVKJW6O{0j$nhI?#Axw_AYm|D@sjNkCy3E-%?%ellPCo&nb|f`BCzt^m#r zlB}gEB6qfVNtJbc#Iew468HyJz>!sc18n5@p7|hJBW!s9(ICyP9C?#d*D<7 z8+<-zim?gWv?RPkoBXp=ebOkYhq2tQznhy^XetZ29~XW2!pD|*by-USz7BYJh#5=$ z=R5gVxxO6Bj{P;a4aU}Q#~}J-KFM;6SBI$kdew(7b7WSw=R<{z-8R7%F>%?bz5)w= zXNd66d)-wzNPpeGQq&m91EUWz{_}LAnG%JPGa)Q!$~~T;Do6m08&MSuoGXMJnS#Ui_rOMb-A1pV#)X+t^A_M*pQ%;@F6FgA z07wDe@3u|Ubk^SEPb>TTca#HV{Il1-o$JW*c${tb7Pb&WR>{UGA-dO;4^6vo^xUr3 zr$9afF38Ult2}A>(HCIQV5W=o-ofat2d6>>;X6iO30V;6MO0LRqC$z@zxmhVA}gd5 zb*qActnI?6(c*z56`;cM;M93_0L*L;7OI<`+L-22O-#*+KIN)N3f6XOw`<*VQJJky ze0f1LL>KUa0(?$1@#i`VXCHcnUfSi_f(81m zNQ1sb7p@nr`~?#v;qYyt7u<}3a-~*kGzZQA+YL6}lOi^nhX5{OR|9-1{usSQQjMI* zsv|vn(tQ@I=-k{WgG|8VyjpldrhR!2J06Wst)@t%M-OWp)w1bNPkxmerQb#31 zD)Z}&&nAIN`E1P0_cR;`s^`R&~ z`Zyrs>|R<~ZTj4CabV$Kq-FWi@J>3Uk*j|!tnCvOW33i7nw1UknaaT-sG?}^wtY2s zLXZ)O}vfsYVYiqlz zKiEoSK9*y9*D8DL$IKY=3yZ>d>!PP9(32j;GaK*v(tJ}4bd&uX!TufQpL4KWw!(QH zecJlNleQj4C8G`C;jIzh$!L9P(--BzVpug>9Rm%?v8eB4MakR3vqEaW z$BU4{?%k&h%LnXZC3i+esP}r}U}94oOO0$7bLt;4UF`Op2`AdB`7gJ*M$}14LX1Ry z3NXAr>^oTzmhk*w#>tfB!!Ka-UmoBDB*rFBrMnuYGLAz4Llv`L`9GOm&f8-q$4SP* zI=^W$prhkaNY?HhSMBn!Pn*`Yc6m75-#mKf!Ym+A2JN6$qRy#3Cb67#`>}EZfGSGj z)R=9}O|+&BT5eE!YxRQr7kod4>9=EQ4a+q~%`t=8aaDn54O4cq`ksKQYv}# z(Y|qH+%8PP);JOm0AFUGIQ10mdFm z4Fb#68+47^biUxsTL(}by%7#BklnNpC?htQ-7MN*4er&CvHfM~+wHpxFV~zto6^Shxjyn%iu@nl zgH)H2TwIb(l(ZTCnkPo(`#U**hyMB3XTs<^xp&Oo z{Xk%x$w8(`gr=CAZEi_Iz?Vv6~$&+V;jHZAz2XRQ!3gZA2=-Dyycb2K@s9;`BUkA68oT-V?u^E z{6YnRslzS5CsHIN0|c$}FtUY}4RcTUV%_-fzZZ8b{|z2M1L0s!+&7>CRBLJ4ABds+ zCnFpKN&u7;;hiM2acs~mkqDZ3?0UpLooG*@X*ybjn+!en;i9$Xn0(^E1ky`kS65ee zRDJp5O3D`Hr97IMVkL9xbS-`Q+T-8i?6?^s@2+hE=j`G%Y4mS988c(p;=$w5N`Stv zqw~Kv>qI*=I4P&*_V#UnNnM0e{gan-W;Qpm9y$Lf9@xjrjFRnI1^BIrB-p|oIVf*{c2lq31uYHb5E?Ii z{W{Lc0Z(&gHFJF0n9m%oThHR_>;uHs%t@tzGC1`>aA%@Xd5F0>nxE`R>1GrS5&rAPwKC=yUb}QOXp8%B0_r9XIjfoQ@Nu zWuUQMNHzz$O+P>sFaA!3(UUSOB+tZ*vhvs7(C8aUNgAr=t+1%60?MLrOwbxG;{sf~ zaL@n)XD*4ojGZ!_Q5af(3z7Mj;l+#{Ki_d%tY(Hck~ofDMT-vdks_QJE%ycXc91gF zdwq`XtWa1Z~xK#i;fM>mbLVvX2fZf-oeLlc#Zc*#;H66VuEYC^{3ooY6b6Bux) zkr*nlXS5@O;1QJ>-=h9u!hJJqX6sp^sMRDjJ0Or_#(BVvaw^DJ0K^4BH(&^Sh0t(M z1!5F{p}@nOx~wjqMS>6$A{%-rv){0^oq@COBp`Zy8 zPg&JbOn(n|s&=GtP8=Atvxm~PyR)hn?QX9$ayWHUXIDVJ%Nv1d9}O7sV55YIfw5h= zX|7j>JS&+oFNS8JJi8b+ooq=RZdP(^oqK2iYls(+b$&Lk&>Dn?H0XBfnt%OJ*vix* z>8(sHqlXm*)K|t2esaIc>rS}!$0?Xn^tu*==L7RrQ`Is~qnx2TYT2+%fkojlRhNA| z)ms?yqEpazecY(`41Zh)Ez7~1?0iq`pVH6FNWSVTrk!4F3fcsJKpSOTzxn-)^d5Brl?uKw z!~YCZz@f`U6tF76@?9g^iJpw$2MYY;7s_Lpk9&|al$@v_%A{0>zFi;-_u_C+HW*B) z@kqi*gDhp%3m+pgq6o#Q#W~nHxskDp|6UK+zUJgJT0^Wpoo+=J@b3UchA+_$<9|x4qREn2Q4gz0ayPkkS+qXQ@u-6!-9*G99VWsG;>Ih*9mJo< z0zh7PWj{$yA-k76g)kBysjIll z#y_L?9!0bXc1?^%Q?5DkQSCFl*v@!lExB|MSHa$IcpjeG0lzk!FKjpQObhFNug9Yj zA3PHqohU$7*XA_B2xC=#SdenpDCfX@O$Nx4tzvl?Tc)`)z!OL8HAp{ZUf5RHu)Z5sW@4#LIXs72NBh63+?|X$W5QOt9Pb;4drDycPBGjVp3>>1k5cSBM z`YnN<x}bk!2w^vXmkGy!gIHhF__JlD*Be^Xa4f9&Yag)#IIhQ03YF@J+qvXF zsB_X4`cv*)ts26}}M$52G#R7(4sZp~7e~)9Ze_|f~WiYyV zoS=s>s*&8Hzy^gM!6`CJX?=qXP!&BTi04%m5LKg+1ol3A1UK0B*TofPor{Kf5RY;4 zGvts8gl`dL4+h8rUPbKsFV3aTFan7Te)UyNeTRb*g-wpaO*Z-wY()?ZeSzR?Yo!jU zZSo^Kw{hZ%f@wYkjSoj*fg#O#8a@qsb{Q05Un!}kUm5JW$JapWsr z>jh7-9pL1UdJ&F{A*3b!g_8jCVtvEs9B^F*9#~Gx*Xl$Ch@+1?)oYPZj zE-H>PDJ63Sn6~5GTLPJNa9I11q?21&Mf}SYpLtyRU14anYpSUGjf^6YYBmMtYPc=RnmEG8q0DMLS1L_`V2uZv-K*hIcd2vXfmLW@!5{=Q#z2}Ntq9o&Qz7IBezf z50~C$*wrJy77I zC!BgcmFU5ggS0a9#k5@{*G;jrRn0p2N|b0dKbs*PZVq?w#<=#O-%1GZ z`%ZT_LEV2Uba+o+GVrBeH$ppJxYASuG&5S8JHDY8oYMLrwHvpA=^Bg(*$%_zflkq2{$Y?eHcoXhcg%TO64NsO-w zT1O>?ZzHbO8VZE!H$~AhS##kbDEx%dl~+6>j1n^fqyeiO*>8xW^s|yPw(rKU33V}4 zsT9J+GC%h``&YK;jP?k0VxjmWeWZ!d8=xcubaD%^{8fmLp$vOLHY0KNEc|79z8Yp1PVS}^f|w|$?9m-> zKChh6$Cq!QGM3+l|2y(<{n#|nK)6`{*CN5zwBH(e)$KLf9e{5_JNdg`0Die;3%r@40OkvVSgE_}Ug8M|=?f z8KhxDJD1I$`vr>4>!gI8^6`zTjft@fde7p{R_!A<%C08smVrtBgM|D0l-7lot4Y9R zU!?AIYd!?{^4EIc01eIXAb}GeS3E;+?%&CSXWh^d#Lg7?waw&6{Bj5 zq<@sK4fVLPIcn~{@$5ePN$lHCCz<^A0n>6+yQf^M=g_MY{c3v9c(d!v)|cljmts?P zL)IDVsss*^k70B2Dx8$(vK``B&kg{EU$qsL0CU;tL|@%z&rM=K8Nzg7Ka6 z!aM8lD6hcvG;bk#+qWIZvmz~2-xA&okw!r)_jN}&@XCJP)a{2`>>L&$!nN6K@s+Qu%CUPm4u!HS>lJFBc4EP{U+XF#3|10=f}X zSOLd1kg%6b4yjmJniM|B`I>+`7BlFnoHJmKxgt!0+&g>Tw>&l*usM@RUa~(Bc-PKF z9h1P~$q65O5D>tTems!&w=+HT@}g$GK1lnXh~$MT@kE9l7Ep`65kcbqjUIZ_eVEjY z{bF^Uvf40sjKu0epaGbYp!x3Gcl6YdZu7Umkn4Oiqidj{R8M_>!3+U@cLpMXKr()K zCAxpK;f~wRL)mR4uDYGgNYJA)V-GL!{ZPs*vE^bA^nw%n{clOm6uEWxe;5L8R4-6W zK#MS4apF~?bRn^jxYCyTrgbA)Jq(UUfCS+~4wHtF$ znRI|ySABeX^B-&T*dbuAOgzm6W1>tP)<=PCN-iB&K*P+nocihPp+N3WpZo+*>;H1y)v<*;33Xwkex882z!GG_H zUCo9D#A(-9(+n!TbkAPEw7JnWN&!@_31NQ-{DM%jn341FOjlQtGZ4GtH@}vFafd+v z9f_o@MJ@SAkSoPL3`m#SWA(Pv7{a=4qN%>zFpXOauKYGG1>vhO?WosdjALZfBi{)M z#Q{lw4u#h~tSMk!cco1ufzvp0Ijkw9tkg}8;EBMR#tm*X13QEPJr;tf+k}%2=PEA- z9af8q5-qWdO2;Npaf0xEh;$;l1eLcxsSrJ08Snc;pv*J7ibonyk9Ug8sJh6kFqKlG z_{)B>AOujd6#R=tb<{7-$2mpGoTal-&ma~5Vu-|$6+iTAkjZVWuDtlxj_T!>9d*pO zh+#=!SK)KdB~HJLR@4Kn8Vu6eR}NXv=pkSj&_dy8Dx{C)D)yJ^R&goyZ&sb4ZG9LX z5<+WSzA?Xo)jY1RT)j%Biy3>&1u-;{wu0P5PL8}B~NUn@LbT}l| zwKm7|T&?>U3&oBXn& zKAMCFW95$+AXk<|iIEZAScNSKfFC1+W4iFVAQV=6iFbY87FhaW0DZ>j%m2CnKR^b?ADpcqmA^i!J!;{VVlzLpGTsF(J5 z*SmdQ{d=~jeI1pa0_vCeHKHzUc~$1#j=<(%NnJ{bhgS?v;Bh!!-L0LQr=iiGrT(;% z@69tm8IU$M9#V{0yZil_T!{2A=>oVJy&(L8@>X8E)8U`XOKDDiYTdmH0v(R1YXci8 z?A0!Op5$go(Q^07f_hn?E^I7RWo|W+9M3Qnu04hg+wYxeP;K+5Rt1&=cYaCj;WEU8 zLN|IcB8L`GlOx&h`uAoKDe#9fVavYe5a0M?Y$)=D19jDEU_P#}sWbRrzzRU`$y2^o zm=Xy^4S&JaG6Np@Y+r=WZcZMrL?jHa|xA&p&rQub4e8_ zY4Y(^vI=uSYt&^pTW_h%d;&mrxT60)tRuVZdgQlj3drP>Ye5dFv?O>GHj_J>`0gUv zk(&vWwl%etmn)mFDZS1oe{spT>6?bC7?b+w>sGzgx_S{Tupnp3acc=|J`s)hym|@j zDf`mg_($|3X}*R0E6Z9A0_0*s%iicsoVjBF9R{IkX+~dtkLf7IX+1zs%eFe|u^8=} zsmD^HT4{LbQtFNqkyR_$IepsE3Od=L=p;Zp)*dHv|J1V%q*M`Ux;|&NnfrD$CNVnv zP+K$j%KAAAi0@Qfl2zW~njA*k>q#8@&RdLi$*POJ%m*sz@iea+SLXb~ML4r&bWnOL zSoFgLRW=8256^9{ZAI<@5ueD`=a0UxBI6%}k(P`t^XE|IMEqCGp>}#1Al)`FV!>}B zLF!&nYzRVMA}P`;fenym{_F;`YLhs!btH&1lPgPPu$U2jAZ#hn{>1)HR1i+qRNQe8 zDmZo+1{qU3a~BIDCgxOR^dC>|a>lG3t~lJtjTa1`Agl09oN(V*KAq1mq@s3kF0gWi zM-1Qfxk#uSTXu+8q87fsv) z4x=VD+q#Nd6I+|M7AR;n)je%P)xlH@9V|TK4# zF*LYhb(bi<0$O0cA`(`EjYz!?wfk^^Nd1MmE(XrO$Rh3x{F8${1D6?H?CP8X&4HSj zNrL3)AX4_59Km*tSlI#q0}d@7V0zWh7XHZ)%Av`sLBN;nT95w893Bw13?Y2C%a!@D zZs%Q1tmh3)aOe1i!&XbpPkSYH{kFkx273lk9f6tE#FP78*~sT*{rBLZr=0&A^@0HydZ@}wOLd%VtzTMei_a`YpQ7fh)S2sz|De2&&U<&*B zVUm-=GNJ(=tvHuYik|C$Z-!wa>28hCTs%Bj`Wy512_;kM=>1|%=(}?yrQm>*YFfb= z?A{>@vcD$e9?tXxB-ommKjLO)k;A9C>#=A#C;t$MDvPpIs2XDYypkRK5PKDRCgFe? z{M;~(P+}c$mvBJKm4YgCWey3h`f0ef>_-ZEp2gKX>ZGyp6jD;yjt5S~2Kt89Crq(S z>Q|Ys6@bDACG|Fr5ocfg&KB4v#^kf*lSHdN&jQlB+iG6dQl)c8T?HvOAZ~UaD5(dZ ziN1YI^@d$)*$B5>Dv*5|v@DI_!IOR%!>jgB=g&Vt-~>Yt>`{}b(QLt~uU8Tx?BT_| zONVow8T>z{V0$~u=H7s6v+0P%A6oHOx&y$UuSI7`=fFBMv9UXhvTBG$;|HAPM*pS* zYuf(OFc`s**t~i21Ay3o{{nlD4d9hMu17)EBE)DV8#pMjB7~^=NXK z;WGw^1REconoEWH+pdHis!B6s9m^W4Y9!83o@09aGe{!de&$^5a?mf9M`Yxai{kNjdX7|8L(Fr)E$ESjna2gvpvOC55G53oyTXi3824Mn z(b8Ee3-ojzjoKr)s!3A+d~q&vy+^$I1{Xv9ZStRUYpMYT1bpIj3sfrS3^}~U0YZG2^~-n1WEym@CZf}3BtBpv3didzZbz%%yw|-qmxJNin|;8*s;cBgQSRm^ z&5aM4Tm&;>i=*7cSlBia%-R$Y1N;$ntm8KEU2>6TA8t=BZ)uZ!se%(}VBRU~k?NQ^ zmPFw&LufZ?I|lxn7d|}sDkXp)yMXQF3Sg>{B2?E2B3Gw0UEkJDy|Sx1^2h6HDgd}; zO*{N^(Y3vD;e(9Oq`EynyzyQ(fC)oRFe<<({hAeV@cee@w9mW7y^V zSUMgn>)km{IwQvk7HyFs10@`A6UeczRW$S#I)ZBJ;svc(W*^f>Th4nC%uX&c z>%0B3?p10Mlu^Z0ALjn`*}%3tZeXdWk^jf@rt!PR3eZ+HQs>3u_Jf8@??&oe4{o)W z$TpA6CXV0R%dd^Jdhdw}4zV;zx-@DlfAE|~TgH)52r6!@H?suy>Wj`p4oG+n&ejy@ zw0QId=RS35dO(d~9|pWtXm3(K&8!H(il2Si19zI-D=%_}zv)kQd$f|L0MN^R)B<^*lh6RA^5syI$W(UMr z3c(iyd8$Pq!y_j)&CYNQXt|&S;-@&eFyVf(HGCZek%?dxH3MXd^1_U>r_>8q?HwEZ zrc0s4rcMt>>T6I!it0xv4v$V_=Y_RXLukUmW|Q3-s1T4Hu$|SbLm~@4Sgqhi6T*586)?~sR78Z5gw7oRdf5~_E2fbhZc8FjSL51cTWBlzhj@9li z={SU_GXO0jA_chS0TCSX6IaNq=awj*;S&^nBg)W6mFg=zTl!(oU7mfd&u~a@nq%&u zNtS;3ZX~txb$|NW-l0ZueY4kAH?SJbV7|VTtyb}DyNEKM_E_S zczDys!`kj#7s`!0m%pM0O1ApDv)&Iz< zuW2>}M58aG_IAQF#9%4nh;uXNWe8a5K+aQ>27W)kw?H77uvTY$@F*b%2MP83T9C(Z z_z5VrWdgLWNdb!x36rR5Ko#Xd9272dsQEB$!7FYPuO8mAelyN;)O;ISdS^EaR^G%? z9mX}EumiR0XPR5fciq&o`{J+c_Z8bE4dUs%-%1`)WhiTlM8Q@rM% z`YI8Itzd1CFNpVX(qmU@Yz31$foS}N@oMQDegs4sg#XeQyyUBML1_j~fv_Tub-x-U zihvXTn^Bl|IP1$q;h4YIUZHG&5{j!50Z*vGctcMX3{TQGghliZVdU<#H&EzplT`E) zXQE#eFEl(hAdnLQL55}s>RZdfKu1WO;szQ4hi0)R(0gAW+SrZ4FzSW?b~BbT1tAt3 ziy6?nw>y>oy|z&^YTvp#2QHfF6A_F{9C%z+)3~{Y1`=Ji;mCWle#=w&?ed^|p}Gz| zA4}Ns2L_94sV-r2vcqj|)o!MAF*6gli9Q2Ew_Wq@rW~^e6L&;|xSkL{ouoTLaQoB( z(77NK6BV=6=ZoZ(>mP}VkBcA7*g5Z5#sqkP?WaBYJp|(D#+Xs-JJsR1plfUT&9_G( z^{%;`Q=CafxBc@@D&_^FAYMK@+@dZX0;%v@XFOVB%Clm*2S+?H(RZGezNc|&uoxqj zby~>E`>m+pa!$wxtf-}+{N=Oo{TbM5NUQgJK0j*y$q>a+sKGn zf9o^~D2$iM+YR{GCwY(W+1T%t*E?n1e(I9ZSXL-7=47MSW_S=}mt7Ix@3Z>VHbOLA z2=aw3e1d)CVne?oeJ%kl#T0q?PzkpQVibj`+Zzs%0IW??;J?n%7SH_HV2SjRU%>tX z%((v*cd;f4xTB{+2LIUijx>JqFvO62pVe;_f7)m}?K1HoZbq#Lmt@h)rDRYR;SK9j zMN&$RAJ5s{cNAhN$h^%zu1~kr-z?^4ZZo$wUaakVG(=#cLUTWiXCauM)julWjOT^5 z087#B!}QI~iP+Mc^aSb`vO%Yfro1I-kB${p&|pBvRG^gCWU7rbdmX_y?;V`DgK| zSyRpg!4D96Y>+> zO`}SPW+E2vGKT{o0KrnX*MlRF#6y`3DGp`P?cSp$p{hjbaq|CJe*5!}8wI#RmcmUs zUL}*H@xTcm)0Ej?_rg?3_W1P}qlrWMOPBX63OuCQm^r}oMYzd7?=a2pet`T#o9#+2bUx^pjo8vNtKf$h>~!YpA@7`q%G>RIkCp zPv?uB=~YQ~GOp<@?F$l3GH^UGa@*Suoi$1~rN8Vhn;ON%>ifihXj_S6KRXo3(Zb># zuzuZ0o#30>=~W?lp!E^xcC>3=&h*6gaz+20!q!)dy(ltnK9`!e`$ec;2{tq}GWpR@ zl&8+F$$Mi4xF5jRy4kH-mCPpvfhXP!jpIQSg4Jfe0Zz3oZe=Qf7 znCW#pU9YHd`4TRi?+hzli;pb+&BPB-Mm< z1MPFijpC;=y!&3M#^0 z$zmel`f@sSF_z;*ckW{&^TEB26(~r4Ub9E*bIX`-&j17bg(p;&69yyyNlIDPb@mNjRi(hjtBs ziT+A_26s^Rh-s@6V#=k>)FMq60kDE_t<(Z>%%hHYSFDkX=uMTXvBsMNwIWdZJ=*g6xaPucAk;G48! z@;H#WXlL#Wf?s?S)p=q?GmmP5>{=#nHF6|ri_C&t(<}dWw`4)P+Zvq<;>}ZiR_pME zP>}0OnYzS$7_ERraaI%?HIDBTC=`Q>po2TQvNY@+!WAWiFW?PRId(pIB^Am5ZRf-0 zotJaK{Xq`5PFF~*ONlYA*oMfkBWQN6LYX@`gn6yz5u^s$kY`uvMh59yrLFv78mpV` zLvD4~Ami8r)27a2$2q|-NYT8gD8cz#rS+vX>SbKdjUApEnF2;a9Xp@j8E?#z9YHm+ z@b35=?pbN^7`JSLzTYS7%ZO`$o9Uy@-I^Kqf55_7Ja6(2PR)drrQV76=JU>Bx4c-~ zrXY_08o{y$bmg!&6Z53eg4x_V!ITU&thggn_Y9<5jo{F*i4~~a(9`pA0{eBzY~pDr zUa4OBq*szthQ*R!y9|n~+zKEcq%IyTxSBFqb~7ILT6ncPcpFuA<2$$jtBw2>S0cd* zH0Mg2lR3mzh*@b08|8icwEtx8zs6;+|H-LgA&YLX0ovZgrc_R=|NcTy@R5{=gF{sE z{-=mXG6D66YQd^ZLv)TJ_%D%>zgeh*n7B>m@y(s?w$*w~x2yg}@W&8$hS1NOkWV2X*&&H(@8WsJ=7ygDx3u`1ZNnTy5{qj<7PG z7@ihPK$+7sO8?Tq6T_k(AnCuCZ>(I2g6{v38>T9bgHQuB{s;Wb(I=1gntY7%&-6J|zD^e&WX_6pJ`+y7tvEVCct;9ys6paq4k@k#S}) z3tyS|t?xyW6eWEmiqgYt z`ndoMfLF^bDOS{4qR`!%JM1p3Tq)TCxPK-79{{XCQ@_W(ncyr5-No5uRjjJTMYB%p z#?d}J0-k{gw<4_4w$87|Lagh&Y(Jaj>)R}=b(>dZTHL+hDsL~{6=~a=x^xGY^flM( zBF}R7*uP9&HIq_QWd}%hnbuB>tXi#1*)|}J2&3>GX%K($GF_SR#ogI440)Lqn}yj0 z1Rkv1D;^%x1j%P2X0c4%p_mT6<)I+b$5T8JbN47>UR+pf7@-Y3_`sqL#wSL4*}aDX zjD*|`?k#4cci(!~-qZ8Fk9z{1$35YRAYjtd@T)`NWvjh6@3^;sEqFgm675}C!j%_9 ziYXWs-phZzU-q7$a|PN%(Rd=zyCPsCBvU*fNq^qdYp^`&SB-gu7au;0hxB2@w35Kl zQvbRi2R=EMgi(qg<#(XqxHD87qX`Vi-g2P|N0yhgH6M`A)B2Bn8T+QC`Le2k8{3~L zSUhzGSlrOT&a5mYSstE6%eAKChQ{rsalAX9R9sru=yol(YNQMqhfK!0L-+Lr{xB50$DhyzNVJOm z=Z<+N3wz#LHXMozdgs6%wQkZS;m_7PO0zN6;R62QEeA z`8cd<+M0FqlD^9{FE+ISy~jHAUmCN$e*%A;nb0f&uOI2j#hi)I0?{CfVlND1hzjBD z;1VS9Hn=b_fpKuTWnOTz6w2}ftm)<+%DXyJ2~(l!l(gKG89F&Beu-dM3n1fIm?o?9 z^_BpAYh+=y)g&!uHuT^jr}{{jy8Yh zQsX0(^qZ=-#)4z}QuyZOdedTkpcGuUFMPLepb#)MjW?yk87$N;prze$C|LiNKAf!1 zUgKEw3}!`z=d2}n{3qDiCxv`udOC&>5szX1W-7`E7A3vrtuXk&u!{x|-ttN9D7Zk1 z-P#EQ@fq5QcPnSWWKp3+2?bgdt-^o2KvAwP(zTUbq9K+StL(AkO{ z3_nf*c4MniJX$XLP}RpLgqbqLy>`}luKp#dhy704?}BD$HHt-JRoA>&c_@7$ZjEYi{V-USp9 zW(q*4aUv+h9WalesD@_IwS)omG%0=Pyd8G=8^@TI2UM_ZRc|#j6)Df1l5vo}WEGcAbBj>pU*bo*thc zz4+nP$IAA@ksaDNUUg5Bin`*gba5?4TU)_gu%@m0o?R z(d*cb2RgQ0G1L!f?MjHg454Dw7ES8{lv;tsEl7(}hAb9Xg(sj+rAS!8gU)CE1~)Ww zu?l5wWOHI_+9o2ADoG`Ee*HbOvrCaO9k+0RAlf(X%+Ag{^RoW&>g455 z+Af5Sl}_d2>SmEi{F8B#=8LQK;+IH@)8DRse)$t-N2`>KWtJ}zUUPBRY|8G_J+GYZ zm+F65D;rk6YfhI+MC<*gL?bg%+wA+QF1y30BF>F*pDyz>&P29YN*!lL1b*TXM~B5K zi&YxPtiaH=S<||cH&-XWp9st(3$YMJ#R4Cuc@`UC7pv{bFTW*=H70*vB(civ;)`3l zU8p$C>9ft^*BPakPR|RbcV_bZL?#>h8Cv z5XiL?OS7p~ES8&M)i-VRwdkv+o;ik6F%Dr>tc5&2M4qRILu3&D(IJwBjq^0s?hM#S zWz1~q@#eHr2v1M z#%tKGiAmhJu(6f7pY*&00#&`+_vdq;2gbTx(RQWh_SG2))Fi|A+oEr)Ke*jD{M)qa z(lb`n>(ChP?=eEFX1m3uFrf?X(DLPk|HI(~Fa7(s_M8><<{)euCppa?_KbgL`3v+l z)1Ol#lS4=CUsWR*8yzHpjWB8$s8D~VG@t8V`*w#LkWtf>=WGmiygr5ICMMXz2f7F- zk2Z>Lf*bDaVVHlyHBy`8QC9sO-68e6YP*BhRmFz;O&H&U6`4g4mx$U^5!JYVX`^+q zA?ZMR+A1g*uimvKWXpEv25zvAyI#-pQmEKye}DBUHrj8?wptNcrIRDmbwhujtHJ}q zL})^ZSm#e-mee|ysa+TYoU!`bn57*Ej_zqnQtB+u67BX9)-dJ3aXE8Q#>CR-z$1w? z9LO~weQx|JlrI0+Il-1~|2G~5x4_yrpk{!{l*$if+sFOGu)I9cBnZV&lJGG{_WG{K@wJOiZlWfbrbzTwUtD-B< zW)%qmhp_{myqaMG&E#NgY|{_V6$224T?k-yXFCU>v$~PmA>ybyX3>A6)|ya7$mk2u zshlH~%Q%;V>hB(5*c@*^Naoi>=nZUZvuqu%tcy)cW)2_`y(Q@r5(jx{jwF6g5`Qu7%x!NC3|UPC1eSyR zV?y;jy1JW{J_09`o2P$)2karpS{T?_29tOe@CX2obX$=b9tVp@gn>>LyMGtLsfZQ) z@`Uo7!sX+u@Ns$2gPI%HjPI;N-~#b)KGmVy>NB~-l0HzH+_r-L?YpvF?%IZ?K3D5< z&BMW6Y@HYFhhX=CmZZR8^(|w`5&REciWH|SOQzvj-ZfP&@hdhPjO@H4Po2n-s z?|FdtRbxPrHs$ch(Y@hy*g2dh&Y=loC)8Z`MMY7$lro|_q~8%;`3-;)5}AP=d|zFE zC9z&U28PhnDHwm!=C^GLNww5bQ4fT=VYSm*NE!VNN>7NK{$p^`W zrdTR}W=wyZ#R-B5+A7P%6TZbr_!ju(??BiffstBH3D3c^LAYQK*Wolpry4=zR8x8e zM?(%HWNS-m?9d?hkp=fbi^d3QJYWJLH(kRc?n3FtWD3~jc{4_K6THJ+!Jf&%67~pd z89T?^Ne9=-C4uEXY8dQYv+iaw!+(D=#SEgVvgm8sHpI5zz>S7_W?zMv zY$;6|x&1kn^zyu1pyKHjDFQqxPivz{?zJ-ga#CG zE|z~59~6XoU#k9&TO36rJn6P%+3?nLQpsRdx%jgV&`u&z5c%X7+x2mXxNR)VG)a6r z?G+YbwB~?IF;%NY~ZJ;O~DQ-&#LBeZe!Cls77wdY} ztbEM7+Z3yyfHxxzWX@TJnT*Nw7Sxp|B$|p_Tai0V6LsT1V0{)pqchLW?3_O3W zHv2V~;9zEmhm`ZtNCucRc{Hj+*G0c?i_JOhfS{7e1wqzLKO3+I@sgo4BkO%Qx=T9lVnh-gpVA___;5M@-ON2}#3-4u zPt+=wl%890lnoNeamJ`1hp8B}7lSkKb8jsJjOim7^FC-c1;PDfL)6Ft>cf9ZaF)js znTEvb+=2UIr#{BC7T?ek0NUnW}fZBz(PkMOK$EpjT(YHhJ zDyNo61HlrxXkn5IXHqo7QLv0IKK}RJFnAM2eT**0_DS6km|7EE1Op8phL^8H=<|rR zBGW@+^mJiS4$?Z<=u#`=<9wBH46hPo0Zw8&dZ5|d^Het$Y|CS?OW}WNB-9xqPJDm8 z?}v@D$wnp`c`i@&ngi3m5Bmm(-gyv#o+L+R^bUbYwWAktt;h8l*BeCu)OUW58iU`X zj!#{wNmoe^UK%(_ewoH{zt@dleOGS7%U7EFI)e5$8}|0^WmL(ct(w};Ri2Tq+yL0d zREOg7T!_QpE0_P%mPmgKLaDIhE>p*fAt-ml{)LVH_eXAdnL7g3lKA672 zC}bbOWPDuU`=XMxNd!HoRiFGCwtAa{OK^V`PIL<-C$~pSj`C8Q z_)Din-F~$y%eBwTvyhkDWT-eh6|$Kt=uX7yk2^l4R6fU=HP@T>#BD;MV)QAZK%>q?SfF7&b|uKDh9pkxThH` z;6WHVr%GJs;Gln>cB7Hf;n6{gVVAS;zT-^|=P-$#siGj%^Dp0IGKVK`o^guOIf#_< zQ0|hPOa!*b`+9j`l{-YtaBy)~)VH$;F13x*T>XV&NN%8-gRgeEgp}bBY90V+g-fpR zJ5e_uu_C6?M_J)L?a=If97f0UwLcNv4T%E(;x4V?YJxkCe!TagT#(8QISN4bnNNN~ zN}2P|RQvf6#HETRjUd6|dgIp@tiOk=#D-s<5Im`L%>Ux&xL`peJg-DpmXIHD) zuXCQ9EHq>DU01e?ZQGoPZ2niZDpw~9%$;vf7I;y%8+w1g>x;f>Y8p}V-et`dY=yxeXDpF7J5jNhYSZEb3x?|GA88tn)-; z^%vRL$b^4MHQjmZ$TH!BPEwHtnt+br0Vd5rY3w0#G(@7gcH_b`=u-y;*pz+Qc5XrDS2AuT=~sIH=IY($gSD_sd9vX1Yc#Oxmo2H1DA#3@ zt8l-c-dw)Mb`Pl_Q&2n))7(jfG5%IPb<)xP|2}_ND9-0y-)y&4edFf#x20=fUSE-L z`k{1wcU#s6lWy8#d+SE4&b?}`UB9cGbUffG88|;)%I1{xxV8GwKh%b=k&Kl9V3(wX~KA*)28?vvL>{(65O1+&bHmv5gk+@ zAlH0m6i;~iJOV1Tb(Uf+yo2Gfr&*PCSGps7;~w3gZNEQYO*%+_5h8OYV3`IBHX@N# zSq0LYJe{%tqSwZyi6?>$nty~G93q!7Ju`oxs1fp6Ca07oZk-R7kerUSQrON~FKT!98yJkXTDm#QqAO3`$oct)i^G3! zrLzt+ysIOhj;yn@Y7_IPy+y5ye%BUj_t|g@+oKcjt?ZrEw(91Vp8eFxHZX1U>3&N# z^#sQ6<}B)IOu!6F3^R{eE3UJIWw2T%PndeHba9+6#ai&VNc%{{)DQ)f52j>7rBf`MPm5$E=PYgC3Y8#dpFL3DfCoQ(ii0&h@(aNGQ7iD65i|U zd8eYc5DErIJjFMaCQ_Rhxrop#Npms1$fJxC4;beS1Q~a$_!Fyz7gMWckr!F5U>Nc= zNhO~$JbO`wgQ|>+mtnY&Nyf$hr>v)OjAY&S6D-G7gwZc@6@jayj8CufRl0vVs4B}6 zz>cY%%{}W5-9_Z;0PJx7e(kew&i)lSfPjpv!L0_j<5yP4R)%m0J{i2ZDq9x>wSMB&~WeCOKJm3-Z)38%n0eb53Aa1mjNm<4hDDz(RpHF zN1iA>DEE1@*)(-bAi#1nP_}4qcAL^(tOwr#l;-c~GP%N0(XpgN=a1Tk#&@pgD1wG3 zL)W|R$oJ>UV~qVuzPBkrl)njw16FlqAJr)aJ9>DT#rL%(@T!Yki{O8f9IQ#-czg=A zlZPmZ;~XaQ{6*u)8B~_2R2?3{o#0pYdoqS=hp1T##6)s*8oQAr8yao-=MF@(l3{Wp zTL?c}G#ml(K8RB~Uy)9#eEyM`U?qhnduhRfj?`$B#geAn2K`1nbqLQ#LK=Wx?Ha|p zYn)bkzIyW?wC6X*Rq%fa1nk=Kx(qO~2~gC3gb-obR@;y;k)$Irf0;7au8s!=!E7 zAll#feXjk}?+*{Q!Hl!=`MS9UF#haBiYfJiP>Cs}%6UGj8nUC2>F{dTp@U`1}5 zOMqm3=%*grl*28UJ#e!cj!nrAqLF#;`M@7ic6RWvZ_h3+-^Ab^;Kkk#CvN2{hZnNJ z)CGZ{cPoGA;zCME8e(1=F))f-;FMY5RJy*EB5DlSEVa%nwb+aXNZ#y(rv6;EP3L-* zH}&!WLV@3VpMMdfodC7f7|u?P0T-zo$Z~zN@WNj?aODpZ3JPA_71y{D%)T{e)<9Yq z2Kj#HKUp;%WBG$`LY2a0F1?=@z<$}3W??G`)uw-d{UYO{waZs6ck80H#S6{7)M>Ah z)aZ8MpdeE0t2#k=!&XBY7b1+$+#NaBBzC9)7>f;|e42_C8+6{Xfgg7*Rar94J| zliPyI*U~@T8~UU4-#d__rH3Pu+c+;;2O~U_sPm~y=->QQ@ZYUaQBi^5swVnXEJ2aF~3^8WXEz_V0z@N3vkh<&n7Zp53Q9iDN^fL zRZypi5d3lNJ7BjI@GO~4$ER97lihz1L#gdrI(X6!u5@`D&kG5m#~k;SXsSGCX0BLZ zzYf(f+}xR}^Z`;(^9H%R6cnVXa%}h}Bo9X981gQbm7IrPh{53wFU0uO$#csiDNqc_;pQV|f zxktDA)KTJSKvHvZNZ4Y2g$)|OT;@|v4au4#c$N~|V?28rQagTjy&CG6Axs~aTCF#^-;Psd zN0MAR8~q~W;>b^8(nAoasIGr9z0g~m-u6LaAEK&>^+ewlePhyq@Dzsh(f9@eXoeZf z#tBY9g5Rp__b9@k4hOp3k3hPCNG^%$v>)pnW#5v3*RhRhVevf}MF*dK!7<*hj z1TD^+^*L_S$Iy)!hadsYKr{9-GB{A2d!z!8;IS59@VLO>UQYzXlY99LvZa~x(Oz=K zzTA`CGeuPEx znTv|-Z-=yU`CA%whKhe$KI0HeDG2zbR1G-q; zk8wpSpoJIV3QIVg!`&z2r_R_0Jr?YEu($R~5H3(I^4 z*$lok9anUWGjlSSOf)D*6r+=*-;;^G{>R9~wKdF-lZm1UF{Tn3E3Iu(BepLa*D{~M z9t2N%qB958uTXy^mS&)kQ;3{?&v%eQ-gT~G=gVD2j8Khz9rE2(UxgnQ(yUcU&a$q0 zKh0J^msY0H^L0qrmHM%XVt#kqbber679N`z`|}J7kivScpX74#@X_Oh+K>)!fNn^R zoPN7s0*Zyx@`doZLU)a(cY6V@yVyquMbsp%{?;wT&%1vi&9Y;h6&m=_q|cWqQamk= zvleFyfm&O3M8`f{)pC!n7hxA(doEBVwhsx`G=s2Byh`AW^|}H_B(F=Q2|bny>e>>C znN#heXm3i_n=+fG4RvvwWsB!3g`&Fn*XMKO9-ADA6M!ao{ss9oD6&C>BqZqZyle#J z<_tcdwKO1?Uyx6uaC-mqC2v}V%$*=0a+cvIubk;{_T9ZaXJ$MH9412{Q?yM zHu=mP691mRV!xfX$SUHS$^ix3G{If#YjTb6Q(F|ut{e;1N?S==$NB4T zhC}MH=GrM7AjndD3^~Jj{f7ST>e-7ocEz$Z&vLf9x?UL$|9G0|e08;3{gM>TZoQFG zC&NvN4VCok4NIyuOZM0}K%=gKw% zhs)G3zLKdBH0_EeEsn)l%A{Itrdj)PxM|lLZWDjN+p4bVghhS3hW=vBO>)=M=m(f; zl9E1-eYs258)JELbyM}H>pwWMer{iVY^q-~Cbva{REPS`57aGwyRFJD2ni;+R)I{c zHh+xUG_wL4B307Mv_BqbhpuVev37CkDV17S6Qmat9#d(SKO(z4%~?Jd-F2}Y+OGOs z3{~4aUvGpE$xUDeg!C7&loAVCq&a6x4t_4Lk!4&swEkF&qf4HOOoXFvZ`yj_?r`F> z*H_Q}e8ylTTd@^0plZylbgokP+3uhH@_$>l+QHZlt1K0{UER8w`;|zgKt-xo@1Onm z*>|Y7%N?0fsZ~ zm+OtnvZPrHmK^tGS8YL{MlF>;!h#SfFrXN0&QBT0b3HL&WGYV>$W}JZwU+MuK#1jP zrG-s3_vf#g0glC05aI6=LmN1|N`GFwpz*%iAG}+2->4?8|9B|7b{D!|0hzM@V@)_`)j5$*UxNfdA=MByI0NOIJ}H459jU=MF&>pW`A=5K7;|?as9p+ zy6O|P!9UCoM^|@BcCqn`_BcGYKT-4hU!LyYmHn|Es^;Tz>$5@$RJZMZkAH^esJ@~P za^rJh*-?^=rv5WV^WIh0^UKBoyo#tipT~40KDKQ!5Ko6bIaExy6)2 zuqvM1-jvQ7VB-UA8Gp_(+<;>GANL zl{eqM!{rf8$S@JkCf7XPO6F3bFSr&+C9(&vB~PVM^J@`OLY@aqJ4`g)PlULE#kn|< z`%66NH}j8w#I!+yqvfajj`xg62F^v^PDqh7ZSxtD1e$gzhJOKY292Qa#Lgj1J@30X z+#}LfS~9KAi>l?eQ^Z@C&4QFV((i;Pru_(NF%U)D0%>GenJ~pZBP~Q zIOgD%0pMgS3BZO!Fn?0!4|l_)akMg(KkBXk>PoxF{TB=qFf;)eS_cf>$hPQ9M63|l z->j`j?k}AZMt>)C4pGcP`neD~Qt^1N8VGP8s&ySB=*5p6B3=P@PLTIG&HZp3=8Hwr z-?YbicW-@AFr49T7h4|b$biIqe}F>(<}B$ju(jR3XtwT~Oqgl7R=o(v7np0XMUpHy zpXa~0+`AW?>GsAIG2}g8`+2s=SsMIqQ3f}V**L7sfq#R-siGs?&~joJItHA4cNm3% zbFTdm&EXG(p3R)uaBG*3R?A*~J13n2j(q*A{onX3ABre*WL<2qD-kpZx!G5=enRa4$_n?53591EgydI|id__=+UR}^Cwz^wB{IA#%?wp{vE7{IVWBhDpK(T_$*e`v61qME}& zepY>jtHe5{J!?<1oR3Q^>E%nF-@2f}jjv>5;}l&QpUT27GFF!Z+8?*p1w7YX_<3VF znSUFT)aA7wFZv}Jhd=PwRrHD)YsW<1S*b6y4j4_`G77h?C+5EVic`~%M8$>S3nefX z8Hz=4RE%9JPj-}|vt+6MINilEB|{n?bHz%hnu{;A1%Vh2;Ddm~OhOL-BwU!8lsifs zD7oFgiK>XQqp1Q$hwKBg-#*1!pu_;_7=N9lZ-Vr(+rePhD(L4VTkz?alWZF_4HVa& z6vr3lWAkN75JFS4iz35(UN(P3zFg{5N|3JtoUWfHUoHWZT1QH2uTNbGkn=+ub2utX z7XURLww2L;H*7n3-INWr78N119qjbj23kHl?J6uKVMo=(fdMd;n}_f`xE4JgV}Exn z{XzUKOJQ7OTikM2*2O2MI#!*_D`BMA7xhQ@&!?5x)0Ncd%6&U|0Z+**p;g`;TXmvO z0r}CG_w{!tq^B1!>t4XHkGvGNs;LNi50MFZh8Y}zP_d_0dj>&+mCnNUW0e!~*^c1r z`CUo}A&P-ojw@{3QwQuMb&w98tbZ~8cI^WwZ|SN&u0tTto^0T9CRO)+x8H;}JJ3q7 zr-gI~-cSurYBS+#{D?~faAt1uhlGL2&MV= zAmOQ?2gI69v`TFkF4UEsN?%)t!4MGIE}M%jDBZSqJ-E z)s~`wLkSveyQqDW@PET6|3xrBC7-Dmy{R85KW)pyKm;k`QOob)9apZG24lbwU9bfS!7O-7W z0w-aG!Tt6$4@O`azy@bJIC5JJH#8RhRx6UkPppH}^RJ#b`NJ$B^2yWWEa5;7eqe#e zzXn`hyjug*xIhZ8e)J2P-ASS7yUUCB4`)?E@Q?`Jvwv;4yD8gH4p9MBMcYxv-FNy z-Fp^+B}t@*IOrdDptU=F_CS(7&A&+LdtTEPCTI~%ST6SGb&n?Sdl}R6Q4=pn4`+{$ zLQLM9RFk{se7o9c2$R-lY%J3uP5eI_ZogZXArS) zeb-m;Es|@l_r@jH0SY)l(k3+!CvhGM*DxrGiiuLBN>Xv0ukY-I)RLxbrFILnC=f); zz0Ay+nVmi37w40s*F5qFK{5!acfRyO3jZj=LVD*5?_x>`VzbNhw@0r9b@#ClG2vme zDY-85Rk=|6Ca=yXe@qChe_)SzBw&aLBa({9OIDMMOYALR@vVmulaY6$x2`;fgjC0J z@8jhC9Snkq3_Kw@l1%nOdu7Z8L^PNlw3F8RS70a! zz~G}Jv!P0xO;yz91MtrcZ1v^JIaOf5AfJGtfmQe$4zQjl5sIknFSZJ@V!dgO$BwtA z)$6#bQ)}-D_?Lj(fA0J$ZmR6788@Z*EvrRp4U3CKJLuADs3#F>cEmA9U4clxm53Pr?Z`RTi|Hq;#ZywgStkXs%4RLhUn>ox{FiZ1`kCi`_ z*rd#1NPN;09vR`vf>!oYeJI(&iRjkER_aM&hKBY5XYcXCFi&it+FkpqCrO&8RotZdZSbJ5 z5U8W0<|>^pe}8^=`s(8^zi#75#?-z9C#Ci8x7%%?ti8mY89E3fxjqD`&+1F7B+>hE z-ek>nhtJlC7G&0D_!!Lp>(Y1CCHbGKOLUv5;I2XC*r!D8y6dB*?7QpJ7@y!2BTD3V z@(G}X$~+8w%5X{GSxAP&SbMgq6s4ilvQCc;eTv-ue}bcc2Q7Vivj84MqiK^RaX#~T zDAkoPq^qY!07Vt_K`u&JghUj8NfHq->0U<2HMw<=^;J?%5upQk&ZQgx;}~Jt8mIz8 z#5Dbyr0d4wx{mEAHb3q4RQT-`Rny=-m{5ceejGx0$2`IjW~9})9x+L05$~K97e>R} zXfQW|f3pAxVF)S5ATTZOb*xgi5vZvyON?Q_k(wEM2ZweMAkq;DTdm6xyCh;;!*v1f z3EmVyCs!#{$;7NAac!401~t`U&>yb32rzO!J-@bVy4ogbJ?g>`+JdmN5B7c0B$lz8*;z^oBB}xdJMYhu#>k?z*6MJ#lKw@RxAn?u@b4ykDl=|jySqY(<>wm(602roMd*nmg&-@!~%@h7CM(PJr8 ze=h@uRxQfSJh$TJX%m~#1-%5xl;Ex8t(0!>!J8jW`oy!HeRgp2Z)QuqXdIQB=AnMO zM}baXZ{Ds+MR68d-=Lo>*(gnz3rq91+mwA zO?V`0BLP7;+>^8g@C=Auq)i69Nt=*ze-F|oVV|*x3i(LV1|j6%@x7s*N>JF=41)|%G+nwv4}e=2RB zdfCQo0Cbpk`DV)Ph(2H*VbteF#N|ft0dcc`m+(0Tri(?Nu&LLhN0Qp7#bH_CPD`aA z13F+f9)FEZreEaJzwERdk{0?Rb+QNz;?35&LBm*J9!vjX0T8rxfW_mSxep| z{rWwJq-05@5ASlx%jpn#Bx$j6}-JZqwPXb4H0= z{C@k>)mz27>v&AKnniBW-MZXt%M{mL{QdUgKNl3~4GU>+jJl zg_l3gBEpTHJ=mq&87Io%XPep27yrC?gP8Sqq*4(rc^|#1-269l`1R@F5s9T~5PY>* z$|$m{7o5(s#gfNzp18kFUS!G6jjN}s&b9$UI43|xq=6hhB*PeWAR`t;49JLPni!>o zr2+s^e@sm?mWde0FnZNElBq^|B@W2Y9Q~ce^IzyM!rF?5@g$QFaNZzm+PcRmsOsQ z!nrHA+h*(UesB-Cd>P^&FqgWee|au$&D^FDGtQ!rfYX=mDafk9yDrGfujQ*ph#DXr z(t4>S*e3f%tq1Rbn@3>O&aFrVYlPSM5BuFcSR9*|Rrbo+ukNmwU}%~*=KHTk-#O>j ze`>inXuC81-fo5xO?C72F9G-lyq9Pe)a#^nu&sk&8XW|k`~Auy^MjS!xn3`v3xV;f z+-yqx;vp|Sc^K9Zs#jmLQ-d1-wn#+@WuwlJ8AD;#D^n+afxTXq{_z9LMs+48XJF=+J)vV-$v2%gojb_G2y zL;idj0*O>jB*Oti>k%=6PM@}3!;cHGwcg&Q0U5@Cn*<`-U^phj&ayvDhz1kIW`#UQ zh+M@)#M20o$2cAeu@1YgSV9Qqe|^_=a~(6>1W7oq+ePy7stmQd^Dp&_Qoc zV<0u2%-hp5wH{0dl*=#RQz*SKiYTonQF??Wbi?>DUoQ;&Gd790@9jDTf8##{{S7Da zp#q4f(D^A?-{^dg2_H^-=%xs}2|5W-dJ~_UTr$YUTV{w!bX9YxRN`rLRWnGObSFnR zqNy>IuId@tC2;h#s&+S>L{$SWOA{HZ7bG{Qvr9dR)=wbBR_nX`{7@e)aZ!kBJQ+G& z;x@2=4i)**@D`h0AlYGWe@M`1ewP&P-N(h!)$ll5<=gvBewQbkpmbwkrfDn6Z>vD` zXh^z*{rRc=C0Kr|e>cH^C<(58+2+_VLXK4Xd*Det&vr#=nUjXmL9tQu2jD{%OBJj6 z+lA&WQb`d)K|r#~`1vR-g`yxf4el4JTCcJ_t+@=EsUk9JJ>+%Be?&oJM4PVV*d-Fw zbz!++^E}N8YzWnPjek#WcAM0@{1Lbylm;bUfGqY4Y%vAx8%lcd37w1w!VtnhS&$^xjPnEJXMZqF+4f2b+VR>^)-yYr0PA9{G^;pq_Z zCtl#IBhVmM%{1AVRV1w&SAY+|R+nRB{++Wun0JPk-Jywoc2jlf)>K*M2KmarSo?`I zPd=3eq$_s1T!ox0gQS6t+b6a=4&`JSJPx2JBsm)US@%@AA^uCYE73lUYEsX;1P>@3 zWhL-Cf8RFDNE{s?huWuvP$+^Vg_eDl>O>}HVwc?FpiOS^A+?87xbXv8L%zU7#Jy_P z=S7B2w<%!$V%J-6vLf#>zEz za@AI@cGupQen)pw=3m{FHYH6nYm9PUXH^}tf4FGS;#_{e&5K5WeN~s;J}1y1g{2|v ziWxh^ zLBH|6&mDJpR*mB?pe!}5#((yhw}`hag0O3_1vyAo{yIt`B!gV>4v8qQW1$DLP}(*x ze{RsFe7^i_&y@p^VDypv}KSG>>bSdai+9Z@S zKL5D)i|Tdropo+FXq_8AWJ#58p4`|ue>xmJk}OpIMZ#K3guAR+oW3vNpdgz-b+m~G3e!Ig4zkP zN`xf=mfb#u?a5t8C0n0o)z99iC|u}oYXTqcq0Eg2*}Cn%;5VsD&%Kx{2cQgke=21l zWa_cd+`Ef$yr4uujHJ${>$0|}vir&>HEqs+*-#wZLxYJ#{MolgnpCOHq3vE?J-M%! z?1d0lOTx?4wFG?9NkaG5me_mcm=j=QsJVit&cA}kVg(gGo8$_f?QBQhomBTnFX2J% z86AW&(Iq^lU;`6RaS4wJkSHBoR*$M6H~ab)o+omtG?S<9;dKDmTS}Nx{r_6tkhO1y zaR2OkdC!si<{rO22M3oT=-o9g zV52PxMxtz9BvIufj{Dc&?947j$}7n^=YRtYXdlDbnb~>#W_@{m@%pVyA|5jn8y;P+ zqEx`2U~yui>t*!IvF4KQ1`z#1W5#NZ=ENB8eo67MqJ-ev6|e zZ2l0%OqwiuK+;VlL5>7Q>*&M9zb-DVX5%A;gb&nMyQW%yE&^JKj3vkosb-)_Y9_^( zMX_t0R`+=u(kl^6>E0Zd0e{xOnfILY?J~qg#7reU(ajMq{V{o6kW|esubYBR=Sqml z^?ljU@~WHi$#&6})s_|(Fc9hFv%RXKZkvz{98}R-ol~V3g6=t*E1fYJ%V^Fe)5_U- z)veJT_+(YpAk1bu=aale!)m+*6r~}W_8#?#C(UEi7D($Tt-WvuNPo6OjJjl}brHfa zW#nmt?yv1*zOdXrIcX~T9T+#ByjzhRkJgS=N0SFT$teJwnEqR@Ax$63_MS$$QxtiJ zM4teAK!m>wnSs9^*fV?^Mw+2x&4p2uyTXcM^yJ@N)6!B-3vgsxVwA!f2-rFQfEgMf zMFYUB+y?z4<9N>}ZE9rZ34VW#b-bwRx@aJufGMi&vfSR$31}vx-NnPgE^phScG6U< z;Q3m!Bu-BGr)H@bp3i5*unU_Sf*yuvbCQlB7e$HD44nTZ2}#GG0p!laC}vVV$Veif z%v?!{b< zGen7oL>He)$cf=&{l_PAC<2+5$V}?qAfQjo?vC^Ix?1FI zv2^#dqTg-dS3Zt)$WG|+>IRhPk3FHwgAbDDt8;rqot~A`$6xr5KfizfZ01+rnE9gG zY`jyw`WsCU%Y=VI!`2ZZ{r+TJc;@RqvhAvkIv|;iX-2Mpus78FV5@#X79O%J}_h``6`h@#^hg_e4jKl3JPr|536})e z6AaY>tjDQM`BK^rp>!*&&Nnu89XlZ;yq^*%fN_&=+$axs2QW^|dAmskZ5iMcX#o4A zFEgA}l4XCeWO<2HePuUlb)g=DjN#Q=F3Y_w05-erx^M&#;rV7xc9$_|lZmn23qak? zo3L|%?)((mw`e=v3mM>%vLx+U+@5Cvot8e@A{&-vy-lvpF=NCG{YpUuxtwL!HhEi@ zUqWXXfPN}Fr85kn0(lDSla^!aPuX`>%7HS~Lj!-1D1}DyA6p_tq%{jSTA)eN_a)y2 z<$zG$_qU7Oo#Z;L(zm3FatGPfxq(Sp3i)p223RoXQfJOMSZEd2Q@iMz4w{hn!Qi2; z5Lv^pDgU&MvgQUGWh8@mv~MOj!QjSv-ha$kRM45BmAUwf+j^4n%H*mz7{Y7v*kX~v~ zDI~Sqk2`N(yF^aIy?;Qul%19o4?aXF z109Vaqv>;PA{Q)8vq(bsB+{3)$sC+paD{)oV&HW$RYID|(moId#UZmU^I+|pTZJDR zzcz3qw^m}c$qWW6IA|Aq>EmgFP4#m#A|vMbDi_YLX_}s|-LYaiVBaNvu$9<}15<7o< z_}L*W3SNuBSCZ!!D&z;p*TqK+KRU0;@l}x?3oJpoDI8+qNye1Of`}!f7)D2{Xu-q2 zUKy8Fp>q!^AT2sOStborT%CJD=1e5wRDB$A!IEJ`%h!#Qd!OZDf;Y9?Z$NtWio&pP zA6tal*isAW_I8>{d>KWBEiFDk+L?dN=Ruhv2!>aO#32K4&Gw?toZw+Q*p$W~HYVu{i$`3bA_jrq&r@w*LrTZQ z;W^r0j+kquqOO4Fb7m0AUP z-F`z}CsjO*X=ph!fEg4cYEWiEAmae1}i+%U`S!U)0A z%q=e0i?_*YQ*U?m`u)17+Ty`d3!OZCP0zp60-$x(<*Gr7@Gr6_l=Zo-?#Plk3ie6sZQJLHtZUAf5yY$dA-}!6)fVn>^>mAYKmff za>V|Z*LT6C?@O`xvnjqmljWa9^5Y-uSZ|lYGHV4qHPdO}{Ij~-JXi{8k{#gX3B2*7 z28d18El$|v^8;ARRP-yZITa%j-X{lYr9QBfVNoG)tZ32qT3)!lLWx$ z61MRKPAyAhf+>>$55{N5l@~8AFFsvxm`N9WA)R2{EwYp|Cl;&S#oKr3VhvNkJ|>-A zeD(`>3(1s3blb%*7yrF@cGH%n(<~F2M`Z+UOA@@vKVW}fCVS!n2l@j82Y^jo(Ny_% z%C~l(uZq?ScPX`CaLTESQId1)P)sNh_j@x#kz+DbaY0_KXL-t*;60WXGgvg7+{6W> zLQ+bP4+e^kh!9}Rp)2c(-cC{NB#5A=>h*~Y?aYQvK^x}VEvd^Y?}|V~phhNW24P5) zsHDhO$m)L$L09lOxy2<14{ao$a{F>q%<@SwuFtC;*OFPY&_*#U_`P(GYr|wpxH2(T zK0!u&b*NUJ-!qa2sg4XK2Tmv_fOBn4BgBJDDd_d8Zo&$DfG7_i+M**+eML_%=kRTi zGrkd;RRff}MWrN&3W9&?L{#-2$pCwrGY&MQUd^82X=Y3| zW76ulXrDJZ_@V+>A-PM+7N0h$>S~FBmJ#^Ut2+!D@Py^Z%>z)xZn*&kT(;$UUU#?! zf8=^%W=&P3GA`I5OAl>F`+V@;wjg41g0*G!aU1AZfjD**O%K8VMoJ-~)q_)a83R+A zGO&N_;EYNMz_HtJi!Wt|-(M394Y(=tEs7*_aY=alN^fMHxO#_tH~>ppA0`mUlU?4e z5Wb-`-6rp71UfaxCkJe>y)L{wr!0(+d5PfQc2&$YXrjDL2r$&D$6f~B_?Q}w?E@MD z%lM3r+X5QUw{g~zx9wqv&Peez>1uj@@ScCGpqH;j6TronRk81AOvVTUm=qW%{7YG_ zON(ZMZ6PqpsU$+?DYYDgqQ@o~0y)fkl3{Ka^2lC)5$GiZi|RwS zKXfR?m`CC)eJWu$$}{_qJi8Hh*q49U4uD`oVav&P5_FE--Qy78VsspRvfs0fU~9s&lvoJy{_(#)!UUnorG$xnHI z#^TcflUc+H?rkmzE2c%CTt5Ht)yx09`sdB0NnsMI-2yTXSfAZ1Yf_M?Wln#4ToUZk z@BH%#XP@> zZmP-!l_O1w5e1Xv`M9AB%QAC5i_)t1S|LrBK2-t4F_rWg`K;SBl5s1}8O~%A^hPmc zBI0ruv9e4J>D>v9PJOdxFryTxl8FK#i>4lOj#=Qxjw<+jO@qcLNXR>btLsOUA+ z__nX{{gM!^t*=w@v2RLDmT`!6J&jN@1SOH*1z$+h1m;mq@TJptOU>1Lj;$8-pDP|!BLtL40lit8h$w(lucM=m$!~g-5$)ki0IN}pJ zg}E4*Sg;g)r)G<~X%{%@s~4QS#>&rsidme}P_#nLculLy3MwcNPrfa`hFxI89es(l z5<;lGEkiAuxAD`kY7;&zzT{Yp5;P}8st5fVoXSx;_e)u=e9nJoeL07TCgqpbmsWtJ zZOacHF-+09H1;rQl^Gf^1g{B-HS?Io;UnTE%qxQAP2-KgH-N!GBfl*2%g?r(`mkNo z2l>|XIY)k8w{eqYzWQ`1n*sma5yLrpkLJrqMa5|9Sza~-I&yjdS?66&qf@SqYvuEv z=%|+e_;RA?8>wE%WMQ;Ts(q3%hH| zcOcE*0guAl=hC}ANVY1Bg&mED&uP_=FDbGiDTm%ImPLO}8^0u1DkbT(Usr}a@d^!^ z)SirrL)HWAo2cC@L=WDR(8FLr4=(||OHWh{PBS+s%t;9gfxUUVz{UWV_v`Zu;aHk! zz@^|c^1MIIhMdvYS+m_N##42NVm{N8VjlPsZu}-JyvnigEWhT#;{YfwUjYDo1G&3~ z;v0U^)VqJs`~wf@^wG6Kdm!%sCLeBJaxa!3b?gG8!!B1P^#D^#(bS2gDvC9=8-xt) z1}B3H`2$HQ8t?63Y21UFJzY#9M!yZK9yuUkQlE54f z0)ozx-=J=vO_H2pP{4jm&k?a+dV>)DJ|S$><-dQ2d`3|9gTUD1DB3Q-clCi>Z6NQ8 z;9a@%X3o>(7p#~*9SSehuncV`Y}omHcTVAK24(bl*Qir)i3^At;Lg;&%tohRg3rV2%*Gd@xO^fq-;bCSjOf{BTa02{&V5@k8niMv%&WZZhFhwTG4y1#*SmdJcjYR2 zSiFB;0;aF0zH{GzvX!e*ez7zVA>6bHd>K9Ly7TcnG;M=7_3cUAGdkS<4k9cVT?N4G z&`;;dY)bRSr>l@d2qA)I3PE?WYZ^ybpEL;}NeKbCi4A9bK`(&MLpyt^!3|`U>JFE& zsbx^fN)Bm&y`;H%hjY_~tiUU;Lqnr=;jL7lNb8Tl|Mt;* z<^c!3!|k)i|3AWU_z8rTH0|w68l4o|a#vO{%mE-`IywQkLZII$NIPznf(~@NryrK6 zBl=UQ>|F-Qt?%vtE1U+umolqVRQ7KA-${QS?=Y}IarAG&f?H;V3zMN^^Y}4gDJuxe zPv$<4_(RW}{!x1RXl`jlMm?8VY(Rgu6z>D+4}S*dUHKaTuG9YW*4K+Ts#f(DA|{6u zB(#>`Z-09?`S)fY4skVoZRzR#frpP!)PAi>e!K0=EB{YTAeMfx3BMJLS?R{VF-(8s znV$UkM#hDdWr3LO#A_KGObpAdt%#BCa&CDD<{5#Q!?kWCq z)MtNB|N8LhT`o?Ms()2SCxE;HLVHuL=yjF*Yh{tSVaZ`1@`EOxv4jHdu+5v8$Xh1m zQ6di-;qOrS2}XcVHICoL2N+$Begg8hNq{Y0DH@x+pj_1d^5Cyn!;-2FJ7ajoCl!h~ znotGL*mmXqw}7VnLSt&vA_ls<3LBCV(500}TM&+56$4tpK>o|%UzZvxX$4_FL>bQ0 zsOJ9%koi1SlW{r|0XLVSNdXiCF)}olQON=+e;M0u+sO6ZUm>6mOBvRfb0z6w19*c5 zXpx6>>o?a3xZ=oWLy;;k>)2o4bLK*k@>p^=$-@FcG&4MNZgcMb<>u`2L%N_b$>NMI zZZ?aA!9PY~l`U?H#ck9*ZMV8_%k^@_<22glu>NY-o3`27)qjSrx2v-6aFIn-vt()X ze~AC-)_#MVd3`@rx!da+zrv~R++}ySZXC95*zJ}pmPAe4>w+v-f~)B7wL|xyE%;C` zX#`hk^aP77E~YH6^G;tZ?{5CFh!-o$i4;z>ys7|#0`?7lzWgB6R1+*Aj0w18fUhmc zOjjA9Y3czC^MGvVba4SoMx(qg?3ra1e-^-&*2joanvj^%k?K$9A;L@%4i9uddEIPx zgV$3Q{i-)c^AuFoScqE|-`UlsY3(AnKSkNChpsD|dgRXD967JbZCU3%LZB{JG|5Pk zvAIf}c$_=gxo{Q%C!iR+C~Nzr+vTl4d;ic>y8H5Ecbk0OH*NWB$PuR}&;TWwf0PV0 z08hy>633~f%ixOzQ)~*x6Ht`b(;8@On*!m^{&sWr-!oKmyr2szIiYY-DP?}w+q2ud zcu~MdFdD+Mbn$3Fw+l{GhS#dazs~-7_6xetoFbKqq>=+JNixMP<+gcTH`TfsYEVW% znuL>-anI+~awX#!yr6#8ZG+lNe`JK0mz+ku+nWc1-`xIKjRi#GoPb~wJX$7)f@PW7 z3zi5X4g`xADafFNkqZ#fOfD49NXD46yc!%;GU-+O`A|^fazIEr`}lV(V{=YZkT{!v zyu7r?${Ni0Ds32T0Z{fbzVI^>kv{9g0s&~e~|M{r+ai? zIziYCzrm?pqu%j1zCu~9SMO>N7?yNJL&&@GS$o_Y+#qfR4>sb4vpHtuV1_CU@%brl zb&Z@d8pi=_H9Q4zim|Zv{IyBY)hW<5k zo$KP)=J7o`#-X{s&<8F(aQM;w;#jO*@^r$^B`QH7r^E+>^Edr?;jyi&p(yM71EfWn z-#6e(M-(%c`h8QqU1|^fgQW(K9k%rk7W_lm8rx@z$rHA3K*KVBe|g2)E1h@!NkK=W z9_8`k=Jk`4OLuEs7x@e4ezTw-_3yfRo1g~tK+u3_^}Y9H&&?zbh2A%vi){8n5`4pm+fOJBLYw-q=(POO}@#b|9y=wTl1#uUc*d5l74J=kW* zT{U(edxM38eSM6(eYJPkKXA%OmL{H|j{%mU?qq^_2uo?gf2^yX0=N@KIM0qXL@S{f zVF{l%1z}F9B#MoUUY}q86l!!BEk%+c#5ohkn*+9n?4$#ymaQWQY_j56XS61bJDC&wC7EnwE); z&Pj?iA!(W!e^fl7matXEOBHe;$43iAJq3hV2^kXs-L82!d8%ImBTJHW!6hXzqu(S8 zrHU{r09OnV$H_A0t$;j0Q;Ja@8x^qKH5MRv8r_$_;~VSRZu8E5H(iBWV?Mxd{X^+a zS}5bn8tT1OqG-CJqkDYr07q$#>k zec9oZe+zw4OqBpHuY@qeC8TH{9Tr19eReolhL(hF-Al+cu)ifRdPy^p}{D;}A? z45inoiK~kZa(q7Bgvg{4vf;?fI!DoDVjd+ij{+Ol7vsz*rP790Jl{Y?FhE(j#UWi1 z^?8No3RFd9lY^_=uUvpFZQ`=m8hfZ)J18<&f5zNqL5#=2Z>#&Et#x4wB**JaSlhn6 zR56h$n`B%l5mxUuRVX<_m{QYMj;+JXm`D06*7-J73)uB-Za)|acMhr;v;{B~BpkH5 z%D5bK1uLLTQaneaMb8aqMVEi`dn) z<<1%*o`xf2*g$?b9B|S&G~pB=!akfIe;ILRpj&t+1*HR3-!|e@V3lZZfJ@QD7Z&4y zZBCiRV9QDNT_`hH$58OhD3A4BK$#)~YnBItRnO{leu_mtGznXGRPM)QLl7-j?vFk3I8M$RoA{d#t(;{^O*!>*N4VU-SDp`Zx}1WLme3_S-LiI zQ&!aqN{(SYlG?#V|GFooN&h7C;XgW%JUK#kdYu00$12Tr8s9Ygy*M?Z`h#TOFmQCF z>-u>$Qf3;cL za@)ueeb-m;Z7G!qW3HG{DqBT+ZSkjoJ@P)e+@Swj*Zej zohJ5jAD^n~167{=?e^^VGlHe@giHuy5uHfJBg({Nxjp;vF`lgO3$!Dx<>cN@+)h}+ zBaYE#@}IMRoxL_Lz~sbi9&2KJAORUdBdrq0%lmz~JD)K+Eh=aEuimQue4!)E2Sq#k z@7W*cR83Pb&7_nLfdFY=WmnAMdV{2CL!+04px zwO?9eF(1LN;i23bR`&Ix&Waq$hv-vibhoclH?O|)gLIQ^v)s<}f66qqD{x#e8|>yR zoXbcgc(O?F&cfro$Y=Lf?(FlOdDiL59T#KDv(va1xHOcR_R_G#fAfKvxn&q^C)3}s zD1i*_N3r%3iu@rhi^{!axqGIIrCE6A-j>B?zs((GtP3ce$s{5|Hd?(7ohr269!um1 z&o@=kY+MB`qJYcDu{)J476xM5F3yk&Vv03s3? zojxT%(oDE?#GJypf9&>s(q^$hP-txsmb@`%KDP(_cw^2YB}Fsa%nT8QpYoQZ1JT)! z>rF@ycu3~~mmy*@QcNEb+vE=cY7(BU^*}Gq5Cddq9I^-{hUeMPUp#@nQ4x$sYC8P| z7RiZMy&3HD>g#r!LY+(ZVY#T%pm>DSh_lvQjpF0o<=POxf9Svb5a37gC?TyOXO-K^ z$Cwr52jMaK6(IGIT1UiABEiJrHmzfDj;VsKtX2$(_3meQ#U*w(C|0Yf3wo0f1B{++H{#*3iS(1^t?Js%_ku@Ep6lVl>eh&U&Q(U57? zMMG~`y=Zt~dkJU=ZfQ}_@({4dE96S)bGAa2Yds9ZBBRbsMx=ldUi~=TDqZ^yq z8AUGKF|X2US!O#Q;N1BK6s$SY-j>EGRP{$m69Z;)e`wsd)~*uLMWZD4@SjX=@Wy+X z2@;!xoIMNNu~8dm+KqgiQLzVpOe$dSr5jczFR1El>6uxV#Wu)}0{jzp(&{+X5jR$c zQ&XCL*U597rV`B30(iQe%iPPv&yy9x<| zB7}>UyDOylacm%$A@5AfwXN1nB3c*jIe+)le^~y{fmY<%`Twv41|g!wgae?t79(Yv z7v->SX|kPQVbxTnSq_`KI#%`!3cNXd7%5oXuJ^@+9UGmP=M$^sb(LC3AU$%`{x^K} zWY+E(U)cP=*JIilit--i%_C9T zf9(wGz>CX1Q8(UUoiB<0^deu67x}QCr`Gk4E9j#o`k48BYfa5q3}W(oYibs2iwIAu zsSW1#GWwryuHW7KWI~zE#cX}q0E1!<7!>un96lI?u!F9LV*c+;nV3w!oC~D9pHn2} zLbK_OnG*zSs*%-prAIiy({Vc?TYG*Se;>5y(2@iXlUI*O@CRt&vW<4JU6{+HE4&F=zjh^o+Tm|(VS1HqLG9V zeOH#qRm7AfW$ba7V+>O&60y!=e~VF%2jKB8^_pMILnn+12l2Qg7H%B~W%V&|ZhKr; z{mT97NaYUeSEOf1nrMdznjS+0c(o?t8xaACq8Q)T29md;imsH?3tUI(EN8H96~2tGz}U)+Mpq( zB_vK)S|;=}&L)&oSk?D+e@Rfgqwv+Bg}R&3lN}mP8R~iZB71X+<3=?%*n6}?!w?ze zphLr5hlU??Xq?9>lOFLWxg0%ZbfLZt5(YACz`g0(`ZV@w90qM?h4wlt?$z~~Fj%;U zEvA0odrNkV3{znm(|*R*bO2xsNu-n5xA!etno#e%N#T1T6JNSXe@KYyqRbxJ>mEuw z8EoI_QL~lCt`UmJ(z^+u@z_m(HW1C9)tRDk(_VJ{bbW}T{t}9gT>jvPWl@@bY<^Cr z4*;O4=M+C}S|e#krcJudN)zdAdj~ILR}qwIsQYM|e;`%x3PP)su}elu=;Mh4G$WHC zj(=Oi;IAG8Bc>Nwe|hB$ntpgUeX_P6EyzKKzD(UYP!_aaBim1GLW&U7Kz=1ezO@x*uLSl5}OFVLAI$SM;?U!*l> zXo&{1k?M?e=Md0!mqVTI&b_(0KGL8g5LiCDnGkHy5mbEbA0_>x7E344SdZ>7Es@;y zhpADu?^6(WYDSX(1M*RsmqA+v69O|hmmwts69Y0gF_#f|0V#jQS>1EoHV%LHU$Jv9 zS-W0Z{E$SY)6Td_J(nA|NgLmjo5{$#+(Z+tv?pofIDh>C1gVcT*LKHqb5Ej32n0Y7 z_yPLm>genuiDsH*Nup*~>lu#)i-ek`0-i}WyIRez=Vxcfi&(_-qT24dm&YHj{xyqc z3m&m7b`;Ccb-913S0CGL-n53OPtH$|fhdmp?>BkZ6yIpv)%2{Jm1#mOi>j02W9N9S zThjqM$w%zk-3`n-HfwrDFaLra&lf*e%esUiU+@s~w)k#5?=`+4?<9=}-Y_@ij1nA> zlL)qT+gWY)#1W_mt}oRqCk1@B>+-IstB1~iS#LH#L3_QT7bIVB&9um-AK~#3>5mT@ z)-x}GeVK1oG>hjPbh}gUtX-mdy-x>KKXwDfeOiUIC{0M>pqhJX9Q}HA^q(UR+C(!x z<5Ds)OCo>HvPjOBo1^Ow(QE}vpf1a@WOi!_H#3ElMEgYnn*R8P!e|DkA^oe9Ti-Du1e)Z3{m%qJzeY{YK0(Fmto_D5M z=SzcAbRBW2`)p|N>h0zEZ;sx&Ur~Lcw{5<}&%b{h$KbJ_3_D(Ena(eYYSj`!?&yve zKn8w;)FaT4?HhMd%jtFo0!nP3#n3;Dm^vl zB+%^ZsaT@3UeC(L1)()KLz8bzhsxqBSRk-p7O^zx^~5lENY8AfC-SpLiGw9-S(iJ| zb5r3|HaBIlDJplGme|HjCx(5l>s_^?VNQR8%(`Vd_qv)D?v(ZG+S?3llYn0)@zhBE zTF59HT?>4(hYwHqzM>IC3G~mKqB1L*p-^wBJ4f!tLH$4^&~MBXgWPya_{@}R8n0@) zV2)8$cLPVfck3Fio)d}A#YWiiiCao<3fL4w84G$U#4p(&&UxVYGO(5M1a#$F6i9!n z`HfZ4(95oB?>68uO|irYX;lo~Le9r5AvLw#-PQ&9pIo*N#XZeZk@(NX8UY!o5y!&b z0g(Xz3_^-<))1U=Nu-GwlPbj`-CuH-0|KEw&Y0H8Ol2uVX}urpA7;(r*3Y2KEsNO*4$!st7+3s4i^2o1o zSPR2Fsh;}}>#DqCG`#r9FZUmy0bZW2(WPI6L|N6lo6>Q*F`Yw`*Wv?)I39lu(hLgq zv?p(VIG=9kXU|`Rfae%Me`&kCxrffzMbkQh#zWmFS#-kMR2ZO@7)f8|PvA?=&<A%o280 zJbo@_77#%plRphJ#~8VVkE4GV#~P4USz?w{_Ff2$uCi>*#t?+gOPaKAyA34KB}`ey zQ%SfIkj;A5m#;5f9GA0{WobkZNU@YdtYuO&Y!REqEjuC_bEIHsuxv8?j)AkY9p$PRzPp|1F`lnYv> zkR}CWC(R#8xk@HeU)jeS2@_mdUJ2JzWlb3SrzxLcf1SGG190SDTq={dcmJUI+a}+7 zWJWVK6G)3V{l`mZAZ$mdh|g~jX5&K95vj#|DPcZ%CCmrwTS)fs;n!m2cF&hf(|VC= znzNp}pcs^8EYo|~cIn{*y2<)Z+>`nKX^ji^+m1&nvaYI&fb45kZ>-d8c>Af)_aGRHHO$hUv zXGp75JpbKIiNy_ycefCPO1H&Ve6Kqa#=%m1Krqg&UG9jq1{HtZ{P-)1XgF(4A=Lzj zn^n-;!R0dW%8A^Eon2%Q9>75r;HdO@zK&2V=D-SyF7V-d@KR3;bPJR{{;fBVB#o{0 zx$hV7`Pv3b9HG_lIRwho`cx=LB~U*PrT;UcA{Glk^mteVX0d*LSiHaAUR<=62(}ke z4bZ+XC(eH$pcQ}YdO%IgwV3(`I_537V6d{65R*n7g>XFQViL4OHt$O^=f&vMO^Cnd zAjnXYom?E2K8cu)(@`DvT&a5x#8N%L1?#tj56Sxx-Sftf^3#e`xK;qJARMPD3TsF_ z4&u1b6nW)hsz~rQ$w}(^v@7$*)#U(^aikCUMS|s#e5!wKhsxMD98l z*OOc792~nhm7&wXOa=LwUUFx(+;vWhjdAv*%!fUg3X&E!!0e$*a61K?O*@l-0`uSn z8jNi#v_O9wECDvtjw0lg#^mLXF8`2IO6i=^t-72;KK4*sMF1WaVl2gV^dTUKirCPO zyPw_A+YTVOC}sOWE9_ag?6XRac^%3}m+kR|+f#tK0b9EFyA2*0^_A+<-rJZG4=#_u zI4vBsMW!JQ_HMTLnc8I2v@5~0q2}OP+spl&vovD+4?T&LCQyN+J@SoKS3gkb#Hv?i#*=2ghO;eM~t_}d?-qI>wAZu9czx!+lmnRXE zWasN&YxS@8|4_LzZGY4uKmnIVsL>Vtb|`-)CXd@l4A~txeSb8%u06na4y5MaAz7B@ z8_i;0?$lQR-h-=Ev3yu1o+=9N=iY(H1>y~@jzh-tq)df9?9X%-DWe%Q8}$pL1;cEKU}=Q>42pG zhw(??VLEukZDE5Z=s*1O>5YMK0n94EZHlq8O@odGFZ$lU*(BRzrswXjTnvZ~gAdc% z^=LT#wZW|YU+PM_UXyV;6PFQT0u%!>G%}Zw-vKOtZ``;Qe)q4Kw~Sqj5k*p>yx0KV zbd62nZc?xNlm>yUkz>IcX;zmy_OI_bJk-@3+dg3n>_18&J(7+~Z(yZJh|FMwK%9N7zX7^{~+EyAE*wtx@FE~~c3q{q>WkB~77 ztc(oPX24z&FhYRTmYdviOvrU^-!En~Yr!I=dt&hF#{>r))(o2INj1q{dA91EpJ} zu4`I4)}m>z1SAdJ(9SJA-EK!qYU*ECC|X+*s(<;)chaOd6C;49-n*u~-(?QcB+wQQ z3k{Rtl5cgEwEd0kO=4+z$m$BNYKH(Aee4iInxRM}@HfZcZ&aY8Yv2Z20u z;w3^cqX`&D0th0Lq-oYPJ%35BpaGEZwGrEU8t9>Q>V#kcAFlZQpXcW;2@9~I zEZ_h?J{MWgt9-;+5Gj{J>0Y6tbyv<*N?VokgpS8WtzqCU2irO>qE^1gD}_u90(|!K z>6?9=)KgBvd8Y-4IC>8Koj!v0vSIfaYfqzdt~C1GWB{K37?r9DShn zU+6P^)X{S<x0Y7Ow@q-nY> z+5m$>Mc;|W1Ckm@Tgc=ffIs!lft0y7`!F=Kx6p^xN%^fS65HRQ^3vviYqvb2`wO0V zlg|LBrG@Kyjar^5{iy-jXECM2!wB*)k?}ClF(DsZ)qn^&86sI6P25JAR)x!JfPW4K zo?Ma9b^0O3C$16BtE)TLc|MyOTEjmnCHRR&9Pt6@4?>cA7x)_N(15GUrfZOi!KRTm z(TNx*1YwMRm#-mIu)T(VW)u4Cx*F|-X@e|butD%v1sXNn(QBxUN^vFX&|Ti%I4KT& zCgXvkbMM{veV$sgNXlnyI>bbLFgWjj`*{BMkAMC8>GbmQ*Nfj>XsD@OL?u7A-~(Av z5Y0TgHC&-u=Oz@CB)HIrn9hcaAZRtEBrr`;v7*RXt<4%xTC)FtFtC6Mw-}hrWRq+& zYHh4f7$PM+vZ3{-jQSsexcV+9e-a6+&ahy<+0tvY0KP^*;Po>R8v=?`QkkhX3AD2m zYW9k%5%d@XK)@4@0&B~KMGQhzE@>Tv){}K0+Wr^zmkXWM$ipB zOUi(5w%WM3RR=7BWb;*SMVARd#O&6lyE2KI13)k={upzdfJgFuFu5&yY6^J`@8Aob zMez0Ad@!Mp)$7ME!?16q;1UJ-#^POZ9FFe-J17_L^1*h0#35K&8$WVLs+2%A3HtQ3 zB@b%(`4!OpI(e%RG`L5_gSwgE9YA6_i0!1N$+vImER(jJxVHDVG~kgiM8efary&0v z&K>sKxWKegAMu-%Npb&>z4*|x<)NL4zOjYb2t^G?5O~q+lYS$5S4K?}m(gJTILvtC zA_ZO4SBvO>EkFrG$iN?oK-r~9d+;@V&s~QBZ$!|acJv8?*|LQL13o!$R!uN??O|NM z0rLAFV$Q`9$3d`X^dm60$0uZs%@Fsl?mfGVEF`urz@0v96U*FpHliz^A}6i3+x~S& z@2O+#{Y(T$`Q)_pr#+C)#l4sbyqUtMIH5S6Z*|Ro5&w_(Y6#pP%7LXXIM4~g;*lpkO-Nc{&2N*{*#>0};^!nyVSp%stwvYzYbb)o zU|+Fg07XyL&(162xNlfnQ*pnd@Eit`mcFIU(VZEUgb*~4!BhND5CZ8($s1<&Vp#-# z&K7z`YGzA3Fi~fJc6sgo`GJd=g<<$&rS7fVSYb6);NF~B3Ovg9BVvs;eh}4c?L)YX z;UUgS~(K*3k2M>13{`Y&y+h0{LzQ_ zmnOtnSkZew+|&nv*e1Ua?#=!&@(=lcK-ZpReO?yzDEs&LG2Oi{(N&6#4((CsLPFy! z=KFjO_KS#cR!zW#`r;{!!P1C%5k~rBVF^1%h9sZVP@uC*Oa?gq$^Z-Z7UBbViXMda zqI{qyfA+t)%PQIrmK0Ip8yX#%j14jx4H6cyB$lqovLJ0X$HxCxV;Kwf8rH*qH=|zw z>)e=a*s(`KV^B6<{V;mHPbhob_Em;F$wSC(=f4?T?4CkL$Z0*=nSXnB&7&+_y+Rhw zwGUCKc$F+1&k6(if-L-1ZnatX?AGF`G#rfnSV#Kbq~SaaS;X~gq~Tl%kP`Jo8eaTx z9v=T+^YCR^U4s3OrIBN;ZNkF}sg{IT{s%4H>&%mJIuimoHX@)sly7SLj!aOhOWz=wjod~x)EYasw6i}e*MnjMY3!KVQ6XN!a;;ps&= zpDj3z-*`O^B?9;h*i+4PusFp#q95^ zUxJKBgo|K7;wVe3IZo}WZp}k~tIR|9u-T}-Eth7v%sUm$;M*h)e^nrHs_4djRkyt= zBCT)XQ`nV{%DKO)9?^XXkIoK!J$34$)WYK9V(uUi`(Yenb2pWC=@YiRt=E5>y0~8D z%ihJ|^m1;!bs~qz>@K^sQ*FI5PxrUw^44XqRaO5N$SC0tF_UFyehbx>pKW5CIq5Vf z^|o)e{i~-e?m$Op%{u+CZ?U(0F43U7`71QZmCNGhVPWmNFI{e*>ofY|jfM3L zga|(Dw)t3N*ZpKLBjH>d;WN}*9`mVjKIPu1?0J3i_Uh!*2?6KhfCPlGhz25#0XJl@ z+?@RRcN`S(3ZfHbnF#Ln!cD*=k2pN7gWpenJ9&f9!$g2a#~DHFku-luWEx3neR#iZ zo7sZVu=T>F8O+!IOz+Qot-q zoHm`Md^9+4q%9BG>MGKy^vB{TrXrkN^Q`(QOKK$`^J}%oMt_F^}uSn7) z4`)6intp!^b)M9>wGVnmTPkZz({3wwrf^irX#Fqg=CBW5hHAo!?<1MtN+cN&AVQPx zC6bH*piB96L=qZWEQbd1VZ;o;Pg99pWEuydWdRPtUxOm}en1f%_!}mX8FbnwNe;H+ zbeDF3u(yWKnup(;hm7bwGM?#3?Dj zOdMUPA|M%isIvhqzX8`s@6+^SQe3l?a(u0 z>_)< zyMK)80ifwVIe)jZ`YU6AJ*_mI19xTN(r#lr>9}Ltw$rg~+s2OV zbZpxl+a23BcZ`m2&N<)x4Qs4X^;Xq0XDhOKM|GDZBJ9hNLLQRGv`uaOH44JsE>CNt z4{x2CJ!fUJ2ZZ6si5AI#Z+CM^Trrl1ki~YU3hpH1?ZigcYk74%2;lD`C4fPHs}NLm zwtnekr>FWiPL`Lk2mbV76@d&Mr3>qV9X;ls6y`!9yxS=PiUUshT{MbaJeS4+8`-yY zh}M>lNmC7bTua0fbR7*TAQe%$7EHKnGjq7oPr+8kq8Q-OJi#w8~b@O$wpK#1ZD>l%-nh&(fs%aaHvi|9urf+J9Z+B{}-*K%WrYm7m`VjXI zQ;^*hiz+*;gyN{Hk9UN1SWh)s?WwDRyG}>3q92V%{-ND0FiNloBLKv|yPfp7L#Vqv zM~5O(B|OVaKG*aBcR^O|Df3tQqKq~YP;xkZ27ZPi>5#@M=kfy@pyZSkLB#kjOE2F* zP`%v|-U!WZ7js8i<&<_bX7sPHS-k7dGBzIGnL3%$G>*4L>at65w`=2cT~Ki(VZBm8 zJu9Zv)rL&QYX%$oT<8~ zae~ukN+f}n#&U`<`WywC=0zTo*YZW6pza-J(8gcP&3uh@4^IoC1GgYazpk!~9gtB2 zFf*K1sXd7;8sZX$j?M|0f3VVgcOV%5x7+04P7@~k&f03}#BXq5`sW!K85;2Qr|*3v zeIrk!F)dMDn>tk1U`K$m_@)T3#M~kfg^7Wql}ky&9;Zj@$FD@$bSns?r3l zc$$W+=q*~aa8$At87#sERXW#z-cRn^sd>@QTaO}6>^r*?Q;#B+MaPT=Vba;~McxaH zv>g{7t$^OiQ`>$jCmMS-b*H=!=SS2QCG$UWIA6YRGduoW+zjwVSHwx0OB;i=)+*k0 zE<<5{RUZXDT7*2FUE}n+{EHiU-Tu8=wH+O>0PkB|O+(c=qpX|e_pZzFj;Qw^YAe6R zP0e@kD~*5RRP8UQbc?yFUAuprV*%h9+kE@!8UUNaf@?Qrg5}0WXPj6|8xB2wI~c&c z&Q9;Qp2}zOCipxfymdya=ZVtT4nL;_o9cx|PA@^6&E2;B%qa&xbl9RaRqte$G%10^ z%k$BVDu4kqO2YJN46N`!*}*z>+m>~`Za+y2n|~0vMAK($l)a9e=n`nKMZik~jjy&> zP{4=IDGrOoPf=*jdc*@UWz>JZE|yQbQ@;AGq0g~tf@`!1e zqddF+T_L_2hT%z<&wq3@B0f~|h)s+9(xicGODFmzfyMi0I8&^$9tZqH1)noGe>ct% zGo?>>jH7zNw+ks!`>{L)`(Hq_cj+I|B7L?bcRF_EUx`+`JDR;IsdOmYD|RO->B#_b zYOsoyliMF+FeUf3)UzZBJaZmvzFoo$ju@B5A+G~{(t)5H#`06Y4-J(#it+k)6qKix zvLRK9F1InhsZ(>GX>2|kkKTU^K6<0w82XL&d9qxRe80|R{rOnl_oo^I-w|tPa7u8P zs-!%_+>G9z20NMl*&K3))_ykU1S|vm|A;d_hU15uRM*%Or0qQyb^+SRL?_!H36yNw zV@X1L<;2e0KiOWnIOZT*d0Uh+A z+jy^(Q@M8Dr2uha=ZxPEFH91ueOljL6o5ba!49&4K84xspujdxKW7Z0=I|6yiYp7v zl$=kEX(a-)$N~eU_JmYDjEDhf)Vxdg!V-`?MHMzXQ5}RJUu+nKClW%3w}UE&rr~|= z0+X^PDZlgS$5LpcS+D&&*Bk>=&e;Q}M;qzHSJ26@(W2=kIlq6kDZ*6>iEIUe0cBg35y~%-O3BOz z3~0%*V|hd;&Q;DsTX>%Q_w^&@=eG`U%LLZ{zBZZ(Iyp87u4Pkxw z*slcXtI(|RG;rB+q%6lHSvM;RAOc=U1=m4Wmtf&YaG#6o+^LxWGdIF;Hve&sLX<61 zg!0D3J_I(YU}j?$wDe`REV3e-?Cbu13CDT@d_#d_Ts%W;i`2b2f~y;$zwtB0#GyYo zP~slca+fgXrPPi8;$KQ@1)ltg?<+wwXmNH#F(5kJToXE9N!wgQ9aXMcpWS&43BI3VYIOJkbXT}nWdegi*g$q0p%DWEFHDNu+)NbHC+5Er|>sD=d zS<8hhe18-kqF9X!JGD;VL29X3`pZA5a1dX!7L@sV55{l@wSiN%#XGS1PlXY1oGNbJ zENWW3XNpk2L{$FV{nJrxRjNk<3cd*DUd4nU!juwkpo_8(z*67*xv%P|l&%%#;lPYe ztk4GHRqgO@->45GFd-q7V<>Y>MKydxB>~e7d2gXel{7POQ&8IifWqYH2{A+UlBH8p zgltGgM+?GBU_;DxY#YA&75LILH%tXRdHBU?Zk=OHG3$-Mx;5A11wA|3ROlEnGA&H5 zdPsButDTG|j(5-P(Q_t^+M9FTUZ4F6`?%I7hor#ikyq+#TTs&1kpAPIH{evX9um+tmCj zAB;b2BAgQ5!(d5&PYSlFFz@j;npFU~x+UC=PZNF)V7OJ>1BNJ#35*O*_YarAKbbD3 z1brFPgUE7V42%sb;3s(#0bkf@4cuqp%Pi!#y_X(g%4Z<3_VNfSzb<6rm`L(CL-BJ4{s}$fx!e6qm9W*?8V$;&mcuy7 zSb(ewKiIqBkiWy!_TAx4eMT0oK=wOngd@BLh)m$!^JIR#LSH_aQ_aX+#W+{dPYpvCM<&_8O#E1Rf8DrP zX`fF!VB#*hEQxo^!tew$PM$Zk<|BX%1+{Es#LV&!7;kOR4J41e8#D;IZ^-veKTkm( zEXa+iEBgVeufc^oUF0-oHFVR)3?DZGSinAT>D?-bwUHDae!ELCzgR8^>nBEx_vHoq zQ8xQDArFT6O9aJ0R5Y{g$83OiFa1iQJwPp+3H=f@xMlNuAx-NR8?OGz|IcJ0l!kdx z-=b9%Ah(38CqKtVuZSF_6yng7E_v9{Q~1$ND43ep9TyCTbkWa_E z)D|5=bjt&Rbm+0MbSz4vIUUW$Zrf?0Y{L*8V)n}^5z|(up-yQj-b1cC4n0MzGrY&@ z?Ywj2QLi~J7L8=xR_f&3$W<>vI^Nh1+g1nZ5%9Y4M2b$A8iXYc^U*660!ZVYQFE%z z-e13R!rx|SSFn6KvOoQ))!W{#J*rK?$}qp4=3MU=!1>_%iEZ=j`>jMnCKD3tY;|*^ zKB#rrpkB=aoCY1=Y7xIQ{E{wRkzr1I-S8DWBXYNDSgdj>V^yq6s{P!m^{*y7#FTyI z2GFMB4yuf~1J5rw`)OuDIP@{7-;RLVrL2R9QiyL3k6w>RFNG>$yW+%&OgLgnnHQ=` z^m!7`FhC6@K>5dC4#GQ?H?jko6_hz0z-iXDJiue_K#ATCcz}Iz`1#lbe`&y1)dt;3w{Uv;z7x5}X0^d5K zmClHsRD-+9!SHLAU4?p=op{%8zepV<&=1<{ibT=~3L1_xnJ(wk(KUfNhhWC++mpBb<%_xLB5L(M0L(jNtf?%x%?sg0+rllB= zrWWh=w~SIuv@05I6;GBD=IszrlI#8V@A}^?nv;|DKPl+%x1htO1e*U!-R=QZl~sd+ zyU!jZKKBSkg2}anzvk*lP;LR8vBh85c&hQboyx0YZhlE3lR!v_a%s$q^Yc2S>1PkD z6^D?xaw1(S%&jd+*x>INv{_-N+k;d8>d{GOUhPib0_qQo5ORvBpHmyoIXi;f9n_pg z5x<6nJlYRk0S)$?ICN<3<>M`5(bWX{B|}nH271=I_m*Q2(qzCt#ICazM8~jumFP|0 zRGb^mv94Hxn|klw!h6#Aa}mGfsk+K#MaY)stbJ~8UGQu6_7s$4+vetq$hRc2seoNw3QWwUJYL`CRVr0GA+&DMHx#DlCe5lyimQnR|X?HI&`BTYCEv5 zKVSBs0j(X3RXD`@U0!Z)6WP1zEji7P3^nJIa{v$UNlQMKPOrZ_-5N(6j6EGyw=(k4 z2@#P~D=5Hl*=yH!1r52fH;+~qy%B}1`H!8a@M{zWMIRl^9KS2Dv9x48+?E8M`Cfvp z!nhZ6d^!%0fJ5tFtWGzVYeTzLAG_S<6S6C_fW$+=5&TB>zF8jifq#@lQkL z0I)u-fb-q9Z=x|Mxc<0jOrz7{RByJsNJy0JpCPBG-k4T}A&NkeA zGR@o9gbZCbqkK4~AVOCR9Y6w3WMjh?Fxu*mHj1(kHpC-q{TLr_AVP5Novqhk_F2|P z>@uw5f!+y=V}<u23 z@^o_3VqeSDW%v<~CFmWcrj1Z6Etz?gZ+f)c=^Fa?me4f2W~+N%&<6fZ)kA^*USoT{ zYr-&KYcd_D$Cd*r-Tw3Q>IvAn;#jcXvn)2NJpKk3p?*}lh1pE%+}3nLQ+@0DO^4gv zQ!J#EqMgBOQ)Y`~$ma_(hDEgnT6qzp8IdZEa=``(%;N<-Pu z-A${ZDJO0XtiuK~IWs`c65~(r4V6^QivW^?4$>y6h8)9q^Bg=9sP0@3?BmhIZqh|? z@E05s7ZLDH+?dJ=6ij;l;+2`{f4@I|^sXfgB)GM@Sm>P9j+1~3!c&c00|=P-Hr8D( zWbO4tW-1FGGW^gRQ^*5;D|)%Mgvpj95j{Goq=^Wlm86RmkV(mMg$I{j4fPvyW#2eJ zCnm28RRf8GPYkW8#zV=po09b~l5xT4(ZF^=y*rEKe%JqF2J6g&t*gFVFVh8DY%WV6mFAO-M|U-hA~1#tK^fMZ_tqebLygSJp%ItLbR+`3Eo+M%NM4f42l}h4{FdtCO%a zn&i#;woP_gMxf=%;!E0ep`9Q)SIZqWwi_XwIqLO7LU=SLwvWaA3kGI|z`7~M6Zz90Np4H5iAX3+^ zX)jp#9CAZ}B2Gp?z`$@>deoG;mf3~-Q3mL~>P7W=oh?Z{9Gm{%%IeB$_i37FH~ZEy zpOCRComLL{td8$`5oQ#)lP{C&{sPBxsDdTEA%C_k&LK95C4)5t1NWkSvw#gM4FN|| z3#y!S=!M;HLSky{RWUS!Hczs}_mK!G&s3 zIeL}yNEDT=X8BqVgp=5pivL;llpmtT|Dd+kT{AyRc(jY9K_rAQBq3WrabZ$LftIoEGb+cO6*oXB>ti^`=KtV*psdr z{aoBwOV9*gHlE|4Da>oCgOX_(6vYzAUdn)*kCTlH;h0W==KMHnN4#Zb#V}Gti<`u* zj2_^2UPW!=w?^BW!=TH$$&O||^?8{S_>IcGOEuuE#@Qq9{DK>Lq_>w0-3>R)8V-@K zXF_-ZXp)~Fa|+Chj4AK=kTvDVQ;dS4s1FHIkBW63X*7#S=lsY9WwJHB23~7it!g1PES=+k>ZC*pTq5zxobo;eU#dKKFr+9Mks+3XW zl)<-Ab{#Aq`cNs0hQejme7z)!lzhS!lXq4RxL25mb*RW_O^s;?zD1bg`K=VZBZ8WP zGQ7kE_-R}kIeVvY2bX>x^!U}^>_Z(!r zbn#;HScI^eJB(m`bu4Z!Bgx`$_JD;O4<2Cp#d6S7^goB?e6Az&*?omVQNa4>qr(k@ z2NT%sS9g5un{yOgfj?RNgF3aCnWnMjh$@1jvCIumdaFsfwb#hQxL-yl176e4mbjO~ zI(I~t(9UG$E0#B**E?~@^m3QU1$*xUm>mf8A!xrKGQt0%Djpk^y2t{bVc+fFoSzEX zo-M!FUq%3oPyB<9YX6RA2<;s{oTcl+4B##qx5}>9BoDe@qt-4@A5spOL64z0DIBYA zmgSN{-k8vE%|zZReF)dDLE?Z6HS>1MhWBlgkpLtVo2TBN1xj0_fI-(5W5j)G~y31j+jB^|JW?0 zqOfgyA{WSzCh}FYxq!Q_cx7v;zRsVOmn$4~uLe?6Hjn=-4~j?co%ss5s7&=#2Qu9a zdQsvlG`naW86w!!%mvRtLbr^~dG!b0o)%Kg=C9txoDIWH-1J%uIC4i~12%?QO3LW=gotEwsK0ru1CdJ!D*i`*o#Yp{cW6>9 zw{nFP-HT?|mYTL+8f#1}5zGF};OY>>X)F$>+AX_F7!F>7q?pWt*72|tRT0b(9}>4- zv2<2W=@K(Sos4gw7CqKds1L=JQ)2b^!E7(Noqmdc2|!j-C*Wj&Kpx#h9$+7>Ubv+c0(Yz!AV37$Ol&ZoHZTTM(XME%qw z)zm#}op#FXaYlROvov$Fy6tNz<@0W(w^dwJz3q3;D~Z#2im&6Dw7nNQDWf=n)V-`~ z%VZ4|@#U=Iu1nx~?#XuSPUE`Fob=J9djzQ`zQ1Mp)8;yjt- z-nQxLZ%w;gFr<^46D<_3y2)KQvK4vi*%}AMX4)r-$;mS-D9w?mAgP=oA{UoXV67A_ z3C9WD*^dQV$}=xRCo*mwd)dV9+GH{W135kBe1#XIQ*rrC(w?z-Pi!l%%iNO(e(pD7!Fr!&I-NEZBe}dNC1&BQGyoJ@6%wR`=wk&P0yXB8XfkL?YP z4hiJLnB%slBbh80T@*6hszH}R{{{Te_)+n^1LCy_t1bcY&5$el6L(5Aoxr6Jc&_`$ zSXFn?W!E%MuX_SKuI+@_wxq}%*5j`U-&|6{)jmn9d_1<|l)jLNT%l&{Oqn!5Mv#bD znfo}sN*N7hx^yDWm*@+1Q4h1N@R4LVslmTame}Udatb`7oEJC(0Sc1PM3GcCxwb-S zo$aHYoPj~k?}pRs-~60x9oyal7&~_(>=}OpXl9T-uWI?gYD3US>w+Q7mOA=t`|;7> zrv1A5H#JQ2jQniP>!8T^`wt5gS;;u~6^3S5O+|=_6NBF*<=ZKRE6X+5E0kmtR=hLd z9n{kuKmQy@WARGG*>_YfR6`X@9rJ|Eq9bPz$K3T?@9*q*z=js&=aqbqLA9e^3pF%W zq%)_V1RWEpavlWRRyY`%ZTvUkjVJsDT?k1~MNs9|Tpn0ZjKzj-`OBv-AY#`+($;Z! z9g$brphhC0H6}PGdJ&nuR(kmXDj~aXlM|nid$|Pp9tqd3h}_;f?xypX<|GX+n?;#< z@haH@CGp)=c05Tf)08m)9#I68yFK^4z2m>{kW)(Uf)iC*@MeJ6_{yb3=uytI%%vD9Z||o{w8to zWaC9}=eBwQfKxycloRX#nNc#LkVjsG#&e(9U#C6)mD6ca<^@&2hB1c&K{A{1Ap`>XTp;_2}Lmhm++M3zrZBb5fI<8rb zfZoYdU|gtU!Uk>G&`RSm0eF>8Hd>t#a=KeyzHL;3o^I1D(;T%^`j4A>gihBX$W);-Yv={@BwR zj&Ings-7S7@=Wb0Kh~)s0HG?bL4(cj&m9K9F5>mizuSV&12sLj?4*4(W#!JbSEwPO z*8^Mp9(8X3NV(N=^~I*aohyR9;N0mwon!2kkoxUMLW+2%B|{!$BMJT35k})QfW{MZ zqIh~Y|Lj2(QrPC>se2c?oJt632NH#yONNxnqy3V@ zlK6srfqmrp|MmJ-7xepXl9T&?nQWk@%(pxRrRPoKMxBOfW%JoS3O}h7R2jyv!xD6q z$ucocQ|0>vr1{8TXAPQKsnnGGiCD;GPPwz`etj*&;c4n@Zj2Wd8qSJX)6x5fp}eB3 zCJ}6m2y~g1BW7;4EQ!2ldK%}%Q?YgnQ&)C&-Y3S8aEM9qcgdNmGFB?V0%(j?*I2in z4L^8-iSb>n+19qC;2CN7H?NPfPK{IC(|vK!wIA|Nl+vVr7g*8Kg-(sMs|)bI4tGAi zy)g_LsA1f`<$bMMa}*9Oh#6DKcP7g(Be7|t_FXg9b>d|y_ZtF{P1X&k04*x>%!~}@=N!@t@Hb1nYqRuNz}tkjcIoqN&)!t^i3wwV z3sa&?`p56~+AkgW`Vqn7L#>x;)!*gq1_{H@Q_9EKR zyUS<{U^FT{uf_Kw##*3j*ll8joo+g4`1$m*S2VbcN zsd2rS@^0MW5;hhBz^mf<`Uo5OpJ`Xo_fSDynJs0(74`&LGD+Ss{g0M+k~%uc;06o( zm#(JdZ)Z~S0Su?(gV#JW6WbCtx;q<}^0ifAmY6o*cQR(^aA(|zbRzPlWO+0+;-vLP zw0YXjF6pWbXR%r+uS>5XYZ!d$aA!SxFHb5lVqu?FqHAszr=Pd6-zsVHWbauAbO zMSs`|nmEz?DQy>}d{<$we6B7xK<&BpUa#)@X5xHX1gg?MR+aVo0dUf4uRgDs--W!D zp`3Juo<-Ykfb*>DA;ia;y0c}F&Ry1r2jD~Jly}|^Ws6AsB8^Iz`*JeqKWy=zwL#pK zHY%)#P%I##^5y|Zm}a9CQ&(Y3{aMXrOvvMV*BeZ`CxT@v29@5Ltk?MxYPE@da`P=( zTm6Bwbxyq3>_2N|M^#^G>Q{|~#05diS9jlRBO1Yd0DLg?&7;}i0g%B4P#NcueL=$X zgF%EabQr3|JvZIW#5UGhol)lH1%>U}=AWWtv?{H$p@P8c3LOIax&e&jp7}xYr?FTl zG%K7=+vx;|QxNW@viJqmQ1*XWkaL-q2~e|S#t7kM_j5FrY`%^1kr&J!MAF_4>3F96 ziWwbUfEnL5ZPI;5TP8(D2Obhe;~=5-B2ihxxlmIOND_R1urEgX$>b}Bj1>1xA=o2{ z`B8-5;NXEeTX}Vt2qE#?LTApBlq>Rw{1A3i_0AK~#WnZ5y(O+L3~7D+js=(ft80sP zF8N~;n_<6;srUpB0*WD#7hfj5i=1GEt=piM0Tu$&SYbKg%IfhM8R;9IhI@==4bDVW z)77*UD{kiEgTBfZ_8nT=*d=6#x*+!U(`4|LDnf`G73tK;P?J3rjDnaM?VClXq)+wW z&-J2wKiw4r5R@A&0)K{Kxpr;To8WCT51G931vP_Z_k{&<-fUrRMkXG8@%1PQEGblZT$RZv=zjnzw#{TtMe5o6eRLAzm?AWwBE}sxYXEr z2U<3UTjpt>KrI`P(f6v<#W#ay7@+`gfFZKvVjoy33i*Cyyf&QlFg>H}kV&032K9KJ zBvUqJq9@hAS&NzoTKrG;nO`T$JMpfM>sKeYH>#la3Ei-Ls~5}+ z0nf`y=dYN+M3M7P*L+!zso-t&N9?QW%a?BbSZ-*Hve$<4vKSz|52)P9tN%I`z&t2p zOqg_ex<)!Aq-m(ddl96l#7cb9bbnKARCtcm7Y3!~?e!;4Sk08X zA0|~xxvue;;840*g~R5Kf!9G7;GiOsI?YrTQ^WPmmt`evDv5&EJx5E>q9NynNliQq zb0?#>(|C)I`XRO2T~lO?Xw^>g#VTV(uPXhY7X0U?1@s1?05bN>gJgXNfgt#Z588_P zdfYPmyoBLxL*>1D&y92UJDZKUoB!GR#h-;SJMO_-ZfAY+;|9#2TuW?zc>iItE9X6c zh?P0Ve+wiS6Gt*A3_2Lg|4D48G`^9x5-9&6&DE$H)p$IOy9I*9E#xDjbz%uZNP&qa zmP;bB^kv!@JG5l&5Pge{Ai`>aU}YR8X~Ddy%AS|s~B((q!|rOwbHZ8 zGRyF=2V++5$U@H#QZz||MHiEa2!OdH0v5MZ=!)|;#V=KsAFJCxOgx_Eq3*)U5rIao z+!nHAO8rgJV*Y;0P`L2D7d13u9qSk@Pg(iUE|*L-p`EhFzQQCc5xVBA5yVXng*0Q$`3Jh=FWKI>f9OtOP~y zKd_BODE;EP`3CpP{w{@R1o7A6fQcEy?#((yq#3ZyXDy)FR+8TO7H8?9BL$}}sMMKi z)wWKp%|3cHe;CsC{bFA_H|0acO}pJM<1=_u(|_e^3ul}-E&>?H3EEaJwZP&EC}?cd zzqc=Oo3=n-V$fa-_|APyd22faofFQWQsnQ{WDcbG{W<;eleiW#SX8@BD9}>FP{Tpc z`v*-ca5n6L<$F^ohcM|0!)yesaF8g}jyfSaA1SQw3w<(&;F2%VsNo z)ipP~Sm;F9s}A75v)rPlscm=1x?`xNp^r;~J@n~)g(uU{(txo#V$8#qx)Gt(uMb>< zis4bA@6JKaAk93Za@?1bn|R?5OZ~QL3LN`4ymwZg^F^2(;`Qp$L+ufTT0f!SiZ03< za#ur)A@-C6xAJfhd$)=w7Ll?VtJu#^jHi*$BqSmZ4ge0sq7*%`diA@#{T?@W5QeS@ zj~}t;t-IG`U}cyUwL0h(5tM10vgHQH92)ad9WFuxUrx6{O(22gvp-p>l<(tTw>(IcsN~Sr=f$7r6|5vC?MagroGPa1zpJ4XM)>@W zl%+F$|NY~J1Wo}rJWO^R9Xe%kPtn);_vW_?7F&{Ushrzr-AW?&Su%FZz*ImPnIiUH zu;wh%KK}O*VE*sm4vhPMY^F5-c2F3=OdU#n_;`l+JxwC@Q-V9~GKqLA$1u|$@q+bV zl}kx{GWtm$uRrz4qLEBE^*D$kq>}m4u5~>_jBRp+h9rPd-dL`D4 zX%bA#)>ViZiM_^4huZJpF5Zwf|lUzZhKPpbRYcjXOwA% zECRr{Pze4O5}+vpB>s9`a)_f^lkrtLPP=aCqkkvOM4dV9#^(2PJI0>vj**Y&S2vPy zCN%8rbwyb9V_P?)<*UVbkKn2`+gdX_IV6Nm+kg~FX6;3fBvbp`w>1Y;{C>1v$O(yi ze!vpn;vtXUk)?!1H9YuiyEo+T`g@|+WDguF2eWxupT>LssG7}+i33dywhy~pjJfTr z>eS*^pBi@8(K6^b8rhpy%~wW2RXEdXIzu|!mMl^FRHcoV1Z(GdY}>Jl%_WP_U~eXU zS(JZx8fr?ymp#qiyVVDDdGAlelLlMjg~V_Hg-=U)bJ>>NE$p^srTCJ3B^wnB(Gu>< zcb{cd6NbM(Oj4cP7Z`1blQsLNS(CnSQnAwlCMCzr_^m%^yHcaTRL`7YfF#SvzAm7x zDT8;MUq9*LpL^M-kem|i}$P5j{4wAW^Kmt=ky!nz{`|G63E0;oC_~S zR{qVZG~Bl^HCizf$0HgHB#`ZT;ulkd90+RZ-_mQ>)z<(N3z(%uGkWYij-1f(!@1B8 zr&Vyp9a*vq(y_hqeYZLL)GI^HK`|;ZkiQ|$D2iJt<`QWq?o#qJK=-17K3b|cWP-Zz zgVsGM2q6W(c75J!1?;lp}?K*g%a0~rMT#>?5U`oIC=iBJ2 zwRg37sV@M7A#8W})hf&P1D^s<-ahfxD^tEJ&C}C+-dFh7ixQ|XDwY+P?k~wQl-`>G zUMucxValL1-IyeKGH8NXQdf@B2m3sA>ZO`S_(E^Giyt`P#>T%nJVEPZd?-8yV%S5R zMXn*}*@afzNfR!}zf2a~MG={lr+A3fiyq8Qgt!28jGUzq3odP&l(?TEsQ78*{=rHiDJJA3?7YKQc5ANb?r}m64#tdosfj#5?rIvOJsJ-^emfEEy)ip22Ob`2MwQBm&(K{C z;bnrA`H;ggOMU`c>A9;#M?d!*giDau&-lb`;V9>+yc7vj-SN49c81xZcm09)=vwNP zH6AKk+rDXgLvkU+^Ew9jan_krbl3gS^%HOlU-Ij?%4ypG^h1SU7i7qp$!QNn_tdCl zAsoC-@UEnK3(`cnoYeTfa(jgfJSKZZZ|kFd&)8w2H#$(2>WU?hYG-*kymmEtgT4EA zDM`RzVKDj2vusBsV#}x-C9Ug;A}$O>zCuMV+UzasoPSsxi{iE@-Di6s@vQNv85Mxw zbDNzLP4DyY<_RI!X#%NE*9TRXkHA?S>GTj`6|l#K^_`^s(or``lY#v4{P~m3R!10h ztIeK4!T|+HP-9zO%l^w8l#&Dte-r}s7z?Ulq*A_8_2^7?1BhVQpK_d#mzzE$<20U7tDGN2>~; z$}nqn`*}SL1RHfu+&Znb@99WL&$Dv>RQ3N_85^$MvLw*cFzdDH{7|A&bE4A5I7EkA zNphuE5wUU@0D!Duo8QBk*_)=Br9dEqGN=7_LdU|)_5Z1fS`HghXx}R}lww!7F*bbchV1eDd{U261c8>Vx;!nsfVHd+BM=%V@dgOtmF9e}jwj*Ta2_ zAM^;3DQM9b8;~h6VzP8>!Cy4`x(=Av-;vesv4w>cQ|FAs&bJ}{9t*;01r1f}_O3QZ znMa;84!}0WMQQcB%d?}`>)xwFv}HpfYNVOayWF~LF)Ob4OzI~CnV+A*@rLugQ!-{V z;N=pyc{P`|QC!ieaMe!zp`FFK#sEMVyB0GYuC-$rZwUl2=Gpx1Y$sOJE~?$P&(kyM zH>dH`vu`!qBky%5bbO1#HP+;7K7N)`Zhah005oXLwK?$ay^MMX+kY=(-532-u9GSS zXT45hMg(JneK7S!ABoXLk$Cg8*`JU8bw=`NO+VmXhBLd2NZ;uZRC^ayR5 zChfF0_2Moub&z%N`S5xkD~Q78cEe-Kh>Jn6=g5|KBDJ9RU58E56`(hj7AoVt*N z#(y%~gpiptK^f1q>k4d^so}Cj;|-Wz15PIby3!pjhi>gt?b;NOTt4V%NVTOg zZr45h6nxY{%Gl&FP5myT#i|uebEOd6dayY3fKCN?3p*VP%WFL*2^2EFzgP)8vdFcF zKQpL`^8EJSijme)(F@+>(y9cpE?AI5Gev2h3u?zz%u|sCM0~QTF;ErTB(tgG0N5}B zW+Av7Q?hJ-Xb45Z;LtKW?Wu+&;O2%Utnji74UK=PIy@XjDqpvLW33bF^gh zk+4KqI+*nxi`-&<4wXQ!JQyr^!3BRloGwUsf8?+vBA0mRF04o@+)mj_zpbHzD<9Zn zibga|KqFgb2rN#Eh(xgl0ei?K1@Qlhw2I$PkUKk;^u?G!6VpJ}%7H>BjWb;RJ9tJ8 zD*(yH1-aTO9Ig`v+BvbHuob?)1Js)@wlBKJMWVs?TRo2)C1Em~>ME?g4wl1ftrQ{x zLzF>VYL!1-8{@E377Asm-=bzSF!vDGS_|IYuhDT04-B>6Ue9UPsUmD80+fv}+qXY} zeI==HRF5TrHA#&fWx1ayXtRG#(a1UHfi#2^;3&*o@Oxb8hPxT(Jb7Iz+RXCQe3WLj z+~xu|zbg85{l%8dGnQGk@GL*;g*y?~9Re_5OZlP^_Xbx#&olCorb99!ws#YRGt*7v zj8)-vT*Y;Ku*ki(-yCCi0GsG_gNER-C8jN%F0jFniVso4A)p9Nh1itiz_1ux;4vZ_tS2;B1R&l z+=@1S-=MdHuM@7}hpmi{)lf+OPg8UBDu%>NaZ;JPhn5$SC`+Wjy_pkrjh%1D7hIMz z%jd^VX*>jM?t6rG+MKJeul!f2nSm~s!UcvMDHW1@Dc!DL(ch@^tY3Gij3LrY2~n3V zCZBO&7+KMAwFWOGfN`CLR-F}Y6JaX0P(!*i|3`7H>RE_8JB|cVUBSC^4{30dk*3Rp zZc#(S?_k?aA&4bwaWUuRYnlPzZmxysR(ih^fUM;rhUyts&n81KJXZnnOZ|8z@MW|f@Je@F7ohoY03ia_O^pbq zXGqjYm{~_jwCFL&y&pS*jg(Me2nJ1dgR~-CZFB9Y$3P$E*(X?{b82j4aEB5C0on$& zf_QrA1|v7nhi5CP8mg>kZ1PmtGgNn##Gd(&kZt%!)F}>xto81-$SiD(JgZn|E^t55 zR!K-j&mNy0K=+a62iyynJHJ(IXlS)5X$tiD- zEJZJ4;bSRT4MJ2Y`YASUUAn8w?XiFRQzGwY>j5r|J6Yn*D@24hVHkrfRRMTL#_`YP z$EE0|2`o(=V%!2|i+DYZ+uPhSIHLBNe+j;!eU`se0L2HSHG&;%0`uk(Y_<)FsXs5n z!w0}5;Rzi!ug0&t9`VNaU9?m5#W5-D6(>dR9mHp(qTl1HEF#kzCm2fKP}te<-RpHJ z;h5AaS|%q27SUS*ZLE>g0_1VTU!@ETgF9^vKoIe&6YP$8zHC(b>C}NM{Mlh_{ojC- z>W^lb&nl$_A%7xQ(@FXkLf`!F;eEvBR*wUR>C3uUAOmz%#Lc?@=jhJ!sY>Ajbm$AW zUm^0cIb4pK``G>1kDL#RkHHDTAi2gytGviX6_exv$-pp>9 zsK%p9Q6KI!SqjE9xov&DY3>v&XFnjO(HOsK{FR569l(8Ko*(O|QuBB!#YYF2%Q5Uc zcO2{Uwdas_ef`BFW8spSB>O~_0z;K1cS|lP1Z(5N_0!0`!oAn!+@El8AUX>R{dDu$ zu31D@*=EhinDeT2)9xNuYNu@_PbGt)>Tc)eq5&f}LFc)NN@E4|I>(@re`@Lk$l(CG zoOd$saTVV-96#f40`6LslH)%WYp~o)Tf(T zL>X+nEy#7Ki|e<|#dJ%C{(k_NKxe=G_luhk&F*2l00#blI#7t%iK}1-1D$^91Ro>H z@0&O^T0b59xsoAsL zxSeq=h=8Zf>|YoEytqRj!qp6KkY*H}h-NdHr9>F%F7%IG{RGy_lB&sX5b^aJGu*Ej zkpR!`{n4rmLgRLc5m*7+xCk4UY@!1we@7u$*zs^VXC}#k>v{YRz&hO_-{j@Tb{&YG zpjR29nGQ$h50`-8^E?I|lt~+N2>b{$G#^r5cvBJ5;0{nrPNeW^xhl4K*%VbtVz}W1 z?cm^TBFGqUzTX6{DF%p9l67}jo&#vP0R0xJNY)GF&42Ju?pC^BgReXRf5UVFe-?X5 zaR*JB=v^pRgwX*0HZFA9NpXt^cTMY1dJS+0cjeg09$=!9uoK$VBN{;Sa!M89nHb9n z`8pRsL($-G2A+F~6n?UNS&_@R=4tZXV~ie?5k)&)^PcyRDxQ&)ciW1nrc+2D(r%CS z`cXkj({UR8lqI};+O^g&8AkF5DsUwLxH+wE(y#%Q7I+9J$e9Th1dF4+dQHe*!~t8f zxr=QP&{_^T_xg92yrTn6f4R-K5OcuVt9ns??k?2Xk6l<+Pu82dw{Y+6VwDGAPC+nv z0JoHJ$8;aofaS1@a{y!gigP?Qx=6Qf0rub9y4q||^>FPWAm&zCq86ky5weSnn3~44 zT!9vJn;`92zzy@7c)GQQJf4r0B`!$_{D#WYHU(CB!tw!-?sWY7f1lpIjR9gd!VID? zRY`$9l!65EMcKHepD7p7c#}Z}+EM$?h5z?4d(wpVF6ML-$l}lxie;YTuO&fJnoTSnmH)}0AyMHb=8wa}!Q3(G_4piCYV#>f%p--uW zA{jF$)q?k`bCy~VN7&oq6WUL1{o4^z6(y=q)|Tgx>NO1+0rdtAOv!s$<10XV1y4o= zv6#55ac}kLq{}i!6lY`UhWZ6|rcTr{3oz3oqNb^Y-1mg6f0fAgWDURvvQC4nVR?dq z07RP83^e?-3t+wHI$zdPc?o2;R1D%h*8Y*S1PX+n{CJoFX$<(ZJO(Kn1w^2&3~A#> za1zejW1LXVaUok*Ie3uVZ=Z5qlnU#UJ@i;bB!?;g3m^BfOahm8=q^|~a%A`(92v%L zk%EhIIVzINf4Hs1ao2;3kf8Z7G9h%BJ|Z7sI_+tlPU=%-&fxkGl#TFsm%Qh9RBN$z z<`Z=x);~8_H?HypGfMl4@sI#We@D3&Vt2g>%z~^Gc!u$ojS_)3$b0OvK$exbtRt_t z=(2WgQGRsm3-{w11|SEPVFv`U;BsBz*4({>MXYP=fA0o6FFg1f z6w&j#utmzcXQFXT1hs8*A2B%yi1S#zW78;$(VhgfKKH_Okc%YrY3x!sU<*h5`iy9* z`jcA@f9V@0i)ih+D;SppNXxuIjdD6cA)@fTFm7`KE=1Bo)$E@ZpS<{JQo5xs3B=D< z7x1am1$+sMKOmRlW(uK!cE0L%{+F_@o+C^b5Xdt+U^?{}9s>bU>*A0=_Tc-5+P>{# z&D7a$U}yuir@u&<=PQ4g7K4zG-u;A&mPK1Ee>UJ5R##rysV2(oMbM|s4xwl|%@M5L zSzqpWhFGKjlkYLY8ieA}T3LSSdq{(J(oNS(nrNXgD8i}EhKvQTE2XktS9`B((utTW z1>_?qiZiY0$SuL`o9)7ec%6EEhBcQ+z{5WKVac7dfuZLvP1$}p83+L)T1a>#4T=m; zf6i>+q0cSgWmRnp@KLtDvESh8pZ(EwchaRLbjo{4ERWCdUf|^*rxy@NF(Q7A^8(%w z21^Kw!>@BGn@wfAMhBQ7izizCF{lMZMQZdI^)tGmGjb)7ndDnnPT1Vo7oT2gRp}fS z4bt((4Pw^}+<+RzuYGmlqAOjI6IRN|e-5h?=oohoP5#R+w>fa@4xniLncmUihfUsu zbCmQ`AjaH-{g;Bd^Z@!V3ct)qrmI@Y!r9c>)PcVQf7{N!c2Y+(q=lU~sRNIc^=*i6y=TKHU_Be9W6$Ph z_MP{L_BgrCLZZdnyW6X~SW6F6raltb5*RRJ2`oYh4DWpj9Ie4A=^GUBwl$^ZR9Op; zN+0i8(>{52i4%}E8dUkFz9M?uUS5=42g)RkYe)IIC_aIcpbn?nf!vIne;TH%Z}Dxv zMGl``atROnQ>18@Mi3?Sajt5foo*ILbAqb_DE;^i$sErB2c1;l;bMEdd1q{+7TFLQ zwb5%rvXa_9*(i06GhAllv5FMk0E$cJPI1jqG0})IDG}<#h-H9hnyZ6J@7)9xHtxQ3 zxot;RIjEt;|Uu|=~)9c%}?-kuh|B~jmBx(jnkAo z9H+tBp05zYahmcagp%DjO|#%kf{^TyvKL?&ox!2PcYHF)sQG>mCEZ1wy=j_0F--&C zB(?gQVH);rRi^RZBZ#8jOH(F7fc_1HVY!pho)ZH!F*%drQ4<3(F*%drU?_jRSZ$Bn zHWL26ze31;k&87~eA7#U6!2~nv_-b*UEBkTGzhe|9ILTKpCo7F{Q8^Wkh0~~uD40= z00R<-L(apQ;piD(PR}l0sx;u7Wm=11x(E^hKf$6n3#RknZ73wmM(?ISU%ZUPp`J{b zjDv`jW=peLn>p&8y_lZ;=Zt^DOcd~dYsq*_TZ%XhX6v)J@1kH1lRpO$lUW+vTGe$R zS)AdrRq*EQpJ$hdtZ$L)n5A0w;e9IVc9yq2K5T!)Gaba4Vwuc( zj(gv1^13MiqR`=YUg*y@7BPq~E@-+g+HGAmG`OP2b9%g;(DNBRF5lsC0MeKPRP9Xu z5$VXvdCF3e^(VcNvf6Chr$fsJ5l_xXproU2eQP%Kvd-JO{OpDF+m+~KyI4G>XSH1yHDwA8(Q~lvpYY_)O$&NDzvtEb!qm?BPE@-S zG`sb>0GP9L3kQ;btJq;m`_AY0o3BhYMhNWNFbsLbTaTReP2RReZEr*{?!i5Z)6A^b zaC0b5S2VDTh7xR#``M#o?}e-Vjp)KLq<`)*;NCff;Xl9k5)6MH>?xRDQMMOv!|>{JO2-CP@*Rrg%zKEzai`>6QsXVA|Y22@FaCikZ z&{q(unLYDd3zjME_d6~x�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�Z9Dh5(~`@M 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 JH3N0`dx0$nap&VO>^2)0l_n zf8rvIx+kasH*23D`t;qmJN}jiHsAE<&-q3rB=>WJAqKt_;m| zJBO?a$|F#yDB@g}4}BWa-pmBm5;0X~Epl8oseuP!acmFmgv>mC=5%Rwbi-RX_ebU# z78fizA2HZUwH)hYqQxGkNe~>t-%9)x@h0U)+PeO4xZcF4FW<+tp)-LSDarcelDs?J z(Y7V&VStxZwEZ548YwXeA`8A0Ijkf^|PYf zc&D|=(IPw4Z_*UME1);WX?2+&q@C)o_yZPwY1!@2+MEVQ(`vT|pJ-J~jS!B$a63fz zb^Y5u!UryzT|l?3oNuHEjFcnL+QllaTppk{^6D_&>4^MF5PNSsKrRksaf z9H0XE9>rs|+%M)I5!`Ya$*h1>ZolY27=U=U+`!jEy#?%F^H%(%Id23(iRUT@zk-L_ zusAj8#)Y{?o=1>v^T-yYPyuS)Qg?s#kgnhbuBLRs>^cNhT6|9p-h2%K#6@w$dd99I zJ~uI|mu<_73h?X`{6GKNr;!&Zme|hGVn9gvT>PQ}JrphunpBN`ht~M{-C>asbMy$L zW3^!;#NQuSH7RG$TwYSuUfFR@V>Z2(N~Rn5fZa7DFEUKtT-1jtAMKL+LpwhycT0I7 zE?XfJ#ZVQY>dqauPG}g*l2iUHO*BU9F?UBav@qd!)|k4`))1Tb;}R`i`?dXsEr82# zij)+j0qK5M4EZ1~U+0JLGR6D!{P?js(>woxAx(sbD$IHb*;FHMW!J=#GYXp^q=F`O zmF2CH-f&f-qt;+Y3_dwPp8noyB9Su8Oz)#bZD3Q@k%6K*`CpeS{4va`&VfOG^nLcw zQGX?A_26G`A3Rf^^tPCrd!_O_CBU264%Jel*Ll4N;THb!_RCpR)VJT<*GE3R5K<|o z`iJq+qyA~L1;nRQrKv2|x{R~+ zd{euXaT6Mfe|k?z`y!klVspv!_64ZY?t>u8R6GFu(VdW(KA+EpeMg;V+bX`swSB9g zXeq0%{0-EAkJ^J`P%vNDmZlb2Fi1#N)ADZ>_qNE@8?H%o#1nvs_yjJM>I-X>xP&8nP^;k$&(U4N7a3m~NNGXQ1s86N#5?-Nfk#VFCr_ z;1Ac|``t%uT>O2g({QFM{N$(u=pQA4NTQdXbH)6kZ&mz$)wGh4z$kzVr*Ap=ic{c zaz-||tIjC!ok%KA(nTjzM*+FZWxNxC6b7DoY?sTO^$oqOyDegys~Z-8>=0aczcbxE zQEtC?hvS0TiSL!9hjsiA>3gQVbs_h?y}j?(*<3kuP4s|a!HsCp7^?V<#&+*tq71&n zI8GTj?HT@#f)O}l2#`3y!^T#Z!Hs^GvJWF3Fow*5EScbUaoj1@&aoagzvdQp9J$n2MHZ!a|qTM)@p|Js*cz4uZfK@)bo!+k`tcxiJH6RooOT`n3z{bp- zPR^vkDCVN6GCuNMtnja~<^nk0ffnjKKvg?4oV9E=)#}FR9-?t?k-h0khuX0#MUy0& z6j~~G7$vI{KiUgG8=X!8T`y&r%&d+yDWP)0aJs146hs&Q83C@8n?eqcy>64WYG^RpBq^@%9|Ui z%jh`+m3VaZC4xa{0(|U&eaHgtZz(MdRL@S4wjqSTTR#nOBX@(P8)|(BJ-_Am_8J5;2vJZ;g2La^bD#HmiH1YlU$*{AQA zE0;-)Ld#G}c-%DGM2_P(he$pYA%RB=ulDuT-%Ba82x|o14fb5TdgDOi( zy&$XSnMlXlV^>xMVM#%~V03G!cAxD$TkPn`zT*Jud^GWQ&;8#D!X7O*{=1wP0l2 zD(;TZfTE{3$leqmowW7upeMH)t|1!@&vVvFY1P$-GU{|ew>Q~yFSZ3*%pB*PXmd!# z=#c{${qnc})Fe$fWLBS>Vp9Lcss4hrk6svzhi$J@-5pBixhl5(y}XuLn=jGB&6DfA z@oF?{9ldJIzxvana_(BE0l7f(LE~n0RSm_gegGoAuuIC^$_7pwJ^}Cb<`gn@f-a1* zOL${7DFZv+5Kk&+m;*WDk^X2iqeUHwqz5z1WATFnJGmmBlJVZS6X#HNcc+3%W zZA=@?3wZsLrCwXs;Z3)o^L6*q_48?C@`P!RPZ7Z->-?BJq50}-kfkz9FiFtIQBn@L zux%?Tl+`F@tQFK6WZ3^J+5u%h(Hv{$)UB?U56s`JU~$Mxq`6fV;mk_LdVBcQq%zNd ze&pbz?t$*E0C4Z#UXD3}$=vn`BAcz~KocjHN*O#9n3zKQ8(E(}qC-`sOIKyg=TDZ# zl+vs~zK#CwHa08MWYeWVIUDa?r5p-SwZ5YU*C3hXv7;ARC2P-xaScYtiAoU_xRgqE z{~LKp81TsljOo}?s?kQm@8+3Na$=qIxn?*{NX=Tmuc|k* zC7bs5fp+NVCD!VRoo=;b<2t-04&QB^J;yF9^jkG6_PkTi<-&Tc@K=dhQ6$Tt2XhDi z@Y{ED@K*n)!A85fkY98A)Y=B&9)PJsdUbIwPjKa*x;y&a^zRx_TP2s3GU~;*AS{|2 z_{yPJwR>XJ^fYi1Ov(zvpA4Grtr{2uZqwdL$I&daxCeZ^jX;%@07nVTn6$9+A0(*C z#ceVo^*quzxfGASk>ovzc8RGKc%O%=v_U3e)sK%-GSz>-w(ym1N=iybTb$1D&hehf z@MYC0<1e5+vRWwh#KD*Y;F7u{FW5g~EVC6SnVXejt|YK2y2sh$oL;ZF({Tb4Vb@CUk znKQG*Q)%81)(l}iV6JsEr(228qZsi0r^Cg0s-%oO{Xi^DIi~fel$M($44{vdHp6vc zxPD~eE~`}JJtxWvamW_hkLvQ+Q{!C+$*65*^NJi6usBieq340f^zfOAiD<5? z%1LuWf^TMMo$yG3N0BPdf@o>83xD^iFpgWs;XO_pfRU>O;hVa~sbG{?*|g=X4ST$3 zJQ#b}Jbm*NJDQF8_*_}P-=j6rM=-P{WZLH22!2LPG&q7A{s)beJy)a-! z;s#6^jb4{hfX5(4vac^C?pK*qMLO`Phw$-W_lBmR^iuK$PZlf2py zU8lj4#u^cnKyo`POz5e$2YQe++Cd$Ovwv*J)A>_!YWpvdakjDg9p!}6-{b?60X>_S zn%r;DTqNe$|2`CIk{}{F2ov*v{*4NNqvw3wdd=5oT;^NO`%HZp)|>b*$XU*Ou~d%R zwG=VUJKnve)w-s+4DmDDz`!4`{+7r=x?63JFXI2u$!T>yn}OOTH>)zF;vz zSMOH6A{f9No#^A*qt}CQJfaPS4Jp8{ONpGkBcjHy-`(-Em9}R_gB;?S44VzWs98mc zA5Jv?{tnAySfx%BS~;qNfw_1&5&U+O0M+9`P*ZtX-fF?~z1jLGu%;JvnEDo3cqRj0 z0W#2RFY}{(<;`-a%=h6LoHj1sEJb8k)gBpm1r7K@f!=xE=F+V;gV5PD=%3?Emc4Ko zgT0O_sM@|n1X5Ypj&)s7B5>>M z8#YVaFA%oIhFcpQmcI~y6Lgw10=D5W!Cf8$7$jR(5KH?5QKiFMrE1=2z zIT)nf#ANe_`MA>_=cw-!H63{63GJcb(eIZ;*%zs>tk{SPwlwc~fvYd2) zT#|7IFxkc-de<;5sVGq&H&yUlVcb`U)FOE(b>ga)L~(SKTE7_nkA zUu-pSZww_eLTxptWn3APa9!u6jF$s?flhM2lYQr^G=_z1)EEKmD_ad;f4C`U;G_8b z8sKCSj5zN!SJ+xE8uyuokY_$(V|v$}qZHtN`!ZB<1lEt(_E+jGnd_}QfcqY6UMPL7 z(9qZvS$22v(jKqsuUiQT%d;XgsuFFC>02?!p&bnFT9FSAh~)*H+QYb^!ZtK?28jY= zPtl%^EUSfrAL0PYDdg3cjMk++A`yEgmq0a}(bzTUz|wW{K~=p3uc-H?f&qb#5Kpy& z9|Q5%;=EWT%?qsk?Lt?et(}2={ypt|qz=OHF(uc#DCfl^K+H7*NiOvwOG=7y@dGjjP>7{Xhvx0F_ zT4eIb2IztFMC?x5X|rCZeZL6e`kBFWcx$rd2P9B=kyNX$Z)X>%ViLKGoM=gCNa-*X ztO3g#J|BQS4IX(1gs4(^2yy@X9o(t)dIj7gtwAi!pSf*EszE5Xg#N=#Jjh)de>q;0 z29{RS0d9D)Opjz_!$wttmZ_DSRv3u zKG!CU9*{=l&B$M*XED4FYH)v43KbGFy)nIF@st1;!<$Fx9Z*Umd$A!S_nPp$efe>< z0tbdR)KqZ4cMCqS8u82C`xZ7`2?5l z#$EL8LzxLJugBs8cUMlM0c*lVI7KCeJV?lUNnK0HvS^#`UwAify*i(6mJ=j-aH-=M zRRaK^PwI7AEC{?LQzzNeM`fP5bPt>OD&I@Bf1I$Win!{d1iPNW;OFv!8>i~G!?FcC zCh<6kiLBGd&C?{@fBCJIi&j&y82-?exzhV`CMuR<^tWXVv++~va_Oe+)4Y!dfKDwU zUQ25Ok-VKI-wm=vb2OTfl2L^1LIp}MDV_i}bWu(pinRRMKHb-u2P6xl`ygJ4;JLkk zd*pQDK0`MN{dJ>btn0vQW6 z)Afw>_jPYsD`cZqn}mXj3|x5*>$UChJtK(UOd&9QILYXyIz)(W(1O%EqJlLPr_BSj z+Y{d={3xxPVBQV*e0f~xc&6|ws~aN1Yg#mAtg&WvKhoX?-h3M(RE{u~dpq=4gb}!~ zr#l7Ejtia9f?)TE8;;k~SNyFkj6s|0<#^&xz{jFuYPIw$idbUubl?UpePD(PY>9nb zDo@2>1h~X6y5D~)s^-D|g_~jyu|@$VZGZ)E8U9@1U30&jy5Z^BPT-2GQp_^TGjWF- z#5CCw<65|4VR4Yf7$vK&T~-cwu+9eB=cWfcX+%FecNIZ`KR1I`;jRcU>p`bM00Cx0-;1{H;;Gz) zpvaf=N_>AJ)69}0ZA`_GL~;lyEPXST4tmnyAcL7~x!!ynTj6BnLhyNkalD4W573$T z_1Zr&wnmQZ$j(Yg#^ZdtWDr1rA^Vaga0-$eyuEa&I>R4@n?PGArofS_g3Ux-Q;DHc z8ykoqLiQapHo5vTW~bprLpulQA4|z6_GM*Jcax?Dbt0DLtOKqN@Zc96 z5h(->0GpZ1a)&Mug>(O`=E9n6PT{k!{KYnYcAK;S`*RX}&(sp>w@eQnqVZr5MocvFZ|_r_}dV_)K-(PZ3PHrE3_ ziNjc3o_gu--p;9C!5JHu7S;5JJyFUigveN3|e_9$4pn zhT!W_{lr|PoTrH-dKiE?%ncoOf;bWr7Uoz(-Jv&GlUnxLF(1HeBsAAjz zWk;El1~>+(FCo9@@hWyOc*Dpm!|Wit$OoVMUC8A^>l`Jl!g=+~A)`uR|Lf3vc8D}Z zUjN`#7QhwedSnC{%KCsE_TT)F*Z-a01!#UGAzbzVr1I;!wOT0=)JkK78r{PqT9U&F z-7HsMz(M(vvJDQq$G{fyLFnT2jp@YSirJf^huq^SOOW+)0yZGQ$IYOy}qwGqfr~it$F7Nr!AL_DvM=`95t8rttI3Q zO&g5?k`q#~h+{BqYjGUkittDN|EPRIN$hziMW7+iVbjru4ful9uXwF#6py2j4A_zO zU-*X-1Bv3D!;TOwjFXnPYm~}a?hB(mzkZ_MSsEthyxTUj_MF=$v6iz3exPPeOK0mL zYyuAohBD7465qPrQ+O?YPI>PCX@*V!kRUPum54jS^vg|RC)q!+3<8NA9mtNI9@-JJ zA#+MUj-$%iY^f8@(IsoFwDwJ;XcwMs8FzSRx8v~dI1Wd@ntu*zbsqMlYD9DO{y+}U zyYFJ6n0K(w@Si!IweUbUNoJp&X?hWV`YOZ);k*7hs@8dq=v z@O7_V4L`>-IP=N3GZ+khhvZA|^JlZL06N`EOc}t}yc$DCs$#)oLXCC5Z_ z9c7mnnHG?}i%^zsR&pot{WFa}4XsNk>y);cqor(dgqWoGsW3BqCo+6N1MA>97n{Gd zfflJy_}q0%ahcRG9JR;0_0k`}Yc(nXrISU8z($4IUC+uWywsJ}#AT7FGP)8cfbswn z1%bsfjGrTeb+OwnEg0Y+zm1aQ9*rp30ClGqJSxN#MFy7NTLa9di}bBD=wIYp0dPo8Wz4BNY!!09wRZws*)dW*X{M+5w?JZ+(UT%JU zm~Q1%fvwj?k#;!SNz2+`oAw+4vO1(f)Pz@ThsBl-j18Xcb{cgz$c!V<)9K2cu&`@^ zcjw`e?@RgTv!N`vBf4J59*lR=dy>Rmff0d-HI-K}Z11A0@`|B?+nFcz=|3%j47U8+ zX!&?DT1#{NNJzijW&%0J%}1Bk({>z<4}%{w&%$jZyG%n{RrD~$%NY&$)|)_*pIu+A zCa%_jj3PL#a0+ysGr+qvyiX?w;nt~xK#`ZprA;Le8*FP@Qs%<=v#7^cQpfN;s}814 z2GANb{?P}2t<2WaaK<@Le+3Rkb7^Ux({w5v z09>0XCj}IwgtsJ$sxMH}W+pG^upVA0LglG;QbB|#pvSdAE%2sRsJdL zaF6=zI5)sED9`SLY^OTEj?Y^dYBPxh)Lr^~gRqsmG;8;fQxRH3bO>DeYd^AUf7`&>UyrLF29Sc(Hla0Z<> ztLGC#Z_m#m0KP{iof$0K1S{KzdlNIOkLNYyC=2#bjn#SEJ|C*%W6?PZs2L>$i2QEH$tH zq+f;v_Lce0WMi*A&yoOC4EF2NV^>z+OyCBysvpW!hyGr7&^zUen^{OS{(s`1@|v08 z(oT5~QNfq8*B(m$2&GvyO-T z)TCm69rnfoz-O$qgf5F~{Sl4gr1#-Bn!W|3*EL<-xhbQ;Ls=$+$XvgV2D~^%a?Ys~ z`(Em=yNiPVPBUJXzTS)145w;2-nb2ZaNo&or_If!Qf1{1%#yg>YT=77w{rSNi1fQI zG{L0-qF`%u5ZsHwB|_T}upSslR^!FMa9>9RMZH@v!0Gn;WDNXhov_maf2H*H?+l}L zUv1i`tx%%c%Dk3%JG2WHh$53AnFD&hA~%|y>-)VTR#*NIEuzAa-M@bWs+8~-P}zU0 zWS9#{9Z!Yg$-jrX6Qn3u4sBKnAy^bf9dKm9*axvXjm(GpFQ=mZ=61pl@vt^B-qjA! zZo}{b0Z_PYQ+o>5!OClH2s9ZkrNWFmOxgf&+nPE@y-*3B`4IafW@HK;W?$v+IG`V+>@^{n@lv$fbiF)qgAwM??h zb+ii0UP}yr@4qG7_MgV_k&uI=Mog6}ITKJS2FQbR@P@6s#8dx974WFw4@;Xr@6ze8 z03vj@n!o3OPLintAU7uyn8;@_CUTh~0s~t;NTprQZUr$Rq4{RNDI<)SY6kTp&ME&% zWDt~2F1UCV@k~uqEID`NS<)OISfd#oPz}np2-5~X=&-j_q1QfomokT8H^{N(AXRs50g<)w zm z_Z7=7T&ph7t1ib45s#b|ll!n{D&B*o_U`e`P!bv76&|OR#p%1w&oF;H#bW=Z>WsOZ zT$uS&?Iyc+(5;miE$>bBUP;sX0=fZdPT~K#>QB$Xk%@nV5+Vp_xr~RwX*|DkuURBi zS|US1EBwxE3-W zc4L+JtJ=ZICIjsk)3YPt-xJwiomYgYt~N^v)Pj}A>o5p5@TtMd6N8w+fKkFfgYYdV zf2@vAwLF1rLQ7Gg4LbwkjXVRZ41oHpfwok1K!-Nh^(FD8w{y)5;nH~a54ACHjJBN< zVADYp8fKKZTDX$fZp!hg=sVI~M`6N?oI)6bT-hqG<@97iWU%!pDf4Mg(*2L%^(c(8 zEn-u=6h)mABIbjt82h_}0bid=DX6>>_^soON#lx}711d)0@LDMfs+)^FB>GW#C1@O zdHwwl(fMTyso|3tR9YV0 zMelBEmo+&K5O*d53QiO)qQ;gc--o1pj#Ta=ojn<6OfQnH)uUOlfDR3HEa&}9LTMTA z=!)u{r=pvRl>)+dG1_vFS)$_7 zD27M0CyNUwvwY6HDk$Rx8TkGSD0Pa9{mmj(UTEN;*dW0&0mRTv99*S35i-nJdEvI| zelK9|7x1`UpZ4x{fEP^=AFG`Ud|Ejffq%9|-*&byKdex{A;#<>X;_rBg`?)1mGX4u z^~SXxqs|cNTYg=n&x>gBR>ngSTvef$o9|0p(;CCBw4kjY7Wy!?{IOR7-KhL!E{$^{ zY!n6vr~dwgY>z3dl9(WGY|?Wj1}4L21(GicHU5X+>(cu>U}-7I{{CE->22Qc1N9Xx zaM_bz-Mg>Qmxi(Qc{3lnP@qJ*8{;lJ9e6!8&Uu!C^AG|GX!53gmk-TIHfY0+%5@a8 zsWem1?6WGBIRu=GI|_DuokH;FrNB}Cv#=l%p@<`vadmdC~Z*&Gz#%eIo06X>GASe*df}w`5JGor9qu%hxDR7iRi~D^h5{WA7Jlw zgSw)*N?*pj=vY&=DA*Y!Y`wFMx^~hLq>X7+ysBme=(I;nu-lU-Mn7G)$x{I)ne&!r{0LHrD3!N$4k43Y(%RrVI6@yIZ*oQRua?6y%lxizlTe1tCqyS?w zeD%mZ!=qq0Bvg)hjRW<<-)B!-ssWQnHa+xMBziJznVJ)cppu$2DM4V1W^gb&$^}QX zA{3+<#hGZPuqRhFZ|Rxp98Hwfe6onZdXRS{XxDT4xbStch1Y#M^5LM6%WfCsL9b7gYyO9tbCMp2_yfa zSK2#x=vEPqTBqT3Z066yd^XoAi4r&T`S^q{Uqdp{dd@`^NP>|Tl9@WJ7qm`&_d--_t0+NZbTNE~ zMtNCoV+?o=E+33mA3bnLmJzn?fC&-hi9*NY-6xDBsU(zOG{Gc(WKc)uQAj;dTM+eU zO+=MAl692mW%`*bIl(J-Xmdb^K`|2g{ASYNTobM=%|jI9X^Ev)`%KaG;2^Xq6#z=&R`ed&Ate$EQ|H!*_XYsE?4w|NOO zd+wRb06@5Uh;H{|-H=FtqvB9z@&QY#`7PgDHB$Ac5fydIte0c(B`+5nudW~ppJb@4 zs|9}N& zk`N*)C>!hlsTyMe3s1MO_{zPm@%eaqKVMgwl87XPR%~zMvr7>xswZGE5m z-t857do-+&Lo`(V&VHQrS= zG4-9-{2u1N9#Aa~J>{Y6Q27f@uhv3974;E04{I0^N~K_5#MDPyxO! znIlWy1XJhs-aEj*t_Y*wNRp06f?{0wAEB|x6cbO9Cn}j^N+JnwuO63^VqiH$AH-d` zLb$CzI@Z=kbaAHLrlfWYyRM|lY+h?(-f5GuwMB$mUi&OBo?U+oGxukauiJmLGSn@n!7EIo(i4raxg2x~j^ZUEksU7k6Scx3KHKWuKTa8%^@)hS}5G=bfnVtM`fm%^mbdmlPP}k?io$%#p_fPRdzpWBH zy5Z=B0#!h@unDRzqXyBX_T}SNDoK==LuFLwvTz(LA1bmd^D~M|A+3x_ zfOM!sVr)5}PokIT^Y9MJoHWQA5la|Y(~>@(z@YCF#$NIdq;D3-mhbFfJBbHOQBYKW zyGb#``_-i1958pxM8HF1tst^;86iO1eWBgJ~ukcsBk5K4i#2p;`zP$>4xi58(TzvmD_$4BH=!jvFc>OHl@j zP+pir6ExwEU~!J85K@+-b#%|4gl3E)lPz?fwK2hnZn!q@P=p>e9MH+AGig#nyG2$H z&rcW}=<=a=3E1>w{xhLfTrK44Yy8Y@xp=^-yOvhtrXxlZ_)#PH6~TwK#N>g2LvR$+ zpi$d|f?2~9_v?{K%sM&+XCY7vGMNNRC88&U7ED6W!cD)y;cmHQYTf>@oi1y? zdlA-rxG%qG2{EpH#Thg_4y&|y1cjU(E~075=gq63>Bv5JGKZF(!XUq!d&c7dbu>WK z#qWOeu$TI-_JFy0?IGb-Lkkx+IoBoC-z4uJH=8Y_wzV^d797M}ROb~*L3(7D`xSQT zSH*we`?KI5+lC^0h;AK{jh^jTjpP2t52>h@7$=BY+N9^A-Rt*s_&ZRBxDLEkfD7x# zxvS@ni9TG(b>#-}lE8M+p5&4%;ITi|7idpt^k8xk1!s>WK(eUJ!7HVW~sE6}WWbC88`&_0(vFoRe0 z9@&&AYw%G3t^gkP!=D|Q*axWRwnssQj}=dfF@W787sL+7Isk=sQ;a$eI!u+ouA`AG zczjr}eu7INCGMqjfxg(MGQWxmDo+k6A zj>*Ui@;koL-p2z$`0H~byNeYT(@<)Nb&f)X=wTLkAfJUBMp_Y@dO@H!KH&Q+z5>Z+QI1-} zK3Z7#Yb($&|7wF-#8b%TZxA!H3TGH8JxdImmCeV?!`O_hjRJ4uF(s&Hk3@WDrK z(=wq%icUz~TQLm_=L4i9#B(PyTdQNPo%G>2*gfs4td^Vi$8IQNB6Z2IX-wBU{Fy1y z8j;GhKG?OA(&BcBr_ErtkE0z3d}c327At_4b^i-#r&PB8(a3@sB9$pl4#68-jlRTb z=8Qmq3R^N(hmN9wi(t;NdcmmGc^)RDUv&&ka1j}w6CMBcfdm8zDxF%4p`#Z=m`!*G z4d9M&hyMUe0U5c|uwe*#-REQNA8m1PfK^~VENqq7;#kuL0n8Lt)SuyO9!k>*Wdhr=$YxKoJ`FdcI-$sp&Ck8FGVE+@repfm*22 z38E7QgVoSA^9Aoa(}NMKvPP#W>V@PfoQ%J&B)|nBE-Mz|oGch#xQzpH8z*w$mMK9h z|KO!S`>7GWNZE8zuXq)yf;1kXB={`bqkAoNe{Bt1-T^vZVh%hY=G;agAx&}yF?|Nr zJRqI{AE{4h}&7U?Ia{VgW*K$1Iso54SF+peJ1xdTxVeN_9;c{EhvoAI)`4p&s^BB!)sL^PQ^hoE z9gR-r1b9C}P{c9_d}DRB6}+~DVh`ghmc(g6lxAI+)+tK$1IcUlF-hglh5{sAMm$QL zqCg)57mF@J6n6AnaBUSr~ES2i)TI>+o?P z#xrZAU^s6e`Bp>rYqy2EN_%6SJO3?lZ*I#^S>^nP@tQ0DX;-6_l>v*-CmUyaAsU@DN#dves#&BG>C-7MVj zy>p`+P2sti;uesgPodFhcOwn)pcqLzFm2UGC{TZR5aZV)h}r!N6kpuVohgcs?aP&m zJ-I+*$;_riWUre)4BBwLPc%0Syp^-nn*oM(=;{A z@*{Sy@vhsO-pL{r#y061nT0){Cc9`nxx*AXv;=9syH3nQ0feD~@v~JDG$5d;(z4w8 z8TczLiWb3wY4RsxuV4+184TuQMkbW^MrWEn z6R&o@KW1rp+r+|ST4$A*M21sQPHw(WW`hye{}sWA(yx8h8V*8g)1^+K^e{MUv3Bu$ z#M*sz%H&?sl#5rXZ@ZKqR<0;RTmZFBcX4|{vK2WJ)d$;>;C+fjzH2pagNp0Ryx#;c z`?$uRrrd-9<5)IA;^M*5zf_D=C1PWQMBviN*dk_nbOwwpy=o+54tRd|wLrge!eo~U zX54`uHo3>LAq|QbbqBISJdvl_DXC(WL+c91&iPAK$0|uR!;8T^$&N0_A+aIFh_aXOg>@bykBR=GOchDIp1SP`ba~= z+~8|UH3vKxukSJ`du@;Z`cynz*$|$Paf;M1d)xPK?TrGc@f`;55Bpko^i8REHMkiV zy5=8{eG*J?vz(5}13gpXG=LivOGaxscV@LGe@5+I%|Xw2zDviI@UUnXq@4ct+}@1C z?9VzoLJAgD`YLPtVkx-!7_H>`CnX?PbpL z+eA_}KuqiA1RRAI(7xQg&JD(_6{_ZCQZ1CtJs<}`%fQX=b@baFUsa^5lWgLsH1;UR z8-z|qVy{47)T*m+<2l58$zBf{*I7C~5WrCuc`+O2Q36~ia@yO1RI?AU$e!>@@(U@K z2=eg%q8@8fz#=Lb3mX&5|Aa_Mew^?CP2I!81e;dtM4QS)*;?(h2}ijF6fcoeHF#f7&zCxTmsTXl8?2sat>coJC<4nI^GmRS_MQ1snbZabnci)27E1`6nj>7ZJ7PGnx{>ij%>& zBYl$@kLnCvT)(WD2J0m=$b%|f-_GWJS0YYUWxFj7htS6UtH^6Wm%G?pOdvtmVQWR` z(5RpHR?3K?o84&Pf%;#G$vwm~W373044SEL>GJXO?Q0fFSahl9Zc0)@k#(@#jX^8IV4mtF<{uEZJeIvqvwdYD2jxe^3 z0tl&ht_n!6GKx)!xI>z2Ri-%mh2Z-8Q^@?ck3gQo^Ain$9^c0xZz@m6-^O~HC$lzV zE1g}7#a(y0$k z2T3l@C-w zN+k~B4A0GvOSl$F(gm`8lE=Hg*AnJ6bi{EdnU)%kvAbUz(w~poOo(pAoYU0F>=6Dt z6UW)l89r`#)C&wCNeu0_8~S3cIf2cAk%ijTrM1r>yX$`{UX&e3feJ}>ixn8Nb@YEnvjSF*Z%Fw4RrF7=BJJ`Ed+UZ zpTnGkq6EiDKn14C>Gc9#joC^!-*}BqDmKj(701I9?85K=|~?@N;Yxl)+bLII?ZjWkko+C4%+ra+oE z!PDo$0x{~h*@IM_CJ2n!IcG(JqG#FEk_fsui*4@@hBHSG5kr8vuHQoi3J5#BT5BtsrcW{Hx4hToFy*Cexy3kQv#M zl1d#55Mnr?As zQ5c4So&NEYj_@v;PfKhuy3NqVW@(qKOj7{l9wj-Elnf06Xmd}04B40`s4~*5Yzna9 zG*kAm3h=Nlq;WDQ;R{QmojiRGU?JB%iwRd-s_1ZMW4YZXnG!~JYdd>}OgJ50L(#`` z=*qK^2#yDQ`r{F4iRKfUdD1_WMgK|Z_^N)s-feip!G#v{HQu8j|+9=lIa;)=rsKck13FMHt^)^&8 zf_jC)aS_$sY;+!8xR=TMk>(&$d<EW?}Oo;n>-nfmJB7<3OLU3M4u|gb400YhF=DW9cH6%+z z{uKQEdHdt%y3Xc@#zfF^Bgq;-gPRU!;}VoB$U*k%32(_;v3;;V>^y>hA~fX;ZL67v zlf5Tggo{diE>~IL=;VSmK}Na{6a-EXy#Ft~SZyZ%xQhraU;ye^MvNv}E`d=(%`%;J zp^Q8S7jk}iJ`wP3m=Gl<3FqJ)<@(iduE=QgSr<{ zeSJRI$#h_P6)=jIMGAx9Z?oKSf}tmsS?W;UKE1?X|LF!3|2QLKT+B)B4=(k}IMsq) zu8SW?*zt@Q=S7*6K28J-dGJ3o%sZ2Dk}-Y2X)53Txfzue!p7r;{RCJ0n?7i+ekroX z#0@ewXvW~7rH%m@;Gh|pTYZ5g-&lIJH9#&k%!9C3B8nF<4jjT65z0aa1%xr9t;WmI zu^v#+MVp|8RreXP4;YbZiSJ|Xy~|L3g)$U4yd@;5*F?){JH`We@fHj6xp~fSRo~DL z8F9r4@(Sbjyd`<($pYqgUy1nM`Eh9j2Qmvtp_&M&pP}LLGJ@Le}Szb`qBDmeSwTcMMCbL;++C28D1g-|Gus1 zMq7RJsUNU}!tBqQ9O9|M-f+rLN#q*snkM)z(=y4uA9x($*5}kUr83KT5!nD0v>Z(vV+7L+V#~bNSk^#@$c;#&**yAEv&Np5l%Wl6 zf&dI1eyk7cHtK7GRLz#J=P=8&ZrDPuzzUWv&>^Jg%lVA&HoT@S@~aKpa^Y2vG3<2jlNsN@t)aR!yP`k85>q_KJzF#D-Qh5 z1#FH@alw>ss$H}At}RKyuxh`qW`D1K*#N?bmBDCG4~EmZ-YYxwBd-%O7T|H&RiC9F z5Pmeo8>P=>;PR7k|<|mcooOL zv8KgS1$KpTZx@H%FK{A7nT|*X`5hz#zr9E9=hK6z_7by2ST*LA!>L>h4Kj7nPJkS_ zWGZB53`$syPI}wRHivE_701#Rv!uqsi+4`UDNCT{&6}_)9iawpM}aHng7B)k%peU} zr`C!8R&IxCeXyz9_M{oF%?zlzFz(Y855yX#BlaVP}6 zf)>?!kdgcmHDzEDh4|Q~hAN6w@tz*A!ju`dgXp~z7ua{QoJZ|}yrb&HA?{f};kw{*YbrsP7 zq%Bf<+u@`ePu^^6*mEUDdcem)npS%o+jxAQr1JRE4%eW&S|S+u zX+ZEnhyTv03e1B1vD#QFZy7mA9TM0I;-gLswU*EE&jy6K(GsbRuR&eq7Q@Mt&ZkSv zcl8Ahqx2osNM#br-{=O4lda~u%{)q%0G2CMATjIy@@#bUNw$LPXyi;FSm;OmNbA>_0 zMD6BzbkzKjgXU`XX?HY!-k{613%xzV6#2OfbJl)+a|ZNS$pSg}2+KuW?=*w(jL-AvE zDVbF(3-A3poibHcU6p+Y;38btN9X;=pMKymty-)sEvQXbVr_xE@&>2gEB>`Gyn)=} z@_99~tkLFQjLPVwawU%TT>wSP^VP5n!@9SW*6<1r|4DpPs?Magz-RHu-J(lCApI3799QLvoa@iaz~ zu^XbQkN2pPbO-&qpW=u+>aD1^n-uEUq(BD6hxo4+7}k-7>YZVk{Ywd4w(?)CpfxkMC2V} zG($Cs0`DCtl3IQ`?+12vlbs?(4D6fSZq=nro(_B$(zmz6T?fb(+$3FyGAJi=l;;R# zQ#+QTbv&Q|KsA_FBa1l5B~wrcU2sO!j{7ZU4};JU@)rNtxT1sk=~5hoZ;M8ne(`xy z@6in8+jl#zrhOOIYDu_yti`d`x(bYx3ATl2W~5j*xV1kx)x@wHpe5U0siD{mv3Jl# zJSW+n_F0hy2sQ@tv5_A93@5qP6}!zlfAK3Eao-UEZZB5&rgEl@Q%@%~jOK(z+FwID zZ)Y;SYE;hq=Q2B0ah4ub!C|zP7eGxTq3AyF%@_PT#(I~ze|c91Rw ziZ0XaAO)bV7Bf_OC0aVDL7y7!xl}OJcbQ8L`u%k3%B1)3 zzzw_s&fyyA>U!?Qa+Xe=rxnuMzXuPnb;ZW#3P%n)=r3QxZ38LC_~wK7bx9XxSM^?_ znuio)S-0-1Y1zYBkwM*oBdo-ELs98sK!~Y&2DedtDZ3h!TsCkDkmezvF-j=zYw~^? zZSvz9sfOsc`4ZF!^ym`#Q(8HXR|amq2*>hm}Cu)=fDVk(`%G!Q{Ui8tFQH0khD5K#h1#MBZ0YocWGtitPFQ+x2oqBO5xppbU46bbgtgFQoW~BAR8GAl z#~u>~eKtto)WuuX$PoK$5FNM|Bt+Zar%opoYsPt>dn@?nGm=p_k`KDY#4xpWnkO_N;kxMF9bh}7RN&Pw)uGE6U5##8BQFo_EJ_pt){$vRT#dz(=T{ zAM0IPMBdFHaxm-FbCm|if(MixU&~jZ1$16wmKcD-@B>?f6{=I%;OYXvU=4+&1qu3B zFu#~szenKrFb3G@DaeLk_d%vXVXA-Gq;A@g4Nr8b>+(J899)%+Y8H)$qtHw=(<+P- z!x;nJ=aH46j|JH|Y%qU})zwMOptP`WO5`(OmHC6{)p$FUv`p+P=6H^hDT2R4e)aj4 zS0=*siz?~s-*ZV6P4hf}7Re;!u*lo2Ajo9*I7$^`P{Qt*oW-&S-3_Va>=)Bv0%5*^ zVzSKb@jc@>6AK$Mm&9zJshfNBW33+*$3TzyB+d9JkkP*C?o-%~C+qo;q+IE|A!#I0 zVHz`)t6*9rXbeA4N6k*etDu_WpA|uXiPKZ|;Y@Kf=+S?RYDj|=gycQ~lD!tL# zJ5v^)oPkBp2_PqD@NC9*5P?j-x%5y8Y|fR?>ud9F8xB?gPkSUtqPFjf?`AieO(C+Z z%1~-nV`VuNvx%*eyXKpl!d%Q#r2uzlrjPu=Md*|UH`~0>(8pup?#OT4{s|X&>*&UY zGa<-ojv#wX^udg%Tq}zsB$n&vbz2gG_}KyrzA&pbg31C2cEWN2*<~NCWb6JbTn7{RKCS}D=h!(T_k;!9F{X#P;PX=>CaTMw4 z=R8o4*Rh9zm%W-W_&yKi!f_xL^}C(TwJ-k=^6Cd5jTkf>qUn0_Qb0PxT0;qhVW$IE znxBT8aag#52mkKwD#!TJ?j0AEB2kgtZpMKy8<^Q6@Gw3M!LV+D0Pf&U+V}ju{l5G5 zsOucL`hN816PQ|mb_3Wp`YU`MKWnHkm~!1?f4K9d`y(ao)9Ghhnx$bO;+(Qr@nZQs zb#Dgn#e3PUSeE1%tOmjxPkVYenu0s-(qImm&B@V7*v9_bZd>aeRlB*9T#M~r%r*uJ zCU-NViCunJT@-#J$D10TeDfJ+kO!CtAXbtLwmYg0yKG5)AX>oBq98}mUrA7SIpRYl zDPziNaTNlnx6Uj>y{F;{*?lvJ=~UfgteycT%t+<(w^_kxrgxv`8rd%k}L@t2X;`C{_emKtq=#LH{u6RX(667g)8dl0=p#$p3 zdNB!VioiQxjh^}|kY|FS!nol|0z2Yyg(jz+7Wz`b0%N5FQu2iw)%t+=$!sXi-jYPi z?RK>2anWTVC5+tPr!(|m{gV&f<4_sMMJzSg9+Yq(Tn# zYNVh)@<733GDzQdYql>FCgmVZ-~b)@Sd;5t&K|?P2i{gqMDmz2 z9<=<8;}J&|pqZucjSvy}_(eye;t*96x1n97SGvc3(0 z{CAEw%T(W}U=1!J+-D{1z6TL^SR8>vEIwp|>VQ>E$bZGij|1TVli-?Knf1+P}d@zi1X7(1YmPE{4 zZ2uDgqXAsU@30~L`UAwlP^K`Bo>>)ye7W>h3Wcim1yieJJet>qIJlE+4FLSC1iaZd zrMJ5;LQ;vw@wZ-He9z7Oyn@`{($!K>X}F}t&vvHdzDbX4@pGJu%NtD1-tIromx@e$ znPptEsgYdrpVfQECCP;Iia!F#LZ^ulA!u~Tod6TcWjgJ9g*<`dMFJ0(UYA{FPs?4BWYs0YbHy7V00B z^QMa^J?@lTixlyo=A2-G0ZL?Dmg*&{#GK3>r2gl0^?n()`J>xDEkyNgLqzt=+uj(Bq+`gIpwmr35Y5}dlA+I3!S(#q5Oj}U0L zF}dBpG#-Qy>D_`^s{FxZh*XCdkuuIIwx)6`mH6)MWz0mE}|wk_nP&u zx?dP7n)pycp;!YAKjI758W^&$>noAY6iMP)(#k8{kpb3h z%QV42sdSiGX#aYw*IxWVqhr|~Egbnar{^X11JuX9%B&%>mVd;59n#DPKhGPUc~_7r z{RFKT8K8FhN(t)-6|0N?4Z{BhZ3wA?{fShgW>XlXe2b7EzF@n#5DX)7zsrSqlxdnN z<76X5uXZrsLXVfXt*N&mUr+E<$OS}xdQ%Wkc8HlWbW)(O=E8LHe2?hbrI@d6bx*8L zOl`!3V8|=?`)M$gS%XvS5td%HZFdxd*gJP7;EV+G{M|+u)#%ld+3}i^D~o?_)5#S< zskwFsAHQ~6)g_u7YGh>iM^##u#}m4~sn7{)m)S%^_5FT(C$6J$4bESHbP90J*%&J1 zp!jLl?S>IT2}=)ks3m?9sw}Js`WwjBh9o1h?zWVg{k?UalaxNDubPIN9^t5WZOn<> zX~v=$k7C?NuvO<=H`AI999zj6e{-56&27K58B}PVC56q*SG@0_NWeFc76cN(U0XXL z*FMY?M-KcOo^(*5^NHEwssm7a>3hynum)Kp$o#AgB{tx0h;(zl_i~7=7|=E#KTyMk z5^2<>D_EhT_I-eceW@9fkdW?q8&-JMVjk8HrS@Bl%{1TiM51P9sy|ha*Os~o&l;|H z4b0VaRhCm)y$%=^bSagPixRw27~Q9L(#IMf#K<~SNpOi`<5tz3&jpC+C;Usu(1n~5 z>@u*q+eI8{HUJcik#Q8BhFIPN_2ONiy(wM$-A`O&LW zO>)%Z)8=cGod-dqwovx))&xG|`CfmggnSA@jXzqzMx4?%!y9R(K2ur7SCS`~WOF?7`nd%JrQ@sH(Q!^De za0&uw1!5N|FV3JqNXQAkWMAc8nrw2!APrmZ^9wa9U@o26!%M%n7(=KcA=m`VZo;av z5ubXsLtvs_7yyLRYT=V1qhkg-0_W4vFc{toUMww3VEdsgI>ZvoK;n&G>PJ;9w{0}a zvhMxgF3SVwoE0Z^nMPc~8LwTQg zMbcZA_oaqp_n7-|SQ?AFp&`lw$k4iN?|vI|mhN~MQ~>w#hvp@LpPJ@5{fKr%2FyTd zxVO~HFbl%O2S|Ig1kdjU=~3Rp`!19iXe11GqUqxCc|U%|`q;vwYIwTKkxT7nA>3 zd3DdtGe%eMRK3$CDZgyZ#HZVIcwFQi1eF;yn`AOH!SO)GZ4P0Yn&lvijHR2foqUR*VlbL#;G=SVxSkx` z2SB3jNdUuB73cDlQWx?eG<^(SYN5#;kb*@&kRjCZE_w|_$~bCa`|`YdKD5c64&a$3 z4aiwRF;!f}C@j~6?s{ib?kg;t;M2&^J-R!%nn(W6-gujSR;03Cg{>$mxT^~U_K*WVqmsK#tc6{&9Eq6`M z_RN&ucId{8(IH?OL|Kas%T|*)Se$*2)btU=T4@Fd@v@@a*34yZ7Uj4~TH?7#0h+1CKi?r*u#?tYo*okaW1CC26CDf9rloiNo zDfZ}8xv+clj;g)SE^e!=V&5?J=$xN{vi`NWX`-v!W#h&R#w7YXl zYo<)WKGkl6mfw){W7!tXy|eT_`zcZp2}95fM6W8L`Oh`Cj-*2-CeOq9_xsyiqVBF8 zKtRI_XRYGuCSyDf8g6De!R@Ne6ty!h`s=XW13&`Pf80cGRy+05#?b6(0A)mAN*O5D z@po_Hsj1b{_IKy^L^h_cx%D+@>eHKE*EFHniq#r_ZB^NJx?eKu`8Ky*nl$xN)^;A{ z`$w#_wl!`X!}DsV-dnu2Gp9EgJ{!JUTxN@D9)wQ+0Jp85l-=#sw~uqWAGI}=->DQP zjbP|^s(Z@E`c)`ihkLgA141-(Bll<(A0@}RNE_GUAq!A`S%3s`m-xX$PNxSNe65HO zRDMi}(ir2!U_x9GQ3$0(lP#8%2t_}DnX z*w{t2)V#E_y`yX) zK%(W?P@W(Jj_X1DlzB{wo|B5P*c7(Jqt3#AjKHsqp2Ddv##yYf?bM4PmxY^_Q&V(* zg~z@*_>G`^ZuV6R1GGs}K-z#M>Ju7IUflFr=-pG^54$e7+EgIWxq$!H(mjr+?m~rF ztTJdwO&ZBEKNO)-=B>F!Z8`M*SYN;$zds^yI<^xEAVmjcwsXof!5l8P+{6D z%{}6%%7GW0@a^yynQz})CpRq&v=4KrJ22WuaC|(BtQU(Ty%=Z=gi6B9)!+g^?E;Mt z2nfwzTRdMr07$BiXS{dbK7vSiX+R+6Ubp=E3qVbKmg#GCVBfZ~`SsuFNC|r)`;(2D z;TuiHgo7wIq?$FKQ(^gUCd?)bhE@FsBi#q4GMTZ)*+ORjJ$T&Yg zUGs{nG@YjA+UDrB3;+X*MV>gCb1}}xJf9t1ytJ#3#UNLsDKgY0#S9Zts%@Vb=k>^= z8~uIX9Yw6~5B-RBBOw)`WTWe1(C9e35X6-1$7cq-%b=z)*+-}>B_D5*HJ>hSd$45= zpCCe$4`rRKG3rqSSw?S9o&3A#mvl&|ezcMUg0CE_akJC=xdU-AAr7HPd(7(w5aiRy zsOtLBXOyyO%6ErC2ZfTFk)@HWgDFg~l_g$s@7L;!>){O7*H*ZnI{%Gx0jUf;5XE~$lgjJDX7FK@~wcf4xWV{;Xn#d?E*mED=$z9 zQLln383hZBhEZ#pK$Od{l=&bZb_s3u@KitgYK`u!uxM2EUs|Lny1u70Q6pl#eM4op zp#J-zE@yo@#i0gk3_GlET0TP~tQEle_ZzhHv$vbpnCgDWxK7C@%w=zM%Rb)-_K!7x zdpMQjZ(py0{+byx?6iJvyuQa>)gRe)xNQF|U)+1;Tu5P8gIAgqF?8!$LCFl3 zkT`un8qwGmb!!Z86!{9=jU5q^l0v!xB05^n*`t=)I2}9?2Bv)UEK+Q9p8fq3>N%{T zho*+XP;15C{|c}JOC3SlIdTJC-1>+@ju{e*zba8AFS|cS11-J8wxn6IG#rk|0#D z>+!0HoZ1f?MslQhz-t0*oG{UxbX=pEE`>P}wtTTA{j^ZjGCgu_svI$AEF022F%w;S zI49|mrg%@H%Lt^DmQ;pXxMY$ovz7G z5^zY6b2yVg83$W;Q}CRh3A}mjc4`oB4$h(`8-+pDT!a?B5@9glBH;1pWijWzw%u~H z@xI2WmtD9)65D(qJY!_BDBI^KGw6GJGx27ia$znC={_d>A z?7>i0VMK{<7@v!yk1zQ7=^6f&)6@!(2f$P#%YaJqtSnTQ|TEE58y78pr(M0o$*^U>=_>ne$S%lF|M{^x0@pV zPDGWOZW|;Zk>i3-$m?wAgPF(e;ciL}in+Tr9dDZJv=M(Ez?lBXoeDsx zQ?wM|&U#TxxHCGqM={_^DsSgnnzt(DgA$B5Z=N9YHDuR3KI^ut@Rgil^C1^ZpKsQ5 zItY-^@wacr*BX7svCLn$m&ET=yi1!b)EPs(PGdF)_HV?zOe3aGd(7y@Ij4wI$0kE~ zWf`}w2!$ggh^g8=}?s_uHNqY}55l*s4DtT0f;{>GAwi6Yc} zKZ8zmhweIxHAb%SYar2dx#DLIm>V?@#Y)1jyYg76GPfpV;+;qdr+fPKJTIrwe}iUY z3-ICpOabQu?{QL`H7+Pg3jPCK`&@JVpT7>~|E8UDurU4K^0Zz}o&ShFn*Uop5>G*L zbjF!_I)aZ>IK)O82G$jy+i1arTiJ>Mm@>5TwIX&!OZ7d(6AmMXg9uZ1dF}`O}xD zt`*K7a@MVcM?m-{;WDdua7c+VnKH1f)X=gah>QwFZc=^}4P$pFfg+m5Ve`D1B*y&1 zb^rt_n}U~(;VGd@cTdeUiAT0U&$ie1X;=ECEM zg+H0Z5H3auuh^mqAwR{DBF89->5w$m!2yFA8QF7DC*DV*-lCY16r!2U5cn8cSq6f} zT#OmxWP0%nku77Gq(f0G3yikg4I2uj^j!5m3Zo975@u!*#79ElAA|(uw%3K|J~bC2nKFTfmvM7%=$XsJ_h@Ut>m726UIdVZH9#oAOE?*$s1Xm5Q-kJjFo< z*x*QR69g|P8U{+JI^R!P7t-D@O83^{Y_G#e=lQy^eyO68<e==8F@D`x zG>tADF}|ew z-oDThRx7C#x=W=&Ky_S@4~*@Z{m(q=zK2n*{}+( zbLj24#~Mt`I5seoeDG{3K;o$i0fMewxSWO#!Ivgzv*C?arRjsGMGm3DEhXWJ|Ot+w~EmFsDM25PqyCo3Y_QbhIU%t zVQu%%x7?7Ku{7R$bqZm99QzFdOxxjOQY}LBJNSR9F8#EOme)K8^p3MZ0Uc_6V)BXn zG-p+`{yUu1v0`#Eu_*mHA=2Du%Pt02xO zc-kEre#ifU&o(+Thv12T>YB%nz>}wI?EYCPwPN&5C@pFHJAbQH46l==xiVY9RKCKB z_IVeQWt>hK9S@Dgi6BYm2OJ=wcW2m>QwGX6{#6(pGo`EYV%aj!V|z&`qjm1%8-<3VlbI@NpfZP{ErZSr`<&V7LnSkHCHyy9E&M@Co@Bz`GSh zCQaz^80Ej=MEFyE`0H4U3)JhYy@1I5O35TVf~X7RK?|=WGD8vp4y?Fe&b+ri1OO&x z0S5Vhja&}q{~z&Aj$Z-?W9DZ0A0w9hNl@^uP7{_XN7KrfUvqPNGJ!Cr=MPf_r~SetvE)|G7*_sHl*Fy~$8a zmG@#O$V88(2L->th>V=v9v**$V^AIp5)97`B)=(bahHel$-#3_klqbafJwg0CD|7z@@x zh8ZQ1sYj7v8K=zo#-L@iM|v7C)Z%UAouX;Qq$F4IcU$*6PqFMFTg|+nhbcunw?jJm z6fLEw(4frwzo(I1&Qxpsum9M?57R7_5_Z|cEmKp^d(&%2?XuOYKWiXH6BqG@jT{bo zPm4W|(=4@)opMY_5eZ;2i-#bO65t@!wG9~}q>03sfP(zrx-8H-0{a61SOX6k#R(gv z9!Xpct`&cik%D)$>riJ0>z#4ClCP8)M%tBeN>$>32)yn|y-D4VA%V=OoFGe%`~1M( znie}e(k+|a9MA$e)GU+LMl)0AMA&0)yXZ(3Tw(E5GxOXe6zp z*v|8nU*~RS+h_UIaZRtCzuThvcVcWm7@_cFu`ahi*Gkxi%nIzBFbL$o(>W|)9>H*Y zYKtHGNWsS9AjY6~O*Hjc(~YT)5CcK?&^UiCF+)+O#@GU@tzUEW4uqKKAS4-_fsX69 zBo09dlnnWZ{f+kk)uwrM0fi!vE~j98MA}3xsY2q#U?Qks1e>j53K{WW#(oEN6hQ-U zFFJA66U=050tP{{j}h-)=^|K8eNCF%nP38-aY;4}7bWh@hV7dX;Bs(8<8pT~-2%l0&`s%YLTZg;pg*x+s1NEdEarny zld;hK4yvWFfk?PjS!-t@qdZdzodZxs1+bAeT;ce55Ss7{ot5@(0pDcMYqM`NX@-n@Y z*gELEm_vbzEE4=cs3N_+YvV(v*b3Ht3&hhPKT-k0lT^-o=wsHGHlEKOX(H8U&%N6^ zt0I$WAKGq@-H_QwC(?_IPo)F3u7*Or(BZBna9>M6Z4UJv3`>=}7aBtKRS9BBJ>oug zDZzFqSDTj!dRS>T=Qt2)oWzRJsVEd-QlD{&!l>mUFO|JD&zVW}Td3EVJHE7fYHDGF zKC1?;osqdZc{C|InXj>LW)l>6Mn|7+P-|6ni-J(0kkaqzsHGKVLBd;UZZgL%*F3R{ ztLZ0z%IFG^dExwbtmTStj>T<(dTmx~W7s{h%5jN;IN_1Hv`%^nMCGv}m@1*Wa>%@T(JpL(o+qhT*@Ps@CrYa; z7J8p4Q$=dPsS%5R8dz*dz;?cFd?WBY(Wn71Y7&!E!lvVJyj)#s44V2X5-8I&7+&Q; zupY_%*IH`dvBk|q``lbn4s=H!USA|Ym05kZw$Q(!IF0+Yxg#5Xkh3{yS~*w@3m9xS zlolL<>7r36_rDxBkG>&rC+SMhz;2%tH1lbUmGc{veSgA1_aQTp^pqhnNkGTwoqIMQ z2owzr`2j^L=>FD?m>4h@I`ZmCO3W+U^eht;2GneH`{qtwNVqV60m%yyC?u#DJ$^Ei zrs`N{xBqD?dD%g={XA2}+`T7v*->MM$-gsu&dVrX^!utZGKfP%F#D%>vn$=^>*-sZ zcJvEv&Urj`QsA=|peY!1so1S>nZph^_+_>DhQ{Ps{MNtVt6Anzcr3eltRQc~J9c4}DZASS{n2RV~^&8>Ge|>J4a{Q?&+rsuDc8V`Jzbscvca?{7bNIkc+3E#BBeQDL*{Vh?jR-RE-~53DLO;Zg~BacvyUr| z$ziiMbZ48CYvqvfPv-ADa7$!K_a3_Z3JZ9JO2!V=2|hP5I7Hpdc`R`R=YlP!z+#7A zw-xVw97%00)N5+;lljAh^$}0|BTXYTDDPo8T?4yrwek-j2$_h z#G^uVSs3|TGT{MQUJnb{=xo=)aTF_=94hUa?041X4upXB*gVXwv{K*( zpZxUF+(y&fTBimu_tJ-)DQY&P4yoV}>10V3@RjhWYcnF)yAYOl2yb8=+l_lctYX;? zQI#0Fy^r`}K#3nXrSJdZFRrYw_{+k_(0+`~3(IxCy1le=T~C^4)LsEzybj+&23~CL z<`KRZdI^&hjT{jPk>2FL>iFuTeWgtme=}S?>Z;bv*5IQ3@!#C*w0KC77T=2RH^F|cK0m+`4T|wbgldsf-(Et>iRbTe?9~7Y-uf?f)6NTv<1W=}SfJ6GWiM__oQ0td%2ZZS=V5 zA1$%ocAo@z6Rj=Gz5%5J>BIjZ3P^F_G1&T9PLRJ>*dxz$c3b4CZ*OCALfL%1BNkk+ALp#!GkUc~^r z@0xyaM#_As8Y^vAn9QRb?l?P?{i|y-Y@mSgC$wBJpRe3s-D6G<(IPi=oT2TVt7?q9 zYKFP-;cw3<#4hr-MuzRD0SVvh-^*Rd%l-8NHs*^3xd&ax64F^9R35u`O>ZyZjHYYg za?Twv$Dv%nku$u24_7=J_p^f1eG*HP>UwtYAjcE(yEN0rT?pZ?k1mh1^WRy;`r62!jI8{d z!Ge7HAoa)oFiwk|qhDwsLXB%g=6|FUNIKtC0}LMkK0``wNcY8JAl{Qw()&t!wD%j6 zKzw9g-LQIduoI{odgLy>W2KM-bx}EJ?vSdOzGC6hhewJ`D~+r|4h-BpiZ=-rM$nMcwAu@F#i7dmsM1M*rN6 zgwVwSeNWR;xV`6bNRZM24M94Pra*(k(0F|dhq00>m~N^|YMeqzSrB#4)~hJ3ym)Y} z3ZUr-qkp||*+8DP5Vmai1j{8gZ=5J&(=N?YJs83db9_=qLa8sqy!D^MUB;`B|2bU> z6GG+yEiA-xaZRWTl5+aAvI&DZizaYeLR*snV7O60FMF{Hh9)K+%JU77kp(Q;zW+d} z`&qa$0#)_cG#`Pml>)EUveY|th zSo#lhW!k^nBG_7w)*!QHzrU|uV1*MTQbsv-zufd(2kJLif|gnVxZ4GFO^R=Cj|rBC zAPp~e^t9K=A&f%qtF0tmyrTa!MExU#K)SmoxDy2k?m&vo&N_1b>&;D};(CSZ&i8GF zY=C9R`12HuxJepp%R%Z`4=>uq+?B5nAb5poi1j6Qwk5R0P}f?-)U(&QiV0q^Z(?&l zyI&dtN{U#G;4Sc)>^ZR^i;+K-!zfT!rimja@c7RBPwcCpq$Z; zmkqr`p58y3MZEuC0RDf`i&r?JF5=3BD=*rHZwo-Z zUD4aSSbiI@Fr#Vf)~1uGCu5KG{n!Z7($LB8P3s_U#_*Ge|C!@CjQzcQK7PcMI~JAs zPm`zKB%~A}8Dzo(|G08>>nQU1=E^kEe|`OsDMaNMG;tJsMJmghsUmvrFOE@v01=Kv zT6D(2^JUFUaJ?RG>53L2A^Po;JRu=($G*Y?Re5tDm#6ebYN~gu_=DLs+Ns=yr`vj* z;61$BpY4PnKR4R5Grm|(BHQMAs&vnPCRs8=fuoZ=SwOi-36NC>pPl~wr$(CH9g?1UCRIHcR%ODoz-IISf*#eE$^KGpWYAIM3%=QI&#f{x?KKKC`3pE;GpIX=Fm5f_hq7?egeZW3xH$l|csM08v^vVWlk< zza+KXCKBH+)sE=|BMZN!=nhQN{-tcFy#~&h5qFgSgAk5mJrdmf+pdz~6*rln z0_{B(7SQ+OHIx`b&_bf8lm%?wBPT>euPCB!o0H1D2ov7qAa{{G-M*axl+om;K)wx* zb&FN0ga?&5urzpQR_Dsyv~H67h}iJ&V}=^*s2firvGr}Y^4V8y2|6<&klmg9`EkjX z>BQz6wQ!$@0ozl;GfmG&zQ?$f9QRq=gJ^Mc1;-|PQ<;X8N z>CMMg<$CRyW+*DIJEB<0>bIc;=M^)}gLB{o?z^7|VJ~tY15OQh&j~Lzqa2I5Y&&;G zdG6F?GVz&#k=jiSKxT^O_2+}NH+ezzwj%d)Hb)p6><2vSy?L4Vix70RtuMSpZh^_u0d)E3sgTN^|Q-Od9 z5H=Xj5Le2>qYmu>>U52-_lHd+H42y>2eS01MOnrKAtKz*@&$N4Z(u{90QxELB151O z_Y|RyVfnS}X885qlF(@byVLyt?5gM6QN*v68EDJ%=X42pM?FoxvLYZ-LH)`DM})B` zS9uUwF`1YKkii7=3N()$?NBZ;y|N_ybGifP!JxlZ8Zs;gI%KCa#xzm_8vY$Es2PE-bm=|4>7C9YNyK3% z9T(hSBOTwlPH7WEH!YfJzz8ASaXhZS;wyh}GtX|_ltu%YNt8|(^y@~&J(D7K8BG;J z{w7Qyg&Zv!6D%;kO@vfBudPvj{YpT@R%HR0nNUOlx{Oq5v+F|JxB(~o^#zsp1EoVp z`O6VNn&OY;DA=qr%<|J&o)gHGpj?8nFr|?LG_OtBY-E>_98|k>_{XDeRmLNp(qn*? zp=jq=A1}2Cfmoj?%)N=cmcaBji|D5Kn}(0Qw-P+3of-Ya8gg6@CQTDnMAu(SX0?Hq z9fM^`DO%k!**e4^ZH2(UIt>gIK+dzy4HaGhSfH!=67Sk1|BwCNKPZshs_h_oxg~qZ ze2y(lnzyc!W)r`YQ$=DkIOMkS8kXqd5v4V_9gn!<^e%YadV)KwRzB{16pw_|;dMD$ z#4=UVhmBJLLt>}9Sp5p=VvndB&tDSGhg>m&B&L>cfmH zQz7>$lJ5ieL?hs@m>xB+6Uknx`(1+%D3#2091HtWCYI~@1ADLlqCzk)W(JSg;I&vSF4RMQwfUq9AWnNs28-{Fr~LC|V&$^$3YTSeo$bvzcqR z!V2H9-fW!DenBJ$K+ZNIKJhFwqhhjqFek!Yq@)~;EpV#Z-y7Y%BpWsu z@s=3l?1$qi9B&OPn6n7UuK)*m7L(=htvUD1^h00>-(gVDCojVWWjzJDQ?5~XCP7Q6 zH@CtBA`E*~WwzBc!g{(iL4_gW9C?49t+9FAzg~Rj4=~iM1_9OOu1$?L0N`gax~guq z-Qn|0ZD)xA13MfDQ~gy2JP+8QmYX|zJP%A?P!OM@^sm$_w6cg^KK1O|#8Yq60PSR8gyoXI#A{J?W+t{H+aYzhU%vL}_Wl$&#Fp=>){e(U zn`;I>ZQO_dJb8q=_h(=T=%I1Y6=w z3>}#zh#U4VgdFom@4Gm*{q}*0tcW^Fy>=;Yg`szQ{3w5i{qQk!3>ivZDjd-BT-F1$ zxqh`?`*dGF90_33GV#)Cp_Po^J6t!b$32-Hu>Wij=xl$i3IHAr1sV~&#{;o9=Cbx`On-_$=lN}FF6uSs`ZWm6 z<7O@^-)*h%0ModTZLAcvQ% zsK{Yd2eBP2gg?-mG`=}MtO$VQZ~DszN*K?{<4gMt-WR4BQ!I%w*z^+^u$0@Ifi7jk zilHp;$8OO1RFL^Jm&-47S^CI8+wQ7N$XXf330rkjjyLuid2m>6k_6h>E|Og^x&&u@ zabZxT5C>YN_m!cgGi7nd*%nV3MR5V!ZQ{HjFOl#L@(rQb1MX4WepZ0%4tnxNOF8aD zTTYI(Dgo@s`(m%zCp7dh!?P+YMMyPknT6_8G~A&#kOZ^Lm}$J4H6h>a7^k}3mFzo9 z1~bgBLiq-IUcKQusBQk)rj?d*(V-D2%`@+H@d_<}d^jG+G$- zUSJ`?Fn^AJA`*#Ng;&5ppnYkmkEV2gPfy5Ha#aO9pPA+~m}2$N6cqMb9UV(P5~aDtzL?iLD}#ixY924rN}xP@Is=#7 zK=@u7njm6oB3@B&qIqPyTKLRe6{Kd#6XB7^t!J9X2%Xg-t@x%#8Csy*hs*_0h*V7b zZLi{(IvV`Jt}ejOTb^?{qv2SCA0mn>s`827%nl+^Z!zcT84!n0bVbCC z3^sV`@`4~73j+sMJc9>J8(cWH0Zn^NsmUnqsCzgtLr@?z+e0#eP`Wsou62^NIW=(~ zEb`y?lCd#8WTCmK&N?3x{WC{KFwF&2+`JK7nPE+YPhkKA6mupnDpMfPQV#g?*5tP97oy$`NIz;G$2zWfGENy?$8;#l)SA70w6Lpjrr#hu- zWvFecYgY~b!t4W8n|WkI!~x2?gvDPpH*G+Cw{6fYgKjj^a> z&BQbeNiBJYtM(tYz?j*?O!KLVewp3#G8S&;yOenKdTjPYYC40_!z22>Lo!p54ap5O z`^Llnp)lbssJ?mk`ZOXiEF$&?@$q-J>cbIX`Nw_Sir?GT(~rsR33(P$O5LnekO08X z<<@=676I{_lUDBFumkQpKE-WEycs*zzH*tzr+>|~Q^05Znm7m=s!=CHF#T!=DT%{Y z{asvWB-tWAZShrc_#~Cs6W2fsW6$WmptxP~A8JUdpW7 zi^$5xaq3qE$BgbuvuQT#~7?;5GK{$nr zl~N^~nk_C*%^Z&5aPn%Pug`2Bmkz(;P1eLxL5FD~UaWMs{!6ooCPL$--YB7!H45b$HZd-AMu_a?!hg)eN7Jw4_jTCe10XIZm|_7d!}V$)HgFQg;r%hPQM z``G`NtKoq0bSgwyVc0MxJ3u)YS&BIqz2#|HPNp)Q64|sVL^>LqC7L8)SYD^=H@xlU z>I3F>3Z%+IExQ>-{LivX6}Tw94D{Gp9S23-xA^H7vME zcRR|2M)uu06TKI4s%T;+Eo|Y}J)dZ4!Y|K=9F`#eoBc_;&kTS<*&PfLQz9Y4!U@lT zYsQ^EXhEqrc?ce0BUZ&%8c;}==;mv#zkq1=65S{YWeo!-VDW%9U!WA0t7S3Jwm-y>mb=w|`BQ>pb#-!Xs1 zgs#Zrd}f?=r@bl~-%J~t2LFNObJS-3|FqSt|0@RcAD#m}r45xwmwGNu;|eFrLvvHjx{YFL z`wX~r^@)S7--bGiTmY$-7gC$bg%^#V&*ulsSlQ*_ASw0}}EvnB!_!qZJ zO(~XgwNh1nnu(b*PXvHyZxK5!^4Ms}Ek6eC4O{HA0R8fYsnYg)7^Ah9Gj}@hi7fO2 zwvK-avQlV6?1Dv7QD95Q^GTR&WKW*t_Ej30dGay3!yJ~H#yisX8FJVoW z%;48jL)*VWV-JCr*1xR<%5H5&y947rHU;RK%YhFMhh#Hq^?!=@^!DBQg*G*2FHcmj z2qoEDKQ;EXk+6zxo@`vpf}VwtFcM3xtjBIc`u&N>d%q1~(IzFky{uc{UuQPl$)VL3 zMk@kRA_GX$qbVWXdcT-;{$WT5oA-f*z^bi zCYEe4IisR^*7ogYo}k__qadpdc<6N% zzfIK*C#m*?=#> zi8RYC8dKNoy$$~CX>=0;@~A`{70Ny|tLp|a`8b~@oy7hpi}*}j7!J>l3L+$_Mw@Pt zgqX-?;$rY3+F`oVs8q8iLKxr)z`k(m7A)gHwnW+<={QjtJ%!Q0-}r@EwG9k3Y`Ikj z$wk)KCcwmbFd1|96frjyY0CorxcXSG&bpnc9$(hmhFH^c%gKw2Z&0mC; z+)MSVC)Mitp}_OUd$wn&dOPG%32uJj%{!hy8M7brgq3&KwA9)Sp@2&ndS5`0De6}Y z{mRwUj6va$4LS66j)?QMxhIC#2S=ed$Hkm%IRHeSS0#~5F}Wjrc~9;kA?>J>n{x~BlsfM+sM*b80z0~A96Eca>am0xNXQT z$tjG?B=?&)8)!sgTG`^U%f50uv&bPT1f7|0S0~SVyuIZ|TM#D^;TItt?z?}gl8cH? zJ%DQF$E-~r7j}Xh!8iEvR2yOau(XL@0@Xvvh0`M{?NqYA5r`>dwJj=TxHB<$gCfmw zB1;khRUJ%4sRysDVhYd$mK~PD{77Mu-l&99Mz@^cRSP$SP6nA2PV77yxnL(m77LID z-NES6N^uZqvk2@RWgsPi7!si}SRLjc5x|~!*Lf%!^LtzHG-GsoRl`TJ2pQh`a8_jV zE>l!hn);QSPHJ@sjqPm8{O)WiJZmD(ZvKa-LUz-(0mXK6dZvPbspwy9!r5yvBF)Epx7tPKjD0J74GpcGmYHT#n_Qz$Znh>Hh2CAjuUFmuIa~|yqiCImB7GK*M5JDzn2mi6pA>J$Bgl3;1vT5hdYdU~F&WUnNE2C)yFhzRAD=KBD zpqS7jlQ=AnIA=K$p5Q5H8n!~G{b3qmgS8+cp4FXUm4D$!5dM)`M(SX>fB{n=eVehE zA%MLEBu`=JWYzNQbC$@=l!Bi3-%!0167H9xaarV$x3T# zhIK7}<;9aR^BmPNJ%hm2Kv~1UpMusM;!vQQKeo#|jFW5i@b86;1S}#$E4pvh^u=96 zs1fnC!a9@t<*{Ilp4tKhg#qYcju&)AZxHq}t(Jjg7#4L`?kAbi0#=>Y7Y`V)(-8@&$N zZc!6G^S z{KJU9Z+(JqB^Yf4Um=;kOixTtHc``(;F(H)x+%%x#4Nu)hR(`uBmmeOO8$MQG(9jI zLOOL%)oM@m0+U&?q5wyB1GyRJ@DT(2zzP2{|HDRfy)B54FxbV`hnZnqG`|A~c&0p6 zAQxtZUxI-{$521S1>`D}%khKy;{L3mLu>o&Yp|PWWKjM+WBe}(OwUaEPT-dmm)*?I zL-4s~-AhKcCEu6mx|z=AhNP{1{NiqPgaeOwl@-Y6g~SD#E`XF+H_OFC7v!U>>$w7z z>)4jRX6u*2$>_qS(AKRB38#9?x&3=`*&G{BL@&KdTbP4;)bC=gW7*n~Wy3mMVZev- z7*e@ntM3NCy6IMi@WE;0XoH8qT}tE>J5KB#??Nz9SMgF^h42t-$ zJ^|;B(b(lw1>iQ-)gjAamr2wj2mI(`7|v`F$7B;I>y(m&N23~pU>P7w9M-bCL6%&&C( z>56SU8Aw9DiVc2`>(Ei#7imt<;d3L9dt7jU&`o-Lq-n zz}(T{LxlI;FO$Jve_mSv^sx1!!jB4hVPOI>dY4F}v7CMl93MLgc0Y0SGw+Ccd0h;s zR1GAM9RIgdW#VG|Hw~u-U|GlE zw%mPuMTSJ7Df{f-O>L3V6KyzV9D0I-`)1vs9QL@65|dRm{>$t( zLhhMKBAiTVA>_``SO1nmW)ep!_F&Z!3mu3|jINx^bm^d}zZ1n` z^9nG~(752A`W2 z;QP^pk_ttsPAxKz$)>&XQ%5y3jHhK)NCFtdrf;IAmGyl1I$qBL`)Fe{2hqudCq@;; z8x!V?yzibv#bq=<*#nD7WBEDfZArt?aB4}sobSGdoKLEAc&ou8@F}1HSy{5G8MF|W zDUpM;2;+KzT+|*@TKZ^u3(J<7o*a$1_Mg1A_u$j6a_!IC73xrZV_YYUbMhGfMlCyO$-~JVOyqPfPYd7#qtA~ol>132_Sf?MB=CupRkqGdPSwqH~wFBY`$J)4L z=YRqwSrmB4RSgt?Jj(IR_R`WJ;yb7wAId$#XLTZx8L!f&T1#bWe6fb2`F9L8Ab=*{ zNo(_%$*9|DuQ&a&4G#7#cdb8vTZDu8L@eMzKyx}~q=6hzX>SWbHzwkj<91b2fqS!| z)m^n7gULY#rC-w0c5*JAAlB`dn?m(x1tqLzfn=*>f)${+oVmjA!`3#9skLU3WS^q7 zc3jC@*>!o*)7_op(4X_HYx&)S{DJ4nCDZ=M`(k5vm2@l9^BX;zFNYK6cZbOBC6bHV z7{gF;r)n5r7vRTMG@E%XcZ|OFX*xRLJ5ON%vc`+OpPm};m!-r_?Hx%4 zrjNiRaG8D`e@PdZNf4!9rmz*?KRz%hf&qo~^W?aHA2vu_%ey6I0PM&zo=0FOo-=ou zDoT`MF5_*)RaWJGT7P~_OjF{Hcs3Eip`S&Jiopo*43&LW^(OHPJq4W-speC6`;M=^ z`wj0}JtCBUD7&szy{6V_9QxT)bzdy=1q=>wOrj-cQh2AiR^7HgQ8To+xt{GjgNKA~ z?ijbrT>6mv;Uw^NLEOx0-Xrbd>=($Xy`KEHpvA0HtcP6D_%xK8@RpAPcYTHXeyLcJ zhkyxq5ip1JD~_9V!HnPhl^cI3vivZekf+veG2p&5&UGTt^&qME?C2C%sDs`jQId6g zmy!Jk<9P3rLq=yw%Pmono~TF1cceDeI#yr*W~5FBzk~Y*JSfz51o{O%u)gPC3QuUV zI+RooKaC$c`MkmO=Md2BHxf*n>)|WnB2ot!wdc?G%5Kv0by+>5`Z76n_~CYdHP0ZO zC6x~*SB5Rh>}vw-$|Gv1jlE1!`4mC43Q?4s+$aOa#ZarJa-_bY$UT_Ctmoq8LkG#% z8ai-|O2dbErLsInXYq#XG4c%3=VRkeO5WysC)|9&B#Zl<;tOKTbBLo23 zxBhxrS2_jel6?hW>%i4~0Y=m)kq#9JkvE0*;V9h-vxdq-4QK*R)4YN5sD_;eTsHp4 zBq-2Kf#6?x8ihWjKF~1=L3lBA<_k@3O^)biRFl*!yo}Y=FeK- z=RI<$ReGmQeGR6J#E+6&M3|fb5Jp0EAdVx$vWb^VX=3;p5G@+W4KF_IFk8 zU(P79AGql94Aiu7uK(x{CbpTW7Z9miUuE|+QH}oSKdl2qz5S$LsPzNpnO@eOZnoz^ zxVS#QK{*+yB@PGzwl}zFcohH>t{SbFR9S&FZ_C|M!XiO6o+*=S;JmkFi18J_`}y*9 zH*UzVYRZQp2{gx7Opo}1y0W$OI!5pXG0R3!EDc0F^YAIP_Hb=`@LP<*;qB%^APeJs zri`3F%ll>E>g+xBSdip@#q}h;(gNi!NBAS?f3VE#-v)l_$Nh=1hcQhO=|l!*{3mxn z2ma5+QBqtv0w552Kk4eR&vL!3`R>TevDA6N&CVjC-ZMcox#+wI@O5Pb>?fI*&FaYn z3avTf

aQ9SKkC``iIOeI%(1&Y% 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 z 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 dR~2)jV+K@$<^A%pWX;W4~Fua z0C}|?0&V^YfxLS3MqqkAdhnkl%+1aFPZIpc0`^aZt=k_3`B%x(8;Q!v$nx{^3(14| z1mz*J5MeoKh>)PHpfFfimXA*e3Ka*@|Nm?LZ1nGQ2)_{YZ*ziWVnCf(i}3qN85)oY z(ghj>vE%1rN7F}#Mo&{z{qT{L#lV;(1C=i{eo9MAAYbZu)85@(gxmG&8nyLx<>=$q zW-9N`g)Q%#GC{sM4coqX$DG*76J(>Lr=n(|puFR2d12`T(H#`(@Pf(Vcj>tl&82aP z5O-|Mk6A4B?G}heDVOj`pg~%ZplZJq)q38#E%dAF3*yEjbZV?iyss*B+jxPwWS9Y~ zEIY)dPkM7FxV5MAO^kI8o*wI$HIlG;rxZPFDH3lu)%ZChw8MY9z*(j90_T?+RaPW} zFxoBGt1A3ZqG)*Ha23$X70t*{`Mwc*4FpJCh8Tw^H3AXS%OdmPM($LH?Iw*_S1SP3 z4wP!4GLTBUq&I4hxyah2z$OmpbgkP>~^(xS|Ab-$#XmEEkD+@HN0P{gBg z#HV~~M;>C19vX>>het`t&u?!(I+~j&B@^~f;-1-CVB7Jf*a6pvlB1wYvJD=i*QrW^ UXw-OMVLkyqFpz~sPD38}Klr+X;{X5v delta 48820 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

#H3Dk#|3Q?uhdG`G3J$FQ6L}`Qf!A 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

{RQ8>n#T+hj)LiF=U_7 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 diff --git a/SPQR/Doc/spqr_version.tex b/SPQR/Doc/spqr_version.tex index 0db7f3702c..789de893c9 100644 --- a/SPQR/Doc/spqr_version.tex +++ b/SPQR/Doc/spqr_version.tex @@ -1,2 +1,2 @@ % version of SuiteSparse/SPQR -\date{VERSION 4.3.2, Jan 20, 2024} +\date{VERSION 4.3.3, Feb XX, 2024} diff --git a/SPQR/GPUQREngine/Include/GPUQREngine.hpp b/SPQR/GPUQREngine/Include/GPUQREngine.hpp index bb7c3060dd..7c7c9f616e 100644 --- a/SPQR/GPUQREngine/Include/GPUQREngine.hpp +++ b/SPQR/GPUQREngine/Include/GPUQREngine.hpp @@ -12,10 +12,10 @@ #define GPUQRENGINE_HPP // Version information: -#define GPUQRENGINE_DATE "Jan 20, 2024" +#define GPUQRENGINE_DATE "Feb XX, 2024" #define GPUQRENGINE_MAIN_VERSION 4 #define GPUQRENGINE_SUB_VERSION 3 -#define GPUQRENGINE_SUBSUB_VERSION 2 +#define GPUQRENGINE_SUBSUB_VERSION 3 #define GPUQRENGINE_VER_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) #define GPUQRENGINE_VERSION \ diff --git a/SPQR/GPURuntime/Include/SuiteSparse_GPURuntime.hpp b/SPQR/GPURuntime/Include/SuiteSparse_GPURuntime.hpp index 3b32be447a..227915d51b 100644 --- a/SPQR/GPURuntime/Include/SuiteSparse_GPURuntime.hpp +++ b/SPQR/GPURuntime/Include/SuiteSparse_GPURuntime.hpp @@ -12,10 +12,10 @@ #define SUITESPARSE_GPURUNTIME_HPP // Version information: -#define SUITESPARSE_GPURUNTIME_DATE "Jan 20, 2024" +#define SUITESPARSE_GPURUNTIME_DATE "Feb XX, 2024" #define SUITESPARSE_GPURUNTIME_MAIN_VERSION 4 #define SUITESPARSE_GPURUNTIME_SUB_VERSION 3 -#define SUITESPARSE_GPURUNTIME_SUBSUB_VERSION 2 +#define SUITESPARSE_GPURUNTIME_SUBSUB_VERSION 3 #define SUITESPARSE_GPURUNTIME_VER_CODE(main,sub) \ SUITESPARSE_VER_CODE(main,sub) diff --git a/SPQR/Include/SuiteSparseQR_definitions.h b/SPQR/Include/SuiteSparseQR_definitions.h index 9f44ea871f..dd70bf5e4e 100644 --- a/SPQR/Include/SuiteSparseQR_definitions.h +++ b/SPQR/Include/SuiteSparseQR_definitions.h @@ -64,23 +64,23 @@ #endif */ -#define SPQR_DATE "Jan 20, 2024" +#define SPQR_DATE "Feb XX, 2024" #define SPQR_MAIN_VERSION 4 #define SPQR_SUB_VERSION 3 -#define SPQR_SUBSUB_VERSION 2 +#define SPQR_SUBSUB_VERSION 3 #define SPQR_VER_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) #define SPQR_VERSION SPQR_VER_CODE(4,3) -#define SPQR__VERSION SUITESPARSE__VERCODE(4,3,2) +#define SPQR__VERSION SUITESPARSE__VERCODE(4,3,3) #if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,6,0)) -#error "SPQR 4.3.2 requires SuiteSparse_config 7,6.0 or later" + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "SPQR 4.3.3 requires SuiteSparse_config 7,7.0 or later" #endif #if !defined (CHOLMOD__VERSION) || \ - (CHOLMOD__VERSION < SUITESPARSE__VERCODE(5,2,0)) -#error "SPQR 4.3.2 requires CHOLMOD 5.2.0 or later" + (CHOLMOD__VERSION < SUITESPARSE__VERCODE(5,2,1)) +#error "SPQR 4.3.3 requires CHOLMOD 5.2.1 or later" #endif #endif diff --git a/UMFPACK/CMakeLists.txt b/UMFPACK/CMakeLists.txt index 9b98e1454f..ea3fee0c70 100644 --- a/UMFPACK/CMakeLists.txt +++ b/UMFPACK/CMakeLists.txt @@ -12,10 +12,10 @@ # cmake 3.22 is required to find the BLAS in SuiteSparse_config cmake_minimum_required ( VERSION 3.22 ) -set ( UMFPACK_DATE "Jan 20, 2024" ) +set ( UMFPACK_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 set ( UMFPACK_VERSION_MAJOR 6 CACHE STRING "" FORCE ) set ( UMFPACK_VERSION_MINOR 3 CACHE STRING "" FORCE ) -set ( UMFPACK_VERSION_SUB 2 CACHE STRING "" FORCE ) +set ( UMFPACK_VERSION_SUB 3 CACHE STRING "" FORCE ) message ( STATUS "Building UMFPACK version: v" ${UMFPACK_VERSION_MAJOR}. @@ -45,16 +45,16 @@ include ( SuiteSparsePolicy ) #------------------------------------------------------------------------------- if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) - find_package ( SuiteSparse_config 7.6.0 + 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.6.0 REQUIRED ) + find_package ( SuiteSparse_config 7.7.0 REQUIRED ) endif ( ) - find_package ( AMD 3.3.1 + 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.1 REQUIRED ) + find_package ( AMD 3.3.2 REQUIRED ) endif ( ) endif ( ) @@ -73,10 +73,10 @@ if ( SUITESPARSE_ROOT_CMAKELISTS ) else ( ) if ( UMFPACK_USE_CHOLMOD ) # look for CHOLMOD (optional fill-reducing orderings) - find_package ( CHOLMOD 5.2.0 + find_package ( CHOLMOD 5.2.1 PATHS ${CMAKE_SOURCE_DIR}/../CHOLMOD/build NO_DEFAULT_PATH ) if ( NOT TARGET SuiteSparse::CHOLMOD ) - find_package ( CHOLMOD 5.2.0 ) + find_package ( CHOLMOD 5.2.1 ) endif ( ) if ( NOT CHOLMOD_FOUND ) # CHOLMOD not found so disable it diff --git a/UMFPACK/Config/umfpack.h.in b/UMFPACK/Config/umfpack.h.in index 8635f8d2e2..f5a73ba09b 100644 --- a/UMFPACK/Config/umfpack.h.in +++ b/UMFPACK/Config/umfpack.h.in @@ -84,13 +84,13 @@ #define UMFPACK__VERSION SUITESPARSE__VERCODE(@UMFPACK_VERSION_MAJOR@,@UMFPACK_VERSION_MINOR@,@UMFPACK_VERSION_SUB@) #if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,6,0)) -#error "UMFPACK @UMFPACK_VERSION_MAJOR@.@UMFPACK_VERSION_MINOR@.@UMFPACK_VERSION_SUB@ requires SuiteSparse_config 7.6.0 or later" + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "UMFPACK @UMFPACK_VERSION_MAJOR@.@UMFPACK_VERSION_MINOR@.@UMFPACK_VERSION_SUB@ requires SuiteSparse_config 7.7.0 or later" #endif #if !defined (AMD__VERSION) || \ - (AMD__VERSION < SUITESPARSE__VERCODE(3,3,1)) -#error "UMFPACK @UMFPACK_VERSION_MAJOR@.@UMFPACK_VERSION_MINOR@.@UMFPACK_VERSION_SUB@ requires AMD 3.1.1 or later" + (AMD__VERSION < SUITESPARSE__VERCODE(3,3,2)) +#error "UMFPACK @UMFPACK_VERSION_MAJOR@.@UMFPACK_VERSION_MINOR@.@UMFPACK_VERSION_SUB@ requires AMD 3.3.2 or later" #endif // user code should not directly use GB_STR or GB_XSTR diff --git a/UMFPACK/Doc/ChangeLog b/UMFPACK/Doc/ChangeLog index 3973347c7e..a3823d7ba1 100644 --- a/UMFPACK/Doc/ChangeLog +++ b/UMFPACK/Doc/ChangeLog @@ -1,3 +1,7 @@ +Feb XX, 2024: version 6.3.3 + + * minor updates to build system + Jan 20, 2024: version 6.3.2 * revise version numbers for dependencies diff --git a/UMFPACK/Doc/UMFPACK_QuickStart.pdf b/UMFPACK/Doc/UMFPACK_QuickStart.pdf index cc87dcd18644b208d85fd2b2c44afedcd311f72e..108c67ad5833a9e754a2961aaf0ade7c0a35aea9 100644 GIT binary patch delta 68705 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�y&SlYLtXAFbsIT@NdKH_ASDT0sj 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 diff --git a/UMFPACK/Doc/UMFPACK_UserGuide.pdf b/UMFPACK/Doc/UMFPACK_UserGuide.pdf index b8dd16d45a8b40ba36e39b9b361a357934af3fe7..a8d17830ec3cf0d89c53a409d04237126c63c3e3 100644 GIT binary patch delta 233248 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

e+Juw?G?8Z4r?0(6t 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


fNUVHnKo5h+(sjj^e@*l? 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 Date: Sun, 4 Feb 2024 16:07:47 -0600 Subject: [PATCH 23/98] version numbers in root CMakeLists.txt --- CMakeLists.txt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 34c469bfce..8bee05191b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -111,7 +111,7 @@ include ( SuiteSparsePolicy ) if ( SUITESPARSE_USE_SYSTEM_GRAPHBLAS ) list ( REMOVE_ITEM SUITESPARSE_ENABLE_PROJECTS "graphblas" ) - find_package ( GraphBLAS 9.0.1 REQUIRED ) + find_package ( GraphBLAS 9.1.0 REQUIRED ) else ( ) if ( "lagraph" IN_LIST SUITESPARSE_ENABLE_PROJECTS ) # LAGraph requires GraphBLAS. @@ -124,7 +124,7 @@ endif ( ) if ( SUITESPARSE_USE_SYSTEM_BTF ) list ( REMOVE_ITEM SUITESPARSE_ENABLE_PROJECTS "btf" ) - find_package ( BTF 2.3.1 REQUIRED ) + find_package ( BTF 2.3.2 REQUIRED ) else ( ) if ( "klu" IN_LIST SUITESPARSE_ENABLE_PROJECTS ) # KLU requires BTF. @@ -137,7 +137,7 @@ endif ( ) if ( SUITESPARSE_USE_SYSTEM_UMFPACK ) list ( REMOVE_ITEM SUITESPARSE_ENABLE_PROJECTS "umfpack" ) - find_package ( UMFPACK 6.3.2 REQUIRED ) + find_package ( UMFPACK 6.3.3 REQUIRED ) else ( ) if ( "paru" IN_LIST SUITESPARSE_ENABLE_PROJECTS ) # ParU requires UMFPACK. @@ -150,7 +150,7 @@ endif ( ) if ( SUITESPARSE_USE_SYSTEM_CHOLMOD ) list ( REMOVE_ITEM SUITESPARSE_ENABLE_PROJECTS "cholmod" ) - find_package ( CHOLMOD 5.2.0 REQUIRED ) + find_package ( CHOLMOD 5.2.1 REQUIRED ) else ( ) if ( ( KLU_USE_CHOLMOD AND "klu" IN_LIST SUITESPARSE_ENABLE_PROJECTS ) OR ( UMFPACK_USE_CHOLMOD AND "umfpack" IN_LIST SUITESPARSE_ENABLE_PROJECTS ) @@ -168,7 +168,7 @@ endif ( ) if ( SUITESPARSE_USE_SYSTEM_AMD ) list ( REMOVE_ITEM SUITESPARSE_ENABLE_PROJECTS "amd" ) - find_package ( AMD 3.3.1 REQUIRED ) + find_package ( AMD 3.3.2 REQUIRED ) else ( ) if ( "cholmod" IN_LIST SUITESPARSE_ENABLE_PROJECTS OR "ldl" IN_LIST SUITESPARSE_ENABLE_PROJECTS @@ -184,7 +184,7 @@ endif ( ) if ( SUITESPARSE_USE_SYSTEM_COLAMD ) list ( REMOVE_ITEM SUITESPARSE_ENABLE_PROJECTS "colamd" ) - find_package ( COLAMD 3.3.2 REQUIRED ) + find_package ( COLAMD 3.3.3 REQUIRED ) else ( ) if ( "cholmod" IN_LIST SUITESPARSE_ENABLE_PROJECTS OR "spex" IN_LIST SUITESPARSE_ENABLE_PROJECTS ) @@ -198,7 +198,7 @@ endif ( ) if ( SUITESPARSE_USE_SYSTEM_CAMD ) list ( REMOVE_ITEM SUITESPARSE_ENABLE_PROJECTS "camd" ) - find_package ( CAMD 3.3.1 REQUIRED ) + find_package ( CAMD 3.3.2 REQUIRED ) else ( ) if ( CHOLMOD_CAMD AND "cholmod" IN_LIST SUITESPARSE_ENABLE_PROJECTS ) # CHOLMOD can optionally use CAMD. @@ -211,7 +211,7 @@ endif ( ) if ( SUITESPARSE_USE_SYSTEM_CCOLAMD ) list ( REMOVE_ITEM SUITESPARSE_ENABLE_PROJECTS "ccolamd" ) - find_package ( CCOLAMD 3.3.2 REQUIRED ) + find_package ( CCOLAMD 3.3.3 REQUIRED ) else ( ) if ( CHOLMOD_CAMD AND "cholmod" IN_LIST SUITESPARSE_ENABLE_PROJECTS ) # CHOLMOD can optionally use CCOLAMD. @@ -224,7 +224,7 @@ endif ( ) if ( SUITESPARSE_USE_SYSTEM_SUITESPARSE_CONFIG ) list ( REMOVE_ITEM SUITESPARSE_ENABLE_PROJECTS "suitesparse_config" ) - find_package ( SuiteSparse_config 7.6.0 REQUIRED ) + find_package ( SuiteSparse_config 7.7.0 REQUIRED ) else ( ) if ( "mongoose" IN_LIST SUITESPARSE_ENABLE_PROJECTS OR "amd" IN_LIST SUITESPARSE_ENABLE_PROJECTS From 617cee7ff79b80fbdb9c4fe954fdae0a7fb04d79 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Sun, 4 Feb 2024 16:11:14 -0600 Subject: [PATCH 24/98] user guide, gitignore --- Mongoose/Doc/Mongoose_UserGuide.pdf | Bin 216122 -> 209087 bytes SPEX/Tcov/.gitignore | 3 +++ 2 files changed, 3 insertions(+) create mode 100644 SPEX/Tcov/.gitignore diff --git a/Mongoose/Doc/Mongoose_UserGuide.pdf b/Mongoose/Doc/Mongoose_UserGuide.pdf index 6ce32ec065573035b3169783bdba7704c5030d83..94afae93bf86b4ec09b761d5d58730f2b1b155e1 100644 GIT binary patch delta 191926 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ð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 F^Hz%h3l@e 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
_Mo9-gA=bf-ZnNu5TIf=Ex|lpj7hzN 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 Date: Sat, 3 Feb 2024 18:03:11 +0100 Subject: [PATCH 25/98] CI: Add runner using `clang-cl` --- .github/workflows/root-cmakelists.yaml | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/.github/workflows/root-cmakelists.yaml b/.github/workflows/root-cmakelists.yaml index 3e8efbac67..00e1fc3220 100644 --- a/.github/workflows/root-cmakelists.yaml +++ b/.github/workflows/root-cmakelists.yaml @@ -273,7 +273,7 @@ jobs: # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners runs-on: windows-latest - name: msvc (${{ matrix.openmp }} OpenMP ${{ matrix.cuda }} CUDA, ${{ matrix.link }}) + name: msvc (${{ matrix.cc }} ${{ matrix.openmp }} OpenMP ${{ matrix.cuda }} CUDA, ${{ matrix.link }}) defaults: run: @@ -288,6 +288,7 @@ jobs: openmp: [with, without] cuda: [without] link: [both] + cc: [cl] include: - openmp: without openmp-cmake-flags: "-DSUITESPARSE_USE_OPENMP=OFF" @@ -297,6 +298,7 @@ jobs: -DSUITESPARSE_USE_CUDA=ON -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" link: both + cc: cl - openmp: with cuda: with cuda-cmake-flags: @@ -306,6 +308,11 @@ jobs: 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 @@ -401,7 +408,7 @@ jobs: shell: msys2 {0} run: | echo "ccachedir=$(cygpath -m $(${CCACHE} -k cache_dir))" >> $GITHUB_OUTPUT - echo "key=ccache:msvc:root:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $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 @@ -411,8 +418,8 @@ jobs: 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.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }} - ccache:msvc:root:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}: + 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. @@ -435,6 +442,8 @@ jobs: 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" \ @@ -497,7 +506,9 @@ jobs: run: | cd ${GITHUB_WORKSPACE}/Example/build printf "::group::\033[0;32m==>\033[0m Configuring example\n" - cmake \ + 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 }} \ @@ -533,7 +544,9 @@ jobs: 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 \ + 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 From cdb5e8e0630734c33287195cfe8022edadbddff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Mon, 5 Feb 2024 11:41:17 +0100 Subject: [PATCH 26/98] CI: Update actions to newer versions This is needed for the transition of GitHub runners from Node.js 16 to Node.js 20. See: https://github.blog/changelog/2023-09-22-github-actions-transitioning-from-node-16-to-node-20/ --- .github/workflows/build-arch-emu.yaml | 6 +++--- .github/workflows/build.yaml | 12 ++++++------ .github/workflows/macos.yaml | 6 +++--- .github/workflows/root-cmakelists.yaml | 18 +++++++++--------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build-arch-emu.yaml b/.github/workflows/build-arch-emu.yaml index df764e28f8..7be4c923d8 100644 --- a/.github/workflows/build-arch-emu.yaml +++ b/.github/workflows/build-arch-emu.yaml @@ -58,7 +58,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # shell: bash - name: install dependencies @@ -94,7 +94,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + 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 @@ -164,7 +164,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: /home/runner/rootfs/alpine-latest-${{ matrix.arch }}/home/runner/.ccache key: ${{ steps.ccache-prepare.outputs.key }} diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0f176680e2..047745d646 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -94,7 +94,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: install dependencies env: @@ -115,7 +115,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -192,7 +192,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -348,7 +348,7 @@ jobs: msystem: ${{ matrix.msystem }} - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: prepare ccache # create key with human readable timestamp @@ -360,7 +360,7 @@ jobs: - name: restore ccache # Setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} @@ -425,7 +425,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml index d6e14470c0..789761f210 100644 --- a/.github/workflows/macos.yaml +++ b/.github/workflows/macos.yaml @@ -35,7 +35,7 @@ jobs: sysctl machdep - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: install dependencies # Homebrew's Python conflicts with the Python that comes pre-installed @@ -61,7 +61,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: /Users/runner/Library/Caches/ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -192,7 +192,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: /Users/runner/Library/Caches/ccache key: ${{ steps.ccache-prepare.outputs.key }} diff --git a/.github/workflows/root-cmakelists.yaml b/.github/workflows/root-cmakelists.yaml index 00e1fc3220..fd44ac2eec 100644 --- a/.github/workflows/root-cmakelists.yaml +++ b/.github/workflows/root-cmakelists.yaml @@ -80,7 +80,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: install dependencies env: @@ -101,7 +101,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -174,7 +174,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -324,15 +324,15 @@ jobs: Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: auto-update-conda: true - name: cache conda packages id: conda-cache - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: C:/Miniconda/envs/test key: conda:msvc @@ -368,7 +368,7 @@ jobs: msystem: UCRT64 - - uses: Jimver/cuda-toolkit@v0.2.11 + - uses: Jimver/cuda-toolkit@v0.2.14 name: install CUDA toolkit if: matrix.cuda == 'with' id: cuda-toolkit @@ -412,7 +412,7 @@ jobs: - name: restore ccache # Setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} @@ -485,7 +485,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} From 7a1e7608fcfc3599814597b69263be37713bb383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Mon, 5 Feb 2024 18:23:41 +0100 Subject: [PATCH 27/98] CI: Add check if root CMakeLists.txt pulls in necessary dependencies. When adding a library in `SUITESPARSE_ENABLE_PROJECTS`, the build rules should automatically add all necessary libraries. Add a step to one single runner to check if this is working as expected for all libraries. --- .github/workflows/root-cmakelists.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/root-cmakelists.yaml b/.github/workflows/root-cmakelists.yaml index fd44ac2eec..bcdcda49a9 100644 --- a/.github/workflows/root-cmakelists.yaml +++ b/.github/workflows/root-cmakelists.yaml @@ -135,6 +135,22 @@ jobs: 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 From 59ca19c143befbcf05b2297be16e4c83603d8c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Tue, 6 Feb 2024 14:50:58 +0100 Subject: [PATCH 28/98] CXSparse: Don't use complex numbers of MSVC targets Don't use complex numbers for Clang targeting MSVC either. --- CXSparse/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CXSparse/CMakeLists.txt b/CXSparse/CMakeLists.txt index f25ca92563..fb2c7a8a34 100644 --- a/CXSparse/CMakeLists.txt +++ b/CXSparse/CMakeLists.txt @@ -45,7 +45,7 @@ include ( SuiteSparsePolicy ) # MS Visual Studio does not support the complex type for ANSI C11. # FIXME: see GraphBLAS for how to use complex types in MS Visual Studio. -if ( MSVC ) +if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) option ( CXSPARSE_USE_COMPLEX "ON: complex data type enabled. OFF (default): complex data type disabled." OFF ) else ( ) option ( CXSPARSE_USE_COMPLEX "ON (default): complex data type enabled. OFF: complex data type disabled." ON ) From 3e43bffa3ab9323eb886a0484071482e75ac35df Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 6 Feb 2024 13:09:42 -0600 Subject: [PATCH 29/98] CXSparse: now using SuiteSparse_config_malloc/calloc/realloc/free --- CXSparse/CMakeLists.txt | 4 ++-- CXSparse/Doc/ChangeLog | 5 ++++- CXSparse/Include/cs.h | 8 ++++---- .../MATLAB/CSparse/private/cs_make_helper.m | 10 +++++++++- CXSparse/Source/cs_malloc.c | 19 +++++++++---------- Example/CMakeLists.txt | 2 +- 6 files changed, 29 insertions(+), 19 deletions(-) diff --git a/CXSparse/CMakeLists.txt b/CXSparse/CMakeLists.txt index fb2c7a8a34..744fd82621 100644 --- a/CXSparse/CMakeLists.txt +++ b/CXSparse/CMakeLists.txt @@ -13,8 +13,8 @@ cmake_minimum_required ( VERSION 3.22 ) set ( CXSPARSE_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 set ( CXSPARSE_VERSION_MAJOR 4 CACHE STRING "" FORCE ) -set ( CXSPARSE_VERSION_MINOR 3 CACHE STRING "" FORCE ) -set ( CXSPARSE_VERSION_SUB 2 CACHE STRING "" FORCE ) +set ( CXSPARSE_VERSION_MINOR 4 CACHE STRING "" FORCE ) +set ( CXSPARSE_VERSION_SUB 0 CACHE STRING "" FORCE ) message ( STATUS "Building CXSparse version: v" ${CXSPARSE_VERSION_MAJOR}. diff --git a/CXSparse/Doc/ChangeLog b/CXSparse/Doc/ChangeLog index 48f47ed0f9..fac039a90e 100644 --- a/CXSparse/Doc/ChangeLog +++ b/CXSparse/Doc/ChangeLog @@ -1,6 +1,9 @@ -Feb XX, 2024: version 4.3.2 +Feb XX, 2024: version 4.4.0 * minor updates to build system + * revise malloc/calloc/realloc/free wrappers: now relying on + SuiteSparse_config functions, which normally default to malloc/etc, + except when inside MATLAB when they are mxMalloc/etc. Jan 10, 2024: version 4.3.1 diff --git a/CXSparse/Include/cs.h b/CXSparse/Include/cs.h index 5313ff7b55..10651bbdf1 100644 --- a/CXSparse/Include/cs.h +++ b/CXSparse/Include/cs.h @@ -36,18 +36,18 @@ #endif #define CS_VER 4 /* CXSparse Version */ -#define CS_SUBVER 3 -#define CS_SUBSUB 2 +#define CS_SUBVER 4 +#define CS_SUBSUB 0 #define CS_DATE "Feb XX, 2024" /* CXSparse release date */ #define CS_COPYRIGHT "Copyright (c) Timothy A. Davis, 2006-2024" #define CXSPARSE #include "SuiteSparse_config.h" -#define CXSPARSE__VERSION SUITESPARSE__VERCODE(4,3,2) +#define CXSPARSE__VERSION SUITESPARSE__VERCODE(4,4,0) #if !defined (SUITESPARSE__VERSION) || \ (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) -#error "CXSparse 4.3.2 requires SuiteSparse_config 7.7.0 or later" +#error "CXSparse 4.4.0 requires SuiteSparse_config 7.7.0 or later" #endif #define cs_long_t int64_t diff --git a/CXSparse/MATLAB/CSparse/private/cs_make_helper.m b/CXSparse/MATLAB/CSparse/private/cs_make_helper.m index 63d58c80a7..627ee48690 100644 --- a/CXSparse/MATLAB/CSparse/private/cs_make_helper.m +++ b/CXSparse/MATLAB/CSparse/private/cs_make_helper.m @@ -123,10 +123,18 @@ srcdir = '../../Source/' ; hfile = '../../Include/cs.h' ; +% compile SuiteSparse_config.c +[anysrc timestamp kk] = compile_source ('../../../SuiteSparse_config/', ... + 'SuiteSparse_config', obj, hfile, force, mexcmd, kk, details) ; +CS = ['SuiteSparse_config' obj] ; +if (nargout > 0) + objfiles = ['../CSparse/SuiteSparse_config' obj] ; +end + % compile each CSparse source file [anysrc timestamp kk] = compile_source ('', 'cs_mex', obj, hfile, force, ... mexcmd, kk, details) ; -CS = ['cs_mex' obj] ; +CS = [CS ' cs_mex' obj] ; if (nargout > 0) objfiles = ['../CSparse/cs_mex' obj] ; end diff --git a/CXSparse/Source/cs_malloc.c b/CXSparse/Source/cs_malloc.c index 9f078b24bc..84d0e31090 100644 --- a/CXSparse/Source/cs_malloc.c +++ b/CXSparse/Source/cs_malloc.c @@ -2,29 +2,27 @@ // CXSparse, Copyright (c) 2006-2022, Timothy A. Davis. All Rights Reserved. // SPDX-License-Identifier: LGPL-2.1+ #include "cs.h" -#ifdef MATLAB_MEX_FILE -#define malloc mxMalloc -#define free mxFree -#define realloc mxRealloc -#define calloc mxCalloc -#endif /* wrapper for malloc */ void *cs_malloc (CS_INT n, size_t size) { - return (malloc (CS_MAX (n,1) * size)) ; + return (SuiteSparse_config_malloc (CS_MAX (n,1) * size)) ; } /* wrapper for calloc */ void *cs_calloc (CS_INT n, size_t size) { - return (calloc (CS_MAX (n,1), size)) ; + return (SuiteSparse_config_calloc (CS_MAX (n,1), size)) ; } /* wrapper for free */ void *cs_free (void *p) { - if (p) free (p) ; /* free p if it is not already NULL */ + if (p) + { + /* free p if it is not already NULL */ + SuiteSparse_config_free (p) ; + } return (NULL) ; /* return NULL to simplify the use of cs_free */ } @@ -32,7 +30,8 @@ void *cs_free (void *p) void *cs_realloc (void *p, CS_INT n, size_t size, CS_INT *ok) { void *pnew ; - pnew = realloc (p, CS_MAX (n,1) * size) ; /* realloc the block */ + /* realloc the block */ + pnew = SuiteSparse_config_realloc (p, CS_MAX (n,1) * size) ; *ok = (pnew != NULL) ; /* realloc fails if pnew is NULL */ return ((*ok) ? pnew : p) ; /* return original p if failure */ } diff --git a/Example/CMakeLists.txt b/Example/CMakeLists.txt index 15d4081ce1..d55eefce4d 100644 --- a/Example/CMakeLists.txt +++ b/Example/CMakeLists.txt @@ -94,7 +94,7 @@ find_package ( CAMD 3.3.2 REQUIRED ) find_package ( CCOLAMD 3.3.3 REQUIRED ) find_package ( CHOLMOD 5.2.1 REQUIRED ) find_package ( COLAMD 3.3.3 REQUIRED ) -find_package ( CXSparse 4.3.2 REQUIRED ) +find_package ( CXSparse 4.4.0 REQUIRED ) find_package ( GraphBLAS 9.1.0 ) find_package ( KLU 2.3.3 REQUIRED ) find_package ( KLU_CHOLMOD 2.3.3 REQUIRED ) From d7eaad530aa8ba363d8919d92ff656b51b04c08c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Tue, 13 Feb 2024 13:33:39 +0100 Subject: [PATCH 30/98] Use dependabot to periodically check for updated actions. --- .github/dependabot.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..df4d15b35c --- /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" From 4f45fc44d84131d47b4f24cbbc408bb570f1fdf0 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 19 Feb 2024 14:49:24 -0600 Subject: [PATCH 31/98] simpler way to force a BLAS underscore, or force no underscore --- SuiteSparse_config/CMakeLists.txt | 13 +++++-- .../cmake_modules/SuiteSparsePolicy.cmake | 37 ++++++++++++++++++- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/SuiteSparse_config/CMakeLists.txt b/SuiteSparse_config/CMakeLists.txt index 7c06afcb53..314331a2ac 100644 --- a/SuiteSparse_config/CMakeLists.txt +++ b/SuiteSparse_config/CMakeLists.txt @@ -45,12 +45,17 @@ set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} include ( SuiteSparsePolicy ) -if ( SUITESPARSE_HAS_FORTRAN ) - include ( FortranCInterface ) -else ( ) - # No Fortran compiler available or enabled, configuration is not automatic. +if ( ( NOT SUITESPARSE_HAS_FORTRAN ) OR SUITESPARSE_BLAS_UNDERSCORE OR SUITESPARSE_BLAS_NO_UNDERSCORE ) + # No Fortran compiler available or enabled, or either of the + # SUITESPARSE_BLAS_UNDERSCORE or SUITESPARSE_BLAS_NO_UNDERSCORE are set ON: + # configuration is not automatic. set ( FortranCInterface_GLOBAL_MACRO ${SUITESPARSE_C_TO_FORTRAN} ) set ( FortranCInterface_GLOBAL__MACRO ${SUITESPARSE_C_TO_FORTRAN} ) +else ( ) + # A Fortran compiler is available and enabled, and both + # SUITESPARSE_BLAS_UNDERSCORE and SUITESPARSE_BLAS_NO_UNDERSCORE are set to + # their default values (OFF): configure the BLAS automatically. + include ( FortranCInterface ) endif ( ) message ( STATUS "C to Fortran calling protocol: ") diff --git a/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake b/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake index b6b195407c..51d63eada8 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake @@ -72,6 +72,25 @@ # for your system. # Default: ON # +# SUITESPARSE_BLAS_UNDERSCORE: if ON, the SUITESPARSE_C_TO_FORTRAN setting +# is ignored, and the Fortran compiler is also ignored +# even if available and used. The C-to-Fortran +# convention "(name,NAME) name##_" is used, which forces +# the appending of an underscore to the names of the +# BLAS/LAPACK functions (dgemm_ for example). +# Default: OFF +# +# SUITESPARSE_BLAS_NO_UNDERSCORE: if ON and SUITESPARSE_BLAS_UNDERSCORE is +# OFF, the SUITESPARSE_C_TO_FORTRAN setting is ignored, +# and the Fortran compiler is also ignored even if +# available and used. The C-to-Fortran convention +# "(name,NAME) name" is used, which forces NO appending of an +# underscore to the names of the BLAS/LAPACK functions. +# (dgemm for example). Note that if +# SUITESPARSE_BLAS_UNDERSCORE is set to ON, this setting +# is ignored. +# Default: OFF +# # 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 @@ -297,8 +316,22 @@ if ( SUITESPARSE_USE_STRICT AND SUITESPARSE_USE_FORTRAN AND NOT SUITESPARSE_HAS_ message ( FATAL_ERROR "Fortran required for SuiteSparse but not found" ) endif ( ) -# default C-to-Fortran name mangling if Fortran compiler not found -if ( MSVC ) +# C-to-Fortran name mangling +option ( SUITESPARSE_BLAS_UNDERSCORE "OFF (default): do not force an underscore; ON: ignore Fortran and force calls to BLAS to use a trailing underscore (dgemm_)" OFF ) +option ( SUITESPARSE_BLAS_NO_UNDERSCORE "OFF (default): do not force no-underscore; ON: ignore Fortran and force calls to BLAS to NOT use a trailing underscore (dgemm)" OFF ) +if ( SUITESPARSE_BLAS_UNDERSCORE ) + # Ignore the Fortran compiler even if used, also ignore the C compiler, and + # force an underscore to be appended to all calls to BLAS/LAPACK. + # Also force the name to be lowercase (dgemm_ for example). + set ( SUITESPARSE_C_TO_FORTRAN "(name,NAME) name##_" + CACHE STRING "C to Fortan name mangling" FORCE ) +elseif ( SUITESPARSE_BLAS_NO_UNDERSCORE ) + # Ignore the Fortran compiler even if used, also ignore the C compiler, and + # force NO underscore to be appended to all calls to BLAS/LAPACK. + # Also force the name to be lowercase (dgemm for example). + set ( SUITESPARSE_C_TO_FORTRAN "(name,NAME) name" + CACHE STRING "C to Fortan name mangling" FORCE ) +elseif ( MSVC ) # MS Visual Studio Fortran compiler does not mangle the Fortran name set ( SUITESPARSE_C_TO_FORTRAN "(name,NAME) name" CACHE STRING "C to Fortan name mangling" ) From 6e7871656287a27c22554bda39383397ef1e80ab Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 19 Feb 2024 17:02:22 -0600 Subject: [PATCH 32/98] try allowing sizeof(mp_bitcnt_t) < sizeof(int64) --- SPEX/Demo/spex_demos.h | 20 ++++++++++++++++++++ SPEX/SPEX_Utilities/Source/SPEX_initialize.c | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/SPEX/Demo/spex_demos.h b/SPEX/Demo/spex_demos.h index 4ca8c9badb..b2f9b33352 100644 --- a/SPEX/Demo/spex_demos.h +++ b/SPEX/Demo/spex_demos.h @@ -30,6 +30,7 @@ #define SPEX_MIN(a,b) (((a) < (b)) ? (a) : (b)) +#if 0 #define DEMO_INIT(ok) \ if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) \ { \ @@ -47,6 +48,25 @@ fprintf (stderr, "SPEX ERROR: failed to initialize\n") ; \ return (1) ; \ } +#else +#define DEMO_INIT(ok) \ + if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) \ + { \ + /* return 0 so the github CI does not fail */ \ + printf ("SPEX ERROR: GMP configuration not supported:\n") ; \ + printf (" sizeof (mp_bitcnt_t): %d\n", (int) sizeof (mp_bitcnt_t)) ; \ + printf (" sizeof (uint64_t): %d\n", (int) sizeof (uint64_t)) ; \ + printf (" sizeof (mp_bitcnt_t) is too small;\n") ; \ + printf (" it must be >= sizeof (uint64_t)\n" ) ; \ + /* return (0) ; */ \ + } \ + SPEX_info ok = SPEX_initialize ( ) ; \ + if (ok != SPEX_OK) \ + { \ + fprintf (stderr, "SPEX ERROR: failed to initialize\n") ; \ + return (1) ; \ + } +#endif /* Purpose: This processes the command line for user specified options */ SPEX_info spex_demo_process_command_line //processes the command line diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c index 739a1e954c..a54f975226 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c @@ -48,8 +48,8 @@ SPEX_info SPEX_initialize ( void ) // SPEX requires GMP to support bit counts that are 64-bit integers if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) { -// printf ("SPEX ERROR: GMP configuration not supported\n") ; - return (SPEX_PANIC); + printf ("SPEX WARNING: GMP configuration not supported\n") ; +// return (SPEX_PANIC); } // tell GMP and MPFR which memory allocation functions to use From 90d6d527a06855c65c89d4d512b5209074a60ff5 Mon Sep 17 00:00:00 2001 From: whuaegeansea Date: Tue, 20 Feb 2024 21:27:04 +0800 Subject: [PATCH 33/98] Fix SPEX --- SPEX/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index deb943df17..558905fa06 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -54,7 +54,7 @@ if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) 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.3 REQUIRED ) + find_package ( AMD 3.3.2 REQUIRED ) endif ( ) find_package ( COLAMD 3.3.3 From 07842ad337cfddd04f1fc19a2876125867428130 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 10:29:37 -0600 Subject: [PATCH 34/98] SPEx debugging --- .github/workflows/build-arch-emu.yaml | 66 +-- .github/workflows/build.yaml | 141 +---- .github/workflows/codeql-analysis.yaml | 4 +- .github/workflows/macos.yaml | 102 +--- .github/workflows/root-cmakelists.yaml | 155 +----- .github/workflows/save/build-arch-emu.yaml | 247 +++++++++ .github/workflows/save/build.yaml | 506 +++++++++++++++++ .github/workflows/save/codeql-analysis.yaml | 204 +++++++ .github/workflows/save/macos.yaml | 231 ++++++++ .github/workflows/save/root-cmakelists.yaml | 570 ++++++++++++++++++++ SPEX/CMakeLists.txt | 2 +- SPEX/Demo/spex_demos.h | 7 +- 12 files changed, 1802 insertions(+), 433 deletions(-) create mode 100644 .github/workflows/save/build-arch-emu.yaml create mode 100644 .github/workflows/save/build.yaml create mode 100644 .github/workflows/save/codeql-analysis.yaml create mode 100644 .github/workflows/save/macos.yaml create mode 100644 .github/workflows/save/root-cmakelists.yaml diff --git a/.github/workflows/build-arch-emu.yaml b/.github/workflows/build-arch-emu.yaml index 7be4c923d8..196909e6ff 100644 --- a/.github/workflows/build-arch-emu.yaml +++ b/.github/workflows/build-arch-emu.yaml @@ -11,11 +11,11 @@ concurrency: ci-arch-emu-${{ github.ref }} env: # string with name of libraries to be built - BUILD_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX" + BUILD_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" # string with name of libraries to be checked - CHECK_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX" + CHECK_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" # string with name of libraries that are installed - INSTALLED_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX" + INSTALLED_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" jobs: @@ -39,8 +39,8 @@ jobs: include: - arch: x86 ccache-max: 80M - extra-build-libs: ":GraphBLAS:LAGraph" - extra-check-libs: ":GraphBLAS:LAGraph" + extra-build-libs: "" + extra-check-libs: "" - arch: aarch64 ccache-max: 42M - arch: armv7 @@ -58,7 +58,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 # shell: bash - name: install dependencies @@ -94,7 +94,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v3 with: # location of the ccache of the chroot in the root file system path: /home/runner/rootfs/alpine-latest-${{ matrix.arch }}/home/runner/.ccache @@ -164,7 +164,7 @@ jobs: - 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 + uses: actions/cache/save@v3 with: path: /home/runner/rootfs/alpine-latest-${{ matrix.arch }}/home/runner/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -180,25 +180,6 @@ jobs: 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=: @@ -214,34 +195,3 @@ jobs: 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 index 047745d646..73927f1465 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -11,11 +11,11 @@ concurrency: ci-${{ github.ref }} env: # string with name of libraries to be built - BUILD_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" + BUILD_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" # string with name of libraries to be checked - CHECK_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" + CHECK_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" # string with name of libraries that are installed - INSTALLED_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" + INSTALLED_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" jobs: @@ -94,7 +94,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 - name: install dependencies env: @@ -115,7 +115,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v3 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -192,7 +192,7 @@ jobs: - 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 + uses: actions/cache/save@v3 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -207,33 +207,6 @@ jobs: 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}" @@ -248,42 +221,6 @@ jobs: 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 @@ -348,7 +285,7 @@ jobs: msystem: ${{ matrix.msystem }} - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 - name: prepare ccache # create key with human readable timestamp @@ -360,7 +297,7 @@ jobs: - name: restore ccache # Setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v3 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} @@ -425,39 +362,11 @@ jobs: - 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 + uses: actions/cache/save@v3 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}" @@ -472,35 +381,3 @@ jobs: 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 index ec8b1ee459..e8c415a571 100644 --- a/.github/workflows/codeql-analysis.yaml +++ b/.github/workflows/codeql-analysis.yaml @@ -32,7 +32,7 @@ jobs: # group: [other, graph] include: - group: other - build-libs: SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX + build-libs: SuiteSparse_config:AMD:COLAMD:SPEX # - group: graph # build-libs: GraphBLAS:LAGraph @@ -126,7 +126,7 @@ jobs: # group: [other, graph] include: - group: other - build-libs: SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX + build-libs: SuiteSparse_config:AMD:COLAMD:SPEX # - group: graph # build-libs: GraphBLAS:LAGraph diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml index 789761f210..00f6e5e6ca 100644 --- a/.github/workflows/macos.yaml +++ b/.github/workflows/macos.yaml @@ -19,7 +19,7 @@ concurrency: ci-macos-${{ github.ref }} env: # string with name of libraries to be built - BUILD_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" + BUILD_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" jobs: @@ -35,7 +35,7 @@ jobs: sysctl machdep - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 - name: install dependencies # Homebrew's Python conflicts with the Python that comes pre-installed @@ -61,7 +61,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v3 with: path: /Users/runner/Library/Caches/ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -98,93 +98,21 @@ jobs: echo "::endgroup::" done - - name: check_Mongoose - run: | - cd ${GITHUB_WORKSPACE}/Mongoose/build - ctest . - - name: check_AMD run: | cd ${GITHUB_WORKSPACE}/AMD make demos - - name: check_CAMD - run: | - cd ${GITHUB_WORKSPACE}/CAMD - make demos - - name: check_COLAMD run: | cd ${GITHUB_WORKSPACE}/COLAMD make demos - - name: check_CCOLAMD - run: | - cd ${GITHUB_WORKSPACE}/CCOLAMD - make demos - - - name: check_CHOLMOD - run: | - cd ${GITHUB_WORKSPACE}/CHOLMOD - make demos - cd ${GITHUB_WORKSPACE}/CHOLMOD/build - ctest . - - - name: check_CSparse - run: | - cd ${GITHUB_WORKSPACE}/CSparse - make demos - - - name: check_CXSparse - run: | - cd ${GITHUB_WORKSPACE}/CXSparse - make demos - - - name: check_LDL - run: | - cd ${GITHUB_WORKSPACE}/LDL - make demos - - - name: check_KLU - run: | - cd ${GITHUB_WORKSPACE}/KLU - make demos - - - name: check_UMFPACK - run: | - cd ${GITHUB_WORKSPACE}/UMFPACK - make demos - - - name: check_RBio - run: | - cd ${GITHUB_WORKSPACE}/RBio - make demos - - - name: check_SPQR - run: | - cd ${GITHUB_WORKSPACE}/SPQR - make demos - - name: check_SPEX run: | cd ${GITHUB_WORKSPACE}/SPEX make demos - - name: check_GraphBLAS - run: | - cd ${GITHUB_WORKSPACE}/GraphBLAS - make demos - - - name: check_LAGraph - run: | - cd ${GITHUB_WORKSPACE}/LAGraph - make demos - - - name: check_ParU - run: | - cd ${GITHUB_WORKSPACE}/ParU - make demos - - name: ccache status continue-on-error: true run: ccache -s @@ -192,7 +120,7 @@ jobs: - 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 + uses: actions/cache/save@v3 with: path: /Users/runner/Library/Caches/ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -207,25 +135,3 @@ jobs: 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 index bcdcda49a9..e2f05cd4f1 100644 --- a/.github/workflows/root-cmakelists.yaml +++ b/.github/workflows/root-cmakelists.yaml @@ -14,7 +14,7 @@ concurrency: ci-root-cmakelists-${{ github.ref }} env: # string with name of libraries that are installed - INSTALLED_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" + INSTALLED_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" jobs: @@ -80,7 +80,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 - name: install dependencies env: @@ -101,7 +101,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v3 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -135,22 +135,6 @@ jobs: 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 @@ -190,7 +174,7 @@ jobs: - 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 + uses: actions/cache/save@v3 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -206,33 +190,6 @@ jobs: 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}" @@ -247,49 +204,13 @@ jobs: 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 }}) + name: msvc (${{ matrix.openmp }} OpenMP ${{ matrix.cuda }} CUDA, ${{ matrix.link }}) defaults: run: @@ -304,7 +225,6 @@ jobs: openmp: [with, without] cuda: [without] link: [both] - cc: [cl] include: - openmp: without openmp-cmake-flags: "-DSUITESPARSE_USE_OPENMP=OFF" @@ -314,7 +234,6 @@ jobs: -DSUITESPARSE_USE_CUDA=ON -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" link: both - cc: cl - openmp: with cuda: with cuda-cmake-flags: @@ -324,11 +243,6 @@ jobs: 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 @@ -340,15 +254,15 @@ jobs: Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 - - uses: conda-incubator/setup-miniconda@v3 + - uses: conda-incubator/setup-miniconda@v2 with: auto-update-conda: true - name: cache conda packages id: conda-cache - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v3 with: path: C:/Miniconda/envs/test key: conda:msvc @@ -384,7 +298,7 @@ jobs: msystem: UCRT64 - - uses: Jimver/cuda-toolkit@v0.2.14 + - uses: Jimver/cuda-toolkit@v0.2.11 name: install CUDA toolkit if: matrix.cuda == 'with' id: cuda-toolkit @@ -424,18 +338,18 @@ jobs: 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 + echo "key=ccache:msvc:root:${{ 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 + uses: actions/cache/restore@v3 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 }}: + ccache:msvc:root:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }} + ccache:msvc:root:${{ 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. @@ -458,8 +372,6 @@ jobs: 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" \ @@ -501,7 +413,7 @@ jobs: - 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 + uses: actions/cache/save@v3 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} @@ -518,41 +430,6 @@ jobs: 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}" @@ -560,9 +437,7 @@ jobs: 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 }} \ + cmake \ -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake;C:/Miniconda/envs/test/Library;${GITHUB_WORKSPACE}/dependencies" \ .. cmake --build . --config Release diff --git a/.github/workflows/save/build-arch-emu.yaml b/.github/workflows/save/build-arch-emu.yaml new file mode 100644 index 0000000000..7be4c923d8 --- /dev/null +++ b/.github/workflows/save/build-arch-emu.yaml @@ -0,0 +1,247 @@ +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:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX" + # string with name of libraries to be checked + CHECK_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX" + # string with name of libraries that are installed + INSTALLED_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR: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 + extra-build-libs: ":GraphBLAS:LAGraph" + extra-check-libs: ":GraphBLAS:LAGraph" + - 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/save/build.yaml b/.github/workflows/save/build.yaml new file mode 100644 index 0000000000..047745d646 --- /dev/null +++ b/.github/workflows/save/build.yaml @@ -0,0 +1,506 @@ +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:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" + # string with name of libraries to be checked + CHECK_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" + # string with name of libraries that are installed + INSTALLED_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" + + +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 + + matrix: + msystem: [MINGW64, MINGW32, CLANG64, CLANG32] + 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: CLANG64 + target-prefix: mingw-w64-clang-x86_64 + f77-package: mingw-w64-clang-x86_64-fc + - 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/save/codeql-analysis.yaml b/.github/workflows/save/codeql-analysis.yaml new file mode 100644 index 0000000000..ec8b1ee459 --- /dev/null +++ b/.github/workflows/save/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:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX +# - group: graph +# build-libs: GraphBLAS:LAGraph + + name: CodeQL (Ubuntu, ${{ matrix.group }}) + + steps: + - name: checkout repository + uses: actions/checkout@v3 + + - 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@v2 + 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@v2 + 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:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR: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@v3 + + - name: initialize CodeQL + # Initialize the CodeQL tools for scanning. + uses: github/codeql-action/init@v2 + 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@v2 + with: + category: ${{ matrix.group }}-32 diff --git a/.github/workflows/save/macos.yaml b/.github/workflows/save/macos.yaml new file mode 100644 index 0000000000..789761f210 --- /dev/null +++ b/.github/workflows/save/macos.yaml @@ -0,0 +1,231 @@ +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:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" + +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_Mongoose + run: | + cd ${GITHUB_WORKSPACE}/Mongoose/build + ctest . + + - name: check_AMD + run: | + cd ${GITHUB_WORKSPACE}/AMD + make demos + + - name: check_CAMD + run: | + cd ${GITHUB_WORKSPACE}/CAMD + make demos + + - name: check_COLAMD + run: | + cd ${GITHUB_WORKSPACE}/COLAMD + make demos + + - name: check_CCOLAMD + run: | + cd ${GITHUB_WORKSPACE}/CCOLAMD + make demos + + - name: check_CHOLMOD + run: | + cd ${GITHUB_WORKSPACE}/CHOLMOD + make demos + cd ${GITHUB_WORKSPACE}/CHOLMOD/build + ctest . + + - name: check_CSparse + run: | + cd ${GITHUB_WORKSPACE}/CSparse + make demos + + - name: check_CXSparse + run: | + cd ${GITHUB_WORKSPACE}/CXSparse + make demos + + - name: check_LDL + run: | + cd ${GITHUB_WORKSPACE}/LDL + make demos + + - name: check_KLU + run: | + cd ${GITHUB_WORKSPACE}/KLU + make demos + + - name: check_UMFPACK + run: | + cd ${GITHUB_WORKSPACE}/UMFPACK + make demos + + - name: check_RBio + run: | + cd ${GITHUB_WORKSPACE}/RBio + make demos + + - name: check_SPQR + run: | + cd ${GITHUB_WORKSPACE}/SPQR + make demos + + - name: check_SPEX + run: | + cd ${GITHUB_WORKSPACE}/SPEX + make demos + + - name: check_GraphBLAS + run: | + cd ${GITHUB_WORKSPACE}/GraphBLAS + make demos + + - name: check_LAGraph + run: | + cd ${GITHUB_WORKSPACE}/LAGraph + make demos + + - name: check_ParU + run: | + cd ${GITHUB_WORKSPACE}/ParU + 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/save/root-cmakelists.yaml b/.github/workflows/save/root-cmakelists.yaml new file mode 100644 index 0000000000..bcdcda49a9 --- /dev/null +++ b/.github/workflows/save/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:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" + +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@v3 + 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/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index deb943df17..558905fa06 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -54,7 +54,7 @@ if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) 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.3 REQUIRED ) + find_package ( AMD 3.3.2 REQUIRED ) endif ( ) find_package ( COLAMD 3.3.3 diff --git a/SPEX/Demo/spex_demos.h b/SPEX/Demo/spex_demos.h index b2f9b33352..8efd8722d6 100644 --- a/SPEX/Demo/spex_demos.h +++ b/SPEX/Demo/spex_demos.h @@ -54,10 +54,13 @@ { \ /* return 0 so the github CI does not fail */ \ printf ("SPEX ERROR: GMP configuration not supported:\n") ; \ - printf (" sizeof (mp_bitcnt_t): %d\n", (int) sizeof (mp_bitcnt_t)) ; \ - printf (" sizeof (uint64_t): %d\n", (int) sizeof (uint64_t)) ; \ printf (" sizeof (mp_bitcnt_t) is too small;\n") ; \ printf (" it must be >= sizeof (uint64_t)\n" ) ; \ + } \ + { \ + printf (" sizeof (mp_bitcnt_t): %d\n", (int) sizeof (mp_bitcnt_t)) ; \ + printf (" sizeof (uint64_t): %d\n", (int) sizeof (uint64_t)) ; \ + printf (" sizeof (void *): %d\n", (int) sizeof (void *)) ; \ /* return (0) ; */ \ } \ SPEX_info ok = SPEX_initialize ( ) ; \ From 00a8335ad1896d20ca79358ded3605f7da545999 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 10:40:14 -0600 Subject: [PATCH 35/98] spex debug --- Makefile | 150 +----------------- SPEX/SPEX_Backslash/Source/SPEX_backslash.c | 15 ++ .../Source/SPEX_cholesky_backslash.c | 10 ++ .../Source/spex_util_internal.h | 12 ++ 4 files changed, 38 insertions(+), 149 deletions(-) diff --git a/Makefile b/Makefile index 0b1d0d81d6..743f07a884 100644 --- a/Makefile +++ b/Makefile @@ -31,21 +31,6 @@ library: ( cd AMD && $(MAKE) ) ( cd COLAMD && $(MAKE) ) ( cd SPEX && $(MAKE) ) - ( cd Mongoose && $(MAKE) ) - ( cd BTF && $(MAKE) ) - ( cd CAMD && $(MAKE) ) - ( cd CCOLAMD && $(MAKE) ) - ( cd CHOLMOD && $(MAKE) ) - ( cd CSparse && $(MAKE) ) - ( cd CXSparse && $(MAKE) ) - ( cd LDL && $(MAKE) ) - ( cd KLU && $(MAKE) ) - ( cd UMFPACK && $(MAKE) ) - ( cd ParU && $(MAKE) ) - ( cd RBio && $(MAKE) ) - ( cd SPQR && $(MAKE) ) - ( cd GraphBLAS && $(MAKE) ) - ( cd LAGraph && $(MAKE) ) # compile; "make install" only in SuiteSparse/lib and SuiteSparse/include local: @@ -53,22 +38,6 @@ local: ( cd AMD && $(MAKE) local ) ( cd COLAMD && $(MAKE) local ) ( cd SPEX && $(MAKE) local ) - ( cd Mongoose && $(MAKE) local ) - ( cd BTF && $(MAKE) local ) - ( cd CAMD && $(MAKE) local ) - ( cd CCOLAMD && $(MAKE) local ) - ( cd CHOLMOD && $(MAKE) local ) - ( cd CSparse && $(MAKE) ) -# CSparse is compiled but not installed - ( cd CXSparse && $(MAKE) local ) - ( cd LDL && $(MAKE) local ) - ( cd KLU && $(MAKE) local ) - ( cd UMFPACK && $(MAKE) local ) - ( cd ParU && $(MAKE) local ) - ( cd RBio && $(MAKE) local ) - ( cd SPQR && $(MAKE) local ) - ( cd GraphBLAS && $(MAKE) local ) - ( cd LAGraph && $(MAKE) local ) # compile; "sudo make install" will install only in /usr/local # (or whatever your CMAKE_INSTALL_PREFIX is) @@ -77,22 +46,6 @@ global: ( cd AMD && $(MAKE) global ) ( cd COLAMD && $(MAKE) global ) ( cd SPEX && $(MAKE) global ) - ( cd Mongoose && $(MAKE) global ) - ( cd BTF && $(MAKE) global ) - ( cd CAMD && $(MAKE) global ) - ( cd CCOLAMD && $(MAKE) global ) - ( cd CHOLMOD && $(MAKE) global ) - ( cd CSparse && $(MAKE) ) -# CSparse is compiled but not installed - ( cd CXSparse && $(MAKE) global ) - ( cd LDL && $(MAKE) global ) - ( cd KLU && $(MAKE) global ) - ( cd UMFPACK && $(MAKE) global ) - ( cd ParU && $(MAKE) global ) - ( cd RBio && $(MAKE) global ) - ( cd SPQR && $(MAKE) global ) - ( cd GraphBLAS && $(MAKE) global ) - ( cd LAGraph && $(MAKE) global ) # install all packages. Location depends on prior "make", "make global" etc install: @@ -100,21 +53,6 @@ install: ( cd AMD && $(MAKE) install ) ( cd COLAMD && $(MAKE) install ) ( cd SPEX && $(MAKE) install ) - ( cd Mongoose && $(MAKE) install ) - ( cd BTF && $(MAKE) install ) - ( cd CAMD && $(MAKE) install ) - ( cd CCOLAMD && $(MAKE) install ) - ( cd CHOLMOD && $(MAKE) install ) - ( cd CXSparse && $(MAKE) install ) -# CXSparse is installed instead - ( cd LDL && $(MAKE) install ) - ( cd KLU && $(MAKE) install ) - ( cd UMFPACK && $(MAKE) install ) - ( cd ParU && $(MAKE) install ) - ( cd RBio && $(MAKE) install ) - ( cd SPQR && $(MAKE) install ) - ( cd GraphBLAS && $(MAKE) install ) - ( cd LAGraph && $(MAKE) install ) # uninstall all packages uninstall: @@ -122,20 +60,6 @@ uninstall: ( cd AMD && $(MAKE) uninstall ) ( cd COLAMD && $(MAKE) uninstall ) ( cd SPEX && $(MAKE) uninstall ) - ( cd Mongoose && $(MAKE) uninstall ) - ( cd CAMD && $(MAKE) uninstall ) - ( cd BTF && $(MAKE) uninstall ) - ( cd KLU && $(MAKE) uninstall ) - ( cd LDL && $(MAKE) uninstall ) - ( cd CCOLAMD && $(MAKE) uninstall ) - ( cd ParU && $(MAKE) uninstall ) - ( cd UMFPACK && $(MAKE) uninstall ) - ( cd CHOLMOD && $(MAKE) uninstall ) - ( cd CXSparse && $(MAKE) uninstall ) - ( cd RBio && $(MAKE) uninstall ) - ( cd SPQR && $(MAKE) uninstall ) - ( cd GraphBLAS && $(MAKE) uninstall ) - ( cd LAGraph && $(MAKE) uninstall ) # Remove all files not in the original distribution distclean: purge @@ -146,25 +70,8 @@ purge: - ( cd AMD && $(MAKE) purge ) - ( cd COLAMD && $(MAKE) purge ) - ( cd SPEX && $(MAKE) purge ) - - ( cd Mongoose && $(MAKE) purge ) - - ( cd CAMD && $(MAKE) purge ) - - ( cd BTF && $(MAKE) purge ) - - ( cd KLU && $(MAKE) purge ) - - ( cd LDL && $(MAKE) purge ) - - ( cd CCOLAMD && $(MAKE) purge ) - - ( cd UMFPACK && $(MAKE) purge ) - - ( cd CHOLMOD && $(MAKE) purge ) - - ( cd CSparse && $(MAKE) purge ) - - ( cd CXSparse && $(MAKE) purge ) - - ( cd RBio && $(MAKE) purge ) - - ( cd SPQR && $(MAKE) purge ) - - $(RM) MATLAB_Tools/*/*.mex* MATLAB_Tools/*/*/*.mex* - - $(RM) MATLAB_Tools/*/*.o MATLAB_Tools/*/*/*.o - - $(RM) -r Example/build/* - - ( cd GraphBLAS && $(MAKE) purge ) - - ( cd ParU && $(MAKE) purge ) - - ( cd LAGraph && $(MAKE) purge ) - $(RM) -r include/* bin/* lib/* + - $(RM) README.md clean: purge @@ -174,78 +81,23 @@ demos: - ( cd AMD && $(MAKE) demos ) - ( cd COLAMD && $(MAKE) demos ) - ( cd SPEX && $(MAKE) demos ) - - ( cd Mongoose && $(MAKE) demos ) - - ( cd CAMD && $(MAKE) demos ) - - ( cd BTF && $(MAKE) demos ) - - ( cd KLU && $(MAKE) demos ) - - ( cd LDL && $(MAKE) demos ) - - ( cd CCOLAMD && $(MAKE) demos ) - - ( cd UMFPACK && $(MAKE) demos ) - - ( cd CHOLMOD && $(MAKE) demos ) - - ( cd CSparse && $(MAKE) demos ) - - ( cd CXSparse && $(MAKE) demos ) - - ( cd RBio && $(MAKE) demos ) - - ( cd SPQR && $(MAKE) demos ) - - ( cd GraphBLAS && $(MAKE) demos ) - - ( cd ParU && $(MAKE) demos ) - - ( cd LAGraph && $(MAKE) demos ) # Create the PDF documentation docs: - ( cd GraphBLAS && $(MAKE) docs ) - ( cd Mongoose && $(MAKE) docs ) ( cd AMD && $(MAKE) docs ) - ( cd CAMD && $(MAKE) docs ) - ( cd KLU && $(MAKE) docs ) - ( cd LDL && $(MAKE) docs ) - ( cd UMFPACK && $(MAKE) docs ) - ( cd CHOLMOD && $(MAKE) docs ) - ( cd ParU && $(MAKE) docs ) - ( cd SPQR && $(MAKE) docs ) ( cd SPEX && $(MAKE) docs ) # statement coverage (Linux only); this requires a lot of time. cov: local install - ( cd CXSparse && $(MAKE) cov ) - ( cd CSparse && $(MAKE) cov ) - ( cd CHOLMOD && $(MAKE) cov ) - ( cd KLU && $(MAKE) cov ) - ( cd SPQR && $(MAKE) cov ) - ( cd UMFPACK && $(MAKE) cov ) ( cd SPEX && $(MAKE) cov ) - ( cd LAGraph && $(MAKE) cov ) - -gbmatlab: - ( cd GraphBLAS/GraphBLAS && $(MAKE) ) - -gblocal: - ( cd GraphBLAS/GraphBLAS && $(MAKE) local && $(MAKE) install ) debug: ( cd SuiteSparse_config && $(MAKE) debug ) - # ( cd Mongoose && $(MAKE) debug ) ( cd AMD && $(MAKE) debug ) - ( cd BTF && $(MAKE) debug ) - ( cd CAMD && $(MAKE) debug ) - ( cd CCOLAMD && $(MAKE) debug ) ( cd COLAMD && $(MAKE) debug ) - ( cd CHOLMOD && $(MAKE) debug ) - ( cd CSparse && $(MAKE) debug ) - ( cd CXSparse && $(MAKE) debug ) - ( cd LDL && $(MAKE) debug ) - ( cd KLU && $(MAKE) debug ) - ( cd UMFPACK && $(MAKE) debug ) - ( cd ParU && $(MAKE) debug ) - ( cd RBio && $(MAKE) debug ) - ( cd SPQR && $(MAKE) debug ) ( cd SPEX && $(MAKE) debug ) - ( cd GraphBLAS && $(MAKE) cdebug ) - ( cd LAGraph && $(MAKE) debug ) tests: - ( cd Mongoose && $(MAKE) test ) - ( cd CHOLMOD && $(MAKE) test ) - ( cd LAGraph && $(MAKE) test ) test: tests diff --git a/SPEX/SPEX_Backslash/Source/SPEX_backslash.c b/SPEX/SPEX_Backslash/Source/SPEX_backslash.c index 76433e5082..23d69ed09e 100644 --- a/SPEX/SPEX_Backslash/Source/SPEX_backslash.c +++ b/SPEX/SPEX_Backslash/Source/SPEX_backslash.c @@ -47,6 +47,7 @@ SPEX_info SPEX_backslash SPEX_options option // Command options (NULL: means use defaults) ) { +HERE SPEX_info info; // Check inputs @@ -79,6 +80,8 @@ SPEX_info SPEX_backslash return SPEX_OUT_OF_MEMORY; } +HERE + if (option != NULL) { // IF the options are not NULL, copy the important parts. @@ -90,6 +93,7 @@ SPEX_info SPEX_backslash // Declare output SPEX_matrix x = NULL; +HERE // Attempt a Cholesky factorization of A. // If Cholesky is occuring, we update the option @@ -97,6 +101,7 @@ SPEX_info SPEX_backslash backslash_options->order = SPEX_AMD; backslash_options->pivot = SPEX_DIAGONAL; +HERE // Try SPEX Cholesky. The output for this function // is either: // SPEX_OK: Cholesky success, x is the exact solution @@ -104,6 +109,7 @@ SPEX_info SPEX_backslash // A is not SPD. In this case, we try LU // Other error code: Some error. Return the error code and exit info = SPEX_cholesky_backslash(&x, type, A, b, backslash_options); +HERE if (info == SPEX_OK) { // Cholesky was successful. Set x_handle = x @@ -112,10 +118,12 @@ SPEX_info SPEX_backslash // x_handle contains the exact solution of Ax = b and is // stored in the user desired type. Now, we exit and return ok SPEX_FREE(backslash_options); +HERE return SPEX_OK; } else if (info == SPEX_NOTSPD) { +HERE // Cholesky factorization failed. Must try // LU factorization now @@ -129,6 +137,7 @@ SPEX_info SPEX_backslash // Other error code: Some error. Return the error // code and exit info = SPEX_lu_backslash(&x, type, A, b, backslash_options); +HERE if (info == SPEX_OK) { // LU success, set x_handle = x @@ -137,6 +146,7 @@ SPEX_info SPEX_backslash // x_handle contains the exact solution of Ax = b and is // stored in the user desired type. Now, we exit and return ok SPEX_FREE(backslash_options); +HERE return SPEX_OK; } else @@ -146,18 +156,23 @@ SPEX_info SPEX_backslash // Note that, because LU failed, x_handle is still // NULL so there is no potential for a memory leak here SPEX_FREE(backslash_options); +HERE return info; } +HERE } else { +HERE // Cholesky failed, but not due to a SPEX_NOTSPD // error code. Most likely invalid input or out of // memory condition. // Note that since Cholesky failed, x_handle is still NULL // so there is no potential for a memory leak here SPEX_FREE(backslash_options); +HERE return info; } +HERE } diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c index 575812b01a..93e3177ddf 100644 --- a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c @@ -61,6 +61,7 @@ SPEX_info SPEX_cholesky_backslash const SPEX_options option // Command options (Default if NULL) ) { +HERE SPEX_info info; // SPEX must be initialized @@ -111,9 +112,11 @@ SPEX_info SPEX_cholesky_backslash bool is_symmetric ; SPEX_CHECK( SPEX_determine_symmetry(&is_symmetric, A, option) ); +HERE if (!is_symmetric) { SPEX_FREE_WORKSPACE ; +HERE return SPEX_NOTSPD ; } @@ -122,6 +125,7 @@ SPEX_info SPEX_cholesky_backslash //-------------------------------------------------------------------------- SPEX_CHECK( spex_cholesky_preorder(&S, A, option) ); +HERE //-------------------------------------------------------------------------- // Permute matrix A, that is apply the row/column ordering from the @@ -129,12 +133,14 @@ SPEX_info SPEX_cholesky_backslash //-------------------------------------------------------------------------- SPEX_CHECK( spex_cholesky_permute_A(&PAP, A, true, S) ); +HERE //-------------------------------------------------------------------------- // Symbolic Analysis: compute the elimination tree of PAP //-------------------------------------------------------------------------- SPEX_CHECK( spex_cholesky_symbolic_analysis(S, PAP, option) ); +HERE //-------------------------------------------------------------------------- // Factorization: Perform the REF Cholesky factorization of PAP. @@ -143,6 +149,7 @@ SPEX_info SPEX_cholesky_backslash //-------------------------------------------------------------------------- SPEX_CHECK( spex_cholesky_factor(&F, S, PAP, option) ); +HERE //-------------------------------------------------------------------------- // Solve: Solve Ax = b using the REF Cholesky factorization. That is, @@ -152,6 +159,7 @@ SPEX_info SPEX_cholesky_backslash //-------------------------------------------------------------------------- SPEX_CHECK( SPEX_cholesky_solve(&x, F, b, option) ); +HERE //-------------------------------------------------------------------------- // At this point x is stored as mpq_t. If the user desires the output @@ -170,11 +178,13 @@ SPEX_info SPEX_cholesky_backslash (*x_handle) = x2; SPEX_matrix_free (&x, NULL); } +HERE //-------------------------------------------------------------------------- // Free all workspace and return success //-------------------------------------------------------------------------- SPEX_FREE_WORKSPACE; +HERE return SPEX_OK; } diff --git a/SPEX/SPEX_Utilities/Source/spex_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index 3c5fa3c45b..0d30ab6ffd 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -598,5 +598,17 @@ SPEX_info spex_amd // 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) +//------------------------------------------------------------------------------ +// debugging +//------------------------------------------------------------------------------ + +#define HERE \ +{ \ + printf ("HERE: %4d %s\n", __LINE__, __FILE__) ; \ + fprintf (stderr, "HERE: %4d %s\n", __LINE__, __FILE__) ; \ + fflush (stdout) ; \ + fflush (stderr) ; \ +} + #endif From e8dbdbd5c9cb6303b47cdd282329be2fb0bca3d9 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 10:45:53 -0600 Subject: [PATCH 36/98] . --- CMakeLists.txt | 2 +- SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8bee05191b..f85012446c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,7 @@ set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} # lower-case list of all projects that can be built by this root CMake file set ( SUITESPARSE_ALL_PROJECTS - "suitesparse_config;mongoose;amd;btf;camd;ccolamd;colamd;cholmod;cxsparse;ldl;klu;umfpack;paru;rbio;spqr;spex;graphblas;lagraph" ) + "suitesparse_config;amd;;colamd;spex" ) # lower-case list of extra projects that can be built by this root CMake file set ( SUITESPARSE_EXTRA_PROJECTS diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c index e899145edf..cf1960795b 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c @@ -69,6 +69,7 @@ SPEX_info spex_cholesky_factor // reminder of the appropriate data types ASSERT(A->type == SPEX_MPZ); ASSERT(A->kind == SPEX_CSC); +HERE // Number of nonzeros in A int64_t anz; @@ -76,6 +77,7 @@ SPEX_info spex_cholesky_factor ASSERT(anz > 0); (*F_handle) = NULL ; +HERE //-------------------------------------------------------------------------- // Declare and initialize workspace @@ -86,6 +88,7 @@ SPEX_info spex_cholesky_factor // Allocate memory for the factorization F = (SPEX_factorization) SPEX_calloc(1, sizeof(SPEX_factorization_struct)); +HERE if (F == NULL) return SPEX_OUT_OF_MEMORY; // set factorization kind @@ -94,17 +97,20 @@ SPEX_info spex_cholesky_factor // Allocate and set scale_for_A SPEX_MPQ_INIT(F->scale_for_A); SPEX_MPQ_SET(F->scale_for_A, A->scale); +HERE // Inverse pivot ordering F->Pinv_perm = (int64_t*) SPEX_malloc ( n*sizeof(int64_t) ); // row/column permutation, to be copied from S->P_perm F->P_perm = (int64_t*) SPEX_malloc ( n*sizeof(int64_t) ); +HERE if (!(F->Pinv_perm) || !(F->P_perm)) { // out of memory: free everything and return SPEX_FREE_ALL; return SPEX_OUT_OF_MEMORY; } +HERE // Copy row/column permutation from symbolic analysis to factorization memcpy(F->P_perm, S->P_perm, n*sizeof(int64_t)); @@ -114,18 +120,23 @@ SPEX_info spex_cholesky_factor // factorization: up-looking or left-looking //-------------------------------------------------------------------------- +HERE SPEX_factorization_algorithm algo = SPEX_OPTION_ALGORITHM(option); switch(algo) { case SPEX_ALGORITHM_DEFAULT: // fall through to up-looking Cholesky (the default) case SPEX_CHOL_UP: +HERE SPEX_CHECK( spex_cholesky_up_factor(&(F->L), &(F->rhos), S, A, option)); +HERE break; case SPEX_CHOL_LEFT: +HERE SPEX_CHECK( spex_cholesky_left_factor(&(F->L), &(F->rhos), S, A, option) ); +HERE break; default: SPEX_FREE_ALL; @@ -137,5 +148,6 @@ SPEX_info spex_cholesky_factor //-------------------------------------------------------------------------- (*F_handle) = F ; +HERE return SPEX_OK; } From d65d987ea9c513bed168a25d798e417f9c2ffae3 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 10:47:19 -0600 Subject: [PATCH 37/98] . --- .../SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c index 52836c3fb2..90a0987f66 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c @@ -53,6 +53,7 @@ SPEX_info spex_cholesky_symbolic_analysis { SPEX_info info; +HERE //-------------------------------------------------------------------------- // Check inputs @@ -69,25 +70,31 @@ SPEX_info spex_cholesky_symbolic_analysis int64_t *c = NULL; // Obtain elimination tree of A +HERE SPEX_CHECK( spex_cholesky_etree(&S->parent, A) ); // Postorder the elimination tree of A +HERE SPEX_CHECK( spex_cholesky_post(&post, S->parent, n) ); // Get the column counts of A SPEX_CHECK( spex_cholesky_counts(&c, A, S->parent, post) ); +HERE // Set the column pointers of L S->cp = (int64_t*) SPEX_malloc( (n+1)*sizeof(int64_t*)); +HERE if (S->cp == NULL) { SPEX_FREE_ALL; return SPEX_OUT_OF_MEMORY; } SPEX_CHECK( spex_cumsum(S->cp, c, n)); +HERE // Set the exact number of nonzeros in L S->lnz = S->cp[n]; SPEX_FREE_WORKSPACE; +HERE return SPEX_OK; } From f6fde1cad3b4b93c6eebdcf99b44894b3895dfe0 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 10:54:55 -0600 Subject: [PATCH 38/98] . --- .../Source/spex_cholesky_up_factor.c | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c index a223426ca0..492fe8743c 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c @@ -66,6 +66,7 @@ SPEX_info spex_cholesky_up_factor const SPEX_options option // command options ) { +HERE //-------------------------------------------------------------------------- // check inputs @@ -79,6 +80,7 @@ SPEX_info spex_cholesky_up_factor ASSERT (rhos_handle != NULL); (*L_handle) = NULL ; (*rhos_handle) = NULL ; +HERE //-------------------------------------------------------------------------- // Declare and initialize workspace @@ -97,17 +99,20 @@ SPEX_info spex_cholesky_up_factor size_t size; c = (int64_t*) SPEX_malloc(n*sizeof(int64_t)); +HERE // h is the history vector utilized for the sparse REF // triangular solve algorithm. h serves as a global // vector which is repeatedly passed into the triangular // solve algorithm h = (int64_t*) SPEX_malloc(n*sizeof(int64_t)); +HERE // xi serves as a global nonzero pattern vector. It stores // the pattern of nonzeros of the kth column of L // for the triangular solve. xi = (int64_t*) SPEX_malloc(2*n*sizeof(int64_t)); +HERE if (!h || !xi || !c) { @@ -120,6 +125,7 @@ SPEX_info spex_cholesky_up_factor { h[i] = -1; } +HERE //-------------------------------------------------------------------------- // Allocate and initialize the workspace x @@ -149,12 +155,15 @@ SPEX_info spex_cholesky_up_factor // default size) SPEX_CHECK (SPEX_matrix_allocate(&x, SPEX_DENSE, SPEX_MPZ, n, 1, n, false, /* do not initialize the entries of x: */ false, option)); +HERE // Create rhos, a "global" dense mpz_t matrix of dimension n*1. // As indicated with the second boolean parameter true, the mpz entries in // rhos are initialized to the default size (unlike x). SPEX_CHECK (SPEX_matrix_allocate(&(rhos), SPEX_DENSE, SPEX_MPZ, n, 1, n, false, true, option)); +HERE + printf ("estimate: % " PRId64"\n", estimate) ; // initialize the entries of x for (i = 0; i < n; i++) @@ -162,6 +171,7 @@ SPEX_info spex_cholesky_up_factor // Allocate memory for entries of x to be estimate bits SPEX_MPZ_INIT2(x->x.mpz[i], estimate); } +HERE //-------------------------------------------------------------------------- // Declare memory for L @@ -175,12 +185,14 @@ SPEX_info spex_cholesky_up_factor SPEX_CHECK(SPEX_matrix_allocate(&(L), SPEX_CSC, SPEX_MPZ, n, n, S->lnz, false, false, option)); +HERE // Set the column pointers of L for (k = 0; k < n; k++) { L->p[k] = c[k] = S->cp[k]; } +HERE //-------------------------------------------------------------------------- @@ -191,16 +203,20 @@ SPEX_info spex_cholesky_up_factor // Iterations 0:n-1 (1:n in standard) //-------------------------------------------------------------------------- SPEX_MPZ_SGN(&prev_sgn, x->x.mpz[0]); +HERE for (k = 0; k < n; k++) { // LDx = A(:,k) +HERE SPEX_CHECK(spex_cholesky_up_triangular_solve(&top, xi, x, L, A, k, S->parent, c, rhos, h)); +HERE // If x[k] is nonzero choose it as pivot. Otherwise, the matrix is // not SPD (indeed, it may even be singular). SPEX_MPZ_SGN(&sgn, x->x.mpz[k]); +HERE if (sgn != 0) { SPEX_MPZ_SET(rhos->x.mpz[k], x->x.mpz[k]); @@ -208,9 +224,11 @@ SPEX_info spex_cholesky_up_factor else { // A is not symmetric positive definite +HERE SPEX_FREE_ALL; return SPEX_NOTSPD; } +HERE //---------------------------------------------------------------------- // Add the nonzeros (i.e. x) to L @@ -218,6 +236,7 @@ SPEX_info spex_cholesky_up_factor int64_t p = 0; for (j = top; j < n; j++) { +HERE // Obtain the row index of x[j] jnew = xi[j]; if (jnew == k) continue; @@ -228,25 +247,34 @@ SPEX_info spex_cholesky_up_factor // Place the i index of this nonzero. Should always be k because at // iteration k, the up-looking algorithm computes row k of L L->i[p] = k; +HERE // Find the number of bits of x[j] size = mpz_sizeinbase(x->x.mpz[jnew],2); +HERE // GMP manual: Allocated size should be size+2 SPEX_MPZ_INIT2(L->x.mpz[p], size+2); +HERE // Place the x value of this nonzero SPEX_MPZ_SET(L->x.mpz[p],x->x.mpz[jnew]); +HERE } // Now, place L(k,k) p = c[k]++; L->i[p] = k; +HERE size = mpz_sizeinbase(x->x.mpz[k], 2); +HERE SPEX_MPZ_INIT2(L->x.mpz[p], size+2); +HERE SPEX_MPZ_SET(L->x.mpz[p], x->x.mpz[k]); +HERE } // Finalize L->p L->p[n] = S->lnz; +HERE //-------------------------------------------------------------------------- // Free memory and set output @@ -255,5 +283,6 @@ SPEX_info spex_cholesky_up_factor (*L_handle) = L; (*rhos_handle) = rhos; SPEX_FREE_WORKSPACE; +HERE return SPEX_OK; } From eb090ec72e17404d5704f84957864e07f2124c24 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 10:57:37 -0600 Subject: [PATCH 39/98] . --- SPEX/SPEX_Utilities/Source/spex_util_internal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SPEX/SPEX_Utilities/Source/spex_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index 0d30ab6ffd..fdb80cb428 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -604,7 +604,7 @@ SPEX_info spex_amd #define HERE \ { \ - printf ("HERE: %4d %s\n", __LINE__, __FILE__) ; \ + printf ("here: %4d %s\n", __LINE__, __FILE__) ; \ fprintf (stderr, "HERE: %4d %s\n", __LINE__, __FILE__) ; \ fflush (stdout) ; \ fflush (stderr) ; \ From 77f83eb8c824cb2ae9e121617daf897bb4ca6607 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 11:02:51 -0600 Subject: [PATCH 40/98] . --- .../spex_cholesky_up_triangular_solve.c | 36 +++++++++++++++++++ .../Source/spex_util_internal.h | 4 +-- 2 files changed, 38 insertions(+), 2 deletions(-) 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 79c5e0bf03..1603e0b1cd 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -91,6 +91,7 @@ SPEX_info spex_cholesky_up_triangular_solve ASSERT(rhos->type == SPEX_MPZ); ASSERT(rhos->kind == SPEX_DENSE); +HERE int64_t j, i, p, m, top, n = A->n; int sgn; @@ -104,15 +105,18 @@ SPEX_info spex_cholesky_up_triangular_solve // elimination tree of A. The indices of these nonzeros are stored in // xi[top..n-1] SPEX_CHECK(spex_cholesky_ereach(&top, xi, A, k, parent, c)); +HERE // Sort the nonzero pattern using quicksort (required by IPGE unlike in GE) qsort(&xi[top], n-top, sizeof(int64_t*), compare); +HERE // 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); } +HERE // Reset value of x[k]. If the matrix is nonsingular, x[k] will // be a part of the nonzero pattern and reset in the above loop. @@ -120,12 +124,14 @@ SPEX_info spex_cholesky_up_triangular_solve // will be nonzero from a previous iteration. Thus, here we reset // x[k] to account for this extremely rare case. SPEX_MPZ_SET_UI(x->x.mpz[k],0); +HERE // Reset h[i] = -1 for all i in nonzero pattern for (i = top; i < n; i++) { h[xi[i]] = -1; } +HERE // Set x = A(:,k) // Note: The if is needed since the columns of A are allowed to be unsorted. @@ -136,6 +142,7 @@ SPEX_info spex_cholesky_up_triangular_solve SPEX_MPZ_SET(x->x.mpz[A->i[i]], A->x.mpz[i]); } } +HERE //-------------------------------------------------------------------------- // Perform the REF Triangular Solve. Note that, unlike the left-looking @@ -145,9 +152,11 @@ SPEX_info spex_cholesky_up_triangular_solve //-------------------------------------------------------------------------- for (p = top; p < n; p++) { +HERE // Obtain the index of the current nonzero j = xi[p]; SPEX_MPZ_SGN(&sgn, x->x.mpz[j]); +HERE if (sgn == 0) continue; // If x[j] == 0 no work must be done // Initial history update to finalize x[j] if necessary @@ -155,13 +164,16 @@ SPEX_info spex_cholesky_up_triangular_solve { // History update x[j]: x[j] = x[j]*rhos[j-1]/rhos[h[j]] // x[j] = x[j]*rhos[j-1] +HERE SPEX_MPZ_MUL(x->x.mpz[j], x->x.mpz[j], rhos->x.mpz[j-1]); +HERE if (h[j] > -1) { // x[j] = x[j] / rhos [ h[j] ] SPEX_MPZ_DIVEXACT(x->x.mpz[j], x->x.mpz[j], rhos->x.mpz[h[j]]); +HERE } } @@ -171,30 +183,37 @@ SPEX_info spex_cholesky_up_triangular_solve // ----------- Iterate accross nonzeros in Lij --------------------- for (m = L->p[j]+1; m < c[j]; m++) { +HERE i = L->i[m]; // i value of Lij if (i > j && i < k) // Update all dependent x[i] excluding x[k] { +HERE /*************** If lij==0 then no update******************/ SPEX_MPZ_SGN(&sgn, L->x.mpz[m]); if (sgn == 0) continue; +HERE //---------------------------------------------------------- /************* lij is nonzero, x[i] is zero****************/ // x[i] = 0 then only perform IPGE update subtraction/division //---------------------------------------------------------- SPEX_MPZ_SGN(&sgn, x->x.mpz[i]); +HERE if (sgn == 0) { // First, get the correct value of x[i] = 0 - lij * x[j] SPEX_MPZ_MUL(x->x.mpz[i], L->x.mpz[m], x->x.mpz[j]); +HERE SPEX_MPZ_NEG(x->x.mpz[i],x->x.mpz[i]); +HERE // Do a division by the pivot if necessary. if (j >= 1) { // x[i] = x[i] / rho[j-1] SPEX_MPZ_DIVEXACT(x->x.mpz[i], x->x.mpz[i], rhos->x.mpz[j-1]); +HERE } // Update the history value of x[i] h[i] = j; @@ -207,15 +226,18 @@ SPEX_info spex_cholesky_up_triangular_solve //---------------------------------------------------------- else { +HERE // There is no previous pivot if (j < 1) { // History update x[i] = x[i]*rhos[0] SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[0]); +HERE // x[i] = x[i] - lij x[j] SPEX_MPZ_SUBMUL(x->x.mpz[i], L->x.mpz[m], x->x.mpz[j]); +HERE // Update the history value of x[i] h[i] = j; } @@ -228,6 +250,7 @@ SPEX_info spex_cholesky_up_triangular_solve // x[i] = x[i] * rhos[j-1] SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[j-1]); +HERE // Divide by the history pivot only if the history // pivot is not the rho[-1] (which equals 1) (rho[0] // in the 1-based logic of othe IPGE algorithm) @@ -236,6 +259,7 @@ SPEX_info spex_cholesky_up_triangular_solve // x[i] = x[i] / rho[h[i]] SPEX_MPZ_DIVEXACT(x->x.mpz[i], x->x.mpz[i],rhos->x.mpz[h[i]]); +HERE } } // ---- IPGE Update : @@ -243,12 +267,15 @@ SPEX_info spex_cholesky_up_triangular_solve // x[i] = x[i]*rhos[j] SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[j]); +HERE // x[i] = x[i] - lij*xj SPEX_MPZ_SUBMUL(x->x.mpz[i], L->x.mpz[m], x->x.mpz[j]); +HERE // x[i] = x[i] / rho[j-1] SPEX_MPZ_DIVEXACT(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[j-1]); +HERE // Entry is up to date; h[i] = j; } @@ -258,8 +285,10 @@ SPEX_info spex_cholesky_up_triangular_solve // ------ History Update x[k] if necessary ----- if (h[k] < j - 1) { +HERE // x[k] = x[k] * rho[j-1] SPEX_MPZ_MUL(x->x.mpz[k],x->x.mpz[k],rhos->x.mpz[j-1]); +HERE // Divide by the history pivot only if the history pivot is not the // rho[-1] (which equals 1) (rho[0] in the 1-based logic of the // IPGE algorithm) @@ -268,19 +297,23 @@ SPEX_info spex_cholesky_up_triangular_solve // x[k] = x[k] / rho[h[k]] SPEX_MPZ_DIVEXACT(x->x.mpz[k],x->x.mpz[k], rhos->x.mpz[h[k]]); +HERE } } // ---- 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]); +HERE // x[k] = x[k] - xj*xj SPEX_MPZ_SUBMUL(x->x.mpz[k], x->x.mpz[j], x->x.mpz[j]); +HERE // 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]); +HERE // Entry is up to date; h[k] = j; } @@ -294,6 +327,7 @@ SPEX_info spex_cholesky_up_triangular_solve { // x[k] = x[k] * rhos[k-1] SPEX_MPZ_MUL(x->x.mpz[k], x->x.mpz[k], rhos->x.mpz[k-1]); +HERE // Only divide by previous pivot if the previous pivot is not 1 (which // is always the case in the first IPGE iteration) if (h[k] > -1) @@ -301,9 +335,11 @@ SPEX_info spex_cholesky_up_triangular_solve // x[k] = x[k] / rhos[h[k]] SPEX_MPZ_DIVEXACT(x->x.mpz[k], x->x.mpz[k], rhos->x.mpz[ h[k]]); +HERE } } // Output the top of the nonzero pattern (*top_output) = top; +HERE return SPEX_OK; } diff --git a/SPEX/SPEX_Utilities/Source/spex_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index fdb80cb428..1793c19860 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -604,10 +604,10 @@ SPEX_info spex_amd #define HERE \ { \ - printf ("here: %4d %s\n", __LINE__, __FILE__) ; \ + /* printf ("here: %4d %s\n", __LINE__, __FILE__) ; */ \ fprintf (stderr, "HERE: %4d %s\n", __LINE__, __FILE__) ; \ fflush (stdout) ; \ - fflush (stderr) ; \ + /* fflush (stderr) ; */ \ } #endif From 2b5a5bddb98a445369ecc59d2d8ae679bf5bd993 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 11:09:26 -0600 Subject: [PATCH 41/98] . --- SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c | 1 + SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c | 4 ++++ SPEX/SPEX_Utilities/Source/spex_util_internal.h | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c index 492fe8743c..1ecd4b388d 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c @@ -164,6 +164,7 @@ HERE false, true, option)); HERE printf ("estimate: % " PRId64"\n", estimate) ; + fflush (stdout) ; // initialize the entries of x for (i = 0; i < n; i++) 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 1603e0b1cd..de24199498 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -310,9 +310,13 @@ HERE // 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] +HERE SPEX_MPZ_DIVEXACT(x->x.mpz[k],x->x.mpz[k], rhos->x.mpz[j-1]); +HERE + } HERE // Entry is up to date; h[k] = j; diff --git a/SPEX/SPEX_Utilities/Source/spex_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index 1793c19860..93cb46836b 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -607,7 +607,7 @@ SPEX_info spex_amd /* printf ("here: %4d %s\n", __LINE__, __FILE__) ; */ \ fprintf (stderr, "HERE: %4d %s\n", __LINE__, __FILE__) ; \ fflush (stdout) ; \ - /* fflush (stderr) ; */ \ + fflush (stderr) ; \ } #endif From a794cd0f027513133024ad065ad089c81ffca8a0 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 11:12:08 -0600 Subject: [PATCH 42/98] . --- SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c index 90a0987f66..951a87e173 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c @@ -87,8 +87,10 @@ HERE if (S->cp == NULL) { SPEX_FREE_ALL; +HERE return SPEX_OUT_OF_MEMORY; } +HERE SPEX_CHECK( spex_cumsum(S->cp, c, n)); HERE From b8ba92682e7a684c98724529f13f9a359dd04b23 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 11:20:42 -0600 Subject: [PATCH 43/98] . --- SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c index a7c8e35180..b7b4cba87e 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -1153,31 +1153,48 @@ SPEX_info SPEX_mpz_divexact const mpz_t z ) { +HERE SPEX_GMPZ_WRAPPER_START (x); +HERE if (mpz_sgn (z) == 0) { +HERE SPEX_GMP_WRAPPER_FINISH ; +HERE return (SPEX_PANIC); } - #ifdef SPEX_DEBUG +HERE +// #ifdef SPEX_DEBUG mpq_t r ; mpq_init (r); // r = 0/1 +HERE mpz_fdiv_r (SPEX_MPQ_NUM (r), y, z); +HERE if (mpz_sgn (SPEX_MPQ_NUM (r)) != 0) { +HERE mpq_set_den (r, z); +HERE mpq_canonicalize (r); +HERE gmp_printf ("not exact division! remainder=%Qd\n", r); +HERE mpq_clear (r); +HERE SPEX_GMP_WRAPPER_FINISH ; +HERE return (SPEX_PANIC); } mpq_clear (r); - #endif +HERE +// #endif +HERE mpz_divexact (x, y, z); +HERE SPEX_GMP_WRAPPER_FINISH ; +HERE return (SPEX_OK); } From 9def308014747d0532b83ef27fe4094962640a87 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 11:25:03 -0600 Subject: [PATCH 44/98] . --- .github/workflows/build-arch-emu.yaml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-arch-emu.yaml b/.github/workflows/build-arch-emu.yaml index 196909e6ff..e4146b39cf 100644 --- a/.github/workflows/build-arch-emu.yaml +++ b/.github/workflows/build-arch-emu.yaml @@ -35,20 +35,21 @@ jobs: matrix: # For available CPU architectures, see: # https://github.com/marketplace/actions/setup-alpine-linux-environment - arch: [x86, aarch64, armv7, ppc64le, s390x] + arch: [x86] # [x86, aarch64, armv7, ppc64le, s390x] include: - arch: x86 ccache-max: 80M extra-build-libs: "" extra-check-libs: "" - - arch: aarch64 - ccache-max: 42M - - arch: armv7 - ccache-max: 42M - - arch: ppc64le - ccache-max: 45M - - arch: s390x - ccache-max: 42M +# HACK: FIXME +# - arch: aarch64 +# ccache-max: 42M +# - arch: armv7 +# ccache-max: 42M +# - arch: ppc64le +# ccache-max: 45M +# - arch: s390x +# ccache-max: 42M name: alpine (${{ matrix.arch }}) From d0d5bfdff2f926446f54389a17de7298a1ecb62c Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 11:31:34 -0600 Subject: [PATCH 45/98] . --- SPEX/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SPEX/Makefile b/SPEX/Makefile index cd662c172f..bb4f85207c 100644 --- a/SPEX/Makefile +++ b/SPEX/Makefile @@ -54,12 +54,14 @@ all: library demos: ( cd build && cmake $(CMAKE_OPTIONS) -DSUITESPARSE_DEMOS=1 .. && cmake --build . --config Release -j${JOBS} ) + ./build/spex_demo_backslash f ExampleMats/Trefethen_500.mat.txt ExampleMats/Trefethen_500.rhs.txt + +other_stuff: ./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_threaded f ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt From 36f4a387ac5de3e7a3afaa9cafc5db6fb68fcd4c Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 11:43:33 -0600 Subject: [PATCH 46/98] debug --- SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 2 ++ SPEX/SPEX_Utilities/Source/spex_util_internal.h | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c index b7b4cba87e..34b0b4840a 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -1161,6 +1161,8 @@ HERE HERE SPEX_GMP_WRAPPER_FINISH ; HERE + fprintf (stderr, "divexact: divide by zero!\n") ; + fflush (stderr) ; return (SPEX_PANIC); } diff --git a/SPEX/SPEX_Utilities/Source/spex_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index 93cb46836b..c14cce853a 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -48,9 +48,9 @@ // debugging //------------------------------------------------------------------------------ -#undef SPEX_DEBUG +// #undef SPEX_DEBUG // uncomment this line to enable debugging -// #define SPEX_DEBUG +#define SPEX_DEBUG #ifdef SPEX_DEBUG @@ -159,6 +159,8 @@ if (info != SPEX_OK) \ { \ printf("file %s line %d\n",__FILE__,__LINE__);\ + fflush (stdout) ; \ + fflush (stderr) ; \ SPEX_FREE_ALL; \ return (info); \ } \ From d79ca3b2d77c08a58d1b6ebf7a301c746aff6970 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 11:57:05 -0600 Subject: [PATCH 47/98] . --- SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c | 12 +++++++++++- .../Source/spex_cholesky_up_triangular_solve.c | 4 +++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c index 1ecd4b388d..eacf0b7df4 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c @@ -11,17 +11,26 @@ #define SPEX_FREE_WORKSPACE \ { \ + HERE ; \ SPEX_matrix_free(&x, NULL); \ + HERE ; \ SPEX_FREE(xi); \ + HERE ; \ SPEX_FREE(h); \ + HERE ; \ SPEX_FREE(c); \ + HERE ; \ } #define SPEX_FREE_ALL \ { \ + HERE ; \ SPEX_matrix_free(&L, NULL); \ + HERE ; \ SPEX_matrix_free(&rhos, NULL); \ + HERE ; \ SPEX_FREE_WORKSPACE \ + HERE ; \ } #include "spex_cholesky_internal.h" @@ -94,7 +103,8 @@ HERE 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; 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 de24199498..efca129240 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -92,8 +92,10 @@ SPEX_info spex_cholesky_up_triangular_solve ASSERT(rhos->kind == SPEX_DENSE); HERE - int64_t j, i, p, m, top, n = A->n; + int64_t j, i, p, m, n = A->n; int sgn; + (*top_output) = n ; + top = n ; ASSERT(n >= 0); From 69f79a270231f4d187b59063cbb2e55dcebbe5bc Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 11:59:52 -0600 Subject: [PATCH 48/98] . --- SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 efca129240..962ae51655 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -95,7 +95,7 @@ HERE int64_t j, i, p, m, n = A->n; int sgn; (*top_output) = n ; - top = n ; + int64_t top = n ; ASSERT(n >= 0); From 45eff029a7e1628f271a0e31e635a313d5a27ec6 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 12:07:01 -0600 Subject: [PATCH 49/98] . --- SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c | 2 ++ SPEX/SPEX_Utilities/Source/spex_util_internal.h | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c index cf1960795b..955adb7738 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c @@ -11,7 +11,9 @@ # define SPEX_FREE_ALL \ { \ + HERE ; \ SPEX_factorization_free(&F, option); \ + HERE ; \ } diff --git a/SPEX/SPEX_Utilities/Source/spex_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index c14cce853a..f87f68a228 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -158,10 +158,12 @@ info = (method); \ if (info != SPEX_OK) \ { \ - printf("file %s line %d\n",__FILE__,__LINE__);\ + fprintf(stderr, "NOT OK: file %s line %d\n",__FILE__,__LINE__);\ fflush (stdout) ; \ fflush (stderr) ; \ + HERE ; \ SPEX_FREE_ALL; \ + HERE ; \ return (info); \ } \ } From e5032b01ac123c7d54c4d94c60ca5ea956298a17 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 13:23:14 -0600 Subject: [PATCH 50/98] . --- .../Source/spex_cholesky_factor.c | 7 ++++--- .../Source/spex_cholesky_up_factor.c | 18 +++++++++--------- .../SPEX_Utilities/Source/spex_util_internal.h | 8 ++++++++ 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c index 955adb7738..40f1144ec3 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c @@ -9,11 +9,11 @@ //------------------------------------------------------------------------------ -# define SPEX_FREE_ALL \ +#define SPEX_FREE_ALL \ { \ - HERE ; \ + HERE2("A") ; \ SPEX_factorization_free(&F, option); \ - HERE ; \ + HERE2("B") ; \ } @@ -149,6 +149,7 @@ HERE // Set outputs, return ok //-------------------------------------------------------------------------- +HERE (*F_handle) = F ; HERE return SPEX_OK; diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c index eacf0b7df4..791e860cd7 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c @@ -11,26 +11,26 @@ #define SPEX_FREE_WORKSPACE \ { \ - HERE ; \ + HERE2 ("1") ; \ SPEX_matrix_free(&x, NULL); \ - HERE ; \ + HERE2 ("2") ; \ SPEX_FREE(xi); \ - HERE ; \ + HERE2 ("3") ; \ SPEX_FREE(h); \ - HERE ; \ + HERE2 ("4") ; \ SPEX_FREE(c); \ - HERE ; \ + HERE2 ("5") ; \ } #define SPEX_FREE_ALL \ { \ - HERE ; \ + HERE2 ("a") ; \ SPEX_matrix_free(&L, NULL); \ - HERE ; \ + HERE2 ("b") ; \ SPEX_matrix_free(&rhos, NULL); \ - HERE ; \ + HERE2 ("c") ; \ SPEX_FREE_WORKSPACE \ - HERE ; \ + HERE2 ("d") ; \ } #include "spex_cholesky_internal.h" diff --git a/SPEX/SPEX_Utilities/Source/spex_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index f87f68a228..c9c5d22be9 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -614,5 +614,13 @@ SPEX_info spex_amd fflush (stderr) ; \ } +#define HERE2(s) \ +{ \ + /* printf ("here: %4d %s\n", __LINE__, __FILE__) ; */ \ + fprintf (stderr, "HERE %s: %4d %s\n", s, __LINE__, __FILE__) ; \ + fflush (stdout) ; \ + fflush (stderr) ; \ +} + #endif From 3b8a459583e85c72be8a06316a45b0ac6ad7afc6 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 13:38:27 -0600 Subject: [PATCH 51/98] . --- SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c index 500ac8a2d0..2a341faf41 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c @@ -26,14 +26,18 @@ SPEX_info SPEX_matrix_free // check inputs //-------------------------------------------------------------------------- +HERE if (!spex_initialized ( )) { return (SPEX_PANIC); } ; +HERE if (A_handle == NULL || (*A_handle) == NULL) { // nothing to free (not an error) +HERE return (SPEX_OK); } SPEX_matrix A = (*A_handle); +HERE //-------------------------------------------------------------------------- // free any non-shallow components @@ -41,9 +45,13 @@ SPEX_info SPEX_matrix_free // free the integer pattern +HERE if (!(A->p_shallow)) SPEX_FREE (A->p); +HERE if (!(A->i_shallow)) SPEX_FREE (A->i); +HERE if (!(A->j_shallow)) SPEX_FREE (A->j); +HERE // free the values if (!(A->x_shallow)) @@ -51,44 +59,66 @@ SPEX_info SPEX_matrix_free switch (A->type) { case SPEX_MPZ: +HERE if ( A->x.mpz != NULL) { +HERE for (int64_t i = 0; i < A->nzmax; i++) { +HERE +fprintf (stderr, "i: %" PRId64"\n", i) ; SPEX_MPZ_CLEAR( A->x.mpz[i]); +HERE } } +HERE SPEX_FREE (A->x.mpz); +HERE break ; case SPEX_MPQ: +HERE if ( A->x.mpq != NULL) { +HERE for (int64_t i = 0; i < A->nzmax; i++) { +HERE SPEX_MPQ_CLEAR( A->x.mpq[i]); +HERE } } +HERE SPEX_FREE (A->x.mpq); break ; case SPEX_MPFR: +HERE if ( A->x.mpfr != NULL) { +HERE for (int64_t i = 0; i < A->nzmax; i++) { +HERE SPEX_MPFR_CLEAR( A->x.mpfr[i]); +HERE } } +HERE SPEX_FREE (A->x.mpfr); +HERE break ; case SPEX_INT64: +HERE SPEX_FREE (A->x.int64); +HERE break ; case SPEX_FP64: +HERE SPEX_FREE (A->x.fp64); +HERE break ; default: @@ -99,15 +129,20 @@ SPEX_info SPEX_matrix_free // A->scale is never shallow +HERE SPEX_MPQ_CLEAR (A->scale); +HERE //-------------------------------------------------------------------------- // free the header //-------------------------------------------------------------------------- // the header is never shallow +HERE SPEX_FREE (A); +HERE (*A_handle) = NULL ; +HERE return (SPEX_OK); } From fa147f6a8264f6a4a29b86f1285b34d4204c31a7 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 13:56:30 -0600 Subject: [PATCH 52/98] . --- .../Source/SPEX_cholesky_backslash.c | 10 ------ .../Source/spex_cholesky_factor.c | 11 ------ .../Source/spex_cholesky_symbolic_analysis.c | 9 ----- .../Source/spex_cholesky_up_factor.c | 26 -------------- .../spex_cholesky_up_triangular_solve.c | 36 ------------------- SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 19 ++-------- SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c | 3 +- 7 files changed, 4 insertions(+), 110 deletions(-) diff --git a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c index 93e3177ddf..575812b01a 100644 --- a/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c +++ b/SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c @@ -61,7 +61,6 @@ SPEX_info SPEX_cholesky_backslash const SPEX_options option // Command options (Default if NULL) ) { -HERE SPEX_info info; // SPEX must be initialized @@ -112,11 +111,9 @@ HERE bool is_symmetric ; SPEX_CHECK( SPEX_determine_symmetry(&is_symmetric, A, option) ); -HERE if (!is_symmetric) { SPEX_FREE_WORKSPACE ; -HERE return SPEX_NOTSPD ; } @@ -125,7 +122,6 @@ HERE //-------------------------------------------------------------------------- SPEX_CHECK( spex_cholesky_preorder(&S, A, option) ); -HERE //-------------------------------------------------------------------------- // Permute matrix A, that is apply the row/column ordering from the @@ -133,14 +129,12 @@ HERE //-------------------------------------------------------------------------- SPEX_CHECK( spex_cholesky_permute_A(&PAP, A, true, S) ); -HERE //-------------------------------------------------------------------------- // Symbolic Analysis: compute the elimination tree of PAP //-------------------------------------------------------------------------- SPEX_CHECK( spex_cholesky_symbolic_analysis(S, PAP, option) ); -HERE //-------------------------------------------------------------------------- // Factorization: Perform the REF Cholesky factorization of PAP. @@ -149,7 +143,6 @@ HERE //-------------------------------------------------------------------------- SPEX_CHECK( spex_cholesky_factor(&F, S, PAP, option) ); -HERE //-------------------------------------------------------------------------- // Solve: Solve Ax = b using the REF Cholesky factorization. That is, @@ -159,7 +152,6 @@ HERE //-------------------------------------------------------------------------- SPEX_CHECK( SPEX_cholesky_solve(&x, F, b, option) ); -HERE //-------------------------------------------------------------------------- // At this point x is stored as mpq_t. If the user desires the output @@ -178,13 +170,11 @@ HERE (*x_handle) = x2; SPEX_matrix_free (&x, NULL); } -HERE //-------------------------------------------------------------------------- // Free all workspace and return success //-------------------------------------------------------------------------- SPEX_FREE_WORKSPACE; -HERE return SPEX_OK; } diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c index 40f1144ec3..5ca72ba601 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c @@ -71,7 +71,6 @@ SPEX_info spex_cholesky_factor // reminder of the appropriate data types ASSERT(A->type == SPEX_MPZ); ASSERT(A->kind == SPEX_CSC); -HERE // Number of nonzeros in A int64_t anz; @@ -79,7 +78,6 @@ HERE ASSERT(anz > 0); (*F_handle) = NULL ; -HERE //-------------------------------------------------------------------------- // Declare and initialize workspace @@ -90,7 +88,6 @@ HERE // Allocate memory for the factorization F = (SPEX_factorization) SPEX_calloc(1, sizeof(SPEX_factorization_struct)); -HERE if (F == NULL) return SPEX_OUT_OF_MEMORY; // set factorization kind @@ -99,20 +96,17 @@ HERE // Allocate and set scale_for_A SPEX_MPQ_INIT(F->scale_for_A); SPEX_MPQ_SET(F->scale_for_A, A->scale); -HERE // Inverse pivot ordering F->Pinv_perm = (int64_t*) SPEX_malloc ( n*sizeof(int64_t) ); // row/column permutation, to be copied from S->P_perm F->P_perm = (int64_t*) SPEX_malloc ( n*sizeof(int64_t) ); -HERE if (!(F->Pinv_perm) || !(F->P_perm)) { // out of memory: free everything and return SPEX_FREE_ALL; return SPEX_OUT_OF_MEMORY; } -HERE // Copy row/column permutation from symbolic analysis to factorization memcpy(F->P_perm, S->P_perm, n*sizeof(int64_t)); @@ -122,7 +116,6 @@ HERE // factorization: up-looking or left-looking //-------------------------------------------------------------------------- -HERE SPEX_factorization_algorithm algo = SPEX_OPTION_ALGORITHM(option); switch(algo) { @@ -135,10 +128,8 @@ HERE HERE break; case SPEX_CHOL_LEFT: -HERE SPEX_CHECK( spex_cholesky_left_factor(&(F->L), &(F->rhos), S, A, option) ); -HERE break; default: SPEX_FREE_ALL; @@ -149,8 +140,6 @@ HERE // Set outputs, return ok //-------------------------------------------------------------------------- -HERE (*F_handle) = F ; -HERE return SPEX_OK; } diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c index 951a87e173..52836c3fb2 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c @@ -53,7 +53,6 @@ SPEX_info spex_cholesky_symbolic_analysis { SPEX_info info; -HERE //-------------------------------------------------------------------------- // Check inputs @@ -70,33 +69,25 @@ HERE int64_t *c = NULL; // Obtain elimination tree of A -HERE SPEX_CHECK( spex_cholesky_etree(&S->parent, A) ); // Postorder the elimination tree of A -HERE SPEX_CHECK( spex_cholesky_post(&post, S->parent, n) ); // Get the column counts of A SPEX_CHECK( spex_cholesky_counts(&c, A, S->parent, post) ); -HERE // Set the column pointers of L S->cp = (int64_t*) SPEX_malloc( (n+1)*sizeof(int64_t*)); -HERE if (S->cp == NULL) { SPEX_FREE_ALL; -HERE return SPEX_OUT_OF_MEMORY; } -HERE SPEX_CHECK( spex_cumsum(S->cp, c, n)); -HERE // Set the exact number of nonzeros in L S->lnz = S->cp[n]; SPEX_FREE_WORKSPACE; -HERE return SPEX_OK; } diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c index 791e860cd7..a1f70bfbdc 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c @@ -75,7 +75,6 @@ SPEX_info spex_cholesky_up_factor const SPEX_options option // command options ) { -HERE //-------------------------------------------------------------------------- // check inputs @@ -89,7 +88,6 @@ HERE ASSERT (rhos_handle != NULL); (*L_handle) = NULL ; (*rhos_handle) = NULL ; -HERE //-------------------------------------------------------------------------- // Declare and initialize workspace @@ -109,20 +107,17 @@ HERE size_t size; c = (int64_t*) SPEX_malloc(n*sizeof(int64_t)); -HERE // h is the history vector utilized for the sparse REF // triangular solve algorithm. h serves as a global // vector which is repeatedly passed into the triangular // solve algorithm h = (int64_t*) SPEX_malloc(n*sizeof(int64_t)); -HERE // xi serves as a global nonzero pattern vector. It stores // the pattern of nonzeros of the kth column of L // for the triangular solve. xi = (int64_t*) SPEX_malloc(2*n*sizeof(int64_t)); -HERE if (!h || !xi || !c) { @@ -135,7 +130,6 @@ HERE { h[i] = -1; } -HERE //-------------------------------------------------------------------------- // Allocate and initialize the workspace x @@ -165,14 +159,12 @@ HERE // default size) SPEX_CHECK (SPEX_matrix_allocate(&x, SPEX_DENSE, SPEX_MPZ, n, 1, n, false, /* do not initialize the entries of x: */ false, option)); -HERE // Create rhos, a "global" dense mpz_t matrix of dimension n*1. // As indicated with the second boolean parameter true, the mpz entries in // rhos are initialized to the default size (unlike x). SPEX_CHECK (SPEX_matrix_allocate(&(rhos), SPEX_DENSE, SPEX_MPZ, n, 1, n, false, true, option)); -HERE printf ("estimate: % " PRId64"\n", estimate) ; fflush (stdout) ; @@ -182,7 +174,6 @@ HERE // Allocate memory for entries of x to be estimate bits SPEX_MPZ_INIT2(x->x.mpz[i], estimate); } -HERE //-------------------------------------------------------------------------- // Declare memory for L @@ -196,15 +187,12 @@ HERE SPEX_CHECK(SPEX_matrix_allocate(&(L), SPEX_CSC, SPEX_MPZ, n, n, S->lnz, false, false, option)); -HERE // Set the column pointers of L for (k = 0; k < n; k++) { L->p[k] = c[k] = S->cp[k]; } -HERE - //-------------------------------------------------------------------------- // Perform the up-looking factorization @@ -214,7 +202,6 @@ HERE // Iterations 0:n-1 (1:n in standard) //-------------------------------------------------------------------------- SPEX_MPZ_SGN(&prev_sgn, x->x.mpz[0]); -HERE for (k = 0; k < n; k++) { @@ -227,7 +214,6 @@ HERE // If x[k] is nonzero choose it as pivot. Otherwise, the matrix is // not SPD (indeed, it may even be singular). SPEX_MPZ_SGN(&sgn, x->x.mpz[k]); -HERE if (sgn != 0) { SPEX_MPZ_SET(rhos->x.mpz[k], x->x.mpz[k]); @@ -235,11 +221,9 @@ HERE else { // A is not symmetric positive definite -HERE SPEX_FREE_ALL; return SPEX_NOTSPD; } -HERE //---------------------------------------------------------------------- // Add the nonzeros (i.e. x) to L @@ -247,7 +231,6 @@ HERE int64_t p = 0; for (j = top; j < n; j++) { -HERE // Obtain the row index of x[j] jnew = xi[j]; if (jnew == k) continue; @@ -258,34 +241,25 @@ HERE // Place the i index of this nonzero. Should always be k because at // iteration k, the up-looking algorithm computes row k of L L->i[p] = k; -HERE // Find the number of bits of x[j] size = mpz_sizeinbase(x->x.mpz[jnew],2); -HERE // GMP manual: Allocated size should be size+2 SPEX_MPZ_INIT2(L->x.mpz[p], size+2); -HERE // Place the x value of this nonzero SPEX_MPZ_SET(L->x.mpz[p],x->x.mpz[jnew]); -HERE } // Now, place L(k,k) p = c[k]++; L->i[p] = k; -HERE size = mpz_sizeinbase(x->x.mpz[k], 2); -HERE SPEX_MPZ_INIT2(L->x.mpz[p], size+2); -HERE SPEX_MPZ_SET(L->x.mpz[p], x->x.mpz[k]); -HERE } // Finalize L->p L->p[n] = S->lnz; -HERE //-------------------------------------------------------------------------- // Free memory and set output 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 962ae51655..a3e4078047 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -91,7 +91,6 @@ SPEX_info spex_cholesky_up_triangular_solve ASSERT(rhos->type == SPEX_MPZ); ASSERT(rhos->kind == SPEX_DENSE); -HERE int64_t j, i, p, m, n = A->n; int sgn; (*top_output) = n ; @@ -107,18 +106,15 @@ HERE // elimination tree of A. The indices of these nonzeros are stored in // xi[top..n-1] SPEX_CHECK(spex_cholesky_ereach(&top, xi, A, k, parent, c)); -HERE // Sort the nonzero pattern using quicksort (required by IPGE unlike in GE) qsort(&xi[top], n-top, sizeof(int64_t*), compare); -HERE // 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); } -HERE // Reset value of x[k]. If the matrix is nonsingular, x[k] will // be a part of the nonzero pattern and reset in the above loop. @@ -126,14 +122,12 @@ HERE // will be nonzero from a previous iteration. Thus, here we reset // x[k] to account for this extremely rare case. SPEX_MPZ_SET_UI(x->x.mpz[k],0); -HERE // Reset h[i] = -1 for all i in nonzero pattern for (i = top; i < n; i++) { h[xi[i]] = -1; } -HERE // Set x = A(:,k) // Note: The if is needed since the columns of A are allowed to be unsorted. @@ -144,7 +138,6 @@ HERE SPEX_MPZ_SET(x->x.mpz[A->i[i]], A->x.mpz[i]); } } -HERE //-------------------------------------------------------------------------- // Perform the REF Triangular Solve. Note that, unlike the left-looking @@ -154,11 +147,9 @@ HERE //-------------------------------------------------------------------------- for (p = top; p < n; p++) { -HERE // Obtain the index of the current nonzero j = xi[p]; SPEX_MPZ_SGN(&sgn, x->x.mpz[j]); -HERE if (sgn == 0) continue; // If x[j] == 0 no work must be done // Initial history update to finalize x[j] if necessary @@ -166,16 +157,13 @@ HERE { // History update x[j]: x[j] = x[j]*rhos[j-1]/rhos[h[j]] // x[j] = x[j]*rhos[j-1] -HERE SPEX_MPZ_MUL(x->x.mpz[j], x->x.mpz[j], rhos->x.mpz[j-1]); -HERE if (h[j] > -1) { // x[j] = x[j] / rhos [ h[j] ] SPEX_MPZ_DIVEXACT(x->x.mpz[j], x->x.mpz[j], rhos->x.mpz[h[j]]); -HERE } } @@ -185,37 +173,30 @@ HERE // ----------- Iterate accross nonzeros in Lij --------------------- for (m = L->p[j]+1; m < c[j]; m++) { -HERE i = L->i[m]; // i value of Lij if (i > j && i < k) // Update all dependent x[i] excluding x[k] { -HERE /*************** If lij==0 then no update******************/ SPEX_MPZ_SGN(&sgn, L->x.mpz[m]); if (sgn == 0) continue; -HERE //---------------------------------------------------------- /************* lij is nonzero, x[i] is zero****************/ // x[i] = 0 then only perform IPGE update subtraction/division //---------------------------------------------------------- SPEX_MPZ_SGN(&sgn, x->x.mpz[i]); -HERE if (sgn == 0) { // First, get the correct value of x[i] = 0 - lij * x[j] SPEX_MPZ_MUL(x->x.mpz[i], L->x.mpz[m], x->x.mpz[j]); -HERE SPEX_MPZ_NEG(x->x.mpz[i],x->x.mpz[i]); -HERE // Do a division by the pivot if necessary. if (j >= 1) { // x[i] = x[i] / rho[j-1] SPEX_MPZ_DIVEXACT(x->x.mpz[i], x->x.mpz[i], rhos->x.mpz[j-1]); -HERE } // Update the history value of x[i] h[i] = j; @@ -228,18 +209,15 @@ HERE //---------------------------------------------------------- else { -HERE // There is no previous pivot if (j < 1) { // History update x[i] = x[i]*rhos[0] SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[0]); -HERE // x[i] = x[i] - lij x[j] SPEX_MPZ_SUBMUL(x->x.mpz[i], L->x.mpz[m], x->x.mpz[j]); -HERE // Update the history value of x[i] h[i] = j; } @@ -252,7 +230,6 @@ HERE // x[i] = x[i] * rhos[j-1] SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[j-1]); -HERE // Divide by the history pivot only if the history // pivot is not the rho[-1] (which equals 1) (rho[0] // in the 1-based logic of othe IPGE algorithm) @@ -261,7 +238,6 @@ HERE // x[i] = x[i] / rho[h[i]] SPEX_MPZ_DIVEXACT(x->x.mpz[i], x->x.mpz[i],rhos->x.mpz[h[i]]); -HERE } } // ---- IPGE Update : @@ -269,15 +245,12 @@ HERE // x[i] = x[i]*rhos[j] SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[j]); -HERE // x[i] = x[i] - lij*xj SPEX_MPZ_SUBMUL(x->x.mpz[i], L->x.mpz[m], x->x.mpz[j]); -HERE // x[i] = x[i] / rho[j-1] SPEX_MPZ_DIVEXACT(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[j-1]); -HERE // Entry is up to date; h[i] = j; } @@ -287,10 +260,8 @@ HERE // ------ History Update x[k] if necessary ----- if (h[k] < j - 1) { -HERE // x[k] = x[k] * rho[j-1] SPEX_MPZ_MUL(x->x.mpz[k],x->x.mpz[k],rhos->x.mpz[j-1]); -HERE // Divide by the history pivot only if the history pivot is not the // rho[-1] (which equals 1) (rho[0] in the 1-based logic of the // IPGE algorithm) @@ -299,16 +270,13 @@ HERE // x[k] = x[k] / rho[h[k]] SPEX_MPZ_DIVEXACT(x->x.mpz[k],x->x.mpz[k], rhos->x.mpz[h[k]]); -HERE } } // ---- 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]); -HERE // x[k] = x[k] - xj*xj SPEX_MPZ_SUBMUL(x->x.mpz[k], x->x.mpz[j], x->x.mpz[j]); -HERE // 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) @@ -319,7 +287,6 @@ HERE rhos->x.mpz[j-1]); HERE } -HERE // Entry is up to date; h[k] = j; } @@ -333,7 +300,6 @@ HERE { // x[k] = x[k] * rhos[k-1] SPEX_MPZ_MUL(x->x.mpz[k], x->x.mpz[k], rhos->x.mpz[k-1]); -HERE // Only divide by previous pivot if the previous pivot is not 1 (which // is always the case in the first IPGE iteration) if (h[k] > -1) @@ -341,11 +307,9 @@ HERE // x[k] = x[k] / rhos[h[k]] SPEX_MPZ_DIVEXACT(x->x.mpz[k], x->x.mpz[k], rhos->x.mpz[ h[k]]); -HERE } } // Output the top of the nonzero pattern (*top_output) = top; -HERE return SPEX_OK; } diff --git a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c index 34b0b4840a..772f784534 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -1153,9 +1153,7 @@ SPEX_info SPEX_mpz_divexact const mpz_t z ) { -HERE SPEX_GMPZ_WRAPPER_START (x); -HERE if (mpz_sgn (z) == 0) { HERE @@ -1166,37 +1164,24 @@ HERE return (SPEX_PANIC); } -HERE -// #ifdef SPEX_DEBUG +#ifdef SPEX_DEBUG mpq_t r ; mpq_init (r); // r = 0/1 -HERE mpz_fdiv_r (SPEX_MPQ_NUM (r), y, z); -HERE if (mpz_sgn (SPEX_MPQ_NUM (r)) != 0) { -HERE mpq_set_den (r, z); -HERE mpq_canonicalize (r); -HERE gmp_printf ("not exact division! remainder=%Qd\n", r); -HERE mpq_clear (r); -HERE SPEX_GMP_WRAPPER_FINISH ; -HERE return (SPEX_PANIC); } mpq_clear (r); -HERE -// #endif -HERE +#endif mpz_divexact (x, y, z); -HERE SPEX_GMP_WRAPPER_FINISH ; -HERE return (SPEX_OK); } diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c index 2a341faf41..66ab276c46 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c @@ -66,7 +66,8 @@ HERE for (int64_t i = 0; i < A->nzmax; i++) { HERE -fprintf (stderr, "i: %" PRId64"\n", i) ; +fprintf (stderr, "i: %" PRId64" of %"PRId64"\n", i, A->nzmax) ; +fflush (stderr) ; SPEX_MPZ_CLEAR( A->x.mpz[i]); HERE } From 1ed91eb672ba60fed3e3282b76444679710d278b Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 16:18:11 -0600 Subject: [PATCH 53/98] . --- SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c | 3 +++ 1 file changed, 3 insertions(+) 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 a3e4078047..aad6d68b51 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -283,6 +283,9 @@ SPEX_info spex_cholesky_up_triangular_solve { // x[k] = x[k] / rho[j-1] HERE +// THIS FAILS with SPEX_PANIC: rhos[j] is zero, +// then SPEX segfaults +fprintf (stderr, "------ exact divide by rhos[j]: j = %" PRId64" of n %" PRId64 "\n", j, n) ; SPEX_MPZ_DIVEXACT(x->x.mpz[k],x->x.mpz[k], rhos->x.mpz[j-1]); HERE From 5ca223717b2dcd6163d145338bb95da3d47c8e98 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 16:33:39 -0600 Subject: [PATCH 54/98] . --- .../spex_cholesky_left_triangular_solve.c | 6 ++- .../spex_cholesky_up_triangular_solve.c | 42 ++++++++++++++++++- .../spex_left_lu_ref_triangular_solve.c | 4 ++ 3 files changed, 49 insertions(+), 3 deletions(-) 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 1caa721e28..2514224b42 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c @@ -57,7 +57,11 @@ // c's default qsort static inline int compare (const void * a, const void * b) { - return ( *(int64_t*)a - *(int64_t*)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 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 aad6d68b51..414d74634f 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -55,7 +55,11 @@ // c's default qsort static inline int compare (const void * a, const void * b) { - return ( *(int64_t*)a - *(int64_t*)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 @@ -107,13 +111,39 @@ SPEX_info spex_cholesky_up_triangular_solve // xi[top..n-1] SPEX_CHECK(spex_cholesky_ereach(&top, xi, A, k, parent, c)); +if (top < 0 || top > n) +{ + HERE ; + fprintf (stderr, "Hey: top is wierd %" PRId64 " n is %" PRId64 "\n", top, n) ; + abort ( ) ; +} + for (i = top; i < n; i++) + { + int64_t j = xi [i] ; +if (j < 0 || j >= n) +{ + HERE ; + fprintf (stderr, "Hey: j is wierd %" PRId64 " n is %" PRId64 "\n", j, n) ; + abort ( ) ; +} + } + // Sort the nonzero pattern using quicksort (required by IPGE unlike in GE) 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++) { - SPEX_MPZ_SET_UI(x->x.mpz[xi[i]],0); + int64_t j = xi [i] ; + +if (j < 0 || j >= n) +{ + HERE ; + fprintf (stderr, "Hey: j is wierd %" PRId64 " n is %" PRId64 "\n", j, n) ; + abort ( ) ; +} + + SPEX_MPZ_SET_UI(x->x.mpz[j],0); } // Reset value of x[k]. If the matrix is nonsingular, x[k] will @@ -149,6 +179,14 @@ SPEX_info spex_cholesky_up_triangular_solve { // Obtain the index of the current nonzero j = xi[p]; + +if (j < 0 || j >= n) +{ + HERE ; + fprintf (stderr, "Hey: j is wierd %" PRId64 " n is %" PRId64 "\n", j, n) ; + abort ( ) ; +} + SPEX_MPZ_SGN(&sgn, x->x.mpz[j]); if (sgn == 0) continue; // If x[j] == 0 no work must be done 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 f28161020e..be1f9768df 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 @@ -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 From dc21db1674a997bc752e6ed063e03f7ba81e4c13 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 16:39:28 -0600 Subject: [PATCH 55/98] . --- .../Source/spex_cholesky_up_triangular_solve.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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 414d74634f..c2e797d523 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -96,11 +96,17 @@ SPEX_info spex_cholesky_up_triangular_solve ASSERT(rhos->kind == SPEX_DENSE); int64_t j, i, p, m, n = A->n; +HERE ; 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 && @@ -111,15 +117,18 @@ SPEX_info spex_cholesky_up_triangular_solve // xi[top..n-1] SPEX_CHECK(spex_cholesky_ereach(&top, xi, A, k, parent, c)); +fprintf (stderr, "Hey: top is %" PRId64 " n is %" PRId64 "\n", top, n) ; if (top < 0 || top > n) { HERE ; fprintf (stderr, "Hey: top is wierd %" PRId64 " n is %" PRId64 "\n", top, n) ; abort ( ) ; } + for (i = top; i < n; i++) { int64_t j = xi [i] ; +fprintf (stderr, "Hey: i %" PRId64 " j is OK %" PRId64 " n is %" PRId64 "\n", i, j, n) ; if (j < 0 || j >= n) { HERE ; @@ -131,6 +140,8 @@ if (j < 0 || j >= n) // Sort the nonzero pattern using quicksort (required by IPGE unlike in GE) qsort(&xi[top], n-top, sizeof(int64_t*), compare); +HERE ; + // Reset x[i] = 0 for all i in nonzero pattern xi [top..n-1] for (i = top; i < n; i++) { @@ -142,6 +153,7 @@ if (j < 0 || j >= n) fprintf (stderr, "Hey: j is wierd %" PRId64 " n is %" PRId64 "\n", j, n) ; abort ( ) ; } +fprintf (stderr, "Hey: i %" PRId64 " j is OK %" PRId64 " n is %" PRId64 "\n", i, j, n) ; SPEX_MPZ_SET_UI(x->x.mpz[j],0); } From 4f5f21b0ba57136030fd0af3c9d18e6a3fd6718e Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 16:46:02 -0600 Subject: [PATCH 56/98] . --- SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c | 2 +- SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c | 2 +- SPEX/SPEX_LU/Source/spex_left_lu_ref_triangular_solve.c | 2 +- SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 2514224b42..fca4de02e7 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c @@ -222,7 +222,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), compare) ; // Reset the history vector h for (i = top; i < n; i++) 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 c2e797d523..22bd75081b 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -138,7 +138,7 @@ if (j < 0 || j >= 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), compare) ; HERE ; 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 be1f9768df..093732bec8 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 @@ -136,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_Utilities/Source/SPEX_matrix_check.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c index a1c5da5342..654b6f29d7 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c @@ -418,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++) From 236f11a030c38fa59130fdc1f609df236d61898e Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 16:59:00 -0600 Subject: [PATCH 57/98] . --- .../spex_cholesky_up_triangular_solve.c | 52 +++++++++++-------- SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c | 39 +------------- 2 files changed, 33 insertions(+), 58 deletions(-) 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 22bd75081b..72fcbb319f 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -96,7 +96,6 @@ SPEX_info spex_cholesky_up_triangular_solve ASSERT(rhos->kind == SPEX_DENSE); int64_t j, i, p, m, n = A->n; -HERE ; int sgn; (*top_output) = n ; int64_t top = n ; @@ -117,14 +116,17 @@ HERE ; // xi[top..n-1] SPEX_CHECK(spex_cholesky_ereach(&top, xi, A, k, parent, c)); -fprintf (stderr, "Hey: top is %" PRId64 " n is %" PRId64 "\n", top, n) ; -if (top < 0 || top > n) -{ - HERE ; - fprintf (stderr, "Hey: top is wierd %" PRId64 " n is %" PRId64 "\n", top, n) ; - abort ( ) ; -} + ASSERT (top >= 0 && top <= n) ; + +// fprintf (stderr, "Hey: top is %" PRId64 " n is %" PRId64 "\n", top, n) ; +// if (top < 0 || top > n) +// { +// HERE ; +// fprintf (stderr, "Hey: top is wierd %" PRId64 " n is %" PRId64 "\n", top, n) ; +// abort ( ) ; +// } +#if 0 for (i = top; i < n; i++) { int64_t j = xi [i] ; @@ -136,6 +138,7 @@ if (j < 0 || j >= n) abort ( ) ; } } +#endif // Sort the nonzero pattern using quicksort (required by IPGE unlike in GE) qsort (&xi[top], n-top, sizeof (int64_t), compare) ; @@ -146,14 +149,15 @@ HERE ; for (i = top; i < n; i++) { int64_t j = xi [i] ; + ASSERT (j >= 0 && j <= k) ; -if (j < 0 || j >= n) -{ - HERE ; - fprintf (stderr, "Hey: j is wierd %" PRId64 " n is %" PRId64 "\n", j, n) ; - abort ( ) ; -} -fprintf (stderr, "Hey: i %" PRId64 " j is OK %" PRId64 " n is %" PRId64 "\n", i, j, n) ; +// if (j < 0 || j >= n) +// { +// HERE ; +// fprintf (stderr, "Hey: j is wierd %" PRId64 " n is %" PRId64 "\n", j, n) ; +// abort ( ) ; +// } +// fprintf (stderr, "Hey: i %" PRId64 " j is OK %" PRId64 " n is %" PRId64 "\n", i, j, n) ; SPEX_MPZ_SET_UI(x->x.mpz[j],0); } @@ -180,6 +184,7 @@ fprintf (stderr, "Hey: i %" PRId64 " j is OK %" PRId64 " n is %" PRId64 "\n", i, SPEX_MPZ_SET(x->x.mpz[A->i[i]], A->x.mpz[i]); } } +HERE //-------------------------------------------------------------------------- // Perform the REF Triangular Solve. Note that, unlike the left-looking @@ -189,15 +194,18 @@ fprintf (stderr, "Hey: i %" PRId64 " j is OK %" PRId64 " n is %" PRId64 "\n", i, //-------------------------------------------------------------------------- for (p = top; p < n; p++) { +HERE // Obtain the index of the current nonzero j = xi[p]; -if (j < 0 || j >= n) -{ - HERE ; - fprintf (stderr, "Hey: j is wierd %" PRId64 " n is %" PRId64 "\n", j, n) ; - abort ( ) ; -} + ASSERT (j >= 0 && j <= k) ; + +// if (j < 0 || j >= n) +// { +// HERE ; +// fprintf (stderr, "Hey: j is wierd %" PRId64 " n is %" PRId64 "\n", j, n) ; +// abort ( ) ; +// } SPEX_MPZ_SGN(&sgn, x->x.mpz[j]); if (sgn == 0) continue; // If x[j] == 0 no work must be done @@ -223,6 +231,7 @@ if (j < 0 || j >= n) // ----------- Iterate accross nonzeros in Lij --------------------- for (m = L->p[j]+1; m < c[j]; m++) { +HERE i = L->i[m]; // i value of Lij if (i > j && i < k) // Update all dependent x[i] excluding x[k] { @@ -364,5 +373,6 @@ HERE } // Output the top of the nonzero pattern (*top_output) = top; +HERE return SPEX_OK; } diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c index 66ab276c46..d41d34e8b5 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c @@ -26,32 +26,23 @@ SPEX_info SPEX_matrix_free // check inputs //-------------------------------------------------------------------------- -HERE if (!spex_initialized ( )) { return (SPEX_PANIC); } ; -HERE if (A_handle == NULL || (*A_handle) == NULL) { // nothing to free (not an error) -HERE return (SPEX_OK); } SPEX_matrix A = (*A_handle); -HERE //-------------------------------------------------------------------------- // free any non-shallow components //-------------------------------------------------------------------------- - // free the integer pattern -HERE if (!(A->p_shallow)) SPEX_FREE (A->p); -HERE if (!(A->i_shallow)) SPEX_FREE (A->i); -HERE if (!(A->j_shallow)) SPEX_FREE (A->j); -HERE // free the values if (!(A->x_shallow)) @@ -59,67 +50,46 @@ HERE switch (A->type) { case SPEX_MPZ: -HERE if ( A->x.mpz != NULL) { -HERE for (int64_t i = 0; i < A->nzmax; i++) { -HERE -fprintf (stderr, "i: %" PRId64" of %"PRId64"\n", i, A->nzmax) ; -fflush (stderr) ; +// fprintf (stderr, "i: %" PRId64" of %"PRId64"\n", i, A->nzmax) ; +// fflush (stderr) ; SPEX_MPZ_CLEAR( A->x.mpz[i]); -HERE } } -HERE SPEX_FREE (A->x.mpz); -HERE break ; case SPEX_MPQ: -HERE if ( A->x.mpq != NULL) { -HERE for (int64_t i = 0; i < A->nzmax; i++) { -HERE SPEX_MPQ_CLEAR( A->x.mpq[i]); -HERE } } -HERE SPEX_FREE (A->x.mpq); break ; case SPEX_MPFR: -HERE if ( A->x.mpfr != NULL) { -HERE for (int64_t i = 0; i < A->nzmax; i++) { -HERE SPEX_MPFR_CLEAR( A->x.mpfr[i]); -HERE } } -HERE SPEX_FREE (A->x.mpfr); -HERE break ; case SPEX_INT64: -HERE SPEX_FREE (A->x.int64); -HERE break ; case SPEX_FP64: -HERE SPEX_FREE (A->x.fp64); -HERE break ; default: @@ -130,20 +100,15 @@ HERE // A->scale is never shallow -HERE SPEX_MPQ_CLEAR (A->scale); -HERE //-------------------------------------------------------------------------- // free the header //-------------------------------------------------------------------------- // the header is never shallow -HERE SPEX_FREE (A); -HERE (*A_handle) = NULL ; -HERE return (SPEX_OK); } From 01a31f9574db15f28e81aaf5cb4b7540b710d7d2 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 17:03:27 -0600 Subject: [PATCH 58/98] . --- .../spex_cholesky_up_triangular_solve.c | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) 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 72fcbb319f..8489a41dce 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -197,6 +197,7 @@ HERE HERE // Obtain the index of the current nonzero j = xi[p]; +fprintf (stderr, "==== p %" PRId64 " j %" PRId64 "\n", p, j) ; ASSERT (j >= 0 && j <= k) ; @@ -208,20 +209,26 @@ HERE // } SPEX_MPZ_SGN(&sgn, x->x.mpz[j]); +HERE if (sgn == 0) continue; // If x[j] == 0 no work must be done +HERE // Initial history update to finalize x[j] if necessary if (h[j] < j-1) { +HERE // History update x[j]: x[j] = x[j]*rhos[j-1]/rhos[h[j]] // x[j] = x[j]*rhos[j-1] SPEX_MPZ_MUL(x->x.mpz[j], x->x.mpz[j], rhos->x.mpz[j-1]); +HERE if (h[j] > -1) { // x[j] = x[j] / rhos [ h[j] ] +HERE SPEX_MPZ_DIVEXACT(x->x.mpz[j], x->x.mpz[j], rhos->x.mpz[h[j]]); +HERE } } @@ -236,31 +243,41 @@ HERE if (i > j && i < k) // Update all dependent x[i] excluding x[k] { /*************** If lij==0 then no update******************/ +HERE SPEX_MPZ_SGN(&sgn, L->x.mpz[m]); +HERE if (sgn == 0) continue; +HERE //---------------------------------------------------------- /************* lij is nonzero, x[i] is zero****************/ // x[i] = 0 then only perform IPGE update subtraction/division //---------------------------------------------------------- SPEX_MPZ_SGN(&sgn, x->x.mpz[i]); +HERE if (sgn == 0) { +HERE // First, get the correct value of x[i] = 0 - lij * x[j] SPEX_MPZ_MUL(x->x.mpz[i], L->x.mpz[m], x->x.mpz[j]); +HERE SPEX_MPZ_NEG(x->x.mpz[i],x->x.mpz[i]); +HERE // Do a division by the pivot if necessary. if (j >= 1) { // x[i] = x[i] / rho[j-1] +HERE SPEX_MPZ_DIVEXACT(x->x.mpz[i], x->x.mpz[i], rhos->x.mpz[j-1]); +HERE } // Update the history value of x[i] h[i] = j; } +HERE //---------------------------------------------------------- /************ Both lij and x[i] are nonzero****************/ @@ -268,35 +285,44 @@ HERE //---------------------------------------------------------- else { +HERE // There is no previous pivot if (j < 1) { +HERE // History update x[i] = x[i]*rhos[0] SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[0]); +HERE // x[i] = x[i] - lij x[j] SPEX_MPZ_SUBMUL(x->x.mpz[i], L->x.mpz[m], x->x.mpz[j]); +HERE // Update the history value of x[i] h[i] = j; } // There is a previous pivot else { +HERE // History update if necessary if (h[i] < j - 1) { +HERE // x[i] = x[i] * rhos[j-1] SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[j-1]); +HERE // Divide by the history pivot only if the history // pivot is not the rho[-1] (which equals 1) (rho[0] // in the 1-based logic of othe IPGE algorithm) if (h[i] > -1) { +HERE // x[i] = x[i] / rho[h[i]] SPEX_MPZ_DIVEXACT(x->x.mpz[i], x->x.mpz[i],rhos->x.mpz[h[i]]); +HERE } } // ---- IPGE Update : @@ -304,18 +330,23 @@ HERE // x[i] = x[i]*rhos[j] SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[j]); +HERE // x[i] = x[i] - lij*xj SPEX_MPZ_SUBMUL(x->x.mpz[i], L->x.mpz[m], x->x.mpz[j]); +HERE // x[i] = x[i] / rho[j-1] SPEX_MPZ_DIVEXACT(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[j-1]); +HERE // Entry is up to date; h[i] = j; } } } } + +HERE // ------ History Update x[k] if necessary ----- if (h[k] < j - 1) { @@ -331,6 +362,8 @@ HERE rhos->x.mpz[h[k]]); } } +HERE + // ---- 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]); @@ -338,6 +371,7 @@ HERE SPEX_MPZ_SUBMUL(x->x.mpz[k], x->x.mpz[j], x->x.mpz[j]); // Only divide by previous pivot if the previous pivot is not 1 (which // is always the case in the first IPGE iteration) +HERE if (j > 0) { // x[k] = x[k] / rho[j-1] @@ -352,26 +386,33 @@ HERE // Entry is up to date; h[k] = j; } +HERE + //---------------------------------------------------------- // At this point, x[k] has been updated throughout the // triangular solve. The last step is to make sure x[k] // has its correct final value. Thus, a final history // update is done to x[k] if necessary //---------------------------------------------------------- +HERE if (h[k] < k-1) { // x[k] = x[k] * rhos[k-1] +HERE SPEX_MPZ_MUL(x->x.mpz[k], x->x.mpz[k], rhos->x.mpz[k-1]); // Only divide by previous pivot if the previous pivot is not 1 (which // is always the case in the first IPGE iteration) if (h[k] > -1) { +HERE // x[k] = x[k] / rhos[h[k]] SPEX_MPZ_DIVEXACT(x->x.mpz[k], x->x.mpz[k], rhos->x.mpz[ h[k]]); +HERE } } // Output the top of the nonzero pattern +HERE (*top_output) = top; HERE return SPEX_OK; From d6e2a3da7acac666a98a13e7df872fe309282c66 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 17:04:44 -0600 Subject: [PATCH 59/98] . --- SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c | 2 -- 1 file changed, 2 deletions(-) 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 8489a41dce..959c3341ea 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -277,8 +277,6 @@ HERE h[i] = j; } -HERE - //---------------------------------------------------------- /************ Both lij and x[i] are nonzero****************/ // x[i] != 0 --> History & IPGE update on x[i] From a20c9715f3ead8643222c84bcdc1372e12524691 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 17:09:49 -0600 Subject: [PATCH 60/98] . --- SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c index 52836c3fb2..bd62a25f32 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_symbolic_analysis.c @@ -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; From 46c1ba0e334c88b045ec9808006803e57857342b Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 17:33:28 -0600 Subject: [PATCH 61/98] . --- .github/workflows/build-arch-emu.yaml | 19 ++-- SPEX/Config/SPEX.h.in | 2 - SPEX/Demo/spex_demos.h | 33 ------- SPEX/Include/SPEX.h | 2 - SPEX/Makefile | 4 +- SPEX/SPEX_Backslash/Source/SPEX_backslash.c | 15 --- .../Source/spex_cholesky_factor.c | 4 - .../spex_cholesky_left_triangular_solve.c | 6 +- .../Source/spex_cholesky_up_factor.c | 14 --- .../spex_cholesky_up_triangular_solve.c | 92 +------------------ SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 4 - SPEX/SPEX_Utilities/Source/SPEX_initialize.c | 14 +-- SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c | 2 - .../Source/spex_util_internal.h | 16 ++-- 14 files changed, 22 insertions(+), 205 deletions(-) diff --git a/.github/workflows/build-arch-emu.yaml b/.github/workflows/build-arch-emu.yaml index e4146b39cf..196909e6ff 100644 --- a/.github/workflows/build-arch-emu.yaml +++ b/.github/workflows/build-arch-emu.yaml @@ -35,21 +35,20 @@ jobs: matrix: # For available CPU architectures, see: # https://github.com/marketplace/actions/setup-alpine-linux-environment - arch: [x86] # [x86, aarch64, armv7, ppc64le, s390x] + arch: [x86, aarch64, armv7, ppc64le, s390x] include: - arch: x86 ccache-max: 80M extra-build-libs: "" extra-check-libs: "" -# HACK: FIXME -# - arch: aarch64 -# ccache-max: 42M -# - arch: armv7 -# ccache-max: 42M -# - arch: ppc64le -# ccache-max: 45M -# - arch: s390x -# ccache-max: 42M + - arch: aarch64 + ccache-max: 42M + - arch: armv7 + ccache-max: 42M + - arch: ppc64le + ccache-max: 45M + - arch: s390x + ccache-max: 42M name: alpine (${{ matrix.arch }}) diff --git a/SPEX/Config/SPEX.h.in b/SPEX/Config/SPEX.h.in index 11c2455334..a559542548 100644 --- a/SPEX/Config/SPEX.h.in +++ b/SPEX/Config/SPEX.h.in @@ -805,8 +805,6 @@ SPEX_info SPEX_determine_symmetry const SPEX_options option // Command options ) ; -// ended HERE on Apr 10. - //------------------------------------------------------------------------------ //---------------------------SPEX GMP/MPFR Functions---------------------------- //------------------------------------------------------------------------------ diff --git a/SPEX/Demo/spex_demos.h b/SPEX/Demo/spex_demos.h index 8efd8722d6..2fa92816ac 100644 --- a/SPEX/Demo/spex_demos.h +++ b/SPEX/Demo/spex_demos.h @@ -30,46 +30,13 @@ #define SPEX_MIN(a,b) (((a) < (b)) ? (a) : (b)) -#if 0 #define DEMO_INIT(ok) \ - if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) \ - { \ - /* return 0 so the github CI does not fail */ \ - printf ("SPEX ERROR: GMP configuration not supported:\n") ; \ - printf (" sizeof (mp_bitcnt_t): %d\n", (int) sizeof (mp_bitcnt_t)) ; \ - printf (" sizeof (uint64_t): %d\n", (int) sizeof (uint64_t)) ; \ - printf (" sizeof (mp_bitcnt_t) is too small;\n") ; \ - printf (" it must be >= sizeof (uint64_t)\n" ) ; \ - return (0) ; \ - } \ - SPEX_info ok = SPEX_initialize ( ) ; \ - if (ok != SPEX_OK) \ - { \ - fprintf (stderr, "SPEX ERROR: failed to initialize\n") ; \ - return (1) ; \ - } -#else -#define DEMO_INIT(ok) \ - if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) \ - { \ - /* return 0 so the github CI does not fail */ \ - printf ("SPEX ERROR: GMP configuration not supported:\n") ; \ - printf (" sizeof (mp_bitcnt_t) is too small;\n") ; \ - printf (" it must be >= sizeof (uint64_t)\n" ) ; \ - } \ - { \ - printf (" sizeof (mp_bitcnt_t): %d\n", (int) sizeof (mp_bitcnt_t)) ; \ - printf (" sizeof (uint64_t): %d\n", (int) sizeof (uint64_t)) ; \ - printf (" sizeof (void *): %d\n", (int) sizeof (void *)) ; \ - /* return (0) ; */ \ - } \ SPEX_info ok = SPEX_initialize ( ) ; \ if (ok != SPEX_OK) \ { \ fprintf (stderr, "SPEX ERROR: failed to initialize\n") ; \ return (1) ; \ } -#endif /* Purpose: This processes the command line for user specified options */ SPEX_info spex_demo_process_command_line //processes the command line diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index 1670bc21ef..b67f344a60 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -805,8 +805,6 @@ SPEX_info SPEX_determine_symmetry const SPEX_options option // Command options ) ; -// ended HERE on Apr 10. - //------------------------------------------------------------------------------ //---------------------------SPEX GMP/MPFR Functions---------------------------- //------------------------------------------------------------------------------ diff --git a/SPEX/Makefile b/SPEX/Makefile index bb4f85207c..cd662c172f 100644 --- a/SPEX/Makefile +++ b/SPEX/Makefile @@ -54,14 +54,12 @@ all: library demos: ( cd build && cmake $(CMAKE_OPTIONS) -DSUITESPARSE_DEMOS=1 .. && cmake --build . --config Release -j${JOBS} ) - ./build/spex_demo_backslash f ExampleMats/Trefethen_500.mat.txt ExampleMats/Trefethen_500.rhs.txt - -other_stuff: ./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_threaded f ExampleMats/10teams.mat.txt ExampleMats/10teams.rhs.txt diff --git a/SPEX/SPEX_Backslash/Source/SPEX_backslash.c b/SPEX/SPEX_Backslash/Source/SPEX_backslash.c index 23d69ed09e..76433e5082 100644 --- a/SPEX/SPEX_Backslash/Source/SPEX_backslash.c +++ b/SPEX/SPEX_Backslash/Source/SPEX_backslash.c @@ -47,7 +47,6 @@ SPEX_info SPEX_backslash SPEX_options option // Command options (NULL: means use defaults) ) { -HERE SPEX_info info; // Check inputs @@ -80,8 +79,6 @@ HERE return SPEX_OUT_OF_MEMORY; } -HERE - if (option != NULL) { // IF the options are not NULL, copy the important parts. @@ -93,7 +90,6 @@ HERE // Declare output SPEX_matrix x = NULL; -HERE // Attempt a Cholesky factorization of A. // If Cholesky is occuring, we update the option @@ -101,7 +97,6 @@ HERE backslash_options->order = SPEX_AMD; backslash_options->pivot = SPEX_DIAGONAL; -HERE // Try SPEX Cholesky. The output for this function // is either: // SPEX_OK: Cholesky success, x is the exact solution @@ -109,7 +104,6 @@ HERE // A is not SPD. In this case, we try LU // Other error code: Some error. Return the error code and exit info = SPEX_cholesky_backslash(&x, type, A, b, backslash_options); -HERE if (info == SPEX_OK) { // Cholesky was successful. Set x_handle = x @@ -118,12 +112,10 @@ HERE // x_handle contains the exact solution of Ax = b and is // stored in the user desired type. Now, we exit and return ok SPEX_FREE(backslash_options); -HERE return SPEX_OK; } else if (info == SPEX_NOTSPD) { -HERE // Cholesky factorization failed. Must try // LU factorization now @@ -137,7 +129,6 @@ HERE // Other error code: Some error. Return the error // code and exit info = SPEX_lu_backslash(&x, type, A, b, backslash_options); -HERE if (info == SPEX_OK) { // LU success, set x_handle = x @@ -146,7 +137,6 @@ HERE // x_handle contains the exact solution of Ax = b and is // stored in the user desired type. Now, we exit and return ok SPEX_FREE(backslash_options); -HERE return SPEX_OK; } else @@ -156,23 +146,18 @@ HERE // Note that, because LU failed, x_handle is still // NULL so there is no potential for a memory leak here SPEX_FREE(backslash_options); -HERE return info; } -HERE } else { -HERE // Cholesky failed, but not due to a SPEX_NOTSPD // error code. Most likely invalid input or out of // memory condition. // Note that since Cholesky failed, x_handle is still NULL // so there is no potential for a memory leak here SPEX_FREE(backslash_options); -HERE return info; } -HERE } diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c index 5ca72ba601..a5dc8350ff 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c @@ -11,9 +11,7 @@ #define SPEX_FREE_ALL \ { \ - HERE2("A") ; \ SPEX_factorization_free(&F, option); \ - HERE2("B") ; \ } @@ -122,10 +120,8 @@ SPEX_info spex_cholesky_factor case SPEX_ALGORITHM_DEFAULT: // fall through to up-looking Cholesky (the default) case SPEX_CHOL_UP: -HERE SPEX_CHECK( spex_cholesky_up_factor(&(F->L), &(F->rhos), S, A, option)); -HERE break; case SPEX_CHOL_LEFT: SPEX_CHECK( spex_cholesky_left_factor(&(F->L), &(F->rhos), S, A, 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 fca4de02e7..e6838cd62c 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_left_triangular_solve.c @@ -55,10 +55,8 @@ // 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)) ; @@ -222,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_up_factor.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c index a1f70bfbdc..67dcaca5bc 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c @@ -11,26 +11,17 @@ #define SPEX_FREE_WORKSPACE \ { \ - HERE2 ("1") ; \ SPEX_matrix_free(&x, NULL); \ - HERE2 ("2") ; \ SPEX_FREE(xi); \ - HERE2 ("3") ; \ SPEX_FREE(h); \ - HERE2 ("4") ; \ SPEX_FREE(c); \ - HERE2 ("5") ; \ } #define SPEX_FREE_ALL \ { \ - HERE2 ("a") ; \ SPEX_matrix_free(&L, NULL); \ - HERE2 ("b") ; \ SPEX_matrix_free(&rhos, NULL); \ - HERE2 ("c") ; \ SPEX_FREE_WORKSPACE \ - HERE2 ("d") ; \ } #include "spex_cholesky_internal.h" @@ -165,8 +156,6 @@ SPEX_info spex_cholesky_up_factor // rhos are initialized to the default size (unlike x). SPEX_CHECK (SPEX_matrix_allocate(&(rhos), SPEX_DENSE, SPEX_MPZ, n, 1, n, false, true, option)); - printf ("estimate: % " PRId64"\n", estimate) ; - fflush (stdout) ; // initialize the entries of x for (i = 0; i < n; i++) @@ -206,10 +195,8 @@ SPEX_info spex_cholesky_up_factor for (k = 0; k < n; k++) { // LDx = A(:,k) -HERE SPEX_CHECK(spex_cholesky_up_triangular_solve(&top, xi, x, L, A, k, S->parent, c, rhos, h)); -HERE // If x[k] is nonzero choose it as pivot. Otherwise, the matrix is // not SPD (indeed, it may even be singular). @@ -268,6 +255,5 @@ HERE (*L_handle) = L; (*rhos_handle) = rhos; SPEX_FREE_WORKSPACE; -HERE return SPEX_OK; } 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 959c3341ea..aedaac5375 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -53,10 +53,8 @@ // 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)) ; @@ -118,47 +116,14 @@ SPEX_info spex_cholesky_up_triangular_solve ASSERT (top >= 0 && top <= n) ; -// fprintf (stderr, "Hey: top is %" PRId64 " n is %" PRId64 "\n", top, n) ; -// if (top < 0 || top > n) -// { -// HERE ; -// fprintf (stderr, "Hey: top is wierd %" PRId64 " n is %" PRId64 "\n", top, n) ; -// abort ( ) ; -// } - -#if 0 - for (i = top; i < n; i++) - { - int64_t j = xi [i] ; -fprintf (stderr, "Hey: i %" PRId64 " j is OK %" PRId64 " n is %" PRId64 "\n", i, j, n) ; -if (j < 0 || j >= n) -{ - HERE ; - fprintf (stderr, "Hey: j is wierd %" PRId64 " n is %" PRId64 "\n", j, n) ; - abort ( ) ; -} - } -#endif - // Sort the nonzero pattern using quicksort (required by IPGE unlike in GE) - qsort (&xi[top], n-top, sizeof (int64_t), compare) ; - -HERE ; + 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++) { int64_t j = xi [i] ; ASSERT (j >= 0 && j <= k) ; - -// if (j < 0 || j >= n) -// { -// HERE ; -// fprintf (stderr, "Hey: j is wierd %" PRId64 " n is %" PRId64 "\n", j, n) ; -// abort ( ) ; -// } -// fprintf (stderr, "Hey: i %" PRId64 " j is OK %" PRId64 " n is %" PRId64 "\n", i, j, n) ; - SPEX_MPZ_SET_UI(x->x.mpz[j],0); } @@ -184,7 +149,6 @@ HERE ; SPEX_MPZ_SET(x->x.mpz[A->i[i]], A->x.mpz[i]); } } -HERE //-------------------------------------------------------------------------- // Perform the REF Triangular Solve. Note that, unlike the left-looking @@ -194,41 +158,26 @@ HERE //-------------------------------------------------------------------------- for (p = top; p < n; p++) { -HERE // Obtain the index of the current nonzero j = xi[p]; -fprintf (stderr, "==== p %" PRId64 " j %" PRId64 "\n", p, j) ; ASSERT (j >= 0 && j <= k) ; -// if (j < 0 || j >= n) -// { -// HERE ; -// fprintf (stderr, "Hey: j is wierd %" PRId64 " n is %" PRId64 "\n", j, n) ; -// abort ( ) ; -// } - SPEX_MPZ_SGN(&sgn, x->x.mpz[j]); -HERE if (sgn == 0) continue; // If x[j] == 0 no work must be done -HERE // Initial history update to finalize x[j] if necessary if (h[j] < j-1) { -HERE // History update x[j]: x[j] = x[j]*rhos[j-1]/rhos[h[j]] // x[j] = x[j]*rhos[j-1] SPEX_MPZ_MUL(x->x.mpz[j], x->x.mpz[j], rhos->x.mpz[j-1]); -HERE if (h[j] > -1) { // x[j] = x[j] / rhos [ h[j] ] -HERE SPEX_MPZ_DIVEXACT(x->x.mpz[j], x->x.mpz[j], rhos->x.mpz[h[j]]); -HERE } } @@ -238,40 +187,30 @@ HERE // ----------- Iterate accross nonzeros in Lij --------------------- for (m = L->p[j]+1; m < c[j]; m++) { -HERE i = L->i[m]; // i value of Lij if (i > j && i < k) // Update all dependent x[i] excluding x[k] { /*************** If lij==0 then no update******************/ -HERE SPEX_MPZ_SGN(&sgn, L->x.mpz[m]); -HERE if (sgn == 0) continue; -HERE //---------------------------------------------------------- /************* lij is nonzero, x[i] is zero****************/ // x[i] = 0 then only perform IPGE update subtraction/division //---------------------------------------------------------- SPEX_MPZ_SGN(&sgn, x->x.mpz[i]); -HERE if (sgn == 0) { -HERE // First, get the correct value of x[i] = 0 - lij * x[j] SPEX_MPZ_MUL(x->x.mpz[i], L->x.mpz[m], x->x.mpz[j]); -HERE SPEX_MPZ_NEG(x->x.mpz[i],x->x.mpz[i]); -HERE // Do a division by the pivot if necessary. if (j >= 1) { // x[i] = x[i] / rho[j-1] -HERE SPEX_MPZ_DIVEXACT(x->x.mpz[i], x->x.mpz[i], rhos->x.mpz[j-1]); -HERE } // Update the history value of x[i] h[i] = j; @@ -283,44 +222,35 @@ HERE //---------------------------------------------------------- else { -HERE // There is no previous pivot if (j < 1) { -HERE // History update x[i] = x[i]*rhos[0] SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[0]); -HERE // x[i] = x[i] - lij x[j] SPEX_MPZ_SUBMUL(x->x.mpz[i], L->x.mpz[m], x->x.mpz[j]); -HERE // Update the history value of x[i] h[i] = j; } // There is a previous pivot else { -HERE // History update if necessary if (h[i] < j - 1) { -HERE // x[i] = x[i] * rhos[j-1] SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[j-1]); -HERE // Divide by the history pivot only if the history // pivot is not the rho[-1] (which equals 1) (rho[0] // in the 1-based logic of othe IPGE algorithm) if (h[i] > -1) { -HERE // x[i] = x[i] / rho[h[i]] SPEX_MPZ_DIVEXACT(x->x.mpz[i], x->x.mpz[i],rhos->x.mpz[h[i]]); -HERE } } // ---- IPGE Update : @@ -328,15 +258,12 @@ HERE // x[i] = x[i]*rhos[j] SPEX_MPZ_MUL(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[j]); -HERE // x[i] = x[i] - lij*xj SPEX_MPZ_SUBMUL(x->x.mpz[i], L->x.mpz[m], x->x.mpz[j]); -HERE // x[i] = x[i] / rho[j-1] SPEX_MPZ_DIVEXACT(x->x.mpz[i],x->x.mpz[i], rhos->x.mpz[j-1]); -HERE // Entry is up to date; h[i] = j; } @@ -344,7 +271,6 @@ HERE } } -HERE // ------ History Update x[k] if necessary ----- if (h[k] < j - 1) { @@ -360,7 +286,6 @@ HERE rhos->x.mpz[h[k]]); } } -HERE // ---- IPGE Update x[k] = (x[k]*rhos[j] - xj*xj) / rho[j-1] ------ // x[k] = x[k] * rho[j] @@ -369,22 +294,15 @@ HERE SPEX_MPZ_SUBMUL(x->x.mpz[k], x->x.mpz[j], x->x.mpz[j]); // Only divide by previous pivot if the previous pivot is not 1 (which // is always the case in the first IPGE iteration) -HERE if (j > 0) { // x[k] = x[k] / rho[j-1] -HERE -// THIS FAILS with SPEX_PANIC: rhos[j] is zero, -// then SPEX segfaults -fprintf (stderr, "------ exact divide by rhos[j]: j = %" PRId64" of n %" PRId64 "\n", j, n) ; SPEX_MPZ_DIVEXACT(x->x.mpz[k],x->x.mpz[k], rhos->x.mpz[j-1]); -HERE } // Entry is up to date; h[k] = j; } -HERE //---------------------------------------------------------- // At this point, x[k] has been updated throughout the @@ -392,26 +310,20 @@ HERE // has its correct final value. Thus, a final history // update is done to x[k] if necessary //---------------------------------------------------------- -HERE if (h[k] < k-1) { // x[k] = x[k] * rhos[k-1] -HERE SPEX_MPZ_MUL(x->x.mpz[k], x->x.mpz[k], rhos->x.mpz[k-1]); // Only divide by previous pivot if the previous pivot is not 1 (which // is always the case in the first IPGE iteration) if (h[k] > -1) { -HERE // x[k] = x[k] / rhos[h[k]] SPEX_MPZ_DIVEXACT(x->x.mpz[k], x->x.mpz[k], rhos->x.mpz[ h[k]]); -HERE } } // Output the top of the nonzero pattern -HERE (*top_output) = top; -HERE return SPEX_OK; } diff --git a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c index 772f784534..0f0e886343 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -1156,11 +1156,7 @@ SPEX_info SPEX_mpz_divexact SPEX_GMPZ_WRAPPER_START (x); if (mpz_sgn (z) == 0) { -HERE SPEX_GMP_WRAPPER_FINISH ; -HERE - fprintf (stderr, "divexact: divide by zero!\n") ; - fflush (stderr) ; return (SPEX_PANIC); } diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c index a54f975226..61bb943e98 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c @@ -40,18 +40,10 @@ SPEX_info SPEX_initialize ( void ) { if (spex_initialized( )) { -// printf ("SPEX PANIC: already initialized\n") ; + // SPEX is already initialized return (SPEX_PANIC); } - // FIXME: why does SPEX 3.0 require sizeof (mp_bitcnt_t) to be sizeof (uint64_t)? - // SPEX requires GMP to support bit counts that are 64-bit integers - if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) - { - printf ("SPEX WARNING: GMP configuration not supported\n") ; -// return (SPEX_PANIC); - } - // tell GMP and MPFR which memory allocation functions to use mp_set_memory_functions ( @@ -62,10 +54,6 @@ SPEX_info SPEX_initialize ( void ) // initialize the SPEX GMP interface for the primary thread SPEX_info info = spex_gmp_initialize (1) ; -// if (info != SPEX_OK) -// { -// printf ("SPEX ERROR: GMP not initialized: %d\n", info) ; -// } if (info == SPEX_OK) { spex_set_initialized (true); diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c index d41d34e8b5..26a444ebb8 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c @@ -54,8 +54,6 @@ SPEX_info SPEX_matrix_free { for (int64_t i = 0; i < A->nzmax; i++) { -// fprintf (stderr, "i: %" PRId64" of %"PRId64"\n", i, A->nzmax) ; -// fflush (stderr) ; SPEX_MPZ_CLEAR( A->x.mpz[i]); } } diff --git a/SPEX/SPEX_Utilities/Source/spex_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index c9c5d22be9..a7f82cfcc4 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -48,9 +48,9 @@ // debugging //------------------------------------------------------------------------------ -// #undef SPEX_DEBUG +#undef SPEX_DEBUG // uncomment this line to enable debugging -#define SPEX_DEBUG +// #define SPEX_DEBUG #ifdef SPEX_DEBUG @@ -158,12 +158,10 @@ info = (method); \ if (info != SPEX_OK) \ { \ - fprintf(stderr, "NOT OK: file %s line %d\n",__FILE__,__LINE__);\ - fflush (stdout) ; \ - fflush (stderr) ; \ - HERE ; \ + fprintf(stderr, "NOT OK: file %s line %d\n",__FILE__,__LINE__) ; \ + fflush (stdout) ; \ + fflush (stderr) ; \ SPEX_FREE_ALL; \ - HERE ; \ return (info); \ } \ } @@ -606,9 +604,9 @@ SPEX_info spex_amd // debugging //------------------------------------------------------------------------------ +#if 0 #define HERE \ { \ - /* printf ("here: %4d %s\n", __LINE__, __FILE__) ; */ \ fprintf (stderr, "HERE: %4d %s\n", __LINE__, __FILE__) ; \ fflush (stdout) ; \ fflush (stderr) ; \ @@ -616,11 +614,11 @@ SPEX_info spex_amd #define HERE2(s) \ { \ - /* printf ("here: %4d %s\n", __LINE__, __FILE__) ; */ \ fprintf (stderr, "HERE %s: %4d %s\n", s, __LINE__, __FILE__) ; \ fflush (stdout) ; \ fflush (stderr) ; \ } +#endif #endif From 68e59ad2fa303f0c2f824307e8a429e9304a240e Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 20 Feb 2024 17:38:20 -0600 Subject: [PATCH 62/98] Example: OK with SPEX 3.1 on 32-bit systems --- Example/Source/my.c | 24 ++++++------------------ Example/Source/my_cxx.cc | 30 +++++++----------------------- 2 files changed, 13 insertions(+), 41 deletions(-) diff --git a/Example/Source/my.c b/Example/Source/my.c index f47ace8b4e..83caa38f13 100644 --- a/Example/Source/my.c +++ b/Example/Source/my.c @@ -373,25 +373,13 @@ int my_function (void) // returns 0 on success, -1 on failure // SPEX //-------------------------------------------------------------------------- - // SPEX 3.0 requires GMP to support bit counts that are 64-bit integers - if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) - { - printf ("\n------------------------------------------------------------\n") ; - printf ("SPEX %d.%d.%d (%s) not supported on this platform.\n" - "GMP sizeof (mp_bitcnt_t) is %d, which is < sizeof (uint64_t) = %d\n", + OK (SPEX_initialize ( ) == SPEX_OK) ; + char spex_date [128] ; + OK (SPEX_version (version, spex_date) == SPEX_OK) ; + OK (my_check_version ("SPEX", SPEX_VERSION_MAJOR, SPEX_VERSION_MINOR, SPEX_VERSION_SUB, SPEX_DATE, - (int) sizeof (mp_bitcnt_t), (int) sizeof (uint64_t)) ; - } - else - { - OK (SPEX_initialize ( ) == SPEX_OK) ; - char spex_date [128] ; - OK (SPEX_version (version, spex_date) == SPEX_OK) ; - OK (my_check_version ("SPEX", - SPEX_VERSION_MAJOR, SPEX_VERSION_MINOR, SPEX_VERSION_SUB, SPEX_DATE, - version, SPEX__VERSION)) ; - OK (SPEX_finalize ( ) == SPEX_OK) ; - } + version, SPEX__VERSION)) ; + OK (SPEX_finalize ( ) == SPEX_OK) ; //-------------------------------------------------------------------------- // SPQR diff --git a/Example/Source/my_cxx.cc b/Example/Source/my_cxx.cc index 74ebd057cf..ffeb1484bd 100644 --- a/Example/Source/my_cxx.cc +++ b/Example/Source/my_cxx.cc @@ -380,29 +380,13 @@ int my_function (void) // returns 0 on success, -1 on failure // SPEX //-------------------------------------------------------------------------- - // SPEX 3.0 requires GMP to support bit counts that are 64-bit integers - if (sizeof (mp_bitcnt_t) < sizeof (uint64_t)) - { - std::cout << - "\n------------------------------------------------------------" - << std::endl ; - std::cout << "SPEX " << SPEX_VERSION_MAJOR << "." << SPEX_VERSION_MINOR - << "." << SPEX_VERSION_SUB << " (" << SPEX_DATE << - ") not supported on this platform." << std::endl ; - std::cout << "GMP sizeof (mp_bitcnt_t) is " << sizeof (mp_bitcnt_t) - << ", which is < sizeof (uint64_t) = " << sizeof (uint64_t) - << std::endl ; - } - else - { - OK (SPEX_initialize ( ) == SPEX_OK) ; - char spex_date [128] ; - OK (SPEX_version (version, spex_date) == SPEX_OK) ; - OK (my_check_version ("SPEX", - SPEX_VERSION_MAJOR, SPEX_VERSION_MINOR, SPEX_VERSION_SUB, SPEX_DATE, - version, SPEX__VERSION)) ; - OK (SPEX_finalize ( ) == SPEX_OK) ; - } + OK (SPEX_initialize ( ) == SPEX_OK) ; + char spex_date [128] ; + OK (SPEX_version (version, spex_date) == SPEX_OK) ; + OK (my_check_version ("SPEX", + SPEX_VERSION_MAJOR, SPEX_VERSION_MINOR, SPEX_VERSION_SUB, SPEX_DATE, + version, SPEX__VERSION)) ; + OK (SPEX_finalize ( ) == SPEX_OK) ; //-------------------------------------------------------------------------- // SPQR From c28a5f15f209f6400ead0db46c506b05cfa8d2a7 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 21 Feb 2024 07:42:57 -0600 Subject: [PATCH 63/98] sync with dev2 --- .github/workflows/build-arch-emu.yaml | 66 ++- .github/workflows/build.yaml | 141 ++++- .github/workflows/codeql-analysis.yaml | 4 +- .github/workflows/macos.yaml | 102 +++- .github/workflows/root-cmakelists.yaml | 155 +++++- .github/workflows/save/build-arch-emu.yaml | 247 --------- .github/workflows/save/build.yaml | 506 ----------------- .github/workflows/save/codeql-analysis.yaml | 204 ------- .github/workflows/save/macos.yaml | 231 -------- .github/workflows/save/root-cmakelists.yaml | 570 -------------------- CMakeLists.txt | 2 +- Makefile | 150 +++++- 12 files changed, 580 insertions(+), 1798 deletions(-) delete mode 100644 .github/workflows/save/build-arch-emu.yaml delete mode 100644 .github/workflows/save/build.yaml delete mode 100644 .github/workflows/save/codeql-analysis.yaml delete mode 100644 .github/workflows/save/macos.yaml delete mode 100644 .github/workflows/save/root-cmakelists.yaml diff --git a/.github/workflows/build-arch-emu.yaml b/.github/workflows/build-arch-emu.yaml index 196909e6ff..7be4c923d8 100644 --- a/.github/workflows/build-arch-emu.yaml +++ b/.github/workflows/build-arch-emu.yaml @@ -11,11 +11,11 @@ concurrency: ci-arch-emu-${{ github.ref }} env: # string with name of libraries to be built - BUILD_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + BUILD_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX" # string with name of libraries to be checked - CHECK_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + CHECK_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX" # string with name of libraries that are installed - INSTALLED_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + INSTALLED_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX" jobs: @@ -39,8 +39,8 @@ jobs: include: - arch: x86 ccache-max: 80M - extra-build-libs: "" - extra-check-libs: "" + extra-build-libs: ":GraphBLAS:LAGraph" + extra-check-libs: ":GraphBLAS:LAGraph" - arch: aarch64 ccache-max: 42M - arch: armv7 @@ -58,7 +58,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # shell: bash - name: install dependencies @@ -94,7 +94,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + 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 @@ -164,7 +164,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: /home/runner/rootfs/alpine-latest-${{ matrix.arch }}/home/runner/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -180,6 +180,25 @@ jobs: 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=: @@ -195,3 +214,34 @@ jobs: 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 index 73927f1465..047745d646 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -11,11 +11,11 @@ concurrency: ci-${{ github.ref }} env: # string with name of libraries to be built - BUILD_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + BUILD_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" # string with name of libraries to be checked - CHECK_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + CHECK_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" # string with name of libraries that are installed - INSTALLED_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + INSTALLED_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" jobs: @@ -94,7 +94,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: install dependencies env: @@ -115,7 +115,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -192,7 +192,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -207,6 +207,33 @@ jobs: 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}" @@ -221,6 +248,42 @@ jobs: 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 @@ -285,7 +348,7 @@ jobs: msystem: ${{ matrix.msystem }} - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: prepare ccache # create key with human readable timestamp @@ -297,7 +360,7 @@ jobs: - name: restore ccache # Setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} @@ -362,11 +425,39 @@ jobs: - 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@v3 + 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}" @@ -381,3 +472,35 @@ jobs: 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 index e8c415a571..ec8b1ee459 100644 --- a/.github/workflows/codeql-analysis.yaml +++ b/.github/workflows/codeql-analysis.yaml @@ -32,7 +32,7 @@ jobs: # group: [other, graph] include: - group: other - build-libs: SuiteSparse_config:AMD:COLAMD:SPEX + build-libs: SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX # - group: graph # build-libs: GraphBLAS:LAGraph @@ -126,7 +126,7 @@ jobs: # group: [other, graph] include: - group: other - build-libs: SuiteSparse_config:AMD:COLAMD:SPEX + build-libs: SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX # - group: graph # build-libs: GraphBLAS:LAGraph diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml index 00f6e5e6ca..789761f210 100644 --- a/.github/workflows/macos.yaml +++ b/.github/workflows/macos.yaml @@ -19,7 +19,7 @@ concurrency: ci-macos-${{ github.ref }} env: # string with name of libraries to be built - BUILD_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + BUILD_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" jobs: @@ -35,7 +35,7 @@ jobs: sysctl machdep - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: install dependencies # Homebrew's Python conflicts with the Python that comes pre-installed @@ -61,7 +61,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: /Users/runner/Library/Caches/ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -98,21 +98,93 @@ jobs: echo "::endgroup::" done + - name: check_Mongoose + run: | + cd ${GITHUB_WORKSPACE}/Mongoose/build + ctest . + - name: check_AMD run: | cd ${GITHUB_WORKSPACE}/AMD make demos + - name: check_CAMD + run: | + cd ${GITHUB_WORKSPACE}/CAMD + make demos + - name: check_COLAMD run: | cd ${GITHUB_WORKSPACE}/COLAMD make demos + - name: check_CCOLAMD + run: | + cd ${GITHUB_WORKSPACE}/CCOLAMD + make demos + + - name: check_CHOLMOD + run: | + cd ${GITHUB_WORKSPACE}/CHOLMOD + make demos + cd ${GITHUB_WORKSPACE}/CHOLMOD/build + ctest . + + - name: check_CSparse + run: | + cd ${GITHUB_WORKSPACE}/CSparse + make demos + + - name: check_CXSparse + run: | + cd ${GITHUB_WORKSPACE}/CXSparse + make demos + + - name: check_LDL + run: | + cd ${GITHUB_WORKSPACE}/LDL + make demos + + - name: check_KLU + run: | + cd ${GITHUB_WORKSPACE}/KLU + make demos + + - name: check_UMFPACK + run: | + cd ${GITHUB_WORKSPACE}/UMFPACK + make demos + + - name: check_RBio + run: | + cd ${GITHUB_WORKSPACE}/RBio + make demos + + - name: check_SPQR + run: | + cd ${GITHUB_WORKSPACE}/SPQR + make demos + - name: check_SPEX run: | cd ${GITHUB_WORKSPACE}/SPEX make demos + - name: check_GraphBLAS + run: | + cd ${GITHUB_WORKSPACE}/GraphBLAS + make demos + + - name: check_LAGraph + run: | + cd ${GITHUB_WORKSPACE}/LAGraph + make demos + + - name: check_ParU + run: | + cd ${GITHUB_WORKSPACE}/ParU + make demos + - name: ccache status continue-on-error: true run: ccache -s @@ -120,7 +192,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: /Users/runner/Library/Caches/ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -135,3 +207,25 @@ jobs: 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 index e2f05cd4f1..bcdcda49a9 100644 --- a/.github/workflows/root-cmakelists.yaml +++ b/.github/workflows/root-cmakelists.yaml @@ -14,7 +14,7 @@ concurrency: ci-root-cmakelists-${{ github.ref }} env: # string with name of libraries that are installed - INSTALLED_LIBS: "SuiteSparse_config:AMD:COLAMD:SPEX" + INSTALLED_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" jobs: @@ -80,7 +80,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: install dependencies env: @@ -101,7 +101,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -135,6 +135,22 @@ jobs: 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 @@ -174,7 +190,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -190,6 +206,33 @@ jobs: 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}" @@ -204,13 +247,49 @@ jobs: 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.openmp }} OpenMP ${{ matrix.cuda }} CUDA, ${{ matrix.link }}) + name: msvc (${{ matrix.cc }} ${{ matrix.openmp }} OpenMP ${{ matrix.cuda }} CUDA, ${{ matrix.link }}) defaults: run: @@ -225,6 +304,7 @@ jobs: openmp: [with, without] cuda: [without] link: [both] + cc: [cl] include: - openmp: without openmp-cmake-flags: "-DSUITESPARSE_USE_OPENMP=OFF" @@ -234,6 +314,7 @@ jobs: -DSUITESPARSE_USE_CUDA=ON -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" link: both + cc: cl - openmp: with cuda: with cuda-cmake-flags: @@ -243,6 +324,11 @@ jobs: 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 @@ -254,15 +340,15 @@ jobs: Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: auto-update-conda: true - name: cache conda packages id: conda-cache - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: C:/Miniconda/envs/test key: conda:msvc @@ -298,7 +384,7 @@ jobs: msystem: UCRT64 - - uses: Jimver/cuda-toolkit@v0.2.11 + - uses: Jimver/cuda-toolkit@v0.2.14 name: install CUDA toolkit if: matrix.cuda == 'with' id: cuda-toolkit @@ -338,18 +424,18 @@ jobs: shell: msys2 {0} run: | echo "ccachedir=$(cygpath -m $(${CCACHE} -k cache_dir))" >> $GITHUB_OUTPUT - echo "key=ccache:msvc:root:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $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@v3 + 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.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }} - ccache:msvc:root:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}: + 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. @@ -372,6 +458,8 @@ jobs: 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" \ @@ -413,7 +501,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} @@ -430,6 +518,41 @@ jobs: 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}" @@ -437,7 +560,9 @@ jobs: 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 \ + 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 diff --git a/.github/workflows/save/build-arch-emu.yaml b/.github/workflows/save/build-arch-emu.yaml deleted file mode 100644 index 7be4c923d8..0000000000 --- a/.github/workflows/save/build-arch-emu.yaml +++ /dev/null @@ -1,247 +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:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX" - # string with name of libraries to be checked - CHECK_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX" - # string with name of libraries that are installed - INSTALLED_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR: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 - extra-build-libs: ":GraphBLAS:LAGraph" - extra-check-libs: ":GraphBLAS:LAGraph" - - 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/save/build.yaml b/.github/workflows/save/build.yaml deleted file mode 100644 index 047745d646..0000000000 --- a/.github/workflows/save/build.yaml +++ /dev/null @@ -1,506 +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:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" - # string with name of libraries to be checked - CHECK_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" - # string with name of libraries that are installed - INSTALLED_LIBS: "SuiteSparse_config:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" - - -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 - - matrix: - msystem: [MINGW64, MINGW32, CLANG64, CLANG32] - 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: CLANG64 - target-prefix: mingw-w64-clang-x86_64 - f77-package: mingw-w64-clang-x86_64-fc - - 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/save/codeql-analysis.yaml b/.github/workflows/save/codeql-analysis.yaml deleted file mode 100644 index ec8b1ee459..0000000000 --- a/.github/workflows/save/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:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX -# - group: graph -# build-libs: GraphBLAS:LAGraph - - name: CodeQL (Ubuntu, ${{ matrix.group }}) - - steps: - - name: checkout repository - uses: actions/checkout@v3 - - - 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@v2 - 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@v2 - 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:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR: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@v3 - - - name: initialize CodeQL - # Initialize the CodeQL tools for scanning. - uses: github/codeql-action/init@v2 - 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@v2 - with: - category: ${{ matrix.group }}-32 diff --git a/.github/workflows/save/macos.yaml b/.github/workflows/save/macos.yaml deleted file mode 100644 index 789761f210..0000000000 --- a/.github/workflows/save/macos.yaml +++ /dev/null @@ -1,231 +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:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CSparse:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" - -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_Mongoose - run: | - cd ${GITHUB_WORKSPACE}/Mongoose/build - ctest . - - - name: check_AMD - run: | - cd ${GITHUB_WORKSPACE}/AMD - make demos - - - name: check_CAMD - run: | - cd ${GITHUB_WORKSPACE}/CAMD - make demos - - - name: check_COLAMD - run: | - cd ${GITHUB_WORKSPACE}/COLAMD - make demos - - - name: check_CCOLAMD - run: | - cd ${GITHUB_WORKSPACE}/CCOLAMD - make demos - - - name: check_CHOLMOD - run: | - cd ${GITHUB_WORKSPACE}/CHOLMOD - make demos - cd ${GITHUB_WORKSPACE}/CHOLMOD/build - ctest . - - - name: check_CSparse - run: | - cd ${GITHUB_WORKSPACE}/CSparse - make demos - - - name: check_CXSparse - run: | - cd ${GITHUB_WORKSPACE}/CXSparse - make demos - - - name: check_LDL - run: | - cd ${GITHUB_WORKSPACE}/LDL - make demos - - - name: check_KLU - run: | - cd ${GITHUB_WORKSPACE}/KLU - make demos - - - name: check_UMFPACK - run: | - cd ${GITHUB_WORKSPACE}/UMFPACK - make demos - - - name: check_RBio - run: | - cd ${GITHUB_WORKSPACE}/RBio - make demos - - - name: check_SPQR - run: | - cd ${GITHUB_WORKSPACE}/SPQR - make demos - - - name: check_SPEX - run: | - cd ${GITHUB_WORKSPACE}/SPEX - make demos - - - name: check_GraphBLAS - run: | - cd ${GITHUB_WORKSPACE}/GraphBLAS - make demos - - - name: check_LAGraph - run: | - cd ${GITHUB_WORKSPACE}/LAGraph - make demos - - - name: check_ParU - run: | - cd ${GITHUB_WORKSPACE}/ParU - 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/save/root-cmakelists.yaml b/.github/workflows/save/root-cmakelists.yaml deleted file mode 100644 index bcdcda49a9..0000000000 --- a/.github/workflows/save/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:Mongoose:AMD:BTF:CAMD:CCOLAMD:COLAMD:CHOLMOD:CXSparse:LDL:KLU:UMFPACK:ParU:RBio:SPQR:SPEX:GraphBLAS:LAGraph" - -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@v3 - 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/CMakeLists.txt b/CMakeLists.txt index f85012446c..8bee05191b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,7 @@ set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} # lower-case list of all projects that can be built by this root CMake file set ( SUITESPARSE_ALL_PROJECTS - "suitesparse_config;amd;;colamd;spex" ) + "suitesparse_config;mongoose;amd;btf;camd;ccolamd;colamd;cholmod;cxsparse;ldl;klu;umfpack;paru;rbio;spqr;spex;graphblas;lagraph" ) # lower-case list of extra projects that can be built by this root CMake file set ( SUITESPARSE_EXTRA_PROJECTS diff --git a/Makefile b/Makefile index 743f07a884..0b1d0d81d6 100644 --- a/Makefile +++ b/Makefile @@ -31,6 +31,21 @@ library: ( cd AMD && $(MAKE) ) ( cd COLAMD && $(MAKE) ) ( cd SPEX && $(MAKE) ) + ( cd Mongoose && $(MAKE) ) + ( cd BTF && $(MAKE) ) + ( cd CAMD && $(MAKE) ) + ( cd CCOLAMD && $(MAKE) ) + ( cd CHOLMOD && $(MAKE) ) + ( cd CSparse && $(MAKE) ) + ( cd CXSparse && $(MAKE) ) + ( cd LDL && $(MAKE) ) + ( cd KLU && $(MAKE) ) + ( cd UMFPACK && $(MAKE) ) + ( cd ParU && $(MAKE) ) + ( cd RBio && $(MAKE) ) + ( cd SPQR && $(MAKE) ) + ( cd GraphBLAS && $(MAKE) ) + ( cd LAGraph && $(MAKE) ) # compile; "make install" only in SuiteSparse/lib and SuiteSparse/include local: @@ -38,6 +53,22 @@ local: ( cd AMD && $(MAKE) local ) ( cd COLAMD && $(MAKE) local ) ( cd SPEX && $(MAKE) local ) + ( cd Mongoose && $(MAKE) local ) + ( cd BTF && $(MAKE) local ) + ( cd CAMD && $(MAKE) local ) + ( cd CCOLAMD && $(MAKE) local ) + ( cd CHOLMOD && $(MAKE) local ) + ( cd CSparse && $(MAKE) ) +# CSparse is compiled but not installed + ( cd CXSparse && $(MAKE) local ) + ( cd LDL && $(MAKE) local ) + ( cd KLU && $(MAKE) local ) + ( cd UMFPACK && $(MAKE) local ) + ( cd ParU && $(MAKE) local ) + ( cd RBio && $(MAKE) local ) + ( cd SPQR && $(MAKE) local ) + ( cd GraphBLAS && $(MAKE) local ) + ( cd LAGraph && $(MAKE) local ) # compile; "sudo make install" will install only in /usr/local # (or whatever your CMAKE_INSTALL_PREFIX is) @@ -46,6 +77,22 @@ global: ( cd AMD && $(MAKE) global ) ( cd COLAMD && $(MAKE) global ) ( cd SPEX && $(MAKE) global ) + ( cd Mongoose && $(MAKE) global ) + ( cd BTF && $(MAKE) global ) + ( cd CAMD && $(MAKE) global ) + ( cd CCOLAMD && $(MAKE) global ) + ( cd CHOLMOD && $(MAKE) global ) + ( cd CSparse && $(MAKE) ) +# CSparse is compiled but not installed + ( cd CXSparse && $(MAKE) global ) + ( cd LDL && $(MAKE) global ) + ( cd KLU && $(MAKE) global ) + ( cd UMFPACK && $(MAKE) global ) + ( cd ParU && $(MAKE) global ) + ( cd RBio && $(MAKE) global ) + ( cd SPQR && $(MAKE) global ) + ( cd GraphBLAS && $(MAKE) global ) + ( cd LAGraph && $(MAKE) global ) # install all packages. Location depends on prior "make", "make global" etc install: @@ -53,6 +100,21 @@ install: ( cd AMD && $(MAKE) install ) ( cd COLAMD && $(MAKE) install ) ( cd SPEX && $(MAKE) install ) + ( cd Mongoose && $(MAKE) install ) + ( cd BTF && $(MAKE) install ) + ( cd CAMD && $(MAKE) install ) + ( cd CCOLAMD && $(MAKE) install ) + ( cd CHOLMOD && $(MAKE) install ) + ( cd CXSparse && $(MAKE) install ) +# CXSparse is installed instead + ( cd LDL && $(MAKE) install ) + ( cd KLU && $(MAKE) install ) + ( cd UMFPACK && $(MAKE) install ) + ( cd ParU && $(MAKE) install ) + ( cd RBio && $(MAKE) install ) + ( cd SPQR && $(MAKE) install ) + ( cd GraphBLAS && $(MAKE) install ) + ( cd LAGraph && $(MAKE) install ) # uninstall all packages uninstall: @@ -60,6 +122,20 @@ uninstall: ( cd AMD && $(MAKE) uninstall ) ( cd COLAMD && $(MAKE) uninstall ) ( cd SPEX && $(MAKE) uninstall ) + ( cd Mongoose && $(MAKE) uninstall ) + ( cd CAMD && $(MAKE) uninstall ) + ( cd BTF && $(MAKE) uninstall ) + ( cd KLU && $(MAKE) uninstall ) + ( cd LDL && $(MAKE) uninstall ) + ( cd CCOLAMD && $(MAKE) uninstall ) + ( cd ParU && $(MAKE) uninstall ) + ( cd UMFPACK && $(MAKE) uninstall ) + ( cd CHOLMOD && $(MAKE) uninstall ) + ( cd CXSparse && $(MAKE) uninstall ) + ( cd RBio && $(MAKE) uninstall ) + ( cd SPQR && $(MAKE) uninstall ) + ( cd GraphBLAS && $(MAKE) uninstall ) + ( cd LAGraph && $(MAKE) uninstall ) # Remove all files not in the original distribution distclean: purge @@ -70,8 +146,25 @@ purge: - ( cd AMD && $(MAKE) purge ) - ( cd COLAMD && $(MAKE) purge ) - ( cd SPEX && $(MAKE) purge ) + - ( cd Mongoose && $(MAKE) purge ) + - ( cd CAMD && $(MAKE) purge ) + - ( cd BTF && $(MAKE) purge ) + - ( cd KLU && $(MAKE) purge ) + - ( cd LDL && $(MAKE) purge ) + - ( cd CCOLAMD && $(MAKE) purge ) + - ( cd UMFPACK && $(MAKE) purge ) + - ( cd CHOLMOD && $(MAKE) purge ) + - ( cd CSparse && $(MAKE) purge ) + - ( cd CXSparse && $(MAKE) purge ) + - ( cd RBio && $(MAKE) purge ) + - ( cd SPQR && $(MAKE) purge ) + - $(RM) MATLAB_Tools/*/*.mex* MATLAB_Tools/*/*/*.mex* + - $(RM) MATLAB_Tools/*/*.o MATLAB_Tools/*/*/*.o + - $(RM) -r Example/build/* + - ( cd GraphBLAS && $(MAKE) purge ) + - ( cd ParU && $(MAKE) purge ) + - ( cd LAGraph && $(MAKE) purge ) - $(RM) -r include/* bin/* lib/* - - $(RM) README.md clean: purge @@ -81,23 +174,78 @@ demos: - ( cd AMD && $(MAKE) demos ) - ( cd COLAMD && $(MAKE) demos ) - ( cd SPEX && $(MAKE) demos ) + - ( cd Mongoose && $(MAKE) demos ) + - ( cd CAMD && $(MAKE) demos ) + - ( cd BTF && $(MAKE) demos ) + - ( cd KLU && $(MAKE) demos ) + - ( cd LDL && $(MAKE) demos ) + - ( cd CCOLAMD && $(MAKE) demos ) + - ( cd UMFPACK && $(MAKE) demos ) + - ( cd CHOLMOD && $(MAKE) demos ) + - ( cd CSparse && $(MAKE) demos ) + - ( cd CXSparse && $(MAKE) demos ) + - ( cd RBio && $(MAKE) demos ) + - ( cd SPQR && $(MAKE) demos ) + - ( cd GraphBLAS && $(MAKE) demos ) + - ( cd ParU && $(MAKE) demos ) + - ( cd LAGraph && $(MAKE) demos ) # Create the PDF documentation docs: + ( cd GraphBLAS && $(MAKE) docs ) + ( cd Mongoose && $(MAKE) docs ) ( cd AMD && $(MAKE) docs ) + ( cd CAMD && $(MAKE) docs ) + ( cd KLU && $(MAKE) docs ) + ( cd LDL && $(MAKE) docs ) + ( cd UMFPACK && $(MAKE) docs ) + ( cd CHOLMOD && $(MAKE) docs ) + ( cd ParU && $(MAKE) docs ) + ( cd SPQR && $(MAKE) docs ) ( cd SPEX && $(MAKE) docs ) # statement coverage (Linux only); this requires a lot of time. cov: local install + ( cd CXSparse && $(MAKE) cov ) + ( cd CSparse && $(MAKE) cov ) + ( cd CHOLMOD && $(MAKE) cov ) + ( cd KLU && $(MAKE) cov ) + ( cd SPQR && $(MAKE) cov ) + ( cd UMFPACK && $(MAKE) cov ) ( cd SPEX && $(MAKE) cov ) + ( cd LAGraph && $(MAKE) cov ) + +gbmatlab: + ( cd GraphBLAS/GraphBLAS && $(MAKE) ) + +gblocal: + ( cd GraphBLAS/GraphBLAS && $(MAKE) local && $(MAKE) install ) debug: ( cd SuiteSparse_config && $(MAKE) debug ) + # ( cd Mongoose && $(MAKE) debug ) ( cd AMD && $(MAKE) debug ) + ( cd BTF && $(MAKE) debug ) + ( cd CAMD && $(MAKE) debug ) + ( cd CCOLAMD && $(MAKE) debug ) ( cd COLAMD && $(MAKE) debug ) + ( cd CHOLMOD && $(MAKE) debug ) + ( cd CSparse && $(MAKE) debug ) + ( cd CXSparse && $(MAKE) debug ) + ( cd LDL && $(MAKE) debug ) + ( cd KLU && $(MAKE) debug ) + ( cd UMFPACK && $(MAKE) debug ) + ( cd ParU && $(MAKE) debug ) + ( cd RBio && $(MAKE) debug ) + ( cd SPQR && $(MAKE) debug ) ( cd SPEX && $(MAKE) debug ) + ( cd GraphBLAS && $(MAKE) cdebug ) + ( cd LAGraph && $(MAKE) debug ) tests: + ( cd Mongoose && $(MAKE) test ) + ( cd CHOLMOD && $(MAKE) test ) + ( cd LAGraph && $(MAKE) test ) test: tests From 0977160207971c9b4e73a22ad121de629dad3fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Fri, 23 Feb 2024 18:06:33 +0100 Subject: [PATCH 64/98] Document `SUITESPARSE_C_TO_FORTRAN` in `README.md` Give background for why this configuration parameter is needed, describe its usage and give some hints for when a user might need to set this parameter manually. --- README.md | 26 ++++++++++++++++++++++++-- SuiteSparse_config/Config/README.md.in | 26 ++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d352271356..460bf5887b 100644 --- a/README.md +++ b/README.md @@ -1072,10 +1072,32 @@ build type). The static libraries will not be built (since 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 (see - `SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake` for details). + `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`: diff --git a/SuiteSparse_config/Config/README.md.in b/SuiteSparse_config/Config/README.md.in index bc0c9142fa..9908e4e5c4 100644 --- a/SuiteSparse_config/Config/README.md.in +++ b/SuiteSparse_config/Config/README.md.in @@ -1072,10 +1072,32 @@ build type). The static libraries will not be built (since 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 (see - `SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake` for details). + `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`: From a9651a104278e482f162e6431fd30c3e64d16d21 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 23 Feb 2024 18:09:09 -0600 Subject: [PATCH 65/98] add reference to math.js --- README.md | 4 ++++ SuiteSparse_config/Config/README.md.in | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/README.md b/README.md index d352271356..37824afef5 100644 --- a/README.md +++ b/README.md @@ -1195,6 +1195,10 @@ 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 diff --git a/SuiteSparse_config/Config/README.md.in b/SuiteSparse_config/Config/README.md.in index bc0c9142fa..30e71fdcb6 100644 --- a/SuiteSparse_config/Config/README.md.in +++ b/SuiteSparse_config/Config/README.md.in @@ -1195,6 +1195,10 @@ 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 From 71e34336b8163446cbe7b131f2367a60cf6e13e6 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 23 Feb 2024 18:10:38 -0600 Subject: [PATCH 66/98] moving more SPEX GMP interface to SPEX.h; adding SPEX_TRY to SPEX.h --- SPEX/Config/SPEX.h.in | 144 ++++++++++++++- SPEX/Config/Tcov_Makefile.in | 16 +- .../Demo/Utilities/spex_demo_check_solution.c | 76 ++++---- .../Utilities/spex_demo_determine_error.c | 22 +-- .../spex_demo_process_command_line.c | 2 +- SPEX/Demo/Utilities/spex_demo_read_dense.c | 2 +- SPEX/Demo/Utilities/spex_demo_tripread.c | 11 +- SPEX/Demo/spex_demo_backslash.c | 62 ++++--- SPEX/Demo/spex_demo_cholesky_extended.c | 64 ++++--- SPEX/Demo/spex_demo_cholesky_simple.c | 94 +++++----- SPEX/Demo/spex_demo_lu_doub.c | 165 +++++------------- SPEX/Demo/spex_demo_lu_extended.c | 128 ++++++++------ SPEX/Demo/spex_demo_lu_simple1.c | 59 ++++--- SPEX/Demo/spex_demo_lu_simple2.c | 52 ++++-- SPEX/Demo/spex_demo_threaded.c | 51 ++++-- SPEX/Demo/spex_demos.h | 65 +++---- SPEX/Doc/SPEX_UserGuide.tex | 4 +- SPEX/Include/SPEX.h | 144 ++++++++++++++- .../spex_cholesky_up_triangular_solve.c | 2 +- SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 3 + SPEX/SPEX_Utilities/Source/spex_gmp.h | 89 ---------- .../Source/spex_util_internal.h | 14 -- SPEX/Tcov/.gitignore | 8 +- SPEX/Tcov/tcov_for_lu2.c | 5 +- 24 files changed, 720 insertions(+), 562 deletions(-) diff --git a/SPEX/Config/SPEX.h.in b/SPEX/Config/SPEX.h.in index a559542548..a8a15e6725 100644 --- a/SPEX/Config/SPEX.h.in +++ b/SPEX/Config/SPEX.h.in @@ -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,7 +66,7 @@ // // See license.txt for license info. // -// This software is copyright by Christopher Lourenco, Jinhao Chen, +// This software is copyright by Christopher Lourenco, Jinhao Chen, // Lorena Mejia Domenzain, Erick Moreno-Centeno and Timothy A. Davis. // All Rights Reserved. // @@ -179,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 //------------------------------------------------------------------------------ @@ -352,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 { @@ -418,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 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 //------------------------------------------------------------------------------ @@ -500,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 ( @@ -962,6 +1012,90 @@ SPEX_info SPEX_mpfr_free_cache (void) ; SPEX_info SPEX_mpfr_free_str (char *str) ; +//------------------------------------------------------------------------------ +// Field access macros for MPZ/MPQ/MPFR struct +//------------------------------------------------------------------------------ + +// These follow similar definitions 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) + +/* 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); \ + } \ +} + //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -975,7 +1109,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 diff --git a/SPEX/Config/Tcov_Makefile.in b/SPEX/Config/Tcov_Makefile.in index c0a921c52f..6540c4255b 100644 --- a/SPEX/Config/Tcov_Makefile.in +++ b/SPEX/Config/Tcov_Makefile.in @@ -221,18 +221,18 @@ 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 + ./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 #------------------------------------------------------------------------------- diff --git a/SPEX/Demo/Utilities/spex_demo_check_solution.c b/SPEX/Demo/Utilities/spex_demo_check_solution.c index f7e8684e3a..5253ff8b62 100644 --- a/SPEX/Demo/Utilities/spex_demo_check_solution.c +++ b/SPEX/Demo/Utilities/spex_demo_check_solution.c @@ -2,13 +2,14 @@ // Demo/spex_check_solution: checks whether a given vector exactly solves Ax=b //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// SPEX: (c) 2019-2024, 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 //------------------------------------------------------------------------------ +// FIXME: need SPEX_MPQ_CLEAR, SPEX_MPQ_SET_NULL, SPEX_2D in SPEX.h #include "spex_demos.h" @@ -20,7 +21,6 @@ SPEX_matrix_free(&b2, NULL); \ } - SPEX_info spex_demo_check_solution ( const SPEX_matrix A, // Input matrix @@ -31,27 +31,29 @@ SPEX_info spex_demo_check_solution { //-------------------------------------------------------------------------- - // check inputs. Input are also checked by the two callers + // Declare vars //-------------------------------------------------------------------------- - SPEX_info info ; + 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; //-------------------------------------------------------------------------- - // Declare vars + // initialize //-------------------------------------------------------------------------- - 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_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, + 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 //-------------------------------------------------------------------------- @@ -63,15 +65,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)); } } } @@ -80,17 +82,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)); } } @@ -103,40 +104,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 3cc1d9806e..1133903dd4 100644 --- a/SPEX/Demo/Utilities/spex_demo_determine_error.c +++ b/SPEX/Demo/Utilities/spex_demo_determine_error.c @@ -1,8 +1,8 @@ //------------------------------------------------------------------------------ -// 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, +// SPEX: (c) 2019-2024, 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,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 c05bcf25c4..ce0e7ba31a 100644 --- a/SPEX/Demo/Utilities/spex_demo_process_command_line.c +++ b/SPEX/Demo/Utilities/spex_demo_process_command_line.c @@ -2,7 +2,7 @@ // Demo/spex_process_command_line: processes command line for user specified options //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// SPEX: (c) 2019-2024, 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 19faff8a54..003a5b5c83 100644 --- a/SPEX/Demo/Utilities/spex_demo_read_dense.c +++ b/SPEX/Demo/Utilities/spex_demo_read_dense.c @@ -2,7 +2,7 @@ // Demo/spex_read_dense: reads an integral dense matrix //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// SPEX: (c) 2019-2024, 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 eb8bd8cdbf..d39f0a2e1e 100644 --- a/SPEX/Demo/Utilities/spex_demo_tripread.c +++ b/SPEX/Demo/Utilities/spex_demo_tripread.c @@ -2,7 +2,7 @@ // Demo/spex_demo_tripread: reads a matrix stored in triplet format of a given type //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// SPEX: (c) 2019-2024, 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,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 76cdb94afa..13242134a0 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, +// SPEX: (c) 2021-2024, 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); \ @@ -25,36 +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. - //-------------------------------------------------------------------------- - - DEMO_INIT (ok) ; - - //-------------------------------------------------------------------------- - // Declare memory & Process Command Line - //-------------------------------------------------------------------------- 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)); //-------------------------------------------------------------------------- @@ -62,7 +66,7 @@ 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"); @@ -72,21 +76,23 @@ int main( int argc, char *argv[] ) // 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 (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 @@ -99,7 +105,7 @@ int main( int argc, char *argv[] ) option->print_level = 0; - DEMO_OK( SPEX_backslash(&x, SPEX_MPQ, A, b, option)); + SPEX_TRY ( SPEX_backslash(&x, SPEX_MPQ, A, b, option)); double end = SuiteSparse_time (); @@ -108,13 +114,13 @@ int main( int argc, char *argv[] ) 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 diff --git a/SPEX/Demo/spex_demo_cholesky_extended.c b/SPEX/Demo/spex_demo_cholesky_extended.c index 8997201ff1..bc09149cf5 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, +// SPEX: (c) 2022-2024, 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); \ @@ -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. - //-------------------------------------------------------------------------- - - DEMO_INIT (ok) ; - - //-------------------------------------------------------------------------- - // Declare memory & Process Command Line - //-------------------------------------------------------------------------- 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,7 +66,7 @@ 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"); @@ -68,24 +74,26 @@ int main( int argc, char *argv[] ) 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 (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 @@ -97,7 +105,7 @@ int main( int argc, char *argv[] ) //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)); double end_col = SuiteSparse_time (); @@ -108,12 +116,12 @@ int main( int argc, char *argv[] ) //option->algo=SPEX_CHOL_LEFT; double start_factor = SuiteSparse_time (); - DEMO_OK( SPEX_cholesky_factorize(&F, A, S, option)); + SPEX_TRY ( SPEX_cholesky_factorize(&F, A, S, option)); 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 @@ -121,7 +129,7 @@ int main( int argc, char *argv[] ) double start_solve = SuiteSparse_time (); - DEMO_OK( SPEX_cholesky_solve(&x, F, b, option)); + SPEX_TRY ( SPEX_cholesky_solve(&x, F, b, option)); double end_solve = SuiteSparse_time (); @@ -141,7 +149,7 @@ int main( int argc, char *argv[] ) // 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 diff --git a/SPEX/Demo/spex_demo_cholesky_simple.c b/SPEX/Demo/spex_demo_cholesky_simple.c index 42a2f8bfdf..9b0a5207e9 100644 --- a/SPEX/Demo/spex_demo_cholesky_simple.c +++ b/SPEX/Demo/spex_demo_cholesky_simple.c @@ -2,48 +2,66 @@ // Demo/spex_demo_cholesky_simple.c: example of simple call of SPEX_Cholesky //------------------------------------------------------------------------------ -// SPEX: (c) 2022-2023, Christopher Lourenco, Jinhao Chen, +// SPEX: (c) 2022-2024, 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 +// usage: FIXME +// spex_demo_cholesky_simple f input > out // out is file for output calculated result #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. //-------------------------------------------------------------------------- - DEMO_INIT (ok) ; + 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) { @@ -51,15 +69,10 @@ int main (int argc, char **argv) } //-------------------------------------------------------------------------- - // Declare our data structures + // Get options and process the command line //-------------------------------------------------------------------------- - 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"); @@ -67,9 +80,9 @@ int main (int argc, char **argv) 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)); //-------------------------------------------------------------------------- @@ -78,32 +91,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 (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 (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) @@ -113,13 +128,15 @@ int main (int argc, char **argv) FREE_WORKSPACE; return (1) ; } + //-------------------------------------------------------------------------- // solve //-------------------------------------------------------------------------- + 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)); double end_s = SuiteSparse_time (); @@ -128,19 +145,18 @@ int main (int argc, char **argv) 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) ; } diff --git a/SPEX/Demo/spex_demo_lu_doub.c b/SPEX/Demo/spex_demo_lu_doub.c index 690f50544f..9b77c861e3 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, +// SPEX: (c) 2019-2024, 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 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,90 +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. //-------------------------------------------------------------------------- - DEMO_INIT (ok) ; - - //-------------------------------------------------------------------------- - // 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_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. @@ -127,19 +89,14 @@ 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"); @@ -147,45 +104,21 @@ int main (int argc, char *argv[]) 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 (1) ; - } - 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 (1) ; - } -#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. //-------------------------------------------------------------------------- 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)); double end_col = SuiteSparse_time (); @@ -197,20 +130,12 @@ int main (int argc, char *argv[]) double start_factor = SuiteSparse_time (); - ok = SPEX_lu_factorize(&F, A, S, option); - if (ok != SPEX_OK) - { - if (ok == SPEX_SINGULAR) - { - printf("\nSingular"); - } - return (1) ; - } + SPEX_TRY (SPEX_lu_factorize(&F, A, S, option)); double end_factor = SuiteSparse_time (); //-------------------------------------------------------------------------- - // We now solve the system Ax=b using the L and U factors computed above. + // print results //-------------------------------------------------------------------------- // Timing stats diff --git a/SPEX/Demo/spex_demo_lu_extended.c b/SPEX/Demo/spex_demo_lu_extended.c index 9190d58791..dc959dae42 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, +// SPEX: (c) 2019-2024, 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: -// 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. //-------------------------------------------------------------------------- - DEMO_INIT (ok) ; + SPEX_TRY (SPEX_initialize ( )) ; //-------------------------------------------------------------------------- // We first initialize the default parameters. These parameters are modified @@ -119,22 +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; // 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. @@ -142,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)); //-------------------------------------------------------------------------- @@ -152,27 +166,30 @@ 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 (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 (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) @@ -196,7 +213,7 @@ int main (int argc, char *argv[]) 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)); double end_col = SuiteSparse_time (); @@ -208,7 +225,7 @@ int main (int argc, char *argv[]) double start_factor = SuiteSparse_time (); - DEMO_OK(SPEX_lu_factorize(&F, A, S, option)); + SPEX_TRY (SPEX_lu_factorize(&F, A, S, option)); double end_factor = SuiteSparse_time (); @@ -234,7 +251,7 @@ 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)); double end_solve = SuiteSparse_time (); @@ -268,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__); + 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 4f8fde794c..1ca3b87386 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, +// SPEX: (c) 2019-2024, 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,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. //-------------------------------------------------------------------------- - DEMO_INIT (ok) ; + 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,9 +91,9 @@ 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 @@ -101,7 +102,7 @@ int main (void) 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)); double end_s = SuiteSparse_time (); diff --git a/SPEX/Demo/spex_demo_lu_simple2.c b/SPEX/Demo/spex_demo_lu_simple2.c index b36716a014..ffecb9d933 100644 --- a/SPEX/Demo/spex_demo_lu_simple2.c +++ b/SPEX/Demo/spex_demo_lu_simple2.c @@ -2,7 +2,7 @@ // Demo/spex_demo_lu_simple2.c: example of simple SPEX_LU call for triplet format //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// SPEX: (c) 2019-2024, 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,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. //-------------------------------------------------------------------------- - DEMO_INIT (ok) ; + 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 (1) ; } - mat_name = argv[1]; rhs_name = argv[2]; //-------------------------------------------------------------------------- - // Declare our data structures + // Get default options //-------------------------------------------------------------------------- - 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 (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 (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) @@ -116,7 +131,7 @@ int main (int argc, char **argv) // 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)); double end_s = SuiteSparse_time (); @@ -129,7 +144,6 @@ int main (int argc, char **argv) //-------------------------------------------------------------------------- FREE_WORKSPACE; - printf ("\n%s: all tests passed\n\n", __FILE__); return (0) ; } diff --git a/SPEX/Demo/spex_demo_threaded.c b/SPEX/Demo/spex_demo_threaded.c index be424fbf0c..ac9f002437 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, +// SPEX: (c) 2021-2024, 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); \ @@ -30,30 +39,31 @@ 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. //-------------------------------------------------------------------------- - DEMO_INIT (ok) ; + SPEX_TRY (SPEX_initialize ( )) ; //-------------------------------------------------------------------------- // Declare memory & Process Command Line //-------------------------------------------------------------------------- - int64_t n = 0 ; - - 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)); //-------------------------------------------------------------------------- @@ -61,7 +71,7 @@ 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"); @@ -71,21 +81,24 @@ int main( int argc, char *argv[] ) // 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 (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 diff --git a/SPEX/Demo/spex_demos.h b/SPEX/Demo/spex_demos.h index 2fa92816ac..b3b8109cd7 100644 --- a/SPEX/Demo/spex_demos.h +++ b/SPEX/Demo/spex_demos.h @@ -2,48 +2,32 @@ // Demo/spex_demos.h: #include file the demo programs //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2023, Christopher Lourenco, Jinhao Chen, +// SPEX: (c) 2019-2024, 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" -// FIXME: why include spex_util_internal.h?? -#include "spex_util_internal.h" -// FIXME: why include spex_gmp.h?? It's not installed. Do we add it to -// the installed headers? -#include "spex_gmp.h" -#define DEMO_OK(method) \ -{ \ - ok = method ; \ - if (ok != SPEX_OK) \ - { \ - spex_demo_determine_error (ok) ; \ - FREE_WORKSPACE ; \ - return (1) ; \ - } \ +// 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)) - -#define DEMO_INIT(ok) \ - SPEX_info ok = SPEX_initialize ( ) ; \ - if (ok != SPEX_OK) \ - { \ - fprintf (stderr, "SPEX ERROR: failed to initialize\n") ; \ - return (1) ; \ - } - /* 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. @@ -55,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 ) ; @@ -66,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 ) ; @@ -76,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 @@ -104,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/SPEX_UserGuide.tex b/SPEX/Doc/SPEX_UserGuide.tex index dc8c7676cb..d074f0b4a4 100644 --- a/SPEX/Doc/SPEX_UserGuide.tex +++ b/SPEX/Doc/SPEX_UserGuide.tex @@ -2074,7 +2074,7 @@ \subsubsection{Populating data structures} corresponding to CSC form, sparse triplet form or dense form, allocate a shallow \verb|SPEX_matrix| and assign vectors accordingly, then use \verb|SPEX_matrix_copy| to get a \verb|SPEX_matrix| in the desired kind and -type. For more details, refer to \verb|SPEX/SPEX/SPEX_Left_LU/Demo/example.c|. In a case when +type. For more details, refer to the example programs in \verb|SPEX/SPEX/Demo/*.c|. In a case when \verb|A| is available in format other than CSC \verb|mpz|, and/or \verb|b| is available in format other than dense \verb|mpz|, the following code snippet shows how to get \verb|A| and \verb|b| in a required format. @@ -2248,6 +2248,8 @@ \subsubsection{Converting the solution vector to the final desired form} which utilize SPEX. These files demonstrate the usage of SPEX as follows: +{\bf FIXME: this is out of date} + \begin{itemize} \item \verb|example.c|: This example generates a random dense $50 \times 50$ matrix and a random dense $50 \times 1$ right hand side vector $b$ and diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index b67f344a60..3461d69442 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -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,7 +66,7 @@ // // See license.txt for license info. // -// This software is copyright by Christopher Lourenco, Jinhao Chen, +// This software is copyright by Christopher Lourenco, Jinhao Chen, // Lorena Mejia Domenzain, Erick Moreno-Centeno and Timothy A. Davis. // All Rights Reserved. // @@ -179,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 //------------------------------------------------------------------------------ @@ -352,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 { @@ -418,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 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 //------------------------------------------------------------------------------ @@ -500,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 ( @@ -962,6 +1012,90 @@ SPEX_info SPEX_mpfr_free_cache (void) ; SPEX_info SPEX_mpfr_free_str (char *str) ; +//------------------------------------------------------------------------------ +// Field access macros for MPZ/MPQ/MPFR struct +//------------------------------------------------------------------------------ + +// These follow similar definitions 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) + +/* 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); \ + } \ +} + //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ @@ -975,7 +1109,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 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 aedaac5375..084114f668 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_up_triangular_solve.c @@ -122,7 +122,7 @@ SPEX_info spex_cholesky_up_triangular_solve // Reset x[i] = 0 for all i in nonzero pattern xi [top..n-1] for (i = top; i < n; i++) { - int64_t j = xi [i] ; + j = xi [i] ; ASSERT (j >= 0 && j <= k) ; SPEX_MPZ_SET_UI(x->x.mpz[j],0); } diff --git a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c index 0f0e886343..c42e4c3e2b 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -370,6 +370,9 @@ void *spex_gmp_allocate // spex_gmp_safe_free: free a block of memory and remove it from the archive //------------------------------------------------------------------------------ +// FIXME: what is this doing? +#define SPEX_MPFR_REAL_PTR(x) (&((x)->_mpfr_d[-1])) + static inline void spex_gmp_safe_free (void *p) { if (spex_gmp != NULL) diff --git a/SPEX/SPEX_Utilities/Source/spex_gmp.h b/SPEX/SPEX_Utilities/Source/spex_gmp.h index 3e684c51f0..e47dd12f69 100644 --- a/SPEX/SPEX_Utilities/Source/spex_gmp.h +++ b/SPEX/SPEX_Utilities/Source/spex_gmp.h @@ -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_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index a7f82cfcc4..13556b3098 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -586,20 +586,6 @@ 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) - //------------------------------------------------------------------------------ // debugging //------------------------------------------------------------------------------ diff --git a/SPEX/Tcov/.gitignore b/SPEX/Tcov/.gitignore index 9e11540edb..16893476e8 100644 --- a/SPEX/Tcov/.gitignore +++ b/SPEX/Tcov/.gitignore @@ -1,3 +1,9 @@ # Ignore these files: Makefile - +spex*.c +SPEX*.c +*.out +spex_demo_lu_extended +tcov_for_cholesky +tcov_for_lu +tcov_for_lu2 diff --git a/SPEX/Tcov/tcov_for_lu2.c b/SPEX/Tcov/tcov_for_lu2.c index 673aeb366b..f4057661d6 100644 --- a/SPEX/Tcov/tcov_for_lu2.c +++ b/SPEX/Tcov/tcov_for_lu2.c @@ -179,5 +179,8 @@ int main (int argc, char *argv []) SPEX_lu_analyze( &S, A, option); SPEX_FREE_ALL; - + + printf ("%s: all tests passed\n\n", __FILE__); + fprintf (stderr, "%s: all tests passed\n\n", __FILE__); + return (0) ; } From 213bae707eb8baa6db3ea0edae348ac491355834 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 23 Feb 2024 20:01:32 -0600 Subject: [PATCH 67/98] debug cleanup --- .../Source/spex_util_internal.h | 65 +++++-------------- 1 file changed, 15 insertions(+), 50 deletions(-) diff --git a/SPEX/SPEX_Utilities/Source/spex_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index 13556b3098..b66c0711de 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -151,34 +151,23 @@ // 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) \ - { \ - fprintf(stderr, "NOT OK: file %s line %d\n",__FILE__,__LINE__) ; \ - fflush (stdout) ; \ - fflush (stderr) ; \ - SPEX_FREE_ALL; \ - return (info); \ - } \ - } -#else +// 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); \ - } \ - } +#define SPEX_CHECK(method) \ +{ \ + info = (method); \ + if (info != SPEX_OK) \ + { \ + SPEX_FREE_ALL; \ + return (info); \ + } \ +} -#endif +//------------------------------------------------------------------------------ +// 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" @@ -214,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 @@ -586,25 +571,5 @@ SPEX_info spex_amd ASSERT_KIND (A,required_kind) ; \ ASSERT_TYPE (A,required_type) ; -//------------------------------------------------------------------------------ -// debugging -//------------------------------------------------------------------------------ - -#if 0 -#define HERE \ -{ \ - fprintf (stderr, "HERE: %4d %s\n", __LINE__, __FILE__) ; \ - fflush (stdout) ; \ - fflush (stderr) ; \ -} - -#define HERE2(s) \ -{ \ - fprintf (stderr, "HERE %s: %4d %s\n", s, __LINE__, __FILE__) ; \ - fflush (stdout) ; \ - fflush (stderr) ; \ -} -#endif - #endif From 5d2e7bf8af48b5fa3507907d4c2eea9560e9cc23 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 23 Feb 2024 20:15:38 -0600 Subject: [PATCH 68/98] revert 4f45fc4, and remove SUITESPARSE_BLAS_*UNDERSCORE; use SUITESPARSE_C_TO_FORTRAN instead, with better docs --- SuiteSparse_config/CMakeLists.txt | 13 ++----- .../cmake_modules/SuiteSparsePolicy.cmake | 37 +------------------ 2 files changed, 6 insertions(+), 44 deletions(-) diff --git a/SuiteSparse_config/CMakeLists.txt b/SuiteSparse_config/CMakeLists.txt index 314331a2ac..7c06afcb53 100644 --- a/SuiteSparse_config/CMakeLists.txt +++ b/SuiteSparse_config/CMakeLists.txt @@ -45,17 +45,12 @@ set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} include ( SuiteSparsePolicy ) -if ( ( NOT SUITESPARSE_HAS_FORTRAN ) OR SUITESPARSE_BLAS_UNDERSCORE OR SUITESPARSE_BLAS_NO_UNDERSCORE ) - # No Fortran compiler available or enabled, or either of the - # SUITESPARSE_BLAS_UNDERSCORE or SUITESPARSE_BLAS_NO_UNDERSCORE are set ON: - # configuration is not automatic. +if ( SUITESPARSE_HAS_FORTRAN ) + include ( FortranCInterface ) +else ( ) + # No Fortran compiler available or enabled, configuration is not automatic. set ( FortranCInterface_GLOBAL_MACRO ${SUITESPARSE_C_TO_FORTRAN} ) set ( FortranCInterface_GLOBAL__MACRO ${SUITESPARSE_C_TO_FORTRAN} ) -else ( ) - # A Fortran compiler is available and enabled, and both - # SUITESPARSE_BLAS_UNDERSCORE and SUITESPARSE_BLAS_NO_UNDERSCORE are set to - # their default values (OFF): configure the BLAS automatically. - include ( FortranCInterface ) endif ( ) message ( STATUS "C to Fortran calling protocol: ") diff --git a/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake b/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake index 51d63eada8..b6b195407c 100644 --- a/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake +++ b/SuiteSparse_config/cmake_modules/SuiteSparsePolicy.cmake @@ -72,25 +72,6 @@ # for your system. # Default: ON # -# SUITESPARSE_BLAS_UNDERSCORE: if ON, the SUITESPARSE_C_TO_FORTRAN setting -# is ignored, and the Fortran compiler is also ignored -# even if available and used. The C-to-Fortran -# convention "(name,NAME) name##_" is used, which forces -# the appending of an underscore to the names of the -# BLAS/LAPACK functions (dgemm_ for example). -# Default: OFF -# -# SUITESPARSE_BLAS_NO_UNDERSCORE: if ON and SUITESPARSE_BLAS_UNDERSCORE is -# OFF, the SUITESPARSE_C_TO_FORTRAN setting is ignored, -# and the Fortran compiler is also ignored even if -# available and used. The C-to-Fortran convention -# "(name,NAME) name" is used, which forces NO appending of an -# underscore to the names of the BLAS/LAPACK functions. -# (dgemm for example). Note that if -# SUITESPARSE_BLAS_UNDERSCORE is set to ON, this setting -# is ignored. -# Default: OFF -# # 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 @@ -316,22 +297,8 @@ if ( SUITESPARSE_USE_STRICT AND SUITESPARSE_USE_FORTRAN AND NOT SUITESPARSE_HAS_ message ( FATAL_ERROR "Fortran required for SuiteSparse but not found" ) endif ( ) -# C-to-Fortran name mangling -option ( SUITESPARSE_BLAS_UNDERSCORE "OFF (default): do not force an underscore; ON: ignore Fortran and force calls to BLAS to use a trailing underscore (dgemm_)" OFF ) -option ( SUITESPARSE_BLAS_NO_UNDERSCORE "OFF (default): do not force no-underscore; ON: ignore Fortran and force calls to BLAS to NOT use a trailing underscore (dgemm)" OFF ) -if ( SUITESPARSE_BLAS_UNDERSCORE ) - # Ignore the Fortran compiler even if used, also ignore the C compiler, and - # force an underscore to be appended to all calls to BLAS/LAPACK. - # Also force the name to be lowercase (dgemm_ for example). - set ( SUITESPARSE_C_TO_FORTRAN "(name,NAME) name##_" - CACHE STRING "C to Fortan name mangling" FORCE ) -elseif ( SUITESPARSE_BLAS_NO_UNDERSCORE ) - # Ignore the Fortran compiler even if used, also ignore the C compiler, and - # force NO underscore to be appended to all calls to BLAS/LAPACK. - # Also force the name to be lowercase (dgemm for example). - set ( SUITESPARSE_C_TO_FORTRAN "(name,NAME) name" - CACHE STRING "C to Fortan name mangling" FORCE ) -elseif ( MSVC ) +# default C-to-Fortran name mangling if Fortran compiler not found +if ( MSVC ) # MS Visual Studio Fortran compiler does not mangle the Fortran name set ( SUITESPARSE_C_TO_FORTRAN "(name,NAME) name" CACHE STRING "C to Fortan name mangling" ) From 5d80ce0468362b4485a46f6e24f7abf912647cc1 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Sat, 24 Feb 2024 16:18:51 -0600 Subject: [PATCH 69/98] add SPEX_*_set_null and SPEX_*_clear methods --- SPEX/Config/SPEX.h.in | 95 +++---------------- .../Demo/Utilities/spex_demo_check_solution.c | 11 +-- SPEX/Demo/spex_demo_cholesky_simple.c | 4 - SPEX/Doc/SPEX_UserGuide.tex | 2 +- SPEX/Include/SPEX.h | 95 +++---------------- SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 90 ++++++++++++++++++ .../Source/spex_util_internal.h | 82 ++++++++++++++++ 7 files changed, 199 insertions(+), 180 deletions(-) diff --git a/SPEX/Config/SPEX.h.in b/SPEX/Config/SPEX.h.in index a8a15e6725..60d9392a09 100644 --- a/SPEX/Config/SPEX.h.in +++ b/SPEX/Config/SPEX.h.in @@ -458,6 +458,9 @@ typedef SPEX_matrix_struct *SPEX_matrix ; // SPEX_matrix macros //------------------------------------------------------------------------------ +// FIXME add SPEX_1D and SPEX_2D macros to the user guide (needed by +// SPEX demos) + // These macros simplify the access to entries in a SPEX_matrix. // The type parameter is one of: mpq, mpz, mpfr, int64, or fp64. @@ -465,7 +468,7 @@ typedef SPEX_matrix_struct *SPEX_matrix ; // 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: +// 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) //------------------------------------------------------------------------------ @@ -1012,89 +1015,13 @@ SPEX_info SPEX_mpfr_free_cache (void) ; SPEX_info SPEX_mpfr_free_str (char *str) ; -//------------------------------------------------------------------------------ -// Field access macros for MPZ/MPQ/MPFR struct -//------------------------------------------------------------------------------ - -// These follow similar definitions 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) - -/* 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); \ - } \ -} +// FIXME: add these 6 functions to the user guide: +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) ; //------------------------------------------------------------------------------ diff --git a/SPEX/Demo/Utilities/spex_demo_check_solution.c b/SPEX/Demo/Utilities/spex_demo_check_solution.c index 5253ff8b62..d55aa92e88 100644 --- a/SPEX/Demo/Utilities/spex_demo_check_solution.c +++ b/SPEX/Demo/Utilities/spex_demo_check_solution.c @@ -9,15 +9,13 @@ //------------------------------------------------------------------------------ -// FIXME: need SPEX_MPQ_CLEAR, SPEX_MPQ_SET_NULL, SPEX_2D in SPEX.h - #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); \ } @@ -39,14 +37,13 @@ SPEX_info spex_demo_check_solution 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) ; //-------------------------------------------------------------------------- // initialize //-------------------------------------------------------------------------- - SPEX_MPQ_SET_NULL(temp); - SPEX_MPQ_SET_NULL(scale); - 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, diff --git a/SPEX/Demo/spex_demo_cholesky_simple.c b/SPEX/Demo/spex_demo_cholesky_simple.c index 9b0a5207e9..9511578168 100644 --- a/SPEX/Demo/spex_demo_cholesky_simple.c +++ b/SPEX/Demo/spex_demo_cholesky_simple.c @@ -12,10 +12,6 @@ // 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: FIXME -// spex_demo_cholesky_simple f input > out -// out is file for output calculated result - #include "spex_demos.h" #define FREE_WORKSPACE \ diff --git a/SPEX/Doc/SPEX_UserGuide.tex b/SPEX/Doc/SPEX_UserGuide.tex index d074f0b4a4..51e4ca81ed 100644 --- a/SPEX/Doc/SPEX_UserGuide.tex +++ b/SPEX/Doc/SPEX_UserGuide.tex @@ -2248,7 +2248,7 @@ \subsubsection{Converting the solution vector to the final desired form} which utilize SPEX. These files demonstrate the usage of SPEX as follows: -{\bf FIXME: this is out of date} +{\bf FIXME: description of demos is out of date} \begin{itemize} \item \verb|example.c|: This example generates a random dense $50 \times 50$ diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index 3461d69442..64e9de3f4e 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -458,6 +458,9 @@ typedef SPEX_matrix_struct *SPEX_matrix ; // SPEX_matrix macros //------------------------------------------------------------------------------ +// FIXME add SPEX_1D and SPEX_2D macros to the user guide (needed by +// SPEX demos) + // These macros simplify the access to entries in a SPEX_matrix. // The type parameter is one of: mpq, mpz, mpfr, int64, or fp64. @@ -465,7 +468,7 @@ typedef SPEX_matrix_struct *SPEX_matrix ; // 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: +// 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) //------------------------------------------------------------------------------ @@ -1012,89 +1015,13 @@ SPEX_info SPEX_mpfr_free_cache (void) ; SPEX_info SPEX_mpfr_free_str (char *str) ; -//------------------------------------------------------------------------------ -// Field access macros for MPZ/MPQ/MPFR struct -//------------------------------------------------------------------------------ - -// These follow similar definitions 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) - -/* 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); \ - } \ -} +// FIXME: add these 6 functions to the user guide: +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) ; //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c index c42e4c3e2b..9a0950cc4a 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -2109,3 +2109,93 @@ 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 +) +{ + 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_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index b66c0711de..1643da6dcf 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -291,6 +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); \ + } \ +} // ============================================================================ From 6e8e913ded3d5dffaa2eac8f373e565443f9bbe4 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 4 Mar 2024 16:41:33 -0600 Subject: [PATCH 70/98] update from March 4 group meeting --- SPEX/Config/SPEX.h.in | 2 ++ SPEX/Config/SPEX.pc.in | 6 +++--- SPEX/Doc/ChangeLog | 13 ++++++++++++- SPEX/Include/SPEX.h | 2 ++ SPEX/TODO.txt | 29 +++++++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 SPEX/TODO.txt diff --git a/SPEX/Config/SPEX.h.in b/SPEX/Config/SPEX.h.in index 60d9392a09..958573a61e 100644 --- a/SPEX/Config/SPEX.h.in +++ b/SPEX/Config/SPEX.h.in @@ -183,6 +183,8 @@ SPEX_info SPEX_version // SPEX_TRY: try a SPEX method and check for errors //------------------------------------------------------------------------------ +// FIXME: add SPEX_TRY and SPEX_CATCH to user guide + // 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. diff --git a/SPEX/Config/SPEX.pc.in b/SPEX/Config/SPEX.pc.in index 99285908b6..ce8eeef1ef 100644 --- a/SPEX/Config/SPEX.pc.in +++ b/SPEX/Config/SPEX.pc.in @@ -1,6 +1,6 @@ -# SPEX, Copyright (c) 2019-2023, Chris Lourenco (US Naval Academy), Jinhao -# Chen, Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights -# Reserved. +# SPEX, Copyright (c) 2019-2024, Chris Lourenco (US Naval Academy), Jinhao +# Chen, Erick Moreno-Centeno, Lorena Mejia Domenzain, 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@ diff --git a/SPEX/Doc/ChangeLog b/SPEX/Doc/ChangeLog index 8dcdc0e2db..c07a8ac3ee 100644 --- a/SPEX/Doc/ChangeLog +++ b/SPEX/Doc/ChangeLog @@ -1,6 +1,17 @@ -Feb XX, 2024: version 3.1.0 +Feb XX, 2024: version 3.1.0 FIXME: date * 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 Jul 26, 2023: version 3.0.0 diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index 64e9de3f4e..600562b7d1 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -183,6 +183,8 @@ SPEX_info SPEX_version // SPEX_TRY: try a SPEX method and check for errors //------------------------------------------------------------------------------ +// FIXME: add SPEX_TRY and SPEX_CATCH to user guide + // 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. diff --git a/SPEX/TODO.txt b/SPEX/TODO.txt new file mode 100644 index 0000000000..22751d42d4 --- /dev/null +++ b/SPEX/TODO.txt @@ -0,0 +1,29 @@ + +put in OpenMP + +test python interface + +test MATLAB interface + +get 100% test coverage + +User Guide + +Added: (need in user guide) + + 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 + +check copyright + +FIXMEs From aa8e5b933d0cfed24e4ef273d3eb297ad9fd6c4c Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 4 Mar 2024 16:45:55 -0600 Subject: [PATCH 71/98] todo --- SPEX/TODO.txt | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/SPEX/TODO.txt b/SPEX/TODO.txt index 22751d42d4..ff59895e43 100644 --- a/SPEX/TODO.txt +++ b/SPEX/TODO.txt @@ -1,29 +1,29 @@ -put in OpenMP +Tim: put in OpenMP -test python interface +Lorena: test python interface -test MATLAB interface +Tim: test MATLAB interface -get 100% test coverage +Tim: get 100% test coverage -User Guide +Chris: User Guide -Added: (need in user guide) + Added: (need in user guide) - SPEX_TRY - SPEX_CATCH - SPEX_1D - SPEX_2D + SPEX_TRY + SPEX_CATCH + SPEX_1D + SPEX_2D - SPEX_mpz_set_null - SPEX_mpq_set_null - SPEX_mpfr_set_null + SPEX_mpz_set_null + SPEX_mpq_set_null + SPEX_mpfr_set_null - SPEX_mpz_clear - SPEX_mpq_clear - SPEX_mpfr_clear + SPEX_mpz_clear + SPEX_mpq_clear + SPEX_mpfr_clear -check copyright +Erick: check copyright -FIXMEs +All: FIXMEs From 04c5764d890b269e41a8da57d779d400b21d2a5c Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 5 Mar 2024 09:24:34 -0600 Subject: [PATCH 72/98] add OpenMP to SPEX (required for thread safety) --- ChangeLog | 2 +- Makefile | 6 +-- README.md | 5 +++ SPEX/CMakeLists.txt | 56 ++++++++++++++++++++++++++ SPEX/Demo/spex_demo_threaded.c | 6 +++ SPEX/Makefile | 6 +-- SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 1 + SPEX/TODO.txt | 2 - SuiteSparse_config/Config/README.md.in | 5 +++ 9 files changed, 80 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2bff4cc4ea..4dbc3a759a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,4 @@ -Feb XX, 2024: version 7.7.0 +Mar XX, 2024: version 7.7.0 * SPEX 3.1.0: major revision to API, new methods. Added SPEX_Cholesky, SPEX_Backslash, and python interface. MATLAB interface revised. diff --git a/Makefile b/Makefile index 0b1d0d81d6..8305e68b34 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,9 @@ export SUITESPARSE = $(CURDIR) # Compile the default rules for each package. +# Note that CSparse is compiled but not installed by "make install"; +# CXSparse is installed instead. + # default: "make install" will install all libraries in /usr/local/lib # and include files in /usr/local/include. Not installed in SuiteSparse/lib. default: library @@ -59,7 +62,6 @@ local: ( cd CCOLAMD && $(MAKE) local ) ( cd CHOLMOD && $(MAKE) local ) ( cd CSparse && $(MAKE) ) -# CSparse is compiled but not installed ( cd CXSparse && $(MAKE) local ) ( cd LDL && $(MAKE) local ) ( cd KLU && $(MAKE) local ) @@ -83,7 +85,6 @@ global: ( cd CCOLAMD && $(MAKE) global ) ( cd CHOLMOD && $(MAKE) global ) ( cd CSparse && $(MAKE) ) -# CSparse is compiled but not installed ( cd CXSparse && $(MAKE) global ) ( cd LDL && $(MAKE) global ) ( cd KLU && $(MAKE) global ) @@ -106,7 +107,6 @@ install: ( cd CCOLAMD && $(MAKE) install ) ( cd CHOLMOD && $(MAKE) install ) ( cd CXSparse && $(MAKE) install ) -# CXSparse is installed instead ( cd LDL && $(MAKE) install ) ( cd KLU && $(MAKE) install ) ( cd UMFPACK && $(MAKE) install ) diff --git a/README.md b/README.md index 3b4edafd57..7e91a14325 100644 --- a/README.md +++ b/README.md @@ -1023,6 +1023,11 @@ build type). The static libraries will not be built (since 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`. diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index 558905fa06..8216104653 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -40,6 +40,34 @@ set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} include ( SuiteSparsePolicy ) +#------------------------------------------------------------------------------- +# find OpenMP +#------------------------------------------------------------------------------- + +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 #------------------------------------------------------------------------------- @@ -208,6 +236,25 @@ if ( BUILD_STATIC_LIBS ) 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: include ( CheckSymbolExists ) check_symbol_exists ( fmax "math.h" NO_LIBM ) @@ -425,6 +472,15 @@ if ( SUITESPARSE_DEMOS ) 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 ( ) message ( STATUS "Skipping the demos in SPEX/Demo" ) diff --git a/SPEX/Demo/spex_demo_threaded.c b/SPEX/Demo/spex_demo_threaded.c index ac9f002437..05819e12db 100644 --- a/SPEX/Demo/spex_demo_threaded.c +++ b/SPEX/Demo/spex_demo_threaded.c @@ -53,6 +53,12 @@ int main( int argc, char *argv[] ) // 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 ( )) ; //-------------------------------------------------------------------------- diff --git a/SPEX/Makefile b/SPEX/Makefile index cd662c172f..68328e2859 100644 --- a/SPEX/Makefile +++ b/SPEX/Makefile @@ -59,10 +59,10 @@ demos: ./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/SPEX_Utilities/Source/SPEX_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c index 9a0950cc4a..8a77133f7b 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -120,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 diff --git a/SPEX/TODO.txt b/SPEX/TODO.txt index ff59895e43..5dd17c49f3 100644 --- a/SPEX/TODO.txt +++ b/SPEX/TODO.txt @@ -1,6 +1,4 @@ -Tim: put in OpenMP - Lorena: test python interface Tim: test MATLAB interface diff --git a/SuiteSparse_config/Config/README.md.in b/SuiteSparse_config/Config/README.md.in index f123440c89..16fbb9f95a 100644 --- a/SuiteSparse_config/Config/README.md.in +++ b/SuiteSparse_config/Config/README.md.in @@ -1023,6 +1023,11 @@ build type). The static libraries will not be built (since 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`. From f68b699036372adb39f624d9250b928dd2daec1e Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 5 Mar 2024 11:01:46 -0600 Subject: [PATCH 73/98] SPEX matlab interface --- SPEX/CMakeLists.txt | 17 ++++++++++++++++ SPEX/Config/spex_deps.m.in | 8 ++++---- SPEX/MATLAB/spex_mex_install.m | 36 ++++++++++++++++++++++------------ SPEX/MATLAB/spex_mex_test.m | 2 +- 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index 8216104653..29b647e064 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -324,6 +324,23 @@ install ( FILES ${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 #------------------------------------------------------------------------------- diff --git a/SPEX/Config/spex_deps.m.in b/SPEX/Config/spex_deps.m.in index 6c20211e54..40fd02a461 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, +% SPEX: (c) 2022-2024, 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 = '@libdir@' ; -suitesparse_incdir = '@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/MATLAB/spex_mex_install.m b/SPEX/MATLAB/spex_mex_install.m index 267e65cbe1..a443f60a6b 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, +% SPEX: (c) 2022-2024, 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 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 b10f041ba7..610f45726a 100644 --- a/SPEX/MATLAB/spex_mex_test.m +++ b/SPEX/MATLAB/spex_mex_test.m @@ -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 From a998092aef7183079d3f291aced7af3bfcd6b265 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Tue, 5 Mar 2024 16:23:55 -0600 Subject: [PATCH 74/98] Tcov; mpfr pointer --- SPEX/Config/Tcov_Makefile.in | 23 +++++++++++++---------- SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 5 +---- SPEX/TODO.txt | 2 -- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/SPEX/Config/Tcov_Makefile.in b/SPEX/Config/Tcov_Makefile.in index 6540c4255b..ec25302ed7 100644 --- a/SPEX/Config/Tcov_Makefile.in +++ b/SPEX/Config/Tcov_Makefile.in @@ -45,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 @@ -245,17 +248,17 @@ 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) ./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 # 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 #------------------------------------------------------------------------------- diff --git a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c index 8a77133f7b..d9669cd77d 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -371,9 +371,6 @@ void *spex_gmp_allocate // spex_gmp_safe_free: free a block of memory and remove it from the archive //------------------------------------------------------------------------------ -// FIXME: what is this doing? -#define SPEX_MPFR_REAL_PTR(x) (&((x)->_mpfr_d[-1])) - static inline void spex_gmp_safe_free (void *p) { if (spex_gmp != NULL) @@ -405,7 +402,7 @@ static inline void spex_gmp_safe_free (void *p) } if (spex_gmp->mpfr_archive != NULL) { - if (p == SPEX_MPFR_REAL_PTR(spex_gmp->mpfr_archive)) + if (p == SPEX_MPFR_MANT(spex_gmp->mpfr_archive)) { SPEX_MPFR_MANT(spex_gmp->mpfr_archive) = NULL ; } diff --git a/SPEX/TODO.txt b/SPEX/TODO.txt index 5dd17c49f3..6cf11e0fa3 100644 --- a/SPEX/TODO.txt +++ b/SPEX/TODO.txt @@ -1,8 +1,6 @@ Lorena: test python interface -Tim: test MATLAB interface - Tim: get 100% test coverage Chris: User Guide From c29e24b8654581cdb52f88b650bed01d26b9b17a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Wed, 6 Mar 2024 10:58:42 +0100 Subject: [PATCH 75/98] ParU: Explicitly include in header that uses `PRId64` --- ParU/Source/paru_internal.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ParU/Source/paru_internal.hpp b/ParU/Source/paru_internal.hpp index 606035661e..d4801c8c09 100644 --- a/ParU/Source/paru_internal.hpp +++ b/ParU/Source/paru_internal.hpp @@ -13,6 +13,8 @@ // @author Aznaveh // +#include + #define SUITESPARSE_BLAS_DEFINITIONS #include "ParU.hpp" #include "paru_omp.hpp" From e82231fa6a4fa9a2ff289f83a8582123c102bac2 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 6 Mar 2024 05:28:42 -0600 Subject: [PATCH 76/98] SPEX test coverage; added spex_free_*_array methods --- SPEX/Config/Tcov_Makefile.in | 9 +- .../Source/spex_left_lu_get_largest_pivot.c | 4 +- SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c | 8 +- .../Source/spex_left_lu_get_smallest_pivot.c | 4 +- .../Source/SPEX_factorization_free.c | 2 +- SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 5 +- .../Source/SPEX_matrix_allocate.c | 6 +- .../SPEX_Utilities/Source/SPEX_matrix_check.c | 16 ++-- SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c | 92 +++++++------------ SPEX/SPEX_Utilities/Source/spex_cast_array.c | 5 +- .../Source/spex_create_mpfr_array.c | 8 +- SPEX/SPEX_Utilities/Source/spex_create_mpq.c | 37 -------- .../Source/spex_create_mpq_array.c | 8 +- .../Source/spex_create_mpz_array.c | 13 +-- .../Source/spex_expand_double_array.c | 10 +- .../Source/spex_expand_mpfr_array.c | 28 ++---- .../Source/spex_expand_mpq_array.c | 4 +- .../Source/spex_free_mpfr_array.c | 50 ++++++++++ .../Source/spex_free_mpq_array.c | 50 ++++++++++ .../Source/spex_free_mpz_array.c | 50 ++++++++++ .../Source/spex_util_internal.h | 43 ++++++--- SPEX/TODO.txt | 1 + SPEX/Tcov/tcov_for_cholesky.c | 47 ++++++---- SPEX/Tcov/tcov_for_lu.c | 5 - SPEX/Tcov/tcov_for_lu2.c | 20 ++-- SPEX/Tcov/tcov_utilities.c | 12 +-- 26 files changed, 318 insertions(+), 219 deletions(-) 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 diff --git a/SPEX/Config/Tcov_Makefile.in b/SPEX/Config/Tcov_Makefile.in index ec25302ed7..6906413001 100644 --- a/SPEX/Config/Tcov_Makefile.in +++ b/SPEX/Config/Tcov_Makefile.in @@ -87,6 +87,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 \ @@ -112,8 +115,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 @@ -256,6 +258,9 @@ vtests4llu: all $(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/mesh1e1.mat.txt ../ExampleMats/mesh1e1.rhs.txt > test_for_cholesky.out 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 cd96bb01ed..0bb4b9c822 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 @@ -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_pivot.c b/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c index 3e8753b18f..72d1f4ff83 100644 --- a/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c +++ b/SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c @@ -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 2769471194..987ba23472 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 @@ -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_Utilities/Source/SPEX_factorization_free.c b/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c index c9ae0116cc..124f19807d 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c @@ -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_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c index d9669cd77d..0a6684d4a9 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -2178,7 +2178,10 @@ SPEX_info SPEX_mpq_clear mpq_t x ) { - SPEX_MPQ_CLEAR (x) ; + if (x != NULL) + { + SPEX_MPQ_CLEAR (x) ; + } return (SPEX_OK); } diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c index 52da8ab0d2..9c06edf046 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c @@ -24,7 +24,7 @@ #define SPEX_FREE_ALL \ { \ - SPEX_matrix_free (&A, option); \ + SPEX_matrix_free (&A, option); \ } #include "spex_util_internal.h" @@ -32,7 +32,7 @@ #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 + // 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 @@ -110,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 654b6f29d7..ee85fbe857 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c @@ -9,10 +9,12 @@ //------------------------------------------------------------------------------ -#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 diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c index 26a444ebb8..1a7d51daa3 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c @@ -38,67 +38,45 @@ 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 values - if (!(A->x_shallow)) + + // 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) { - 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_cast_array.c b/SPEX/SPEX_Utilities/Source/spex_cast_array.c index 2f08588cac..0f2e30fba4 100644 --- a/SPEX/SPEX_Utilities/Source/spex_cast_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_cast_array.c @@ -35,8 +35,7 @@ // 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__) @@ -67,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_create_mpfr_array.c b/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c index 7b737460fe..94cc3c0479 100644 --- a/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c @@ -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 1571e204e2..0000000000 --- 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 4e28bc6944..4921cd093c 100644 --- a/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c @@ -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 1e87b38724..f49e176a7e 100644 --- a/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c @@ -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_expand_double_array.c b/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c index ce6de0d8dc..58ec0837aa 100644 --- a/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_expand_double_array.c @@ -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 b3f06e2f9c..60e0a65927 100644 --- a/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c @@ -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 a7097fba2c..291954252c 100644 --- a/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c @@ -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 0000000000..bd6e22a6b6 --- /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, 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 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 0000000000..782c0be7ac --- /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, 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 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 0000000000..e556947d4a --- /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, 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 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_util_internal.h b/SPEX/SPEX_Utilities/Source/spex_util_internal.h index 1643da6dcf..39d774b92f 100644 --- a/SPEX/SPEX_Utilities/Source/spex_util_internal.h +++ b/SPEX/SPEX_Utilities/Source/spex_util_internal.h @@ -374,7 +374,6 @@ } \ } - // ============================================================================ // Internal Functions // ============================================================================ @@ -398,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. //------------------------------------------------------------------------------ @@ -413,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 +//------------------------------------------------------------------------------ -SPEX_info spex_create_mpq +// Purpose: frees the array created by spex_create_mpq_array. + +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 ) ; //------------------------------------------------------------------------------ @@ -432,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: This function deletes a mpz array of size n - */ +// Purpose: frees the array created by spex_create_mpz_array. -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 diff --git a/SPEX/TODO.txt b/SPEX/TODO.txt index 6cf11e0fa3..3e36f55b2d 100644 --- a/SPEX/TODO.txt +++ b/SPEX/TODO.txt @@ -2,6 +2,7 @@ Lorena: test python interface Tim: get 100% test coverage + (only 1 statement left) Chris: User Guide diff --git a/SPEX/Tcov/tcov_for_cholesky.c b/SPEX/Tcov/tcov_for_cholesky.c index 3d4f774855..f55137ce2b 100644 --- a/SPEX/Tcov/tcov_for_cholesky.c +++ b/SPEX/Tcov/tcov_for_cholesky.c @@ -122,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) ; @@ -132,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)); @@ -319,20 +319,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 +411,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 +564,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 d967ac744d..c8bdeb0e48 100644 --- a/SPEX/Tcov/tcov_for_lu.c +++ b/SPEX/Tcov/tcov_for_lu.c @@ -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 f4057661d6..a44077d118 100644 --- a/SPEX/Tcov/tcov_for_lu2.c +++ b/SPEX/Tcov/tcov_for_lu2.c @@ -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,17 +166,19 @@ 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__); diff --git a/SPEX/Tcov/tcov_utilities.c b/SPEX/Tcov/tcov_utilities.c index 6c3ee5f16d..d0954b90f7 100644 --- a/SPEX/Tcov/tcov_utilities.c +++ b/SPEX/Tcov/tcov_utilities.c @@ -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); From e32105e32f486bc7a2ab8e57e0979b3dee9b162c Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 6 Mar 2024 05:39:09 -0600 Subject: [PATCH 77/98] SPEX: demo_threaded, remove int from omp for loop --- SPEX/Demo/spex_demo_threaded.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SPEX/Demo/spex_demo_threaded.c b/SPEX/Demo/spex_demo_threaded.c index 05819e12db..f434155e40 100644 --- a/SPEX/Demo/spex_demo_threaded.c +++ b/SPEX/Demo/spex_demo_threaded.c @@ -133,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) From 370e948f9e1184e252b25f688da420f0e4f6fd00 Mon Sep 17 00:00:00 2001 From: clouren Date: Fri, 8 Mar 2024 11:45:15 -0500 Subject: [PATCH 78/98] SPEX User guide update --- SPEX/Doc/SPEX_UserGuide.tex | 87 ++++++++++++++++++++++++++++++++++--- SPEX/Include/SPEX.h | 5 --- SPEX/TODO.txt | 24 +++++----- 3 files changed, 94 insertions(+), 22 deletions(-) diff --git a/SPEX/Doc/SPEX_UserGuide.tex b/SPEX/Doc/SPEX_UserGuide.tex index 51e4ca81ed..1041d0c47d 100644 --- a/SPEX/Doc/SPEX_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 \\ @@ -109,7 +109,7 @@ \chapter{SPEX Overview}\vspace{-0.75in} \begin{itemize} \item GNU GMP \cite{granlund2015gnu} and MPFR \cite{fousse2007mpfr} libraries. Distributed under the LGPL3 and GPL2 and can be acquired and installed from \url{https://gmplib.org/} and \url{http://www.mpfr.org/}, respectively. - \item CMake, available under a BSD 3-clause license. May be independently obtained at \url{https://cmake.org}. + \item CMake \cite{hoffman2003cmake}, available under a BSD 3-clause license. May be independently obtained at \url{https://cmake.org}. \item AMD \cite{amestoy1996approximate,amestoy2004algorithmamd}, available under a BSD 3-clause license and distributed along with SPEX. May be independently obtained at \url{www.suitesparse.com} @@ -1518,6 +1518,12 @@ \section{\texttt{SPEX\_gmp}: SPEX wrapper functions for GMP/MPFR} \verb|mpfr_init2(x, size)| & \verb|SPEX_mpfr_init2(x, size)| & Initialize x with size 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 +1585,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 +1678,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 +1825,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} @@ -2074,7 +2153,7 @@ \subsubsection{Populating data structures} corresponding to CSC form, sparse triplet form or dense form, allocate a shallow \verb|SPEX_matrix| and assign vectors accordingly, then use \verb|SPEX_matrix_copy| to get a \verb|SPEX_matrix| in the desired kind and -type. For more details, refer to the example programs in \verb|SPEX/SPEX/Demo/*.c|. In a case when +type. For more details, refer to \verb|SPEX/SPEX/SPEX_Left_LU/Demo/example.c|. In a case when \verb|A| is available in format other than CSC \verb|mpz|, and/or \verb|b| is available in format other than dense \verb|mpz|, the following code snippet shows how to get \verb|A| and \verb|b| in a required format. @@ -2248,8 +2327,6 @@ \subsubsection{Converting the solution vector to the final desired form} which utilize SPEX. These files demonstrate the usage of SPEX as follows: -{\bf FIXME: description of demos is out of date} - \begin{itemize} \item \verb|example.c|: This example generates a random dense $50 \times 50$ matrix and a random dense $50 \times 1$ right hand side vector $b$ and diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index 600562b7d1..8b971c2397 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -183,8 +183,6 @@ SPEX_info SPEX_version // SPEX_TRY: try a SPEX method and check for errors //------------------------------------------------------------------------------ -// FIXME: add SPEX_TRY and SPEX_CATCH to user guide - // 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. @@ -460,8 +458,6 @@ typedef SPEX_matrix_struct *SPEX_matrix ; // SPEX_matrix macros //------------------------------------------------------------------------------ -// FIXME add SPEX_1D and SPEX_2D macros to the user guide (needed by -// SPEX demos) // These macros simplify the access to entries in a SPEX_matrix. // The type parameter is one of: mpq, mpz, mpfr, int64, or fp64. @@ -1017,7 +1013,6 @@ SPEX_info SPEX_mpfr_free_cache (void) ; SPEX_info SPEX_mpfr_free_str (char *str) ; -// FIXME: add these 6 functions to the user guide: 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) ; diff --git a/SPEX/TODO.txt b/SPEX/TODO.txt index 3e36f55b2d..457b449b45 100644 --- a/SPEX/TODO.txt +++ b/SPEX/TODO.txt @@ -8,18 +8,18 @@ Chris: User Guide Added: (need in user guide) - 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 + (DONE) SPEX_TRY + (DONE) SPEX_CATCH + (DONE) SPEX_1D + (DONE) SPEX_2D + + (DONE) SPEX_mpz_set_null + (DONE) SPEX_mpq_set_null + (DONE) SPEX_mpfr_set_null + + (DONE) SPEX_mpz_clear + (DONE) SPEX_mpq_clear + (DONE) SPEX_mpfr_clear Erick: check copyright From 2bc54c8a3f7d5e6831bdddfb5c5c7ebe3d5228df Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Mon, 11 Mar 2024 11:35:25 -0500 Subject: [PATCH 79/98] remove FIXMEs from Config/SPEX.h.in --- SPEX/Config/SPEX.h.in | 6 ------ SPEX/Include/SPEX.h | 1 - 2 files changed, 7 deletions(-) diff --git a/SPEX/Config/SPEX.h.in b/SPEX/Config/SPEX.h.in index 958573a61e..fd37e07746 100644 --- a/SPEX/Config/SPEX.h.in +++ b/SPEX/Config/SPEX.h.in @@ -183,8 +183,6 @@ SPEX_info SPEX_version // SPEX_TRY: try a SPEX method and check for errors //------------------------------------------------------------------------------ -// FIXME: add SPEX_TRY and SPEX_CATCH to user guide - // 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. @@ -460,9 +458,6 @@ typedef SPEX_matrix_struct *SPEX_matrix ; // SPEX_matrix macros //------------------------------------------------------------------------------ -// FIXME add SPEX_1D and SPEX_2D macros to the user guide (needed by -// SPEX demos) - // These macros simplify the access to entries in a SPEX_matrix. // The type parameter is one of: mpq, mpz, mpfr, int64, or fp64. @@ -1017,7 +1012,6 @@ SPEX_info SPEX_mpfr_free_cache (void) ; SPEX_info SPEX_mpfr_free_str (char *str) ; -// FIXME: add these 6 functions to the user guide: 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) ; diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index 8b971c2397..cacc112e22 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -458,7 +458,6 @@ 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. From 57e3b882a3373323d4546123a90e397f7d12de93 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 13 Mar 2024 15:29:48 -0500 Subject: [PATCH 80/98] github workflow files for CI --- .github/workflows/build-arch-emu.yaml | 6 +-- .github/workflows/build.yaml | 12 +++--- .github/workflows/macos.yaml | 6 +-- .github/workflows/root-cmakelists.yaml | 59 +++++++++++++++++++------- 4 files changed, 56 insertions(+), 27 deletions(-) diff --git a/.github/workflows/build-arch-emu.yaml b/.github/workflows/build-arch-emu.yaml index df764e28f8..7be4c923d8 100644 --- a/.github/workflows/build-arch-emu.yaml +++ b/.github/workflows/build-arch-emu.yaml @@ -58,7 +58,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # shell: bash - name: install dependencies @@ -94,7 +94,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + 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 @@ -164,7 +164,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: /home/runner/rootfs/alpine-latest-${{ matrix.arch }}/home/runner/.ccache key: ${{ steps.ccache-prepare.outputs.key }} diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0f176680e2..047745d646 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -94,7 +94,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: install dependencies env: @@ -115,7 +115,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -192,7 +192,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -348,7 +348,7 @@ jobs: msystem: ${{ matrix.msystem }} - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: prepare ccache # create key with human readable timestamp @@ -360,7 +360,7 @@ jobs: - name: restore ccache # Setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} @@ -425,7 +425,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml index d6e14470c0..789761f210 100644 --- a/.github/workflows/macos.yaml +++ b/.github/workflows/macos.yaml @@ -35,7 +35,7 @@ jobs: sysctl machdep - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: install dependencies # Homebrew's Python conflicts with the Python that comes pre-installed @@ -61,7 +61,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: /Users/runner/Library/Caches/ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -192,7 +192,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: /Users/runner/Library/Caches/ccache key: ${{ steps.ccache-prepare.outputs.key }} diff --git a/.github/workflows/root-cmakelists.yaml b/.github/workflows/root-cmakelists.yaml index 3e8efbac67..bcdcda49a9 100644 --- a/.github/workflows/root-cmakelists.yaml +++ b/.github/workflows/root-cmakelists.yaml @@ -80,7 +80,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: install dependencies env: @@ -101,7 +101,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -135,6 +135,22 @@ jobs: 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 @@ -174,7 +190,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -273,7 +289,7 @@ jobs: # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners runs-on: windows-latest - name: msvc (${{ matrix.openmp }} OpenMP ${{ matrix.cuda }} CUDA, ${{ matrix.link }}) + name: msvc (${{ matrix.cc }} ${{ matrix.openmp }} OpenMP ${{ matrix.cuda }} CUDA, ${{ matrix.link }}) defaults: run: @@ -288,6 +304,7 @@ jobs: openmp: [with, without] cuda: [without] link: [both] + cc: [cl] include: - openmp: without openmp-cmake-flags: "-DSUITESPARSE_USE_OPENMP=OFF" @@ -297,6 +314,7 @@ jobs: -DSUITESPARSE_USE_CUDA=ON -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" link: both + cc: cl - openmp: with cuda: with cuda-cmake-flags: @@ -306,6 +324,11 @@ jobs: 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 @@ -317,15 +340,15 @@ jobs: Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: auto-update-conda: true - name: cache conda packages id: conda-cache - uses: actions/cache/restore@v3 + uses: actions/cache/restore@v4 with: path: C:/Miniconda/envs/test key: conda:msvc @@ -361,7 +384,7 @@ jobs: msystem: UCRT64 - - uses: Jimver/cuda-toolkit@v0.2.11 + - uses: Jimver/cuda-toolkit@v0.2.14 name: install CUDA toolkit if: matrix.cuda == 'with' id: cuda-toolkit @@ -401,18 +424,18 @@ jobs: shell: msys2 {0} run: | echo "ccachedir=$(cygpath -m $(${CCACHE} -k cache_dir))" >> $GITHUB_OUTPUT - echo "key=ccache:msvc:root:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }}:$(date +"%Y-%m-%d_%H-%M-%S"):${{ github.sha }}" >> $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@v3 + 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.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }} - ccache:msvc:root:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}: + 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. @@ -435,6 +458,8 @@ jobs: 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" \ @@ -476,7 +501,7 @@ jobs: - 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@v3 + uses: actions/cache/save@v4 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} @@ -497,7 +522,9 @@ jobs: run: | cd ${GITHUB_WORKSPACE}/Example/build printf "::group::\033[0;32m==>\033[0m Configuring example\n" - cmake \ + 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 }} \ @@ -533,7 +560,9 @@ jobs: 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 \ + 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 From 1e3479e1b04219a091770e7e852fdcbdff73533c Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 14 Mar 2024 04:37:38 -0500 Subject: [PATCH 81/98] revert last commit (github workflows) --- .github/workflows/build-arch-emu.yaml | 6 +-- .github/workflows/build.yaml | 12 +++--- .github/workflows/macos.yaml | 6 +-- .github/workflows/root-cmakelists.yaml | 59 +++++++------------------- 4 files changed, 27 insertions(+), 56 deletions(-) diff --git a/.github/workflows/build-arch-emu.yaml b/.github/workflows/build-arch-emu.yaml index 7be4c923d8..df764e28f8 100644 --- a/.github/workflows/build-arch-emu.yaml +++ b/.github/workflows/build-arch-emu.yaml @@ -58,7 +58,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 # shell: bash - name: install dependencies @@ -94,7 +94,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v3 with: # location of the ccache of the chroot in the root file system path: /home/runner/rootfs/alpine-latest-${{ matrix.arch }}/home/runner/.ccache @@ -164,7 +164,7 @@ jobs: - 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 + uses: actions/cache/save@v3 with: path: /home/runner/rootfs/alpine-latest-${{ matrix.arch }}/home/runner/.ccache key: ${{ steps.ccache-prepare.outputs.key }} diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 047745d646..0f176680e2 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -94,7 +94,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 - name: install dependencies env: @@ -115,7 +115,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v3 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -192,7 +192,7 @@ jobs: - 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 + uses: actions/cache/save@v3 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -348,7 +348,7 @@ jobs: msystem: ${{ matrix.msystem }} - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 - name: prepare ccache # create key with human readable timestamp @@ -360,7 +360,7 @@ jobs: - name: restore ccache # Setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v3 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} @@ -425,7 +425,7 @@ jobs: - 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 + uses: actions/cache/save@v3 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} diff --git a/.github/workflows/macos.yaml b/.github/workflows/macos.yaml index 789761f210..d6e14470c0 100644 --- a/.github/workflows/macos.yaml +++ b/.github/workflows/macos.yaml @@ -35,7 +35,7 @@ jobs: sysctl machdep - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 - name: install dependencies # Homebrew's Python conflicts with the Python that comes pre-installed @@ -61,7 +61,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v3 with: path: /Users/runner/Library/Caches/ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -192,7 +192,7 @@ jobs: - 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 + uses: actions/cache/save@v3 with: path: /Users/runner/Library/Caches/ccache key: ${{ steps.ccache-prepare.outputs.key }} diff --git a/.github/workflows/root-cmakelists.yaml b/.github/workflows/root-cmakelists.yaml index bcdcda49a9..3e8efbac67 100644 --- a/.github/workflows/root-cmakelists.yaml +++ b/.github/workflows/root-cmakelists.yaml @@ -80,7 +80,7 @@ jobs: run: lscpu - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 - name: install dependencies env: @@ -101,7 +101,7 @@ jobs: - name: restore ccache # setup the GitHub cache used to maintain the ccache from one job to the next - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v3 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -135,22 +135,6 @@ jobs: 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 @@ -190,7 +174,7 @@ jobs: - 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 + uses: actions/cache/save@v3 with: path: ~/.ccache key: ${{ steps.ccache-prepare.outputs.key }} @@ -289,7 +273,7 @@ jobs: # 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 }}) + name: msvc (${{ matrix.openmp }} OpenMP ${{ matrix.cuda }} CUDA, ${{ matrix.link }}) defaults: run: @@ -304,7 +288,6 @@ jobs: openmp: [with, without] cuda: [without] link: [both] - cc: [cl] include: - openmp: without openmp-cmake-flags: "-DSUITESPARSE_USE_OPENMP=OFF" @@ -314,7 +297,6 @@ jobs: -DSUITESPARSE_USE_CUDA=ON -DCMAKE_CUDA_COMPILER_LAUNCHER="ccache" link: both - cc: cl - openmp: with cuda: with cuda-cmake-flags: @@ -324,11 +306,6 @@ jobs: 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 @@ -340,15 +317,15 @@ jobs: Get-CIMInstance -Class Win32_Processor | Select-Object -Property Name - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v3 - - uses: conda-incubator/setup-miniconda@v3 + - uses: conda-incubator/setup-miniconda@v2 with: auto-update-conda: true - name: cache conda packages id: conda-cache - uses: actions/cache/restore@v4 + uses: actions/cache/restore@v3 with: path: C:/Miniconda/envs/test key: conda:msvc @@ -384,7 +361,7 @@ jobs: msystem: UCRT64 - - uses: Jimver/cuda-toolkit@v0.2.14 + - uses: Jimver/cuda-toolkit@v0.2.11 name: install CUDA toolkit if: matrix.cuda == 'with' id: cuda-toolkit @@ -424,18 +401,18 @@ jobs: 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 + echo "key=ccache:msvc:root:${{ 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 + uses: actions/cache/restore@v3 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 }}: + ccache:msvc:root:${{ matrix.openmp }}:${{ matrix.cuda }}:${{ matrix.link }}:${{ github.ref }} + ccache:msvc:root:${{ 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. @@ -458,8 +435,6 @@ jobs: 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" \ @@ -501,7 +476,7 @@ jobs: - 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 + uses: actions/cache/save@v3 with: path: ${{ steps.ccache-prepare.outputs.ccachedir }} key: ${{ steps.ccache-prepare.outputs.key }} @@ -522,9 +497,7 @@ jobs: 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 }} \ + cmake \ -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake;C:/Miniconda/envs/test/Library;${GITHUB_WORKSPACE}/dependencies" \ -DBLA_VENDOR="All" \ ${{ matrix.openmp-cmake-flags }} \ @@ -560,9 +533,7 @@ jobs: 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 }} \ + cmake \ -DCMAKE_PREFIX_PATH="${GITHUB_WORKSPACE}/lib/cmake;C:/Miniconda/envs/test/Library;${GITHUB_WORKSPACE}/dependencies" \ .. cmake --build . --config Release From e6b2f0411c1a431fd809d999184b16ca3c22fccf Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 20 Mar 2024 12:52:02 -0500 Subject: [PATCH 82/98] SPEX_mpfr_set_prec, and full test coverage --- SPEX/Config/SPEX.h.in | 2 + SPEX/Config/Tcov_Makefile.in | 10 ++- SPEX/Doc/ChangeLog | 1 + SPEX/Doc/SPEX_UserGuide.pdf | Bin 381370 -> 386629 bytes SPEX/Doc/SPEX_UserGuide.tex | 9 ++- SPEX/Include/SPEX.h | 2 + SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 35 ++++++++- SPEX/TODO.txt | 24 +----- SPEX/Tcov/tcov_for_cholesky.c | 4 +- SPEX/Tcov/tcov_for_other | Bin 0 -> 450208 bytes SPEX/Tcov/tcov_for_other.c | 104 ++++++++++++++++++++++++++ 11 files changed, 158 insertions(+), 33 deletions(-) create mode 100755 SPEX/Tcov/tcov_for_other create mode 100644 SPEX/Tcov/tcov_for_other.c diff --git a/SPEX/Config/SPEX.h.in b/SPEX/Config/SPEX.h.in index fd37e07746..fb5865182b 100644 --- a/SPEX/Config/SPEX.h.in +++ b/SPEX/Config/SPEX.h.in @@ -976,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) ; diff --git a/SPEX/Config/Tcov_Makefile.in b/SPEX/Config/Tcov_Makefile.in index 6906413001..7ebcba74b7 100644 --- a/SPEX/Config/Tcov_Makefile.in +++ b/SPEX/Config/Tcov_Makefile.in @@ -66,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 @@ -219,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 @@ -226,6 +230,7 @@ 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 @@ -250,6 +255,7 @@ 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 @@ -270,7 +276,7 @@ vtests4chol: all # 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/Doc/ChangeLog b/SPEX/Doc/ChangeLog index c07a8ac3ee..3ce42a77d0 100644 --- a/SPEX/Doc/ChangeLog +++ b/SPEX/Doc/ChangeLog @@ -12,6 +12,7 @@ Feb XX, 2024: version 3.1.0 FIXME: date SPEX_mpz_clear SPEX_mpq_clear SPEX_mpfr_clear + SPEX_mpfr_set_proc Jul 26, 2023: version 3.0.0 diff --git a/SPEX/Doc/SPEX_UserGuide.pdf b/SPEX/Doc/SPEX_UserGuide.pdf index add589916bd1ab91e07ed49bf70c5becbe262f55..fe6c065bb28864d3086a03ffd2f39093d91f67fa 100644 GIT binary patch delta 113725 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

>f3)Gj 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 PY@ZzkDk@1ODWv}bo%Q^f diff --git a/SPEX/Doc/SPEX_UserGuide.tex b/SPEX/Doc/SPEX_UserGuide.tex index 1041d0c47d..548e75723b 100644 --- a/SPEX/Doc/SPEX_UserGuide.tex +++ b/SPEX/Doc/SPEX_UserGuide.tex @@ -1515,9 +1515,12 @@ \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 diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index cacc112e22..00cbbdba23 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -976,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) ; diff --git a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c index 0a6684d4a9..d70f46347a 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_gmp.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_gmp.c @@ -371,6 +371,9 @@ 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) @@ -402,7 +405,7 @@ static inline void spex_gmp_safe_free (void *p) } if (spex_gmp->mpfr_archive != NULL) { - if (p == SPEX_MPFR_MANT(spex_gmp->mpfr_archive)) + if (p == SPEX_MPFR_GET_REAL_PTR(spex_gmp->mpfr_archive)) { SPEX_MPFR_MANT(spex_gmp->mpfr_archive) = NULL ; } @@ -1784,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); @@ -1793,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 //------------------------------------------------------------------------------ diff --git a/SPEX/TODO.txt b/SPEX/TODO.txt index 457b449b45..bb6a7a7205 100644 --- a/SPEX/TODO.txt +++ b/SPEX/TODO.txt @@ -1,26 +1,4 @@ -Lorena: test python interface - -Tim: get 100% test coverage - (only 1 statement left) - -Chris: User Guide - - Added: (need in user guide) - - (DONE) SPEX_TRY - (DONE) SPEX_CATCH - (DONE) SPEX_1D - (DONE) SPEX_2D - - (DONE) SPEX_mpz_set_null - (DONE) SPEX_mpq_set_null - (DONE) SPEX_mpfr_set_null - - (DONE) SPEX_mpz_clear - (DONE) SPEX_mpq_clear - (DONE) SPEX_mpfr_clear - Erick: check copyright -All: FIXMEs +FIXME: date diff --git a/SPEX/Tcov/tcov_for_cholesky.c b/SPEX/Tcov/tcov_for_cholesky.c index f55137ce2b..a701822b20 100644 --- a/SPEX/Tcov/tcov_for_cholesky.c +++ b/SPEX/Tcov/tcov_for_cholesky.c @@ -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); \ } diff --git a/SPEX/Tcov/tcov_for_other b/SPEX/Tcov/tcov_for_other new file mode 100755 index 0000000000000000000000000000000000000000..1f3b2c57be83cb7bf6b69b8e17c8e49d4a3ec910 GIT binary patch literal 450208 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 b{282k3PWmNjuY0&fBV46+i`KPB9;FSqoM`& literal 0 HcmV?d00001 diff --git a/SPEX/Tcov/tcov_for_other.c b/SPEX/Tcov/tcov_for_other.c new file mode 100644 index 0000000000..8eb4f68c0f --- /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-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 + +//----------------------------------------------------------------------------- + +#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) ; +} + From c6ac90bcec688badd5c03a9f58f4e9b84837de80 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Wed, 20 Mar 2024 13:33:34 -0500 Subject: [PATCH 83/98] user guide for SPEX: add SPEX_mpfr_set_prec --- SPEX/Doc/SPEX_UserGuide.pdf | Bin 386629 -> 386707 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/SPEX/Doc/SPEX_UserGuide.pdf b/SPEX/Doc/SPEX_UserGuide.pdf index fe6c065bb28864d3086a03ffd2f39093d91f67fa..ebb2f30cb27971f5e7cfbf3ad791d0894bf1ca24 100644 GIT binary patch delta 5182 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 HQ6c#cvhkjt From 931ed09a04cccfe9665658e5f10292978e0a8926 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 21 Mar 2024 07:48:17 -0500 Subject: [PATCH 84/98] GraphBLAS bug fix (GB_add_phase0), and latest CUDA draft kernels --- GraphBLAS/CMakeLists.txt | 7 +- GraphBLAS/CUDA/.gitignore | 2 - GraphBLAS/CUDA/CMakeLists.txt | 133 +- .../Config/GB_cuda_common_jitFactory.hpp.in | 82 - GraphBLAS/CUDA/Config/GraphBLAS_CUDA.pc.in | 2 +- .../CUDA/Config/GraphBLAS_CUDAConfig.cmake.in | 2 +- GraphBLAS/CUDA/GB_cuda.h | 139 - GraphBLAS/CUDA/GB_cuda.hpp | 97 + GraphBLAS/CUDA/GB_cuda_AxB.hpp | 33 + GraphBLAS/CUDA/GB_cuda_AxB_dot3.cpp | 257 + GraphBLAS/CUDA/GB_cuda_AxB_dot3_branch.cpp | 28 +- GraphBLAS/CUDA/GB_cuda_AxB_dot3_jit.cpp | 471 +- GraphBLAS/CUDA/GB_cuda_common_jitFactory.hpp | 82 - GraphBLAS/CUDA/GB_cuda_error.h | 82 - GraphBLAS/CUDA/GB_cuda_get_device_count.cu | 5 +- .../CUDA/GB_cuda_get_device_properties.cu | 39 +- GraphBLAS/CUDA/GB_cuda_init.c | 5 +- GraphBLAS/CUDA/GB_cuda_jitify_cache.cu | 233 - GraphBLAS/CUDA/GB_cuda_jitify_cache.h | 327 -- GraphBLAS/CUDA/GB_cuda_jitify_launcher.cu | 60 - GraphBLAS/CUDA/GB_cuda_jitify_launcher.h | 152 - GraphBLAS/CUDA/GB_cuda_matrix_prefetch.cpp | 23 +- .../CUDA/GB_cuda_mxm_dot3_jitFactory.hpp | 832 ---- GraphBLAS/CUDA/GB_cuda_mxm_factory.hpp | 167 - GraphBLAS/CUDA/GB_cuda_reduce.hpp | 30 + GraphBLAS/CUDA/GB_cuda_reduce_factory.hpp | 105 - GraphBLAS/CUDA/GB_cuda_reduce_jitFactory.hpp | 254 - GraphBLAS/CUDA/GB_cuda_reduce_to_scalar.cpp | 153 + .../CUDA/GB_cuda_reduce_to_scalar_branch.cpp | 11 +- .../CUDA/GB_cuda_reduce_to_scalar_jit.cpp | 74 +- GraphBLAS/CUDA/GB_cuda_type_bits.c | 35 - GraphBLAS/CUDA/GB_cuda_type_branch.cpp | 6 +- GraphBLAS/CUDA/GB_cuda_upscale_identity.cpp | 4 +- GraphBLAS/CUDA/GB_cuda_warmup.cu | 43 +- .../{GraphBLAS_cuda.h => GraphBLAS_cuda.hpp} | 4 +- .../GB_cuda_jit_AxB_dot3_dense_phase1.cuh | 166 - .../GB_cuda_jit_AxB_dot3_phase3_dndn.cuh | 255 - .../JitKernels/GB_cuda_jit_AxB_phase2.cuh | 193 - .../JitKernels/GB_cuda_jit_AxB_phase2end.cuh | 140 - .../JitKernels/GB_jit_kernel_cuda_AxB_dot3.cu | 552 +++ ...educe.cuh => GB_jit_kernel_cuda_reduce.cu} | 116 +- GraphBLAS/CUDA/README.txt | 3 +- GraphBLAS/CUDA/TODO.txt | 18 + GraphBLAS/CUDA/Template/GB_cuda_atomics.cuh | 337 +- GraphBLAS/CUDA/Template/GB_cuda_buckets.h | 59 - GraphBLAS/CUDA/Template/GB_cuda_dot3_defn.h | 72 - GraphBLAS/CUDA/Template/GB_cuda_ek_slice.cuh | 192 + GraphBLAS/CUDA/Template/GB_cuda_error.hpp | 37 + .../GB_cuda_jit_AxB_dot3_dense_phase1.cuh | 122 + .../GB_cuda_jit_AxB_dot3_phase1.cuh | 226 +- .../Template/GB_cuda_jit_AxB_dot3_phase2.cuh | 176 + .../GB_cuda_jit_AxB_dot3_phase2end.cuh | 141 + .../GB_cuda_jit_AxB_dot3_phase3_dndn.cuh | 222 + .../GB_cuda_jit_AxB_dot3_phase3_mp.cuh | 196 +- .../GB_cuda_jit_AxB_dot3_phase3_spdn.cuh | 249 +- .../GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh | 190 +- .../GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh | 183 +- GraphBLAS/CUDA/Template/GB_cuda_kernel.cuh | 79 + GraphBLAS/CUDA/Template/GB_cuda_kernel.h | 263 -- GraphBLAS/CUDA/Template/GB_cuda_shfl_down.cuh | 384 ++ GraphBLAS/CUDA/Template/GB_cuda_timer.hpp | 52 + GraphBLAS/CUDA/Template/GB_h_subset.cuh | 77 + .../CUDA/Template/GraphBLAS_h_subset.cuh | 135 + GraphBLAS/CUDA/go | 14 - GraphBLAS/CUDA/jitify.hpp | 4196 ----------------- GraphBLAS/CUDA/test/.gitignore | 6 - GraphBLAS/CUDA/test/AxB_dot3_cuda_tests.cpp | 22 - GraphBLAS/CUDA/test/GB_cuda_type_wrap.hpp | 246 - GraphBLAS/CUDA/test/GpuTimer.h | 49 - GraphBLAS/CUDA/test/Makefile | 133 - GraphBLAS/CUDA/test/cuda_tests_template.cpp | 25 - GraphBLAS/CUDA/test/dataFactory.hpp | 382 -- GraphBLAS/CUDA/test/gen_test_data.ipynb | 267 -- GraphBLAS/CUDA/test/jitTestFactory.hpp | 916 ---- GraphBLAS/CUDA/test/problem_spec.hpp | 129 - GraphBLAS/CUDA/test/run_tests.cpp | 45 - GraphBLAS/CUDA/test/testGen_cmake.py | 176 - GraphBLAS/CUDA/test/test_data.hpp | 113 - GraphBLAS/CUDA/test/test_jitify.cpp | 51 - GraphBLAS/CUDA/test/test_utility.hpp | 22 - GraphBLAS/CUDA/{ => unused}/GB_cuda_cumsum.cu | 2 +- .../unused/GB_search_for_vector_device.cuh | 69 + GraphBLAS/Config/GB_config.h.in | 24 +- GraphBLAS/Config/GraphBLAS.h.in | 8 +- GraphBLAS/Demo/Program/gauss_demo.c | 2 +- GraphBLAS/Demo/Program/reduce_demo.c | 2 +- GraphBLAS/Demo/Program/wildtype_demo.c | 8 +- GraphBLAS/Doc/ChangeLog | 14 +- GraphBLAS/Doc/FUTURE.txt | 22 + GraphBLAS/Doc/GraphBLAS_UserGuide.pdf | Bin 1127284 -> 1127926 bytes GraphBLAS/Doc/GraphBLAS_UserGuide.tex | 19 +- GraphBLAS/Doc/GraphBLAS_version.tex | 2 +- GraphBLAS/GraphBLAS/CMakeLists.txt | 1 + GraphBLAS/GraphBLAS/rename/GB_rename.h | 24 + GraphBLAS/Include/GraphBLAS.h | 10 +- GraphBLAS/JITpackage/CMakeLists.txt | 4 +- GraphBLAS/Makefile | 2 +- GraphBLAS/README.md | 2 +- .../Factories/GB_search_for_vector_template.c | 8 +- .../Source/Factories/GB_twotype_factory.c | 39 - .../Source/FactoryKernels/GB_AxB__include2.h | 1 + .../Source/FactoryKernels/GB_aop__include.h | 1 + .../Source/FactoryKernels/GB_as__include.h | 1 + .../Source/FactoryKernels/GB_bld__include.h | 1 + .../Source/FactoryKernels/GB_ew__include.h | 1 + .../Source/FactoryKernels/GB_red__include.h | 1 + .../Source/FactoryKernels/GB_sel__include.h | 1 + .../Source/FactoryKernels/GB_unop__include.h | 1 + GraphBLAS/Source/GB.h | 3 - GraphBLAS/Source/GB_AxB__include1.h | 1 + GraphBLAS/Source/GB_AxB_dot.c | 4 +- GraphBLAS/Source/GB_AxB_dot3.c | 6 + GraphBLAS/Source/GB_AxB_saxpy.h | 1 + GraphBLAS/Source/GB_AxB_saxpy3.h | 1 + GraphBLAS/Source/GB_add.h | 1 + GraphBLAS/Source/GB_add_phase0.c | 4 +- GraphBLAS/Source/GB_assign.h | 1 + GraphBLAS/Source/GB_bitmap_assign.h | 1 + GraphBLAS/Source/GB_cast.h | 12 + GraphBLAS/Source/GB_cast_factory.c | 1 + GraphBLAS/Source/GB_casting.c | 1 + GraphBLAS/Source/GB_casting.h | 65 +- GraphBLAS/Source/GB_copy_user_user.c | 1 + GraphBLAS/Source/GB_cuda_gateway.h | 21 +- GraphBLAS/Source/GB_emult.h | 1 + GraphBLAS/Source/GB_encodify_reduce.c | 3 +- GraphBLAS/Source/GB_enumify_cuda_atomic.c | 15 +- GraphBLAS/Source/GB_ewise_kernels.h | 1 - GraphBLAS/Source/GB_helper.h | 1 + GraphBLAS/Source/GB_init.c | 20 +- GraphBLAS/Source/GB_init.h | 2 +- GraphBLAS/Source/GB_jitifyer.c | 190 +- GraphBLAS/Source/GB_jitifyer.h | 24 + GraphBLAS/Source/GB_macrofy_assign.c | 2 +- GraphBLAS/Source/GB_macrofy_binop.c | 9 +- GraphBLAS/Source/GB_macrofy_build.c | 2 +- GraphBLAS/Source/GB_macrofy_cast_expression.c | 1 + GraphBLAS/Source/GB_macrofy_ewise.c | 2 +- GraphBLAS/Source/GB_macrofy_monoid.c | 6 +- GraphBLAS/Source/GB_macrofy_multadd.c | 47 + GraphBLAS/Source/GB_macrofy_mxm.c | 45 +- GraphBLAS/Source/GB_macrofy_preface.c | 27 +- GraphBLAS/Source/GB_macrofy_query.c | 20 +- GraphBLAS/Source/GB_macrofy_reduce.c | 2 +- GraphBLAS/Source/GB_macrofy_unop.c | 1 + GraphBLAS/Source/GB_mask.h | 1 + GraphBLAS/Source/GB_math.c | 1 + GraphBLAS/Source/GB_math.h | 16 +- GraphBLAS/Source/GB_ops.c | 4 +- GraphBLAS/Source/GB_ops.h | 9 +- GraphBLAS/Source/GB_reduce_to_scalar.c | 6 +- GraphBLAS/Source/GB_reduce_to_scalar_jit.c | 3 +- GraphBLAS/Source/GB_select.h | 1 + GraphBLAS/Source/GB_stringify.h | 33 +- GraphBLAS/Source/GrB_Global_get.c | 5 + GraphBLAS/Source/GrB_Global_set.c | 4 + GraphBLAS/Source/GrB_init.c | 19 +- GraphBLAS/Source/GxB_Global_Option_get.c | 16 + GraphBLAS/Source/GxB_Global_Option_set.c | 13 + GraphBLAS/Source/GxB_init.c | 2 +- GraphBLAS/Source/JitKernels/GB_jit_kernel.h | 17 +- GraphBLAS/Source/Template/GB_Template.h | 4 + .../Source/Template/GB_jit_kernel_proto.h | 37 +- GraphBLAS/Source/codegen_aop.m | 2 +- GraphBLAS/Source/codegen_as.m | 2 +- GraphBLAS/Source/codegen_axb.m | 2 +- GraphBLAS/Source/codegen_ew.m | 2 +- GraphBLAS/Source/codegen_red.m | 4 +- GraphBLAS/Source/codegen_sel.m | 2 +- GraphBLAS/Source/codegen_unop.m | 2 +- GraphBLAS/Tcov/.gitignore | 2 + GraphBLAS/Tcov/log_GB_mex_test21.txt | 2574 ---------- GraphBLAS/Test/.gitignore | 2 + GraphBLAS/Test/GB_mex_test11.c | 11 + GraphBLAS/Test/GB_mex_test13.c | 1 + GraphBLAS/Test/GB_mex_test16.c | 2 +- GraphBLAS/Test/GB_mex_test21.c | 2 +- GraphBLAS/Test/GB_mex_test29.c | 9 + GraphBLAS/Test/GB_mex_test9.c | 2 +- GraphBLAS/Test/log_GB_mex_test21.txt | 2574 ---------- GraphBLAS/Test/test169.m | 49 + GraphBLAS/Test/testall.m | 1 + .../Test/unused/{test169.m => test169_orig.m} | 0 .../GraphBLAS_JIT_configure.cmake | 4 +- .../cmake_modules/GraphBLAS_PreJIT.cmake | 20 +- .../cmake_modules/GraphBLAS_version.cmake | 2 +- GraphBLAS/rmm_wrap/README.md | 4 +- GraphBLAS/rmm_wrap/rmm_wrap.cpp | 86 +- 188 files changed, 4311 insertions(+), 17662 deletions(-) delete mode 100644 GraphBLAS/CUDA/Config/GB_cuda_common_jitFactory.hpp.in delete mode 100644 GraphBLAS/CUDA/GB_cuda.h create mode 100644 GraphBLAS/CUDA/GB_cuda.hpp create mode 100644 GraphBLAS/CUDA/GB_cuda_AxB.hpp create mode 100644 GraphBLAS/CUDA/GB_cuda_AxB_dot3.cpp delete mode 100644 GraphBLAS/CUDA/GB_cuda_common_jitFactory.hpp delete mode 100644 GraphBLAS/CUDA/GB_cuda_error.h delete mode 100644 GraphBLAS/CUDA/GB_cuda_jitify_cache.cu delete mode 100644 GraphBLAS/CUDA/GB_cuda_jitify_cache.h delete mode 100644 GraphBLAS/CUDA/GB_cuda_jitify_launcher.cu delete mode 100644 GraphBLAS/CUDA/GB_cuda_jitify_launcher.h delete mode 100644 GraphBLAS/CUDA/GB_cuda_mxm_dot3_jitFactory.hpp delete mode 100644 GraphBLAS/CUDA/GB_cuda_mxm_factory.hpp create mode 100644 GraphBLAS/CUDA/GB_cuda_reduce.hpp delete mode 100644 GraphBLAS/CUDA/GB_cuda_reduce_factory.hpp delete mode 100644 GraphBLAS/CUDA/GB_cuda_reduce_jitFactory.hpp create mode 100644 GraphBLAS/CUDA/GB_cuda_reduce_to_scalar.cpp delete mode 100644 GraphBLAS/CUDA/GB_cuda_type_bits.c rename GraphBLAS/CUDA/{GraphBLAS_cuda.h => GraphBLAS_cuda.hpp} (87%) delete mode 100644 GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_dense_phase1.cuh delete mode 100644 GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh delete mode 100644 GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_phase2.cuh delete mode 100644 GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_phase2end.cuh create mode 100644 GraphBLAS/CUDA/JitKernels/GB_jit_kernel_cuda_AxB_dot3.cu rename GraphBLAS/CUDA/JitKernels/{GB_cuda_jit_reduce.cuh => GB_jit_kernel_cuda_reduce.cu} (71%) delete mode 100644 GraphBLAS/CUDA/Template/GB_cuda_buckets.h delete mode 100644 GraphBLAS/CUDA/Template/GB_cuda_dot3_defn.h create mode 100644 GraphBLAS/CUDA/Template/GB_cuda_ek_slice.cuh create mode 100644 GraphBLAS/CUDA/Template/GB_cuda_error.hpp create mode 100644 GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh rename GraphBLAS/CUDA/{JitKernels => Template}/GB_cuda_jit_AxB_dot3_phase1.cuh (63%) create mode 100644 GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase2.cuh create mode 100644 GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase2end.cuh create mode 100644 GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh rename GraphBLAS/CUDA/{JitKernels => Template}/GB_cuda_jit_AxB_dot3_phase3_mp.cuh (64%) rename GraphBLAS/CUDA/{JitKernels => Template}/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh (52%) rename GraphBLAS/CUDA/{JitKernels => Template}/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh (64%) rename GraphBLAS/CUDA/{JitKernels => Template}/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh (53%) create mode 100644 GraphBLAS/CUDA/Template/GB_cuda_kernel.cuh delete mode 100644 GraphBLAS/CUDA/Template/GB_cuda_kernel.h create mode 100644 GraphBLAS/CUDA/Template/GB_cuda_shfl_down.cuh create mode 100644 GraphBLAS/CUDA/Template/GB_cuda_timer.hpp create mode 100644 GraphBLAS/CUDA/Template/GB_h_subset.cuh create mode 100644 GraphBLAS/CUDA/Template/GraphBLAS_h_subset.cuh delete mode 100755 GraphBLAS/CUDA/go delete mode 100644 GraphBLAS/CUDA/jitify.hpp delete mode 100644 GraphBLAS/CUDA/test/.gitignore delete mode 100644 GraphBLAS/CUDA/test/AxB_dot3_cuda_tests.cpp delete mode 100644 GraphBLAS/CUDA/test/GB_cuda_type_wrap.hpp delete mode 100644 GraphBLAS/CUDA/test/GpuTimer.h delete mode 100644 GraphBLAS/CUDA/test/Makefile delete mode 100644 GraphBLAS/CUDA/test/cuda_tests_template.cpp delete mode 100644 GraphBLAS/CUDA/test/dataFactory.hpp delete mode 100644 GraphBLAS/CUDA/test/gen_test_data.ipynb delete mode 100644 GraphBLAS/CUDA/test/jitTestFactory.hpp delete mode 100644 GraphBLAS/CUDA/test/problem_spec.hpp delete mode 100644 GraphBLAS/CUDA/test/run_tests.cpp delete mode 100644 GraphBLAS/CUDA/test/testGen_cmake.py delete mode 100644 GraphBLAS/CUDA/test/test_data.hpp delete mode 100644 GraphBLAS/CUDA/test/test_jitify.cpp delete mode 100644 GraphBLAS/CUDA/test/test_utility.hpp rename GraphBLAS/CUDA/{ => unused}/GB_cuda_cumsum.cu (98%) create mode 100644 GraphBLAS/CUDA/unused/GB_search_for_vector_device.cuh create mode 100644 GraphBLAS/Source/GB_macrofy_multadd.c create mode 100644 GraphBLAS/Tcov/.gitignore delete mode 100644 GraphBLAS/Tcov/log_GB_mex_test21.txt create mode 100644 GraphBLAS/Test/.gitignore delete mode 100644 GraphBLAS/Test/log_GB_mex_test21.txt create mode 100644 GraphBLAS/Test/test169.m rename GraphBLAS/Test/unused/{test169.m => test169_orig.m} (100%) diff --git a/GraphBLAS/CMakeLists.txt b/GraphBLAS/CMakeLists.txt index 9157a4b906..8229506f9d 100644 --- a/GraphBLAS/CMakeLists.txt +++ b/GraphBLAS/CMakeLists.txt @@ -203,11 +203,6 @@ configure_file ( "Config/README.md.in" "${PROJECT_SOURCE_DIR}/README.md" NEWLINE_STYLE LF ) -# for CUDA -configure_file ( "CUDA/Config/GB_cuda_common_jitFactory.hpp.in" - "${PROJECT_SOURCE_DIR}/CUDA/GB_cuda_common_jitFactory.hpp" - NEWLINE_STYLE LF ) - #------------------------------------------------------------------------------- # include directories for both graphblas and the demos #------------------------------------------------------------------------------- @@ -465,6 +460,7 @@ if ( GRAPHBLAS_HAS_OPENMP ) target_link_libraries ( GraphBLAS_static PRIVATE OpenMP::OpenMP_C ) endif ( ) message ( STATUS "CMAKE OpenMP C flags: ${OpenMP_C_FLAGS}" ) + set ( GB_OPENMP_C_FLAGS "${OpenMP_C_FLAGS}" ) else ( ) message ( WARNING "WARNING: OpenMP was not found (or was disabled with " @@ -485,6 +481,7 @@ else ( ) "The C compiler does not support thread-local-storage; " "GxB_Context_engage will return GrB_NOT_IMPLEMENTED." ) endif ( ) + set ( GB_OPENMP_C_FLAGS "" ) endif ( ) if ( SUITESPARSE_HAS_CUDA AND GRAPHBLAS_USE_CUDA ) diff --git a/GraphBLAS/CUDA/.gitignore b/GraphBLAS/CUDA/.gitignore index 2650c12fe3..8d9e4b49ad 100644 --- a/GraphBLAS/CUDA/.gitignore +++ b/GraphBLAS/CUDA/.gitignore @@ -2,8 +2,6 @@ *.o *.a *.so -jitFactory -stringify rmm_log.txt # Do not ignore this file diff --git a/GraphBLAS/CUDA/CMakeLists.txt b/GraphBLAS/CUDA/CMakeLists.txt index 2b477a36bf..c0c74d825d 100644 --- a/GraphBLAS/CUDA/CMakeLists.txt +++ b/GraphBLAS/CUDA/CMakeLists.txt @@ -2,7 +2,7 @@ # GraphBLAS/CUDA/CMakeLists.txt: cmake script for GraphBLAS/CUDA #------------------------------------------------------------------------------- -# SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +# SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. # Some files in this folder are (c) NVIDIA or (c) Google. Please refer # to their individual licenses (Apache, BSD, or others). @@ -12,11 +12,6 @@ cmake_minimum_required ( VERSION 3.20 ) # GraphBLAS can be built stand-alone -# CMake build for generating googletest c++ files that can be compiled and -# executed in parallel. Build can be customized to speed up development by -# allowing the targeting of specific specific parameters. The output of this -# build is an executable that can be used to run the gtests. - project ( GRAPHBLAS_CUDA VERSION "${GraphBLAS_VERSION_MAJOR}.${GraphBLAS_VERSION_MINOR}.${GraphBLAS_VERSION_SUB}" LANGUAGES CXX CUDA ) @@ -29,7 +24,6 @@ set ( CMAKE_CUDA_FLAGS "-cudart=static -lineinfo " ) set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++17 -fPIC " ) add_compile_definitions ( GBNCPUFEAT ) -add_compile_definitions ( GBCUDA_CPLUSPLUS ) message ( STATUS "C++ flags for CUDA: ${CMAKE_CXX_FLAGS}" ) @@ -160,126 +154,13 @@ if ( NOT MSVC ) endif ( ) #------------------------------------------------------------------------------- -# test suite for the CUDA kernels +# report #------------------------------------------------------------------------------- -if ( 0 ) - -# 1. Execute enumify/stringify/jitify logic to compile ptx kernels and -# compile/link w/ relevant *.cu files. - -# TODO: Need to do this piece in cmake - -# 2. Generate test .cu files named "{semiring_operation}_test_instances.hpp" -set ( CUDA_TEST_SUITES - AxB_dot3 -# reduce_to_scalar -) - -# -set ( CUDA_TEST_MONOIDS PLUS MIN MAX) # TIMES ANY ) -set ( CUDA_TEST_BINOPS TIMES PLUS MIN MAX DIV ) #MINUS RDIV RMINUS FIRST SECOND PAIR ) -set ( CUDA_TEST_SEMIRINGS PLUS_TIMES MIN_PLUS MAX_PLUS ) -set ( CUDA_TEST_DATATYPES int32_t int64_t uint32_t uint64_t float double ) -set ( CUDA_TEST_KERNELS vsvs) # mp vsvs dndn spdn vssp ) -set ( CUDA_TEST_FORMATS sparse dense sparse_dense reduce ) - -# TODO: Update testGen.py to accept the above CUDA_TEST_* params as arguments - -# Note: I don't believe there's a way to do this particular piece in parallel but -# once all the files are written, we should be able to compile them in parallel - -# Separate individual kernels from larger "overview" test (e.g. 2-level testing structure) -# We want to test all the *_cuda versions - -# TODO: make this a shorter test -set(CUDA_TEST_CPP_FILES "") -if ( FALSE ) # TODO: use a cmake option - foreach(var ${CUDA_TEST_SUITES}) - foreach(semiring ${CUDA_TEST_SEMIRINGS}) - foreach(kernel ${CUDA_TEST_KERNELS}) - foreach(format ${CUDA_TEST_FORMATS}) - # TODO: Have Python script also build separate cudaTest.cpp (named something - # like AxB_dot3_cuda_tests.cpp) for each suite. This way we should be able to - # easily ignore them from the build - add_custom_command( - OUTPUT - ${CMAKE_CURRENT_BINARY_DIR}/${var}_${semiring}_${format}_test_instances.hpp - ${CMAKE_CURRENT_BINARY_DIR}/${var}_${semiring}_${format}_cuda_tests.cpp -# DEPENDS -# jitFactory.hpp - COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR}/test/testGen_cmake.py "\"${CMAKE_CURRENT_SOURCE_DIR}\"" "\"${var}\"" "\"${CUDA_TEST_MONOIDS}\"" - "\"${CUDA_TEST_BINOPS}\"" "\"${semiring}\"" "\"${CUDA_TEST_DATATYPES}\"" - "\"${kernel}\"" - ) - # Construct final list of files to compile (in parallel) - list(APPEND CUDA_TEST_CPP_FILES ${CMAKE_CURRENT_BINARY_DIR}/${var}_${semiring}_${format}_cuda_tests.cpp) - endforeach() - endforeach() - endforeach() - endforeach() -endif ( ) - -include(FetchContent) -FetchContent_Declare( - googletest - # Specify the commit you depend on and update it regularly. - URL https://github.com/google/googletest/archive/e2239ee6043f73722e7aa812a459f54a28552929.zip -) -# For Windows: Prevent overriding the parent project's compiler/linker settings -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) -FetchContent_GetProperties(googletest) -if(NOT googletest_POPULATED) - FetchContent_Populate(googletest) - add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR} EXCLUDE_FROM_ALL) -endif() - -#FetchContent_MakeAvailable(googletest EC) - - -#file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/external_includes) -#execute_process( -# COMMAND git clone "https://github.com/google/googletest.git" googletest -# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/external_includes) -# -#include_directories(${CMAKE_CURRENT_BINARY_DIR}/external_includes/googletest/googletest/include) - -#add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/external_includes/googletest/googletest/) - -# 3. Compile/link individual {test_suite_name}_cuda_tests.cpp files into a gtest executable -set(GRAPHBLAS_CUDA_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/test) +message ( STATUS "CMAKE_CUDA_ARCHITECTURES: ${CMAKE_CUDA_ARCHITECTURES} ") +message ( STATUS "CMAKE_CUDA_COMPILER: ${CMAKE_CUDA_COMPILER} ") +message ( STATUS "CMAKE_CUDA_FLAGS: ${CMAKE_CUDA_FLAGS} ") +message ( STATUS "CMAKE_CUDA_FLAGS_RELEASE: ${CMAKE_CUDA_FLAGS_RELEASE} ") +message ( STATUS "CMAKE_CUDA_FLAGS_DEBUG: ${CMAKE_CUDA_FLAGS_DEBUG} ") -message(STATUS "CUDA tests files: " "${CUDA_TEST_CPP_FILES}") -add_executable(graphblascuda_test ${CUDA_TEST_CPP_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/test/run_tests.cpp) - -set_target_properties(graphblascuda_test PROPERTIES POSITION_INDEPENDENT_CODE ON) -set_target_properties(graphblascuda_test PROPERTIES CUDA_SEPARABLE_COMPILATION ON) -set_target_properties(graphblascuda_test PROPERTIES CUDA_ARCHITECTURES "52;75;80" ) - -include(GoogleTest) - -if ( ENABLE_SHARED_LIBS ) - target_link_libraries ( graphblascuda_test PUBLIC GraphBLAS ) -else ( ) - target_link_libraries ( graphblascuda_test PUBLIC GraphBLAS_static ) -endif ( ) - -target_link_libraries ( graphblascuda_test - PUBLIC - GraphBLAS_CUDA - RMM_wrap - CUDA::cudart_static - CUDA::nvrtc - ${ADDITIONAL_DEPS} - PRIVATE - gtest_main ) - -target_include_directories ( graphblascuda_test - PUBLIC - rmm_wrap - ${ADDITIONAL_INCLUDES} - ${CUDAToolkit_INCLUDE_DIRS} - ${GRAPHBLAS_CUDA_INCLUDES} ) - -endif ( ) diff --git a/GraphBLAS/CUDA/Config/GB_cuda_common_jitFactory.hpp.in b/GraphBLAS/CUDA/Config/GB_cuda_common_jitFactory.hpp.in deleted file mode 100644 index 5d7ad01e6f..0000000000 --- a/GraphBLAS/CUDA/Config/GB_cuda_common_jitFactory.hpp.in +++ /dev/null @@ -1,82 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_common_jitFactory.hpp: for all jitFactory classes -//------------------------------------------------------------------------------ - -// (c) Nvidia Corp. 2023 All rights reserved -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -// Common defines for all jitFactory classes: -// iostream callback to deliver the buffer to jitify as if read from a file -// compiler flags -// Include this file along with any jitFactory you need. - -// NOTE: do not edit the GB_cuda_common_jitFactory.hpp directly. It is -// configured by cmake from the following file: -// GraphBLAS/CUDA/Config/GB_cuda_common_jitFactory.hpp.in - -#ifndef GB_CUDA_COMMON_JITFACTORY_HPP -#define GB_CUDA_COMMON_JITFACTORY_HPP - -#pragma once - -#include "GraphBLAS_cuda.h" - -extern "C" -{ - #include "GB.h" - #include "GB_stringify.h" -} - -#include -#include -#include "GB_cuda_jitify_cache.h" -#include "GB_cuda_jitify_launcher.h" -#include "GB_cuda_mxm_factory.hpp" -#include "GB_cuda_error.h" -#include "../rmm_wrap/rmm_wrap.h" -#include "GB_iceil.h" - -// amount of shared memory to use in CUDA kernel launches -constexpr unsigned int SMEM = 0 ; - -#if 0 - -static const std::vector GB_jit_cuda_compiler_flags{ // OLD - "-std=c++17", - //"-G", - "-remove-unused-globals", - "-w", - "-D__CUDACC_RTC__", -// "-I" + jit::get_user_home_cache_dir(), // FIXME: add +/cu/00 -// "-I" + jit::get_user_home_cache_dir() + "/src", - "-I/usr/local/cuda/include", - // FIXME: add SUITESPARSE_CUDA_ARCHITECTURES here, via config -}; - -#endif - -inline std::vector GB_cuda_jit_compiler_flags ( ) -{ - return ( - std::vector ( - {"-std=c++17", - //"-G", - "-remove-unused-globals", - "-w", - "-D__CUDACC_RTC__", - "-I" + jit::get_user_home_cache_dir(), // FIXME: add +/cu/00 - "-I" + jit::get_user_home_cache_dir() + "/src", - "-I/usr/local/cuda/include" - // FIXME: add SUITESPARSE_CUDA_ARCHITECTURES here, via config - })) ; -} ; - -// FIXME: rename GB_jit_cuda_header_names or something -static const std::vector header_names ={}; - -// FIXME: rename GB_jit_cuda_file_callback -inline std::istream* (*file_callback)(std::string, std::iostream&); - -#endif diff --git a/GraphBLAS/CUDA/Config/GraphBLAS_CUDA.pc.in b/GraphBLAS/CUDA/Config/GraphBLAS_CUDA.pc.in index 2f5a31ea12..befb30bbe6 100644 --- a/GraphBLAS/CUDA/Config/GraphBLAS_CUDA.pc.in +++ b/GraphBLAS/CUDA/Config/GraphBLAS_CUDA.pc.in @@ -1,4 +1,4 @@ -# GraphBLAS_CUDA, Copyright (c) 2017-2023, Timothy A. Davis. +# GraphBLAS_CUDA, Copyright (c) 2017-2024, FIXME # All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 diff --git a/GraphBLAS/CUDA/Config/GraphBLAS_CUDAConfig.cmake.in b/GraphBLAS/CUDA/Config/GraphBLAS_CUDAConfig.cmake.in index 41db265312..6db344ffb7 100644 --- a/GraphBLAS/CUDA/Config/GraphBLAS_CUDAConfig.cmake.in +++ b/GraphBLAS/CUDA/Config/GraphBLAS_CUDAConfig.cmake.in @@ -4,7 +4,7 @@ # The following copyright and license applies to just this file only, not to # the library itself: -# GraphBLASConfig.cmake, Copyright (c) 2023, Timothy A. Davis. All Rights Reserved. +# GraphBLASConfig.cmake, Copyright (c) 2023-2024, FIXME # SPDX-License-Identifier: BSD-3-clause #------------------------------------------------------------------------------- diff --git a/GraphBLAS/CUDA/GB_cuda.h b/GraphBLAS/CUDA/GB_cuda.h deleted file mode 100644 index 3dac3a7c5e..0000000000 --- a/GraphBLAS/CUDA/GB_cuda.h +++ /dev/null @@ -1,139 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda.h -//------------------------------------------------------------------------------ - -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -#ifndef GB_CUDA_H -#define GB_CUDA_H - -extern "C" -{ - #include "GB_dev.h" - #include "GB_compiler.h" - #include "GB_cpu_features.h" - #include "GB_warnings.h" -} - -#include "GraphBLAS_cuda.h" - -extern "C" -{ - #include - #include - #include "GB.h" -} - -// Finally, include the CUDA definitions -#include "cuda_runtime.h" -#include "cuda.h" -// #include "cub.cuh" -#include "jitify.hpp" -#include "GB_cuda_mxm_factory.hpp" - -#include - -#define CHECK_CUDA_SIMPLE(call) \ - do { \ - cudaError_t err = call; \ - if (err != cudaSuccess) { \ - const char* str = cudaGetErrorName( err); \ - std::cout << "(CUDA runtime) returned " << str; \ - std::cout << " (" << __FILE__ << ":" << __LINE__ << ":" << __func__ \ - << "())" << std::endl; \ - return (GrB_PANIC) ; \ - } \ - } while (0) - -#define CU_OK(call) CHECK_CUDA_SIMPLE(call) - -//------------------------------------------------------------------------------ -// GB_CUDA_CATCH: catch error from a try { ... } region -//------------------------------------------------------------------------------ - -// #define GB_FREE_ALL { some macro to free all temporaries } -// GrB_Info info ; -// try { ... do stuff that can throw an exception } -// GB_CUDA_CATCH (info) ; - -#define GB_CUDA_CATCH(info) \ - catch (std::exception& e) \ - { \ - printf ("CUDA error: %s\n", e.what ( )) ; \ - info = GrB_PANIC ; \ - /* out_of_memory : info = GrB_OUT_OF_MEMORY ; */ \ - /* nulltpr: info = ... ; */ \ - /* no gpus here: info = GrB_PANIC ; */ \ - } \ - if (info != GrB_SUCCESS) \ - { \ - /* CUDA failed */ \ - GB_FREE_ALL ; \ - return (info) ; \ - } - -// NBUCKETS buckets: computed by up to NBUCKETS-1 kernel launches (zombies need -// no work...), using different kernels (with different configurations -// depending on the bucket). - -#include "GB_cuda_buckets.h" - -extern "C" -{ - #include "GB_stringify.h" -} - -//------------------------------------------------------------------------------ -// prefetch and memadvise -//------------------------------------------------------------------------------ - -// for the "which" parameter of GB_cuda_matrix_prefetch: -// FIXME: rename this to GB_WHATEVER_P for GB_cuda_matrix_advise -#define GB_PREFETCH_P 1 -#define GB_PREFETCH_H 2 -#define GB_PREFETCH_Y 4 -#define GB_PREFETCH_B 8 -#define GB_PREFETCH_I 16 -#define GB_PREFETCH_X 32 -#define GB_PREFETCH_PIX (GB_PREFETCH_P + GB_PREFETCH_I + GB_PREFETCH_X) -#define GB_PREFETCH_PYI (GB_PREFETCH_P + GB_PREFETCH_Y + GB_PREFETCH_I) -#define GB_PREFETCH_PYBI (GB_PREFETCH_PYI + GB_PREFETCH_B) -#define GB_PREFETCH_PYBIX (GB_PREFETCH_PYBI + GB_PREFETCH_X) -#define GB_PREFETCH_PHI (GB_PREFETCH_P + GB_PREFETCH_H + GB_PREFETCH_I) -#define GB_PREFETCH_PHBI (GB_PREFETCH_PHI + GB_PREFETCH_B) -#define GB_PREFETCH_PHBIX (GB_PREFETCH_PHBI + GB_PREFETCH_X) - -GrB_Info GB_cuda_matrix_prefetch -( - GrB_Matrix A, - int which, // which components to prefetch (phybix control) - int device, // GPU device or cudaCpuDeviceId - cudaStream_t stream -) ; - -#if 0 -// do we need this function too? -GrB_Info GB_cuda_matrix_advise -( - GrB_Matrix A, - - p, h, y, b, i, x? 6 bools - - what to do: advise (prefer location? access by)? prefetch? nothing? - avdice: enum (1 to 6) - - int device, // GPU device or cudaCpuDeviceId -) ; -#endif - -void GB_cuda_upscale_identity -( - GB_void *identity_upscaled, // output: at least sizeof (uint16_t) - GrB_Monoid monoid // input: monoid to upscale -) ; - -#endif - diff --git a/GraphBLAS/CUDA/GB_cuda.hpp b/GraphBLAS/CUDA/GB_cuda.hpp new file mode 100644 index 0000000000..baa0bc23ee --- /dev/null +++ b/GraphBLAS/CUDA/GB_cuda.hpp @@ -0,0 +1,97 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/GB_cuda.hpp: include file for host CUDA methods (not for JIT) +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +#ifndef GB_CUDA_HPP +#define GB_CUDA_HPP + +extern "C" +{ + #include "GB_dev.h" + #include "GB_compiler.h" + #include "GB_cpu_features.h" + #include "GB_warnings.h" +} + +#include "GraphBLAS_cuda.hpp" + +extern "C" +{ + #include + #include + #include "GB.h" + #include "GB_stringify.h" + #include "GB_iceil.h" +} + +// Finally, include the CUDA definitions +#include "cuda_runtime.h" +#include "cuda.h" + +#include +#include +#include +#include +#include + +#include "GB_cuda_error.hpp" +#include "GB_cuda_timer.hpp" + +//------------------------------------------------------------------------------ +// prefetch and memadvise +//------------------------------------------------------------------------------ + +// for the "which" parameter of GB_cuda_matrix_prefetch: +// FIXME: rename this to GB_WHATEVER_P for GB_cuda_matrix_advise + +#define GB_PREFETCH_P 1 +#define GB_PREFETCH_H 2 +#define GB_PREFETCH_Y 4 +#define GB_PREFETCH_B 8 +#define GB_PREFETCH_I 16 +#define GB_PREFETCH_X 32 +#define GB_PREFETCH_PIX (GB_PREFETCH_P + GB_PREFETCH_I + GB_PREFETCH_X) +#define GB_PREFETCH_PYI (GB_PREFETCH_P + GB_PREFETCH_Y + GB_PREFETCH_I) +#define GB_PREFETCH_PYBI (GB_PREFETCH_PYI + GB_PREFETCH_B) +#define GB_PREFETCH_PYBIX (GB_PREFETCH_PYBI + GB_PREFETCH_X) +#define GB_PREFETCH_PHI (GB_PREFETCH_P + GB_PREFETCH_H + GB_PREFETCH_I) +#define GB_PREFETCH_PHBI (GB_PREFETCH_PHI + GB_PREFETCH_B) +#define GB_PREFETCH_PHBIX (GB_PREFETCH_PHBI + GB_PREFETCH_X) + +GrB_Info GB_cuda_matrix_prefetch +( + GrB_Matrix A, + int which, // which components to prefetch (phybix control) + int device, // GPU device or cudaCpuDeviceId + cudaStream_t stream +) ; + +#if 0 +// do we need this function too? +GrB_Info GB_cuda_matrix_advise +( + GrB_Matrix A, + + p, h, y, b, i, x? 6 bools + + what to do: advise (prefer location? access by)? prefetch? nothing? + avdice: enum (1 to 6) + + int device, // GPU device or cudaCpuDeviceId +) ; +#endif + +void GB_cuda_upscale_identity +( + GB_void *identity_upscaled, // output: at least sizeof (uint32_t) + GrB_Monoid monoid // input: monoid to upscale +) ; + +#endif + diff --git a/GraphBLAS/CUDA/GB_cuda_AxB.hpp b/GraphBLAS/CUDA/GB_cuda_AxB.hpp new file mode 100644 index 0000000000..19a319777e --- /dev/null +++ b/GraphBLAS/CUDA/GB_cuda_AxB.hpp @@ -0,0 +1,33 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/GB_cuda_AxB.hpp +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +#ifndef GB_CUDA_AXB_H +#define GB_CUDA_AXB_H + +#include "GB_cuda.hpp" +#include "GB_hash.h" + +GrB_Info GB_cuda_AxB_dot3_jit +( + // input/output: + GrB_Matrix C, // FIXME: allow iso for this kernel + // input: + const GrB_Matrix M, const bool Mask_struct, + const GrB_Matrix A, + const GrB_Matrix B, + const GrB_Semiring semiring, + const bool flipxy, + // CUDA stream, device, and # of ms + cudaStream_t stream, + int device, + int number_of_sms +) ; + +#endif + diff --git a/GraphBLAS/CUDA/GB_cuda_AxB_dot3.cpp b/GraphBLAS/CUDA/GB_cuda_AxB_dot3.cpp new file mode 100644 index 0000000000..df14d833cf --- /dev/null +++ b/GraphBLAS/CUDA/GB_cuda_AxB_dot3.cpp @@ -0,0 +1,257 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/GB_cuda_AxB_dot3: compute C = A'*B on GPU(s) +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +// This function computes C=A'*B on the GPUs. The mask must be present, +// sparse or hypersparse, and not complemented. The mask is always applied. A +// and B can have any sparsity format. C is computed as sparse or hypersparse, +// with the same format as M. + +#define GB_FREE_WORKSPACE \ +{ \ + /* FIXME: use a stream pool instead */ \ + if (stream != nullptr) cudaStreamDestroy (stream) ; \ + stream = nullptr ; \ +} + +#define GB_FREE_ALL \ +{ \ + GB_FREE_WORKSPACE ; \ + GB_phybix_free (C) ; \ +} + +#include "GB_cuda_AxB.hpp" + +//------------------------------------------------------------------------------ +// GB_cuda_AxB_dot3 +//------------------------------------------------------------------------------ + +GrB_Info GB_cuda_AxB_dot3 // C = A'*B using dot product method +( + GrB_Matrix C, // output matrix + const GrB_Matrix M, // mask matrix + const bool Mask_struct, // if true, use the only structure of M + const GrB_Matrix A, // input matrix + const GrB_Matrix B, // input matrix + const GrB_Semiring semiring, // semiring that defines C=A*B + const bool flipxy // if true, do z=fmult(b,a) vs fmult(a,b) +) +{ + + cudaStream_t stream = nullptr ; + + //-------------------------------------------------------------------------- + // create the stream + //-------------------------------------------------------------------------- + + // FIXME: pass in a stream instead, or checkout a stream + CUDA_OK (cudaStreamCreate (&stream)) ; + GpuTimer kernel_timer; + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + // when CUDA is enabled, no static headers are used in all of GraphBLAS + GrB_Info info ; + ASSERT (C != NULL && !(C->static_header)) ; + ASSERT (M != NULL && !(M->static_header)) ; + ASSERT (A != NULL && !(A->static_header)) ; + ASSERT (B != NULL && !(B->static_header)) ; + + ASSERT_MATRIX_OK (M, "M for dot3 cuda A'*B", GB0) ; + ASSERT_MATRIX_OK (A, "A for dot3 cuda A'*B", GB0) ; + ASSERT_MATRIX_OK (B, "B for dot3 cuda A'*B", GB0) ; + + ASSERT (!GB_PENDING (M)) ; + ASSERT (GB_JUMBLED_OK (M)) ; + ASSERT (!GB_ZOMBIES (M)) ; + + ASSERT (!GB_PENDING (A)) ; + ASSERT (!GB_JUMBLED (A)) ; + ASSERT (!GB_ZOMBIES (A)) ; + + ASSERT (!GB_PENDING (B)) ; + ASSERT (!GB_ZOMBIES (B)) ; + ASSERT (!GB_JUMBLED (B)) ; + + ASSERT_SEMIRING_OK (semiring, "semiring for dot3 numeric A'*B", GB0) ; + + ASSERT (A->vlen == B->vlen) ; + GBURBLE ("(GPU dot3) ") ; + + //-------------------------------------------------------------------------- + // initializations + //-------------------------------------------------------------------------- + + int device = -1; + + // FIXME: control the GPU to use via the descriptor + CUDA_OK (cudaSetDevice ( 0 )) ; + CUDA_OK (cudaGetDevice (&device)) ; + int number_of_sms = GB_Global_gpu_sm_get (0) ; + + //-------------------------------------------------------------------------- + // get M, A, and B + //-------------------------------------------------------------------------- + + const int64_t mvlen = M->vlen ; + const int64_t mvdim = M->vdim ; + const int64_t mnz = GB_nnz (M) ; + const int64_t mnvec = M->nvec ; + const bool M_is_hyper = GB_IS_HYPERSPARSE( M ) ; + + const int64_t anz = GB_nnz (A) ; + const int64_t anvec = A->nvec ; + bool A_is_sparse = GB_IS_SPARSE (A) ; + bool A_is_hyper = GB_IS_HYPERSPARSE (A) ; + bool A_is_bitmap = GB_IS_BITMAP (A) ; + bool A_is_full = GB_IS_FULL (A) ; + bool A_is_sparse_or_hyper = A_is_sparse || A_is_hyper ; + bool A_is_bitmap_or_full = A_is_bitmap || A_is_full ; + + const int64_t bnz = GB_nnz (B) ; + const int64_t bnvec = B->nvec ; + bool B_is_sparse = GB_IS_SPARSE (B) ; + bool B_is_hyper = GB_IS_HYPERSPARSE (B) ; + bool B_is_bitmap = GB_IS_BITMAP (B) ; + bool B_is_full = GB_IS_FULL (B) ; + bool B_is_sparse_or_hyper = B_is_sparse || B_is_hyper ; + bool B_is_bitmap_or_full = B_is_bitmap || B_is_full ; + + //-------------------------------------------------------------------------- + // get the semiring operators + //-------------------------------------------------------------------------- + + GrB_BinaryOp mult = semiring->multiply ; + GrB_Monoid add = semiring->add ; + ASSERT (mult->ztype == add->op->ztype) ; + GB_Opcode mult_opcode = mult->opcode ; + if (mult->xtype->code == GB_BOOL_code) + { + mult_opcode = GB_boolean_rename (mult_opcode) ; + } + bool A_is_pattern, B_is_pattern ; + GB_binop_pattern (&A_is_pattern, &B_is_pattern, flipxy, mult_opcode) ; + + //-------------------------------------------------------------------------- + // allocate C, the same size and # of entries as M + //-------------------------------------------------------------------------- + + // FUTURE: ctype need not be the op->ztype + GrB_Type ctype = add->op->ztype ; + int64_t cvlen = mvlen ; + int64_t cvdim = mvdim ; + int64_t cnz = mnz ; + int64_t cnvec = mnvec ; + + int M_sparsity = (M_is_hyper) ? GxB_HYPERSPARSE : GxB_SPARSE ; + int C_sparsity = M_sparsity ; + bool C_iso = false ; // FIXME: pass in C_iso and cscalar + bool C_in_iso = false ; // FIXME: pass in C_in_iso and cscalar + + if (C_iso) + { + A_is_pattern = true ; + B_is_pattern = true ; + } + + GB_OK (GB_new_bix (&C, // sparse or hyper (from M), existing header + ctype, cvlen, cvdim, GB_Ap_malloc, true, + M_sparsity, false, M->hyper_switch, cnvec, + cnz+1, // add one to cnz for GB_cumsum of Cwork + true, C_iso)) ; + + //-------------------------------------------------------------------------- + // Pre-fetch arrays that will be used on the device + //-------------------------------------------------------------------------- + + // GB_cuda_matrix_advise (C, cnvec, cnz, which, what, device) + // advise C + CUDA_OK (cudaMemAdvise (C->p, (cnvec+1) * sizeof ( int64_t), + cudaMemAdviseSetPreferredLocation, device)) ; + if (M_is_hyper) + { + CUDA_OK (cudaMemAdvise (C->h, cnvec * sizeof ( int64_t), + cudaMemAdviseSetPreferredLocation, device)) ; + } + CUDA_OK (cudaMemAdvise (C->i, (cnz+1) * sizeof ( int64_t), + cudaMemAdviseSetPreferredLocation, device)) ; + if (!C_iso) + { + CUDA_OK (cudaMemAdvise (C->x, (cnz+1) * C->type->size , + cudaMemAdviseSetPreferredLocation, device)) ; + } + + // prefetch M (if M hypersparse: using M->h not M->Y) + GB_OK (GB_cuda_matrix_prefetch (M, + Mask_struct ? GB_PREFETCH_PHBI : GB_PREFETCH_PHBIX, device, stream)) ; + + //-------------------------------------------------------------------------- + // copy Mp and Mh into C + //-------------------------------------------------------------------------- + + // FIXME: use shallow? + CUDA_OK (cudaMemcpyAsync (C->p, M->p, (cnvec+1) * sizeof (int64_t), + cudaMemcpyDefault, stream)) ; + if (M_is_hyper) + { + CUDA_OK (cudaMemcpyAsync (C->h, M->h, cnvec * sizeof (int64_t), + cudaMemcpyDefault, stream)) ; + } + + C->nvals = cnz ; + C->magic = GB_MAGIC ; + C->nvec_nonempty = M->nvec_nonempty ; + C->jumbled = GB_JUMBLED (M) ; // C is jumbled if M is jumbled + + GBURBLE ("(GPU C created and copied from M) ") ; + + //-------------------------------------------------------------------------- + // prefetch A and B + //-------------------------------------------------------------------------- + + // M might be very very sparse. A(:,i) is not needed if M(:,i) is empty. + // Likewise, B(:,j) is not needed if M(:,j) is empty. For now, try this + // heuristic: if M is hypersparse, then do not prefetch A->b or A->x. + + int prefetch_b = (M_is_hyper) ? 0 : GB_PREFETCH_B ; + int prefetch_x = (M_is_hyper) ? 0 : GB_PREFETCH_X ; + int prefetch_pybi = GB_PREFETCH_PYI + prefetch_b ; + + // prefetch A (if A hypersparse: using A->Y) + GB_OK (GB_cuda_matrix_prefetch (A, prefetch_pybi + + (A_is_pattern ? 0 : prefetch_x), device, stream)) ; + + // prefetch B (if B hypersparse: using B->Y) + GB_OK (GB_cuda_matrix_prefetch (B, prefetch_pybi + + (B_is_pattern ? 0 : prefetch_x), device, stream)) ; + + //-------------------------------------------------------------------------- + // C=A'*B on CUDA, in the JIT + //-------------------------------------------------------------------------- + +// final call looks like this: +// GB_OK (GB_cuda_AxB_dot3_jit (C, M, Mask_struct, A, B, semiring, flipxy, +// stream, device, number_of_sms)) ; + +// debugging for now, to die early if the CUDA fails to compile, load, or run: + info = GB_cuda_AxB_dot3_jit (C, M, Mask_struct, A, B, semiring, flipxy, + stream, device, number_of_sms) ; + if (info == GrB_NO_VALUE) info = GrB_PANIC ; + GB_OK (info) ; + + //-------------------------------------------------------------------------- + // free workspace and return result + //-------------------------------------------------------------------------- + + GB_FREE_WORKSPACE ; + return GrB_SUCCESS; +} + diff --git a/GraphBLAS/CUDA/GB_cuda_AxB_dot3_branch.cpp b/GraphBLAS/CUDA/GB_cuda_AxB_dot3_branch.cpp index c69dc2132f..cac90233f2 100644 --- a/GraphBLAS/CUDA/GB_cuda_AxB_dot3_branch.cpp +++ b/GraphBLAS/CUDA/GB_cuda_AxB_dot3_branch.cpp @@ -2,20 +2,14 @@ // GraphBLAS/CUDA/GB_cuda_AxB_dot3_branch: decide to use GPU for dot3 //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ -// Decide branch direction for GPU use for the dot-product MxM +// Decide branch direction for GPU use for the dot-product C=A'*B -#include "GraphBLAS_cuda.h" - -extern "C" -{ - #include "GB_mxm.h" -} -#include "GB_cuda.h" +#include "GB_cuda.hpp" #include bool GB_cuda_AxB_dot3_branch @@ -36,8 +30,12 @@ bool GB_cuda_AxB_dot3_branch !GB_cuda_type_branch (semiring->multiply->ztype)) { // one or more types are not yet supported on the GPU - // FIXME: remove debug output here: - std::cout << "Not using cuda path: type size not supported" << std::endl; + return (false) ; + } + + if (A->vlen == 0) + { + // C has no entries: no need to compute it on the GPU return (false) ; } @@ -46,9 +44,6 @@ bool GB_cuda_AxB_dot3_branch double bdeg = ((double) GB_nnz (B)) / ((double) GB_IMAX (1, B->nvec)) ; double work = GB_nnz (M) * GB_IMIN (adeg, bdeg) ; - // TODO if A or B are not accessed (first, 2nd, or pair ops) - // then the type if A can be user-defined here, for CUDA. - int ngpus_to_use = GB_ngpus_to_use (work) ; GBURBLE (" work:%g GPUs:%d ", work, ngpus_to_use) ; if (ngpus_to_use > 0) @@ -60,9 +55,8 @@ bool GB_cuda_AxB_dot3_branch } else { - // FIXME: remove debug output here: - std::cout << "Not using cuda path." << std::endl; +// std::cout << "Not using cuda path for dot3." << std::endl; return false ; } - } + diff --git a/GraphBLAS/CUDA/GB_cuda_AxB_dot3_jit.cpp b/GraphBLAS/CUDA/GB_cuda_AxB_dot3_jit.cpp index 5933403dd9..fab1a7bdad 100644 --- a/GraphBLAS/CUDA/GB_cuda_AxB_dot3_jit.cpp +++ b/GraphBLAS/CUDA/GB_cuda_AxB_dot3_jit.cpp @@ -1,464 +1,65 @@ //------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_AxB_dot3_jit: compute C = A'*B on GPU(s) +// GB_cuda_AxB_dot3_jit: reduce a matrix to a scalar, via the CUDA JIT //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ -// This function computes C=A'*B on the GPUs. The mask must be present, -// sparse or hypersparse, and not complemented. The mask is always applied. A -// and B can have any sparsity format. C is computed as sparse or hypersparse, -// with the same format as M. +#include "GB_cuda_AxB.hpp" -#include "GB_cuda.h" extern "C" { - #include "GB_mxm.h" + typedef GB_JIT_CUDA_KERNEL_DOT3_PROTO ((*GB_jit_dl_function)) ; } -#include "GB_cuda_jitify_cache.h" -#include "GB_cuda_common_jitFactory.hpp" -#include "GB_cuda_reduce_jitFactory.hpp" -#include "GB_cuda_mxm_dot3_jitFactory.hpp" -#include "test/GpuTimer.h" - -/* -template -void print_array(void *arr, I size, const char *name) { - std::cout << "Printing " << name << std::endl; - for(I i = 0; i < size; ++i) { - std::cout << static_cast(arr)[i] << ", "; - } - std::cout << std::endl << "Done." << std::endl; -} -*/ - -#undef GB_FREE_WORKSPACE -#define GB_FREE_WORKSPACE \ -{ \ - /* FIXME: use a stream pool instead */ \ - CU_OK (cudaStreamSynchronize(stream)); \ - CU_OK (cudaStreamDestroy(stream)); \ - GB_FREE_WORK (&Nanobuckets, Nb_size) ; \ - GB_FREE_WORK (&Blockbucket, Bb_size) ; \ - GB_FREE_WORK (&Bucketp, Bup_size) ; \ - GB_FREE_WORK (&offset, O_size) ; \ - GB_FREE_WORK (&Bucket, Bu_size) ; \ -} - -#undef GB_FREE_ALL -#define GB_FREE_ALL \ -{ \ - GB_FREE_WORKSPACE ; \ - GB_phybix_free (C) ; \ -} - -//------------------------------------------------------------------------------ -// GB_AxB_dot3_cuda -//------------------------------------------------------------------------------ - -GrB_Info GB_cuda_AxB_dot3_jit // C = A'*B using dot product method +GrB_Info GB_cuda_AxB_dot3_jit ( - GrB_Matrix C, // output matrix - const GrB_Matrix M, // mask matrix - const bool Mask_struct, // if true, use the only structure of M - const GrB_Matrix A, // input matrix - const GrB_Matrix B, // input matrix - const GrB_Semiring semiring, // semiring that defines C=A*B - const bool flipxy // if true, do z=fmult(b,a) vs fmult(a,b) + // input/output: + GrB_Matrix C, // FIXME: allow iso for this kernel + // input: + const GrB_Matrix M, const bool Mask_struct, + const GrB_Matrix A, + const GrB_Matrix B, + const GrB_Semiring semiring, + const bool flipxy, + // CUDA stream, device, and # of ms + cudaStream_t stream, + int device, + int number_of_sms ) -{ - - // FIXME: pass in a stream instead, or checkout a stream - cudaStream_t stream = NULL ; - CU_OK (cudaStreamCreate(&stream)); - - GpuTimer kernel_timer; - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - // when CUDA is enabled, no static headers are used in all of GraphBLAS - GrB_Info info ; - ASSERT (C != NULL && !(C->static_header)) ; - ASSERT (M != NULL && !(M->static_header)) ; - ASSERT (A != NULL && !(A->static_header)) ; - ASSERT (B != NULL && !(B->static_header)) ; - - ASSERT_MATRIX_OK (M, "M for dot3 cuda A'*B", GB0) ; - ASSERT_MATRIX_OK (A, "A for dot3 cuda A'*B", GB0) ; - ASSERT_MATRIX_OK (B, "B for dot3 cuda A'*B", GB0) ; - - ASSERT (!GB_PENDING (M)) ; - ASSERT (GB_JUMBLED_OK (M)) ; - ASSERT (!GB_ZOMBIES (M)) ; - - ASSERT (!GB_PENDING (A)) ; - ASSERT (!GB_JUMBLED (A)) ; - ASSERT (!GB_ZOMBIES (A)) ; - - ASSERT (!GB_PENDING (B)) ; - ASSERT (!GB_ZOMBIES (B)) ; - ASSERT (!GB_JUMBLED (B)) ; - - ASSERT_SEMIRING_OK (semiring, "semiring for dot3 numeric A'*B", GB0) ; - - ASSERT (A->vlen == B->vlen) ; - GBURBLE ("(GPU dot3) ") ; - //printf ("\nM -------------\n") ; GxB_Matrix_fprint (M, "M", GxB_SHORT, stdout) ; - //printf ("\nA -------------\n") ; GxB_Matrix_fprint (A, "A", GxB_SHORT, stdout) ; - //printf ("\nB -------------\n") ; GxB_Matrix_fprint (B, "B", GxB_SHORT, stdout) ; - - //-------------------------------------------------------------------------- - // initializations - //-------------------------------------------------------------------------- - - int64_t *Nanobuckets = NULL ; size_t Nb_size = 0 ; - int64_t *Blockbucket = NULL ; size_t Bb_size = 0 ; - int64_t *Bucket = NULL ; size_t Bu_size = 0 ; - int64_t *Bucketp = NULL ; size_t Bup_size = 0 ; - int64_t *offset = NULL ; size_t O_size = 0 ; - - int device = -1; - - // FIXME: control the GPU to use via the descriptor - CU_OK (cudaSetDevice( 0 )); - CU_OK (cudaGetDevice(&device)); - - //-------------------------------------------------------------------------- - // get M - //-------------------------------------------------------------------------- - - const int64_t mvlen = M->vlen ; - const int64_t mvdim = M->vdim ; - const int64_t mnz = GB_nnz (M) ; - const int64_t mnvec = M->nvec ; - const bool M_is_hyper = GB_IS_HYPERSPARSE( M ) ; - - const int64_t anz = GB_nnz (A) ; - const int64_t anvec = A->nvec ; - - const int64_t bnz = GB_nnz (B) ; - const int64_t bnvec = B->nvec ; - - //-------------------------------------------------------------------------- - // allocate C, the same size and # of entries as M - //-------------------------------------------------------------------------- - - // FUTURE: ctype need not be the op->ztype - GrB_Type ctype = semiring->add->op->ztype ; - int64_t cvlen = mvlen ; - int64_t cvdim = mvdim ; - int64_t cnz = mnz ; - int64_t cnvec = mnvec ; - - int M_sparsity = (M_is_hyper) ? GxB_HYPERSPARSE : GxB_SPARSE ; - int C_sparsity = M_sparsity ; - bool C_iso = false ; // FIXME: pass in C_iso and cscalar - bool C_in_iso = false ; // FIXME: pass in C_in_iso and cscalar - info = GB_new_bix (&C, // sparse or hyper (from M), existing header - ctype, cvlen, cvdim, GB_Ap_malloc, true, - M_sparsity, false, M->hyper_switch, cnvec, - cnz+1, // add one to cnz for GB_cumsum of Cwork - true, C_iso) ; - - if (info != GrB_SUCCESS) - { - // out of memory - GB_FREE_ALL ; - return (info) ; - } - -// try this with GB_Ap_null, above in GB_new_bix -// C->p = M->p ; C->p_shallow = true ; -// C->h = M->h ; C->h_shallow = true ; - - //-------------------------------------------------------------------------- - // Pre-fetch arrays that will be used on the device - //-------------------------------------------------------------------------- - - // GB_cuda_matrix_advise (C, cnvec, cnz, which, what, device) - // advise C - CU_OK (cudaMemAdvise (C->p, (cnvec+1) * sizeof ( int64_t), - cudaMemAdviseSetPreferredLocation, device)) ; - if (M_is_hyper) - { - CU_OK (cudaMemAdvise (C->h, cnvec * sizeof ( int64_t), - cudaMemAdviseSetPreferredLocation, device)) ; - } - CU_OK (cudaMemAdvise (C->i, (cnz+1) * sizeof ( int64_t), - cudaMemAdviseSetPreferredLocation, device)) ; - if (!C_iso) - { - CU_OK (cudaMemAdvise (C->x, (cnz+1) * C->type->size , - cudaMemAdviseSetPreferredLocation, device)) ; - } - - // prefetch M (if M hypersparse: using M->h not M->Y) - GB_OK (GB_cuda_matrix_prefetch (M, - Mask_struct ? GB_PREFETCH_PHBI : GB_PREFETCH_PHBIX, device, stream)) ; - - //-------------------------------------------------------------------------- - // copy Mp and Mh into C - //-------------------------------------------------------------------------- - - // FIXME: use shallow? - CU_OK (cudaMemcpyAsync (C->p, M->p, (cnvec+1) * sizeof (int64_t), - cudaMemcpyDefault, stream)) ; - if (M_is_hyper) - { - CU_OK (cudaMemcpyAsync (C->h, M->h, cnvec * sizeof (int64_t), - cudaMemcpyDefault, stream)) ; - } - - C->nvals = cnz ; - C->magic = GB_MAGIC ; - C->nvec_nonempty = M->nvec_nonempty ; - C->jumbled = GB_JUMBLED (M) ; // C is jumbled if M is jumbled - - GBURBLE ("(GPU C created and copied from M) ") ; +{ //-------------------------------------------------------------------------- - // stringify the semiring and the mask + // encodify the problem //-------------------------------------------------------------------------- - GB_cuda_mxm_factory my_mxm_spec = GB_cuda_mxm_factory ( ) ; - - // (1) create the mxm code and name - my_mxm_spec.mxm_factory ( C_iso, C_in_iso, C_sparsity, ctype, + GB_jit_encoding encoding ; + char *suffix ; + uint64_t hash = GB_encodify_mxm (&encoding, &suffix, + GB_JIT_CUDA_KERNEL_AXB_DOT3, + // FIXME: all C to be iso + /* C->iso: */ false, false, GB_sparsity (C), C->type, M, Mask_struct, false, semiring, flipxy, A, B) ; - // (2) ensure the jitifier has "GB_mxm_[my_mxm_spec.sr_code].h" - jit::GBJitCache filecache = jit::GBJitCache::Instance() ; - filecache.getFile (my_mxm_spec) ; - - GBURBLE ("(GPU stringified srcode = %lu)\n", my_mxm_spec.sr_code) ; - - //-------------------------------------------------------------------------- - // get A and B - //-------------------------------------------------------------------------- - - // FIXME: add acode, bcode to the GB_cuda_mxm_factory object - int acode = GB_RSHIFT (my_mxm_spec.sr_code, 12, 4) ; // if 0: A is pattern - int bcode = GB_RSHIFT (my_mxm_spec.sr_code, 8, 4) ; // if 0: B is pattern - - bool A_is_sparse = GB_IS_SPARSE (A) ; - bool A_is_hyper = GB_IS_HYPERSPARSE (A) ; - bool A_is_bitmap = GB_IS_BITMAP (A) ; - bool A_is_full = GB_IS_FULL (A) ; - bool A_is_sparse_or_hyper = A_is_sparse || A_is_hyper ; - bool A_is_bitmap_or_full = A_is_bitmap || A_is_full ; - bool A_is_pattern = (acode == 0) ; - - bool B_is_sparse = GB_IS_SPARSE (B) ; - bool B_is_hyper = GB_IS_HYPERSPARSE (B) ; - bool B_is_bitmap = GB_IS_BITMAP (B) ; - bool B_is_full = GB_IS_FULL (B) ; - bool B_is_sparse_or_hyper = B_is_sparse || B_is_hyper ; - bool B_is_bitmap_or_full = B_is_bitmap || B_is_full ; - bool B_is_pattern = (bcode == 0) ; - - // M might be very very sparse. A(:,i) is not needed if M(:,i) is empty. - // Likewise, B(:,j) is not needed if M(:,j) is empty. For now, try this - // heuristic: if M is hypersparse, then do not prefetch A->b or A->x. - - int prefetch_b = (M_is_hyper) ? 0 : GB_PREFETCH_B ; - int prefetch_x = (M_is_hyper) ? 0 : GB_PREFETCH_X ; - int prefetch_pybi = GB_PREFETCH_PYI + prefetch_b ; - - // prefetch A (if A hypersparse: using A->Y) - GB_OK (GB_cuda_matrix_prefetch (A, prefetch_pybi + - (A_is_pattern ? 0 : prefetch_x), device, stream)) ; - - // prefetch B (if B hypersparse: using B->Y) - GB_OK (GB_cuda_matrix_prefetch (B, prefetch_pybi + - (B_is_pattern ? 0 : prefetch_x), device, stream)) ; - //-------------------------------------------------------------------------- - // C=A'*B via jitified kernels + // get the kernel function pointer, loading or compiling it if needed //-------------------------------------------------------------------------- - if (A_is_bitmap_or_full && B_is_bitmap_or_full) - { - - //---------------------------------------------------------------------- - // (full or bitmap) times (full or bitmap) - //---------------------------------------------------------------------- - - dense_phase1launchFactory dp1lf(my_mxm_spec); - - GBURBLE ("(GPU dense phase1 start nblk = %d) ", - dp1lf.get_number_of_blocks(M)) ; - kernel_timer.Start(); - dp1lf.jitGridBlockLaunch(C, M, A, B, stream); - CU_OK (cudaStreamSynchronize(stream)); - kernel_timer.Stop(); - GBURBLE ("(GPU phase1 done %12.6g ms )\n", kernel_timer.Elapsed()) ; - - mxm_dense_launchFactory mdlf(my_mxm_spec); - GBURBLE ("(GPU Dense full x full launch ) ") ; - kernel_timer.Start(); - mdlf.jitGridBlockLaunch( C, M, A, B, stream); - CU_OK (cudaStreamSynchronize(stream)); // only for timing - kernel_timer.Stop(); - GBURBLE ("(GPU Dense full x full done %12.6g ms, rate=%12.6g)\n", - kernel_timer.Elapsed(), (mnvec)/(1000*kernel_timer.Elapsed())) ; - - } - else - { - - //---------------------------------------------------------------------- - // (sparse or hyper) times (sparse or hyper) - // (sparse or hyper) times (bitmap or full) - // (bitmap or full) times (sparse or hyper) - //---------------------------------------------------------------------- - - //---------------------------------------------------------------------- - // construct the tasks for phase1 and phase2 - //---------------------------------------------------------------------- - - // on the CPU: nthreads = GB_nthreads (cnz, chunk, nthreads_max) ; - // on the GPU: - phase1launchFactory p1lf(my_mxm_spec); - phase2launchFactory p2lf; - phase2endlaunchFactory p2elf; - - // # of threads in phase1 and phase2 kernel launches are related - // # by the size of the warp. ph2_task = ph1_task/32 for example - int nthrd = p2lf.get_threads_per_block(); - int ntasks = p2elf.get_number_of_blocks(M); - - int64_t nanobuckets_size = NBUCKETS * nthrd * ntasks; - int64_t blockbuckets_size = NBUCKETS * ntasks; - - Nanobuckets = GB_MALLOC_WORK (nanobuckets_size, int64_t, &Nb_size) ; - Blockbucket = GB_MALLOC_WORK (blockbuckets_size, int64_t, &Bb_size) ; - Bucketp = GB_MALLOC_WORK (NBUCKETS+1, int64_t, &Bup_size) ; - offset = GB_MALLOC_WORK (NBUCKETS, int64_t, &O_size) ; - Bucket = GB_MALLOC_WORK (mnz, int64_t, &Bu_size) ; - - if (Nanobuckets == NULL || Blockbucket == NULL || Bucketp == NULL - || Bucket == NULL || offset == NULL) - { - // out of memory - GB_FREE_ALL ; - return (GrB_OUT_OF_MEMORY) ; - } - - // FIXME: do async with streams - // FIXME: do we need any of these? - //CU_OK (cudaMemsetAsync(Nanobuckets, 0, - // nanobuckets_size * sizeof(int64_t), stream)); - //CU_OK (cudaMemsetAsync(Blockbucket, 0, - // blockbuckets_size * sizeof(int64_t), stream)); - CU_OK (cudaMemsetAsync(Bucketp, 0, - (NBUCKETS+1) * sizeof(int64_t), stream)); - CU_OK (cudaMemsetAsync(offset, 0, - NBUCKETS * sizeof(int64_t), stream)); - //CU_OK (cudaMemsetAsync(Bucket, 0, - // mnz * sizeof(int64_t), stream)); - - //---------------------------------------------------------------------- - // phase1 and phase2: place each C(i,j) in a bucket - //---------------------------------------------------------------------- - - CU_OK (cudaMemAdvise( Bucketp, (NBUCKETS+1) * sizeof ( int64_t), - cudaMemAdviseSetPreferredLocation, cudaCpuDeviceId)); - CU_OK (cudaMemAdvise( Bucketp, (NBUCKETS+1) * sizeof ( int64_t), - cudaMemAdviseSetAccessedBy, device)); - - CU_OK (cudaMemAdvise( offset, NBUCKETS * sizeof ( int64_t), - cudaMemAdviseSetPreferredLocation, cudaCpuDeviceId)); - CU_OK (cudaMemAdvise( offset, NBUCKETS * sizeof ( int64_t), - cudaMemAdviseSetAccessedBy, device)); - - //---------------------------------------------------------------------- - // phase1: assign each C(i,j) to a bucket, and count them - //---------------------------------------------------------------------- - - GBURBLE ("(GPU sparse phase1 start nblk = %d) ", - p1lf.get_number_of_blocks(M)); - kernel_timer.Start(); - p1lf.jitGridBlockLaunch(Nanobuckets, Blockbucket, C, M, A, B, stream); - CU_OK (cudaStreamSynchronize(stream)); - kernel_timer.Stop(); - - GBURBLE ("(GPU phase1 done %12.6g ms )\n", kernel_timer.Elapsed()) ; - - //---------------------------------------------------------------------- - // phase2: cumsum across the blockbuckets, propagate to thread level - //---------------------------------------------------------------------- - - GBURBLE ("(GPU phase2 start nblk=%d ) ", ntasks) ; - - kernel_timer.Start(); - p2lf.jitGridBlockLaunch(Blockbucket, offset, M, stream); - kernel_timer.Stop(); - - CU_OK (cudaStreamSynchronize(stream)); - - int64_t s= offset[0]; - C->nzombies = s; - bool all_in_one = false; - for ( int bucket = 1 ; bucket < NBUCKETS+1; ++bucket) - { - Bucketp[bucket] = s; - s += offset[bucket]; - if ( (Bucketp[bucket] - Bucketp[bucket-1] ) == mnz ) - { - all_in_one = true; - } - } - - GBURBLE ("(GPU phase2 done %12.6g ms )\n", kernel_timer.Elapsed()) ; - - if (!all_in_one) - { - GBURBLE ("(GPU phase2end start nblk=%d) ", ntasks) ; - - kernel_timer.Start(); - p2elf.jitGridBlockLaunch(Nanobuckets, Blockbucket, - Bucketp, Bucket, offset, C, M, stream); - - CU_OK (cudaStreamSynchronize(stream)); - kernel_timer.Stop(); - GBURBLE ("(GPU phase2end done %12.6g ms)\n",kernel_timer.Elapsed()); - } - - //---------------------------------------------------------------------- - // phase3: do the numerical work - //---------------------------------------------------------------------- - - for ( int bucket = 1 ; bucket < NBUCKETS; ++bucket) - { - int64_t start = Bucketp[bucket]; - int64_t end = Bucketp[bucket + 1 ]; - if (end - start > 0) - { - // TODO: Use stream pool - phase3launchFactory p3lf(my_mxm_spec, (GB_bucket_code)bucket); - GBURBLE ("(GPU phase3 bucket %d launch ) ", bucket) ; - kernel_timer.Start(); - p3lf.jitGridBlockLaunch(start, end, Bucketp, Bucket, - C, M, A, B, stream); - CU_OK (cudaStreamSynchronize(stream)); // only for timing - kernel_timer.Stop(); - GBURBLE ("(GPU phase3 bucket %d done %12.6g ms, rate=%12.6g)\n", - bucket, kernel_timer.Elapsed(), - (end-start)/(1000*kernel_timer.Elapsed())) ; - } - } - } + void *dl_function ; + GrB_Info info = GB_jitifyer_load (&dl_function, + GB_jit_mxm_family, "cuda_AxB_dot3", + hash, &encoding, suffix, semiring, NULL, + NULL, C->type, A->type, B->type) ; + if (info != GrB_SUCCESS) return (info) ; //-------------------------------------------------------------------------- - // free workspace and return result + // call the jit kernel and return result //-------------------------------------------------------------------------- - GB_FREE_WORKSPACE ; - return GrB_SUCCESS; + GB_jit_dl_function GB_jit_kernel = (GB_jit_dl_function) dl_function ; + return (GB_jit_kernel (C, M, A, B, stream, device, number_of_sms, + &GB_callback)) ; } diff --git a/GraphBLAS/CUDA/GB_cuda_common_jitFactory.hpp b/GraphBLAS/CUDA/GB_cuda_common_jitFactory.hpp deleted file mode 100644 index 5d7ad01e6f..0000000000 --- a/GraphBLAS/CUDA/GB_cuda_common_jitFactory.hpp +++ /dev/null @@ -1,82 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_common_jitFactory.hpp: for all jitFactory classes -//------------------------------------------------------------------------------ - -// (c) Nvidia Corp. 2023 All rights reserved -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -// Common defines for all jitFactory classes: -// iostream callback to deliver the buffer to jitify as if read from a file -// compiler flags -// Include this file along with any jitFactory you need. - -// NOTE: do not edit the GB_cuda_common_jitFactory.hpp directly. It is -// configured by cmake from the following file: -// GraphBLAS/CUDA/Config/GB_cuda_common_jitFactory.hpp.in - -#ifndef GB_CUDA_COMMON_JITFACTORY_HPP -#define GB_CUDA_COMMON_JITFACTORY_HPP - -#pragma once - -#include "GraphBLAS_cuda.h" - -extern "C" -{ - #include "GB.h" - #include "GB_stringify.h" -} - -#include -#include -#include "GB_cuda_jitify_cache.h" -#include "GB_cuda_jitify_launcher.h" -#include "GB_cuda_mxm_factory.hpp" -#include "GB_cuda_error.h" -#include "../rmm_wrap/rmm_wrap.h" -#include "GB_iceil.h" - -// amount of shared memory to use in CUDA kernel launches -constexpr unsigned int SMEM = 0 ; - -#if 0 - -static const std::vector GB_jit_cuda_compiler_flags{ // OLD - "-std=c++17", - //"-G", - "-remove-unused-globals", - "-w", - "-D__CUDACC_RTC__", -// "-I" + jit::get_user_home_cache_dir(), // FIXME: add +/cu/00 -// "-I" + jit::get_user_home_cache_dir() + "/src", - "-I/usr/local/cuda/include", - // FIXME: add SUITESPARSE_CUDA_ARCHITECTURES here, via config -}; - -#endif - -inline std::vector GB_cuda_jit_compiler_flags ( ) -{ - return ( - std::vector ( - {"-std=c++17", - //"-G", - "-remove-unused-globals", - "-w", - "-D__CUDACC_RTC__", - "-I" + jit::get_user_home_cache_dir(), // FIXME: add +/cu/00 - "-I" + jit::get_user_home_cache_dir() + "/src", - "-I/usr/local/cuda/include" - // FIXME: add SUITESPARSE_CUDA_ARCHITECTURES here, via config - })) ; -} ; - -// FIXME: rename GB_jit_cuda_header_names or something -static const std::vector header_names ={}; - -// FIXME: rename GB_jit_cuda_file_callback -inline std::istream* (*file_callback)(std::string, std::iostream&); - -#endif diff --git a/GraphBLAS/CUDA/GB_cuda_error.h b/GraphBLAS/CUDA/GB_cuda_error.h deleted file mode 100644 index d9aec9b3ff..0000000000 --- a/GraphBLAS/CUDA/GB_cuda_error.h +++ /dev/null @@ -1,82 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_error.h -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -/* - * Copyright (c) 2023 NVIDIA CORPORATION. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef GB_CUDA_ERROR_H -#define GB_CUDA_ERROR_H - -#include - -static const char *_cudaGetErrorEnum(cudaError_t error) { - return cudaGetErrorName(error); -} - -template -void check(T result, char const *const func, const char *const file, - int const line) { - if (result) { - fprintf(stderr, "CUDA error at %s:%d code=%d(%s) \"%s\" \n", file, line, - static_cast(result), _cudaGetErrorEnum(result), func); - exit(EXIT_FAILURE); - } -} - -#define checkCudaErrors(val) check((val), #val, __FILE__, __LINE__) - -// This will output the proper error string when calling cudaGetLastError -#define getLastCudaError(msg) __getLastCudaError(msg, __FILE__, __LINE__) - -inline void __getLastCudaError(const char *errorMessage, const char *file, - const int line) { - cudaError_t err = cudaGetLastError(); - - if (cudaSuccess != err) { - fprintf(stderr, - "%s(%i) : getLastCudaError() CUDA error :" - " %s : (%d) %s.\n", - file, line, errorMessage, static_cast(err), - cudaGetErrorString(err)); - exit(EXIT_FAILURE); - } -} - -// This will only print the proper error string when calling cudaGetLastError -// but not exit program incase error detected. -#define printLastCudaError(msg) __printLastCudaError(msg, __FILE__, __LINE__) - -inline void __printLastCudaError(const char *errorMessage, const char *file, - const int line) { - cudaError_t err = cudaGetLastError(); - - if (cudaSuccess != err) { - fprintf(stderr, - "%s(%i) : getLastCudaError() CUDA error :" - " %s : (%d) %s.\n", - file, line, errorMessage, static_cast(err), - cudaGetErrorString(err)); - } -} -#define CHECK_CUDA(call) checkCudaErrors( call ) - -#endif diff --git a/GraphBLAS/CUDA/GB_cuda_get_device_count.cu b/GraphBLAS/CUDA/GB_cuda_get_device_count.cu index 7cad833fa1..3f0d074dd4 100644 --- a/GraphBLAS/CUDA/GB_cuda_get_device_count.cu +++ b/GraphBLAS/CUDA/GB_cuda_get_device_count.cu @@ -2,12 +2,13 @@ // GraphBLAS/CUDA/GB_cuda_get_device_count.cu: find out how many GPUs exist //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ -#include "GB_cuda.h" +#include "GB_cuda.hpp" bool GB_cuda_get_device_count // true if OK, false if failure ( diff --git a/GraphBLAS/CUDA/GB_cuda_get_device_properties.cu b/GraphBLAS/CUDA/GB_cuda_get_device_properties.cu index 7bb7e1407f..daaac9a214 100644 --- a/GraphBLAS/CUDA/GB_cuda_get_device_properties.cu +++ b/GraphBLAS/CUDA/GB_cuda_get_device_properties.cu @@ -2,12 +2,17 @@ // GraphBLAS/CUDA/GB_cuda_get_device_properties: get the properties of a GPU //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ -#include "GB_cuda.h" +#include "GB_cuda.hpp" +#define CU_OK(cudaMethod) \ +{ \ + if ((cudaMethod) != cudaSuccess) return (false) ; \ +} //------------------------------------------------------------------------------ // GB_cuda_get_device: get the current GPU @@ -20,7 +25,7 @@ bool GB_cuda_get_device (int &device) // invalid inputs return (false) ; } - CHECK_CUDA_SIMPLE (cudaGetDevice (&device)) ; + CU_OK (cudaGetDevice (&device)) ; return (true) ; } @@ -35,7 +40,7 @@ bool GB_cuda_set_device (int device) // invalid inputs return (false) ; } - CHECK_CUDA_SIMPLE (cudaSetDevice (device)) ; + CU_OK (cudaSetDevice (device)) ; return (true) ; } @@ -64,7 +69,7 @@ bool GB_cuda_get_device_properties // true if OK, false if failure memset (prop, 0, sizeof (GB_cuda_device)) ; int old_device ; - CHECK_CUDA_SIMPLE ( cudaGetDevice( &old_device ) ) ; + CU_OK (cudaGetDevice (&old_device )) ; //-------------------------------------------------------------------------- // get the properties @@ -73,26 +78,24 @@ bool GB_cuda_get_device_properties // true if OK, false if failure int num_sms, compute_capability_major, compute_capability_minor ; size_t memfree, memtotal ; - CHECK_CUDA_SIMPLE( cudaDeviceGetAttribute (&num_sms, - cudaDevAttrMultiProcessorCount, - device) ) ; - CHECK_CUDA_SIMPLE( cudaDeviceGetAttribute (&compute_capability_major, - cudaDevAttrComputeCapabilityMajor, - device) ) ; - CHECK_CUDA_SIMPLE( cudaDeviceGetAttribute (&compute_capability_minor, - cudaDevAttrComputeCapabilityMajor, - device) ) ; + CU_OK (cudaDeviceGetAttribute (&num_sms, + cudaDevAttrMultiProcessorCount, device)) ; + CU_OK (cudaDeviceGetAttribute (&compute_capability_major, + cudaDevAttrComputeCapabilityMajor, device)) ; + CU_OK (cudaDeviceGetAttribute (&compute_capability_minor, + cudaDevAttrComputeCapabilityMinor, device)) ; - CHECK_CUDA_SIMPLE ( cudaSetDevice( device ) ) ; - CHECK_CUDA_SIMPLE ( cudaMemGetInfo( & memfree, &memtotal) ) ; - CHECK_CUDA_SIMPLE ( cudaSetDevice( old_device ) ) ; + CU_OK (cudaSetDevice (device )) ; + CU_OK (cudaMemGetInfo (&memfree, &memtotal)) ; + CU_OK (cudaSetDevice (old_device )) ; prop->total_global_memory = memtotal ; prop->number_of_sms = num_sms ; prop->compute_capability_major = compute_capability_major ; prop->compute_capability_minor = compute_capability_minor ; - printf ("Device: %d: memory: %ld SMs: %d compute: %d.%d\n", + // FIXME: remove this printf + printf ("\nDevice: %d: memory: %ld SMs: %d compute: %d.%d\n", device, prop->total_global_memory, prop->number_of_sms, prop->compute_capability_major, prop->compute_capability_minor) ; diff --git a/GraphBLAS/CUDA/GB_cuda_init.c b/GraphBLAS/CUDA/GB_cuda_init.c index 25dd233b88..ed920f9758 100644 --- a/GraphBLAS/CUDA/GB_cuda_init.c +++ b/GraphBLAS/CUDA/GB_cuda_init.c @@ -2,7 +2,8 @@ // GraphBLAS/CUDA/GB_cuda_init: initialize the GPUs for use by GraphBLAS //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ @@ -12,7 +13,6 @@ // assumed. Then each GPU is "warmed up" by allocating a small amount of // memory. -#undef GBCUDA_CPLUSPLUS #include "GB.h" GrB_Info GB_cuda_init (void) @@ -55,7 +55,6 @@ GrB_Info GB_cuda_init (void) GB_cuda_set_device (0) ; // make GPU 0 the default device GB_Context_gpu_id_set (NULL, 0) ; // set GxB_CONTEXT_WORLD->gpu_id to 0 - GB_Global_hack_set (2, 0) ; // gpu_hack default // also check for jit cache, pre-load library of common kernels ... return (GrB_SUCCESS) ; diff --git a/GraphBLAS/CUDA/GB_cuda_jitify_cache.cu b/GraphBLAS/CUDA/GB_cuda_jitify_cache.cu deleted file mode 100644 index 3e66d735b5..0000000000 --- a/GraphBLAS/CUDA/GB_cuda_jitify_cache.cu +++ /dev/null @@ -1,233 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_jitify_cache.cu -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -/* - * Copyright (c) 2019,2023 NVIDIA CORPORATION. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//------------------------------------------------------------------------------ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "GB_cuda_jitify_cache.h" -#include "GraphBLAS_cuda.h" - -extern "C" -{ - #include "GB.h" - #include "GB_jitifyer.h" -} - -namespace jit { - -// Get the directory in home to use for storing the cache - std::string get_user_home_cache_dir() { - const char *path = GB_jitifyer_get_cache_path ( ) ; - if (path == NULL) - { - return std::string ("") ; - } - else - { - return std::string (path) ; - } - } - -GBJitCache::GBJitCache() { } - -GBJitCache::~GBJitCache() { } - - -std::mutex GBJitCache::_kernel_cache_mutex; -std::mutex GBJitCache::_program_cache_mutex; - -std::string GBJitCache::getFile( - File_Desc &file_object ) -{ - // Lock for thread safety - std::lock_guard lock(_program_cache_mutex); - - // Macrofied version - auto cached_file = getCachedFile( file_object, file_map ); - return *std::get<1>( cached_file ).get(); -} - -named_prog GBJitCache::getProgram( - std::string const& prog_name, - std::string const& cuda_source, - std::vector const& given_headers, - std::vector const& given_options, - jitify::experimental::file_callback_type file_callback) -{ - // Lock for thread safety - std::lock_guard lock(_program_cache_mutex); -// printf(" jit_cache get program %s\n", prog_name.c_str()); - - return getCached(prog_name, program_map, - [&](){ - return jitify::experimental::Program(cuda_source, - given_headers, - given_options, - file_callback); - } - ); -} - -named_prog GBJitCache::getKernelInstantiation( - std::string const& kern_name, - named_prog const& named_program, - std::vector const& arguments) -{ - // Lock for thread safety - std::lock_guard lock(_kernel_cache_mutex); - - std::string prog_name = std::get<0>(named_program); - jitify::experimental::Program& program = *std::get<1>(named_program); - - // Make instance name e.g. "prog_binop.kernel_v_v_int_int_long int_Add" - std::string kern_inst_name = kern_name; - for ( auto&& arg : arguments ) kern_inst_name += '_' + arg; - - //printf(" got kernel instance %s\n",kern_inst_name.c_str()); - - return getCached(kern_inst_name, kernel_inst_map, - [&](){return program.kernel(kern_name) - .instantiate(arguments); - } - ); -} - -// Another overload for getKernelInstantiation which might be useful to get -// kernel instantiations in one step -// ------------------------------------------------------------------------ -/* -jitify::experimental::KernelInstantiation GBJitCache::getKernelInstantiation( - std::string const& kern_name, - std::string const& prog_name, - std::string const& cuda_source = "", - std::vector const& given_headers = {}, - std::vector const& given_options = {}, - file_callback_type file_callback = nullptr) -{ - auto program = getProgram(prog_name, - cuda_source, - given_headers, - given_options, - file_callback); - return getKernelInstantiation(kern_name, program); -} -*/ - -GBJitCache::cacheFile::cacheFile(std::string file_name) - : _file_name{file_name} -{ } - -GBJitCache::cacheFile::~cacheFile() { } - -std::string GBJitCache::cacheFile::read_file() -{ - // Open file (duh) - int fd = open ( _file_name.c_str(), O_RDWR ); - if ( fd == -1 ) { - // TODO: connect errors to GrB_error result -// printf(" failed to open cache file %s\n",_file_name.c_str()); - successful_read = false; - return std::string(); - } - - // Lock the file descriptor. we the only ones now - if ( lockf(fd, F_LOCK, 0) == -1 ) { - successful_read = false; - return std::string(); - } - - // Get file descriptor from file pointer - FILE *fp = fdopen( fd, "rb" ); - - // Get file length - fseek( fp , 0L , SEEK_END); - size_t file_size = ftell( fp ); - rewind( fp ); - - // Allocate memory of file length size - std::string content; - content.resize(file_size); - - char *buffer = content.data(); - - // Copy file into buffer - if( fread(buffer, file_size, 1, fp) != 1 ) { - //printf(" failed to read cache file %s\n",_file_name.c_str()); - successful_read = false; - fclose(fp); -// free(buffer); FIXME: Shouldn't need to free buffer since it's RAII - return content; // FIXME: use unique_ptr here - } - -// printf("about to close\n"); - fclose(fp); - successful_read = true; -// printf(" read cache file %s\n",_file_name.c_str()); - - return content; -} - -void GBJitCache::cacheFile::write(std::string content) -{ - // Open file and create if it doesn't exist, with access 0600 - int fd = open ( _file_name.c_str(), O_RDWR | O_CREAT, S_IRUSR | S_IWUSR ); - if ( fd == -1 ) { - //printf(" failed to open cache file for write %s\n",_file_name.c_str()); - successful_write = false; - return; - } - - // Lock the file descriptor. we the only ones now - if ( lockf(fd, F_LOCK, 0) == -1 ) { - successful_write = false; - return; - } - - // Get file descriptor from file pointer - FILE *fp = fdopen( fd, "wb" ); - - // Copy string into file - if( fwrite(content.c_str(), content.length(), 1, fp) != 1 ) { - //printf(" failed to write cache file %s\n",_file_name.c_str()); - successful_write = false; - fclose(fp); - return; - } - fclose(fp); - - successful_write = true; - //printf(" wrote cache file %s\n",_file_name.c_str()); - - return; -} - -} // namespace jit diff --git a/GraphBLAS/CUDA/GB_cuda_jitify_cache.h b/GraphBLAS/CUDA/GB_cuda_jitify_cache.h deleted file mode 100644 index 36124da469..0000000000 --- a/GraphBLAS/CUDA/GB_cuda_jitify_cache.h +++ /dev/null @@ -1,327 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_jitify_cache.h -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -/* - * Copyright (c) 2019,2020 NVIDIA CORPORATION. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef GB_JIT_CACHE_H_ -#define GB_JIT_CACHE_H_ - -#include -#include -#include -#include -#include -#include -#include - - -#define JITIFY_USE_CACHE 1 - -namespace jit { - -std::string get_user_home_cache_dir(); - -template -using named_prog = std::pair>; - -// Basic file descriptor to enable file manipulation with caching -class File_Desc -{ -public: - virtual void open( const char *path_and_file, const char *mode) {} - virtual void close() {} - virtual void macrofy() { - - printf("Uh oh. this isn't good\n"); - - } - std::string filename; -}; - -/** - * @brief Get the string path to the JITIFY kernel cache directory. - * - * This path can be overridden at runtime by defining an environment variable - * named `GB_CUDA_KERNEL_CACHE_PATH`. The value of this variable must be a path - * under which the process' user has read/write priveleges. - * - * This function returns a path to the cache directory, creating it if it - * doesn't exist. - * - * The default cache directory `~/.GraphBLAS_kernel_cache`. - **/ - -class GBJitCache -{ -public: - - /**---------------------------------------------------------------------------* - * @brief Get a process wide singleton cache object - * - *---------------------------------------------------------------------------**/ - static GBJitCache& Instance() { - // Meyers' singleton is thread safe in C++11 - // Link: https://stackoverflow.com/a/1661564 - static GBJitCache cache; - return cache; - } - - GBJitCache(); - ~GBJitCache(); - - /**---------------------------------------------------------------------------* - * @brief Get the file object - * - * Searches an internal in-memory cache and file based cache for the file - * and if not found, opens the file, calls macrofy, closes the file - * - * @param file_desc [in] object representing file: open, macrofy, close - * @return string name of file, or 'error' if not able to create file - *---------------------------------------------------------------------------**/ - std::string getFile( File_Desc & file_obj ); - - /**---------------------------------------------------------------------------* - * @brief Get the Kernel Instantiation object - * - * Searches an internal in-memory cache and file based cache for the kernel - * and if not found, JIT compiles and returns the kernel - * - * @param kern_name [in] name of kernel to return - * @param program [in] Jitify preprocessed program to get the kernel from - * @param arguments [in] template arguments for kernel in vector of strings - * @return Pair of string kernel identifier and compiled kernel object - *---------------------------------------------------------------------------**/ - named_prog getKernelInstantiation( - std::string const& kern_name, - named_prog const& program, - std::vector const& arguments); - - /**---------------------------------------------------------------------------* - * @brief Get the Jitify preprocessed Program object - * - * Searches an internal in-memory cache and file based cache for the Jitify - * pre-processed program and if not found, JIT processes and returns it - * - * @param prog_file_name [in] name of program to return - * @param cuda_source [in] string source code of program to compile - * @param given_headers [in] vector of strings representing source or names of - * each header included in cuda_source - * @param given_options [in] vector of strings options to pass to NVRTC - * @param file_callback [in] pointer to callback function to call whenever a - * header needs to be loaded - * @return named_prog - *---------------------------------------------------------------------------**/ - named_prog getProgram( - std::string const& prog_file_name, - std::string const& cuda_source = "", - std::vector const& given_headers = {}, - std::vector const& given_options = {}, - jitify::experimental::file_callback_type file_callback = nullptr); - -private: - template - using umap_str_shptr = std::unordered_map>; - - umap_str_shptr file_map; - umap_str_shptr kernel_inst_map; - umap_str_shptr program_map; - - /* - Even though this class can be used as a non-singleton, the file cache - access should remain limited to one thread per process. The lockf locks can - prevent multiple processes from accessing the file but are ineffective in - preventing multiple threads from doing so as the lock is shared by the - entire process. - Therefore the mutexes are static. - */ - static std::mutex _file_cache_mutex; - static std::mutex _kernel_cache_mutex; - static std::mutex _program_cache_mutex; - -private: - /**---------------------------------------------------------------------------* - * @brief Class to allow process wise exclusive access to cache files - * - *---------------------------------------------------------------------------**/ - class cacheFile - { - private: - std::string _file_name ; - // FIXME this isn't used, is it? - std::string _dir_name = "~/.GraphBLAS_kernel_cache/"; // FIXME - bool successful_read = false; - bool successful_write = false; - public: - cacheFile(std::string file_name); - ~cacheFile(); - - /**---------------------------------------------------------------------------* - * @brief Read this file and return the contents as a std::string - * - *---------------------------------------------------------------------------**/ - std::string read_file(); - - /**---------------------------------------------------------------------------* - * @brief Write the passed string to this file - * - *---------------------------------------------------------------------------**/ - void write(std::string); - - /**---------------------------------------------------------------------------* - * @brief Check whether the read() operation on the file completed successfully - * - * @return true Read was successful. String returned by `read()` is valid - * @return false Read was unsuccessful. String returned by `read()` is empty - *---------------------------------------------------------------------------**/ - bool is_read_successful() { return successful_read; } - - /**---------------------------------------------------------------------------* - * @brief Check whether the write() operation on the file completed successfully - * - * @return true Write was successful. - * @return false Write was unsuccessful. File state is undefined - *---------------------------------------------------------------------------**/ - bool is_write_successful() { return successful_write; } - }; - -private: - - template - named_prog getCachedFile( - FileDescType &file_object, - umap_str_shptr& map ) - { - -// printf("INside get cached file\n"); - std::string name = file_object.filename; - - // Find memory cached T object - auto it = map.find(name); - if ( it != map.end()) { -// std::cout<<"found memory-cached file "<second); - } - else { // Find file cached T object - bool successful_read = false; - std::string serialized; - std::string cache_dir = get_user_home_cache_dir(); - std::string file_name = cache_dir + "/" + name; - if (not cache_dir.empty() ) { - // TODO: Use OS-agnostic path separator here -// std::cout<<"looking for prog in file "<(serialized); - //std::cout<<"storing file in memory "< - named_prog getCached( - std::string const& name, - umap_str_shptr& map, - FallbackFunc func) { - - // Find memory cached T object - auto it = map.find(name); - if ( it != map.end()) { -// std::cout<<"found memory-cached prog "<second); - } - else { // Find file cached T object - bool successful_read = false; - std::string serialized; - #if defined(JITIFY_USE_CACHE) - std::string cache_dir = get_user_home_cache_dir() ; - if (not cache_dir.empty() ) { - // TODO: Use OS-agnostic path separator - std::string file_name = cache_dir + "/" + name; - //std::cout<<"looking for prog in file "<(T::deserialize(serialized)); - map[name] = program; - //std::cout<<"storing prog in memory "< - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "GB_cuda_jitify_launcher.h" -#include - -namespace jit { - - launcher::launcher( - const std::string& hash, - const std::string& cuda_source, - const std::vector& header_names, - const std::vector& compiler_flags, - jitify::experimental::file_callback_type file_callback, - cudaStream_t stream - ) - : cache_instance{jit::GBJitCache::Instance()} - , stream(stream) - { - program = cache_instance.getProgram( - hash, - cuda_source.c_str(), - header_names, - compiler_flags, - file_callback - ); - } - - launcher::launcher(launcher&& launcher) - : program {std::move(launcher.program)} - , cache_instance {jit::GBJitCache::Instance()} - , kernel_inst {std::move(launcher.kernel_inst)} - , stream {launcher.stream} - { } - -} // namespace jit diff --git a/GraphBLAS/CUDA/GB_cuda_jitify_launcher.h b/GraphBLAS/CUDA/GB_cuda_jitify_launcher.h deleted file mode 100644 index 088a2bd77a..0000000000 --- a/GraphBLAS/CUDA/GB_cuda_jitify_launcher.h +++ /dev/null @@ -1,152 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_jitify_launcher.h -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -/* - * Copyright (c) 2019,2023 NVIDIA CORPORATION. - * - * Copyright 2018-2019 BlazingDB, Inc. - * Copyright 2018 Christian Noboa Mardini - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//------------------------------------------------------------------------------ - -// FIXME: rename .hpp? - -#ifndef GB_CUDA_JITIFY_LAUNCHER_H -#define GB_CUDA_JITIFY_LAUNCHER_H - -#include "GB_cuda_jitify_cache.h" - -#include -#include -#include -#include - -#undef JITIFY_PRINT_INSTANTIATION -#define JITIFY_PRINT_INSTANTIATION 0 -#undef JITIFY_PRINT_SOURCE -#define JITIFY_PRINT_SOURCE 1 -#undef JITIFY_PRINT_LOG -#define JITIFY_PRINT_LOG 1 -#undef JITIFY_PRINT_PTX -#define JITIFY_PRINT_PTX 1 -#undef JITIFY_PRINT_LINKER_LOG -#define JITIFY_PRINT_LINKER_LOG 0 -#undef JITIFY_PRINT_LAUNCH -#define JITIFY_PRINT_LAUNCH 1 -#include "jitify.hpp" - - -namespace jit { - -/** - * @brief Class used to handle compilation and execution of JIT kernels - * - */ -class launcher { - public: - launcher() = delete; - - /** - * @brief C'tor of the launcher class - * - * Method to generate vector containing all template types for a JIT kernel. - * This vector is used to get the compiled kernel for one set of types and set - * it as the kernel to launch using this launcher. - * - * @param hash The hash to be used as the key for caching - * @param cuda_code The CUDA code that contains the kernel to be launched - * @param header_names Strings of header_names or strings that contain content - * of the header files - * @param compiler_flags Strings of compiler flags - * @param file_callback a function that returns header file contents given header - * file names. - * @param stream The non-owned stream to use for execution - */ - launcher( - const std::string& hash, - const std::string& cuda_source, - const std::vector& header_names, - const std::vector& compiler_flags, - jitify::experimental::file_callback_type file_callback, - cudaStream_t stream = 0 - ); - launcher(launcher&&); - launcher(const launcher&) = delete; - launcher& operator=(launcher&&) = delete; - launcher& operator=(const launcher&) = delete; - - /** - * @brief Sets the kernel to launch using this launcher - * - * Method to generate vector containing all template types for a JIT kernel. - * This vector is used to get the compiled kernel for one set of types and set - * it as the kernel to launch using this launcher. - * - * @param kernel_name The kernel to be launched - * @param arguments The template arguments to be used to instantiate the kernel - * @return launcher& ref to this launcehr object - */ - launcher& set_kernel_inst( - const std::string& kernel_name, - const std::vector& arguments - ) - { // program is a member variable of the launcher - kernel_inst = cache_instance.getKernelInstantiation(kernel_name, program, arguments); - return *this; - } - - /** - * @brief Handle the Jitify API to launch using information - * contained in the members of `this` - * - * @tparam grid and block sizes - * @return Return launcher reference if successful - */ - jitify::experimental::KernelLauncher configure( dim3 grid, dim3 block, unsigned int smem = 0, cudaStream_t stream = 0){ - return get_kernel().configure( grid, block, smem, stream); - //return get_kernel().configure_1d_max_occupancy( max_block_size=block.x); - } - - - /** - * @brief Handle the Jitify API to launch using information - * contained in the members of `this` - * - * @tparam All parameters to launch the kernel - * @return Return GDF_SUCCESS if successful - */ - template - void launch(Args ... args) { - get_kernel().configure_1d_max_occupancy(32, 0, 0, stream).launch(args...); - } - - private: - jit::GBJitCache& cache_instance; - jit::named_prog program; - jit::named_prog kernel_inst; - cudaStream_t stream; - - jitify::experimental::KernelInstantiation& get_kernel() { return *std::get<1>(kernel_inst); } -}; - -} // namespace jit - -#endif diff --git a/GraphBLAS/CUDA/GB_cuda_matrix_prefetch.cpp b/GraphBLAS/CUDA/GB_cuda_matrix_prefetch.cpp index c71dc0cd6c..d3e5710c33 100644 --- a/GraphBLAS/CUDA/GB_cuda_matrix_prefetch.cpp +++ b/GraphBLAS/CUDA/GB_cuda_matrix_prefetch.cpp @@ -2,12 +2,13 @@ // GraphBLAS/CUDA/GB_cuda_matrix_prefetch: prefetch a matrix to a GPU or the CPU //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ -#include "GB_cuda.h" +#include "GB_cuda.hpp" #define GB_FREE_ALL ; GrB_Info GB_cuda_matrix_prefetch @@ -25,33 +26,39 @@ GrB_Info GB_cuda_matrix_prefetch if (A->p != NULL && (which & GB_PREFETCH_P)) { - CU_OK (cudaMemPrefetchAsync (A->p, (anvec+1) * sizeof (int64_t), device, stream)) ; + CUDA_OK (cudaMemPrefetchAsync (A->p, (anvec+1) * sizeof (int64_t), + device, stream)) ; } if (A->h != NULL && (which & GB_PREFETCH_H)) { - CU_OK (cudaMemPrefetchAsync (A->h, anvec * sizeof (int64_t), device, stream)) ; + CUDA_OK (cudaMemPrefetchAsync (A->h, anvec * sizeof (int64_t), + device, stream)) ; } if (A->Y != NULL && (which & GB_PREFETCH_Y)) { // prefetch the hyper_hash: A->Y->p, A->Y->i, and A->Y->x - GB_OK (GB_cuda_matrix_prefetch (A->Y, GB_PREFETCH_PIX, device, stream)) ; + GB_OK (GB_cuda_matrix_prefetch (A->Y, GB_PREFETCH_PIX, + device, stream)) ; } if (A->b != NULL && (which & GB_PREFETCH_B)) { - CU_OK (cudaMemPrefetchAsync (A->b, anz * sizeof (int8_t), device, stream)) ; + CUDA_OK (cudaMemPrefetchAsync (A->b, anz * sizeof (int8_t), + device, stream)) ; } if (A->i != NULL && (which & GB_PREFETCH_I)) { - CU_OK (cudaMemPrefetchAsync (A->i, anz * sizeof (int64_t), device, stream)) ; + CUDA_OK (cudaMemPrefetchAsync (A->i, anz * sizeof (int64_t), + device, stream)) ; } if (A->x != NULL && (which & GB_PREFETCH_X)) { - CU_OK (cudaMemPrefetchAsync (A->x, (A->iso ? 1:anz) * A->type->size, device, stream)) ; + CUDA_OK (cudaMemPrefetchAsync (A->x, (A->iso ? 1:anz) * A->type->size, + device, stream)) ; } return (GrB_SUCCESS) ; diff --git a/GraphBLAS/CUDA/GB_cuda_mxm_dot3_jitFactory.hpp b/GraphBLAS/CUDA/GB_cuda_mxm_dot3_jitFactory.hpp deleted file mode 100644 index 3fce511b40..0000000000 --- a/GraphBLAS/CUDA/GB_cuda_mxm_dot3_jitFactory.hpp +++ /dev/null @@ -1,832 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_mxm_dot3_jitFactory.hpp -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -/* - * Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of NVIDIA CORPORATION 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 ``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 OWNER OR - * CONTRIBUTORS 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. - */ - -#ifndef GB_MXM_DOT3_JITFACTORY_H -#define GB_MXM_DOT3_JITFACTORY_H - -#pragma once - -/** - * This file is responsible for picking all the parameters and what kernel - * variaiton we will use for a given instance - * - data types - * - semiring types - * - binary ops - * - monoids - * - * Kernel factory says "Here's the actual instance I want you to build with the - * given parameters" - */ - - -//AxB_dot3_phase1 kernel launchers -template class phase1launchFactory ; -template class dense_phase1launchFactory ; - -//AxB_dot3_phase3 kernel launchers - -//------------------------------------------------------------------------------ -// dot3: dense_phase1launchFactory -//------------------------------------------------------------------------------ - -// Handles full/bitmap cases, which means we don't need buckets and zombies. -// This is a much simpler kernel as a result, it only does the i,j lookup -// and stores the values in Mi and Ci. - - -template -class dense_phase1launchFactory -{ - // FIXME: this is the full name. Why? See below for partial name. - // Need to be consistent in naming schemes. - std::string kernel_name = "GB_cuda_jit_AxB_dot3_dense_phase1"; - - GB_cuda_mxm_factory &mxm_factory_; - -public: - - int get_number_of_blocks(GrB_Matrix M) { - int number_of_sms = GB_Global_gpu_sm_get (0); - int nblks = ( GB_nnz (M) + chunk_size - 1)/chunk_size; - return GB_IMIN( nblks, chunk_size * number_of_sms); - } - - int get_threads_per_block() { - return threads_per_block; - } - - // This assumes the needed state on the GB_cuda_mxm_factory - // has already been populated - dense_phase1launchFactory(GB_cuda_mxm_factory &mxm_factory): mxm_factory_(mxm_factory){} - - bool jitGridBlockLaunch( GrB_Matrix C, GrB_Matrix M, GrB_Matrix A, GrB_Matrix B, cudaStream_t stream = 0) { - - // Idea is to have each task work on a continguous block of columns of C - // Note: for small tests, mnz is small so ntasks is be governed by - // chunksize, not chunk_size*number_of_sms. For large problems in - // production, chunksize is less important since ntasks will likely be - // bounded by chunk_size*number_of_sms (say 128*80 = 10,240 on a V100, for - // the default chunk_size of 128). - - // Defining dummy instance only so we can introspect type -// // (1) create the mxm code and name - -// // (2) ensure the jitifier has "GB_mxm_[mymxm.sr_code].h" - jit::GBJitCache filecache = jit::GBJitCache::Instance() ; - filecache.getFile (mxm_factory_) ; - - uint64_t sr_code = mxm_factory_.sr_code ; - int mask_ecode = GB_RSHIFT (sr_code, 20, 4) ; - bool mask_no_type = (mask_ecode < 4) ; - auto sr_code_str = std::to_string(sr_code) ; - std::vector template_types = { - (mask_no_type) ? "bool" : M->type->name, sr_code_str }; - - std::stringstream string_to_be_jitted ; - - string_to_be_jitted << kernel_name << std::endl << - R"(#include "GB_cuda_kernel.h")" << std::endl << - R"(#include ")" << mxm_factory_.filename << R"(")" << std::endl << - R"(#include ")" << kernel_name << R"(.cuh")" << std::endl; - - bool result = false; - - dim3 grid(get_number_of_blocks(M)); - dim3 block(get_threads_per_block()); - - std::cout << "HERE I AM 7" << std::endl ; - jit::launcher( kernel_name + "_" + sr_code_str + ".jtfy", - string_to_be_jitted.str(), - header_names, - GB_cuda_jit_compiler_flags ( ), - file_callback /* FIXME: make NULL */) - .set_kernel_inst( kernel_name, template_types) - .configure(grid, block, SMEM, stream) - .launch( C, M); - - result = true; - - return result; - } -}; - -//------------------------------------------------------------------------------ -// dot3: phase1launchFactory -//------------------------------------------------------------------------------ - -// FIXME: We probably want to remove this type template altogether and provide -// a macro/function that can convert from a GrB_Type instance to the name of a -// type that the jitifier will accept. - -template -class phase1launchFactory -{ - std::string kernel_name = "GB_cuda_jit_AxB_dot3_phase1"; - - GB_cuda_mxm_factory &mxm_factory_; - -public: - - int get_number_of_blocks(GrB_Matrix M) { - int number_of_sms = GB_Global_gpu_sm_get (0); - int nblks = ( GB_nnz (M) + chunk_size - 1)/chunk_size; - return GB_IMIN( nblks, chunk_size * number_of_sms); - } - - int get_threads_per_block() { - return threads_per_block; - } - - // This assumes the needed state on the GB_cuda_mxm_factory - // has already been populated - phase1launchFactory(GB_cuda_mxm_factory &mxm_factory): mxm_factory_(mxm_factory){} - - bool jitGridBlockLaunch(int64_t *nanobuckets, int64_t *blockBucket, - GrB_Matrix C, GrB_Matrix M, GrB_Matrix A, GrB_Matrix B, cudaStream_t stream = 0) { - - // Idea is to have each task work on a continguous block of columns of C - // Note: for small tests, mnz is small so ntasks is be governed by - // chunksize, not chunk_size*number_of_sms. For large problems in - // production, chunksize is less important since ntasks will likely be - // bounded by chunk_size*number_of_sms (say 128*80 = 10,240 on a V100, for - // the default chunk_size of 128). - - // Defining dummy instance only so we can introspect type -// // (1) create the mxm code and name - -// // (2) ensure the jitifier has "GB_mxm_[mymxm.sr_code].h" - jit::GBJitCache filecache = jit::GBJitCache::Instance() ; - filecache.getFile (mxm_factory_) ; - - uint64_t sr_code = mxm_factory_.sr_code ; - int mask_ecode = GB_RSHIFT (sr_code, 20, 4) ; - bool mask_no_type = (mask_ecode < 4) ; - auto sr_code_str = std::to_string(sr_code) ; - std::vector template_types = { - (mask_no_type) ? "bool" : M->type->name, sr_code_str }; - - std::stringstream string_to_be_jitted ; - - string_to_be_jitted << kernel_name << std::endl << - R"(#include "GB_cuda_kernel.h")" << std::endl << - R"(#include ")" << mxm_factory_.filename << R"(")" << std::endl << - R"(#include ")" << kernel_name << R"(.cuh")" << std::endl; - - std::cout << "header names:" << std::endl ; -// std::cout << header_names << std::endl ; - for (std::string s : header_names) - { - std::cout << " " << s << std::endl ; - } -// std::cout << "string_to_be_jitted :" << std::endl ; -// std::cout << string_to_be_jitted << std::endl ; - std::cout << "GB_cuda_jit_compiler_flags ( ):" << std::endl ; - for (std::string s : GB_cuda_jit_compiler_flags ( )) - { - std::cout << " " << s << std::endl ; - } - std::cout << "kernel_name + sr_code_str .jtfy:" << std::endl ; - std::cout << kernel_name + "_" + sr_code_str + ".jtfy" << std::endl ; - std::cout << "jit::get_user_home_cache_dir ( ):" << std::endl ; - std::cout << jit::get_user_home_cache_dir ( ) << std::endl ; - - bool result = false; - - dim3 grid(get_number_of_blocks(M)); - dim3 block(get_threads_per_block()); - - std::cout << "HERE I AM 1" << std::endl ; - jit::launcher( kernel_name + "_" + sr_code_str + ".jtfy", - string_to_be_jitted.str(), - header_names, - GB_cuda_jit_compiler_flags ( ), - file_callback) - .set_kernel_inst( kernel_name, template_types) - .configure(grid, block, SMEM, stream) - .launch( nanobuckets, blockBucket, C, M, A, B); - - result = true; - - return result; - } -}; - -//------------------------------------------------------------------------------ -// dot3: phase2launchFactory -//------------------------------------------------------------------------------ - -template -class phase2launchFactory -{ - - std::string base_name = "GB_cuda_jit"; - // FIXME: this is the partial name. Why? See above. - std::string kernel_name = "AxB_phase2"; - -public: - - int get_threads_per_block() { - return threads_per_block; - } - - int get_number_of_blocks(GrB_Matrix M) { - const int64_t mnz = GB_nnz (M) ; - int ntasks = ( mnz +chunk_size -1)/chunk_size; - // Idea is to have each task work on a continguous block of columns of C - ntasks = GB_IMIN( ntasks, chunk_size*GB_Global_gpu_sm_get (0)) ; // ntasks will be grid.x - return (ntasks + threads_per_block - 1) / threads_per_block ; - } - - int get_number_of_phase1_blocks( GrB_Matrix M){ - const int64_t mnz = GB_nnz (M) ; - int number_of_sms = GB_Global_gpu_sm_get (0); - int nblks = ( GB_nnz (M) + chunk_size - 1)/chunk_size; - return GB_IMIN( nblks, chunk_size * number_of_sms); - } - - bool jitGridBlockLaunch(// parameters to AxB_phase2: - int64_t *blockBucket, int64_t *offset, GrB_Matrix M, cudaStream_t stream = 0) { - - bool result = false; - - dim3 grid(get_number_of_blocks(M)); - dim3 block(get_threads_per_block()); - - std::string hashable_name = base_name + "_" + kernel_name; - std::stringstream string_to_be_jitted ; - string_to_be_jitted << hashable_name << std::endl << - R"(#include ")" << hashable_name << R"(.cuh")" << std::endl; - - const int64_t mnz = GB_nnz (M) ; - std::cout << "HERE I AM 2" << std::endl ; - jit::launcher( hashable_name, - string_to_be_jitted.str(), - header_names, - GB_cuda_jit_compiler_flags ( ), - file_callback) - .set_kernel_inst( kernel_name, {}) - .configure(grid, block, SMEM, stream) - // parameters to AxB_phase2: - .launch( blockBucket, offset, get_number_of_phase1_blocks(M)); - - result= true; - - return result; - } - -}; - -//------------------------------------------------------------------------------ -// dot3: phase2endlaunchFactory -//------------------------------------------------------------------------------ - -template< int threads_per_block = 32, int chunk_size = 128> -class phase2endlaunchFactory -{ - - std::string base_name = "GB_cuda_jit"; - std::string kernel_name = "AxB_phase2end"; - -public: - - int get_threads_per_block() { - return threads_per_block; - } - - int get_number_of_blocks(GrB_Matrix M) { - const int64_t mnz = GB_nnz (M) ; - int ntasks = ( mnz +chunk_size -1)/chunk_size; - int number_of_sms = GB_Global_gpu_sm_get (0); - - // Idea is to have each task work on a continguous block of columns of C - return GB_IMIN( ntasks, chunk_size*number_of_sms) ; // ntasks will be grid.x - } - - bool jitGridBlockLaunch(int64_t *nanobuckets, int64_t *blockBucket, - int64_t *bucketp, int64_t *bucket, int64_t *offset, - GrB_Matrix C, GrB_Matrix M, cudaStream_t stream = 0) - { - - bool result = false; - - dim3 grid(get_number_of_blocks(M)); - dim3 block(get_threads_per_block()); - - std::string hashable_name = base_name + "_" + kernel_name; - std::stringstream string_to_be_jitted ; - string_to_be_jitted << hashable_name << std::endl << - R"(#include ")" << hashable_name << R"(.cuh")" << std::endl; - - std::cout << "HERE I AM 3" << std::endl ; - jit::launcher( hashable_name, - string_to_be_jitted.str(), - header_names, - GB_cuda_jit_compiler_flags ( ), - file_callback) - .set_kernel_inst( kernel_name , {}) - .configure(grid, block, SMEM, stream) - .launch( nanobuckets, blockBucket, bucketp, bucket, offset, C, GB_nnz (M)); - - result= true; - - return result; - } - -}; - - -//------------------------------------------------------------------------------ -// dot3: mxm_dense_launchFactory -//------------------------------------------------------------------------------ - -class mxm_dense_launchFactory -{ - std::string base_name = "GB_cuda_jit"; - std::string kernel_name = "AxB_dot3_phase3_dndn"; - - GB_cuda_mxm_factory &mxm_factory_; - -public: - - /** - * This assumes the needed state on the GB_cuda_mxm_factory has already been populated. - * The `bucket_code` determines which kernel is launched - */ - mxm_dense_launchFactory(GB_cuda_mxm_factory &mymxmfactory): - mxm_factory_(mymxmfactory) {} - - bool jitGridBlockLaunch( GrB_Matrix C, GrB_Matrix M, GrB_Matrix A, GrB_Matrix B, - cudaStream_t stream = 0) { - - bool result = false; - - //---------------------------------------------------------------------- - // do the numerical work - //---------------------------------------------------------------------- - - const int64_t nz = GB_nnz(M); // number of dots in the mask - const int64_t mnvec = M->nvec ; - - int gridsz, blocksz; - - std::stringstream final_kernel_name_ss; - final_kernel_name_ss << kernel_name; - - /** - * Configure geometry and kernel function name based on sparsity of C and number of vectors in M - */ - configure( nz, mnvec, final_kernel_name_ss, blocksz, gridsz); - - auto sr_code = std::to_string(mxm_factory_.sr_code); // FIXME: make hexadecimal - - GrB_BinaryOp mult = mxm_factory_.semiring->multiply ; - - std::string hashable_name = base_name + "_" + final_kernel_name_ss.str(); - std::stringstream string_to_be_jitted ; - std::vector template_types = - { - C->type->name, A->type->name, B->type->name, - mult->ztype->name, mult->xtype->name, mult->ytype->name, - sr_code - }; - - jit::GBJitCache filecache = jit::GBJitCache::Instance() ; - filecache.getFile (mxm_factory_) ; - - string_to_be_jitted << hashable_name << std::endl << - R"(#include "GB_cuda_kernel.h")" << std::endl << - R"(#include ")" << mxm_factory_.filename << R"(")" << std::endl << - R"(#include ")" << hashable_name << R"(.cuh")" << std::endl; - - dim3 grid(gridsz); - dim3 block(blocksz); - - GBURBLE ("(GPU dot3 mxm dense launch nblocks,blocksize= %d,%d )\n", gridsz,blocksz) ; - std::cout << "HERE I AM 4" << std::endl ; - jit::launcher( hashable_name + "_" + sr_code, - string_to_be_jitted.str(), - header_names, - GB_cuda_jit_compiler_flags ( ), - file_callback) - .set_kernel_inst(final_kernel_name_ss.str(), template_types ) - // { C->type->name, - // A->type->name, - // B->type->name }) - .configure(grid, block, SMEM, stream) //if commented, use implicit 1D configure in launch - .launch( - C, // final output matrix - // inputs, not modified: - M, // Mi used for column index - A, // A matrix - B // B matrix - ); - - result= true; - - return result; - } - -private: - void configure(std::int64_t Cnz, std::int64_t mnvec, std::stringstream &opname, - int &blocksz, int &gridsz) { - int number_of_sms = GB_Global_gpu_sm_get (0) ; - - int work_per_thread; - - blocksz = 64; - work_per_thread = 8; - - if( Cnz > 1024){ - blocksz = 512; - work_per_thread = 64; - } - - // gridsz = ceiling (Cnz / work_per_thread*blocksz) - gridsz = GB_ICEIL (Cnz, work_per_thread*blocksz) ; - - } -}; - -//------------------------------------------------------------------------------ -// FIXME: rename GB_cuda_mxm_dot3_jitFactory_sparse_dense_launchFactory -//------------------------------------------------------------------------------ - -class mxm_sparse_dense_launchFactory -{ - std::string base_name = "GB_cuda_jit"; - std::string kernel_name = "AxB_dot3"; - - GB_cuda_mxm_factory &mxm_factory_; - -public: - - /** - * This assumes the needed state on the GB_cuda_mxm_factory has already been populated. - * The `bucket_code` determines which kernel is launched - */ - mxm_sparse_dense_launchFactory(GB_cuda_mxm_factory &mymxmfactory): - mxm_factory_(mymxmfactory) {} - - bool jitGridBlockLaunch( GrB_Matrix C, GrB_Matrix M, GrB_Matrix A, GrB_Matrix B, - cudaStream_t stream = 0) { - - bool result = false; - - //---------------------------------------------------------------------- - // do the numerical work - //---------------------------------------------------------------------- - - const int64_t nz = GB_nnz(M); // number of dots in the mask - const int64_t mnvec = M->nvec ; - - int gridsz, blocksz; - - std::stringstream final_kernel_name_ss; - final_kernel_name_ss << kernel_name; - - /** - * Configure geometry and kernel function name based on sparsity of C and number of vectors in M - */ - configure( nz, mnvec, final_kernel_name_ss, blocksz, gridsz); - - auto sr_code = std::to_string(mxm_factory_.sr_code); - - GrB_BinaryOp mult = mxm_factory_.semiring->multiply ; - - std::string hashable_name = base_name + "_" + final_kernel_name_ss.str(); - std::stringstream string_to_be_jitted ; - std::vector template_types = - { - C->type->name, A->type->name, B->type->name, - mult->ztype->name, mult->xtype->name, mult->ytype->name, - sr_code - }; - - jit::GBJitCache filecache = jit::GBJitCache::Instance() ; - filecache.getFile (mxm_factory_) ; - - string_to_be_jitted << hashable_name << std::endl << - R"(#include "GB_cuda_kernel.h")" << std::endl << - R"(#include ")" << mxm_factory_.filename << R"(")" << std::endl << - R"(#include ")" << hashable_name << R"(.cuh")" << std::endl; - - dim3 grid(gridsz); - dim3 block(blocksz); - - GBURBLE ("(GPU dot3 mxm sparse_dense launch nblocks,blocksize= %d,%d )\n", gridsz,blocksz) ; - std::cout << "HERE I AM 5" << std::endl ; - jit::launcher( hashable_name + "_" + sr_code, - string_to_be_jitted.str(), - header_names, - GB_cuda_jit_compiler_flags ( ), - file_callback) - .set_kernel_inst(final_kernel_name_ss.str(), template_types ) - // { C->type->name, - // A->type->name, - // B->type->name }) - .configure(grid, block, SMEM, stream) //if commented, use implicit 1D configure in launch - .launch( - C, // final output matrix - // inputs, not modified: - M, // Mi used for column index - A, // A matrix - B // B matrix - ); - - result= true; - - return result; - } - -private: - void configure(std::int64_t Cnz, std::int64_t mnvec, std::stringstream &opname, - int &blocksz, int &gridsz) { - int number_of_sms = GB_Global_gpu_sm_get (0) ; - - int work_per_thread; - - blocksz = 64; - work_per_thread = 8; - - if( Cnz > 1024){ - blocksz = 512; - work_per_thread = 64; - } - - // gridsz = ceiling (Cnz / work_per_thread*blocksz) - gridsz = GB_ICEIL (Cnz, work_per_thread*blocksz) ; - - } -}; - -//------------------------------------------------------------------------------ -// dot3: phase3launchFactory -//------------------------------------------------------------------------------ - -class phase3launchFactory -{ - std::string base_name = "GB_cuda_jit"; - std::string kernel_name = "AxB_dot3"; - - GB_cuda_mxm_factory &mxm_factory_; - - GB_bucket_code bucket_code_; - -public: - - std::string Opname; - - /** - * This assumes the needed state on the GB_cuda_mxm_factory has already been populated. - * The `bucket_code` determines which kernel is launched - */ - phase3launchFactory(GB_cuda_mxm_factory &mymxmfactory, GB_bucket_code bucket_code): - mxm_factory_(mymxmfactory), bucket_code_(bucket_code) {} - - bool jitGridBlockLaunch(int64_t start, int64_t end, int64_t *bucketp, int64_t *bucket, - GrB_Matrix C, GrB_Matrix M, GrB_Matrix A, GrB_Matrix B, - cudaStream_t stream = 0) { - - bool result = false; - - //---------------------------------------------------------------------- - // phase3: do the numerical work - //---------------------------------------------------------------------- - - const int64_t nz = end - start; // number of dots in this bucket - const int64_t mnvec = M->nvec ; - - int gridsz, blocksz, sz = 4; - - std::stringstream final_kernel_name_ss; - final_kernel_name_ss << kernel_name << "_"; - - /** - * Configure geometry and kernel function name based on sparsity of C and number of vectors in M - */ - auto sr_code = std::to_string(mxm_factory_.sr_code); - - configure2( nz, mnvec, final_kernel_name_ss, blocksz, gridsz, sz, mxm_factory_.sr_code); - - - GrB_BinaryOp mult = mxm_factory_.semiring->multiply ; - - std::string hashable_name = base_name + "_" + final_kernel_name_ss.str(); - std::stringstream string_to_be_jitted ; - std::vector template_types = - { - C->type->name, A->type->name, B->type->name, - mult->ztype->name, mult->xtype->name, mult->ytype->name, - sr_code - }; - - jit::GBJitCache filecache = jit::GBJitCache::Instance() ; - filecache.getFile (mxm_factory_) ; - - // FIXME: why is "hashable_name" used sometimes, and sometimes "kernel_name"? - string_to_be_jitted << hashable_name << std::endl << - R"(#include "GB_cuda_kernel.h")" << std::endl << - R"(#include ")" << mxm_factory_.filename << R"(")" << std::endl << - R"(#include ")" << hashable_name << R"(.cuh")" << std::endl; - - dim3 grid(gridsz); - dim3 block(blocksz); - - GBURBLE ("(GPU phase3 launch %s st,end=%ld,%ld nblocks,blocksize= %d,%d )\n", this->Opname.c_str(), - start,end,gridsz,blocksz) ; - std::cout << "HERE I AM 6" << std::endl ; - jit::launcher( hashable_name + "_" + sr_code, - string_to_be_jitted.str(), - header_names, - GB_cuda_jit_compiler_flags ( ), - file_callback) - .set_kernel_inst(final_kernel_name_ss.str(), template_types ) - // { C->type->name, - // A->type->name, - // B->type->name }) - .configure(grid, block, SMEM, stream) //if commented, use implicit 1D configure in launch - .launch( - start, // input/output: - end, // global bucket cumsum, of size NBUCKETS+1 - bucket, // global buckets, of size cnz (== mnz) - C, // final output matrix - // inputs, not modified: - M, // Mi used for column index - A, // A matrix - B, // B matrix - sz // only used for sparse-sparse cases - ); - - result= true; - - return result; - } - -private: - void configure2(std::int64_t Cnz, std::int64_t mnvec, std::stringstream &opname, - int &blocksz, int &gridsz, int &sz, uint64_t sr_code) { - int number_of_sms = GB_Global_gpu_sm_get (0) ; - - int work_per_thread; - - // 0:hyper, 1:sparse, 2:bitmap, 3:full - int asparsity = GB_RSHIFT (sr_code, 2, 2) ; - int bsparsity = GB_RSHIFT (sr_code, 0, 2) ; - - if (asparsity <= 1 && bsparsity <= 1) - { - // both A and B are sparse/hyper - switch (bucket_code_) - { - - //-------------------------------------------------------------- - // not a bucket ... bring out your dead: - //-------------------------------------------------------------- - - case GB_BUCKET_ZOMBIE : // C(i,j) is a zombie (not a bucket) - break ; - - //-------------------------------------------------------------- - // CUDA kernel: vsvs bucket: - //-------------------------------------------------------------- - - case GB_BUCKET_VSVS : - Opname = "phase3_vsvs" ; - blocksz = 256; - work_per_thread = 4; - - if( Cnz > (2<<12)){ - blocksz = 512; - work_per_thread = 4; - } - - // gridsz = ceiling (Cnz / work_per_thread*blocksz) - gridsz = GB_ICEIL (Cnz, work_per_thread*blocksz) ; - if (gridsz > 256*number_of_sms) gridsz = 256*number_of_sms; - break ; - - //-------------------------------------------------------------- - // CUDA kernel: mp, use the merge-path method: - //-------------------------------------------------------------- - - case GB_BUCKET_MERGEPATH : - Opname = "phase3_mp" ; - blocksz = 32; - work_per_thread = 256 ; - - if( Cnz > (2<<20)){ - work_per_thread = 1024; - } - gridsz = GB_ICEIL (Cnz, work_per_thread) ; - if ((gridsz < number_of_sms) && (Cnz > (2<<20))) - { - gridsz = number_of_sms; - } - if (gridsz > 256*number_of_sms) gridsz = 256*number_of_sms; - break ; - - default: - break ; - } - - } - else - { - // either A or B are bitmap/full - switch (bucket_code_) - { - - //-------------------------------------------------------------- - // not a bucket ... bring out your dead: - //-------------------------------------------------------------- - - case GB_BUCKET_ZOMBIE : // C(i,j) is a zombie (not a bucket) - break ; - - //-------------------------------------------------------------- - // CUDA kernel: vsdn bucket: one thread per C(i,j) dot product - //-------------------------------------------------------------- - - case GB_BUCKET_VSDN : - Opname = "phase3_vsdn" ; - - // FIXME: - blocksz = 256; - work_per_thread = 4; - - if( Cnz > (2<<12)){ - blocksz = 512; - work_per_thread = 4; - } - - // gridsz = ceiling (Cnz / work_per_thread*blocksz) - gridsz = GB_ICEIL (Cnz, work_per_thread*blocksz) ; - if (gridsz > 256*number_of_sms) gridsz = 256*number_of_sms; - break ; - - //-------------------------------------------------------------- - // CUDA kernel: spdn bucket: one warp per C(i,j) dot product - //-------------------------------------------------------------- - - case GB_BUCKET_SPDN : - Opname = "phase3_spdn" ; - - // FIXME: - blocksz = 32; - work_per_thread = 256 ; - - if( Cnz > (2<<20)){ - work_per_thread = 1024; - } - gridsz = GB_ICEIL (Cnz, work_per_thread) ; - if ((gridsz < number_of_sms) && (Cnz > (2<<20))) - { - gridsz = number_of_sms; - } - if (gridsz > 256*number_of_sms) gridsz = 256*number_of_sms; - break ; - - default: - break ; - } - - } - - opname << Opname; - } -}; - -#endif diff --git a/GraphBLAS/CUDA/GB_cuda_mxm_factory.hpp b/GraphBLAS/CUDA/GB_cuda_mxm_factory.hpp deleted file mode 100644 index 227b776f65..0000000000 --- a/GraphBLAS/CUDA/GB_cuda_mxm_factory.hpp +++ /dev/null @@ -1,167 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_mxm_factory.hpp -//------------------------------------------------------------------------------ - -// (c) Nvidia Corp. 2023 All rights reserved -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -// Class to manage both stringify functions from mxm, ops and monoids to a -// header file. - -// Implementations of string callbacks -#pragma once - -// FIXME do we need the iostrean any more? -#include -#include -#include "GB_cuda_jitify_cache.h" - -extern "C" -{ - #include "GB.h" - #include "GB_binop.h" - #include "GB_stringify.h" -} - -// FIXME: do we need the file_callback method? -// Define function pointer we will use later -//std::istream* (*file_callback)(std::string, std::iostream&); - -//------------------------------------------------------------------------------ -// GB_cuda_mxm_factory -//------------------------------------------------------------------------------ - -// Define a factory class for building any mxm text definitions - -class GB_cuda_mxm_factory: public jit::File_Desc -{ - - //-------------------------------------------------------------------------- - // public members of the object - //-------------------------------------------------------------------------- - - public: - - uint64_t sr_code ; // unique 62-bit code for a GrB_mxm problem - GrB_Semiring semiring ; // the semiring for GrB_mxm - GrB_Type ctype, atype, btype ; // the types of C, A, and B - FILE *fp ; // file for GB_mxm_*.h header - - //-------------------------------------------------------------------------- - // open/close: access the GB_mxm_*.h header file for a specific instance - //-------------------------------------------------------------------------- - - void open (const char *path_and_file, const char *mode) - { - fp = fopen (path_and_file, mode) ; - } - - void close( ) - { - fclose (fp) ; - } - - //-------------------------------------------------------------------------- - // mxm_factory: create unique code for a GrB_mxm problem - //-------------------------------------------------------------------------- - - // mxm_factory takes a set of inputs describing and operation (semiring, - // mask, datatypes, sparsity formats, etc) and produces a numerical unique - // value for those. This allows rapid lookups to see if we have handled this - // case before, and avoids the need to generate and manage strings at this - // stage. - - // FIXME: pass in user's C_in matrix, in case C_in+=A*B can be done - // in-place - // FIXME: handle hypersparse case in dot3 - - void mxm_factory - ( - // C matrix: - bool C_iso, // true if C is iso-valued - bool C_in_iso, // C input iso status - int C_sparsity, // sparsity structure of C - GrB_Type ctype, // the type of C - // M matrix: - GrB_Matrix M, // may be NULL - bool Mask_struct, // mask is structural - bool Mask_comp, // mask is complemented - // semiring: - GrB_Semiring semiring, // the semiring to enumify - bool flipxy, // multiplier is: mult(a,b) or mult(b,a) - // A and B: - GrB_Matrix A, - GrB_Matrix B - ) - { - - if (C_iso) - { - // the kernel does not access any values of C, A, or B - semiring = GxB_ANY_PAIR_BOOL ; - flipxy = false ; - } - - uint64_t scode ; - - GB_enumify_mxm ( - // output: - &scode, // unique encoding of the entire semiring - // input: - C_iso, // true if C is iso-valued - C_in_iso, - C_sparsity, // sparsity structure of C - ctype, // the type of C - // M matrix: - M, - Mask_struct, // mask is structural - Mask_comp, // mask is complemented - // semiring: - semiring, // the semiring to enumify - flipxy, // multiplier is: mult(a,b) or mult(b,a) - // A and B: - A, - B - ) ; - - this->sr_code = scode; - this->semiring = semiring ; - this->atype = A->type ; - this->btype = B->type ; - this->ctype = ctype ; - - std::stringstream ss; - // FIXME: use same name scheme as the CPU jit - ss << "GB_mxm_" << this->sr_code << ".h"; - - std::string new_filename = ss.str(); - filename.resize(new_filename.size()); - strcpy(filename.data(), new_filename.data()); - - } - - //-------------------------------------------------------------------------- - // macrofy: create macros from sr_code and data types - //-------------------------------------------------------------------------- - - // macrofy takes a code and creates the corresponding string macros for - // operators, datatypes, sparsity formats and writes its results to a file. - - void macrofy ( ) override - { - GB_macrofy_mxm ( - // output to file : - fp, - // input: - this->sr_code, - this->semiring, - this->ctype, - this->atype, - this->btype - ) ; - } - -} ; // GB_cuda_mxm_factory - diff --git a/GraphBLAS/CUDA/GB_cuda_reduce.hpp b/GraphBLAS/CUDA/GB_cuda_reduce.hpp new file mode 100644 index 0000000000..3dfe07372f --- /dev/null +++ b/GraphBLAS/CUDA/GB_cuda_reduce.hpp @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// GB_cuda_reduce.hpp: CPU definitions for CUDA reductions +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +#ifndef GB_CUDA_REDUCE_H +#define GB_CUDA_REDUCE_H + +#include "GB_cuda.hpp" + +GrB_Info GB_cuda_reduce_to_scalar_jit // z = reduce_to_scalar (A) via CUDA JIT +( + // output: + GB_void *z, // result if has_cheeseburger is true + GrB_Matrix V, // result if has_cheeseburger is false + // input: + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + // CUDA stream and launch parameters: + cudaStream_t stream, + int32_t gridsz, + int32_t blocksz +) ; + +#endif + diff --git a/GraphBLAS/CUDA/GB_cuda_reduce_factory.hpp b/GraphBLAS/CUDA/GB_cuda_reduce_factory.hpp deleted file mode 100644 index e0f7aae75b..0000000000 --- a/GraphBLAS/CUDA/GB_cuda_reduce_factory.hpp +++ /dev/null @@ -1,105 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_reduce_factory.hpp -//------------------------------------------------------------------------------ - -// (c) Nvidia Corp. 2023 All rights reserved -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -// Class to manage both stringify functions from mxm, ops and monoids to a -// header file. - -// FIXME: does it? -// Also provides a iostream callback to deliver the buffer to jitify as -// if read from a file - -// Implementations of string callbacks -#pragma once - -// FIXME: do we use iostream? -#include -#include -#include "GB_cuda_jitify_cache.h" - -extern "C" -{ - #include "GB.h" - #include "GB_stringify.h" -} - -//------------------------------------------------------------------------------ -// GB_cuda_reduce_factory: construct code and header file for reduce jit kernel -//------------------------------------------------------------------------------ - -class GB_cuda_reduce_factory: public jit::File_Desc { - -public: - - uint64_t rcode ; // unique encoding from GB_enumify_reduce - GrB_Monoid monoid ; // monoid to perform the reduction - GrB_Type atype ; // input matrix data type - FILE *fp ; // file pointer for GB_reduce_*.h header file - - //-------------------------------------------------------------------------- - // open/close: access the GB_reduce_*.h header file for a specific instance - //-------------------------------------------------------------------------- - - void open (const char *path_and_file, const char *mode) - { - fp = fopen (path_and_file, mode) ; - } - - void close( ) - { - fclose (fp) ; - } - - //-------------------------------------------------------------------------- - // reduce_factory: encode the reduction problem into a scalar rcode - //-------------------------------------------------------------------------- - - void reduce_factory (GrB_Monoid monoid, GrB_Matrix A) - { - uint64_t rcode ; - - GB_enumify_reduce - ( - // output: - &rcode, // unique encoding of entire monoid - // input: - monoid, // monoid to use for the reduction - A // matrix to reduce - ) ; - - this->rcode = rcode ; - this->monoid = monoid ; - this->atype = A->type ; - - // FIXME: use same name scheme as the CPU jit - std::stringstream ss ; - ss << "GB_reduce_" << this->rcode << ".h"; - - std::string new_filename = ss.str() ; - filename.resize(new_filename.size()) ; - strcpy(filename.data(), new_filename.data()) ; - } - - //-------------------------------------------------------------------------- - // macrofy: construct a header file from the rcode and data types - //-------------------------------------------------------------------------- - - void macrofy ( ) override - { - GB_macrofy_reduce ( - // output to file : - fp, - // input: - this->rcode, - this->monoid, - this->atype - ) ; - } - -} ; // GB_cuda_reduce_factory - diff --git a/GraphBLAS/CUDA/GB_cuda_reduce_jitFactory.hpp b/GraphBLAS/CUDA/GB_cuda_reduce_jitFactory.hpp deleted file mode 100644 index fd618bddf0..0000000000 --- a/GraphBLAS/CUDA/GB_cuda_reduce_jitFactory.hpp +++ /dev/null @@ -1,254 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_reduce_jitFactory.hpp: kernel for reduction to scalar -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -/* - * Copyright (c) 2017-2023, NVIDIA CORPORATION. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of NVIDIA CORPORATION 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 ``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 OWNER OR - * CONTRIBUTORS 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. - */ - -//------------------------------------------------------------------------------ - -// Constructs an instance of the template/GB_jit_reduce.cuh kernel to reduce -// a GrB_Matrix to a scalar. - -#ifndef GB_REDUCE_JITFACTORY_H -#define GB_REDUCE_JITFACTORY_H - -#pragma once -#include "GB_cuda_reduce_factory.hpp" - -/** - * This file is responsible for picking all the parameters and what kernel - * variaiton we will use for a given instance - * - data types - * - semiring types - * - binary ops - * - monoids - * - * Kernel factory says "Here's the actual instance I want you to build with the - * given parameters" - */ - -// Kernel jitifiers -class reduceFactory ; - -//------------------------------------------------------------------------------ -// reduceFactory -//------------------------------------------------------------------------------ - -class reduceFactory -{ - - //-------------------------------------------------------------------------- - // class properties - //-------------------------------------------------------------------------- - - std::string base_name = "GB_cuda_jit"; - std::string kernel_name = "reduce"; - - int threads_per_block = 320 ; - int work_per_thread = 256; -// int number_of_sms = GB_Global_gpu_sm_get (0) ; - - GB_cuda_reduce_factory &reduce_factory_ ; - - public: - - //-------------------------------------------------------------------------- - // class constructor - //-------------------------------------------------------------------------- - - reduceFactory (GB_cuda_reduce_factory &myreducefactory) : - reduce_factory_(myreducefactory) {} - - //-------------------------------------------------------------------------- - // GB_get_threads_per_block: determine # of threads in a threadBlock - //-------------------------------------------------------------------------- - - int GB_get_threads_per_block ( ) - { - return threads_per_block ; - } - - //-------------------------------------------------------------------------- - // GB_get_number_of_blocks: determine # of threadBlocks to use - //-------------------------------------------------------------------------- - - int GB_get_number_of_blocks - ( - int64_t anvals // # of entries in input matrix - ) - { - // FIXME: this is a lot of blocks. Use a smaller number (cap at, say, - // 64K), to simplify the non-atomic reductions - return (anvals + work_per_thread*threads_per_block - 1) / - (work_per_thread*threads_per_block) ; - } - - //-------------------------------------------------------------------------- - // jitGridBlockLaunch: construct and launch the GB_jit_reduce kernel - //-------------------------------------------------------------------------- - - // Note: this does assume the erased types are compatible w/ the monoid's - // ztype (an erased type is the type overwritten by a pun type). - - bool jitGridBlockLaunch // FIXME: return GrB_Info - ( - GrB_Matrix A, // matrix to reduce to a scalar - GB_void *output, // output scalar (static on CPU), of size zsize - GrB_Matrix *V_handle, // result of a partial reduction - GrB_Monoid monoid, // monoid to use for the reducution - cudaStream_t stream = 0 // stream to use, default stream 0 - ) - { - GBURBLE ("\n(launch reduce factory) \n") ; - - GrB_Type ztype = monoid->op->ztype ; - size_t zsize = ztype->size ; - - GB_void *zscalar = NULL ; - (*V_handle) = NULL ; - GrB_Matrix V = NULL ; - - jit::GBJitCache filecache = jit::GBJitCache::Instance() ; - filecache.getFile (reduce_factory_) ; - - auto rcode = std::to_string(reduce_factory_.rcode); - bool has_cheeseburger = GB_RSHIFT (reduce_factory_.rcode, 27, 1) ; - GBURBLE ("has_cheeseburger %d\n", has_cheeseburger) ; - - std::string hashable_name = base_name + "_" + kernel_name; - std::stringstream string_to_be_jitted ; - string_to_be_jitted << hashable_name << std::endl << - R"(#include "GB_cuda_kernel.h")" << std::endl << - R"(#include ")" << reduce_factory_.filename << R"(")" << std::endl << - R"(#include ")" << hashable_name << R"(.cuh")" << std::endl; - - int64_t anvals = GB_nnz_held (A) ; - - // determine kernel launch geometry - int blocksz = GB_get_threads_per_block ( ) ; - int gridsz = GB_get_number_of_blocks (anvals) ; - dim3 grid (gridsz) ; - dim3 block (blocksz) ; - - // determine the kind of reduction: partial (to &V), or complete - // (to the scalar output) - if (has_cheeseburger) - { - // the kernel launch can reduce A to zscalar all by itself - // allocate and initialize zscalar (upscaling it to at least 32 bits) - size_t zscalar_size = GB_IMAX (zsize, sizeof (uint32_t)) ; - (GB_void *) rmm_wrap_malloc (zscalar_size) ; - zscalar = (GB_void *) rmm_wrap_malloc (zscalar_size) ; - if (zscalar == NULL) - { - // out of memory - return (GrB_OUT_OF_MEMORY) ; - } - GB_cuda_upscale_identity (zscalar, monoid) ; - } - else - { - // allocate a full GrB_Matrix V for the partial result, of size - // gridsz-by-1, and of type ztype. V is allocated but not - // initialized. - GrB_Info info = GB_new_bix (&V, ztype, gridsz, 1, GB_Ap_null, - true, GxB_FULL, false, 0, -1, gridsz, true, false) ; - if (info != GrB_SUCCESS) - { - // out of memory - return (info) ; - } - } - - GBURBLE ("(cuda reduce launch %d threads in %d blocks)", - blocksz, gridsz ) ; - - // construct and launch the kernel - // FIXME: use same name scheme as the CPU jit - // FIXME: where does it go if it fails? try/catch? - jit::launcher(hashable_name + "_" + rcode, - string_to_be_jitted.str(), - header_names, - GB_cuda_jit_compiler_flags ( ), - file_callback) // FIXME: where is file_callback defined? - .set_kernel_inst( hashable_name , - { A->type->name, monoid->op->ztype->name }) - .configure(grid, block, SMEM, stream) - .launch (A, zscalar, V, anvals) ; - - // synchronize before copying result to host - CHECK_CUDA (cudaStreamSynchronize (stream)) ; - - // FIXME: sometimes we use CHECK_CUDA, sometimes CU_OK. Need to - // be consistent. Also, if this method fails, zscalar - // must be freed: we can do this in the CU_OK or CHECK_CUDA macros. - // Or in a try/catch? - - if (has_cheeseburger) - { - // return the scalar result - // output = zscalar (but only the first zsize bytes of it) - memcpy (output, zscalar, zsize) ; - rmm_wrap_free (zscalar) ; - } - else - { - // return the partial reduction - (*V_handle) = V ; - } - - return (GrB_SUCCESS) ; - } -} ; - -//------------------------------------------------------------------------------ -// GB_cuda_reduce -//------------------------------------------------------------------------------ - -inline bool GB_cuda_reduce // FIXME: return GrB_Info, not bool -( - GB_cuda_reduce_factory &myreducefactory, // reduction JIT factory - GrB_Matrix A, // matrix to reduce - GB_void *output, // result of size monoid->op->ztype->size - GrB_Matrix *V_handle, // result of a partial reduction - GrB_Monoid monoid, // monoid for the reduction - cudaStream_t stream = 0 // stream to use -) -{ - reduceFactory rf(myreducefactory); - GBURBLE ("(starting cuda reduce)" ) ; - bool result = rf.jitGridBlockLaunch (A, output, V_handle, monoid, stream) ; - GBURBLE ("(ending cuda reduce)" ) ; - return (result) ; -} - -#endif - diff --git a/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar.cpp b/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar.cpp new file mode 100644 index 0000000000..e1da05383c --- /dev/null +++ b/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar.cpp @@ -0,0 +1,153 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/GB_cuda_reduce_to_scalar: reduce on the GPU with semiring +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +// Reduce a matrix A to a scalar s, or to a smaller matrix V if the GPU was +// only able to do a partial reduction. This case occurs if the GPU does not +// cannot do an atomic update for the monoid. To handle this case, the GPU +// returns a full GrB_Matrix V, of size gridsize-by-1, with one entry per +// threadblock. Then GB_reduce_to_scalar on the CPU sees this V as the result, +// and calls itself recursively to continue the reduction. + +#define GB_FREE_ALL \ +{ \ + GB_FREE_WORK (&zscalar, zscalar_size) ; \ + GB_Matrix_free (&V) ; \ + if (stream != nullptr) cudaStreamDestroy (stream) ; \ + stream = nullptr ; \ +} + +#include "GB_cuda_reduce.hpp" + +GrB_Info GB_cuda_reduce_to_scalar +( + // output: + GB_void *s, // note: statically allocated on CPU stack; if + // the result is in s then V is NULL. + GrB_Matrix *V_handle, // partial result if unable to reduce to scalar; + // NULL if result is in s. + // input: + const GrB_Monoid monoid, + const GrB_Matrix A +) +{ + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + GB_void *zscalar = NULL ; + size_t zscalar_size = 0 ; + GrB_Matrix V = NULL ; + (*V_handle) = NULL ; + GrB_Info info = GrB_SUCCESS ; + cudaStream_t stream = nullptr ; + + //-------------------------------------------------------------------------- + // create the stream + //-------------------------------------------------------------------------- + + // FIXME: use the stream pool + CUDA_OK (cudaStreamCreate (&stream)) ; + + //-------------------------------------------------------------------------- + // determine problem characteristics and allocate worksbace + //-------------------------------------------------------------------------- + + int threads_per_block = 320 ; + int work_per_thread = 256; +// int number_of_sms = GB_Global_gpu_sm_get (0) ; + + GrB_Type ztype = monoid->op->ztype ; + size_t zsize = ztype->size ; + + // determine kernel launch geometry + int64_t anvals = GB_nnz_held (A) ; + int blocksz = threads_per_block ; + int gridsz = + // FIXME: this is a lot of blocks. Use a smaller number (cap at, + // say, 64K), to simplify the non-atomic reductions + (anvals + work_per_thread*threads_per_block - 1) / + (work_per_thread*threads_per_block) ; + + // FIXME: GB_enumify_reduce is called twice: here (to get has_cheeseburger) + // and in GB_cuda_reduce_to_scalar_jit. Can we just call it once? One + // solution: The code from here to the call to GB_cuda_reduce_to_scalar_jit + // could be added to the GB_cuda_reduce_to_scalar_jit function itself. + + uint64_t rcode ; + GB_enumify_reduce (&rcode, monoid, A) ; + bool has_cheeseburger = GB_RSHIFT (rcode, 27, 1) ; + GBURBLE ("has_cheeseburger %d\n", has_cheeseburger) ; + + // determine the kind of reduction: partial (to &V), or complete + // (to the scalar output) + if (has_cheeseburger) + { + // the kernel launch can reduce A to zscalar all by itself + // allocate and initialize zscalar (upscaling it to at least 32 bits) + size_t zscalar_space = GB_IMAX (zsize, sizeof (uint32_t)) ; + zscalar = GB_MALLOC (zscalar_space, GB_void, &zscalar_size) ; + if (zscalar == NULL) + { + // out of memory + GB_FREE_ALL ; + return (GrB_OUT_OF_MEMORY) ; + } + GB_cuda_upscale_identity (zscalar, monoid) ; + } + else + { + // allocate a full GrB_Matrix V for the partial result, of size + // gridsz-by-1, and of type ztype. V is allocated but not + // initialized. + GB_OK (GB_new_bix (&V, ztype, gridsz, 1, GB_Ap_null, + true, GxB_FULL, false, 0, -1, gridsz, true, false)) ; + } + + GBURBLE ("(cuda reduce launch %d threads in %d blocks)", + blocksz, gridsz ) ; + + //-------------------------------------------------------------------------- + // reduce C to a scalar via the CUDA JIT + //-------------------------------------------------------------------------- + +// final call looks like this: +// GB_OK (GB_cuda_reduce_to_scalar_jit (zscalar, V, monoid, A, +// stream, gridsz, blocksz)) ; + +// debugging for now, to die early if the CUDA fails to compile, load, or run: + info = (GB_cuda_reduce_to_scalar_jit (zscalar, V, monoid, A, + stream, gridsz, blocksz)) ; + if (info == GrB_NO_VALUE) info = GrB_PANIC ; + GB_OK (info) ; + + //-------------------------------------------------------------------------- + // return result and destroy the stream + //-------------------------------------------------------------------------- + + CUDA_OK (cudaStreamSynchronize (stream)) ; + + if (has_cheeseburger) + { + // return the scalar result + // s = zscalar (but only the first zsize bytes of it) + memcpy (s, zscalar, zsize) ; + GB_FREE_WORK (&zscalar, zscalar_size) ; + } + else + { + // return the partial reduction + (*V_handle) = V ; + } + + CUDA_OK (cudaStreamDestroy (stream)) ; + return (GrB_SUCCESS) ; +} + diff --git a/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_branch.cpp b/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_branch.cpp index f336ce8002..353201b65b 100644 --- a/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_branch.cpp +++ b/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_branch.cpp @@ -2,14 +2,14 @@ // GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_branch: decide to use GPU for reduce //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ // Decide branch direction for GPU use for the reduction to scalar -#include "GB_cuda.h" +#include "GB_cuda_reduce.hpp" bool GB_cuda_reduce_to_scalar_branch // return true to use the GPU ( @@ -22,9 +22,6 @@ bool GB_cuda_reduce_to_scalar_branch // return true to use the GPU !GB_cuda_type_branch (monoid->op->ztype)) { // one or more types are not yet supported on the GPU - // FIXME: remove debug output here: - std::cout << "Not using cuda path: type size not supported" - << std::endl ; return (false) ; } @@ -48,11 +45,11 @@ bool GB_cuda_reduce_to_scalar_branch // return true to use the GPU { // FIXME: gpu_id = GB_Context_gpu_id_get ( ) ; // cudaSetDevice (gpu_id) ; - return true; + return (true) ; } else { - return false; + return (false) ; } } diff --git a/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_jit.cpp b/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_jit.cpp index 0d7c6578b0..cc8603c708 100644 --- a/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_jit.cpp +++ b/GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_jit.cpp @@ -1,62 +1,62 @@ //------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_reduce_to_scalar_jit: reduce on the GPU with semiring +// GB_cuda_reduce_to_scalar_jit: reduce a matrix to a scalar, via the CUDA JIT //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ -// Reduce a matrix A to a scalar s, or to a smaller matrix V if the GPU was -// only able to do a partial reduction. This case occurs if the GPU does not -// cannot do an atomic update for the monoid. To handle this case, the GPU -// returns a full GrB_Matrix V, of size gridsize-by-1, with one entry per -// threadblock. Then GB_reduce_to_scalar on the CPU sees this V as the result, -// and calls itself recursively to continue the reduction. - -#include "GraphBLAS_cuda.h" +#include "GB_cuda_reduce.hpp" extern "C" { - #include "GB_reduce.h" + typedef GB_JIT_CUDA_KERNEL_REDUCE_PROTO ((*GB_jit_dl_function)) ; } -#include "GB_cuda.h" -#include "GB_cuda_jitify_cache.h" -#include "GB_cuda_common_jitFactory.hpp" -#include "GB_cuda_reduce_jitFactory.hpp" - -GrB_Info GB_cuda_reduce_to_scalar_jit +GrB_Info GB_cuda_reduce_to_scalar_jit // z = reduce_to_scalar (A) via CUDA JIT ( // output: - GB_void *s, // note: statically allocated on CPU stack; if - // the result is in s then V is NULL. - GrB_Matrix *V_handle, // partial result if unable to reduce to scalar; - // NULL if result is in s. + GB_void *z, // result if has_cheeseburger is true + GrB_Matrix V, // result if has_cheeseburger is false // input: - const GrB_Monoid monoid, - const GrB_Matrix A + const GrB_Monoid monoid, // monoid to do the reduction + const GrB_Matrix A, // matrix to reduce + // CUDA stream and launch parameters: + cudaStream_t stream, + int32_t gridsz, + int32_t blocksz ) -{ - - // FIXME: use the stream pool - cudaStream_t stream ; - CHECK_CUDA (cudaStreamCreate (&stream)) ; +{ //-------------------------------------------------------------------------- - // reduce C to a scalar + // encodify the problem //-------------------------------------------------------------------------- - // FIXME: check error conditions (out of memory, etc) - GB_cuda_reduce_factory myreducefactory ; - myreducefactory.reduce_factory (monoid, A) ; + GB_jit_encoding encoding ; + char *suffix ; + uint64_t hash = GB_encodify_reduce (&encoding, &suffix, + GB_JIT_CUDA_KERNEL_REDUCE, monoid, A) ; + + // FIXME: could get has_cheesburger here, and allocate zscalar + // and V accordingly. - // FIXME: get GrB_Info result from GB_cuda_reduce - GB_cuda_reduce (myreducefactory, A, s, V_handle, monoid, stream) ; + //-------------------------------------------------------------------------- + // get the kernel function pointer, loading or compiling it if needed + //-------------------------------------------------------------------------- + + void *dl_function ; + GrB_Info info = GB_jitifyer_load (&dl_function, + GB_jit_reduce_family, "cuda_reduce", + hash, &encoding, suffix, NULL, monoid, + NULL, A->type, NULL, NULL) ; + if (info != GrB_SUCCESS) return (info) ; - CHECK_CUDA (cudaStreamSynchronize (stream)) ; - CHECK_CUDA (cudaStreamDestroy (stream)) ; + //-------------------------------------------------------------------------- + // call the jit kernel and return result + //-------------------------------------------------------------------------- - return (GrB_SUCCESS) ; + GB_jit_dl_function GB_jit_kernel = (GB_jit_dl_function) dl_function ; + return (GB_jit_kernel (z, V, A, stream, gridsz, blocksz)) ; } diff --git a/GraphBLAS/CUDA/GB_cuda_type_bits.c b/GraphBLAS/CUDA/GB_cuda_type_bits.c deleted file mode 100644 index 17de151f3f..0000000000 --- a/GraphBLAS/CUDA/GB_cuda_type_bits.c +++ /dev/null @@ -1,35 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GB_cuda_type_bits -//------------------------------------------------------------------------------ - -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -#undef GBCUDA_CPLUSPLUS -#include "GB.h" - -size_t GB_cuda_type_bits (GB_Type_code); - -size_t GB_cuda_type_bits (GB_Type_code type_code) -{ - switch (type_code) - { - case GB_BOOL_code : return (8) ; - case GB_INT8_code : return (8) ; - case GB_INT16_code : return (16) ; - case GB_INT32_code : return (32) ; - case GB_INT64_code : return (64) ; - case GB_UINT8_code : return (8) ; - case GB_UINT16_code : return (16) ; - case GB_UINT32_code : return (32) ; - case GB_UINT64_code : return (64) ; - case GB_FP32_code : return (32) ; - case GB_FP64_code : return (64) ; -// case GB_FC32_code : return (64) ; -// case GB_FC64_code : return (128) ; - default : return (0) ; - } -} - diff --git a/GraphBLAS/CUDA/GB_cuda_type_branch.cpp b/GraphBLAS/CUDA/GB_cuda_type_branch.cpp index ba268b2a33..1debd0eb4b 100644 --- a/GraphBLAS/CUDA/GB_cuda_type_branch.cpp +++ b/GraphBLAS/CUDA/GB_cuda_type_branch.cpp @@ -2,7 +2,7 @@ // GraphBLAS/CUDA/GB_cuda_type_branch: decide if GPU can be used on a type //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ @@ -12,9 +12,11 @@ // bytes or less. If user-defined type has a different size, it cannot be done // on the GPU. +// FIXME: get the CUDA kernels to work on large types + // All built-in types pass this rule. -#include "GB_cuda.h" +#include "GB_cuda.hpp" bool GB_cuda_type_branch // return true if the type is OK on GPU ( diff --git a/GraphBLAS/CUDA/GB_cuda_upscale_identity.cpp b/GraphBLAS/CUDA/GB_cuda_upscale_identity.cpp index d7d5ec8a9e..c034f4b4ad 100644 --- a/GraphBLAS/CUDA/GB_cuda_upscale_identity.cpp +++ b/GraphBLAS/CUDA/GB_cuda_upscale_identity.cpp @@ -2,7 +2,7 @@ // GraphBLAS/CUDA/GB_cuda_upscale_identity: return identity, >= 16 bits in size //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ @@ -11,7 +11,7 @@ // for 2-byte values. This method initializes the identity value of a monoid, // scaling up the 1-byte and 2-byte cases to 4-bytes. -#include "GB_cuda.h" +#include "GB_cuda.hpp" extern "C" { #include "GB_binop.h" diff --git a/GraphBLAS/CUDA/GB_cuda_warmup.cu b/GraphBLAS/CUDA/GB_cuda_warmup.cu index 4b8016e59c..8a7322b9f6 100644 --- a/GraphBLAS/CUDA/GB_cuda_warmup.cu +++ b/GraphBLAS/CUDA/GB_cuda_warmup.cu @@ -2,50 +2,55 @@ // GraphBLAS/CUDA/GB_cuda_warmup.cu: warmup the GPU //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ -#include "GB_cuda.h" +#include "GB_cuda.hpp" bool GB_cuda_warmup (int device) { - // allocate 'nothing' just to load the drivers. - // No need to free the result. - bool ok = GB_cuda_set_device( device ); - if (!ok) + + //-------------------------------------------------------------------------- + // set the device + //-------------------------------------------------------------------------- + + if (!GB_cuda_set_device (device)) { - printf ("invalid GPU: %d\n", device) ; + // invalid device return (false) ; } - double gpu_memory_size = GB_Global_gpu_memorysize_get (device); + // FIXME: why do we need this? + double gpu_memory_size = GB_Global_gpu_memorysize_get (device) ; + + //-------------------------------------------------------------------------- + // allocate two small blocks just to load the drivers + //-------------------------------------------------------------------------- size_t size = 0 ; void *p = GB_malloc_memory (1, 1, &size) ; if (p == NULL) { - printf ("Hey!! where's da memory???\n") ; + // no memory on the device return (false) ; } -// printf ("oooo nice block of memory of size %lu\n", size) ; - GB_free_memory ( &p, size) ; -// printf ("be free, block of memory of size %lu\n", size) ; + GB_free_memory (&p, size) ; -// printf ("good ol' cudaMalloc just to be sure\n"); - cudaMalloc ( &p, size ) ; + cudaMalloc (&p, size ) ; if (p == NULL) { - printf ("Hey!! where's da GPU???\n") ; + // no memory on the device return (false) ; } cudaFree (p) ; -// printf ("GPU %d nice and toasty now\n", device) ; - - // TODO check for jit cache? or in GB_init? + //-------------------------------------------------------------------------- + // return result + //-------------------------------------------------------------------------- - return true; //(err == cudaSuccess) ; + return (true) ; } diff --git a/GraphBLAS/CUDA/GraphBLAS_cuda.h b/GraphBLAS/CUDA/GraphBLAS_cuda.hpp similarity index 87% rename from GraphBLAS/CUDA/GraphBLAS_cuda.h rename to GraphBLAS/CUDA/GraphBLAS_cuda.hpp index 4bb6872dc4..c3968e37a7 100644 --- a/GraphBLAS/CUDA/GraphBLAS_cuda.h +++ b/GraphBLAS/CUDA/GraphBLAS_cuda.hpp @@ -1,8 +1,8 @@ //------------------------------------------------------------------------------ -// GraphBLAS/CUDA/GraphBLAS_cuda.h +// GraphBLAS/CUDA/GraphBLAS_cuda.hpp //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ diff --git a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_dense_phase1.cuh b/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_dense_phase1.cuh deleted file mode 100644 index 2d971a5ecc..0000000000 --- a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_dense_phase1.cuh +++ /dev/null @@ -1,166 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_dense_phase1.cuh -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -// phase1 for dot3, A and B are bitmap/full -// dense phase1: symbolic load balancing and data partition -// to assign work to different 'buckets' for later compute - -// This kernel scans the non-zero pattern in A and B, takes into account the -// mask and computes total work required to form C. Then it classifies each -// dot product into a set of buckets for efficient compute. - -#pragma once - -#include -#include "GB_cuda_kernel.h" -#include "GB_mxm_shared_definitions.h" -#include "GB_cuda_buckets.h" -#include -#include - -using namespace cooperative_groups; - -//------------------------------------------------------------------------------ -// GB_jit_AxB_dot3_dense_phase1: lookup i,j pairs and store in Mi, Ci -//------------------------------------------------------------------------------ - -// GB_AxB_dense_phase1 is a CUDA kernel that scans all entries in M and -// assigns i,j coordinates for each entries and stores in Mi and Ci. - -template -__global__ void GB_jit_AxB_dot3_dense_phase1 -( - // input/output: - GrB_Matrix C, // final output matrix - const GrB_Matrix M // mask matrix -) -{ - - //-------------------------------------------------------------------------- - // get C, M, A, and B - //-------------------------------------------------------------------------- - - const int64_t *__restrict__ Mp = M->p ; - const int64_t *__restrict__ Mi = M->i ; - #if !GB_MASK_STRUCT - const GB_M_TYPE *__restrict__ Mx = (GB_M_TYPE *) M->x ; - #endif - const int64_t mnvec = M->nvec ; - const int64_t mvlen = M->vlen ; -// const int64_t mnz = GB_nnz(M) ; - const GB_M_NVALS (mnz) ; - - int64_t *__restrict__ Ci = C->i ; // for zombies, or bucket assignment - - // Ci [p] for an entry C(i,j) contains either GB_FLIP(i) if C(i,j) is a - // zombie, or (k << 4) + bucket otherwise, where C(:,j) is the kth vector - // of C (j = Ch [k] if hypersparse or j = k if standard sparse), and - // where bucket is the bucket assignment for C(i,j). - // bucket can be recovered from Ci by bucket = Ci & 0xF - - // ASSERT (mnz > 0) ; - // ASSERT (gridDim.x <= mnz) ; - - // shared cache used for coordinate search - __shared__ int64_t ks [chunk_size] ; - - //-------------------------------------------------------------------------- - // assign all entries of C to the buckets - //-------------------------------------------------------------------------- - - // all threads in this block will compute the same values for these: - int64_t pfirst, plast, kfirst, klast ; - - int64_t chunk_max = GB_ICEIL (mnz, chunk_size) ; - // (mnz + chunk_size -1)/chunk_size; - for ( int64_t chunk = blockIdx.x; - chunk < chunk_max; - chunk += gridDim.x ) - { - - //---------------------------------------------------------------------- - // determine the work done by this iteration, "chunk" - //---------------------------------------------------------------------- - - // The slice for each task contains entries pfirst:plast-1 of M and C. - // This iteration "chunk" computes Ci and Cx [pfirst...plast-1], using - // Mi and Mx [pfirst:plast-1]. All threads in the thread block are - // used for this "chunk". - pfirst = chunk_size * chunk ; - plast = pfirst + chunk_size ; - // plast = GB_IMIN (plast, mnz) ; - if (plast > mnz) plast = mnz ; - int64_t my_chunk_size = plast - pfirst ; - - // find the first vector of the slice for this chunk: the - // vector that owns the entry Mi [pfirst] and Mx [pfirst]. - kfirst = GB_search_for_vector_device (pfirst, Mp, 0, mnvec, mvlen) ; - - // find the last vector of the slice for task blockIdx.x: the - // vector that owns the entry Mi [plast-1] and Mx [plast-1]. - klast = GB_search_for_vector_device (plast-1, Mp, kfirst, mnvec, mvlen); - - // number of vectors in C and M for this "chunk" iteration, where - // Mp [kfirst:klast] will be operated on. - int64_t nk = klast - kfirst + 1 ; - - //---------------------------------------------------------------------- - // fill ks to find all indices - //---------------------------------------------------------------------- - - // search for k values for each entry pfirst:plast-1 - float slope = ((float) nk) / ((float) my_chunk_size) ; - int64_t mnvec1 = mnvec - 1 ; - for (int64_t kk = threadIdx.x ; kk < my_chunk_size ; kk += blockDim.x) - { - // get a rough estimate of k for the kkth entry in ks - int64_t k = kfirst + (int64_t) (slope * ((float) kk)) ; - // k cannot be smaller than kfirst, but might be bigger than - // mnvec-1, so ensure it is in the valid range, kfirst to mnvec-1 - // k = GB_IMIN (k, mnvec-1) ; - if (k > mnvec1) k = mnvec1 ; - // look for p in Mp, where p is in range pfirst:plast-1 - // where pfirst >= 0 and plast < mnz - int64_t p = kk + pfirst ; - // linear-time search for the k value of the pth entry - while ( Mp [ k + 1 ] <= p ) k++ ; - while ( Mp [ k ] > p ) k-- ; - ks [kk] = k ; - } - this_thread_block().sync(); - - //---------------------------------------------------------------------- - // assign entries in C(i,j) to the buckets - //---------------------------------------------------------------------- - - for ( int64_t pM = pfirst + threadIdx.x; - pM < pfirst + my_chunk_size; - pM += blockDim.x ) - { - int64_t k = ks [pM - pfirst] ; // get the k value of Mi,Mx [pM]. - // j = k or j = Mh [k] if C and M are hypersparse, but j is not - // needed here. - - #if GB_MASK_STRUCT - { - // no need to check the value of M(i,j); no prezombies - Ci[pM] = (k << 4) ; - } - #else - { - bool mij = (bool) GB_MCAST (Mx,pM,) ; - int64_t i = Mi [ pM ] ; - // FIXME: no need for k<<4, just place k or GB_FLIP(i) in Ci - Ci[pM] = (!mij) * ( GB_FLIP(i) << 4) - + mij * ((k<<4) ) ; - } - #endif - } - } -} - diff --git a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh b/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh deleted file mode 100644 index 80a4e2020b..0000000000 --- a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh +++ /dev/null @@ -1,255 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -// This CUDA kernel produces the semiring product of two -// dense matrices of types T_A and T_B and common index space size n, to a -// output matrix of type T_C. The matrices are dense, with uniform -// non-zeros and sparsity patterns. -// ie. we want to produce C = A'*B in the sense of the given semi-ring. - -// This version uses a simple warp-based dense dot product algorithm, when the -// vectors coming from both A and B are dense, for any size of N. - -// Both the grid and block are 1D, so blockDim.x is the # threads in a -// threadblock, and the # of threadblocks is grid.x - -// Let b = blockIdx.x, and let s be blockDim.x. s= 32 with a variable number -// of active threads = min( min(nzA, nzB), 32) - -// Thus, threadblock b owns a semi-ring dot product on a pair of vectors. -// The work is to load the data, do the multiply and add work and finally -// reduce this data to a scalar, and write it to Cx[pair]. - -// int64_t start <- start of vector pairs for this kernel -// int64_t end <- end of vector pairs for this kernel -// int64_t *Bucket <- array of pair indices for all kernels -// GrB_Matrix C <- result matrix -// GrB_Matrix M <- mask matrix -// GrB_Matrix A <- input matrix A -// GrB_Matrix B <- input matrix B -// int sz <- size parameter (not used) - -/* FIXME: This kernel needs to be split into 4 methods: - - (A bitmap) * (B bitmap) - (A full ) * (B bitmap) - (A bitmap) * (B full) - (A full) * (B full) - - The buckets are not needed at all. A single pass can be done. - C and M would still be sparse or hypersparse. - - See also denseDotProduct.cu. -*/ - -#pragma once -#include -#include -#include "GB_cuda_kernel.h" -#include "GB_mxm_shared_definitions.h" -#include - -// Using tile size fixed at compile time, we don't need shared memory -#define tile_sz 32 - -using namespace cooperative_groups; - -//------------------------------------------------------------------------------ -// warp_ReduceSum -//------------------------------------------------------------------------------ - -template< typename T_Z, int warp_sz> -__inline__ __device__ T_Z warp_ReduceSum(thread_block_tile g, T_Z val) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial sum[i] to sum[lane+i] - // FIXME: only works if sizeof(T_Z) <= 32 bytes - // FIXME: the ANY monoid needs the cij_exists for each thread - for (int i = g.size() / 2; i > 0; i /= 2) - { - T_Z next = g.shfl_down( val, i) ; - GB_ADD( val, val, next ); - } - return val; // note: only thread 0 will return full sum -} - -//------------------------------------------------------------------------------ -// AxB_dot3_phase3_dndn -//------------------------------------------------------------------------------ - -template< - typename T_C, typename T_A, typename T_B, - typename T_Z, typename T_X, typename T_Y, - uint64_t srcode> -__global__ void AxB_dot3_phase3_dndn -( - GrB_Matrix C, - GrB_Matrix M, - GrB_Matrix A, - GrB_Matrix B -) -{ - // TODO: Figure out how to use graphblas-specific INFINITY macro - #ifndef INFINITY - #define INFINITY std::numeric_limits::max() - #endif - - const T_A *__restrict__ Ax = (T_A *)A->x ; - const T_B *__restrict__ Bx = (T_B *)B->x ; - T_C *__restrict__ Cx = (T_C *)C->x ; - int64_t *__restrict__ Ci = C->i ; - const int64_t *__restrict__ Mi = M->i ; - #if GB_M_IS_HYPER - const int64_t *__restrict__ Mh = M->h ; - #endif - // A and B are either bitmap or full - #if GB_A_IS_BITMAP - const int8_t *__restrict__ Ab = A->b ; - #endif - #if GB_B_IS_BITMAP - const int8_t *__restrict__ Bb = B->b ; - #endif - - // zombie count - int64_t zc = 0; - - int64_t start = 0; - int64_t end = M->p[M->nvec]; - - // total items to be inspected - int64_t nnzA = A->vlen; - int64_t nnzB = B->vlen; - int s = blockDim.x; - - // Main loop over pairs - for ( int64_t pair_id = start + blockIdx.x; //warp per pair - pair_id < end; - pair_id += gridDim.x ) - { - - // get M(i,j) and C(i,j) - int64_t i = Mi[pair_id]; - int64_t kk = Ci[pair_id] >> 4; // FIXME: can remove ">> 4" - bool cij_exists = false ; - GB_DECLARE_IDENTITY (cij) ; // GB_Z_TYPE cij = identity - - // skip if C(i,j) is a prezombie - if (kk >= 0) - { - - // j = kk or j = Mh [kk] if C and M are hypersparse - int64_t j = GBH_M (Mh, kk) ; - - int64_t pA = (A->vlen)*i; - int64_t pA_end = pA +(A->vlen); - - int64_t pB = (B->vlen)*j; - int64_t pB_end = pB +(B->vlen); - - // if (threadIdx.x == 0 ){ - // printf("tid=%d, i,j = %d,%d nnzA= %d, nnzB=%d\n", - // threadIdx.x, (int)i,(int)j, (int)nnzA, (int)nnzB); - // } - // __syncthreads(); - - // convert global data pointer to the local pointer of this block - GB_DECLAREA (aki) ; - GB_DECLAREB (bkj) ; - - #if GB_A_IS_FULL && GB_B_IS_FULL - { - cij_exists = true ; - for (int64_t k = threadIdx.x ; k < nnzA ; k += s) - { - // cij += A(k,i) * B(k,j) - GB_GETA (aki, Ax, pA+k, ) ; // aki = A(k,i) - GB_GETB (bkj, Bx, pB+k, ) ; // bkj = B(k,j) - GB_MULTADD ( cij, aki, bkj, i, k, j ) ; // cij += aki * bkj - } - } - #elif GB_A_IS_BITMAP && GB_B_IS_BITMAP - { - for ( int64_t k = threadIdx.x ; k < nnzA ; k += s) - { - GB_GETA (aki, Ax, pA+k, ) ; // aki = A(k,i) - GB_GETB (bkj, Bx, pB+k, ) ; // bkj = B(k,j) - int8_t b = (Ab [pA+k] && Bb [pB+k]) ; - cij_exists |= b ; - if (b) - { - GB_MULTADD ( cij, aki, bkj, i, k, j ) ; // cij += aki * bkj - } - } - } - #elif GB_A_IS_FULL && GB_B_IS_BITMAP - { - for ( int64_t k = threadIdx.x ; k < nnzA ; k += s) - { - if (Bb [pB+k]) - { - GB_GETA (aki, Ax, pA+k, ) ; // aki = A(k,i) - GB_GETB (bkj, Bx, pB+k, ) ; // bkj = B(k,j) - GB_MULTADD ( cij, aki, bkj, i, k, j ) ; // cij += aki * bkj - cij_exists = true ; - } - } - } - #elif GB_A_IS_BITMAP && GB_B_IS_FULL - { - for ( int64_t k = threadIdx.x ; k < nnzA ; k += s) - { - if (Ab [pB+k]) - { - GB_GETA (aki, Ax, pA+k, ) ; // aki = A(k,i) - GB_GETB (bkj, Bx, pB+k, ) ; // bkj = B(k,j) - GB_MULTADD ( cij, aki, bkj, i, k, j ) ; // cij += aki * bkj - cij_exists = true ; - } - } - } - #endif - } - - //---------------------------------------------------------------------- - // reduce per-thread sums to a single scalar - //---------------------------------------------------------------------- - - // Do vote here for control. - thread_block_tile<32> tile = tiled_partition<32>( this_thread_block() ); - cij_exists = tile.any( cij_exists); - tile.sync(); - - #if !GB_C_ISO - // FIXME: the ANY monoid needs the cij_exists for each thread - cij = warp_ReduceSum ( tile, cij); - #endif - - // write result for this block to global mem - if (threadIdx.x == 0) - { - if (cij_exists) - { - GB_PUTC (cij, Cx, pair_id) ; // Cx [pair_id] = (T_C) cij - Ci [pair_id] = i ; - } - else - { - // cij is a zombie - zc++; - Ci [pair_id] = GB_FLIP (i) ; - } - } - //__syncthreads ( ) ; - - if( threadIdx.x ==0 && zc > 0) - { - GB_cuda_atomic_add ( &(C->nzombies), zc) ; - } - } -} - diff --git a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_phase2.cuh b/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_phase2.cuh deleted file mode 100644 index 3d9f7d39cb..0000000000 --- a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_phase2.cuh +++ /dev/null @@ -1,193 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/JitKernels/GB_cuda_jit_GB_AxB_phase2.cuh -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ -// fill the global buckets -//------------------------------------------------------------------------------ - -#pragma once -#include "GB_cuda_kernel.h" -#include "GB_mxm_shared_definitions.h" -#include "GB_cuda_buckets.h" -#include -#include -#include - -using namespace cooperative_groups; - -//------------------------------------------------------------------------------ -// BlockPrefixCallbackOp -//------------------------------------------------------------------------------ - -// A stateful callback functor that maintains a running prefix to be applied -// during consecutive scan operations. -struct BlockPrefixCallbackOp -{ - // Running prefix - int64_t running_total; - // Constructor - __device__ BlockPrefixCallbackOp(int64_t running_total) : running_total(running_total) {} - - // Callback operator to be entered by the first warp of threads in the block. - // Thread-0 is responsible for returning a value for seeding the block-wide scan. - __device__ int64_t operator()(int64_t block_aggregate) - { - int64_t old_prefix = running_total; - running_total += block_aggregate; - return old_prefix; - } -}; - -//------------------------------------------------------------------------------ -// blockBucketExclusiveSum -//------------------------------------------------------------------------------ - -__inline__ -__device__ void blockBucketExclusiveSum(int bucketId, int64_t *d_data, int nblocks) -{ - #define blocksize 32 - - // Specialize BlockScan for a 1D block of 32 threads - typedef cub::BlockScan BlockScan; - - // Allocate shared memory for BlockScan - __shared__ typename BlockScan::TempStorage temp_storage; - - // Initialize running total - BlockPrefixCallbackOp prefix_op(0); - - // Have the block iterate over segments of items - int64_t data=0; - - int64_t *blockbucket= d_data; - - for (int block_id = 0; block_id < nblocks; block_id += blocksize) - { - // Load a segment of consecutive items that are blocked across threads - - //printf("block %d entering sum\n",blockIdx.x); - int loc = block_id + threadIdx.x; - if ( loc < nblocks) - { - //printf("block %di loading tid=%d\n",block_id,tid); - data = blockbucket[bucketId*nblocks +loc ] ; - } - this_thread_block().sync(); - - //printf("bb%d_%d s0 before prefix= %ld \n", block_id,bucketId, - // blockbucket[bucketId*nblocks +loc] ) ; - // Collectively compute the block-wide exclusive prefix sum - BlockScan(temp_storage).ExclusiveSum( data, data, prefix_op); - this_thread_block().sync(); - - if ( loc < nblocks) - { - blockbucket[bucketId*nblocks +loc ] = data ; - } - //this_thread_block().sync(); - - //printf("bb%d_%d = %ld \n", block_id, bucketId, blockbucket[bucketId*nblocks +loc] ) ; - - data = 0; - } -} - -//------------------------------------------------------------------------------ -// warp_ReduceSumPlus_uint64 -//------------------------------------------------------------------------------ - -template< int tile_sz> -__inline__ __device__ uint64_t warp_ReduceSumPlus_uint64( thread_block_tile tile, uint64_t val) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial sum[i] to sum[lane+i] - for (int i = tile.size() / 2; i > 0; i /= 2) { - val += tile.shfl_down( val, i); - } - return val; // note: only thread 0 will return full sum -} - -//------------------------------------------------------------------------------ -// AxB_phase2 -//------------------------------------------------------------------------------ - -// GB_AxB_cuda_dot3_phase2 is a CUDA kernel that takes as input the -// nanobuckets and blockbucket arrays computed by the first phase kernel, -// GB_AxB_cuda_dot3_phase1. The launch geometry of this kernel must match the -// GB_AxB_cuda_dot3_phase1 kernel, with the same # of threads and threadblocks. - -__global__ void AxB_phase2 // FIXME rename -( - // input, not modified: - int64_t *__restrict__ blockbucket, // global bucket count, of size NBUCKETS*nblocks - // output: - int64_t *__restrict__ offset, // global offsets, for each bucket - // inputs, not modified: - const int nblocks // input number of blocks to reduce across, ie size of vector for 1 bucket -) -{ - - //-------------------------------------------------------------------------- - // sum up the bucket counts of prior threadblocks - //-------------------------------------------------------------------------- - - // blockbucket is an array of size NBUCKETS-by-nblocks, held by row. The - // entry blockbucket [bucket * nblocks + t] holds the # of entries - // in the bucket (in range 0 to NBUCKETS-1) found by threadblock t. - - //__shared__ uint64_t offset [NBUCKETS] ; - uint64_t s[NBUCKETS]; - - #pragma unroll - for(int b = 0; b < NBUCKETS; ++b){ - s[b] = 0; - } - - thread_block_tile<32> tile = tiled_partition<32>(this_thread_block() ); - - //printf("block %d,dim %d entering sum %d nblocks\n",blockIdx.x, blockDim.x, nblocks); - int64_t tid = threadIdx.x + blockIdx.x * blockDim.x; - - - #pragma unroll - for(int b = 0; b < NBUCKETS; ++b) { - for( tid = threadIdx.x + blockIdx.x * blockDim.x; - tid < nblocks; - tid += blockDim.x*gridDim.x) { - s[b] += blockbucket[ b * nblocks +tid] ; - } - this_thread_block().sync(); - - s[b] = warp_ReduceSumPlus_uint64<32>( tile, s[b]); - } - - if (threadIdx.x ==0 ) - { - #pragma unroll - for(int b = 0; b < NBUCKETS; ++b) { - atomicAdd( (unsigned long long int*)&(offset[b]), s[b]); - } - } - this_thread_block().sync(); - - if( gridDim.x >= NBUCKETS) - { - // Cumulative sum across blocks for each bucket - if (blockIdx.x -//#include -//using namespace cooperative_groups; - -__global__ -void AxB_phase2end - ( - // input, not modified: - const int64_t *__restrict__ nanobuckets, // array of size NBUCKETS-blockDim.x-by-nblocks - const int64_t *__restrict__ blockbucket, // global bucket count, of size NBUCKETS*nblocks - // output: - const int64_t *__restrict__ bucketp, // global bucket cumsum, of size NBUCKETS+1 - int64_t *__restrict__ bucket, // global buckets, of size cnz (== mnz) - const int64_t *__restrict__ offset, // global offsets, for each bucket - // inputs, not modified: - const GrB_Matrix C, // output matrix - const int64_t cnz // number of entries in C and M - ) -{ - - //-------------------------------------------------------------------------- - // get C information - //-------------------------------------------------------------------------- - - // Ci [p] for an entry C(i,j) contains either GB_FLIP(i) if C(i,j) is a - // zombie, or (k << 4) + bucket otherwise, where C(:,j) is the kth vector - // of C (j = Ch [k] if hypersparse or j = k if standard sparse), and - // where bucket is the bucket assignment for C(i,j). This phase does not - // need k, just the bucket for each entry C(i,j). - - int64_t *__restrict__ Ci = C->i ; // for zombies, or bucket assignment - //int64_t *Mp = C->p ; // for offset calculations - //int64_t mnvec = C->nvec; - - //-------------------------------------------------------------------------- - // load and shift the nanobuckets for this thread block - //-------------------------------------------------------------------------- - - // The taskbucket for this threadblock is an array of size - // NBUCKETS-by-blockDim.x, held by row. It forms a 2D array within the 3D - // nanobuckets array. - const int64_t *taskbucket = nanobuckets + blockIdx.x * (NBUCKETS * blockDim.x) ; - - //printf("block%d thd%d blockbucket= %ld\n", blockIdx.x, threadIdx.x, - // blockbucket[blockIdx.x*gridDim.x+blockIdx.x]); - - // Each thread in this threadblock owns one column of this taskbucket, for - // its set of NBUCKETS nanobuckets. The nanobuckets are a column of length NBUCKETS, - // with stride equal to blockDim.x. - const int64_t *nanobucket = taskbucket + threadIdx.x; - - // Each thread loads its NBUCKETS nanobucket values into registers. - int64_t my_bucket[NBUCKETS]; - - #pragma unroll - for(int b = 0; b < NBUCKETS; ++b) { - my_bucket[b] = nanobucket [b * blockDim.x] - + blockbucket [b * gridDim.x + blockIdx.x] - + bucketp [b] ; - - //if(b==3) printf("blk:%d tid: %d my_buck[%d]=%lu \n", blockIdx.x, threadIdx.x, b, my_bucket[b]); - } - - // Now each thread has an index into the global set of NBUCKETS buckets, - // held in bucket, of where to place its own entries. - - //-------------------------------------------------------------------------- - // construct the global buckets - //-------------------------------------------------------------------------- - - // The slice for task blockIdx.x contains entries pfirst:plast-1 of M and - // C, which is the part of C operated on by this threadblock. - int64_t pfirst, plast ; - - __shared__ int64_t bucket_idx[chunksize]; - //__shared__ int64_t bucket_s[NBUCKETS][chunksize]; - - int chunk_max= (cnz + chunksize -1)/chunksize; - for ( int chunk = blockIdx.x; - chunk < chunk_max; - chunk += gridDim.x ) - { - - pfirst = chunksize * chunk ; - plast = GB_IMIN( chunksize * (chunk+1), cnz ) ; - - for ( int64_t p = pfirst + threadIdx.x; p < plast ; p += blockDim.x ) - { - // get the entry C(i,j), and extract its bucket. Then - // place the entry C(i,j) in the global bucket it belongs to. - int tid = p - pfirst; - - // TODO: these writes to global are not coalesced. Instead: each - // threadblock could buffer its writes to NBUCKETS buffers and when the - // buffers are full they can be written to global. - int ibucket = Ci[p] & 0xF; - //printf(" thd: %d p,Ci[p] = %ld,%ld,%d\n", threadIdx.x, p, Ci[p], irow ); - - //bucket[my_bucket[ibucket]++] = p; - //int idx = (my_bucket[ibucket] - pfirst); - //my_bucket[ibucket] += 1; //blockDim.x; - //int idx = (my_bucket[ibucket]++ - pfirst) & 0x7F; - //bucket_s[ibucket][ idx ] = p; - bucket_idx[tid] = my_bucket[ibucket]++; - Ci[p] = (ibucket==0) * (Ci[p] >> 4) + (ibucket > 0)* Ci[p]; - //if(ibucket == 0) { - //// bucket[my_bucket[0]++] = p; - // Ci[p] = Ci[p] >> 4; - //} else { - // bucket[my_bucket[ibucket]++] = p; - //} - } - - for ( int64_t p = pfirst + threadIdx.x; p < plast ; p+= blockDim.x ) - { - int tid = p - pfirst; - //int ibucket = Ci[p] & 0xF; - //bucket[ p ] = bucket_s[ibucket][tid]; - bucket [ bucket_idx[tid] ] = p; - //printf("ibucket = %d tid=%d p=%lu idx = %lu val = %lu \n",ibucket, threadIdx.x,p, tid, bucket_s[ibucket][tid]); - //printf("ibucket = %d tid=%d p=%lu idx = %lu \n",ibucket, threadIdx.x, p, bucket_idx[tid]); - } - } -} - diff --git a/GraphBLAS/CUDA/JitKernels/GB_jit_kernel_cuda_AxB_dot3.cu b/GraphBLAS/CUDA/JitKernels/GB_jit_kernel_cuda_AxB_dot3.cu new file mode 100644 index 0000000000..f515ef2177 --- /dev/null +++ b/GraphBLAS/CUDA/JitKernels/GB_jit_kernel_cuda_AxB_dot3.cu @@ -0,0 +1,552 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/JitKernels/GB_jit_kernel_cuda_AxB_dot3.cu +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +// GB_jit_kernel_cuda_AxB_dot3: C=A'*B using the dot3 method on the GPU. + +#define GB_FREE_ALL ; + +#if GB_C_ISO +// FIXME +#error "kernel undefined for C iso" +#endif + +// FIXME: Figure out how to use graphblas-specific INFINITY macro +#ifndef INFINITY +#define INFINITY std::numeric_limits::max() +#endif + +//------------------------------------------------------------------------------ +// kernel launch geometry +//------------------------------------------------------------------------------ + +// FIXME: some duplicates here +#define chunk_size 128 +#define log2_chunk_size 7 +#define tile_sz 32 +#define shared_vector_size 128 +#define blocksize 32 +#define threads_per_block 32 + +//------------------------------------------------------------------------------ +// operators +//------------------------------------------------------------------------------ + +#if GB_C_ISO + + #define GB_DOT_TERMINAL( c ) break + #define GB_DOT_MERGE(pA,pB) \ + { \ + cij_exists = true ; \ + } + #define GB_CIJ_EXIST_POSTCHECK + +#else + + #define GB_DOT_TERMINAL( c ) GB_IF_TERMINAL_BREAK ( c, zterminal ) + + #if GB_IS_PLUS_PAIR_REAL_SEMIRING + + // cij += A(k,i) * B(k,j), for merge operation (plus_pair_real semiring) + #if GB_Z_IGNORE_OVERFLOW + // plus_pair for int64, uint64, float, or double + #define GB_DOT_MERGE(pA,pB) cij++ ; + #define GB_CIJ_EXIST_POSTCHECK cij_exists = (cij != 0) ; + #else + // plus_pair semiring for small integers + #define GB_DOT_MERGE(pA,pB) \ + { \ + cij_exists = true ; \ + cij++ ; \ + } + #define GB_CIJ_EXIST_POSTCHECK + #endif + + #else + + // cij += A(k,i) * B(k,j), for merge operation (general case) + #define GB_DOT_MERGE(pA,pB) \ + { \ + GB_GETA ( aki, Ax, pA, ) ; /* aki = A(k,i) */ \ + GB_GETB ( bkj, Bx, pB, ) ; /* bkj = B(k,j) */ \ + cij_exists = true ; \ + GB_MULTADD ( cij, aki, bkj, i, k, j ) ; /* cij += aki * bkj */ \ + } + #define GB_CIJ_EXIST_POSTCHECK + + #endif + +#endif + +//------------------------------------------------------------------------------ +// dot3 buckets +//------------------------------------------------------------------------------ + +#define NBUCKETS 3 + +// NBUCKETS buckets: computed by up to NBUCKETS-1 kernel launches (zombies need +// no work...), each using different kernels (with different configurations +// depending on the bucket). + +// dot3: C=A'B, M is sparse or hyper, C is sparse or hyper +// 32 kernels A,B: (hyper,sparse,bitmap,full)^2 x (M and C are sparse/hyper) + +typedef enum +{ + GB_BUCKET_ZOMBIE = 0, // C(i,j) is a zombie (not a bucket) + // both A and B are sparse/hyper: + GB_BUCKET_VSVS = 1, // vsvs: both A(:,i) and B(:,j) are very sparse + GB_BUCKET_MERGEPATH = 2, // mp: use the merge-path method + // A is sparse/hyper and B is bitmap/full, or + // A is bitmap/full and B is sparse/hyper + GB_BUCKET_VSDN = 1, // vsdn: the sparse vector is very sparse + GB_BUCKET_SPDN = 2, // spdn: sparse vector has lots of entries; + // use a whole warp for each dot product +} +GB_bucket_code ; // FIXME: rename GB_dot3_bucket_code + +// These may use another bucket enum: + + // two full/(sparse,hyper) kernels: + // // CUDA kernel: spdn, handles 4 buckets: + // // A(:,i) is dense and B(:,j) is very sparse (< 256 entries) + // GB_BUCKET_DNVS = 2, + // // A(:,i) is dense and B(:,j) is sparse (>= 256 entries) + // GB_BUCKET_DNSP = 3, + + // a sparse/full kernel + // // A(:,i) is very sparse (< 256 entries) and B(:,j) is dense + // GB_BUCKET_VSDN = 4, + // // A(:,i) is sparse (>= 256 entries) and B(:,j) is dense + // GB_BUCKET_SPDN = 5, + + // a sparse/bitmap kernel + // a bitmap/bitmap kernel + // a bitmap/sparse kernel + // ... + +#include "GB_cuda_shfl_down.cuh" + +//------------------------------------------------------------------------------ +// CUDA device kernels for each case +//------------------------------------------------------------------------------ + +#include "GB_cuda_ek_slice.cuh" + +#if ((GB_A_IS_BITMAP || GB_A_IS_FULL) && (GB_B_IS_BITMAP || GB_B_IS_FULL)) + // dense-dense + #include "GB_cuda_jit_AxB_dot3_dense_phase1.cuh" + #include "GB_cuda_jit_AxB_dot3_phase3_dndn.cuh" +#else + // sparse-sparse, sparse-dense, or dense-sparse + + #undef GB_FREE_ALL + #define GB_FREE_ALL \ + { \ + GB_FREE_WORK (&Nanobuckets, Nb_size) ; \ + GB_FREE_WORK (&Blockbucket, Bb_size) ; \ + GB_FREE_WORK (&Bucketp, Bup_size) ; \ + GB_FREE_WORK (&offset, O_size) ; \ + GB_FREE_WORK (&Bucket, Bu_size) ; \ + } + + #include "GB_cuda_jit_AxB_dot3_phase1.cuh" + #include "GB_cuda_jit_AxB_dot3_phase2.cuh" + #include "GB_cuda_jit_AxB_dot3_phase2end.cuh" + #if ((GB_A_IS_SPARSE || GB_A_IS_HYPER) && \ + (GB_B_IS_SPARSE || GB_B_IS_HYPER)) + // sparse-sparse + #include "GB_cuda_jit_AxB_dot3_phase3_mp.cuh" + #include "GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh" + #else + // sparse-dense or dense-sparse + #include "GB_cuda_jit_AxB_dot3_phase3_spdn.cuh" + #include "GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh" + #endif +#endif + +//------------------------------------------------------------------------------ +// host function to launch the CUDA kernels for dot3 on the GPU +//------------------------------------------------------------------------------ + +// #include "GB_cuda_timer.hpp" + +extern "C" +{ + GB_JIT_CUDA_KERNEL_DOT3_PROTO (GB_jit_kernel) ; +} + +GB_JIT_CUDA_KERNEL_DOT3_PROTO (GB_jit_kernel) +{ + + // GpuTimer kernel_timer ; + + //-------------------------------------------------------------------------- + // get callback functions + //-------------------------------------------------------------------------- + + #ifdef GB_JIT_RUNTIME + // get callback functions + GB_free_memory_f GB_free_memory = my_callback->GB_free_memory_func ; + GB_malloc_memory_f GB_malloc_memory = my_callback->GB_malloc_memory_func ; + #endif + + //-------------------------------------------------------------------------- + // declare workspace + //-------------------------------------------------------------------------- + + #if ((GB_A_IS_BITMAP || GB_A_IS_FULL) && (GB_B_IS_BITMAP || GB_B_IS_FULL)) + // dense-dense case requires no workspace + #else + // sparse-sparse, sparse-dense, and dense-sparse requires workspace + int64_t *Nanobuckets = NULL ; size_t Nb_size = 0 ; + int64_t *Blockbucket = NULL ; size_t Bb_size = 0 ; + int64_t *Bucket = NULL ; size_t Bu_size = 0 ; + int64_t *Bucketp = NULL ; size_t Bup_size = 0 ; + int64_t *offset = NULL ; size_t O_size = 0 ; + #endif + + //-------------------------------------------------------------------------- + // get problem size + //-------------------------------------------------------------------------- + + const GB_M_NVALS (mnz) ; + int nblks_1 = (mnz + chunk_size - 1) / chunk_size ; + int number_of_blocks_1 = GB_IMIN (nblks_1, chunk_size * number_of_sms) ; + + // most methods can use these launch geometries: + dim3 grid_1 (number_of_blocks_1) ; + dim3 block (threads_per_block) ; + + //-------------------------------------------------------------------------- + // C=A'*B via jitified kernels + //-------------------------------------------------------------------------- + + #if ((GB_A_IS_BITMAP || GB_A_IS_FULL) && (GB_B_IS_BITMAP || GB_B_IS_FULL)) + { + + //---------------------------------------------------------------------- + // (full or bitmap) times (full or bitmap) + //---------------------------------------------------------------------- + + // full/bitmap cases, which means we don't need buckets and zombies. + // This is a much simpler kernel as a result, it only does the i,j + // lookup and stores the values in Mi and Ci. + + // Idea is to have each task work on a continguous block of columns of + // C Note: for small tests, mnz is small so ntasks is be governed by + // chunk_size, not chunk_size*number_of_sms. For large problems in + // production, chunk_size is less important since ntasks will likely be + // bounded by chunk_size*number_of_sms (say 128*80 = 10,240 on a V100, + // for the default chunk_size of 128). + + //---------------------------------------------------------------------- + // dense case, phase 1 + //---------------------------------------------------------------------- + + // kernel_timer.Start(); + GB_cuda_AxB_dot3_dense_phase1_kernel <<>> + (C, M) ; + + CUDA_OK (cudaStreamSynchronize(stream)) ; // is this needed? + + // kernel_timer.Stop(); + // printf ("(GPU phase1 %12.6g ms )\n", kernel_timer.Elapsed()) ; + + //---------------------------------------------------------------------- + // dense case, phase "3" (FIXME: rename to dense_phase2) + //---------------------------------------------------------------------- + + int work_per_thread = 8 ; + int blocksz = 64 ; + work_per_thread = 8 ; + if (mnz > 1024) + { + blocksz = 512 ; + work_per_thread = 64 ; + } + int gridsz = GB_ICEIL (mnz, work_per_thread*blocksz) ; + dim3 grid_2 (gridsz) ; + + // kernel_timer.Start(); + + GB_cuda_AxB_dot3_phase3_dndn_kernel <> + (C, M, A, B) ; + + } + #else + { + + //---------------------------------------------------------------------- + // (sparse or hyper) times (sparse or hyper) + // (sparse or hyper) times (bitmap or full) + // (bitmap or full) times (sparse or hyper) + //---------------------------------------------------------------------- + + //---------------------------------------------------------------------- + // construct the tasks for phase1 and phase2 + //---------------------------------------------------------------------- + + // # of threads in phase1 and phase2 kernel launches are related + // # by the size of the warp. ph2_task = ph1_task/32 for example + + int64_t blockbuckets_size = NBUCKETS * number_of_blocks_1 ; + int64_t nanobuckets_size = blockbuckets_size * threads_per_block ; + + Nanobuckets = GB_MALLOC_WORK (nanobuckets_size, int64_t, &Nb_size) ; + Blockbucket = GB_MALLOC_WORK (blockbuckets_size, int64_t, &Bb_size) ; + Bucketp = GB_MALLOC_WORK (NBUCKETS+1, int64_t, &Bup_size) ; + offset = GB_MALLOC_WORK (NBUCKETS, int64_t, &O_size) ; + Bucket = GB_MALLOC_WORK (mnz, int64_t, &Bu_size) ; + + if (Nanobuckets == NULL || Blockbucket == NULL || Bucketp == NULL + || Bucket == NULL || offset == NULL) + { + // out of memory + GB_FREE_ALL ; + return (GrB_OUT_OF_MEMORY) ; + } + + // FIXME: do async with streams + // FIXME: do we need any of these? + //CUDA_OK (cudaMemsetAsync(Nanobuckets, 0, + // nanobuckets_size * sizeof(int64_t), stream)); + //CUDA_OK (cudaMemsetAsync(Blockbucket, 0, + // blockbuckets_size * sizeof(int64_t), stream)); + CUDA_OK (cudaMemsetAsync(Bucketp, 0, + (NBUCKETS+1) * sizeof(int64_t), stream)); + CUDA_OK (cudaMemsetAsync(offset, 0, + NBUCKETS * sizeof(int64_t), stream)); + //CUDA_OK (cudaMemsetAsync(Bucket, 0, + // mnz * sizeof(int64_t), stream)); + + //---------------------------------------------------------------------- + // phase1 and phase2: place each C(i,j) in a bucket + //---------------------------------------------------------------------- + + CUDA_OK (cudaMemAdvise( Bucketp, (NBUCKETS+1) * sizeof ( int64_t), + cudaMemAdviseSetPreferredLocation, cudaCpuDeviceId)); + CUDA_OK (cudaMemAdvise( Bucketp, (NBUCKETS+1) * sizeof ( int64_t), + cudaMemAdviseSetAccessedBy, device)); + + CUDA_OK (cudaMemAdvise( offset, NBUCKETS * sizeof ( int64_t), + cudaMemAdviseSetPreferredLocation, cudaCpuDeviceId)); + CUDA_OK (cudaMemAdvise( offset, NBUCKETS * sizeof ( int64_t), + cudaMemAdviseSetAccessedBy, device)); + + //---------------------------------------------------------------------- + // phase1: assign each C(i,j) to a bucket, and count them + //---------------------------------------------------------------------- + + // kernel_timer.Start(); + + GB_jit_AxB_dot3_phase1_kernel <<>> + (Nanobuckets, Blockbucket, C, M, A, B) ; + + CUDA_OK (cudaStreamSynchronize (stream)) ; + + // kernel_timer.Stop(); + // printf ("(GPU phase1 %12.6g ms )\n", kernel_timer.Elapsed()) ; + + //---------------------------------------------------------------------- + // phase2: cumsum across the blockbuckets, propagate to thread level + //---------------------------------------------------------------------- + + // # of blocks for phase2: + int number_of_blocks_2 = (number_of_blocks_1 + threads_per_block - 1) + / threads_per_block ; + + dim3 grid_2 (number_of_blocks_2) ; + + // kernel_timer.Start(); + + GB_cuda_AxB_dot3_phase2_kernel <<>> + (Blockbucket, offset, number_of_blocks_1) ; + + CUDA_OK (cudaStreamSynchronize (stream)) ; + + int64_t s = offset [0] ; + C->nzombies = s ; + bool all_in_one = false ; + for (int bucket = 1 ; bucket < NBUCKETS+1 ; bucket++) + { + Bucketp[bucket] = s ; + s += offset [bucket] ; + if ((Bucketp [bucket] - Bucketp [bucket-1] ) == mnz) + { + all_in_one = true ; + } + } + + // kernel_timer.Stop(); + // printf ("(GPU phase2 %12.6g ms )\n", kernel_timer.Elapsed()) ; + + //---------------------------------------------------------------------- + // phase2end + //---------------------------------------------------------------------- + + if (!all_in_one) + { + // kernel_timer.Start(); + + GB_cuda_AxB_dot3_phase2end_kernel <<>> + (Nanobuckets, Blockbucket, Bucketp, Bucket, offset, C, mnz) ; + + CUDA_OK (cudaStreamSynchronize (stream)) ; + // kernel_timer.Stop(); + // printf ("(GPU phase2end %12.6g ms)\n",kernel_timer.Elapsed()); + } + + //---------------------------------------------------------------------- + // phase3: do the numerical work + //---------------------------------------------------------------------- + + // kernel_timer.Start(); + + for (int bucket = 1 ; bucket < NBUCKETS ; bucket++) + { + int64_t start = Bucketp [bucket] ; + int64_t end = Bucketp [bucket + 1] ; + int64_t cnz_in_bucket = end - start ; + int gridsz, blocksz, work_per_thread ; + if (cnz_in_bucket > 0) + { + + #if ((GB_A_IS_SPARSE || GB_A_IS_HYPER) && \ + (GB_B_IS_SPARSE || GB_B_IS_HYPER)) + + switch (bucket) + { + + //------------------------------------------------------ + // vsvs bucket: both vectors very sparse + //------------------------------------------------------ + + case GB_BUCKET_VSVS : + { + // FIXME: should be a function of cuda architecture + blocksz = 256 ; + work_per_thread = 4 ; + if (cnz_in_bucket > (2<<12)) + { + blocksz = 512 ; + } + gridsz = GB_ICEIL (cnz_in_bucket, + work_per_thread*blocksz) ; + gridsz = GB_IMIN (gridsz, 256*number_of_sms) ; + dim3 grid_3 (gridsz) ; + GB_cuda_AxB_dot3_phase3_vsvs_kernel + <<>> + (start, end, Bucket, C, M, A, B) ; + } + break ; + + //------------------------------------------------------ + // mergepath bucket: + //------------------------------------------------------ + + case GB_BUCKET_MERGEPATH : + { + // FIXME: should be a function of cuda architecture + blocksz = 32 ; + work_per_thread = 256 ; + if (cnz_in_bucket > (2<<20)) + { + work_per_thread = 1024 ; + } + gridsz = GB_ICEIL (cnz_in_bucket, work_per_thread) ; + if ((gridsz < number_of_sms) && + (cnz_in_bucket > (2<<20))) + { + gridsz = number_of_sms ; + } + gridsz = GB_IMIN (gridsz, 256*number_of_sms) ; + dim3 grid_3 (gridsz) ; + GB_cuda_AxB_dot3_phase3_mp_kernel + <<>> + (start, end, Bucket, C, M, A, B) ; + } + break ; + } + + #else + + switch (bucket) + { + + //------------------------------------------------------ + // vsdn bucket: one thread per C(i,j) dot product + //------------------------------------------------------ + + case GB_BUCKET_VSDN : + { + // FIXME: should be a function of cuda architecture + blocksz = 256 ; + work_per_thread = 4 ; + if (cnz_in_bucket > (2<<12)) + { + blocksz = 512 ; + } + gridsz = GB_ICEIL (cnz_in_bucket, + work_per_thread*blocksz) ; + gridsz = GB_IMIN (gridsz, 256*number_of_sms) ; + dim3 grid_3 (gridsz) ; + GB_cuda_AxB_dot3_phase3_vsdn_kernel + <<>> + (start, end, Bucket, C, M, A, B) ; + } + break ; + + //------------------------------------------------------ + // spdn bucket: one warp per C(i,j) dot product + //------------------------------------------------------ + + case GB_BUCKET_SPDN : + { + // FIXME: should be a function of cuda architecture + blocksz = 32 ; + work_per_thread = 256 ; + if (cnz_in_bucket > (2<<20)) + { + work_per_thread = 1024 ; + } + gridsz = GB_ICEIL (cnz_in_bucket, work_per_thread) ; + if ((gridsz < number_of_sms) && + (cnz_in_bucket > (2<<20))) + { + gridsz = number_of_sms ; + } + gridsz = GB_IMIN (gridsz, 256*number_of_sms) ; + dim3 grid_3 (gridsz) ; + GB_cuda_AxB_dot3_phase3_spdn_kernel + <<>> + (start, end, Bucket, C, M, A, B) ; + break ; + } + } + #endif + } + } + } + #endif + + //-------------------------------------------------------------------------- + // free workspace and return result + //-------------------------------------------------------------------------- + + CUDA_OK (cudaStreamSynchronize (stream)) ; + + // kernel_timer.Stop(); + // printf ("(GPU phase3 %12.6g ms, rate=%12.6g)\n", + // kernel_timer.Elapsed(), mnz/(1000*kernel_timer.Elapsed())) ; + + GB_FREE_ALL ; + return (GrB_SUCCESS) ; +} + diff --git a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_reduce.cuh b/GraphBLAS/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu similarity index 71% rename from GraphBLAS/CUDA/JitKernels/GB_cuda_jit_reduce.cuh rename to GraphBLAS/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu index 354e3b216c..94de78d706 100644 --- a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_reduce.cuh +++ b/GraphBLAS/CUDA/JitKernels/GB_jit_kernel_cuda_reduce.cu @@ -1,14 +1,17 @@ //------------------------------------------------------------------------------ -// GraphBLAS/CUDA/JitKernels/GB_cuda_jit_reduce.cuh +// GraphBLAS/CUDA/JitKernels/GB_jit_cuda_reduce.cu //------------------------------------------------------------------------------ +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ -// The GB_cuda_jit_reduce CUDA kernel reduces a GrB_Matrix A of any type T_A, -// to a scalar of type T_Z. Each threadblock (blockIdx.x) reduces its portion -// of Ax to a single scalar, and then atomics are used across the threadblocks. +// The GB_cuda_jit_reduce CUDA kernel reduces a GrB_Matrix A of any type +// GB_A_TYPE, to a scalar of type GB_Z_TYPE. Each threadblock (blockIdx.x) +// reduces its portion of Ax to a single scalar, and then atomics are used +// across the threadblocks. // Both the grid and block are 1D, so blockDim.x is the # threads in a // threadblock, and the # of threadblocks is grid.x @@ -21,63 +24,33 @@ // If the reduction is done on the GPU, A will never be iso-valued. -#include -#include -#include "GB_cuda_kernel.h" -#include "GB_monoid_shared_definitions.h" -#include "GB_cuda_atomics.cuh" -#include -#include - #if GB_C_ISO #error "kernel undefined for C iso" #endif -using namespace cooperative_groups; - -//------------------------------------------------------------------------------ -// GB_warp_Reduce: reduce all entries in a warp to a single scalar -//------------------------------------------------------------------------------ - -// GB_warp_Reduce assumes WARPSIZE is 32 threads. +// FIXME: put these definitions in GB_cuda_kernel.h: +#define tile_sz 32 +#define log2_tile_sz 5 -template -__inline__ __device__ -T_Z GB_warp_Reduce( thread_block_tile g, T_Z val) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial val[k] to val[lane+k] - - // FIXME: doesn't work unless sizeof(T_Z) <= 32 bytes - - T_Z fold = g.shfl_down ( val, 16) ; - GB_ADD ( val, val, fold ) ; - fold = g.shfl_down ( val, 8) ; - GB_ADD ( val, val, fold ) ; - fold = g.shfl_down ( val, 4) ; - GB_ADD ( val, val, fold ) ; - fold = g.shfl_down ( val, 2) ; - GB_ADD ( val, val, fold ) ; - fold = g.shfl_down ( val, 1) ; - GB_ADD ( val, val, fold ) ; - return (val) ; // note: only thread 0 will return full val -} +#include "GB_cuda_shfl_down.cuh" //------------------------------------------------------------------------------ // GB_block_Reduce: reduce across all warps into a single scalar //------------------------------------------------------------------------------ -template -__inline__ __device__ -T_Z GB_block_Reduce(thread_block g, T_Z val) +__inline__ __device__ GB_Z_TYPE GB_block_Reduce +( + thread_block g, + GB_Z_TYPE val +) { - static __shared__ T_Z shared [WARPSIZE] ; - int lane = threadIdx.x & (WARPSIZE-1) ; - int wid = threadIdx.x >> LOG2_WARPSIZE ; - thread_block_tile tile = tiled_partition( g ) ; + static __shared__ GB_Z_TYPE shared [tile_sz] ; + int lane = threadIdx.x & (tile_sz-1) ; + int wid = threadIdx.x >> log2_tile_sz ; + thread_block_tile tile = tiled_partition( g ) ; // Each warp performs partial reduction - val = GB_warp_Reduce( tile, val) ; + val = GB_cuda_warp_reduce_ztype (tile, val) ; // Wait for all partial reductions if (lane == 0) @@ -88,25 +61,25 @@ T_Z GB_block_Reduce(thread_block g, T_Z val) GB_DECLARE_IDENTITY_CONST (zid) ; // const GB_Z_TYPE zid = identity ; - val = (threadIdx.x < (blockDim.x >> LOG2_WARPSIZE)) ? - shared [lane] : zid ; + val = (threadIdx.x < (blockDim.x >> LOG2_WARPSIZE)) ? shared [lane] : zid ; // Final reduce within first warp - val = GB_warp_Reduce( tile, val) ; + val = GB_cuda_warp_reduce_ztype (tile, val) ; return (val) ; } //------------------------------------------------------------------------------ -// GB_jit_reduce: reduce all entries in a matrix to a single scalar +// GB_cuda_reduce_kernel: reduce all entries in a matrix to a single scalar //------------------------------------------------------------------------------ -template< typename T_A, typename T_Z> -__global__ void GB_jit_reduce // FIXME rename +__global__ void GB_cuda_reduce_kernel ( - GrB_Matrix A, // matrix to reduce + // output: void *zscalar, // scalar result, at least sizeof (uint32_t) GrB_Matrix V, // matrix result, for partial reduction (or NULL) - int64_t anz // # of entries in A: anz = GB_nnz_held (A) + // input: + GrB_Matrix A, // matrix to reduce + int64_t anz // # of entries in A ) { @@ -114,19 +87,20 @@ __global__ void GB_jit_reduce // FIXME rename // initializations //-------------------------------------------------------------------------- - const T_A *__restrict__ Ax = (T_A *) A->x ; + const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *) A->x ; - // each thread reduces its result into zmine, of type T_Z + // each thread reduces its result into zmine, of type GB_Z_TYPE GB_DECLARE_IDENTITY (zmine) ; // GB_Z_TYPE zmine = identity ; // On input, zscalar is already initialized to the monoid identity value. - // If T_Z has size less than 4 bytes, zscalar has been upscaled to 4 bytes. + // If GB_Z_TYPE has size less than 4 bytes, zscalar has been upscaled to 4 + // bytes. //-------------------------------------------------------------------------- // phase 1: each thread reduces a part of the matrix to its own scalar //-------------------------------------------------------------------------- - #if GB_A_IS_SPARSE || GB_A_IS_HYPERSPARSE + #if GB_A_IS_SPARSE || GB_A_IS_HYPER { //---------------------------------------------------------------------- @@ -180,7 +154,7 @@ __global__ void GB_jit_reduce // FIXME rename // A is bitmap //---------------------------------------------------------------------- - const uint8_t *__restrict__ Ab = A->b ; + const int8_t *__restrict__ Ab = A->b ; for (int64_t p = blockIdx.x * blockDim.x + threadIdx.x ; p < anz ; p += blockDim.x * gridDim.x) @@ -197,7 +171,7 @@ __global__ void GB_jit_reduce // FIXME rename // phase 2: each threadblock reduces all threads into a scalar //-------------------------------------------------------------------------- - zmine = GB_block_Reduce< T_Z >( this_thread_block(), zmine) ; + zmine = GB_block_Reduce( this_thread_block(), zmine) ; this_thread_block().sync() ; //-------------------------------------------------------------------------- @@ -229,3 +203,21 @@ __global__ void GB_jit_reduce // FIXME rename } } +//------------------------------------------------------------------------------ +// host function to launch the CUDA kernel +//------------------------------------------------------------------------------ + +extern "C" +{ + GB_JIT_CUDA_KERNEL_REDUCE_PROTO (GB_jit_kernel) ; +} + +GB_JIT_CUDA_KERNEL_REDUCE_PROTO (GB_jit_kernel) +{ + dim3 grid (gridsz) ; + dim3 block (blocksz) ; + GB_A_NHELD (anz) ; // anz = # of entries held in A + GB_cuda_reduce_kernel <<>> (zscalar, V, A, anz) ; + return (GrB_SUCCESS) ; +} + diff --git a/GraphBLAS/CUDA/README.txt b/GraphBLAS/CUDA/README.txt index 48ef3edd09..71d84593c4 100644 --- a/GraphBLAS/CUDA/README.txt +++ b/GraphBLAS/CUDA/README.txt @@ -2,11 +2,10 @@ GraphBLAS/CUDA: CUDA acceleration for SuiteSparse:GraphBLAS Dependencies: local_cub BSD 3-clause, (c) NVIDIA (part of CUDA Toolkit) - rmm_wrap Apache 2.0, (c) FIXME + rmm_wrap Apache 2.0, (c) NVIDIA cuCollections Apache 2.0, (c) NVIDIA Rapids cuco/cub BSD 3-clause, (c) NVIDIA cuco/libcudacxx BSD?, (c) NVIDIA cuco/libcxx Apache 2.0, (c) NVIDIA - google-benchmark ?, (c) Google diff --git a/GraphBLAS/CUDA/TODO.txt b/GraphBLAS/CUDA/TODO.txt index 4bc2524747..1b4fa1620e 100644 --- a/GraphBLAS/CUDA/TODO.txt +++ b/GraphBLAS/CUDA/TODO.txt @@ -1,3 +1,21 @@ +TODO (Mar 2024): + + set/get cuda archictures + CUDA PreJIT kernels + GB_cuda_matrix_advise: write it + dot3: allow iso + use a stream pool (from RMM) + can rmm_wrap be thread safe? + # of threadblocks in reduce + reduce calls GB_enumify_reduce twice + set/get which GPU(s) to use + data types > 32 bytes + handling nvcc compiler errors + static device function for computing ks (acts like GB_ek_slice, + so call it GB_ek_slice_device + +-------------------------------------------------------------------------------- + all the FIXMEs clean up comments and code style diff --git a/GraphBLAS/CUDA/Template/GB_cuda_atomics.cuh b/GraphBLAS/CUDA/Template/GB_cuda_atomics.cuh index 9eeddf43dc..6152d003e9 100644 --- a/GraphBLAS/CUDA/Template/GB_cuda_atomics.cuh +++ b/GraphBLAS/CUDA/Template/GB_cuda_atomics.cuh @@ -2,7 +2,13 @@ // GraphBLAS/CUDA/Template/GB_cuda_atomics.cuh: CUDA atomics for GraphBLAS //------------------------------------------------------------------------------ -// yet still more stuff here +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +// SPDX-License-Identifier: BSD-3-Clause + +//------------------------------------------------------------------------------ + +// Atomic device functions for CUDA JIT kernels. Not used on the host. /* * Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. @@ -31,41 +37,40 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * SPDX-License-Identifier: BSD-3-Clause */ //------------------------------------------------------------------------------ // Specializations for different atomic operations on different types //------------------------------------------------------------------------------ -// No 1-byte methods are available (bool, uint8_t, int8_t), because CUDA does -// not support atomicCAS for a single byte. Instead, to compute a single byte -// atomically, GraphBLAS must operate on a larger temporary type (typically -// uint32_t, but it could also use a 16-bit type), and when all results are -// computed and the kernel launch is done, the final value is copied to the -// single byte result on the host. +// No 1- or 2-byte methods are available (bool, uint8_t, int8_t, uint16_t, +// int16_t), because CUDA does not support atomicCAS for just one or two bytes. +// Instead, to compute one or two bytes atomically, GraphBLAS must operate on a +// larger temporary type (typically uint32_t) and when all results are computed +// and the kernel launch is done, the final value is copied to the one or two +// bytes result on the host. // // The GxB_FC64_t type is supported only by GB_cuda_atomic_add. // // GB_cuda_atomic_write, GB_cuda_atomic_times: // -// int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, +// int32_t, uint32_t, int64_t, uint64_t, // float, double, and GxB_FC32_t (not GxB_FC64_t). // // GB_cuda_atomic_min, GB_cuda_atomic_max: // -// int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, +// int32_t, uint32_t, int64_t, uint64_t, // float, and double (not GxB_FC32_t or GxB_FC64_t). // // GB_cuda_atomic_add: // -// int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t, +// int32_t, uint32_t, int64_t, uint64_t, // float, double, GxB_FC32_t, and GxB_FC64_t. // // GB_cuda_atomic_bor, GB_cuda_atomic_band, // GB_cuda_atomic_bxor, GB_cuda_atomic_bxnor : // -// uint16_t, uint32_t, uint64_t +// uint32_t, uint64_t // // GB_cuda_atomic_lock, GB_cuda_atomic_unlock: // @@ -95,49 +100,9 @@ __device__ __inline__ void GB_cuda_unlock (uint32_t *mutex) ; // GB_cuda_atomic_write //------------------------------------------------------------------------------ -// atomic write (16, 32, and 64 bits) +// atomic write (32 and 64 bits) // no atomic write for GxB_FC64_t -template<> __device__ __inline__ void GB_cuda_atomic_write -( - int16_t *ptr, // target to modify - int16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int v = GB_PUN (unsigned short int, val) ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // modify it atomically: - old = atomicCAS (p, assumed, v) ; - } - while (assumed != old) ; -} - -template<> __device__ __inline__ void GB_cuda_atomic_write -( - uint16_t *ptr, // target to modify - uint16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int v = (unsigned short int) val ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // modify it atomically: - old = atomicCAS (p, assumed, v) ; - } - while (assumed != old) ; -} - template<> __device__ __inline__ void GB_cuda_atomic_write ( int32_t *ptr, // target to modify @@ -217,48 +182,7 @@ template<> __device__ __inline__ void GB_cuda_atomic_write // GB_cuda_atomic_add for built-in types //------------------------------------------------------------------------------ -// types: int and uint [16,32,64], float, double, GxB_FC32_t, complex double - -template<> __device__ __inline__ void GB_cuda_atomic_add -( - int16_t *ptr, // target to modify - int16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // compute the new value: - int16_t new_value = GB_PUN (int16_t, assumed) + val ; - // modify it atomically: - old = atomicCAS (p, assumed, GB_PUN (unsigned short int, new_value)) ; - } - while (assumed != old) ; -} - -template<> __device__ __inline__ void GB_cuda_atomic_add -( - uint16_t *ptr, // target to modify - uint16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int v = (unsigned short int) val ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // modify it atomically: - old = atomicCAS (p, assumed, assumed + v) ; - } - while (assumed != old) ; -} +// types: int and uint [32,64], float, double, GxB_FC32_t, complex double template<> __device__ __inline__ void GB_cuda_atomic_add ( @@ -351,50 +275,9 @@ template<> __device__ __inline__ void GB_cuda_atomic_add // GB_cuda_atomic_times for built-in types //------------------------------------------------------------------------------ -// types: int and uint [16,32,64], float, double, GxB_FC32_t +// types: int and uint [32,64], float, double, GxB_FC32_t // no GxB_FC64_t. -template<> __device__ __inline__ void GB_cuda_atomic_times -( - int16_t *ptr, // target to modify - int16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // compute the new value: - int16_t new_value = GB_PUN (int16_t, assumed) * val ; - // modify it atomically: - old = atomicCAS (p, assumed, GB_PUN (unsigned short int, new_value)) ; - } - while (assumed != old) ; -} - -template<> __device__ __inline__ void GB_cuda_atomic_times -( - uint16_t *ptr, // target to modify - uint16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int v = (unsigned short int) val ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // modify it atomically: - old = atomicCAS (p, assumed, assumed * v) ; - } - while (assumed != old) ; -} - template<> __device__ __inline__ void GB_cuda_atomic_times ( int32_t *ptr, // target to modify @@ -546,53 +429,9 @@ template<> __device__ __inline__ void GB_cuda_atomic_times // GB_cuda_atomic_min //------------------------------------------------------------------------------ -// types: int and uint [16,32,64], float, and double +// types: int and uint [32,64], float, and double // no complex types -template<> __device__ __inline__ void GB_cuda_atomic_min -( - int16_t *ptr, // target to modify - int16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // compute the new value - int16_t assumed_int16 = GB_PUN (int16_t, assumed) ; - int16_t new_value = GB_IMIN (assumed_int16, val) ; - // modify it atomically: - old = atomicCAS (p, assumed, GB_PUN (unsigned short int, new_value)) ; - } - while (assumed != old) ; -} - -template<> __device__ __inline__ void GB_cuda_atomic_min -( - uint16_t *ptr, // target to modify - uint16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int v = (unsigned short int) val ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // compute the new value - unsigned short int new_value = GB_IMIN (assumed, v) ; - // modify it atomically: - old = atomicCAS (p, assumed, new_value) ; - } - while (assumed != old) ; -} - template<> __device__ __inline__ void GB_cuda_atomic_min ( int32_t *ptr, // target to modify @@ -679,53 +518,9 @@ template<> __device__ __inline__ void GB_cuda_atomic_min // GB_cuda_atomic_max //------------------------------------------------------------------------------ -// types: int and uint [16,32,64], float, and double +// types: int and uint [32,64], float, and double // no complex types -template<> __device__ __inline__ void GB_cuda_atomic_max -( - int16_t *ptr, // target to modify - int16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // compute the new value - int16_t assumed_int16 = GB_PUN (int16_t, assumed) ; - int16_t new_value = GB_IMIN (assumed_int16, val) ; - // modify it atomically: - old = atomicCAS (p, assumed, GB_PUN (unsigned short int, new_value)) ; - } - while (assumed != old) ; -} - -template<> __device__ __inline__ void GB_cuda_atomic_max -( - uint16_t *ptr, // target to modify - uint16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int v = (unsigned short int) val ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // compute the new value - unsigned short int new_value = GB_IMIN (assumed, v) ; - // modify it atomically: - old = atomicCAS (p, assumed, new_value) ; - } - while (assumed != old) ; -} - template<> __device__ __inline__ void GB_cuda_atomic_max ( int32_t *ptr, // target to modify @@ -812,27 +607,7 @@ template<> __device__ __inline__ void GB_cuda_atomic_max // GB_cuda_atomic_bor //------------------------------------------------------------------------------ -// bitwise: on uint [16,32,64] - -template<> __device__ __inline__ void GB_cuda_atomic_bor -( - uint16_t *ptr, // target to modify - uint16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int v = (unsigned short int) val ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // modify it atomically: - old = atomicCAS (p, assumed, assumed | v) ; - } - while (assumed != old) ; -} +// bitwise: on uint [32,64] template<> __device__ __inline__ void GB_cuda_atomic_bor ( @@ -858,27 +633,7 @@ template<> __device__ __inline__ void GB_cuda_atomic_bor // GB_cuda_atomic_band //------------------------------------------------------------------------------ -// bitwise: on uint [16,32,64] - -template<> __device__ __inline__ void GB_cuda_atomic_band -( - uint16_t *ptr, // target to modify - uint16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int v = (unsigned short int) val ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // modify it atomically: - old = atomicCAS (p, assumed, assumed & v) ; - } - while (assumed != old) ; -} +// bitwise: on uint [32,64] template<> __device__ __inline__ void GB_cuda_atomic_band ( @@ -904,27 +659,7 @@ template<> __device__ __inline__ void GB_cuda_atomic_band // GB_cuda_atomic_bxor //------------------------------------------------------------------------------ -// bitwise: on uint [16,32,64] - -template<> __device__ __inline__ void GB_cuda_atomic_bxor -( - uint16_t *ptr, // target to modify - uint16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int v = (unsigned short int) val ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // modify it atomically: - old = atomicCAS (p, assumed, assumed ^ v) ; - } - while (assumed != old) ; -} +// bitwise: on uint [32,64] template<> __device__ __inline__ void GB_cuda_atomic_bxor ( @@ -950,27 +685,7 @@ template<> __device__ __inline__ void GB_cuda_atomic_bxor // GB_cuda_atomic_bxnor //------------------------------------------------------------------------------ -// bitwise: on uint [16,32,64] - -template<> __device__ __inline__ void GB_cuda_atomic_bxnor -( - uint16_t *ptr, // target to modify - uint16_t val // value to modify the target with -) -{ - unsigned short int *p = (unsigned short int *) ptr ; - unsigned short int v = (unsigned short int) val ; - unsigned short int assumed ; - unsigned short int old = *p ; - do - { - // assume the old value - assumed = old ; - // modify it atomically: - old = atomicCAS (p, assumed, ~(assumed ^ v)) ; - } - while (assumed != old) ; -} +// bitwise: on uint [32,64] template<> __device__ __inline__ void GB_cuda_atomic_bxnor ( diff --git a/GraphBLAS/CUDA/Template/GB_cuda_buckets.h b/GraphBLAS/CUDA/Template/GB_cuda_buckets.h deleted file mode 100644 index 57cc9ebc4a..0000000000 --- a/GraphBLAS/CUDA/Template/GB_cuda_buckets.h +++ /dev/null @@ -1,59 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/Template/GB_cuda_buckets.h: bucket definitions for dot3 -//------------------------------------------------------------------------------ - -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -// FIXME: rename this file to GB_cuda_dot3_buckets.h (or .cuh? .hpp?) - -//------------------------------------------------------------------------------ - -#ifndef GB_CUDA_BUCKETS_H -#define GB_CUDA_BUCKETS_H - -#define NBUCKETS 3 - -// NBUCKETS buckets: computed by up to NBUCKETS-1 kernel launches (zombies need -// no work...), each using different kernels (with different configurations -// depending on the bucket). - -// dot3: C=A'B, M is sparse or hyper, C is sparse or hyper -// 32 kernels A,B: (hyper,sparse,bitmap,full)^2 x (M and C are sparse/hyper) - -// FIXME: rename enum values to GB_DOT3_BUCKET* -typedef enum -{ - GB_BUCKET_ZOMBIE = 0, // C(i,j) is a zombie (not a bucket) - // both A and B are sparse/hyper: - GB_BUCKET_VSVS = 1, // vsvs: both A(:,i) and B(:,j) are very sparse - GB_BUCKET_MERGEPATH = 2, // mp: use the merge-path method - // A is sparse/hyper and B is bitmap/full, or - // A is bitmap/full and B is sparse/hyper - GB_BUCKET_VSDN = 1, // vsdn: the sparse vector is very sparse - GB_BUCKET_SPDN = 2, // spdn: sparse vector has lots of entries; - // use a whole warp for each dot product -} -GB_bucket_code ; // FIXME: rename GB_dot3_bucket_code - -// These may use another bucket enum: - - // two full/(sparse,hyper) kernels: - // // CUDA kernel: spdn, handles 4 buckets: - // // A(:,i) is dense and B(:,j) is very sparse (< 256 entries) - // GB_BUCKET_DNVS = 2, - // // A(:,i) is dense and B(:,j) is sparse (>= 256 entries) - // GB_BUCKET_DNSP = 3, - - // a sparse/full kernel - // // A(:,i) is very sparse (< 256 entries) and B(:,j) is dense - // GB_BUCKET_VSDN = 4, - // // A(:,i) is sparse (>= 256 entries) and B(:,j) is dense - // GB_BUCKET_SPDN = 5, - - // a sparse/bitmap kernel - // a bitmap/bitmap kernel - // a bitmap/sparse kernel - // ... - -#endif diff --git a/GraphBLAS/CUDA/Template/GB_cuda_dot3_defn.h b/GraphBLAS/CUDA/Template/GB_cuda_dot3_defn.h deleted file mode 100644 index 651ec5c064..0000000000 --- a/GraphBLAS/CUDA/Template/GB_cuda_dot3_defn.h +++ /dev/null @@ -1,72 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/Template/GB_cuda_dot3_defn.h: defns just for dot3 -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -// FIXME: rename this to .cuh? It is only #included by GB_cuda_jit* - -#pragma once - -//------------------------------------------------------------------------------ -// operators -//------------------------------------------------------------------------------ - -#if GB_C_ISO - -// GB_MULTADD now defined in header -// #define GB_MULTADD( c, a ,b, i, k, j) - #define GB_DOT_TERMINAL( c ) break - #define GB_DOT_MERGE(pA,pB) \ - { \ - cij_exists = true ; \ - } - #define GB_CIJ_EXIST_POSTCHECK - -#else - -// GB_MULTADD now defined in header -// #define GB_MULTADD( c, a, b, i, k, j ) \ -// { \ -// GB_Z_TYPE x_op_y ; \ -// GB_MULT ( x_op_y, a, b, i, k, j ) ; /* x_op_y = a*b */ \ -// GB_ADD ( c, c, x_op_y ) ; /* c += x_op_y */ \ -// } - - #define GB_DOT_TERMINAL( c ) GB_IF_TERMINAL_BREAK ( c, zterminal ) - - #if GB_IS_PLUS_PAIR_REAL_SEMIRING - - // cij += A(k,i) * B(k,j), for merge operation (plus_pair_real semiring) - #if GB_Z_IGNORE_OVERFLOW - // plus_pair for int64, uint64, float, or double - #define GB_DOT_MERGE(pA,pB) cij++ ; - #define GB_CIJ_EXIST_POSTCHECK cij_exists = (cij != 0) ; - #else - // plus_pair semiring for small integers - #define GB_DOT_MERGE(pA,pB) \ - { \ - cij_exists = true ; \ - cij++ ; \ - } - #define GB_CIJ_EXIST_POSTCHECK - #endif - - #else - - // cij += A(k,i) * B(k,j), for merge operation (general case) - #define GB_DOT_MERGE(pA,pB) \ - { \ - GB_GETA ( aki, Ax, pA, ) ; /* aki = A(k,i) */ \ - GB_GETB ( bkj, Bx, pB, ) ; /* bkj = B(k,j) */ \ - cij_exists = true ; \ - GB_MULTADD ( cij, aki, bkj, i, k, j ) ; /* cij += aki * bkj */ \ - } - #define GB_CIJ_EXIST_POSTCHECK - - #endif - -#endif - diff --git a/GraphBLAS/CUDA/Template/GB_cuda_ek_slice.cuh b/GraphBLAS/CUDA/Template/GB_cuda_ek_slice.cuh new file mode 100644 index 0000000000..8b864a22fd --- /dev/null +++ b/GraphBLAS/CUDA/Template/GB_cuda_ek_slice.cuh @@ -0,0 +1,192 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/Template/GB_cuda_ek_slice.cuh +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ +// GB_cuda_ek_slice_setup +//------------------------------------------------------------------------------ + +static __device__ __inline__ int64_t GB_cuda_ek_slice_setup +( + // inputs, not modified: + const int64_t *Ap, // array of size anvec+1 + const int64_t anvec, // # of vectors in the matrix A + const int64_t anz, // # of entries in the sparse/hyper matrix A + const int64_t pfirst, // first entry in A to find k + const int64_t max_pchunk, // max # of entries in A to find k + // output: + int64_t *my_chunk_size, // size of the chunk for this threadblock + int64_t *anvec1, // anvec-1 + float *slope // slope of vectors from kfirst to klast +) +{ + + //-------------------------------------------------------------------------- + // determine the range of entryes pfirst:plast-1 for this chunk + //-------------------------------------------------------------------------- + + // The slice for each threadblock contains entries pfirst:plast-1 of A. + // The threadblock works on a chunk of entries in Ai/Ax [pfirst...plast-1]. + + ASSERT (pfirst < anz) ; + ASSERT (max_pchunk > 0) ; + int64_t plast = pfirst + max_pchunk ; + plast = GB_IMIN (plast, anz) ; + (*my_chunk_size) = plast - pfirst ; + ASSERT ((*my_chunk_size) > 0) ; + + //-------------------------------------------------------------------------- + // estimate the first and last vectors for this chunk + //-------------------------------------------------------------------------- + + // find kfirst, the first vector of the slice for this chunk. kfirst is + // the vector that owns the entry Ai [pfirst] and Ax [pfirst]. The search + // does not need to be exact, so kfirst is an estimate. + + int64_t kfirst = 0 ; + int64_t kright = anvec ; + GB_TRIM_BINARY_SEARCH (pfirst, Ap, kfirst, kright) ; + + // find klast, the last vector of the slice for this chunk. klast is the + // vector that owns the entry Ai [plast-1] and Ax [plast-1]. The search + // does not have to be exact, so klast is an estimate. + + int64_t klast = kfirst ; + kright = anvec ; + GB_TRIM_BINARY_SEARCH (plast, Ap, klast, kright) ; + + //-------------------------------------------------------------------------- + // find slope of vectors in this chunk, and return result + //-------------------------------------------------------------------------- + + // number of vectors in A for this chunk, where + // Ap [kfirst:klast-1] will be searched. + int64_t nk = klast - kfirst + 1 ; + + // slope is the estimated # of vectors in this chunk, divided by the + // chunk size. + (*slope) = ((float) nk) / ((float) (*my_chunk_size)) ; + + (*anvec1) = anvec - 1 ; + return (kfirst) ; +} + +//------------------------------------------------------------------------------ +// GB_cuda_ek_slice_entry +//------------------------------------------------------------------------------ + +// Let p = kk + pfirst, where kk ranges from 0:my_chunk_size-1, and so p ranges +// from kk:(kk+my_chunk_size-1), and where my_chunk_size is normally of size +// max_pchunk, unless this is the last chunk in the entire matrix. +// GB_cuda_ek_slice_entry computes k for this entry, so that the kth vector +// contains the entry aij with row index i = Ai [p] and value aij = Ax [p] +// (assuming that A is a sparse or hypersparse matrix held by column). That +// is, Ap [k] <= p < Ap [k+1] will hold. If A is sparse and held by column, +// then aij is in column j = k. If A is hypersparse, then aij is in column j = +// Ah [k]. + +// The method returns the index k of the vector in A that contains the pth +// entry in A, at position p = kk + pfirst. + +static __device__ __inline__ int64_t GB_cuda_ek_slice_entry +( + // inputs, not modified: + const int64_t kk, // find the k value of the kkth entry + const int64_t pfirst, // first entry in A to find k (for which kk=0) + const int64_t *Ap, // array of size anvec+1 + const int64_t anvec1, // anvec-1 + const int64_t kfirst, // estimate of first vector in the chunk + const float slope // estimate # vectors in chunk / my_chunk_size +) +{ + + // get a rough estimate of k for the kkth entry + int64_t k = kfirst + (int64_t) (slope * ((float) kk)) ; + + // The estimate of k cannot be smaller than kfirst, but it might be bigger + // than anvec-1, so ensure it is in the valid range, kfirst to anvec-1. + k = GB_IMIN (k, anvec1) ; + + // look for p in Ap, where p is in range pfirst:plast-1 + // where pfirst >= 0 and plast < anz + int64_t p = kk + pfirst ; + + // linear-time search for the k value of the pth entry + while (Ap [k+1] <= p) k++ ; + while (Ap [k ] > p) k-- ; + + // the pth entry of A is contained in the kth vector of A + ASSERT (Ap [k] <= p && p < Ap [k+1]) ; + + // return the result k + return (k) ; +} + +//------------------------------------------------------------------------------ +// GB_cuda_ek_slice +//------------------------------------------------------------------------------ + +// GB_cuda_ek_slice finds the vector k that owns each entry in the sparse or +// hypersparse matrix A, in Ai/Ax [pfirst:plast-1], where plast = min (anz, +// pfirst+max_pchunk). Returns my_chunk_size = plast - pfirst, which is the +// size of the chunk operated on by this threadblock. + +// The function GB_cuda_ek_slice behaves somewhat like GB_ek_slice used on the +// CPU. The latter is for OpenMP parallelism on the CPU only; it does not +// need to compute ks. + +static __device__ __inline__ int64_t GB_cuda_ek_slice // returns my_chunk_size +( + // inputs, not modified: + const int64_t *Ap, // array of size anvec+1 + const int64_t anvec, // # of vectors in the matrix A + const int64_t anz, // # of entries in the sparse/hyper matrix A + const int64_t pfirst, // first entry in A to find k + const int64_t max_pchunk, // max # of entries in A to find k + // output: + int64_t *ks // k value for each pfirst:plast-1 +) +{ + + //-------------------------------------------------------------------------- + // determine the chunk for this threadblock and its slope + //-------------------------------------------------------------------------- + + int64_t my_chunk_size, anvec1 ; + float slope ; + int64_t kfirst = GB_cuda_ek_slice_setup (Ap, anvec, anz, pfirst, + max_pchunk, &my_chunk_size, &anvec1, &slope) ; + + //-------------------------------------------------------------------------- + // find the kth vector that contains each entry p = pfirst:plast-1 + //-------------------------------------------------------------------------- + + for (int64_t kk = threadIdx.x ; kk < my_chunk_size ; kk += blockDim.x) + { + + //---------------------------------------------------------------------- + // determine the kth vector that contains the pth entry + //---------------------------------------------------------------------- + + int64_t k = GB_cuda_ek_slice_entry (kk, pfirst, Ap, anvec1, kfirst, + slope) ; + + //---------------------------------------------------------------------- + // save the result in ks + //---------------------------------------------------------------------- + + ks [kk] = k ; + } + + //-------------------------------------------------------------------------- + // sync all threads and return result + //-------------------------------------------------------------------------- + + this_thread_block().sync() ; + return (my_chunk_size) ; +} + diff --git a/GraphBLAS/CUDA/Template/GB_cuda_error.hpp b/GraphBLAS/CUDA/Template/GB_cuda_error.hpp new file mode 100644 index 0000000000..fe7815c6c2 --- /dev/null +++ b/GraphBLAS/CUDA/Template/GB_cuda_error.hpp @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/GB_cuda_error.hpp: call a cuda method and check its result +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +#ifndef GB_CUDA_ERROR_HPP +#define GB_CUDA_ERROR_HPP + +//------------------------------------------------------------------------------ +// CUDA_OK: like GB_OK but for calls to cuda* methods +//------------------------------------------------------------------------------ + +// FIXME: GrB_NO_VALUE means something in CUDA failed, and the caller will then +// do the computation on the CPU. Need to turn off the JIT for CUDA kernels +// (but not CPU kernels) if some CUDA error occurred. Current JIT control does +// not distinguish between CPU and CUDA failures. + +#define CUDA_OK(cudaMethod) \ +{ \ + cudaError_t cuda_error = cudaMethod ; \ + if (cuda_error != cudaSuccess) \ + { \ + GrB_Info info = (cuda_error == cudaErrorMemoryAllocation) ? \ + GrB_OUT_OF_MEMORY : GrB_NO_VALUE ; \ + GBURBLE ("(cuda failed: %d:%s file:%s line:%d) ", (int) cuda_error, \ + cudaGetErrorString (cuda_error), __FILE__, __LINE__) ; \ + GB_FREE_ALL ; \ + return (info) ; \ + } \ +} + +#endif + diff --git a/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh new file mode 100644 index 0000000000..4c202eeaf5 --- /dev/null +++ b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_dense_phase1.cuh @@ -0,0 +1,122 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_dense_phase1.cuh +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +// phase1 for dot3, A and B are bitmap/full. +// dense phase1: symbolic load balancing and data partition. + +// This kernel scans the non-zero pattern in A and B, takes into account the +// mask and computes total work required to form C. Then it computes the vector +// k that contains each entry C(i,j) that isn't a zombie, or sets C(i,j) to its +// zombie status. + +//------------------------------------------------------------------------------ +// GB_cuda_AxB_dot3_dense_phase1_kernel: lookup i,k pairs and store in Ci +//------------------------------------------------------------------------------ + +// GB_cuda_AxB_dot3_dense_phase1_kernel is a CUDA kernel that scans all entries +// in M and assigns i,j coordinates for each entries and stores in Mi and Ci. +// A and B are both bitmap/full. C and M are sparse/hypersparse. + +__global__ void GB_cuda_AxB_dot3_dense_phase1_kernel +( + // input/output: + GrB_Matrix C, // final output matrix + const GrB_Matrix M // mask matrix +) +{ + + //-------------------------------------------------------------------------- + // get C, M, A, and B + //-------------------------------------------------------------------------- + + const int64_t *__restrict__ Mp = M->p ; + const int64_t *__restrict__ Mi = M->i ; + #if !GB_MASK_STRUCT + const GB_M_TYPE *__restrict__ Mx = (GB_M_TYPE *) M->x ; + #endif + const int64_t mnvec = M->nvec ; + const GB_M_NVALS (mnz) ; + + int64_t *__restrict__ Ci = C->i ; // for zombies, or vector k + + // Ci [p] for an entry C(i,j) contains either GB_FLIP(i) if C(i,j) is a + // zombie, or k otherwise, where C(:,j) is the kth vector of C (j = Ch [k] + // if hypersparse or j = k if standard sparse). + + //-------------------------------------------------------------------------- + // determine the vector k of all entries in C(i,j), one chunk at a time + //-------------------------------------------------------------------------- + +#if 0 + __shared__ int64_t ks [chunk_size] ; +#endif + +// int64_t chunk_max = GB_ICEIL (mnz, chunk_size) ; +// for (int64_t chunk = blockIdx.x ; chunk < chunk_max ; chunk += gridDim.x ) + + for (int64_t pfirst = blockIdx.x << log2_chunk_size ; + pfirst < mnz ; + pfirst += gridDim.x << log2_chunk_size) + { + + //---------------------------------------------------------------------- + // find the vector k that contains each entry C(i,j) in this chunk + //---------------------------------------------------------------------- + + // This threadblock works on Mi/Mx and Ci/Cx, in positions pfirst to + // pfirst + my_chunk_size - 1. + +#if 0 + int64_t my_chunk_size = GB_cuda_ek_slice (Mp, mnvec, mnz, pfirst, + chunk_size, /* output: */ ks) ; +#else + int64_t my_chunk_size, mnvec1 ; + float slope ; + int64_t kfirst = GB_cuda_ek_slice_setup (Mp, mnvec, mnz, pfirst, + chunk_size, &my_chunk_size, &mnvec1, &slope) ; +#endif + + //---------------------------------------------------------------------- + // assign entries in C(i,j): either its vector k or its zombie status + //---------------------------------------------------------------------- + +// for (int64_t pM = pfirst + threadIdx.x ; +// pM < pfirst + my_chunk_size ; +// pM += blockDim.x) + + for (int64_t kk = threadIdx.x ; kk < my_chunk_size ; kk += blockDim.x) + { + +#if 0 + int64_t k = ks [kk] ; // get the k value of Mi,Mx [pM]. +#else + int64_t k = GB_cuda_ek_slice_entry (kk, pfirst, Mp, mnvec1, kfirst, + slope) ; +#endif + + int64_t pM = kk + pfirst ; + + #if GB_MASK_STRUCT + { + // no need to check the value of M(i,j); no prezombies + Ci [pM] = k ; + } + #else + { + bool mij = (bool) GB_MCAST (Mx, pM, ) ; + int64_t i = Mi [pM] ; + Ci [pM] = (!mij) * (GB_FLIP (i)) + + mij * (k) ; + } + #endif + } + } +} + diff --git a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase1.cuh b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh similarity index 63% rename from GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase1.cuh rename to GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh index 23b6b272aa..346b5de04a 100644 --- a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase1.cuh +++ b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase1.cuh @@ -2,6 +2,8 @@ // GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase1.cuh //------------------------------------------------------------------------------ +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ @@ -11,27 +13,9 @@ // dot3, phase1: symbolic load balancing and data partition // to assign work to different 'buckets' for later compute -// This kernel scans the non-zero pattern in A and B, takes into account the -// mask and computes total work required to form C. Then it classifies each -// dot product into a set of buckets for efficient compute. - -#pragma once - -#include -#include -#include "GB_cuda_kernel.h" -#include "GB_mxm_shared_definitions.h" -#include "GB_hash.h" -#include "GB_hyper_hash_lookup.h" -#include "GB_cuda_buckets.h" -#include -#include - -using namespace cooperative_groups; - -//------------------------------------------------------------------------------ -// GB_jit_AxB_dot3_phase1: build nanobuckets, hunt for pre-zombies -//------------------------------------------------------------------------------ +// This kernel scans the non-zero pattern in A and B, takes into account the +// mask and computes total work required to form C. Then it classifies each dot +// product into a set of buckets for efficient compute. // GB_AxB_cuda_dot3_phase1 is a CUDA kernel that scans all entries in C and // assigns them to each of the NBUCKETS buckets. The output is a @@ -54,8 +38,7 @@ using namespace cooperative_groups; // FIXME: What if all entries are in one bucket; // can we skip the bucket creation? -template -__global__ void GB_jit_AxB_dot3_phase1 +__global__ void GB_jit_AxB_dot3_phase1_kernel ( // outputs, preallocated in global memory: int64_t *nanobuckets, // array of size NBUCKETS-blockDim.x-by-gridDim.x @@ -73,30 +56,26 @@ __global__ void GB_jit_AxB_dot3_phase1 // get C, M, A, and B //-------------------------------------------------------------------------- + #if GB_M_IS_HYPER const int64_t *__restrict__ Mh = M->h ; + #endif const int64_t *__restrict__ Mp = M->p ; const int64_t *__restrict__ Mi = M->i ; #if !GB_MASK_STRUCT const GB_M_TYPE *__restrict__ Mx = (GB_M_TYPE *) M->x ; #endif const int64_t mnvec = M->nvec ; - const int64_t mvlen = M->vlen ; -// const int64_t mnz = GB_nnz(M) ; + // const int64_t mvlen = M->vlen ; const GB_M_NVALS (mnz) ; - const bool M_is_hyper = M->h != NULL ; ASSERT (GB_M_IS_SPARSE || GB_M_IS_HYPER) ; + #if GB_A_IS_SPARSE || GB_A_IS_HYPER const int64_t *__restrict__ Ap = A->p ; - const int64_t *__restrict__ Ai = A->i ; - const int64_t avlen = A->vlen ; -// const int64_t anz = GB_nnz(A) ; - const GB_A_NVALS (anz) ; + #endif + #if GB_B_IS_SPARSE || GB_B_IS_HYPER const int64_t *__restrict__ Bp = B->p ; - const int64_t *__restrict__ Bi = B->i ; - const int64_t bvlen = B->vlen ; -// const int64_t bnz = GB_nnz(B); - const GB_B_NVALS (bnz) ; + #endif #if GB_A_IS_HYPER const int64_t anvec = A->nvec ; @@ -131,139 +110,124 @@ __global__ void GB_jit_AxB_dot3_phase1 //-------------------------------------------------------------------------- // clear the bucket counters //-------------------------------------------------------------------------- - int64_t my_bucket[NBUCKETS]; - - // ASSERT (mnz > 0) ; - // ASSERT (gridDim.x <= mnz) ; + int64_t my_bucket [NBUCKETS] ; // each thread uses NBUCKETS bucket counters, held in register #pragma unroll - for(int b = 0; b < NBUCKETS; ++b) { - my_bucket[b] = 0; + for (int b = 0 ; b < NBUCKETS ; b++) + { + my_bucket [b] = 0 ; } - __shared__ int64_t ks [chunk_size] ; - //-------------------------------------------------------------------------- - // assign all entries of C to the buckets + // assign buckets to all entries in C(i,j), one chunk at a time //-------------------------------------------------------------------------- - // all threads in this block will compute the same values for these: - int64_t pfirst, plast, kfirst, klast ; +#if 0 + // removing ks saves about 10% of the phase1 time + // (19.5 msec to 17.5 msec for the com-Orkut matrix) + __shared__ int64_t ks [chunk_size] ; +#endif - int64_t chunk_max = GB_ICEIL (mnz, chunk_size) ; - // (mnz + chunk_size -1)/chunk_size; - for ( int64_t chunk = blockIdx.x; - chunk < chunk_max; - chunk += gridDim.x ) + for (int64_t pfirst = blockIdx.x << log2_chunk_size ; + pfirst < mnz ; + pfirst += gridDim.x << log2_chunk_size) { //---------------------------------------------------------------------- - // determine the work done by this iteration, "chunk" + // find the vector k that contains each entry C(i,j) in this chunk //---------------------------------------------------------------------- - // The slice for each task contains entries pfirst:plast-1 of M and C. - // This iteration "chunk" computes Ci and Cx [pfirst...plast-1], using - // Mi and Mx [pfirst:plast-1]. All threads in the thread block are - // used for this "chunk". - pfirst = chunk_size * chunk ; - plast = pfirst + chunk_size ; - // plast = GB_IMIN (plast, mnz) ; - if (plast > mnz) plast = mnz ; - int64_t my_chunk_size = plast - pfirst ; - - // find the first vector of the slice for this chunk: the - // vector that owns the entry Mi [pfirst] and Mx [pfirst]. - kfirst = GB_search_for_vector_device (pfirst, Mp, 0, mnvec, mvlen) ; - - // find the last vector of the slice for task blockIdx.x: the - // vector that owns the entry Mi [plast-1] and Mx [plast-1]. - klast = GB_search_for_vector_device (plast-1, Mp, kfirst, mnvec, mvlen); + // This threadblock works on Mi/Mx and Ci/Mx, in positions pfirst to + // pfirst + my_chunk_size - 1. - // number of vectors in C and M for this "chunk" iteration, where - // Mp [kfirst:klast] will be operated on. - int64_t nk = klast - kfirst + 1 ; +#if 0 + int64_t my_chunk_size = GB_cuda_ek_slice (Mp, mnvec, mnz, pfirst, + chunk_size, /* output: */ ks) ; +#else + int64_t my_chunk_size, mnvec1 ; + float slope ; + int64_t kfirst = GB_cuda_ek_slice_setup (Mp, mnvec, mnz, pfirst, + chunk_size, &my_chunk_size, &mnvec1, &slope) ; +#endif //---------------------------------------------------------------------- - // fill ks to find all indices + // assign entries in C(i,j) to the buckets //---------------------------------------------------------------------- - // search for k values for each entry pfirst:plast-1 - float slope = ((float) nk) / ((float) my_chunk_size) ; - int64_t mnvec1 = mnvec - 1 ; for (int64_t kk = threadIdx.x ; kk < my_chunk_size ; kk += blockDim.x) { - // get a rough estimate of k for the kkth entry in ks - int64_t k = kfirst + (int64_t) (slope * ((float) kk)) ; - // k cannot be smaller than kfirst, but might be bigger than - // mnvec-1, so ensure it is in the valid range, kfirst to mnvec-1 - // k = GB_IMIN (k, mnvec-1) ; - if (k > mnvec1) k = mnvec1 ; - // look for p in Mp, where p is in range pfirst:plast-1 - // where pfirst >= 0 and plast < mnz - int64_t p = kk + pfirst ; - // linear-time search for the k value of the pth entry - while ( Mp [ k + 1 ] <= p ) k++ ; - while ( Mp [ k ] > p ) k-- ; - ks [kk] = k ; - } - this_thread_block().sync(); - //---------------------------------------------------------------------- - // assign entries in C(i,j) to the buckets - //---------------------------------------------------------------------- + //------------------------------------------------------------------ + // determine the kth vector that contains the pth entry + //------------------------------------------------------------------ + +#if 0 + int64_t k = ks [kk] ; // get the k value of Mi,Mx [pM] +#else + int64_t k = GB_cuda_ek_slice_entry (kk, pfirst, Mp, mnvec1, kfirst, + slope) ; +#endif + + //------------------------------------------------------------------ + // get C(i,j): zombie if A(:,i) and B(:,j) are empty or M(i,j) false + //------------------------------------------------------------------ + + // C(i,j) is in the kth vector of C, where j == k if C is sparse, + // or j = Mh [k] if C is hypersparse - for ( int64_t pM = pfirst + threadIdx.x; - pM < pfirst + my_chunk_size; - pM += blockDim.x ) - { GB_bucket_code bucket = GB_BUCKET_ZOMBIE ; - int64_t k = ks [pM - pfirst] ; // get the k value of Mi,Mx [pM]. - int64_t i = Mi [ pM ] ; - int64_t j = GBH_M (Mh, k) ; // note that Ch and Mh are the same - if ( GB_MCAST ( Mx, pM, ) ) + int64_t pM = kk + pfirst ; + int64_t i = Mi [pM] ; + + if (GB_MCAST (Mx, pM, )) // if (M (i,j) is true): { //-------------------------------------------------------------- // get B(:,j) //-------------------------------------------------------------- - int64_t pB, pB_end ; + #if GB_B_IS_SPARSE || GB_B_IS_HYPER + int64_t j = GBH_M (Mh, k) ; // that Ch and Mh are the same + int64_t pB, pB_end, bjnz ; + #endif + #if GB_B_IS_HYPER GB_hyper_hash_lookup (Bh, bnvec, Bp, B_Yp, B_Yi, B_Yx, B_hash_bits, j, &pB, &pB_end) ; + bjnz = pB_end - pB ; + if (bjnz > 0) #elif GB_B_IS_SPARSE - pB = Bp[j] ; - pB_end = Bp[j+1] ; + pB = Bp [j] ; + pB_end = Bp [j+1] ; + bjnz = pB_end - pB ; // # of entries in B(:,j) + if (bjnz > 0) #else - // B is bitmap or full - pB = bvlen * j ; - pB_end = pB + j ; + // B is bitmap or full: no need to look up B(:,j) #endif - - int64_t bjnz = pB_end - pB ; - if (bjnz > 0) { //---------------------------------------------------------- // get A(:,i) //---------------------------------------------------------- - int64_t pA, pA_end ; + #if GB_A_IS_SPARSE || GB_A_IS_HYPER + int64_t pA, pA_end, ainz ; + #endif + #if GB_A_IS_HYPER GB_hyper_hash_lookup (Ah, anvec, Ap, A_Yp, A_Yi, A_Yx, A_hash_bits, i, &pA, &pA_end) ; + ainz = pA_end - pA ; + if (ainz > 0) #elif GB_A_IS_SPARSE - pA = Ap[i] ; - pA_end = Ap[i+1] ; + pA = Ap [i] ; + pA_end = Ap [i+1] ; + ainz = pA_end - pA ; // # of entries in A(:,i) + if (ainz > 0) #else - // A is bitmap or full - pA = avlen * i ; - pA_end = pA + i ; + // A is bitmap or full: no need to look up A(:,i) #endif - - int64_t ainz = pA_end - pA ; - if (ainz > 0) { // determine the bucket for C(i,j) #if (GB_A_IS_SPARSE || GB_A_IS_HYPER) && \ @@ -291,12 +255,20 @@ __global__ void GB_jit_AxB_dot3_phase1 } } - Ci[pM] = (bucket == GB_BUCKET_ZOMBIE) * ( GB_FLIP(i) << 4) - + (bucket != GB_BUCKET_ZOMBIE) * ((k<<4) + bucket) ; - my_bucket[bucket]++; + //------------------------------------------------------------------ + // assign C(i,j) to its bucket + //------------------------------------------------------------------ + + // encode the bucket or zombie status in the row index of C(i,j) + Ci [pM] = (bucket == GB_BUCKET_ZOMBIE) * ( GB_FLIP(i) << 4) + + (bucket != GB_BUCKET_ZOMBIE) * ((k<<4) + bucket) ; + + // each thread counts its own bucket sizes + my_bucket [bucket]++ ; } } - this_thread_block().sync(); + + this_thread_block().sync() ; //-------------------------------------------------------------------------- // cumulative sum of each bucket @@ -313,17 +285,17 @@ __global__ void GB_jit_AxB_dot3_phase1 nanobuckets + blockIdx.x * (NBUCKETS * blockDim.x) + threadIdx.x ; #pragma unroll - for (int b = 0; b < NBUCKETS; ++b) + for (int b = 0 ; b < NBUCKETS ; b++) { if ( threadIdx.x == blockDim.x-1) { blockbucket [blockIdx.x + b * gridDim.x] = my_bucket[b] ; } - this_thread_block().sync(); + this_thread_block().sync() ; BlockCumSum(temp_storage).ExclusiveSum( my_bucket[b], my_bucket[b]) ; - this_thread_block().sync(); + this_thread_block().sync() ; nanobucket [b * blockDim.x] = my_bucket[b] ; } @@ -337,7 +309,7 @@ __global__ void GB_jit_AxB_dot3_phase1 if (threadIdx.x == blockDim.x - 1 ) { #pragma unroll - for(int b = 0; b < NBUCKETS; ++b) + for (int b = 0; b < NBUCKETS; ++b) { blockbucket [b * gridDim.x + blockIdx.x] += my_bucket[b]; } diff --git a/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase2.cuh b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase2.cuh new file mode 100644 index 0000000000..171347573f --- /dev/null +++ b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase2.cuh @@ -0,0 +1,176 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/JitKernels/GB_cuda_jit_GB_AxB_dot3_phase2.cuh +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +// AxB_dot3_phase2: fill the global buckets + +//------------------------------------------------------------------------------ +// BlockPrefixCallbackOp +//------------------------------------------------------------------------------ + +// A stateful callback functor that maintains a running prefix to be applied +// during consecutive scan operations. +struct BlockPrefixCallbackOp +{ + // Running prefix + int64_t running_total ; + + // Constructor + __device__ BlockPrefixCallbackOp (int64_t running_total) : + running_total(running_total) {} + + // Callback operator to be entered by the first warp of threads in the + // block. Thread-0 is responsible for returning a value for seeding the + // block-wide scan. + __device__ int64_t operator()(int64_t block_aggregate) + { + int64_t old_prefix = running_total ; + running_total += block_aggregate ; + return old_prefix ; + } +} ; + +//------------------------------------------------------------------------------ +// blockBucketExclusiveSum +//------------------------------------------------------------------------------ + +__inline__ __device__ void blockBucketExclusiveSum +( + int bucketId, + int64_t *d_data, + int nblocks +) +{ + + // Specialize BlockScan for a 1D block of 32 threads + typedef cub::BlockScan BlockScan ; + + // Allocate shared memory for BlockScan + __shared__ typename BlockScan::TempStorage temp_storage ; + + // Initialize running total + BlockPrefixCallbackOp prefix_op (0) ; + + // Have the block iterate over segments of items + int64_t data = 0 ; + + int64_t *blockbucket = d_data ; + + for (int block_id = 0 ; block_id < nblocks ; block_id += blocksize) + { + // Load a segment of consecutive items that are blocked across threads + + int loc = block_id + threadIdx.x; + if (loc < nblocks) + { + data = blockbucket [bucketId*nblocks + loc] ; + } + this_thread_block().sync() ; + + // Collectively compute the block-wide exclusive prefix sum + BlockScan(temp_storage).ExclusiveSum (data, data, prefix_op) ; + this_thread_block().sync() ; + + if (loc < nblocks) + { + blockbucket [bucketId*nblocks + loc] = data ; + } + + // this_thread_block().sync(); + + data = 0 ; + } +} + +//------------------------------------------------------------------------------ +// GB_cuda_AxB_dot3_phase2_kernel +//------------------------------------------------------------------------------ + +// GB_cuda_AxB__dot3_phase2 is a CUDA kernel that takes as input the +// nanobuckets and blockbucket arrays computed by the first phase kernel, +// GB_cuda_AxB__dot3_phase1. The launch geometry of this kernel must match +// the GB_cuda_AxB_dot3_phase1 kernel, with the same # of threads and +// threadblocks. + +__global__ void GB_cuda_AxB_dot3_phase2_kernel +( + // input, not modified: + int64_t *__restrict__ blockbucket, // global bucket count, + // of size NBUCKETS*nblocks + // output: + int64_t *__restrict__ offset, // global offsets, for each bucket + // inputs, not modified: + const int nblocks // input number of blocks to reduce + // across, ie size of vector for 1 bucket +) +{ + + //-------------------------------------------------------------------------- + // sum up the bucket counts of prior threadblocks + //-------------------------------------------------------------------------- + + // blockbucket is an array of size NBUCKETS-by-nblocks, held by row. The + // entry blockbucket [bucket * nblocks + t] holds the # of entries + // in the bucket (in range 0 to NBUCKETS-1) found by threadblock t. + + uint64_t s [NBUCKETS] ; + + #pragma unroll + for (int b = 0 ; b < NBUCKETS ; b++) + { + s [b] = 0 ; + } + + thread_block_tile<32> tile = tiled_partition<32>(this_thread_block() ); + + #pragma unroll + for (int b = 0 ; b < NBUCKETS ; b++) + { + for (int64_t tid = threadIdx.x + blockIdx.x * blockDim.x ; + tid < nblocks ; + tid += blockDim.x*gridDim.x) + { + s [b] += blockbucket [b * nblocks + tid] ; + } + this_thread_block().sync(); + + s [b] = GB_cuda_warp_sum_uint64 (tile, s [b]) ; + } + + if (threadIdx.x == 0) + { + #pragma unroll + for (int b = 0 ; b < NBUCKETS ; b++) + { + atomicAdd ((unsigned long long int*) &(offset [b]), s [b]) ; + } + } + this_thread_block().sync(); + + if (gridDim.x >= NBUCKETS) + { + // Cumulative sum across blocks for each bucket + if (blockIdx.x i ; // for zombies, or bucket assignment + //int64_t *Mp = C->p ; // for offset calculations + //int64_t mnvec = C->nvec; + + //-------------------------------------------------------------------------- + // load and shift the nanobuckets for this thread block + //-------------------------------------------------------------------------- + + // The taskbucket for this threadblock is an array of size + // NBUCKETS-by-blockDim.x, held by row. It forms a 2D array within the 3D + // nanobuckets array. + const int64_t *taskbucket = nanobuckets + + blockIdx.x * (NBUCKETS * blockDim.x) ; + + // Each thread in this threadblock owns one column of this taskbucket, for + // its set of NBUCKETS nanobuckets. The nanobuckets are a column of length + // NBUCKETS, with stride equal to blockDim.x. + + const int64_t *nanobucket = taskbucket + threadIdx.x ; + + // Each thread loads its NBUCKETS nanobucket values into registers. + int64_t my_bucket [NBUCKETS] ; + + #pragma unroll + for (int b = 0 ; b < NBUCKETS ; b++) + { + my_bucket [b] = nanobucket [b * blockDim.x] + + blockbucket [b * gridDim.x + blockIdx.x] + + bucketp [b] ; + } + + // Now each thread has an index into the global set of NBUCKETS buckets, + // held in bucket, of where to place its own entries. + + //-------------------------------------------------------------------------- + // construct the global buckets + //-------------------------------------------------------------------------- + + // The slice for task blockIdx.x contains entries pfirst:plast-1 of M and + // C, which is the part of C operated on by this threadblock. + + // FIXME: why is bucket_idx needed? + __shared__ int64_t bucket_idx [chunk_size] ; + +// int64_t chunk_max = (cnz + chunk_size -1) / chunk_size ; +// for (int64_t chunk = blockIdx.x ; chunk < chunk_max ; chunk += gridDim.x) + + for (int64_t pfirst = blockIdx.x << log2_chunk_size ; + pfirst < cnz ; + pfirst += gridDim.x << log2_chunk_size) + { + + // pfirst = chunk_size * chunk ; + // plast = GB_IMIN( chunk_size * (chunk+1), cnz ) ; + int64_t plast = pfirst + chunk_size ; + plast = GB_IMIN (plast, cnz) ; + + for (int64_t p = pfirst + threadIdx.x ; p < plast ; p += blockDim.x) + { + // get the entry C(i,j), and extract its bucket. Then + // place the entry C(i,j) in the global bucket it belongs to. + int tid = p - pfirst ; + + // TODO: these writes to global are not coalesced. Instead: each + // threadblock could buffer its writes to NBUCKETS buffers and when + // the buffers are full they can be written to global. + + int ibucket = Ci [p] & 0xF; + + //bucket[my_bucket[ibucket]++] = p; + //int idx = (my_bucket[ibucket] - pfirst); + //my_bucket[ibucket] += 1; //blockDim.x ; + //int idx = (my_bucket[ibucket]++ - pfirst) & 0x7F; + //bucket_s[ibucket][ idx ] = p; + + bucket_idx [tid] = my_bucket [ibucket]++ ; + Ci [p] = (ibucket==0) * (Ci [p] >> 4) + (ibucket > 0) * Ci [p] ; + + //if(ibucket == 0) { + //// bucket[my_bucket[0]++] = p; + // Ci[p] = Ci[p] >> 4; + //} else { + // bucket[my_bucket[ibucket]++] = p; + //} + } + + // FIXME: can't this be merged with the loop above? Or is it a + // partial implementation of a coalesced write to the global bucket + // array? + + for (int64_t p = pfirst + threadIdx.x ; p < plast ; p += blockDim.x) + { + int tid = p - pfirst ; + bucket [bucket_idx [tid]] = p ; + } + } +} + diff --git a/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh new file mode 100644 index 0000000000..c36f35d0cc --- /dev/null +++ b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh @@ -0,0 +1,222 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_dndn.cuh +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +// This CUDA kernel produces the semiring product of two dense matrices of +// types GB_A_TYPE and GB_B_TYPE and common index space size n, to an output +// matrix of type GB_C_TYPE. The matrices are dense, with uniform non-zeros and +// sparsity patterns. ie. we want to produce C = A'*B in the sense of the +// given semi-ring. + +// This version uses a simple warp-based dense dot product algorithm, when the +// vectors coming from both A and B are dense, for any size of N. + +// Both the grid and block are 1D, so blockDim.x is the # threads in a +// threadblock, and the # of threadblocks is grid.x + +// Let b = blockIdx.x, and let s be blockDim.x. s= 32 with a variable number +// of active threads = min( min(nzA, nzB), 32) + +// Thus, threadblock b owns a semi-ring dot product on a pair of vectors. +// The work is to load the data, do the multiply and add work and finally +// reduce this data to a scalar, and write it to Cx[pair]. + +//------------------------------------------------------------------------------ +// GB_cuda_AxB_dot3_phase3_dndn_kernel +//------------------------------------------------------------------------------ + +__global__ void GB_cuda_AxB_dot3_phase3_dndn_kernel +( + GrB_Matrix C, // result matrix + GrB_Matrix M, // mask matrix + GrB_Matrix A, // input matrix A + GrB_Matrix B // input matrix B +) +{ + + //-------------------------------------------------------------------------- + // get C, M, A, and B + //-------------------------------------------------------------------------- + + #if !GB_A_IS_PATTERN + const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *)A->x ; + #endif + #if !GB_A_IS_PATTERN + const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *)B->x ; + #endif + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *)C->x ; + int64_t *__restrict__ Ci = C->i ; + const int64_t *__restrict__ Mi = M->i ; + #if GB_M_IS_HYPER + const int64_t *__restrict__ Mh = M->h ; + #endif + // A and B are either bitmap or full + #if GB_A_IS_BITMAP + const int8_t *__restrict__ Ab = A->b ; + #endif + #if GB_B_IS_BITMAP + const int8_t *__restrict__ Bb = B->b ; + #endif + + // zombie count + uint64_t zc = 0 ; + + GB_M_NVALS (mnz) ; + + // total items to be inspected + int64_t vlen = A->vlen ; + ASSERT (vlen == B->vlen) ; + ASSERT (vlen > 0) ; + + //-------------------------------------------------------------------------- + // compute C(i,j) = A(:,i)'*B(:,j) for each entry in M(i,j) + //-------------------------------------------------------------------------- + + for (int64_t pM = blockIdx.x ; pM < mnz ; pM += gridDim.x) + { + + //---------------------------------------------------------------------- + // get M(i,j) and C(i,j) + //---------------------------------------------------------------------- + + int64_t i = Mi [pM] ; + int64_t kth = Ci [pM] ; // C(i,j) is in the kth vector of C + bool cij_exists = false ; + GB_DECLARE_IDENTITY (cij) ; // GB_Z_TYPE cij = identity + + //---------------------------------------------------------------------- + // The threadblock cooperates to compute a single entry C(i,j) + //---------------------------------------------------------------------- + + #ifndef GB_MASK_STRUCT + // skip if C(i,j) is a prezombie + if (kth >= 0) + #endif + { + + // j = kth or j = Mh [kth] if C and M are hypersparse + int64_t j = GBH_M (Mh, kth) ; + int64_t pA = vlen * i ; + int64_t pB = vlen * j ; + + GB_DECLAREA (aki) ; + GB_DECLAREB (bkj) ; + + #if GB_A_IS_FULL && GB_B_IS_FULL + { + cij_exists = true ; + for (int64_t k = threadIdx.x ; k < vlen ; k += blockDim.x) + { + // cij += A(k,i) * B(k,j) + GB_GETA (aki, Ax, pA+k, ) ; // aki = A(k,i) + GB_GETB (bkj, Bx, pB+k, ) ; // bkj = B(k,j) + GB_MULTADD ( cij, aki, bkj, i, k, j ) ; // cij += aki * bkj + } + } + #elif GB_A_IS_BITMAP && GB_B_IS_BITMAP + { + for ( int64_t k = threadIdx.x ; k < vlen ; k += blockDim.x) + { + GB_GETA (aki, Ax, pA+k, ) ; // aki = A(k,i) + GB_GETB (bkj, Bx, pB+k, ) ; // bkj = B(k,j) + int8_t b = (Ab [pA+k] && Bb [pB+k]) ; + cij_exists |= b ; + if (b) + { + // cij += aki * bkj + GB_MULTADD ( cij, aki, bkj, i, k, j ) ; + } + } + } + #elif GB_A_IS_FULL && GB_B_IS_BITMAP + { + for ( int64_t k = threadIdx.x ; k < vlen ; k += blockDim.x) + { + if (Bb [pB+k]) + { + GB_GETA (aki, Ax, pA+k, ) ; // aki = A(k,i) + GB_GETB (bkj, Bx, pB+k, ) ; // bkj = B(k,j) + // cij += aki * bkj + GB_MULTADD ( cij, aki, bkj, i, k, j ) ; + cij_exists = true ; + } + } + } + #elif GB_A_IS_BITMAP && GB_B_IS_FULL + { + for ( int64_t k = threadIdx.x ; k < vlen ; k += blockDim.x) + { + if (Ab [pB+k]) + { + GB_GETA (aki, Ax, pA+k, ) ; // aki = A(k,i) + GB_GETB (bkj, Bx, pB+k, ) ; // bkj = B(k,j) + // cij += aki * bkj + GB_MULTADD ( cij, aki, bkj, i, k, j ) ; + cij_exists = true ; + } + } + } + #endif + } + + //---------------------------------------------------------------------- + // reduce per-thread sums to a single scalar + //---------------------------------------------------------------------- + + // FIXME: no need to do this if C(i,j) is a zombie (cij_exists is + // always false), or if A and B are both full and C(i,j) is not a + // zombie (cij_exists is always true). + + // FIXME: this only works if the size of the thread block is 32, + // right? + + // Do vote here for control. + thread_block_tile<32> tile = tiled_partition<32> (this_thread_block()) ; + + // FIXME: tile.any takes an int predicate, not bool. How does this work? + cij_exists = tile.any (cij_exists) ; + tile.sync(); + + #if !GB_C_ISO + // FIXME: the ANY monoid needs the cij_exists for each thread + cij = GB_cuda_warp_reduce_ztype (tile, cij) ; + #endif + + // FIXME: if A and B are full, and GB_MASK_STRUCT is true, cij_exists + // is always true because vlen > 0 always holds for this kernel. + + // FIXME: if kth < 0, C(i,j) is a prezombie, and Ci [pM] already holds + // GB_FLIP (i). + + // write result for this block to global mem + if (threadIdx.x == 0) + { + if (cij_exists) + { + // Cx [pM] = (GB_C_TYPE) cij + GB_PUTC (cij, Cx, pM) ; + Ci [pM] = i ; + } + else + { + // cij is a zombie + zc++ ; + Ci [pM] = GB_FLIP (i) ; + } + } + + // __syncthreads ( ) ; + + if( threadIdx.x ==0 && zc > 0) + { + GB_cuda_atomic_add ( &(C->nzombies), zc) ; + } + } +} + diff --git a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_mp.cuh b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_mp.cuh similarity index 64% rename from GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_mp.cuh rename to GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_mp.cuh index 838b7e4ccf..3fb4ead9e8 100644 --- a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_mp.cuh +++ b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_mp.cuh @@ -2,88 +2,46 @@ // GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_mp.cuh //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ -// This CUDA kernel produces the semi-ring product of two -// sparse matrices of types T_A and T_B and common index space size n, to a -// output matrix of type T_C. The matrices are sparse, with different numbers -// of non-zeros and different sparsity patterns. -// ie. we want to produce C = A'*B in the sense of the given semi-ring. +// This CUDA kernel produces the semi-ring product of two sparse matrices of +// types GB_A_TYPE and GB_B_TYPE and common index space size n, to a output +// matrix of type GB_C_TYPE. The matrices are sparse, with different numbers of +// non-zeros and different sparsity patterns. ie. we want to produce C = A'*B +// in the sense of the given semi-ring. -// This version uses a merge-path algorithm, when the sizes nnzA and nnzB are -// relatively close in size, neither is very sparse nor dense, for any size of N. -// Handles arbitrary sparsity patterns with guaranteed load balance. +// This version uses a merge-path algorithm, when the sizes nnzA and nnzB are +// relatively close in size, neither is very sparse nor dense, for any size of +// N. Handles arbitrary sparsity patterns with guaranteed load balance. // Both the grid and block are 1D, so blockDim.x is the # threads in a // threadblock, and the # of threadblocks is grid.x -// Let b = blockIdx.x, and let s be blockDim.x. s= 32 with a variable number -// of active threads = min( min(g_xnz, g_ynz), 32) +// Let b = blockIdx.x, and let s be blockDim.x. s= 32 with a variable number of +// active threads = min( min(g_xnz, g_ynz), 32) -// Thus, threadblock b owns a part of the index set spanned by g_xi and g_yi. Its job -// is to find the intersection of the index sets g_xi and g_yi, perform the semi-ring dot -// product on those items in the intersection, and finally reduce this data to a scalar, -// on exit write it to g_odata [b]. +// Thus, threadblock b owns a part of the index set spanned by g_xi and g_yi. +// Its job is to find the intersection of the index sets g_xi and g_yi, perform +// the semi-ring dot product on those items in the intersection, and finally +// reduce this data to a scalar, on exit write it to g_odata [b]. // int64_t start <- start of vector pairs for this kernel // int64_t end <- end of vector pairs for this kernel // int64_t *Bucket <- array of pair indices for all kernels -// matrix *C <- result matrix -// matrix *M <- mask matrix -// matrix *A <- input matrix A -// matrix *B <- input matrix B - -#pragma once - -#include -#include -#include -#include "GB_cuda_kernel.h" -#include "GB_mxm_shared_definitions.h" -#include "GB_cuda_atomics.cuh" -#include "GB_hash.h" -#include "GB_hyper_hash_lookup.h" -#include "GB_cuda_dot3_defn.h" - -// Using tile size fixed at compile time, we don't need shared memory -#define tile_sz 32 - -using namespace cooperative_groups; - -//------------------------------------------------------------------------------ -// GB_reduce_sum -//------------------------------------------------------------------------------ - -template< typename T_Z, int warp_sz> -__device__ __inline__ -T_Z GB_reduce_sum(thread_block_tile g, T_Z val) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial sum[i] to sum[lane+i] - // Temporary T_Z is necessary to handle arbirary ops - // FIXME: only works if sizeof(T_Z) <= 32 bytes - // FIXME: the ANY monoid needs the cij_exists for each thread - #pragma unroll - for (int i = warp_sz >> 1; i > 0; i >>= 1) - { - T_Z next = g.shfl_down( val, i); - GB_ADD( val, val, next ); - } - return val; -} +// GrB_Matrix C <- result matrix +// GrB_Matrix M <- mask matrix +// GrB_Matrix A <- input matrix A +// GrB_Matrix B <- input matrix B //------------------------------------------------------------------------------ -// AxB_dot3_phase3_mp +// GB_cuda_AxB_dot3_phase3_mp_kernel //------------------------------------------------------------------------------ - -template< - typename T_C, typename T_A, typename T_B, - typename T_Z, typename T_X, typename T_Y, - uint64_t srcode> -__global__ void AxB_dot3_phase3_mp // FIXME rename + +__global__ void GB_cuda_AxB_dot3_phase3_mp_kernel ( int64_t start, int64_t end, @@ -91,19 +49,17 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename GrB_Matrix C, GrB_Matrix M, GrB_Matrix A, - GrB_Matrix B, - int sz + GrB_Matrix B ) { - // TODO: Figure out how to use graphblas-specific INFINITY macro - #ifndef INFINITY - #define INFINITY std::numeric_limits::max() + #if !GB_A_IS_PATTERN + const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *)A->x ; #endif - - const T_A *__restrict__ Ax = (T_A *)A->x ; - const T_B *__restrict__ Bx = (T_B *)B->x ; - T_C *__restrict__ Cx = (T_C *)C->x ; + #if !GB_B_IS_PATTERN + const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *)B->x ; + #endif + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *)C->x ; int64_t *__restrict__ Ci = C->i ; const int64_t *__restrict__ Mi = M->i ; #if GB_M_IS_HYPER @@ -141,18 +97,10 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename // zombie count int64_t zc = 0; - int64_t pair_id; - // set thread ID - int tid_global = threadIdx.x+ blockDim.x* blockIdx.x; +// int tid_global = threadIdx.x+ blockDim.x* blockIdx.x; int tid = threadIdx.x; - int b = blockIdx.x ; - - // total items to be inspected - int64_t ainz = 0; - int64_t bjnz = 0; - thread_block_tile tile = tiled_partition( this_thread_block()); int all_in_one = ( (end - start) == (M->p)[(M->nvec)] ) ; @@ -163,7 +111,7 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename kk += gridDim.x ) { - pair_id = all_in_one ? kk : Bucket [kk] ; + int64_t pair_id = all_in_one ? kk : Bucket [kk] ; int64_t i = Mi[pair_id]; int64_t k = Ci[pair_id] >> 4; @@ -180,7 +128,7 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename pA_end = Ap[i+1] ; #endif - ainz = pA_end - pA_start ; + int64_t ainz = pA_end - pA_start ; GB_DECLAREA (aki) ; GB_DECLAREB (bkj) ; @@ -188,7 +136,6 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename int cij_exists = 0 ; // FIXME: make a bool - #define shared_vector_size 128 __shared__ int64_t Ai_s[shared_vector_size]; int shared_steps_A = (ainz + shared_vector_size -1)/shared_vector_size; @@ -210,7 +157,7 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename pB_end = Bp[j+1] ; #endif - bjnz = pB_end - pB_start; // bjnz + int64_t bjnz = pB_end - pB_start; // bjnz int shared_steps_B = (bjnz + shared_vector_size -1)/shared_vector_size; __shared__ int64_t Bj_s[shared_vector_size]; @@ -221,14 +168,7 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename Bj_s[i] = Bi[ i + pB_start]; } this_thread_block().sync(); - - //if (threadIdx.x ==0 ) { - // printf("block %d doing dot %lld i,j= %lld,%lld\n", blockIdx.x, pair_id, i, j); - // printf("block %d doing dot %lld ainz,bjnz= %lld,%lld, A_steps=%d, B_steps=%d\n", - // blockIdx.x, pair_id, ainz, bjnz, shared_steps_A, shared_steps_B); - //} - //this_thread_block().sync(); - + //we want more than one intersection per thread while ( (shared_steps_A > 0) && (shared_steps_B > 0) ) { @@ -238,40 +178,28 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename if ( shared_steps_B > 1) bwork = shared_vector_size; int64_t nxy = awork + bwork; - int work_per_thread = (nxy + blockDim.x -1)/blockDim.x; // ceil Divide by 32 = blockDim.x + // ceil Divide by 32 = blockDim.x : + int work_per_thread = (nxy + blockDim.x -1)/blockDim.x; int diag = GB_IMIN( work_per_thread*tid, nxy); int diag_end = GB_IMIN( diag + work_per_thread, nxy); - //printf(" thd%d parts = %u wpt = %u diag, diag_end = %u,%u\n",tid, blockDim.x, work_per_thread, diag, diag_end); - //if (1) //(threadIdx.x == 0) - //{ - // printf ("pair %ld tid%d work_per_thread %d nxy %ld parts %d diag %d diag_end %d Astep=%d, Bstep=%d\n", - // pair_id, threadIdx.x, work_per_thread, nxy, blockDim.x, diag, diag_end,shared_steps_A,shared_steps_B) ; - //} - //this_thread_block().sync(); + // bwork takes place of bjnz: + int x_min = GB_IMAX( (diag - bwork) , 0); - int x_min = GB_IMAX( (diag - bwork) , 0); //bwork takes place of bjnz - int x_max = GB_IMIN( diag, awork); //awork takes place of ainz + //awork takes place of ainz: + int x_max = GB_IMIN( diag, awork); while ( x_min < x_max) { //binary search for correct diag break int pivot = (x_min +x_max) >> 1; - //printf("start search thd%u piv=%u xmin,xmax = %u,%u diag_end=%d\n", tid_global, pivot, x_min, x_max, diag_end); int64_t Apiv = Ai_s[pivot] ; int64_t Bpiv = Bj_s[diag -pivot -1] ; - // if ( Apiv < Bpiv ) { - // x_min = pivot +1; - // } - // else { - // x_max = pivot; - // } - x_min = (pivot + 1)* (Apiv < Bpiv) + x_min * (1 - (Apiv < Bpiv)); - x_max = pivot * (1 - (Apiv < Bpiv)) + x_max * (Apiv < Bpiv); + x_min = (pivot + 1)* (Apiv < Bpiv) + x_min * (1 - (Apiv < Bpiv)); + x_max = pivot * (1 - (Apiv < Bpiv)) + x_max * (Apiv < Bpiv); } - //printf("start search thd%u xcoord= %u diag=%d, diag_end=%d\n", tid_global, x_min, diag, diag_end); int xcoord = x_min; int ycoord = diag -x_min -1; @@ -285,8 +213,6 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename int tx_start = xcoord; // +pA_start; int ty_start = diag -xcoord; // +pB_start; - //if (x_start != y_start) - // printf("start thd%u xs,ys = %i,%i\n", tid_global, x_start, y_start); x_min = GB_IMAX( (diag_end - bwork), 0); //bwork replace bjnz x_max = GB_IMIN( diag_end, awork); //awork replace ainz @@ -297,16 +223,10 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename int64_t Apiv = Ai_s[pivot] ; int64_t Bpiv = Bj_s[diag_end -pivot -1] ; - //if ( Apiv < Bpiv ) { - // x_min = pivot +1; - //} - //else { - // x_max = pivot; - //} x_min = (pivot + 1)* (Apiv < Bpiv) + x_min * (1 - (Apiv < Bpiv)); x_max = pivot * (1 - (Apiv < Bpiv)) + x_max * (Apiv < Bpiv); } - //printf("end search thd%u x_coord = %u diag=%d, diag_end=%d\n", tid_global, x_min, diag, diag_end); + xcoord = x_min; ycoord = diag_end -x_min -1; @@ -318,21 +238,6 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename int64_t pA = tx_start; // pA int64_t pB = ty_start; // pB - //if (1) // threadIdx.x == 0) - //{ - // printf ("%d tx_start %d\n", threadIdx.x, tx_start) ; - // printf ("%d tx_end %d\n", threadIdx.x, tx_end ) ; - // printf ("%d ty_start %d\n", threadIdx.x, ty_start) ; - // printf ("%d ty_end %d\n", threadIdx.x, ty_end ) ; - //} - //this_thread_block().sync(); - - // if(threadIdx.x == 0 ) { - // printf("blk%d, thd%d k=%d, l=%d, tx_start=%d, ty_start=%d, tx_end=%d, ty_end=%d\n", - // blockIdx.x, tid_global, k, l, tx_start, ty_start, tx_end, ty_end); - // } - // this_thread_block().sync(); - while ( pA < tx_end && pB < ty_end ) { int64_t Aind = Ai_s[pA] ; @@ -416,14 +321,6 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename // reduce sum per-thread values to a single scalar, get OR of flag //---------------------------------------------------------------------- - /* - if (tid == 0) - { - printf ("reduce %d : %d exists = %d\n", b, cij, cij_exists) ; - } - __syncthreads(); - */ - // Do vote here for control. cij_exists = tile.any (cij_exists) ; tile.sync ( ) ; @@ -432,7 +329,7 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename if (cij_exists) { // FIXME: the ANY monoid needs the cij_exists for each thread - cij = GB_reduce_sum( tile, cij ); + cij = GB_cuda_warp_reduce_ztype (tile, cij) ; } #endif @@ -441,7 +338,8 @@ __global__ void AxB_dot3_phase3_mp // FIXME rename { if (cij_exists) { - GB_PUTC (cij, Cx, pair_id) ; // Cx [pair_id] = (T_C) cij + // Cx [pair_id] = (GB_C_TYPE) cij + GB_PUTC (cij, Cx, pair_id) ; Ci [pair_id] = i ; } else diff --git a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh similarity index 52% rename from GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh rename to GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh index e8986d86cf..c0e04e9361 100644 --- a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh +++ b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh @@ -2,96 +2,55 @@ // GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_spdn.cuh //------------------------------------------------------------------------------ +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ -// This CUDA kernel produces the semi-ring product of two -// sparse matrices of types T_A and T_B and common index space size n, to a -// output matrix of type T_C. The matrices are sparse, with different numbers -// of non-zeros and different sparsity patterns. -// ie. we want to produce C = A'*B in the sense of the given semi-ring. +// This CUDA kernel produces the semi-ring product of two sparse matrices of +// types GB_A_TYPE and GB_B_TYPE and common index space size n, to an output +// matrix of type GB_C_TYPE. The matrices are sparse, with different numbers of +// non-zeros and different sparsity patterns. ie. we want to produce C = A'*B +// in the sense of the given semi-ring. // This version uses an entire threadblock to compute each C(i,j) dot product. // Both the grid and block are 1D, so blockDim.x is the # threads in a // threadblock, and the # of threadblocks is grid.x -// int64_t start <- start of vector pairs for this kernel -// int64_t end <- end of vector pairs for this kernel -// int64_t *Bucket <- array of pair indices for all kernels -// matrix *C <- result matrix -// matrix *M <- mask matrix -// matrix *A <- input matrix A -// matrix *B <- input matrix B - -#pragma once - -#include -#include -#include -#include "GB_cuda_kernel.h" -#include "GB_mxm_shared_definitions.h" -#include "GB_hash.h" -#include "GB_hyper_hash_lookup.h" -#include "GB_cuda_dot3_defn.h" - -// Using tile size fixed at compile time, we don't need shared memory -#define tile_sz 32 - -using namespace cooperative_groups; - //------------------------------------------------------------------------------ -// GB_reduce_sum +// GB_cuda_AxB_dot3_phase3_spdn_kernel //------------------------------------------------------------------------------ -template< typename T_Z, int warp_sz> -__device__ __inline__ -T_Z GB_reduce_sum(thread_block_tile g, T_Z val) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial sum[i] to sum[lane+i] - // Temporary T_Z is necessary to handle arbirary ops - // FIXME: only works if sizeof(T_Z) <= 32 bytes - // FIXME: the ANY monoid needs the cij_exists for each thread - #pragma unroll - for (int i = warp_sz >> 1; i > 0; i >>= 1) - { - T_Z next = g.shfl_down( val, i); - GB_ADD( val, val, next ); - } - return val; -} - -//------------------------------------------------------------------------------ -// AxB_dot3_phase3_spdn -//------------------------------------------------------------------------------ - -template< - typename T_C, typename T_A, typename T_B, - typename T_Z, typename T_X, typename T_Y, - uint64_t srcode> -__global__ void AxB_dot3_phase3_spdn // FIXME rename +__global__ void GB_cuda_AxB_dot3_phase3_spdn_kernel ( - int64_t start, - int64_t end, + int64_t start, // start of vector pairs for this kernel + int64_t end, // end of vector pairs for this kernel int64_t *Bucket, // do the work in Bucket [start:end-1] - GrB_Matrix C, - GrB_Matrix M, - GrB_Matrix A, - GrB_Matrix B, - int sz // FIXME: unused + GrB_Matrix C, // result matrix + GrB_Matrix M, // mask matrix + GrB_Matrix A, // input matrix A + GrB_Matrix B // input matrix B ) { - // TODO: Figure out how to use graphblas-specific INFINITY macro - #ifndef INFINITY - #define INFINITY std::numeric_limits::max() + // sparse-times-dense or dense-times-sparse + #if !(((GB_A_IS_SPARSE || GB_A_IS_HYPER) && \ + (GB_B_IS_BITMAP || GB_B_IS_FULL)) \ + || \ + ((GB_B_IS_SPARSE || GB_B_IS_HYPER) && \ + (GB_A_IS_BITMAP || GB_A_IS_FULL))) + #error "spdn: for sparse-dense or dense-sparse cases only" #endif - const T_A *__restrict__ Ax = (T_A *)A->x ; - const T_B *__restrict__ Bx = (T_B *)B->x ; - T_C *__restrict__ Cx = (T_C *)C->x ; + #if !GB_A_IS_PATTERN + const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *)A->x ; + #endif + #if !GB_B_IS_PATTERN + const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *)B->x ; + #endif + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *)C->x ; int64_t *__restrict__ Ci = C->i ; const int64_t *__restrict__ Mi = M->i ; #if GB_M_IS_HYPER @@ -101,6 +60,8 @@ __global__ void AxB_dot3_phase3_spdn // FIXME rename #if GB_A_IS_HYPER || GB_A_IS_SPARSE const int64_t *__restrict__ Ai = A->i ; const int64_t *__restrict__ Ap = A->p ; + #else + const int64_t avlen = A->vlen ; #endif #if GB_A_IS_BITMAP @@ -110,6 +71,8 @@ __global__ void AxB_dot3_phase3_spdn // FIXME rename #if GB_B_IS_HYPER || GB_B_IS_SPARSE const int64_t *__restrict__ Bi = B->i ; const int64_t *__restrict__ Bp = B->p ; + #else + const int64_t bvlen = B->vlen ; #endif #if GB_B_IS_BITMAP @@ -136,87 +99,94 @@ __global__ void AxB_dot3_phase3_spdn // FIXME rename const int64_t B_hash_bits = (B->Y == NULL) ? 0 : (B->Y->vdim - 1) ; #endif - // zombie count - int64_t zc = 0; + // zombie count for this threadblock + uint64_t zc = 0 ; - int64_t pair_id; + thread_block_tile tile = + tiled_partition (this_thread_block()) ; - thread_block_tile tile = tiled_partition( this_thread_block()); - int all_in_one = ( (end - start) == (M->p)[(M->nvec)] ) ; + GB_M_NVALS (mnz) ; + ASSERT (GB_M_IS_SPARSE || GB_M_IS_HYPER) ; + int64_t cnz_in_bucket = end - start ; + int all_in_one = (cnz_in_bucket == mnz) ; // Main loop over pairs int64_t kk ; - for (kk = start+ blockIdx.x; // warp per C(i,j)=A(:,i)'*B(:,j) dot product - kk < end; - kk += gridDim.x ) + for (kk = start + blockIdx.x ; // warp per C(i,j)=A(:,i)'*B(:,j) dot product + kk < end ; + kk += gridDim.x) { - pair_id = all_in_one ? kk : Bucket [kk] ; - int64_t i = Mi[pair_id]; - int64_t k = Ci[pair_id] >> 4; + //---------------------------------------------------------------------- + // get M(i,j) and C(i,j) + //---------------------------------------------------------------------- + int64_t pair_id = all_in_one ? kk : Bucket [kk] ; + int64_t i = Mi [pair_id] ; + int64_t k = Ci [pair_id] >> 4 ; // j = k or j = Mh [k] if C and M are hypersparse int64_t j = GBH_M (Mh, k) ; - // find A(:,i) - int64_t pA, pA_end ; + //---------------------------------------------------------------------- + // get A(:,i) + //---------------------------------------------------------------------- + #if GB_A_IS_HYPER + int64_t pA, pA_end ; GB_hyper_hash_lookup (Ah, anvec, Ap, A_Yp, A_Yi, A_Yx, A_hash_bits, i, &pA, &pA_end) ; #elif GB_A_IS_SPARSE - pA = Ap[i] ; - pA_end = Ap[i+1] ; + int64_t pA = Ap [i] ; + int64_t pA_end = Ap [i+1] ; #else - // A is bitmap or full - pA = A->vlen * i ; - pA_end = pA + i ; + // A is bitmap or full: only pA is needed + int64_t pA = avlen * i ; #endif - GB_DECLAREA (aki) ; - GB_DECLAREB (bkj) ; - GB_DECLARE_IDENTITY (cij) ; // GB_Z_TYPE cij = identity - - int cij_exists = 0 ; // FIXME: make a bool + //---------------------------------------------------------------------- + // get B(:,j) + //---------------------------------------------------------------------- - // find B(:,j) - int64_t pB, pB_end ; #if GB_B_IS_HYPER + int64_t pB, pB_end ; GB_hyper_hash_lookup (Bh, bnvec, Bp, B_Yp, B_Yi, B_Yx, B_hash_bits, j, &pB, &pB_end) ; #elif GB_B_IS_SPARSE - pB = Bp[j] ; - pB_end = Bp[j+1] ; + int64_t pB = Bp [j] ; + int64_t pB_end = Bp [j+1] ; #else - // B is bitmap or full - pB = B->vlen * j ; - pB_end = pB + j ; + // B is bitmap or full: only pB is needed + int64_t pB = bvlen * j ; #endif //---------------------------------------------------------------------- - // compute C(i,j) = A(:,i)'*B(:,j) using the entire threadblock + // C(i,j) = A(:,i)'*B(:,j) using the entire threadblock //---------------------------------------------------------------------- + GB_DECLAREA (aki) ; + GB_DECLAREB (bkj) ; + GB_DECLARE_IDENTITY (cij) ; // GB_Z_TYPE cij = identity + int cij_exists = 0 ; + #if ( GB_A_IS_FULL ) { -// int64_t bjnz = pB_end - pB ; // bjnz = nnz (B (:,j)) -// if (bjnz > 0) // will always be >= 128 - { - //-------------------------------------------------------------- - // A is full and B is sparse/hyper - //-------------------------------------------------------------- + //------------------------------------------------------------------ + // A is full and B is sparse/hyper + //------------------------------------------------------------------ - cij_exists = true ; - for (int64_t p = pB + threadIdx.x ; p < pB_end ; p += blockDim.x) - { - int64_t k = Bi [p] ; // next row index of B(:,j) - // cij += A(k,i) * B(k,j) - GB_GETA ( aki, Ax, pA+k, ) ; // aki = A(k,i) - GB_GETB ( bkj, Bx, p, ) ; // bkj = B(k,j) - GB_MULTADD ( cij, aki, bkj, i, k, j ) ; // cij += aki * bkj - GB_DOT_TERMINAL (cij) ; // break if cij == terminal - } + cij_exists = true ; + for (int64_t p = pB + threadIdx.x ; p < pB_end ; p += blockDim.x) + { + int64_t k = Bi [p] ; // next row index of B(:,j) + // cij += A(k,i) * B(k,j) + GB_GETA ( aki, Ax, pA+k, ) ; // aki = A(k,i) + GB_GETB ( bkj, Bx, p, ) ; // bkj = B(k,j) + // cij += aki * bkj + GB_MULTADD ( cij, aki, bkj, i, k, j ) ; + GB_DOT_TERMINAL (cij) ; // break if cij == terminal } + } #elif ( GB_A_IS_BITMAP ) { @@ -237,25 +207,23 @@ __global__ void AxB_dot3_phase3_spdn // FIXME rename } #elif ( GB_B_IS_FULL ) { -// int64_t ainz = pA_end - pA ; // ainz = nnz (A (:,i)) -// if (ainz > 0) // will always be >= 128 - { - //-------------------------------------------------------------- - // A is sparse/hyper and B is full - //-------------------------------------------------------------- + //------------------------------------------------------------------ + // A is sparse/hyper and B is full + //------------------------------------------------------------------ - cij_exists = true ; - for (int64_t p = pA + threadIdx.x ; p < pA_end ; p += blockDim.x) - { - int64_t k = Ai [p] ; // next row index of A(:,i) - // cij += A(k,i) * B(k,j) - GB_GETA ( aki, Ax, p, ) ; // aki = A(i,k) - GB_GETB ( bkj, Bx, pB+k, ) ; // bkj = B(j,k) - GB_MULTADD ( cij, aki, bkj, i, k, j) ; // cij += aik * bjk - GB_DOT_TERMINAL (cij) ; // break if cij == terminal - } + cij_exists = true ; + for (int64_t p = pA + threadIdx.x ; p < pA_end ; p += blockDim.x) + { + int64_t k = Ai [p] ; // next row index of A(:,i) + // cij += A(k,i) * B(k,j) + GB_GETA ( aki, Ax, p, ) ; // aki = A(i,k) + GB_GETB ( bkj, Bx, pB+k, ) ; // bkj = B(j,k) + // cij += aik * bjk + GB_MULTADD ( cij, aki, bkj, i, k, j) ; + GB_DOT_TERMINAL (cij) ; // break if cij == terminal } + } #elif ( GB_B_IS_BITMAP ) { @@ -277,13 +245,17 @@ __global__ void AxB_dot3_phase3_spdn // FIXME rename } #endif + //---------------------------------------------------------------------- + // save C(i,j) or declare it a zombie + //---------------------------------------------------------------------- + GB_CIJ_EXIST_POSTCHECK //---------------------------------------------------------------------- // reduce sum per-thread values to a single scalar, get OR of flag //---------------------------------------------------------------------- - // Do vote here for control. + // Do vote here for control cij_exists = tile.any (cij_exists) ; tile.sync ( ) ; @@ -291,7 +263,7 @@ __global__ void AxB_dot3_phase3_spdn // FIXME rename if (cij_exists) { // FIXME: the ANY monoid needs cij_exists for each thread - cij = GB_reduce_sum( tile, cij ); + cij = GB_cuda_warp_reduce_ztype (tile, cij) ; } #endif @@ -300,13 +272,14 @@ __global__ void AxB_dot3_phase3_spdn // FIXME rename { if (cij_exists) { - GB_PUTC (cij, Cx, pair_id) ; // Cx [pair_id] = (T_C) cij + // Cx [pair_id] = (GB_C_TYPE) cij + GB_PUTC (cij, Cx, pair_id) ; Ci [pair_id] = i ; } else { // cij is a zombie - zc++; + zc++ ; Ci [pair_id] = GB_FLIP (i) ; } } @@ -319,7 +292,7 @@ __global__ void AxB_dot3_phase3_spdn // FIXME rename if (threadIdx.x == 0 && zc > 0) { - GB_cuda_atomic_add ( &(C->nzombies), zc) ; + GB_cuda_atomic_add (&(C->nzombies), zc) ; } } diff --git a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh similarity index 64% rename from GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh rename to GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh index e5168527e0..018df8c1ae 100644 --- a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh +++ b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh @@ -2,6 +2,8 @@ // GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_vsdn.cuh //------------------------------------------------------------------------------ +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ @@ -11,76 +13,46 @@ // Each thread in this kernel is responsible for m vector-pairs(x,y), // m = 256/sz, where sz is in {4, 16, 64, 256} // We know each non-zero on the sparse side will hit a dense value. -// Template on // Parameters: -// matrix *C <- C result matrix -// matrix *M <- Mask matrix -// matrix *A <- A matrix to multiply, sparse -// matrix *B <- B matrix to multiply, dense in sparse format? +// C <- C result matrix +// M <- Mask matrix +// A <- A matrix to multiply, sparse +// B <- B matrix to multiply, dense in sparse format? //****************************************************************************** -#pragma once -#include -#include -#include -#include "GB_cuda_kernel.h" -#include "GB_mxm_shared_definitions.h" -#include "GB_hash.h" -#include "GB_hyper_hash_lookup.h" -#include -#define tile_sz 32 -//#include "local_cub/block/block_reduce.cuh" -#include -#include "GB_cuda_dot3_defn.h" - -using namespace cooperative_groups; - -//------------------------------------------------------------------------------ -// reduce_sum_int64 -//------------------------------------------------------------------------------ - -// for counting zombies only (always int64_t) -template< int warpSize > -__device__ int64_t reduce_sum_int64(thread_block_tile g, int64_t val) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial sum[i] to sum[lane+i] - for (int i = g.size() / 2; i > 0; i /= 2) - { - val += g.shfl_down(val,i) ; - } - return val; // note: only thread 0 will return full sum -} - //------------------------------------------------------------------------------ -// AxB_dot3_phase3_vsdn +// GB_cuda_AxB_dot3_phase3_vsdn_kernel //------------------------------------------------------------------------------ -template< - typename T_C, typename T_A, typename T_B, - typename T_Z, typename T_X, typename T_Y, - uint64_t srcode> -__global__ void AxB_dot3_phase3_vsdn +__global__ void GB_cuda_AxB_dot3_phase3_vsdn_kernel ( - int64_t start, - int64_t end, - int64_t *Bucket, // do the work in Bucket [start:end-1] - GrB_Matrix C, - GrB_Matrix M, - GrB_Matrix A, - GrB_Matrix B, - int sz // unused (FIXME: remove this) + int64_t start, + int64_t end, + int64_t *Bucket, // do the work in Bucket [start:end-1] + GrB_Matrix C, + GrB_Matrix M, + GrB_Matrix A, + GrB_Matrix B ) { - // TODO: Figure out how to use graphblas-specific INFINITY macro - #ifndef INFINITY - #define INFINITY std::numeric_limits::max() + + // sparse-times-dense or dense-times-sparse + #if !(((GB_A_IS_SPARSE || GB_A_IS_HYPER) && \ + (GB_B_IS_BITMAP || GB_B_IS_FULL)) \ + || \ + ((GB_B_IS_SPARSE || GB_B_IS_HYPER) && \ + (GB_A_IS_BITMAP || GB_A_IS_FULL))) + #error "vsdn: for sparse-dense or dense-sparse cases only" #endif - const T_A *__restrict__ Ax = (T_A *)A->x ; - const T_B *__restrict__ Bx = (T_B *)B->x ; - T_C *__restrict__ Cx = (T_C *)C->x ; + #if !GB_A_IS_PATTERN + const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *)A->x ; + #endif + #if !GB_B_IS_PATTERN + const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *)B->x ; + #endif + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *)C->x ; int64_t *__restrict__ Ci = C->i ; const int64_t *__restrict__ Mi = M->i ; #if GB_M_IS_HYPER @@ -90,6 +62,8 @@ __global__ void AxB_dot3_phase3_vsdn #if GB_A_IS_HYPER || GB_A_IS_SPARSE const int64_t *__restrict__ Ai = A->i ; const int64_t *__restrict__ Ap = A->p ; + #else + const int64_t avlen = A->vlen ; #endif #if GB_A_IS_BITMAP @@ -99,6 +73,8 @@ __global__ void AxB_dot3_phase3_vsdn #if GB_B_IS_HYPER || GB_B_IS_SPARSE const int64_t *__restrict__ Bi = B->i ; const int64_t *__restrict__ Bp = B->p ; + #else + const int64_t bvlen = B->vlen ; #endif #if GB_B_IS_BITMAP @@ -125,73 +101,72 @@ __global__ void AxB_dot3_phase3_vsdn const int64_t B_hash_bits = (B->Y == NULL) ? 0 : (B->Y->vdim - 1) ; #endif -// typedef cub::BlockReduce BlockReduce; -// __shared__ typename BlockReduce::TempStorage temp_storage; + uint64_t zc = 0 ; // zombie count -// if( threadIdx.x ==0) -// printf("thd:%d %d dots/thrd, nvec = %d blockDim=%d\n",threadIdx.x, sz, nvec, blockDim.x); -// __syncthreads(); + GB_M_NVALS (mnz) ; + ASSERT (GB_M_IS_SPARSE || GB_M_IS_HYPER) ; + int64_t cnz_in_bucket = end - start ; + int all_in_one = (cnz_in_bucket == mnz) ; - int64_t pair_id; - - int64_t zc = 0 ; - -// if (threadIdx.x ==0) -// printf("thd%u pi=%lld\n",tid, start+threadIdx.x); -// __syncthreads(); - - int all_in_one = ( (end - start) == (M->p)[(M->nvec)] ) ; - - for (int64_t kk = start +threadIdx.x +blockIdx.x*blockDim.x; - kk < end ; - kk += gridDim.x*blockDim.x ) + for (int64_t kk = start + threadIdx.x + blockIdx.x*blockDim.x ; + kk < end ; + kk += gridDim.x*blockDim.x) { + //---------------------------------------------------------------------- + // get the entry C(i,j) + //---------------------------------------------------------------------- + int64_t pair_id = all_in_one ? kk : Bucket[ kk ]; - int64_t i = Mi[pair_id]; // cols from mask + int64_t i = Mi [pair_id] ; - // FIXME: use another variable, not "k" here: - int64_t k = Ci[pair_id] >> 4; // vector of C encoded in phase1 + int64_t k = Ci [pair_id] >> 4; // vector of C encoded in phase1 // j = k or j = Mh [k] if C and M are hypersparse int64_t j = GBH_M (Mh, k) ; - // Prep row offsets for both A and B + //---------------------------------------------------------------------- + // get A(:,i) + //---------------------------------------------------------------------- - // find A(:,i) - int64_t pA, pA_end ; #if GB_A_IS_HYPER + int64_t pA, pA_end ; GB_hyper_hash_lookup (Ah, anvec, Ap, A_Yp, A_Yi, A_Yx, A_hash_bits, i, &pA, &pA_end) ; #elif GB_A_IS_SPARSE - pA = Ap[i] ; - pA_end = Ap[i+1] ; + int64_t pA = Ap[i] ; + int64_t pA_end = Ap[i+1] ; #else - // A is bitmap or full - pA = (A->vlen)*i; - pA_end = pA +(A->vlen); + // A is bitmap or full: only pA is needed + int64_t pA = avlen * i ; #endif - // find B(:,j) - int64_t pB, pB_end ; + //---------------------------------------------------------------------- + // get B(:,j) + //---------------------------------------------------------------------- + #if GB_B_IS_HYPER + int64_t pB, pB_end ; GB_hyper_hash_lookup (Bh, bnvec, Bp, B_Yp, B_Yi, B_Yx, B_hash_bits, j, &pB, &pB_end) ; #elif GB_B_IS_SPARSE - pB = Bp[j]; // col of C - pB_end = Bp[j+1]; + int64_t pB = Bp [j] ; + int64_t pB_end = Bp [j+1] ; #else - // B is bitmap or full - pB = (B->vlen)*j; - pB_end = pB +(B->vlen); + // B is bitmap or full: only pB is needed + int64_t pB = bvlen * j ; #endif + //---------------------------------------------------------------------- + // C(i,j) = A(:,i)'*B(:,j) + //---------------------------------------------------------------------- + GB_DECLAREA (aki) ; GB_DECLAREB (bkj) ; GB_DECLARE_IDENTITY (cij) ; // GB_Z_TYPE cij = identity bool cij_exists = false ; - int64_t my_nzombies = 0; + uint64_t my_nzombies = 0 ; #if ( GB_A_IS_FULL ) { @@ -204,7 +179,7 @@ __global__ void AxB_dot3_phase3_vsdn //-------------------------------------------------------------- cij_exists = true ; - for (int64_t p = pB ; p < pB_end ; ++p) + for (int64_t p = pB ; p < pB_end ; p++) { int64_t k = Bi [p] ; // next row index of B(:,j) // cij += A(k,i) * B(k,j) @@ -221,7 +196,7 @@ __global__ void AxB_dot3_phase3_vsdn // A is bitmap and B is sparse/hyper //------------------------------------------------------------------ - for (int64_t p = pB ; p < pB_end ; ++p) + for (int64_t p = pB ; p < pB_end ; p++) { int64_t k = Bi [p] ; // next row index of B(:,j) if (Ab [pA+k]) // check if A(k,i) exists @@ -243,7 +218,7 @@ __global__ void AxB_dot3_phase3_vsdn //-------------------------------------------------------------- cij_exists = true ; - for (int64_t p = pA ; p < pA_end ; ++p) + for (int64_t p = pA ; p < pA_end ; p++) { int64_t k = Ai [p] ; // next row index of A(:,i) // cij += A(k,i) * B(k,j) @@ -261,7 +236,7 @@ __global__ void AxB_dot3_phase3_vsdn // A is sparse/hyper and B is bitmap //------------------------------------------------------------------ - for (int64_t p = pA ; p < pA_end ; ++p) + for (int64_t p = pA ; p < pA_end ; p++) { int64_t k = Ai [p] ; // next row index of A(:,i) if (Bb [pB+k]) // check if B(k,j) exists @@ -274,10 +249,15 @@ __global__ void AxB_dot3_phase3_vsdn } #endif + //---------------------------------------------------------------------- + // save C(i,j) or declare it a zombie + //---------------------------------------------------------------------- + GB_CIJ_EXIST_POSTCHECK if (cij_exists) { - GB_PUTC (cij, Cx, pair_id) ; // Cx [pair_id] = (T_C) cij + // Cx [pair_id] = (GB_C_TYPE) cij + GB_PUTC (cij, Cx, pair_id) ; Ci [pair_id] = i ; } else @@ -286,17 +266,17 @@ __global__ void AxB_dot3_phase3_vsdn Ci [pair_id] = GB_FLIP (i) ; } - // FIXME: use the same method as vsvs for counting zombies // sum up the zombie count: - thread_block_tile tile = tiled_partition( this_thread_block()); - zc += reduce_sum_int64(tile, my_nzombies); + thread_block_tile tile = + tiled_partition (this_thread_block ()) ; + zc += GB_cuda_warp_sum_uint64 (tile, my_nzombies) ; } - if(threadIdx.x == 0 && zc > 0) + if (threadIdx.x == 0 && zc > 0) { // this threadblock accumulates its zombie count into the global // zombie count - GB_cuda_atomic_add ( &(C->nzombies), zc) ; + GB_cuda_atomic_add ( &(C->nzombies), zc) ; } } diff --git a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh similarity index 53% rename from GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh rename to GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh index bcd0d4d25c..edf539634d 100644 --- a/GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh +++ b/GraphBLAS/CUDA/Template/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh @@ -2,6 +2,8 @@ // GraphBLAS/CUDA/JitKernels/GB_cuda_jit_AxB_dot3_phase3_vsvs.cuh //------------------------------------------------------------------------------ +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ @@ -13,144 +15,97 @@ // using a serial merge algorithm on the sparse vectors. // m = 256/sz, where sz is in {4, 16, 64, 256} // For a vector-pair, sz = xnz + ynz -// Template on // Parameters: // int64_t start <- start of vector pairs for this kernel // int64_t end <- end of vector pairs for this kernel // int64_t *Bucket <- array of pair indices for all kernels -// matrix *C <- result matrix -// matrix *M <- mask matrix -// matrix *A <- input matrix A -// matrix *B <- input matrix B -// int sz <- nnz of very sparse vectors +// C <- result matrix +// M <- mask matrix +// A <- input matrix A +// B <- input matrix B // Blocksize is 1024, uses warp and block reductions to count zombies produced. //****************************************************************************** -#pragma once -#include -#include -#include -#include -#include -#include "GB_cuda_kernel.h" -#include "GB_mxm_shared_definitions.h" -#include "GB_cuda_atomics.cuh" -#include "GB_hash.h" -#include "GB_hyper_hash_lookup.h" -#include "GB_cuda_dot3_defn.h" - -using namespace cooperative_groups; - -//------------------------------------------------------------------------------ -// GB_warp_ReduceSumPlus_int64 -//------------------------------------------------------------------------------ - -template< int tile_sz> -__inline__ __device__ -int64_t GB_warp_ReduceSumPlus_int64( thread_block_tile g, int64_t val) -{ - // Each iteration halves the number of active threads - // Each thread adds its partial sum[i] to sum[lane+i] - /* - #pragma unroll - for (int i = tile_sz >> 1; i > 0; i >>= 1) { - val += g.shfl_down( val, i); - } - */ - val += g.shfl_down( val, 16); - val += g.shfl_down( val, 8); - val += g.shfl_down( val, 4); - val += g.shfl_down( val, 2); - val += g.shfl_down( val, 1); - return val; // note: only thread 0 will return full sum -} - //------------------------------------------------------------------------------ -// GB_block_ReduceSum_int64 +// GB_block_ReduceSum_uint64 //------------------------------------------------------------------------------ -template -__inline__ __device__ -int64_t GB_block_ReduceSum_int64(thread_block g, int64_t val) +__inline__ __device__ uint64_t GB_block_ReduceSum_uint64 +( + thread_block g, // FIXME: g is used for thread_block_tile elsewhere; + // be consistent. + uint64_t val +) { - static __shared__ int64_t shared[warpSize]; // Shared mem for 32 partial sums + // Shared mem for 32 partial sums + static __shared__ uint64_t shared [tile_sz] ; - int lane = threadIdx.x & 31 ; // % warpSize; - int wid = threadIdx.x >> 5 ; // / warpSize; - thread_block_tile tile = tiled_partition( g ); + // FIXME: assumes tile_sz is 32: (use an #if .. #else ... #endif) + int lane = threadIdx.x & 31 ; // % tile_sz; + int wid = threadIdx.x >> 5 ; // / tile_sz; + thread_block_tile tile = tiled_partition (g) ; - // Each warp performs partial reduction - val = GB_warp_ReduceSumPlus_int64( tile, val); + // Each warp performs partial reduction + val = GB_cuda_warp_sum_uint64 (tile, val) ; - // Wait for all partial reductions - if (lane==0) shared[wid]=val; // Write reduced value to shared memory - g.sync(); // Wait for all partial reductions + // Wait for all partial reductions + if (lane == 0) + { + shared [wid] = val ; // Write reduced value to shared memory + } - //if (wid > 0 ) return val; + g.sync(); // Wait for all partial reductions - //read from shared memory only if that warp existed - val = (threadIdx.x < (blockDim.x / warpSize ) ) ? shared[lane] : 0; + // read from shared memory only if that warp existed + val = (threadIdx.x < (blockDim.x / tile_sz ) ) ? shared[lane] : 0; - // Final reduce within first warp - if (wid==0) val = GB_warp_ReduceSumPlus_int64( tile, val); + // Final reduce within first warp + if (wid == 0) + { + val = GB_cuda_warp_sum_uint64 (tile, val) ; + } - return val; + return (val) ; } //------------------------------------------------------------------------------ -// AxB_dot3_phase3_vsvs +// GB_cuda_AxB_dot3_phase3_vsvs_kernel //------------------------------------------------------------------------------ -template< - typename T_C, typename T_A, typename T_B, - typename T_Z, typename T_X, typename T_Y, uint64_t srcode> -__global__ void AxB_dot3_phase3_vsvs -( - int64_t start, - int64_t end, - int64_t *Bucket, // do the work in Bucket [start:end-1] - GrB_Matrix C, - GrB_Matrix M, - GrB_Matrix A, - GrB_Matrix B, - int sz // unused +__global__ void GB_cuda_AxB_dot3_phase3_vsvs_kernel +( + int64_t start, + int64_t end, + int64_t *Bucket, // do the work in Bucket [start:end-1] + GrB_Matrix C, + GrB_Matrix M, + GrB_Matrix A, + GrB_Matrix B ) { - // TODO: Figure out how to use graphblas-specific INFINITY macro - #ifndef INFINITY - #define INFINITY std::numeric_limits::max() + #if !GB_A_IS_PATTERN + const GB_A_TYPE *__restrict__ Ax = (GB_A_TYPE *)A->x ; #endif - - int64_t dots = end - start; - // sz = expected non-zeros per dot -// /* -// int m = (gridDim.x*blockDim.x)*256/sz; -// int dpt = (nvecs+ gridDim.x*blockDim.x -1)/(gridDim.x*blockDim.x); -// m = dpt < m ? dpt : m; -// -// int dots = (nvecs +m -1)/m; -// */ - const T_A *__restrict__ Ax = (T_A *)A->x ; - const T_B *__restrict__ Bx = (T_B *)B->x ; - T_C *__restrict__ Cx = (T_C *)C->x ; + #if !GB_B_IS_PATTERN + const GB_B_TYPE *__restrict__ Bx = (GB_B_TYPE *)B->x ; + #endif + GB_C_TYPE *__restrict__ Cx = (GB_C_TYPE *)C->x ; int64_t *__restrict__ Ci = C->i ; const int64_t *__restrict__ Mi = M->i ; #if GB_M_IS_HYPER const int64_t *__restrict__ Mh = M->h ; #endif - #if GB_A_IS_HYPER || GB_A_IS_SPARSE + ASSERT (GB_A_IS_HYPER || GB_A_IS_SPARSE) ; const int64_t *__restrict__ Ai = A->i ; const int64_t *__restrict__ Ap = A->p ; - #endif - #if GB_B_IS_HYPER || GB_B_IS_SPARSE + ASSERT (GB_B_IS_HYPER || GB_B_IS_SPARSE) ; const int64_t *__restrict__ Bi = B->i ; const int64_t *__restrict__ Bp = B->p ; - #endif #if GB_A_IS_HYPER const int64_t anvec = A->nvec ; @@ -172,20 +127,14 @@ __global__ void AxB_dot3_phase3_vsvs const int64_t B_hash_bits = (B->Y == NULL) ? 0 : (B->Y->vdim - 1) ; #endif - //int64_t pfirst, plast; - - //GB_PARTITION (pfirst, plast, dots, blockIdx.x, gridDim.x ) ; - - int64_t my_nzombies = 0 ; + uint64_t my_nzombies = 0 ; - int all_in_one = ( (end - start) == (M->p)[(M->nvec)] ) ; + GB_M_NVALS (mnz) ; + int all_in_one = ( (end - start) == mnz ) ; - //for ( int64_t kk = pfirst+ threadIdx.x ; - // kk < plast; - // kk += blockDim.x ) - for ( int64_t kk = start+ threadIdx.x +blockDim.x*blockIdx.x ; - kk < end; - kk += blockDim.x*gridDim.x ) + for (int64_t kk = start + threadIdx.x + blockDim.x*blockIdx.x ; + kk < end ; + kk += blockDim.x*gridDim.x ) { int64_t pair_id = all_in_one ? kk : Bucket[ kk ]; @@ -201,8 +150,8 @@ __global__ void AxB_dot3_phase3_vsvs GB_hyper_hash_lookup (Ah, anvec, Ap, A_Yp, A_Yi, A_Yx, A_hash_bits, i, &pA, &pA_end) ; #else - pA = Ap[i] ; - pA_end = Ap[i+1] ; + pA = Ap [i] ; + pA_end = Ap [i+1] ; #endif // find B(:,j): B is always sparse or hypersparse @@ -211,8 +160,8 @@ __global__ void AxB_dot3_phase3_vsvs GB_hyper_hash_lookup (Bh, bnvec, Bp, B_Yp, B_Yi, B_Yx, B_hash_bits, j, &pB, &pB_end) ; #else - pB = Bp[j] ; - pB_end = Bp[j+1] ; + pB = Bp [j] ; + pB_end = Bp [j+1] ; #endif GB_DECLAREA (aki) ; @@ -243,7 +192,7 @@ __global__ void AxB_dot3_phase3_vsvs GB_CIJ_EXIST_POSTCHECK ; if (cij_exists) { - GB_PUTC (cij, Cx, pair_id) ; // Cx [pair_id] = (T_C) cij + GB_PUTC (cij, Cx, pair_id) ; // Cx [pair_id] = (GB_C_TYPE) cij Ci [pair_id] = i ; } else @@ -257,12 +206,12 @@ __global__ void AxB_dot3_phase3_vsvs // FIXME: use this in spdn and vsdn: this_thread_block().sync(); - my_nzombies = GB_block_ReduceSum_int64<32>( this_thread_block(), my_nzombies); + my_nzombies = GB_block_ReduceSum_uint64 (this_thread_block(), my_nzombies) ; this_thread_block().sync(); if( threadIdx.x == 0 && my_nzombies > 0) { - GB_cuda_atomic_add ( &(C->nzombies), (uint64_t) my_nzombies) ; + GB_cuda_atomic_add ( &(C->nzombies), my_nzombies) ; } } diff --git a/GraphBLAS/CUDA/Template/GB_cuda_kernel.cuh b/GraphBLAS/CUDA/Template/GB_cuda_kernel.cuh new file mode 100644 index 0000000000..e37259530d --- /dev/null +++ b/GraphBLAS/CUDA/Template/GB_cuda_kernel.cuh @@ -0,0 +1,79 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/Template/GB_cuda_kernel.cuh: definitions for CUDA kernels +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +// This file is #include'd into all device functions for CUDA JIT kernels for +// GraphBLAS. It provides a subset of GraphBLAS.h and GB.h, plus other +// definitions. It is not used on the host. + +#pragma once + +//------------------------------------------------------------------------------ +// C++ and CUDA #include files +//------------------------------------------------------------------------------ + +#include +#include +#include +#include +#include +#include +#include +using namespace cooperative_groups ; + +//------------------------------------------------------------------------------ +// CUDA kernel definitions +//------------------------------------------------------------------------------ + +#define GB_CUDA_KERNEL + +#undef ASSERT +#define ASSERT(x) + +//------------------------------------------------------------------------------ +// NVIDIA warp size +//------------------------------------------------------------------------------ + +#define WARPSIZE 32 +#define LOG2_WARPSIZE 5 + +//------------------------------------------------------------------------------ + +// for internal static inline functions +#undef GB_STATIC_INLINE +#define GB_STATIC_INLINE static __device__ __inline__ + +//------------------------------------------------------------------------------ +// subset of GraphBLAS.h +//------------------------------------------------------------------------------ + +#include "GraphBLAS_h_subset.cuh" + +//------------------------------------------------------------------------------ +// subset of GB.h +//------------------------------------------------------------------------------ + +#include "GB_h_subset.cuh" + +//------------------------------------------------------------------------------ +// final #include files +//------------------------------------------------------------------------------ + +#include "GB_cuda_error.hpp" +#include "GB_printf_kernels.h" +#include "GB_cuda_atomics.cuh" +#include "GB_hash.h" +#include "GB_hyper_hash_lookup.h" + +extern "C" +{ + #include "GB_werk.h" + #include "GB_callback.h" +} + diff --git a/GraphBLAS/CUDA/Template/GB_cuda_kernel.h b/GraphBLAS/CUDA/Template/GB_cuda_kernel.h deleted file mode 100644 index b4eb500a56..0000000000 --- a/GraphBLAS/CUDA/Template/GB_cuda_kernel.h +++ /dev/null @@ -1,263 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/Template/GB_cuda_kernel.h: definitions for CUDA kernels -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -// This file is #include'd into all CUDA kernels for GraphBLAS. It provides -// a subset of GraphBLAS.h and GB.h, plus other definitions. - -// FIXME: rename to .cuh? - -#pragma once - -#define GB_CUDA_KERNEL - -#undef ASSERT -#define ASSERT(x) - -//------------------------------------------------------------------------------ -// TODO: this will be in the jit code: -#define chunksize 128 - -//------------------------------------------------------------------------------ -// NVIDIA warp size -//------------------------------------------------------------------------------ - -#define WARPSIZE 32 -#define LOG2_WARPSIZE 5 - -//------------------------------------------------------------------------------ - -#ifndef INFINITY -#define INFINITY (std::numeric_limits::max()) -#endif - -// for internal static inline functions -#undef GB_STATIC_INLINE -#define GB_STATIC_INLINE static __device__ __inline__ - -//------------------------------------------------------------------------------ -// subset of GraphBLAS.h -//------------------------------------------------------------------------------ - -#ifndef GRAPHBLAS_H -#define GRAPHBLAS_H - -#undef restrict -#undef GB_restrict -#define GB_restrict __restrict__ -#define restrict GB_restrict - -#include -//#include -#include -#include - -#undef GB_GLOBAL -#define GB_GLOBAL extern - -// GB_STR: convert the content of x into a string "x" -#define GB_XSTR(x) GB_STR(x) -#define GB_STR(x) #x - -#undef GxB_MAX_NAME_LEN -#define GxB_MAX_NAME_LEN 128 - -typedef uint64_t GrB_Index ; -typedef struct GB_Descriptor_opaque *GrB_Descriptor ; -typedef struct GB_Type_opaque *GrB_Type ; -typedef struct GB_UnaryOp_opaque *GrB_UnaryOp ; -typedef struct GB_BinaryOp_opaque *GrB_BinaryOp ; -typedef struct GB_IndexUnaryOp_opaque *GrB_IndexUnaryOp ; -typedef struct GB_Monoid_opaque *GrB_Monoid ; -typedef struct GB_Semiring_opaque *GrB_Semiring ; -typedef struct GB_Scalar_opaque *GrB_Scalar ; -typedef struct GB_Vector_opaque *GrB_Vector ; -typedef struct GB_Matrix_opaque *GrB_Matrix ; -typedef struct GB_Context_opaque *GxB_Context ; -typedef struct GB_Global_opaque *GrB_Global ; -typedef struct GB_Iterator_opaque *GxB_Iterator ; - -#define GxB_HYPERSPARSE 1 // store matrix in hypersparse form -#define GxB_SPARSE 2 // store matrix as sparse form (compressed vector) -#define GxB_BITMAP 4 // store matrix as a bitmap -#define GxB_FULL 8 // store matrix as full; all entries must be present - -typedef void (*GxB_unary_function) (void *, const void *) ; -typedef void (*GxB_binary_function) (void *, const void *, const void *) ; - -typedef bool (*GxB_select_function) // return true if A(i,j) is kept -( - GrB_Index i, // row index of A(i,j) - GrB_Index j, // column index of A(i,j) - const void *x, // value of A(i,j) - const void *thunk // optional input for select function -) ; - -typedef void (*GxB_index_unary_function) -( - void *z, // output value z, of type ztype - const void *x, // input value x of type xtype; value of v(i) or A(i,j) - GrB_Index i, // row index of A(i,j) - GrB_Index j, // column index of A(i,j), or zero for v(i) - const void *y // input scalar y -) ; - -#define GxB_GLOBAL_GPU_ID 26 - -typedef enum -{ - // for all GrB_Descriptor fields: - GxB_DEFAULT = 0, // default behavior of the method - - // for GrB_OUTP only: - GrB_REPLACE = 1, // clear the output before assigning new values to it - - // for GrB_MASK only: - GrB_COMP = 2, // use the structural complement of the input - GrB_SCMP = 2, // same as GrB_COMP (historical; use GrB_COMP instead) - GrB_STRUCTURE = 4, // use the only pattern of the mask, not its values - - // for GrB_INP0 and GrB_INP1 only: - GrB_TRAN = 3, // use the transpose of the input - - // for GxB_AxB_METHOD only: - GxB_AxB_GUSTAVSON = 1001, // gather-scatter saxpy method - GxB_AxB_DOT = 1003, // dot product - GxB_AxB_HASH = 1004, // hash-based saxpy method - GxB_AxB_SAXPY = 1005 // saxpy method (any kind) -} -GrB_Desc_Value ; - -#endif - -//------------------------------------------------------------------------------ -// subset of GB.h -//------------------------------------------------------------------------------ - -//#include GB_iceil.h -#define GB_ICEIL(a,b) (((a) + (b) - 1) / (b)) -//#include GB_imin.h -#define GB_IMAX(x,y) (((x) > (y)) ? (x) : (y)) -#define GB_IMIN(x,y) (((x) < (y)) ? (x) : (y)) -//#include GB_zombie.h -#define GB_FLIP(i) (-(i)-2) -#define GB_IS_FLIPPED(i) ((i) < 0) -#define GB_IS_ZOMBIE(i) ((i) < 0) -#define GB_IS_NOT_FLIPPED(i) ((i) >= 0) -#define GB_UNFLIP(i) (((i) < 0) ? GB_FLIP(i) : (i)) -#define GBI_UNFLIP(Ai,p,avlen) \ - ((Ai == NULL) ? ((p) % (avlen)) : GB_UNFLIP (Ai [p])) - -#include "GB_index.h" -#include "GB_partition.h" -#include "GB_pun.h" -#include "GB_opaque.h" -#include "GB_int64_mult.h" -#define GB_HAS_CMPLX_MACROS 1 -#include "GB_complex.h" - -// version for the GPU, with fewer branches -#define GB_TRIM_BINARY_SEARCH(i,X,pleft,pright) \ -{ \ - /* binary search of X [pleft ... pright] for integer i */ \ - while (pleft < pright) \ - { \ - int64_t pmiddle = (pleft + pright) >> 1 ; \ - bool less = (X [pmiddle] < i) ; \ - pleft = less ? (pmiddle+1) : pleft ; \ - pright = less ? pright : pmiddle ; \ - } \ - /* binary search is narrowed down to a single item */ \ - /* or it has found the list is empty */ \ - ASSERT (pleft == pright || pleft == pright + 1) ; \ -} - -#define GB_BINARY_SEARCH(i,X,pleft,pright,found) \ -{ \ - GB_TRIM_BINARY_SEARCH (i, X, pleft, pright) ; \ - found = (pleft == pright && X [pleft] == i) ; \ -} - -#define GB_SPLIT_BINARY_SEARCH(i,X,pleft,pright,found) \ -{ \ - GB_BINARY_SEARCH (i, X, pleft, pright, found) \ - if (!found && (pleft == pright)) \ - { \ - if (i > X [pleft]) \ - { \ - pleft++ ; \ - } \ - else \ - { \ - pright++ ; \ - } \ - } \ -} - -static __device__ __inline__ int64_t GB_search_for_vector_device -( - const int64_t p, // search for vector k that contains p - const int64_t *restrict Ap, // vector pointers to search - int64_t kleft, // left-most k to search - int64_t anvec, // Ap is of size anvec+1 - int64_t avlen // A->vlen -) -{ - - //-------------------------------------------------------------------------- - // check inputs - //-------------------------------------------------------------------------- - - if (Ap == NULL) - { - // A is full or bitmap - ASSERT (p >= 0 && p < avlen * anvec) ; - return ((avlen == 0) ? 0 : (p / avlen)) ; - } - - // A is sparse - ASSERT (p >= 0 && p < Ap [anvec]) ; - - //-------------------------------------------------------------------------- - // search for k - //-------------------------------------------------------------------------- - - int64_t k = kleft ; - int64_t kright = anvec ; - bool found ; - GB_SPLIT_BINARY_SEARCH (p, Ap, k, kright, found) ; - if (found) - { - // Ap [k] == p has been found, but if k is an empty vector, then the - // next vector will also contain the entry p. In that case, k needs to - // be incremented until finding the first non-empty vector for which - // Ap [k] == p. - ASSERT (Ap [k] == p) ; - while (k < anvec-1 && Ap [k+1] == p) - { - k++ ; - } - } - else - { - // p has not been found in Ap, so it appears in the middle of Ap [k-1] - // ... Ap [k], as computed by the binary search. This is the range of - // entries for the vector k-1, so k must be decremented. - k-- ; - } - - //-------------------------------------------------------------------------- - // return result - //-------------------------------------------------------------------------- - - // The entry p must reside in a non-empty vector. - ASSERT (k >= 0 && k < anvec) ; - ASSERT (Ap [k] <= p && p < Ap [k+1]) ; - - return (k) ; -} - diff --git a/GraphBLAS/CUDA/Template/GB_cuda_shfl_down.cuh b/GraphBLAS/CUDA/Template/GB_cuda_shfl_down.cuh new file mode 100644 index 0000000000..13b5c505f0 --- /dev/null +++ b/GraphBLAS/CUDA/Template/GB_cuda_shfl_down.cuh @@ -0,0 +1,384 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/Template/GB_cuda_shfl_down.cuh: warp-level reductions +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +// SPDX-License-Identifier: BSD-3-Clause + +//------------------------------------------------------------------------------ + +// shfl_down is a method in the cooperative_groups namespace. It allows all +// threads in a warp (or other thread partition) to work together in a +// cooperative fashion. +// +// Suppose we have a tile that defines a single warp of 32 threads: +// +// #define tile_sz 32 +// thread_block_tile tile = +// tiled_partition (this_thread_block()) ; +// +// Suppose each thread has two scalars dest and src of type T. Then: +// +// T dest, src ; +// dest = tile.shfl_down (src, delta) ; +// +// performs the following computation for each thread i: +// +// if (i+delta < tile_sz) +// { +// dest = (the value of src on thread i+delta) +// } +// +// Where i ranges from 0 to the tile_size-1, which is the warp size of 32 (the +// size of the tile, given by tile.num_threads() and also the #define'd value +// tile_sz), minus one. If i+delta >= tile_sz for the ith thread, then nothing +// happens for that thread, and the thread is inactive. +// +// Restrictions: tile_sz must be a power of 2, and it must be 32 or less for +// tile.shfl_down(). The type T must be trivially-copyable (that is +// is_trivially_copyable::value must be true), and sizeof (T) <= 32 must +// hold (that is, the size of T must be 32 bytes or less). The 32-byte limit +// is handled by GB_cuda_shfl_down_large_ztype, which uses repeated calls to +// tile.shfl_down on 32-byte chunks. + +// FIXME for tile.shfl_down(...), delta is an int, so can it be negative? +// For the __shfl_down warp shuffle function, delta is an unsigned int. + +//------------------------------------------------------------------------------ +// GB_cuda_warp_sum_uint64: reduce a uint64_t value across a single warp +//------------------------------------------------------------------------------ + +// On input, each thread in the tile holds a single uint64_t value. On output, +// thread zero holds the sum of values from all the warps. + +__device__ __inline__ uint64_t GB_cuda_warp_sum_uint64 +( + thread_block_tile tile, + uint64_t value +) +{ + + //-------------------------------------------------------------------------- + // sum value on all threads to a single value + //-------------------------------------------------------------------------- + + #if (tile_sz == 32) + { + // this is the typical case + value += tile.shfl_down (value, 16) ; + value += tile.shfl_down (value, 8) ; + value += tile.shfl_down (value, 4) ; + value += tile.shfl_down (value, 2) ; + value += tile.shfl_down (value, 1) ; + } + #else + { + #pragma unroll + for (int i = tile_sz >> 1 ; i > 0 ; i >>= 1) + { + value += tile.shfl_down (value, i) ; + } + } + #endif + + //-------------------------------------------------------------------------- + // return result + //-------------------------------------------------------------------------- + + // Note that only thread 0 will have the full summation of all values in + // the tile. To broadcast it to all threads, use the following: + + // value = tile.shfl (value, 0) ; + + return (value) ; +} + +#if 0 + +//------------------------------------------------------------------------------ +// warp_ReduceSumPlus_uint64: for dot3_phase2 +//------------------------------------------------------------------------------ + +__inline__ __device__ uint64_t warp_ReduceSumPlus_uint64 +( + thread_block_tile tile, + uint64_t val +) +{ + // Each iteration halves the number of active threads + // Each thread adds its partial sum[i] to sum[lane+i] + for (int i = tile.num_threads() / 2; i > 0; i /= 2) + { + val += tile.shfl_down (val, i) ; + } + return val; // note: only thread 0 will return full sum +} + +//------------------------------------------------------------------------------ +// GB_warp_ReduceSumPlus_uint64_vsvs: for vsvs kernel +//------------------------------------------------------------------------------ + +__inline__ __device__ uint64_t GB_warp_ReduceSumPlus_uint64_vsvs +( + thread_block_tile g, + uint64_t val +) +{ + // Each iteration halves the number of active threads + // Each thread adds its partial sum[i] to sum[lane+i] + /* + #pragma unroll + for (int i = tile_sz >> 1; i > 0; i >>= 1) { + val += g.shfl_down( val, i); + } + */ + // assuming tile_sz is 32: + val += g.shfl_down( val, 16); + val += g.shfl_down( val, 8); + val += g.shfl_down( val, 4); + val += g.shfl_down( val, 2); + val += g.shfl_down( val, 1); + return val; // note: only thread 0 will return full sum +} + +//------------------------------------------------------------------------------ +// reduce_sum_int64: for vsdn +//------------------------------------------------------------------------------ + +// for counting zombies only (always int64_t) +__device__ int64_t reduce_sum_int64 +( + thread_block_tile g, + int64_t val +) +{ + // Each iteration halves the number of active threads + // Each thread adds its partial sum[i] to sum[lane+i] + for (int64_t i = g.num_threads() / 2; i > 0; i /= 2) + { + val += g.shfl_down(val,i) ; + } + return val; // note: only thread 0 will return full sum +} + +#endif + +//------------------------------------------------------------------------------ +// GB_cuda_shfl_down_large_ztype: shfl_down a type larger than 32 bytes +//------------------------------------------------------------------------------ + +// This returns result = tile.shfl_down (value, delta), where value has type +// GB_Z_TYPE, and sizeof (GB_Z_TYPE) > 32. + +#if ( GB_Z_SIZE > 32 ) + + // # of 32-byte chunks to hold a single GB_Z_TYPE, excluding leftover + // chunk; GB_Z_SIZE is sizeof (GB_Z_TYPE) as a hard-coded constant. + #define GB_Z_NCHUNKS ( GB_Z_SIZE / 32 ) + + // ztype_chunk is always 32 bytes in size + typedef struct { uint8_t bytes [32] ; } ztype_chunk ; + + // size of the single leftover chunk of size 0 to < 32 bytes + #define GB_Z_LEFTOVER ( GB_Z_SIZE - ( GB_Z_NCHUNKS * 32 ) ) + + #if ( GB_Z_LEFTOVER > 0 ) + // leftover chunk is not defined if GB_Z_SIZE is a multiple of 32 + typedef struct { uint8_t bytes [GB_Z_LEFTOVER] ; } ztype_leftover ; + #endif + + __device__ __inline__ void GB_cuda_shfl_down_large_ztype + ( + GB_Z_TYPE *result, + thread_block_tile tile, + GB_Z_TYPE *value, + int delta + ) + { + + // get pointers to value and result, as chunks of size 32 bytes + struct ztype_chunk *v = (struct ztype_chunk *) value ; + struct ztype_chunk *r = (struct ztype_chunk *) result ; + + // shfl_down value into result, one chunk at a time + #pragma unroll + for (int chunk = 0 ; chunk < GB_Z_NCHUNKS ; chunk++, r++, v++) + { + (*r) = tile.shfl_down (*v, delta) ; + } + + #if ( GB_Z_LEFTOVER > 0 ) + // handle the leftover chunk, if it has nonzero size + struct ztype_leftover *v_leftover = (struct ztype_leftover *) v ; + struct ztype_leftover *r_leftover = (struct ztype_leftover *) r ; + (*r_leftover) = tile.shfl_down (*v_leftover, delta) ; + #endif + } + +#endif + +//------------------------------------------------------------------------------ +// GB_cuda_warp_reduce_ztype: reduce a ztype to a scalar, on a single warp +//------------------------------------------------------------------------------ + +// FIXME: make value parameter *value, and return type void? + +__device__ __inline__ GB_Z_TYPE GB_cuda_warp_reduce_ztype +( + thread_block_tile tile, + GB_Z_TYPE value +) +{ + + #if ( GB_Z_SIZE <= 32 ) + { + + //---------------------------------------------------------------------- + // GB_Z_TYPE can done with a single shfl_down + //---------------------------------------------------------------------- + + #if ( tile_sz == 32 ) + { + // this is the typical case + GB_Z_TYPE next ; + next = tile.shfl_down (value, 16) ; + GB_ADD (value, value, next) ; + next = tile.shfl_down (value, 8) ; + GB_ADD (value, value, next) ; + next = tile.shfl_down (value, 4) ; + GB_ADD (value, value, next) ; + next = tile.shfl_down (value, 2) ; + GB_ADD (value, value, next) ; + next = tile.shfl_down (value, 1) ; + GB_ADD (value, value, next) ; + } + #else + { + + #pragma unroll + for (int i = tile_sz >> 1 ; i > 0 ; i >>= 1) + { + GB_Z_TYPE next = tile.shfl_down (value, i) ; + GB_ADD (value, value, next) ; + } + + } + #endif + } + #else + { + + //---------------------------------------------------------------------- + // sizeof (GB_Z_TYPE) is too large for a single shfl_down + //---------------------------------------------------------------------- + + #pragma unroll + for (int i = tile_sz >> 1 ; i > 0 ; i >>= 1) + { + GB_Z_TYPE next ; + GB_cuda_shfl_down_large_ztype (&next, tile, &value, i) ; + GB_ADD (value, value, next) ; + } + } + #endif + + //-------------------------------------------------------------------------- + // return result + //-------------------------------------------------------------------------- + + // Note that only thread 0 will have the full summation of all values in + // the tile. To broadcast it to all threads, use the following: + + // value = tile.shfl (value, 0) ; + + // or if the ztype is large: + // GB_cuda_shfl_down_large_ztype (&value, tile, &value, 0) ; + + return (value) ; +} + +#if 0 + +//------------------------------------------------------------------------------ +// warp_ReduceSum_dndn: for dndn kernel +//------------------------------------------------------------------------------ + +__inline__ __device__ GB_Z_TYPE warp_ReduceSum_dndn +( + thread_block_tile<32> g, + GB_Z_TYPE val +) +{ + // Each iteration halves the number of active threads + // Each thread adds its partial sum[i] to sum[lane+i] + // FIXME: only works if sizeof(GB_Z_TYPE) <= 32 bytes + // FIXME: the ANY monoid needs the cij_exists for each thread + for (int i = g.num_threads() / 2; i > 0; i /= 2) + { + GB_Z_TYPE next = g.shfl_down( val, i) ; + GB_ADD( val, val, next ); + } + return val; // note: only thread 0 will return full sum +} + +//------------------------------------------------------------------------------ +// GB_reduce_sum: for dot3 mp and spdn +//------------------------------------------------------------------------------ + +__device__ __inline__ GB_Z_TYPE GB_reduce_sum +( + thread_block_tile g, + GB_Z_TYPE val +) +{ + // Each iteration halves the number of active threads + // Each thread adds its partial sum[i] to sum[lane+i] + // Temporary GB_Z_TYPE is necessary to handle arbirary ops + // FIXME: only works if sizeof(GB_Z_TYPE) <= 32 bytes + // FIXME: the ANY monoid needs the cij_exists for each thread + #pragma unroll + for (int i = tile_sz >> 1 ; i > 0 ; i >>= 1) + { + GB_Z_TYPE next = g.shfl_down (val, i) ; + GB_ADD (val, val, next) ; + } + return val; +} + +//------------------------------------------------------------------------------ +// GB_warp_Reduce: for cuda_reduce +//------------------------------------------------------------------------------ + +__device__ __inline__ GB_Z_TYPE GB_warp_Reduce +( + thread_block_tile g, + GB_Z_TYPE val +) +{ + // Each iteration halves the number of active threads + // Each thread adds its partial val[k] to val[lane+k] + + // FIXME: doesn't work unless sizeof(GB_Z_TYPE) <= 32 bytes + +#if ( GB_Z_SIZE <= 32 ) + // assumes tile_sz is 32: + GB_Z_TYPE fold = g.shfl_down ( val, 16) ; + GB_ADD ( val, val, fold ) ; + fold = g.shfl_down ( val, 8) ; + GB_ADD ( val, val, fold ) ; + fold = g.shfl_down ( val, 4) ; + GB_ADD ( val, val, fold ) ; + fold = g.shfl_down ( val, 2) ; + GB_ADD ( val, val, fold ) ; + fold = g.shfl_down ( val, 1) ; + GB_ADD ( val, val, fold ) ; +#else + // use shared memory and do not use shfl_down? + // or use repeated calls to shfl_down, on chunks of 32 bytes each? + #error "not implemented yet" +#endif + + return (val) ; // note: only thread 0 will return full val +} +#endif diff --git a/GraphBLAS/CUDA/Template/GB_cuda_timer.hpp b/GraphBLAS/CUDA/Template/GB_cuda_timer.hpp new file mode 100644 index 0000000000..12a6e87d6b --- /dev/null +++ b/GraphBLAS/CUDA/Template/GB_cuda_timer.hpp @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/test/GB_cuda_timer.hpp +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// This file: Copyright (c) 2024, NVIDIA CORPORATION. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +#ifndef GB_CUDA_TIMER_HPP +#define GB_CUDA_TIMER_HPP + +#include +struct GpuTimer +{ + cudaEvent_t start; + cudaEvent_t stop; + + GpuTimer() + { + cudaEventCreate(&start); + cudaEventCreate(&stop); + } + + ~GpuTimer() + { + cudaEventDestroy(start); + cudaEventDestroy(stop); + } + + void Start() + { + cudaEventRecord(start, 0); + } + + void Stop() + { + cudaEventRecord(stop, 0); + } + + float Elapsed() + { + float elapsed; + cudaEventSynchronize(stop); + cudaEventElapsedTime(&elapsed, start, stop); + return elapsed; + } +} ; + +#endif + diff --git a/GraphBLAS/CUDA/Template/GB_h_subset.cuh b/GraphBLAS/CUDA/Template/GB_h_subset.cuh new file mode 100644 index 0000000000..f371da6041 --- /dev/null +++ b/GraphBLAS/CUDA/Template/GB_h_subset.cuh @@ -0,0 +1,77 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/Template/GB_h_subset.cuh: subset of GB.h +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +// Note the header guard is the same as GB.h: +#ifndef GB_H +#define GB_H + +// from GB_iceil.h: +#define GB_ICEIL(a,b) (((a) + (b) - 1) / (b)) +// from GB_imin.h: +#define GB_IMAX(x,y) (((x) > (y)) ? (x) : (y)) +#define GB_IMIN(x,y) (((x) < (y)) ? (x) : (y)) +// from GB_zombie.h: +#define GB_FLIP(i) (-(i)-2) +#define GB_IS_FLIPPED(i) ((i) < 0) +#define GB_IS_ZOMBIE(i) ((i) < 0) +#define GB_IS_NOT_FLIPPED(i) ((i) >= 0) +#define GB_UNFLIP(i) (((i) < 0) ? GB_FLIP(i) : (i)) +#define GBI_UNFLIP(Ai,p,avlen) \ + ((Ai == NULL) ? ((p) % (avlen)) : GB_UNFLIP (Ai [p])) + +#include "GB_index.h" +#include "GB_partition.h" +#include "GB_pun.h" +#include "GB_opaque.h" +#include "GB_int64_mult.h" +#define GB_HAS_CMPLX_MACROS 1 +#include "GB_complex.h" +#include "GB_memory_macros.h" + +// version for the GPU, with fewer branches +#define GB_TRIM_BINARY_SEARCH(i,X,pleft,pright) \ +{ \ + /* binary search of X [pleft ... pright] for integer i */ \ + while (pleft < pright) \ + { \ + int64_t pmiddle = (pleft + pright) >> 1 ; \ + bool less = (X [pmiddle] < i) ; \ + pleft = less ? (pmiddle+1) : pleft ; \ + pright = less ? pright : pmiddle ; \ + } \ + /* binary search is narrowed down to a single item */ \ + /* or it has found the list is empty */ \ + ASSERT (pleft == pright || pleft == pright + 1) ; \ +} + +#define GB_BINARY_SEARCH(i,X,pleft,pright,found) \ +{ \ + GB_TRIM_BINARY_SEARCH (i, X, pleft, pright) ; \ + found = (pleft == pright && X [pleft] == i) ; \ +} + +#define GB_SPLIT_BINARY_SEARCH(i,X,pleft,pright,found) \ +{ \ + GB_BINARY_SEARCH (i, X, pleft, pright, found) \ + if (!found && (pleft == pright)) \ + { \ + if (i > X [pleft]) \ + { \ + pleft++ ; \ + } \ + else \ + { \ + pright++ ; \ + } \ + } \ +} + + +#endif + diff --git a/GraphBLAS/CUDA/Template/GraphBLAS_h_subset.cuh b/GraphBLAS/CUDA/Template/GraphBLAS_h_subset.cuh new file mode 100644 index 0000000000..53085666b5 --- /dev/null +++ b/GraphBLAS/CUDA/Template/GraphBLAS_h_subset.cuh @@ -0,0 +1,135 @@ +//------------------------------------------------------------------------------ +// GraphBLAS/CUDA/Template/GraphBLAS_h_subset.cuh: subset of GraphBLAS.h +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +// Note the header gaurd is the same as GraphBLAS.h: +#ifndef GRAPHBLAS_H +#define GRAPHBLAS_H + +typedef enum +{ + + GrB_SUCCESS = 0, // all is well + + //-------------------------------------------------------------------------- + // informational codes, not an error: + //-------------------------------------------------------------------------- + + GrB_NO_VALUE = 1, // A(i,j) requested but not there + GxB_EXHAUSTED = 7089, // iterator is exhausted + + //-------------------------------------------------------------------------- + // errors: + //-------------------------------------------------------------------------- + + GrB_UNINITIALIZED_OBJECT = -1, // object has not been initialized + GrB_NULL_POINTER = -2, // input pointer is NULL + GrB_INVALID_VALUE = -3, // generic error; some value is bad + GrB_INVALID_INDEX = -4, // row or column index is out of bounds + GrB_DOMAIN_MISMATCH = -5, // object domains are not compatible + GrB_DIMENSION_MISMATCH = -6, // matrix dimensions do not match + GrB_OUTPUT_NOT_EMPTY = -7, // output matrix already has values + GrB_NOT_IMPLEMENTED = -8, // method not implemented + GrB_ALREADY_SET = -9, // field already written to + GrB_PANIC = -101, // unknown error + GrB_OUT_OF_MEMORY = -102, // out of memory + GrB_INSUFFICIENT_SPACE = -103, // output array not large enough + GrB_INVALID_OBJECT = -104, // object is corrupted + GrB_INDEX_OUT_OF_BOUNDS = -105, // row or col index out of bounds + GrB_EMPTY_OBJECT = -106 // an object does not contain a value + +} +GrB_Info ; + +#undef restrict +#undef GB_restrict +#define GB_restrict __restrict__ +#define restrict GB_restrict + +#include +#include +#include + +#undef GB_GLOBAL +#define GB_GLOBAL extern + +// GB_STR: convert the content of x into a string "x" +#define GB_XSTR(x) GB_STR(x) +#define GB_STR(x) #x + +#undef GxB_MAX_NAME_LEN +#define GxB_MAX_NAME_LEN 128 + +typedef uint64_t GrB_Index ; +typedef struct GB_Descriptor_opaque *GrB_Descriptor ; +typedef struct GB_Type_opaque *GrB_Type ; +typedef struct GB_UnaryOp_opaque *GrB_UnaryOp ; +typedef struct GB_BinaryOp_opaque *GrB_BinaryOp ; +typedef struct GB_IndexUnaryOp_opaque *GrB_IndexUnaryOp ; +typedef struct GB_Monoid_opaque *GrB_Monoid ; +typedef struct GB_Semiring_opaque *GrB_Semiring ; +typedef struct GB_Scalar_opaque *GrB_Scalar ; +typedef struct GB_Vector_opaque *GrB_Vector ; +typedef struct GB_Matrix_opaque *GrB_Matrix ; +typedef struct GB_Context_opaque *GxB_Context ; +typedef struct GB_Global_opaque *GrB_Global ; +typedef struct GB_Iterator_opaque *GxB_Iterator ; + +#define GxB_HYPERSPARSE 1 // store matrix in hypersparse form +#define GxB_SPARSE 2 // store matrix as sparse form (compressed vector) +#define GxB_BITMAP 4 // store matrix as a bitmap +#define GxB_FULL 8 // store matrix as full; all entries must be present + +typedef void (*GxB_unary_function) (void *, const void *) ; +typedef void (*GxB_binary_function) (void *, const void *, const void *) ; + +typedef bool (*GxB_select_function) // return true if A(i,j) is kept +( + GrB_Index i, // row index of A(i,j) + GrB_Index j, // column index of A(i,j) + const void *x, // value of A(i,j) + const void *thunk // optional input for select function +) ; + +typedef void (*GxB_index_unary_function) +( + void *z, // output value z, of type ztype + const void *x, // input value x of type xtype; value of v(i) or A(i,j) + GrB_Index i, // row index of A(i,j) + GrB_Index j, // column index of A(i,j), or zero for v(i) + const void *y // input scalar y +) ; + +#define GxB_GLOBAL_GPU_ID 26 + +typedef enum +{ + // for all GrB_Descriptor fields: + GxB_DEFAULT = 0, // default behavior of the method + + // for GrB_OUTP only: + GrB_REPLACE = 1, // clear the output before assigning new values to it + + // for GrB_MASK only: + GrB_COMP = 2, // use the structural complement of the input + GrB_SCMP = 2, // same as GrB_COMP (historical; use GrB_COMP instead) + GrB_STRUCTURE = 4, // use the only pattern of the mask, not its values + + // for GrB_INP0 and GrB_INP1 only: + GrB_TRAN = 3, // use the transpose of the input + + // for GxB_AxB_METHOD only: + GxB_AxB_GUSTAVSON = 1001, // gather-scatter saxpy method + GxB_AxB_DOT = 1003, // dot product + GxB_AxB_HASH = 1004, // hash-based saxpy method + GxB_AxB_SAXPY = 1005 // saxpy method (any kind) +} +GrB_Desc_Value ; + +#endif + diff --git a/GraphBLAS/CUDA/go b/GraphBLAS/CUDA/go deleted file mode 100755 index 74b4fa0787..0000000000 --- a/GraphBLAS/CUDA/go +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -# nuke the cached kernels and src -find ~/.SuiteSparse/GrB9.0.1 -mindepth 1 -delete - -# rebuild the JITpackage -( cd ../JITpackage ; make purge ; make ) - -# rebuild GraphBLAS -( cd .. ; make ) - -# run a demo -../build/wathen_demo - diff --git a/GraphBLAS/CUDA/jitify.hpp b/GraphBLAS/CUDA/jitify.hpp deleted file mode 100644 index 4dc3a9b9b6..0000000000 --- a/GraphBLAS/CUDA/jitify.hpp +++ /dev/null @@ -1,4196 +0,0 @@ -/* - * Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of NVIDIA CORPORATION 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 ``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 OWNER OR - * CONTRIBUTORS 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. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/* - ----------- - Jitify 0.9 - ----------- - A C++ library for easy integration of CUDA runtime compilation into - existing codes. - - -------------- - How to compile - -------------- - Compiler dependencies: , -std=c++11 - Linker dependencies: dl cuda nvrtc - - -------------------------------------- - Embedding source files into executable - -------------------------------------- - g++ ... -ldl -rdynamic -DJITIFY_ENABLE_EMBEDDED_FILES=1 - -Wl,-b,binary,my_kernel.cu,include/my_header.cuh,-b,default nvcc ... -ldl - -Xcompiler "-rdynamic - -Wl\,-b\,binary\,my_kernel.cu\,include/my_header.cuh\,-b\,default" - JITIFY_INCLUDE_EMBEDDED_FILE(my_kernel_cu); - JITIFY_INCLUDE_EMBEDDED_FILE(include_my_header_cuh); - - ---- - TODO - ---- - Extract valid compile options and pass the rest to cuModuleLoadDataEx - See if can have stringified headers automatically looked-up - by having stringify add them to a (static) global map. - The global map can be updated by creating a static class instance - whose constructor performs the registration. - Can then remove all headers from JitCache constructor in example code - See other TODOs in code -*/ - -/*! \file jitify.hpp - * \brief The Jitify library header - */ - -/*! \mainpage Jitify - A C++ library that simplifies the use of NVRTC - * \p Use class jitify::JitCache to manage and launch JIT-compiled CUDA - * kernels. - * - * \p Use namespace jitify::reflection to reflect types and values into - * code-strings. - * - * \p Use JITIFY_INCLUDE_EMBEDDED_FILE() to declare files that have been - * embedded into the executable using the GCC linker. - * - * \p Use jitify::parallel_for and JITIFY_LAMBDA() to generate and launch - * simple kernels. - */ - -#pragma once - -#ifndef JITIFY_THREAD_SAFE -#define JITIFY_THREAD_SAFE 1 -#endif - -#if JITIFY_ENABLE_EMBEDDED_FILES -#include -#endif -#include -#include -#include -#include // For strtok_r etc. -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if JITIFY_THREAD_SAFE -#include -#endif - -#include -#include // For dim3, cudaStream_t -#if CUDA_VERSION >= 8000 -#define NVRTC_GET_TYPE_NAME 1 -#endif -#include - -// For use by get_current_executable_path(). -#ifdef __linux__ -#include // For PATH_MAX - -#include // For realpath -#define JITIFY_PATH_MAX PATH_MAX -#elif defined(_WIN32) || defined(_WIN64) -#include -#define JITIFY_PATH_MAX MAX_PATH -#else -#error "Unsupported platform" -#endif - -#ifdef _MSC_VER // MSVC compiler -#include // For UnDecorateSymbolName -#else -#include // For abi::__cxa_demangle -#endif - -#if defined(_WIN32) || defined(_WIN64) -// WAR for strtok_r being called strtok_s on Windows -#pragma push_macro("strtok_r") -#undef strtok_r -#define strtok_r strtok_s -// WAR for min and max possibly being macros defined by windows.h -#pragma push_macro("min") -#pragma push_macro("max") -#undef min -#undef max -#endif - -#ifndef JITIFY_PRINT_LOG -#define JITIFY_PRINT_LOG 1 -#endif - -#define JITIFY_PRINT_ALL 0 - -#if JITIFY_PRINT_ALL -#define JITIFY_PRINT_INSTANTIATION 1 -#define JITIFY_PRINT_SOURCE 1 -#define JITIFY_PRINT_LOG 1 -#define JITIFY_PRINT_PTX 1 -#define JITIFY_PRINT_LINKER_LOG 1 -#define JITIFY_PRINT_LAUNCH 1 -#define JITIFY_PRINT_HEADER_PATHS 1 -#endif - -#if JITIFY_ENABLE_EMBEDDED_FILES -#define JITIFY_FORCE_UNDEFINED_SYMBOL(x) void* x##_forced = (void*)&x -/*! Include a source file that has been embedded into the executable using the - * GCC linker. - * \param name The name of the source file (not as a string), which must - * be sanitized by replacing non-alpha-numeric characters with underscores. - * E.g., \code{.cpp}JITIFY_INCLUDE_EMBEDDED_FILE(my_header_h)\endcode will - * include the embedded file "my_header.h". - * \note Files declared with this macro can be referenced using - * their original (unsanitized) filenames when creating a \p - * jitify::Program instance. - */ -#define JITIFY_INCLUDE_EMBEDDED_FILE(name) \ - extern "C" uint8_t _jitify_binary_##name##_start[] asm("_binary_" #name \ - "_start"); \ - extern "C" uint8_t _jitify_binary_##name##_end[] asm("_binary_" #name \ - "_end"); \ - JITIFY_FORCE_UNDEFINED_SYMBOL(_jitify_binary_##name##_start); \ - JITIFY_FORCE_UNDEFINED_SYMBOL(_jitify_binary_##name##_end) -#endif // JITIFY_ENABLE_EMBEDDED_FILES - -/*! Jitify library namespace - */ -namespace jitify { - -/*! Source-file load callback. - * - * \param filename The name of the requested source file. - * \param tmp_stream A temporary stream that can be used to hold source code. - * \return A pointer to an input stream containing the source code, or NULL - * to defer loading of the file to Jitify's file-loading mechanisms. - */ -typedef std::istream* (*file_callback_type)(std::string filename, - std::iostream& tmp_stream); -// Exclude from Doxygen -//! \cond - -class JitCache; - -// Simple cache using LRU discard policy -template -class ObjectCache { - public: - typedef KeyType key_type; - typedef ValueType value_type; - - private: - typedef std::map object_map; - typedef std::deque key_rank; - typedef typename key_rank::iterator rank_iterator; - object_map _objects; - key_rank _ranked_keys; - size_t _capacity; - - inline void discard_old(size_t n = 0) { - if (n > _capacity) { - throw std::runtime_error("Insufficient capacity in cache"); - } - while (_objects.size() > _capacity - n) { - key_type discard_key = _ranked_keys.back(); - _ranked_keys.pop_back(); - _objects.erase(discard_key); - } - } - - public: - inline ObjectCache(size_t capacity = 8) : _capacity(capacity) {} - inline void resize(size_t capacity) { - _capacity = capacity; - this->discard_old(); - } - inline bool contains(const key_type& k) const { - return (bool)_objects.count(k); - } - inline void touch(const key_type& k) { - if (!this->contains(k)) { - throw std::runtime_error("Key not found in cache"); - } - rank_iterator rank = std::find(_ranked_keys.begin(), _ranked_keys.end(), k); - if (rank != _ranked_keys.begin()) { - // Move key to front of ranks - _ranked_keys.erase(rank); - _ranked_keys.push_front(k); - } - } - inline value_type& get(const key_type& k) { - if (!this->contains(k)) { - throw std::runtime_error("Key not found in cache"); - } - this->touch(k); - return _objects[k]; - } - inline value_type& insert(const key_type& k, - const value_type& v = value_type()) { - this->discard_old(1); - _ranked_keys.push_front(k); - return _objects.insert(std::make_pair(k, v)).first->second; - } - template - inline value_type& emplace(const key_type& k, Args&&... args) { - this->discard_old(1); - // Note: Use of piecewise_construct allows non-movable non-copyable types - auto iter = _objects - .emplace(std::piecewise_construct, std::forward_as_tuple(k), - std::forward_as_tuple(args...)) - .first; - _ranked_keys.push_front(iter->first); - return iter->second; - } -}; - -namespace detail { - -// Convenience wrapper for std::vector that provides handy constructors -template -class vector : public std::vector { - typedef std::vector super_type; - - public: - vector() : super_type() {} - vector(size_t n) : super_type(n) {} // Note: Not explicit, allows =0 - vector(std::vector const& vals) : super_type(vals) {} - template - vector(T const (&vals)[N]) : super_type(vals, vals + N) {} - vector(std::vector&& vals) : super_type(vals) {} - vector(std::initializer_list vals) : super_type(vals) {} -}; - -// Helper functions for parsing/manipulating source code - -inline std::string replace_characters(std::string str, - std::string const& oldchars, - char newchar) { - size_t i = str.find_first_of(oldchars); - while (i != std::string::npos) { - str[i] = newchar; - i = str.find_first_of(oldchars, i + 1); - } - return str; -} -inline std::string sanitize_filename(std::string name) { - return replace_characters(name, "/\\.-: ?%*|\"<>", '_'); -} - -#if JITIFY_ENABLE_EMBEDDED_FILES -class EmbeddedData { - void* _app; - EmbeddedData(EmbeddedData const&); - EmbeddedData& operator=(EmbeddedData const&); - - public: - EmbeddedData() { - _app = dlopen(NULL, RTLD_LAZY); - if (!_app) { - throw std::runtime_error(std::string("dlopen failed: ") + dlerror()); - } - dlerror(); // Clear any existing error - } - ~EmbeddedData() { - if (_app) { - dlclose(_app); - } - } - const uint8_t* operator[](std::string key) const { - key = sanitize_filename(key); - key = "_binary_" + key; - uint8_t const* data = (uint8_t const*)dlsym(_app, key.c_str()); - if (!data) { - throw std::runtime_error(std::string("dlsym failed: ") + dlerror()); - } - return data; - } - const uint8_t* begin(std::string key) const { - return (*this)[key + "_start"]; - } - const uint8_t* end(std::string key) const { return (*this)[key + "_end"]; } -}; -#endif // JITIFY_ENABLE_EMBEDDED_FILES - -inline bool is_tokenchar(char c) { - return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9') || c == '_'; -} -inline std::string replace_token(std::string src, std::string token, - std::string replacement) { - size_t i = src.find(token); - while (i != std::string::npos) { - if (i == 0 || i == src.size() - token.size() || - (!is_tokenchar(src[i - 1]) && !is_tokenchar(src[i + token.size()]))) { - src.replace(i, token.size(), replacement); - i += replacement.size(); - } else { - i += token.size(); - } - i = src.find(token, i); - } - return src; -} -inline std::string path_base(std::string p) { - // "/usr/local/myfile.dat" -> "/usr/local" - // "foo/bar" -> "foo" - // "foo/bar/" -> "foo/bar" -#if defined _WIN32 || defined _WIN64 - char sep = '\\'; -#else - char sep = '/'; -#endif - size_t i = p.find_last_of(sep); - if (i != std::string::npos) { - return p.substr(0, i); - } else { - return ""; - } -} -inline std::string path_join(std::string p1, std::string p2) { -#ifdef _WIN32 - char sep = '\\'; -#else - char sep = '/'; -#endif - if (p1.size() && p2.size() && p2[0] == sep) { - throw std::invalid_argument("Cannot join to absolute path"); - } - if (p1.size() && p1[p1.size() - 1] != sep) { - p1 += sep; - } - return p1 + p2; -} -// Elides "/." and "/.." tokens from path. -inline std::string path_simplify(const std::string& path) { - std::vector dirs; - std::string cur_dir; - bool after_slash = false; - for (int i = 0; i < (int)path.size(); ++i) { - if (path[i] == '/') { - if (after_slash) continue; // Ignore repeat slashes - after_slash = true; - if (cur_dir == ".." && !dirs.empty() && dirs.back() != "..") { - if (dirs.size() == 1 && dirs.front().empty()) { - throw std::runtime_error( - "Invalid path: back-traversals exceed depth of absolute path"); - } - dirs.pop_back(); - } else if (cur_dir != ".") { // Ignore /./ - dirs.push_back(cur_dir); - } - cur_dir.clear(); - } else { - after_slash = false; - cur_dir.push_back(path[i]); - } - } - if (!after_slash) { - dirs.push_back(cur_dir); - } - std::stringstream ss; - for (int i = 0; i < (int)dirs.size() - 1; ++i) { - ss << dirs[i] << "/"; - } - if (!dirs.empty()) ss << dirs.back(); - if (after_slash) ss << "/"; - return ss.str(); -} -inline unsigned long long hash_larson64(const char* s, - unsigned long long seed = 0) { - unsigned long long hash = seed; - while (*s) { - hash = hash * 101 + *s++; - } - return hash; -} - -inline uint64_t hash_combine(uint64_t a, uint64_t b) { - // Note: The magic number comes from the golden ratio - return a ^ (0x9E3779B97F4A7C17ull + b + (b >> 2) + (a << 6)); -} - -inline bool extract_include_info_from_compile_error(std::string log, - std::string& name, - std::string& parent, - int& line_num) { - static const std::vector pattern = { - "could not open source file \"", "cannot open source file \""}; - - for (auto& p : pattern) { - size_t beg = log.find(p); - if (beg != std::string::npos) { - beg += p.size(); - size_t end = log.find("\"", beg); - name = log.substr(beg, end - beg); - - size_t line_beg = log.rfind("\n", beg); - if (line_beg == std::string::npos) { - line_beg = 0; - } else { - line_beg += 1; - } - - size_t split = log.find("(", line_beg); - parent = log.substr(line_beg, split - line_beg); - line_num = - atoi(log.substr(split + 1, log.find(")", split + 1) - (split + 1)) - .c_str()); - - return true; - } - } - - return false; -} - -inline bool is_include_directive_with_quotes(const std::string& source, - int line_num) { - // TODO: Check each find() for failure. - size_t beg = 0; - for (int i = 1; i < line_num; ++i) { - beg = source.find("\n", beg) + 1; - } - beg = source.find("include", beg) + 7; - beg = source.find_first_of("\"<", beg); - return source[beg] == '"'; -} - -inline std::string comment_out_code_line(int line_num, std::string source) { - size_t beg = 0; - for (int i = 1; i < line_num; ++i) { - beg = source.find("\n", beg) + 1; - } - return (source.substr(0, beg) + "//" + source.substr(beg)); -} - -inline void print_with_line_numbers(std::string const& source) { - int linenum = 1; - std::stringstream source_ss(source); - for (std::string line; std::getline(source_ss, line); ++linenum) { - std::cout << std::setfill(' ') << std::setw(3) << linenum << " " << line - << std::endl; - } -} - -inline void print_compile_log(std::string program_name, - std::string const& log) { - std::cout << "---------------------------------------------------" - << std::endl; - std::cout << "--- JIT compile log for " << program_name << " ---" - << std::endl; - std::cout << "---------------------------------------------------" - << std::endl; - std::cout << log << std::endl; - std::cout << "---------------------------------------------------" - << std::endl; -} - -inline std::vector split_string(std::string str, - long maxsplit = -1, - std::string delims = " \t") { - std::vector results; - if (maxsplit == 0) { - results.push_back(str); - return results; - } - // Note: +1 to include NULL-terminator - std::vector v_str(str.c_str(), str.c_str() + (str.size() + 1)); - char* c_str = v_str.data(); - char* saveptr = c_str; - char* token = nullptr; - for (long i = 0; i != maxsplit; ++i) { - token = ::strtok_r(c_str, delims.c_str(), &saveptr); - c_str = 0; - if (!token) { - return results; - } - results.push_back(token); - } - // Check if there's a final piece - token += ::strlen(token) + 1; - if (token - v_str.data() < (ptrdiff_t)str.size()) { - // Find the start of the final piece - token += ::strspn(token, delims.c_str()); - if (*token) { - results.push_back(token); - } - } - return results; -} - -static const std::map& get_jitsafe_headers_map(); - -inline bool load_source( - std::string filename, std::map& sources, - std::string current_dir = "", - std::vector include_paths = std::vector(), - file_callback_type file_callback = 0, - std::map* fullpaths = nullptr, - bool search_current_dir = true) { - std::istream* source_stream = 0; - std::stringstream string_stream; - std::ifstream file_stream; - // First detect direct source-code string ("my_program\nprogram_code...") - size_t newline_pos = filename.find("\n"); - if (newline_pos != std::string::npos) { - std::string source = filename.substr(newline_pos + 1); - filename = filename.substr(0, newline_pos); - string_stream << source; - source_stream = &string_stream; - } - if (sources.count(filename)) { - // Already got this one - return true; - } - if (!source_stream) { - std::string fullpath = path_join(current_dir, filename); - // Try loading from callback - if (!file_callback || - !(source_stream = file_callback(fullpath, string_stream))) { -#if JITIFY_ENABLE_EMBEDDED_FILES - // Try loading as embedded file - EmbeddedData embedded; - std::string source; - try { - source.assign(embedded.begin(fullpath), embedded.end(fullpath)); - string_stream << source; - source_stream = &string_stream; - } catch (std::runtime_error const&) -#endif // JITIFY_ENABLE_EMBEDDED_FILES - { - // Try loading from filesystem - bool found_file = false; - if (search_current_dir) { - file_stream.open(fullpath.c_str()); - if (file_stream) { - source_stream = &file_stream; - found_file = true; - } - } - // Search include directories - if (!found_file) { - for (int i = 0; i < (int)include_paths.size(); ++i) { - fullpath = path_join(include_paths[i], filename); - file_stream.open(fullpath.c_str()); - if (file_stream) { - source_stream = &file_stream; - found_file = true; - break; - } - } - if (!found_file) { - // Try loading from builtin headers - fullpath = path_join("__jitify_builtin", filename); - auto it = get_jitsafe_headers_map().find(filename); - if (it != get_jitsafe_headers_map().end()) { - string_stream << it->second; - source_stream = &string_stream; - } else { - return false; - } - } - } - } - } - if (fullpaths) { - // Record the full file path corresponding to this include name. - (*fullpaths)[filename] = path_simplify(fullpath); - } - } - sources[filename] = std::string(); - std::string& source = sources[filename]; - std::string line; - size_t linenum = 0; - unsigned long long hash = 0; - bool pragma_once = false; - bool remove_next_blank_line = false; - while (std::getline(*source_stream, line)) { - ++linenum; - - // HACK WAR for static variables not allowed on the device (unless - // __shared__) - // TODO: This breaks static member variables - // line = replace_token(line, "static const", "/*static*/ const"); - - // TODO: Need to watch out for /* */ comments too - std::string cleanline = - line.substr(0, line.find("//")); // Strip line comments - // if( cleanline.back() == "\r" ) { // Remove Windows line ending - // cleanline = cleanline.substr(0, cleanline.size()-1); - //} - // TODO: Should trim whitespace before checking .empty() - if (cleanline.empty() && remove_next_blank_line) { - remove_next_blank_line = false; - continue; - } - // Maintain a file hash for use in #pragma once WAR - hash = hash_larson64(line.c_str(), hash); - if (cleanline.find("#pragma once") != std::string::npos) { - pragma_once = true; - // Note: This is an attempt to recover the original line numbering, - // which otherwise gets off-by-one due to the include guard. - remove_next_blank_line = true; - // line = "//" + line; // Comment out the #pragma once line - continue; - } - - // HACK WAR for Thrust using "#define FOO #pragma bar" - size_t pragma_beg = cleanline.find("#pragma "); - if (pragma_beg != std::string::npos) { - std::string line_after_pragma = line.substr(pragma_beg); - std::vector pragma_split = - split_string(line_after_pragma, 2); - line = - (line.substr(0, pragma_beg) + "_Pragma(\"" + pragma_split[1] + "\")"); - if (pragma_split.size() == 3) { - line += " " + pragma_split[2]; - } - } - - source += line + "\n"; - } - // HACK TESTING (WAR for cub) - // source = "#define cudaDeviceSynchronize() cudaSuccess\n" + source; - ////source = "cudaError_t cudaDeviceSynchronize() { return cudaSuccess; }\n" + - /// source; - - // WAR for #pragma once causing problems when there are multiple inclusions - // of the same header from different paths. - if (pragma_once) { - std::stringstream ss; - ss << std::uppercase << std::hex << std::setw(8) << std::setfill('0') - << hash; - std::string include_guard_name = "_JITIFY_INCLUDE_GUARD_" + ss.str() + "\n"; - std::string include_guard_header; - include_guard_header += "#ifndef " + include_guard_name; - include_guard_header += "#define " + include_guard_name; - std::string include_guard_footer; - include_guard_footer += "#endif // " + include_guard_name; - source = include_guard_header + source + "\n" + include_guard_footer; - } - // return filename; - return true; -} - -} // namespace detail - -//! \endcond - -/*! Jitify reflection utilities namespace - */ -namespace reflection { - -// Provides type and value reflection via a function 'reflect': -// reflect() -> "Type" -// reflect(value) -> "(T)value" -// reflect() -> "VAL" -// reflect -> "VAL" -// reflect_template,char>() -> "" -// reflect_template({"float", "7", "char"}) -> "" - -/*! A wrapper class for non-type template parameters. - */ -template -struct NonType { - constexpr static T VALUE = VALUE_; -}; - -// Forward declaration -template -inline std::string reflect(T const& value); - -//! \cond - -namespace detail { - -template -inline std::string value_string(const T& x) { - std::stringstream ss; - ss << x; - return ss.str(); -} -// WAR for non-printable characters -template <> -inline std::string value_string(const char& x) { - std::stringstream ss; - ss << (int)x; - return ss.str(); -} -template <> -inline std::string value_string(const signed char& x) { - std::stringstream ss; - ss << (int)x; - return ss.str(); -} -template <> -inline std::string value_string(const unsigned char& x) { - std::stringstream ss; - ss << (int)x; - return ss.str(); -} -template <> -inline std::string value_string(const wchar_t& x) { - std::stringstream ss; - ss << (long)x; - return ss.str(); -} -// Specialisation for bool true/false literals -template <> -inline std::string value_string(const bool& x) { - return x ? "true" : "false"; -} - -// Removes all tokens that start with double underscores. -inline void strip_double_underscore_tokens(char* s) { - using jitify::detail::is_tokenchar; - char* w = s; - do { - if (*s == '_' && *(s + 1) == '_') { - while (is_tokenchar(*++s)) - ; - } - } while ((*w++ = *s++)); -} - -//#if CUDA_VERSION < 8000 -#ifdef _MSC_VER // MSVC compiler -inline std::string demangle_cuda_symbol(const char* mangled_name) { - // We don't have a way to demangle CUDA symbol names under MSVC. - return mangled_name; -} -inline std::string demangle_native_type(const std::type_info& typeinfo) { - // Get the decorated name and skip over the leading '.'. - const char* decorated_name = typeinfo.raw_name() + 1; - char undecorated_name[4096]; - if (UnDecorateSymbolName( - decorated_name, undecorated_name, - sizeof(undecorated_name) / sizeof(*undecorated_name), - UNDNAME_NO_ARGUMENTS | // Treat input as a type name - UNDNAME_NAME_ONLY // No "class" and "struct" prefixes - /*UNDNAME_NO_MS_KEYWORDS*/)) { // No "__cdecl", "__ptr64" etc. - // WAR for UNDNAME_NO_MS_KEYWORDS messing up function types. - strip_double_underscore_tokens(undecorated_name); - return undecorated_name; - } - throw std::runtime_error("UnDecorateSymbolName failed"); -} -#else // not MSVC -inline std::string demangle_cuda_symbol(const char* mangled_name) { - size_t bufsize = 0; - char* buf = nullptr; - std::string demangled_name; - int status; - auto demangled_ptr = std::unique_ptr( - abi::__cxa_demangle(mangled_name, buf, &bufsize, &status), free); - if (status == 0) { - demangled_name = demangled_ptr.get(); // all worked as expected - } else if (status == -2) { - demangled_name = mangled_name; // we interpret this as plain C name - } else if (status == -1) { - throw std::runtime_error( - std::string("memory allocation failure in __cxa_demangle")); - } else if (status == -3) { - throw std::runtime_error(std::string("invalid argument to __cxa_demangle")); - } - return demangled_name; -} -inline std::string demangle_native_type(const std::type_info& typeinfo) { - return demangle_cuda_symbol(typeinfo.name()); -} -#endif // not MSVC -//#endif // CUDA_VERSION < 8000 - -template -class JitifyTypeNameWrapper_ {}; - -template -struct type_reflection { - inline static std::string name() { - //#if CUDA_VERSION < 8000 - // TODO: Use nvrtcGetTypeName once it has the same behavior as this. - // WAR for typeid discarding cv qualifiers on value-types - // Wrap type in dummy template class to preserve cv-qualifiers, then strip - // off the wrapper from the resulting string. - std::string wrapped_name = - demangle_native_type(typeid(JitifyTypeNameWrapper_)); - // Note: The reflected name of this class also has namespace prefixes. - const std::string wrapper_class_name = "JitifyTypeNameWrapper_<"; - size_t start = wrapped_name.find(wrapper_class_name); - if (start == std::string::npos) { - throw std::runtime_error("Type reflection failed: " + wrapped_name); - } - start += wrapper_class_name.size(); - std::string name = - wrapped_name.substr(start, wrapped_name.size() - (start + 1)); - return name; - //#else - // std::string ret; - // nvrtcResult status = nvrtcGetTypeName(&ret); - // if( status != NVRTC_SUCCESS ) { - // throw std::runtime_error(std::string("nvrtcGetTypeName - // failed: - //")+ nvrtcGetErrorString(status)); - // } - // return ret; - //#endif - } -}; // namespace detail -template -struct type_reflection > { - inline static std::string name() { - return jitify::reflection::reflect(VALUE); - } -}; - -} // namespace detail - -//! \endcond - -/*! Create an Instance object that contains a const reference to the - * value. We use this to wrap abstract objects from which we want to extract - * their type at runtime (e.g., derived type). This is used to facilitate - * templating on derived type when all we know at compile time is abstract - * type. - */ -template -struct Instance { - const T& value; - Instance(const T& value) : value(value) {} -}; - -/*! Create an Instance object from which we can extract the value's run-time - * type. - * \param value The const value to be captured. - */ -template -inline Instance instance_of(T const& value) { - return Instance(value); -} - -/*! A wrapper used for representing types as values. - */ -template -struct Type {}; - -// Type reflection -// E.g., reflect() -> "float" -// Note: This strips trailing const and volatile qualifiers -/*! Generate a code-string for a type. - * \code{.cpp}reflect() --> "float"\endcode - */ -template -inline std::string reflect() { - return detail::type_reflection::name(); -} -// Value reflection -// E.g., reflect(3.14f) -> "(float)3.14" -/*! Generate a code-string for a value. - * \code{.cpp}reflect(3.14f) --> "(float)3.14"\endcode - */ -template -inline std::string reflect(T const& value) { - return "(" + reflect() + ")" + detail::value_string(value); -} -// Non-type template arg reflection (implicit conversion to int64_t) -// E.g., reflect<7>() -> "(int64_t)7" -/*! Generate a code-string for an integer non-type template argument. - * \code{.cpp}reflect<7>() --> "(int64_t)7"\endcode - */ -template -inline std::string reflect() { - return reflect >(); -} -// Non-type template arg reflection (explicit type) -// E.g., reflect() -> "(int)7" -/*! Generate a code-string for a generic non-type template argument. - * \code{.cpp} reflect() --> "(int)7" \endcode - */ -template -inline std::string reflect() { - return reflect >(); -} -// Type reflection via value -// E.g., reflect(Type()) -> "float" -/*! Generate a code-string for a type wrapped as a Type instance. - * \code{.cpp}reflect(Type()) --> "float"\endcode - */ -template -inline std::string reflect(jitify::reflection::Type) { - return reflect(); -} - -/*! Generate a code-string for a type wrapped as an Instance instance. - * \code{.cpp}reflect(Instance(3.1f)) --> "float"\endcode - * or more simply when passed to a instance_of helper - * \code{.cpp}reflect(instance_of(3.1f)) --> "float"\endcodei - * This is specifically for the case where we want to extract the run-time - * type, e.g., derived type, of an object pointer. - */ -template -inline std::string reflect(jitify::reflection::Instance& value) { - return detail::demangle_native_type(typeid(value.value)); -} - -// Type from value -// E.g., type_of(3.14f) -> Type() -/*! Create a Type object representing a value's type. - * \param value The value whose type is to be captured. - */ -template -inline Type type_of(T& value) { - return Type(); -} -/*! Create a Type object representing a value's type. - * \param value The const value whose type is to be captured. - */ -template -inline Type type_of(T const& value) { - return Type(); -} - -// Multiple value reflections one call, returning list of strings -template -inline std::vector reflect_all(Args... args) { - return {reflect(args)...}; -} - -inline std::string reflect_list(jitify::detail::vector const& args, - std::string opener = "", - std::string closer = "") { - std::stringstream ss; - ss << opener; - for (int i = 0; i < (int)args.size(); ++i) { - if (i > 0) ss << ","; - ss << args[i]; - } - ss << closer; - return ss.str(); -} - -// Template instantiation reflection -// inline std::string reflect_template(std::vector const& args) { -inline std::string reflect_template( - jitify::detail::vector const& args) { - // Note: The space in " >" is a WAR to avoid '>>' appearing - return reflect_list(args, "<", " >"); -} -// TODO: See if can make this evaluate completely at compile-time -template -inline std::string reflect_template() { - return reflect_template({reflect()...}); - // return reflect_template({reflect()...}); -} - -} // namespace reflection - -//! \cond - -namespace detail { - -// Demangles nested variable names using the PTX name mangling scheme -// (which follows the Itanium64 ABI). E.g., _ZN1a3Foo2bcE -> a::Foo::bc. -inline std::string demangle_ptx_variable_name(const char* name) { - std::stringstream ss; - const char* c = name; - if (*c++ != '_' || *c++ != 'Z') return name; // Non-mangled name - if (*c++ != 'N') return ""; // Not a nested name, unsupported - while (true) { - // Parse identifier length. - int n = 0; - while (std::isdigit(*c)) { - n = n * 10 + (*c - '0'); - c++; - } - if (!n) return ""; // Invalid or unsupported mangled name - // Parse identifier. - const char* c0 = c; - while (n-- && *c) c++; - if (!*c) return ""; // Mangled name is truncated - std::string id(c0, c); - // Identifiers starting with "_GLOBAL" are anonymous namespaces. - ss << (id.substr(0, 7) == "_GLOBAL" ? "(anonymous namespace)" : id); - // Nested name specifiers end with 'E'. - if (*c == 'E') break; - // There are more identifiers to come, add join token. - ss << "::"; - } - return ss.str(); -} - -static const char* get_current_executable_path() { - static const char* path = []() -> const char* { - static char buffer[JITIFY_PATH_MAX] = {}; -#ifdef __linux__ - if (!::realpath("/proc/self/exe", buffer)) return nullptr; -#elif defined(_WIN32) || defined(_WIN64) - if (!GetModuleFileNameA(nullptr, buffer, JITIFY_PATH_MAX)) return nullptr; -#endif - return buffer; - }(); - return path; -} - -inline bool endswith(const std::string& str, const std::string& suffix) { - return str.size() >= suffix.size() && - str.substr(str.size() - suffix.size()) == suffix; -} - -// Infers the JIT input type from the filename suffix. If no known suffix is -// present, the filename is assumed to refer to a library, and the associated -// suffix (and possibly prefix) is automatically added to the filename. -inline CUjitInputType get_cuda_jit_input_type(std::string* filename) { - if (endswith(*filename, ".ptx")) { - return CU_JIT_INPUT_PTX; - } else if (endswith(*filename, ".cubin")) { - return CU_JIT_INPUT_CUBIN; - } else if (endswith(*filename, ".fatbin")) { - return CU_JIT_INPUT_FATBINARY; - } else if (endswith(*filename, -#if defined _WIN32 || defined _WIN64 - ".obj" -#else // Linux - ".o" -#endif - )) { - return CU_JIT_INPUT_OBJECT; - } else { // Assume library -#if defined _WIN32 || defined _WIN64 - if (!endswith(*filename, ".lib")) { - *filename += ".lib"; - } -#else // Linux - if (!endswith(*filename, ".a")) { - *filename = "lib" + *filename + ".a"; - } -#endif - return CU_JIT_INPUT_LIBRARY; - } -} - -class CUDAKernel { - std::vector _link_files; - std::vector _link_paths; - CUlinkState _link_state; - CUmodule _module; - CUfunction _kernel; - std::string _func_name; - std::string _ptx; - std::map _global_map; - std::vector _opts; - std::vector _optvals; -#ifdef JITIFY_PRINT_LINKER_LOG - static const unsigned int _log_size = 8192; - char _error_log[_log_size]; - char _info_log[_log_size]; -#endif - - inline void cuda_safe_call(CUresult res) const { - if (res != CUDA_SUCCESS) { - const char* msg; - cuGetErrorName(res, &msg); - throw std::runtime_error(msg); - } - } - inline void create_module(std::vector link_files, - std::vector link_paths) { - CUresult result; -#ifndef JITIFY_PRINT_LINKER_LOG - // WAR since linker log does not seem to be constructed using a single call - // to cuModuleLoadDataEx. - if (link_files.empty()) { - result = - cuModuleLoadDataEx(&_module, _ptx.c_str(), (unsigned)_opts.size(), - _opts.data(), _optvals.data()); - } else -#endif - { - cuda_safe_call(cuLinkCreate((unsigned)_opts.size(), _opts.data(), - _optvals.data(), &_link_state)); - cuda_safe_call(cuLinkAddData(_link_state, CU_JIT_INPUT_PTX, - (void*)_ptx.c_str(), _ptx.size(), - "jitified_source.ptx", 0, 0, 0)); - for (int i = 0; i < (int)link_files.size(); ++i) { - std::string link_file = link_files[i]; - CUjitInputType jit_input_type; - if (link_file == ".") { - // Special case for linking to current executable. - link_file = get_current_executable_path(); - jit_input_type = CU_JIT_INPUT_OBJECT; - } else { - // Infer based on filename. - jit_input_type = get_cuda_jit_input_type(&link_file); - } - CUresult result = cuLinkAddFile(_link_state, jit_input_type, - link_file.c_str(), 0, 0, 0); - int path_num = 0; - while (result == CUDA_ERROR_FILE_NOT_FOUND && - path_num < (int)link_paths.size()) { - std::string filename = path_join(link_paths[path_num++], link_file); - result = cuLinkAddFile(_link_state, jit_input_type, filename.c_str(), - 0, 0, 0); - } -#if JITIFY_PRINT_LINKER_LOG - if (result == CUDA_ERROR_FILE_NOT_FOUND) { - std::cerr << "Linker error: Device library not found: " << link_file - << std::endl; - } else if (result != CUDA_SUCCESS) { - std::cerr << "Linker error: Failed to add file: " << link_file - << std::endl; - std::cerr << _error_log << std::endl; - } -#endif - cuda_safe_call(result); - } - size_t cubin_size; - void* cubin; - result = cuLinkComplete(_link_state, &cubin, &cubin_size); - if (result == CUDA_SUCCESS) { - result = cuModuleLoadData(&_module, cubin); - } - } -#ifdef JITIFY_PRINT_LINKER_LOG - std::cout << "---------------------------------------" << std::endl; - std::cout << "--- Linker for " - << reflection::detail::demangle_cuda_symbol(_func_name.c_str()) - << " ---" << std::endl; - std::cout << "---------------------------------------" << std::endl; - std::cout << _info_log << std::endl; - std::cout << std::endl; - std::cout << _error_log << std::endl; - std::cout << "---------------------------------------" << std::endl; -#endif - cuda_safe_call(result); - // Allow _func_name to be empty to support cases where we want to generate - // PTX containing extern symbol definitions but no kernels. - if (!_func_name.empty()) { - cuda_safe_call( - cuModuleGetFunction(&_kernel, _module, _func_name.c_str())); - } - } - inline void destroy_module() { - if (_link_state) { - cuda_safe_call(cuLinkDestroy(_link_state)); - } - _link_state = 0; - if (_module) { - cuModuleUnload(_module); - } - _module = 0; - } - - // create a map of __constant__ and __device__ variables in the ptx file - // mapping demangled to mangled name - inline void create_global_variable_map() { - size_t pos = 0; - while (pos < _ptx.size()) { - pos = std::min(_ptx.find(".const .align", pos), - _ptx.find(".global .align", pos)); - if (pos == std::string::npos) break; - size_t end = _ptx.find_first_of(";=", pos); - if (_ptx[end] == '=') --end; - std::string line = _ptx.substr(pos, end - pos); - pos = end; - size_t symbol_start = line.find_last_of(" ") + 1; - size_t symbol_end = line.find_last_of("["); - std::string entry = line.substr(symbol_start, symbol_end - symbol_start); - std::string key = detail::demangle_ptx_variable_name(entry.c_str()); - // Skip unsupported mangled names. E.g., a static variable defined inside - // a function (such variables are not directly addressable from outside - // the function, so skipping them is the correct behavior). - if (key == "") continue; - _global_map[key] = entry; - } - } - - inline void set_linker_log() { -#ifdef JITIFY_PRINT_LINKER_LOG - _opts.push_back(CU_JIT_INFO_LOG_BUFFER); - _optvals.push_back((void*)_info_log); - _opts.push_back(CU_JIT_INFO_LOG_BUFFER_SIZE_BYTES); - _optvals.push_back((void*)(long)_log_size); - _opts.push_back(CU_JIT_ERROR_LOG_BUFFER); - _optvals.push_back((void*)_error_log); - _opts.push_back(CU_JIT_ERROR_LOG_BUFFER_SIZE_BYTES); - _optvals.push_back((void*)(long)_log_size); - _opts.push_back(CU_JIT_LOG_VERBOSE); - _optvals.push_back((void*)1); -#endif - } - - public: - inline CUDAKernel() : _link_state(0), _module(0), _kernel(0) {} - inline CUDAKernel(const CUDAKernel& other) = delete; - inline CUDAKernel& operator=(const CUDAKernel& other) = delete; - inline CUDAKernel(CUDAKernel&& other) = delete; - inline CUDAKernel& operator=(CUDAKernel&& other) = delete; - inline CUDAKernel(const char* func_name, const char* ptx, - std::vector link_files, - std::vector link_paths, unsigned int nopts = 0, - CUjit_option* opts = 0, void** optvals = 0) - : _link_files(link_files), - _link_paths(link_paths), - _link_state(0), - _module(0), - _kernel(0), - _func_name(func_name), - _ptx(ptx), - _opts(opts, opts + nopts), - _optvals(optvals, optvals + nopts) { - this->set_linker_log(); - this->create_module(link_files, link_paths); - this->create_global_variable_map(); - } - - inline CUDAKernel& set(const char* func_name, const char* ptx, - std::vector link_files, - std::vector link_paths, - unsigned int nopts = 0, CUjit_option* opts = 0, - void** optvals = 0) { - this->destroy_module(); - _func_name = func_name; - _ptx = ptx; - _link_files = link_files; - _link_paths = link_paths; - _opts.assign(opts, opts + nopts); - _optvals.assign(optvals, optvals + nopts); - this->set_linker_log(); - this->create_module(link_files, link_paths); - this->create_global_variable_map(); - return *this; - } - inline ~CUDAKernel() { this->destroy_module(); } - inline operator CUfunction() const { return _kernel; } - - inline CUresult launch(dim3 grid, dim3 block, unsigned int smem, - CUstream stream, std::vector arg_ptrs) const { - return cuLaunchKernel(_kernel, grid.x, grid.y, grid.z, block.x, block.y, - block.z, smem, stream, arg_ptrs.data(), NULL); - } - - inline CUdeviceptr get_global_ptr(const char* name, - size_t* size = nullptr) const { - CUdeviceptr global_ptr = 0; - auto global = _global_map.find(name); - if (global != _global_map.end()) { - cuda_safe_call(cuModuleGetGlobal(&global_ptr, size, _module, - global->second.c_str())); - } else { - throw std::runtime_error(std::string("failed to look up global ") + name); - } - return global_ptr; - } - - template - inline CUresult get_global_data(const char* name, T* data, size_t count, - CUstream stream = 0) const { - size_t size_bytes; - CUdeviceptr ptr = get_global_ptr(name, &size_bytes); - size_t given_size_bytes = count * sizeof(T); - if (given_size_bytes != size_bytes) { - throw std::runtime_error( - std::string("Value for global variable ") + name + - " has wrong size: got " + std::to_string(given_size_bytes) + - " bytes, expected " + std::to_string(size_bytes)); - } - return cuMemcpyDtoH(data, ptr, size_bytes); - } - - template - inline CUresult set_global_data(const char* name, const T* data, size_t count, - CUstream stream = 0) const { - size_t size_bytes; - CUdeviceptr ptr = get_global_ptr(name, &size_bytes); - size_t given_size_bytes = count * sizeof(T); - if (given_size_bytes != size_bytes) { - throw std::runtime_error( - std::string("Value for global variable ") + name + - " has wrong size: got " + std::to_string(given_size_bytes) + - " bytes, expected " + std::to_string(size_bytes)); - } - return cuMemcpyHtoD(ptr, data, size_bytes); - } - - const std::string& function_name() const { return _func_name; } - const std::string& ptx() const { return _ptx; } - const std::vector& link_files() const { return _link_files; } - const std::vector& link_paths() const { return _link_paths; } -}; - -static const char* jitsafe_header_preinclude_h = R"( -//// WAR for Thrust (which appears to have forgotten to include this in result_of_adaptable_function.h -//#include - -//// WAR for Thrust (which appear to have forgotten to include this in error_code.h) -//#include - -// WAR for Thrust (which only supports gnuc, clang or msvc) -#define __GNUC__ 4 - -// WAR for generics/shfl.h -#define THRUST_STATIC_ASSERT(x) - -// WAR for CUB -#ifdef __host__ -#undef __host__ -#endif -#define __host__ - -// WAR to allow exceptions to be parsed -#define try -#define catch(...) -)"; - - -static const char* jitsafe_header_float_h = R"( -#pragma once - -#define FLT_RADIX 2 -#define FLT_MANT_DIG 24 -#define DBL_MANT_DIG 53 -#define FLT_DIG 6 -#define DBL_DIG 15 -#define FLT_MIN_EXP -125 -#define DBL_MIN_EXP -1021 -#define FLT_MIN_10_EXP -37 -#define DBL_MIN_10_EXP -307 -#define FLT_MAX_EXP 128 -#define DBL_MAX_EXP 1024 -#define FLT_MAX_10_EXP 38 -#define DBL_MAX_10_EXP 308 -#define FLT_MAX 3.4028234e38f -#define DBL_MAX 1.7976931348623157e308 -#define FLT_EPSILON 1.19209289e-7f -#define DBL_EPSILON 2.220440492503130e-16 -#define FLT_MIN 1.1754943e-38f; -#define DBL_MIN 2.2250738585072013e-308 -#define FLT_ROUNDS 1 -#if defined __cplusplus && __cplusplus >= 201103L -#define FLT_EVAL_METHOD 0 -#define DECIMAL_DIG 21 -#endif -)"; - -static const char* jitsafe_header_limits_h = R"( -#pragma once - -#if defined _WIN32 || defined _WIN64 - #define __WORDSIZE 32 -#else - #if defined __x86_64__ && !defined __ILP32__ - #define __WORDSIZE 64 - #else - #define __WORDSIZE 32 - #endif -#endif -#define MB_LEN_MAX 16 -#define CHAR_BIT 8 -#define SCHAR_MIN (-128) -#define SCHAR_MAX 127 -#define UCHAR_MAX 255 -enum { - _JITIFY_CHAR_IS_UNSIGNED = (char)-1 >= 0, - CHAR_MIN = _JITIFY_CHAR_IS_UNSIGNED ? 0 : SCHAR_MIN, - CHAR_MAX = _JITIFY_CHAR_IS_UNSIGNED ? UCHAR_MAX : SCHAR_MAX, -}; -#define SHRT_MIN (-32768) -#define SHRT_MAX 32767 -#define USHRT_MAX 65535 -#define INT_MIN (-INT_MAX - 1) -#define INT_MAX 2147483647 -#define UINT_MAX 4294967295U -#if __WORDSIZE == 64 - # define LONG_MAX 9223372036854775807L -#else - # define LONG_MAX 2147483647L -#endif -#define LONG_MIN (-LONG_MAX - 1L) -#if __WORDSIZE == 64 - #define ULONG_MAX 18446744073709551615UL -#else - #define ULONG_MAX 4294967295UL -#endif -#define LLONG_MAX 9223372036854775807LL -#define LLONG_MIN (-LLONG_MAX - 1LL) -#define ULLONG_MAX 18446744073709551615ULL -)"; - -static const char* jitsafe_header_iterator = R"( -#pragma once - -namespace __jitify_iterator_ns { -struct output_iterator_tag {}; -struct input_iterator_tag {}; -struct forward_iterator_tag {}; -struct bidirectional_iterator_tag {}; -struct random_access_iterator_tag {}; -template -struct iterator_traits { - typedef typename Iterator::iterator_category iterator_category; - typedef typename Iterator::value_type value_type; - typedef typename Iterator::difference_type difference_type; - typedef typename Iterator::pointer pointer; - typedef typename Iterator::reference reference; -}; -template -struct iterator_traits { - typedef random_access_iterator_tag iterator_category; - typedef T value_type; - typedef ptrdiff_t difference_type; - typedef T* pointer; - typedef T& reference; -}; -template -struct iterator_traits { - typedef random_access_iterator_tag iterator_category; - typedef T value_type; - typedef ptrdiff_t difference_type; - typedef T const* pointer; - typedef T const& reference; -}; -} // namespace __jitify_iterator_ns -namespace std { using namespace __jitify_iterator_ns; } -using namespace __jitify_iterator_ns; -)"; - -// TODO: This is incomplete; need floating point limits -// Joe Eaton: added IEEE float and double types, none of the smaller types -// using type specific structs since we can't template on floats. -static const char* jitsafe_header_limits = R"( -#pragma once -#include -#include -// TODO: epsilon(), infinity(), etc -namespace __jitify_detail { -#if __cplusplus >= 201103L -#define JITIFY_CXX11_CONSTEXPR constexpr -#define JITIFY_CXX11_NOEXCEPT noexcept -#else -#define JITIFY_CXX11_CONSTEXPR -#define JITIFY_CXX11_NOEXCEPT -#endif - -struct FloatLimits { -#if __cplusplus >= 201103L - static JITIFY_CXX11_CONSTEXPR inline __host__ __device__ - float lowest() JITIFY_CXX11_NOEXCEPT { return -FLT_MAX;} - static JITIFY_CXX11_CONSTEXPR inline __host__ __device__ - float min() JITIFY_CXX11_NOEXCEPT { return FLT_MIN; } - static JITIFY_CXX11_CONSTEXPR inline __host__ __device__ - float max() JITIFY_CXX11_NOEXCEPT { return FLT_MAX; } -#endif // __cplusplus >= 201103L - enum { - is_specialized = true, - is_signed = true, - is_integer = false, - is_exact = false, - has_infinity = true, - has_quiet_NaN = true, - has_signaling_NaN = true, - has_denorm = 1, - has_denorm_loss = true, - round_style = 1, - is_iec559 = true, - is_bounded = true, - is_modulo = false, - digits = 24, - digits10 = 6, - max_digits10 = 9, - radix = 2, - min_exponent = -125, - min_exponent10 = -37, - max_exponent = 128, - max_exponent10 = 38, - tinyness_before = false, - traps = false - }; -}; -struct DoubleLimits { -#if __cplusplus >= 201103L - static JITIFY_CXX11_CONSTEXPR inline __host__ __device__ - double lowest() noexcept { return -DBL_MAX; } - static JITIFY_CXX11_CONSTEXPR inline __host__ __device__ - double min() noexcept { return DBL_MIN; } - static JITIFY_CXX11_CONSTEXPR inline __host__ __device__ - double max() noexcept { return DBL_MAX; } -#endif // __cplusplus >= 201103L - enum { - is_specialized = true, - is_signed = true, - is_integer = false, - is_exact = false, - has_infinity = true, - has_quiet_NaN = true, - has_signaling_NaN = true, - has_denorm = 1, - has_denorm_loss = true, - round_style = 1, - is_iec559 = true, - is_bounded = true, - is_modulo = false, - digits = 53, - digits10 = 15, - max_digits10 = 17, - radix = 2, - min_exponent = -1021, - min_exponent10 = -307, - max_exponent = 1024, - max_exponent10 = 308, - tinyness_before = false, - traps = false - }; -}; -template -struct IntegerLimits { - static inline __host__ __device__ T min() { return Min; } - static inline __host__ __device__ T max() { return Max; } -#if __cplusplus >= 201103L - static constexpr inline __host__ __device__ T lowest() noexcept { - return Min; - } -#endif // __cplusplus >= 201103L - enum { - is_specialized = true, - digits = (Digits == -1) ? (int)(sizeof(T)*8 - (Min != 0)) : Digits, - digits10 = (digits * 30103) / 100000, - is_signed = ((T)(-1)<0), - is_integer = true, - is_exact = true, - radix = 2, - is_bounded = true, - is_modulo = false - }; -}; -} // namespace __jitify_detail -namespace std { using namespace __jitify_detail; } -namespace __jitify_limits_ns { -template struct numeric_limits { - enum { is_specialized = false }; -}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits {}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits -{}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits -{}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits -{}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits {}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits -{}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits -{}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits {}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits -{}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits -{}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits -{}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits -{}; -template<> struct numeric_limits : public -__jitify_detail::IntegerLimits -{}; -//template struct numeric_limits { static const bool -//is_signed = ((T)(-1)<0); }; -template<> struct numeric_limits : public -__jitify_detail::FloatLimits -{}; -template<> struct numeric_limits : public -__jitify_detail::DoubleLimits -{}; -} // namespace __jitify_limits_ns -namespace std { using namespace __jitify_limits_ns; } -using namespace __jitify_limits_ns; -)"; - -// TODO: This is highly incomplete -static const char* jitsafe_header_type_traits = R"( - #pragma once - #if __cplusplus >= 201103L - namespace __jitify_type_traits_ns { - - template struct enable_if {}; - template struct enable_if { typedef T type; }; - #if __cplusplus >= 201402L - template< bool B, class T = void > using enable_if_t = typename enable_if::type; - #endif - - struct true_type { - enum { value = true }; - operator bool() const { return true; } - }; - struct false_type { - enum { value = false }; - operator bool() const { return false; } - }; - - template struct is_floating_point : false_type {}; - template<> struct is_floating_point : true_type {}; - template<> struct is_floating_point : true_type {}; - template<> struct is_floating_point : true_type {}; - - template struct is_integral : false_type {}; - template<> struct is_integral : true_type {}; - template<> struct is_integral : true_type {}; - template<> struct is_integral : true_type {}; - template<> struct is_integral : true_type {}; - template<> struct is_integral : true_type {}; - template<> struct is_integral : true_type {}; - template<> struct is_integral : true_type {}; - template<> struct is_integral : true_type {}; - template<> struct is_integral : true_type {}; - template<> struct is_integral : true_type {}; - template<> struct is_integral : true_type {}; - template<> struct is_integral : true_type {}; - - template struct is_signed : false_type {}; - template<> struct is_signed : true_type {}; - template<> struct is_signed : true_type {}; - template<> struct is_signed : true_type {}; - template<> struct is_signed : true_type {}; - template<> struct is_signed : true_type {}; - template<> struct is_signed : true_type {}; - template<> struct is_signed : true_type {}; - template<> struct is_signed : true_type {}; - - template struct is_unsigned : false_type {}; - template<> struct is_unsigned : true_type {}; - template<> struct is_unsigned : true_type {}; - template<> struct is_unsigned : true_type {}; - template<> struct is_unsigned : true_type {}; - template<> struct is_unsigned : true_type {}; - - template struct is_same : false_type {}; - template struct is_same : true_type {}; - - template struct is_array : false_type {}; - template struct is_array : true_type {}; - template struct is_array : true_type {}; - - //partial implementation only of is_function - template struct is_function : false_type { }; - template struct is_function : true_type {}; //regular - template struct is_function : true_type {}; // variadic - - template struct result_of; - template - struct result_of { - // TODO: This is a hack; a proper implem is quite complicated. - typedef typename F::result_type type; - }; - - template struct remove_reference { typedef T type; }; - template struct remove_reference { typedef T type; }; - template struct remove_reference { typedef T type; }; - #if __cplusplus >= 201402L - template< class T > using remove_reference_t = typename remove_reference::type; - #endif - - template struct remove_extent { typedef T type; }; - template struct remove_extent { typedef T type; }; - template struct remove_extent { typedef T type; }; - #if __cplusplus >= 201402L - template< class T > using remove_extent_t = typename remove_extent::type; - #endif - - template< class T > struct remove_const { typedef T type; }; - template< class T > struct remove_const { typedef T type; }; - template< class T > struct remove_volatile { typedef T type; }; - template< class T > struct remove_volatile { typedef T type; }; - template< class T > struct remove_cv { typedef typename remove_volatile::type>::type type; }; - #if __cplusplus >= 201402L - template< class T > using remove_cv_t = typename remove_cv::type; - template< class T > using remove_const_t = typename remove_const::type; - template< class T > using remove_volatile_t = typename remove_volatile::type; - #endif - - template struct conditional { typedef T type; }; - template struct conditional { typedef F type; }; - #if __cplusplus >= 201402L - template< bool B, class T, class F > using conditional_t = typename conditional::type; - #endif - - namespace __jitify_detail { - template< class T, bool is_function_type = false > struct add_pointer { using type = typename remove_reference::type*; }; - template< class T > struct add_pointer { using type = T; }; - template< class T, class... Args > struct add_pointer { using type = T(*)(Args...); }; - template< class T, class... Args > struct add_pointer { using type = T(*)(Args..., ...); }; - } - template< class T > struct add_pointer : __jitify_detail::add_pointer::value> {}; - #if __cplusplus >= 201402L - template< class T > using add_pointer_t = typename add_pointer::type; - #endif - - template< class T > struct decay { - private: - typedef typename remove_reference::type U; - public: - typedef typename conditional::value, typename remove_extent::type*, - typename conditional::value,typename add_pointer::type,typename remove_cv::type - >::type>::type type; - }; - #if __cplusplus >= 201402L - template< class T > using decay_t = typename decay::type; - #endif - - } // namespace __jtiify_type_traits_ns - namespace std { using namespace __jitify_type_traits_ns; } - using namespace __jitify_type_traits_ns; - #endif // c++11 -)"; - -// TODO: INT_FAST8_MAX et al. and a few other misc constants -static const char* jitsafe_header_stdint_h = - "#pragma once\n" - "#include \n" - "namespace __jitify_stdint_ns {\n" - "typedef signed char int8_t;\n" - "typedef signed short int16_t;\n" - "typedef signed int int32_t;\n" - "typedef signed long long int64_t;\n" - "typedef signed char int_fast8_t;\n" - "typedef signed short int_fast16_t;\n" - "typedef signed int int_fast32_t;\n" - "typedef signed long long int_fast64_t;\n" - "typedef signed char int_least8_t;\n" - "typedef signed short int_least16_t;\n" - "typedef signed int int_least32_t;\n" - "typedef signed long long int_least64_t;\n" - "typedef signed long long intmax_t;\n" - "typedef signed long intptr_t; //optional\n" - "typedef unsigned char uint8_t;\n" - "typedef unsigned short uint16_t;\n" - "typedef unsigned int uint32_t;\n" - "typedef unsigned long long uint64_t;\n" - "typedef unsigned char uint_fast8_t;\n" - "typedef unsigned short uint_fast16_t;\n" - "typedef unsigned int uint_fast32_t;\n" - "typedef unsigned long long uint_fast64_t;\n" - "typedef unsigned char uint_least8_t;\n" - "typedef unsigned short uint_least16_t;\n" - "typedef unsigned int uint_least32_t;\n" - "typedef unsigned long long uint_least64_t;\n" - "typedef unsigned long long uintmax_t;\n" - "typedef unsigned long uintptr_t; //optional\n" - "#define INT8_MIN SCHAR_MIN\n" - "#define INT16_MIN SHRT_MIN\n" - "#define INT32_MIN INT_MIN\n" - "#define INT64_MIN LLONG_MIN\n" - "#define INT8_MAX SCHAR_MAX\n" - "#define INT16_MAX SHRT_MAX\n" - "#define INT32_MAX INT_MAX\n" - "#define INT64_MAX LLONG_MAX\n" - "#define UINT8_MAX UCHAR_MAX\n" - "#define UINT16_MAX USHRT_MAX\n" - "#define UINT32_MAX UINT_MAX\n" - "#define UINT64_MAX ULLONG_MAX\n" - "#define INTPTR_MIN LONG_MIN\n" - "#define INTMAX_MIN LLONG_MIN\n" - "#define INTPTR_MAX LONG_MAX\n" - "#define INTMAX_MAX LLONG_MAX\n" - "#define UINTPTR_MAX ULONG_MAX\n" - "#define UINTMAX_MAX ULLONG_MAX\n" - "#define PTRDIFF_MIN INTPTR_MIN\n" - "#define PTRDIFF_MAX INTPTR_MAX\n" - "#define SIZE_MAX UINT64_MAX\n" - "} // namespace __jitify_stdint_ns\n" - "namespace std { using namespace __jitify_stdint_ns; }\n" - "using namespace __jitify_stdint_ns;\n"; - -// TODO: offsetof -static const char* jitsafe_header_stddef_h = - "#pragma once\n" - "#include \n" - "namespace __jitify_stddef_ns {\n" - "#if __cplusplus >= 201103L\n" - "typedef decltype(nullptr) nullptr_t;\n" - "#if defined(_MSC_VER)\n" - " typedef double max_align_t;\n" - "#elif defined(__APPLE__)\n" - " typedef long double max_align_t;\n" - "#else\n" - " // Define max_align_t to match the GCC definition.\n" - " typedef struct {\n" - " long long __jitify_max_align_nonce1\n" - " __attribute__((__aligned__(__alignof__(long long))));\n" - " long double __jitify_max_align_nonce2\n" - " __attribute__((__aligned__(__alignof__(long double))));\n" - " } max_align_t;\n" - "#endif\n" - "#endif // __cplusplus >= 201103L\n" - "#if __cplusplus >= 201703L\n" - "enum class byte : unsigned char {};\n" - "#endif // __cplusplus >= 201703L\n" - "} // namespace __jitify_stddef_ns\n" - "namespace std {\n" - " // NVRTC provides built-in definitions of ::size_t and ::ptrdiff_t.\n" - " using ::size_t;\n" - " using ::ptrdiff_t;\n" - " using namespace __jitify_stddef_ns;\n" - "} // namespace std\n" - "using namespace __jitify_stddef_ns;\n"; - -static const char* jitsafe_header_stdlib_h = - "#pragma once\n" - "#include \n"; -static const char* jitsafe_header_stdio_h = - "#pragma once\n" - "#include \n" - "#define FILE int\n" - "int fflush ( FILE * stream );\n" - "int fprintf ( FILE * stream, const char * format, ... );\n"; - -static const char* jitsafe_header_string_h = - "#pragma once\n" - "char* strcpy ( char * destination, const char * source );\n" - "int strcmp ( const char * str1, const char * str2 );\n" - "char* strerror( int errnum );\n"; - -static const char* jitsafe_header_cstring = - "#pragma once\n" - "\n" - "namespace __jitify_cstring_ns {\n" - "char* strcpy ( char * destination, const char * source );\n" - "int strcmp ( const char * str1, const char * str2 );\n" - "char* strerror( int errnum );\n" - "} // namespace __jitify_cstring_ns\n" - "namespace std { using namespace __jitify_cstring_ns; }\n" - "using namespace __jitify_cstring_ns;\n"; - -// HACK TESTING (WAR for cub) -static const char* jitsafe_header_iostream = - "#pragma once\n" - "#include \n" - "#include \n"; -// HACK TESTING (WAR for Thrust) -static const char* jitsafe_header_ostream = - "#pragma once\n" - "\n" - "namespace __jitify_ostream_ns {\n" - "template\n" // = std::char_traits - // >\n" - "struct basic_ostream {\n" - "};\n" - "typedef basic_ostream ostream;\n" - "ostream& endl(ostream& os);\n" - "ostream& operator<<( ostream&, ostream& (*f)( ostream& ) );\n" - "template< class CharT, class Traits > basic_ostream& endl( " - "basic_ostream& os );\n" - "template< class CharT, class Traits > basic_ostream& " - "operator<<( basic_ostream& os, const char* c );\n" - "#if __cplusplus >= 201103L\n" - "template< class CharT, class Traits, class T > basic_ostream& operator<<( basic_ostream&& os, const T& value );\n" - "#endif // __cplusplus >= 201103L\n" - "} // namespace __jitify_ostream_ns\n" - "namespace std { using namespace __jitify_ostream_ns; }\n" - "using namespace __jitify_ostream_ns;\n"; - -static const char* jitsafe_header_istream = - "#pragma once\n" - "\n" - "namespace __jitify_istream_ns {\n" - "template\n" // = std::char_traits - // >\n" - "struct basic_istream {\n" - "};\n" - "typedef basic_istream istream;\n" - "} // namespace __jitify_istream_ns\n" - "namespace std { using namespace __jitify_istream_ns; }\n" - "using namespace __jitify_istream_ns;\n"; - -static const char* jitsafe_header_sstream = - "#pragma once\n" - "#include \n" - "#include \n"; - -static const char* jitsafe_header_utility = - "#pragma once\n" - "namespace __jitify_utility_ns {\n" - "template\n" - "struct pair {\n" - " T1 first;\n" - " T2 second;\n" - " inline pair() {}\n" - " inline pair(T1 const& first_, T2 const& second_)\n" - " : first(first_), second(second_) {}\n" - " // TODO: Standard includes many more constructors...\n" - " // TODO: Comparison operators\n" - "};\n" - "template\n" - "pair make_pair(T1 const& first, T2 const& second) {\n" - " return pair(first, second);\n" - "}\n" - "} // namespace __jitify_utility_ns\n" - "namespace std { using namespace __jitify_utility_ns; }\n" - "using namespace __jitify_utility_ns;\n"; - -// TODO: incomplete -static const char* jitsafe_header_vector = - "#pragma once\n" - "namespace __jitify_vector_ns {\n" - "template\n" // = std::allocator> \n" - "struct vector {\n" - "};\n" - "} // namespace __jitify_vector_ns\n" - "namespace std { using namespace __jitify_vector_ns; }\n" - "using namespace __jitify_vector_ns;\n"; - -// TODO: incomplete -static const char* jitsafe_header_string = - "#pragma once\n" - "namespace __jitify_string_ns {\n" - "template\n" - "struct basic_string {\n" - "basic_string();\n" - "basic_string( const CharT* s );\n" //, const Allocator& alloc = - // Allocator() );\n" - "const CharT* c_str() const;\n" - "bool empty() const;\n" - "void operator+=(const char *);\n" - "void operator+=(const basic_string &);\n" - "};\n" - "typedef basic_string string;\n" - "} // namespace __jitify_string_ns\n" - "namespace std { using namespace __jitify_string_ns; }\n" - "using namespace __jitify_string_ns;\n"; - -// TODO: incomplete -static const char* jitsafe_header_stdexcept = - "#pragma once\n" - "namespace __jitify_stdexcept_ns {\n" - "struct runtime_error {\n" - "explicit runtime_error( const std::string& what_arg );" - "explicit runtime_error( const char* what_arg );" - "virtual const char* what() const;\n" - "};\n" - "} // namespace __jitify_stdexcept_ns\n" - "namespace std { using namespace __jitify_stdexcept_ns; }\n" - "using namespace __jitify_stdexcept_ns;\n"; - -// TODO: incomplete -static const char* jitsafe_header_complex = - "#pragma once\n" - "namespace __jitify_complex_ns {\n" - "template\n" - "class complex {\n" - " T _real;\n" - " T _imag;\n" - "public:\n" - " complex() : _real(0), _imag(0) {}\n" - " complex(T const& real, T const& imag)\n" - " : _real(real), _imag(imag) {}\n" - " complex(T const& real)\n" - " : _real(real), _imag(static_cast(0)) {}\n" - " T const& real() const { return _real; }\n" - " T& real() { return _real; }\n" - " void real(const T &r) { _real = r; }\n" - " T const& imag() const { return _imag; }\n" - " T& imag() { return _imag; }\n" - " void imag(const T &i) { _imag = i; }\n" - " complex& operator+=(const complex z)\n" - " { _real += z.real(); _imag += z.imag(); return *this; }\n" - "};\n" - "template\n" - "complex operator*(const complex& lhs, const complex& rhs)\n" - " { return complex(lhs.real()*rhs.real()-lhs.imag()*rhs.imag(),\n" - " lhs.real()*rhs.imag()+lhs.imag()*rhs.real()); }\n" - "template\n" - "complex operator*(const complex& lhs, const T & rhs)\n" - " { return complexs(lhs.real()*rhs,lhs.imag()*rhs); }\n" - "template\n" - "complex operator*(const T& lhs, const complex& rhs)\n" - " { return complexs(rhs.real()*lhs,rhs.imag()*lhs); }\n" - "} // namespace __jitify_complex_ns\n" - "namespace std { using namespace __jitify_complex_ns; }\n" - "using namespace __jitify_complex_ns;\n"; - -// TODO: This is incomplete (missing binary and integer funcs, macros, -// constants, types) -static const char* jitsafe_header_math = - "#pragma once\n" - "namespace __jitify_math_ns {\n" - "#if __cplusplus >= 201103L\n" - "#define DEFINE_MATH_UNARY_FUNC_WRAPPER(f) \\\n" - " inline double f(double x) { return ::f(x); } \\\n" - " inline float f##f(float x) { return ::f(x); } \\\n" - " /*inline long double f##l(long double x) { return ::f(x); }*/ \\\n" - " inline float f(float x) { return ::f(x); } \\\n" - " /*inline long double f(long double x) { return ::f(x); }*/\n" - "#else\n" - "#define DEFINE_MATH_UNARY_FUNC_WRAPPER(f) \\\n" - " inline double f(double x) { return ::f(x); } \\\n" - " inline float f##f(float x) { return ::f(x); } \\\n" - " /*inline long double f##l(long double x) { return ::f(x); }*/\n" - "#endif\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(cos)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(sin)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(tan)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(acos)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(asin)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(atan)\n" - "template inline T atan2(T y, T x) { return ::atan2(y, x); }\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(cosh)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(sinh)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(tanh)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(exp)\n" - "template inline T frexp(T x, int* exp) { return ::frexp(x, " - "exp); }\n" - "template inline T ldexp(T x, int exp) { return ::ldexp(x, " - "exp); }\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(log)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(log10)\n" - "template inline T modf(T x, T* intpart) { return ::modf(x, " - "intpart); }\n" - "template inline T pow(T x, T y) { return ::pow(x, y); }\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(sqrt)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(ceil)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(floor)\n" - "template inline T fmod(T n, T d) { return ::fmod(n, d); }\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(fabs)\n" - "template inline T abs(T x) { return ::abs(x); }\n" - "#if __cplusplus >= 201103L\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(acosh)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(asinh)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(atanh)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(exp2)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(expm1)\n" - "template inline int ilogb(T x) { return ::ilogb(x); }\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(log1p)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(log2)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(logb)\n" - "template inline T scalbn (T x, int n) { return ::scalbn(x, " - "n); }\n" - "template inline T scalbln(T x, long n) { return ::scalbn(x, " - "n); }\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(cbrt)\n" - "template inline T hypot(T x, T y) { return ::hypot(x, y); }\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(erf)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(erfc)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(tgamma)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(lgamma)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(trunc)\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(round)\n" - "template inline long lround(T x) { return ::lround(x); }\n" - "template inline long long llround(T x) { return ::llround(x); " - "}\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(rint)\n" - "template inline long lrint(T x) { return ::lrint(x); }\n" - "template inline long long llrint(T x) { return ::llrint(x); " - "}\n" - "DEFINE_MATH_UNARY_FUNC_WRAPPER(nearbyint)\n" - // TODO: remainder, remquo, copysign, nan, nextafter, nexttoward, fdim, - // fmax, fmin, fma - "#endif\n" - "#undef DEFINE_MATH_UNARY_FUNC_WRAPPER\n" - "} // namespace __jitify_math_ns\n" - "namespace std { using namespace __jitify_math_ns; }\n" - "#define M_PI 3.14159265358979323846\n" - // Note: Global namespace already includes CUDA math funcs - "//using namespace __jitify_math_ns;\n"; - -static const char* jitsafe_header_memory_h = R"( - #pragma once - #include - )"; - -// TODO: incomplete -static const char* jitsafe_header_mutex = R"( - #pragma once - #if __cplusplus >= 201103L - namespace __jitify_mutex_ns { - class mutex { - public: - void lock(); - bool try_lock(); - void unlock(); - }; - } // namespace __jitify_mutex_ns - namespace std { using namespace __jitify_mutex_ns; } - using namespace __jitify_mutex_ns; - #endif - )"; - -static const char* jitsafe_header_algorithm = R"( - #pragma once - #if __cplusplus >= 201103L - namespace __jitify_algorithm_ns { - - #if __cplusplus == 201103L - #define JITIFY_CXX14_CONSTEXPR - #else - #define JITIFY_CXX14_CONSTEXPR constexpr - #endif - - template JITIFY_CXX14_CONSTEXPR const T& max(const T& a, const T& b) - { - return (b > a) ? b : a; - } - template JITIFY_CXX14_CONSTEXPR const T& min(const T& a, const T& b) - { - return (b < a) ? b : a; - } - - } // namespace __jitify_algorithm_ns - namespace std { using namespace __jitify_algorithm_ns; } - using namespace __jitify_algorithm_ns; - #endif - )"; - -static const char* jitsafe_header_time_h = R"( - #pragma once - #define NULL 0 - #define CLOCKS_PER_SEC 1000000 - namespace __jitify_time_ns { - typedef long time_t; - struct tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; - }; - #if __cplusplus >= 201703L - struct timespec { - time_t tv_sec; - long tv_nsec; - }; - #endif - } // namespace __jitify_time_ns - namespace std { - // NVRTC provides built-in definitions of ::size_t and ::clock_t. - using ::size_t; - using ::clock_t; - using namespace __jitify_time_ns; - } - using namespace __jitify_time_ns; - )"; - -// WAR: These need to be pre-included as a workaround for NVRTC implicitly using -// /usr/include as an include path. The other built-in headers will be included -// lazily as needed. -static const char* preinclude_jitsafe_header_names[] = { - "jitify_preinclude.h", - "limits.h", - "math.h", - "memory.h", - "stdint.h", - "stdlib.h", - "stdio.h", - "string.h", - "time.h", -}; - -template -int array_size(T (&)[N]) { - return N; -} -const int preinclude_jitsafe_headers_count = - array_size(preinclude_jitsafe_header_names); - -static const std::map& get_jitsafe_headers_map() { - static const std::map jitsafe_headers_map = { - {"jitify_preinclude.h", jitsafe_header_preinclude_h}, - {"float.h", jitsafe_header_float_h}, - {"cfloat", jitsafe_header_float_h}, - {"limits.h", jitsafe_header_limits_h}, - {"climits", jitsafe_header_limits_h}, - {"stdint.h", jitsafe_header_stdint_h}, - {"cstdint", jitsafe_header_stdint_h}, - {"stddef.h", jitsafe_header_stddef_h}, - {"cstddef", jitsafe_header_stddef_h}, - {"stdlib.h", jitsafe_header_stdlib_h}, - {"cstdlib", jitsafe_header_stdlib_h}, - {"stdio.h", jitsafe_header_stdio_h}, - {"cstdio", jitsafe_header_stdio_h}, - {"string.h", jitsafe_header_string_h}, - {"cstring", jitsafe_header_cstring}, - {"iterator", jitsafe_header_iterator}, - {"limits", jitsafe_header_limits}, - {"type_traits", jitsafe_header_type_traits}, - {"utility", jitsafe_header_utility}, - {"math.h", jitsafe_header_math}, - {"cmath", jitsafe_header_math}, - {"memory.h", jitsafe_header_memory_h}, - {"complex", jitsafe_header_complex}, - {"iostream", jitsafe_header_iostream}, - {"ostream", jitsafe_header_ostream}, - {"istream", jitsafe_header_istream}, - {"sstream", jitsafe_header_sstream}, - {"vector", jitsafe_header_vector}, - {"string", jitsafe_header_string}, - {"stdexcept", jitsafe_header_stdexcept}, - {"mutex", jitsafe_header_mutex}, - {"algorithm", jitsafe_header_algorithm}, - {"time.h", jitsafe_header_time_h}, - {"ctime", jitsafe_header_time_h}, - }; - return jitsafe_headers_map; -} - -inline void add_options_from_env(std::vector& options) { - // Add options from environment variable - const char* env_options = std::getenv("JITIFY_OPTIONS"); - if (env_options) { - std::stringstream ss; - ss << env_options; - std::string opt; - while (!(ss >> opt).fail()) { - options.push_back(opt); - } - } - // Add options from JITIFY_OPTIONS macro -#ifdef JITIFY_OPTIONS -#define JITIFY_TOSTRING_IMPL(x) #x -#define JITIFY_TOSTRING(x) JITIFY_TOSTRING_IMPL(x) - std::stringstream ss; - ss << JITIFY_TOSTRING(JITIFY_OPTIONS); - std::string opt; - while (!(ss >> opt).fail()) { - options.push_back(opt); - } -#undef JITIFY_TOSTRING -#undef JITIFY_TOSTRING_IMPL -#endif // JITIFY_OPTIONS -} - -inline void detect_and_add_cuda_arch(std::vector& options) { - for (int i = 0; i < (int)options.size(); ++i) { - // Note that this will also match the middle of "--gpu-architecture". - if (options[i].find("-arch") != std::string::npos) { - // Arch already specified in options - return; - } - } - // Use the compute capability of the current device - // TODO: Check these API calls for errors - cudaError_t status; - int device; - status = cudaGetDevice(&device); - if (status != cudaSuccess) { - throw std::runtime_error( - std::string( - "Failed to detect GPU architecture: cudaGetDevice failed: ") + - cudaGetErrorString(status)); - } - int cc_major; - cudaDeviceGetAttribute(&cc_major, cudaDevAttrComputeCapabilityMajor, device); - int cc_minor; - cudaDeviceGetAttribute(&cc_minor, cudaDevAttrComputeCapabilityMinor, device); - int cc = cc_major * 10 + cc_minor; - // Note: We must limit the architecture to the max supported by the current - // version of NVRTC, otherwise newer hardware will cause errors - // on older versions of CUDA. - // TODO: It would be better to detect this somehow, rather than hard-coding it - - // Tegra chips do not have forwards compatibility so we need to special case - // them. - bool is_tegra = ((cc_major == 3 && cc_minor == 2) || // Logan - (cc_major == 5 && cc_minor == 3) || // Erista - (cc_major == 6 && cc_minor == 2) || // Parker - (cc_major == 7 && cc_minor == 2)); // Xavier - if (!is_tegra) { - // ensure that future CUDA versions just work (even if suboptimal) - const int cuda_major = std::min(10, CUDA_VERSION / 1000); - // clang-format off - switch (cuda_major) { - case 10: cc = std::min(cc, 75); break; // Turing - case 9: cc = std::min(cc, 70); break; // Volta - case 8: cc = std::min(cc, 61); break; // Pascal - case 7: cc = std::min(cc, 52); break; // Maxwell - default: - throw std::runtime_error("Unexpected CUDA major version " + - std::to_string(cuda_major)); - } - // clang-format on - } - - std::stringstream ss; - ss << cc; - options.push_back("-arch=compute_" + ss.str()); -} - -inline void detect_and_add_cxx11_flag(std::vector& options) { - // Reverse loop so we can erase on the fly. - for (int i = (int)options.size() - 1; i >= 0; --i) { - if (options[i].find("-std=c++98") != std::string::npos) { - // NVRTC doesn't support specifying c++98 explicitly, so we remove it. - options.erase(options.begin() + i); - return; - } else if (options[i].find("-std") != std::string::npos) { - // Some other standard was explicitly specified, don't change anything. - return; - } - } - // Jitify must be compiled with C++11 support, so we default to enabling it - // for the JIT-compiled code too. - options.push_back("-std=c++11"); -} - -inline void split_compiler_and_linker_options( - std::vector options, - std::vector* compiler_options, - std::vector* linker_files, - std::vector* linker_paths) { - for (int i = 0; i < (int)options.size(); ++i) { - std::string opt = options[i]; - std::string flag = opt.substr(0, 2); - std::string value = opt.substr(2); - if (flag == "-l") { - linker_files->push_back(value); - } else if (flag == "-L") { - linker_paths->push_back(value); - } else { - compiler_options->push_back(opt); - } - } -} - -inline bool pop_remove_unused_globals_flag(std::vector* options) { - auto it = std::remove_if( - options->begin(), options->end(), [](const std::string& opt) { - return opt.find("-remove-unused-globals") != std::string::npos; - }); - if (it != options->end()) { - options->resize(it - options->begin()); - return true; - } - return false; -} - -inline std::string ptx_parse_decl_name(const std::string& line) { - size_t name_end = line.find_first_of("[;"); - if (name_end == std::string::npos) { - throw std::runtime_error( - "Failed to parse .global/.const declaration in PTX: expected a " - "semicolon"); - } - size_t name_start_minus1 = line.find_last_of(" \t", name_end); - if (name_start_minus1 == std::string::npos) { - throw std::runtime_error( - "Failed to parse .global/.const declaration in PTX: expected " - "whitespace"); - } - size_t name_start = name_start_minus1 + 1; - std::string name = line.substr(name_start, name_end - name_start); - return name; -} - -inline void ptx_remove_unused_globals(std::string* ptx) { - std::istringstream iss(*ptx); - std::vector lines; - std::unordered_map line_num_to_global_name; - std::unordered_set name_set; - for (std::string line; std::getline(iss, line);) { - size_t line_num = lines.size(); - lines.push_back(line); - auto terms = split_string(line); - if (terms.size() <= 1) continue; // Ignore lines with no arguments - if (terms[0].substr(0, 2) == "//") continue; // Ignore comment lines - if (terms[0].substr(0, 7) == ".global" || - terms[0].substr(0, 6) == ".const") { - line_num_to_global_name.emplace(line_num, ptx_parse_decl_name(line)); - continue; - } - if (terms[0][0] == '.') continue; // Ignore .version, .reg, .param etc. - // Note: The first term will always be an instruction name; starting at 1 - // also allows unchecked inspection of the previous term. - for (int i = 1; i < (int)terms.size(); ++i) { - if (terms[i].substr(0, 2) == "//") break; // Ignore comments - // Note: The characters '.' and '%' are not treated as delimiters. - const char* token_delims = " \t()[]{},;+-*/~&|^?:=!<>\"'\\"; - for (auto token : split_string(terms[i], -1, token_delims)) { - if ( // Ignore non-names - !(std::isalpha(token[0]) || token[0] == '_' || token[0] == '$') || - token.find('.') != std::string::npos || - // Ignore variable/parameter declarations - terms[i - 1][0] == '.' || - // Ignore branch instructions - (token == "bra" && terms[i - 1][0] == '@') || - // Ignore branch labels - (token.substr(0, 2) == "BB" && - terms[i - 1].substr(0, 3) == "bra")) { - continue; - } - name_set.insert(token); - } - } - } - std::ostringstream oss; - for (size_t line_num = 0; line_num < lines.size(); ++line_num) { - auto it = line_num_to_global_name.find(line_num); - if (it != line_num_to_global_name.end()) { - const std::string& name = it->second; - if (!name_set.count(name)) { - continue; // Remove unused .global declaration. - } - } - oss << lines[line_num] << '\n'; - } - *ptx = oss.str(); -} - -inline nvrtcResult compile_kernel(std::string program_name, - std::map sources, - std::vector options, - std::string instantiation = "", - std::string* log = 0, std::string* ptx = 0, - std::string* mangled_instantiation = 0) { - std::string program_source = sources[program_name]; - // Build arrays of header names and sources - std::vector header_names_c; - std::vector header_sources_c; - int num_headers = (int)(sources.size() - 1); - header_names_c.reserve(num_headers); - header_sources_c.reserve(num_headers); - typedef std::map source_map; - for (source_map::const_iterator iter = sources.begin(); iter != sources.end(); - ++iter) { - std::string const& name = iter->first; - std::string const& code = iter->second; - if (name == program_name) { - continue; - } - header_names_c.push_back(name.c_str()); - header_sources_c.push_back(code.c_str()); - } - - // TODO: This WAR is expected to be unnecessary as of CUDA > 10.2. - bool should_remove_unused_globals = - detail::pop_remove_unused_globals_flag(&options); - - std::vector options_c(options.size() + 2); - options_c[0] = "--device-as-default-execution-space"; - options_c[1] = "--pre-include=jitify_preinclude.h"; - for (int i = 0; i < (int)options.size(); ++i) { - options_c[i + 2] = options[i].c_str(); - } - -#if CUDA_VERSION < 8000 - std::string inst_dummy; - if (!instantiation.empty()) { - // WAR for no nvrtcAddNameExpression before CUDA 8.0 - // Force template instantiation by adding dummy reference to kernel - inst_dummy = "__jitify_instantiation"; - program_source += - "\nvoid* " + inst_dummy + " = (void*)" + instantiation + ";\n"; - } -#endif - -#define CHECK_NVRTC(call) \ - do { \ - nvrtcResult ret = call; \ - if (ret != NVRTC_SUCCESS) { \ - return ret; \ - } \ - } while (0) - - nvrtcProgram nvrtc_program; - CHECK_NVRTC(nvrtcCreateProgram( - &nvrtc_program, program_source.c_str(), program_name.c_str(), num_headers, - header_sources_c.data(), header_names_c.data())); - -#if CUDA_VERSION >= 8000 - if (!instantiation.empty()) { - CHECK_NVRTC(nvrtcAddNameExpression(nvrtc_program, instantiation.c_str())); - } -#endif - - nvrtcResult ret = nvrtcCompileProgram(nvrtc_program, (int)options_c.size(), - options_c.data()); - if (log) { - size_t logsize; - CHECK_NVRTC(nvrtcGetProgramLogSize(nvrtc_program, &logsize)); - std::vector vlog(logsize, 0); - CHECK_NVRTC(nvrtcGetProgramLog(nvrtc_program, vlog.data())); - log->assign(vlog.data(), logsize); - } - if (ret != NVRTC_SUCCESS) { - return ret; - } - - if (ptx) { - size_t ptxsize; - CHECK_NVRTC(nvrtcGetPTXSize(nvrtc_program, &ptxsize)); - std::vector vptx(ptxsize); - CHECK_NVRTC(nvrtcGetPTX(nvrtc_program, vptx.data())); - ptx->assign(vptx.data(), ptxsize); - if (should_remove_unused_globals) { - detail::ptx_remove_unused_globals(ptx); - } - } - - if (!instantiation.empty() && mangled_instantiation) { -#if CUDA_VERSION >= 8000 - const char* mangled_instantiation_cstr; - // Note: The returned string pointer becomes invalid after - // nvrtcDestroyProgram has been called, so we save it. - CHECK_NVRTC(nvrtcGetLoweredName(nvrtc_program, instantiation.c_str(), - &mangled_instantiation_cstr)); - *mangled_instantiation = mangled_instantiation_cstr; -#else - // Extract mangled kernel template instantiation from PTX - inst_dummy += " = "; // Note: This must match how the PTX is generated - int mi_beg = ptx->find(inst_dummy) + inst_dummy.size(); - int mi_end = ptx->find(";", mi_beg); - *mangled_instantiation = ptx->substr(mi_beg, mi_end - mi_beg); -#endif - } - - CHECK_NVRTC(nvrtcDestroyProgram(&nvrtc_program)); -#undef CHECK_NVRTC - return NVRTC_SUCCESS; -} - -inline void load_program(std::string const& cuda_source, - std::vector const& headers, - file_callback_type file_callback, - std::vector* include_paths, - std::map* program_sources, - std::vector* program_options, - std::string* program_name) { - // Extract include paths from compile options - std::vector::iterator iter = program_options->begin(); - while (iter != program_options->end()) { - std::string const& opt = *iter; - if (opt.substr(0, 2) == "-I") { - include_paths->push_back(opt.substr(2)); - iter = program_options->erase(iter); - } else { - ++iter; - } - } - - // Load program source - if (!detail::load_source(cuda_source, *program_sources, "", *include_paths, - file_callback)) { - throw std::runtime_error("Source not found: " + cuda_source); - } - *program_name = program_sources->begin()->first; - - // Maps header include names to their full file paths. - std::map header_fullpaths; - - // Load header sources - for (std::string const& header : headers) { - if (!detail::load_source(header, *program_sources, "", *include_paths, - file_callback, &header_fullpaths)) { - // **TODO: Deal with source not found - throw std::runtime_error("Source not found: " + header); - } - } - -#if JITIFY_PRINT_SOURCE - std::string& program_source = (*program_sources)[*program_name]; - std::cout << "---------------------------------------" << std::endl; - std::cout << "--- Source of " << *program_name << " ---" << std::endl; - std::cout << "---------------------------------------" << std::endl; - detail::print_with_line_numbers(program_source); - std::cout << "---------------------------------------" << std::endl; -#endif - - std::vector compiler_options, linker_files, linker_paths; - detail::split_compiler_and_linker_options(*program_options, &compiler_options, - &linker_files, &linker_paths); - - // If no arch is specified at this point we use whatever the current - // context is. This ensures we pick up the correct internal headers - // for arch-dependent compilation, e.g., some intrinsics are only - // present for specific architectures. - detail::detect_and_add_cuda_arch(compiler_options); - detail::detect_and_add_cxx11_flag(compiler_options); - - // Iteratively try to compile the sources, and use the resulting errors to - // identify missing headers. - std::string log; - nvrtcResult ret; - while ((ret = detail::compile_kernel(*program_name, *program_sources, - compiler_options, "", &log)) == - NVRTC_ERROR_COMPILATION) { - std::string include_name; - std::string include_parent; - int line_num = 0; - if (!detail::extract_include_info_from_compile_error( - log, include_name, include_parent, line_num)) { -#if JITIFY_PRINT_LOG - detail::print_compile_log(*program_name, log); -#endif - // There was a non include-related compilation error - // TODO: How to handle error? - throw std::runtime_error("Runtime compilation failed"); - } - - bool is_included_with_quotes = false; - if (program_sources->count(include_parent)) { - const std::string& parent_source = (*program_sources)[include_parent]; - is_included_with_quotes = - is_include_directive_with_quotes(parent_source, line_num); - } - - // Try to load the new header - // Note: This fullpath lookup is needed because the compiler error - // messages have the include name of the header instead of its full path. - std::string include_parent_fullpath = header_fullpaths[include_parent]; - std::string include_path = detail::path_base(include_parent_fullpath); - if (detail::load_source(include_name, *program_sources, include_path, - *include_paths, file_callback, &header_fullpaths, - is_included_with_quotes)) { -#if JITIFY_PRINT_HEADER_PATHS - std::cout << "Found #include " << include_name << " from " - << include_parent << ":" << line_num << " [" - << include_parent_fullpath << "]" - << " at:\n " << header_fullpaths[include_name] << std::endl; -#endif - } else { // Failed to find header file. - // Comment-out the include line and print a warning - if (!program_sources->count(include_parent)) { - // ***TODO: Unless there's another mechanism (e.g., potentially - // the parent path vs. filename problem), getting - // here means include_parent was found automatically - // in a system include path. - // We need a WAR to zap it from *its parent*. - - typedef std::map source_map; - for (source_map::const_iterator it = program_sources->begin(); - it != program_sources->end(); ++it) { - std::cout << " " << it->first << std::endl; - } - throw std::out_of_range(include_parent + - " not in loaded sources!" - " This may be due to a header being loaded by" - " NVRTC without Jitify's knowledge."); - } - std::string& parent_source = (*program_sources)[include_parent]; - parent_source = detail::comment_out_code_line(line_num, parent_source); -#if JITIFY_PRINT_LOG - std::cout << include_parent << "(" << line_num - << "): warning: " << include_name << ": [jitify] File not found" - << std::endl; -#endif - } - } - if (ret != NVRTC_SUCCESS) { -#if JITIFY_PRINT_LOG - if (ret == NVRTC_ERROR_INVALID_OPTION) { - std::cout << "Compiler options: "; - for (int i = 0; i < (int)compiler_options.size(); ++i) { - std::cout << compiler_options[i] << " "; - } - std::cout << std::endl; - } -#endif - throw std::runtime_error(std::string("NVRTC error: ") + - nvrtcGetErrorString(ret)); - } -} - -inline void instantiate_kernel( - std::string const& program_name, - std::map const& program_sources, - std::string const& instantiation, std::vector const& options, - std::string* log, std::string* ptx, std::string* mangled_instantiation, - std::vector* linker_files, - std::vector* linker_paths) { - std::vector compiler_options; - detail::split_compiler_and_linker_options(options, &compiler_options, - linker_files, linker_paths); - - std::cout << "ABout to compile kernel" << std::endl; - nvrtcResult ret = - detail::compile_kernel(program_name, program_sources, compiler_options, - instantiation, log, ptx, mangled_instantiation); -#if JITIFY_PRINT_LOG - if (log->size() > 1) { - detail::print_compile_log(program_name, *log); - } -#endif - if (ret != NVRTC_SUCCESS) { - throw std::runtime_error(std::string("NVRTC error: ") + - nvrtcGetErrorString(ret)); - } - std::cout << "done compilling" << std::endl; - -#if JITIFY_PRINT_PTX - std::cout << "---------------------------------------" << std::endl; - std::cout << *mangled_instantiation << std::endl; - std::cout << "---------------------------------------" << std::endl; - std::cout << "--- PTX for " << mangled_instantiation << " in " << program_name - << " ---" << std::endl; - std::cout << "---------------------------------------" << std::endl; - std::cout << *ptx << std::endl; - std::cout << "---------------------------------------" << std::endl; -#endif -} - -inline void get_1d_max_occupancy(CUfunction func, - CUoccupancyB2DSize smem_callback, - unsigned int* smem, int max_block_size, - unsigned int flags, int* grid, int* block) { - if (!func) { - throw std::runtime_error( - "Kernel pointer is NULL; you may need to define JITIFY_THREAD_SAFE " - "1"); - } - CUresult res = cuOccupancyMaxPotentialBlockSizeWithFlags( - grid, block, func, smem_callback, *smem, max_block_size, flags); - if (res != CUDA_SUCCESS) { - const char* msg; - cuGetErrorName(res, &msg); - throw std::runtime_error(msg); - } - if (smem_callback) { - *smem = (unsigned int)smem_callback(*block); - } -} - -} // namespace detail - -//! \endcond - -class KernelInstantiation; -class Kernel; -class Program; -class JitCache; - -struct ProgramConfig { - std::vector options; - std::vector include_paths; - std::string name; - typedef std::map source_map; - source_map sources; -}; - -class JitCache_impl { - friend class Program_impl; - friend class KernelInstantiation_impl; - friend class KernelLauncher_impl; - typedef uint64_t key_type; - jitify::ObjectCache _kernel_cache; - jitify::ObjectCache _program_config_cache; - std::vector _options; -#if JITIFY_THREAD_SAFE - std::mutex _kernel_cache_mutex; - std::mutex _program_cache_mutex; -#endif - public: - inline JitCache_impl(size_t cache_size) - : _kernel_cache(cache_size), _program_config_cache(cache_size) { - detail::add_options_from_env(_options); - - // Bootstrap the cuda context to avoid errors - cudaFree(0); - } -}; - -class Program_impl { - // A friendly class - friend class Kernel_impl; - friend class KernelLauncher_impl; - friend class KernelInstantiation_impl; - // TODO: This can become invalid if JitCache is destroyed before the - // Program object is. However, this can't happen if JitCache - // instances are static. - JitCache_impl& _cache; - uint64_t _hash; - ProgramConfig* _config; - void load_sources(std::string source, std::vector headers, - std::vector options, - file_callback_type file_callback); - - public: - inline Program_impl(JitCache_impl& cache, std::string source, - jitify::detail::vector headers = 0, - jitify::detail::vector options = 0, - file_callback_type file_callback = 0); - inline Program_impl(Program_impl const&) = default; - inline Program_impl(Program_impl&&) = default; - inline std::vector const& options() const { - return _config->options; - } - inline std::string const& name() const { return _config->name; } - inline ProgramConfig::source_map const& sources() const { - return _config->sources; - } - inline std::vector const& include_paths() const { - return _config->include_paths; - } -}; - -class Kernel_impl { - friend class KernelLauncher_impl; - friend class KernelInstantiation_impl; - Program_impl _program; - std::string _name; - std::vector _options; - uint64_t _hash; - - public: - inline Kernel_impl(Program_impl const& program, std::string name, - jitify::detail::vector options = 0); - inline Kernel_impl(Kernel_impl const&) = default; - inline Kernel_impl(Kernel_impl&&) = default; -}; - -class KernelInstantiation_impl { - friend class KernelLauncher_impl; - Kernel_impl _kernel; - uint64_t _hash; - std::string _template_inst; - std::vector _options; - detail::CUDAKernel* _cuda_kernel; - inline void print() const; - void build_kernel(); - - public: - inline KernelInstantiation_impl( - Kernel_impl const& kernel, std::vector const& template_args); - inline KernelInstantiation_impl(KernelInstantiation_impl const&) = default; - inline KernelInstantiation_impl(KernelInstantiation_impl&&) = default; - detail::CUDAKernel const& cuda_kernel() const { return *_cuda_kernel; } -}; - -class KernelLauncher_impl { - KernelInstantiation_impl _kernel_inst; - dim3 _grid; - dim3 _block; - unsigned int _smem; - cudaStream_t _stream; - - public: - inline KernelLauncher_impl(KernelInstantiation_impl const& kernel_inst, - dim3 grid, dim3 block, unsigned int smem = 0, - cudaStream_t stream = 0) - : _kernel_inst(kernel_inst), - _grid(grid), - _block(block), - _smem(smem), - _stream(stream) {} - inline KernelLauncher_impl(KernelLauncher_impl const&) = default; - inline KernelLauncher_impl(KernelLauncher_impl&&) = default; - inline CUresult launch( - jitify::detail::vector arg_ptrs, - jitify::detail::vector arg_types = 0) const; -}; - -/*! An object representing a configured and instantiated kernel ready - * for launching. - */ -class KernelLauncher { - std::unique_ptr _impl; - - public: - inline KernelLauncher(KernelInstantiation const& kernel_inst, dim3 grid, - dim3 block, unsigned int smem = 0, - cudaStream_t stream = 0); - - // Note: It's important that there is no implicit conversion required - // for arg_ptrs, because otherwise the parameter pack version - // below gets called instead (probably resulting in a segfault). - /*! Launch the kernel. - * - * \param arg_ptrs A vector of pointers to each function argument for the - * kernel. - * \param arg_types A vector of function argument types represented - * as code-strings. This parameter is optional and is only used to print - * out the function signature. - */ - inline CUresult launch( - std::vector arg_ptrs = std::vector(), - jitify::detail::vector arg_types = 0) const { - return _impl->launch(arg_ptrs, arg_types); - } - // Regular function call syntax - /*! Launch the kernel. - * - * \see launch - */ - template - inline CUresult operator()(ArgTypes... args) const { - return this->launch(args...); - } - /*! Launch the kernel. - * - * \param args Function arguments for the kernel. - */ - template - inline CUresult launch(ArgTypes... args) const { - return this->launch(std::vector({(void*)&args...}), - {reflection::reflect()...}); - } -}; - -/*! An object representing a kernel instantiation made up of a Kernel and - * template arguments. - */ -class KernelInstantiation { - friend class KernelLauncher; - std::unique_ptr _impl; - - public: - inline KernelInstantiation(Kernel const& kernel, - std::vector const& template_args); - - /*! Implicit conversion to the underlying CUfunction object. - * - * \note This allows use of CUDA APIs like - * cuOccupancyMaxActiveBlocksPerMultiprocessor. - */ - inline operator CUfunction() const { return _impl->cuda_kernel(); } - - /*! Configure the kernel launch. - * - * \see configure - */ - inline KernelLauncher operator()(dim3 grid, dim3 block, unsigned int smem = 0, - cudaStream_t stream = 0) const { - return this->configure(grid, block, smem, stream); - } - /*! Configure the kernel launch. - * - * \param grid The thread grid dimensions for the launch. - * \param block The thread block dimensions for the launch. - * \param smem The amount of shared memory to dynamically allocate, in - * bytes. - * \param stream The CUDA stream to launch the kernel in. - */ - inline KernelLauncher configure(dim3 grid, dim3 block, unsigned int smem = 0, - cudaStream_t stream = 0) const { - return KernelLauncher(*this, grid, block, smem, stream); - } - /*! Configure the kernel launch with a 1-dimensional block and grid chosen - * automatically to maximise occupancy. - * - * \param max_block_size The upper limit on the block size, or 0 for no - * limit. - * \param smem The amount of shared memory to dynamically allocate, in bytes. - * \param smem_callback A function returning smem for a given block size (overrides \p smem). - * \param stream The CUDA stream to launch the kernel in. - * \param flags The flags to pass to cuOccupancyMaxPotentialBlockSizeWithFlags. - */ - inline KernelLauncher configure_1d_max_occupancy( - int max_block_size = 0, unsigned int smem = 0, - CUoccupancyB2DSize smem_callback = 0, cudaStream_t stream = 0, - unsigned int flags = 0) const { - int grid; - int block; - CUfunction func = _impl->cuda_kernel(); - detail::get_1d_max_occupancy(func, smem_callback, &smem, max_block_size, - flags, &grid, &block); - return this->configure(grid, block, smem, stream); - } - - /* - * \deprecated Use \p get_global_ptr instead. - */ - inline CUdeviceptr get_constant_ptr(const char* name, - size_t* size = nullptr) const { - return get_global_ptr(name, size); - } - - /* - * Get a device pointer to a global __constant__ or __device__ variable using - * its un-mangled name. If provided, *size is set to the size of the variable - * in bytes. - */ - inline CUdeviceptr get_global_ptr(const char* name, - size_t* size = nullptr) const { - return _impl->cuda_kernel().get_global_ptr(name, size); - } - - /* - * Copy data from a global __constant__ or __device__ array to the host using - * its un-mangled name. - */ - template - inline CUresult get_global_array(const char* name, T* data, size_t count, - CUstream stream = 0) const { - return _impl->cuda_kernel().get_global_data(name, data, count, stream); - } - - /* - * Copy a value from a global __constant__ or __device__ variable to the host - * using its un-mangled name. - */ - template - inline CUresult get_global_value(const char* name, T* value, - CUstream stream = 0) const { - return get_global_array(name, value, 1, stream); - } - - /* - * Copy data from the host to a global __constant__ or __device__ array using - * its un-mangled name. - */ - template - inline CUresult set_global_array(const char* name, const T* data, - size_t count, CUstream stream = 0) const { - return _impl->cuda_kernel().set_global_data(name, data, count, stream); - } - - /* - * Copy a value from the host to a global __constant__ or __device__ variable - * using its un-mangled name. - */ - template - inline CUresult set_global_value(const char* name, const T& value, - CUstream stream = 0) const { - return set_global_array(name, &value, 1, stream); - } - - const std::string& mangled_name() const { - return _impl->cuda_kernel().function_name(); - } - - const std::string& ptx() const { return _impl->cuda_kernel().ptx(); } - - const std::vector& link_files() const { - return _impl->cuda_kernel().link_files(); - } - - const std::vector& link_paths() const { - return _impl->cuda_kernel().link_paths(); - } -}; - -/*! An object representing a kernel made up of a Program, a name and options. - */ -class Kernel { - friend class KernelInstantiation; - std::unique_ptr _impl; - - public: - Kernel(Program const& program, std::string name, - jitify::detail::vector options = 0); - - /*! Instantiate the kernel. - * - * \param template_args A vector of template arguments represented as - * code-strings. These can be generated using - * \code{.cpp}jitify::reflection::reflect()\endcode or - * \code{.cpp}jitify::reflection::reflect(value)\endcode - * - * \note Template type deduction is not possible, so all types must be - * explicitly specified. - */ - // inline KernelInstantiation instantiate(std::vector const& - // template_args) const { - inline KernelInstantiation instantiate( - std::vector const& template_args = - std::vector()) const { - return KernelInstantiation(*this, template_args); - } - - // Regular template instantiation syntax (note limited flexibility) - /*! Instantiate the kernel. - * - * \note The template arguments specified on this function are - * used to instantiate the kernel. Non-type template arguments must - * be wrapped with - * \code{.cpp}jitify::reflection::NonType\endcode - * - * \note Template type deduction is not possible, so all types must be - * explicitly specified. - */ - template - inline KernelInstantiation instantiate() const { - return this->instantiate( - std::vector({reflection::reflect()...})); - } - // Template-like instantiation syntax - // E.g., instantiate(myvar,Type())(grid,block) - /*! Instantiate the kernel. - * - * \param targs The template arguments for the kernel, represented as - * values. Types must be wrapped with - * \code{.cpp}jitify::reflection::Type()\endcode or - * \code{.cpp}jitify::reflection::type_of(value)\endcode - * - * \note Template type deduction is not possible, so all types must be - * explicitly specified. - */ - template - inline KernelInstantiation instantiate(TemplateArgs... targs) const { - return this->instantiate( - std::vector({reflection::reflect(targs)...})); - } -}; - -/*! An object representing a program made up of source code, headers - * and options. - */ -class Program { - friend class Kernel; - std::unique_ptr _impl; - - public: - Program(JitCache& cache, std::string source, - jitify::detail::vector headers = 0, - jitify::detail::vector options = 0, - file_callback_type file_callback = 0); - - /*! Select a kernel. - * - * \param name The name of the kernel (unmangled and without - * template arguments). - * \param options A vector of options to be passed to the NVRTC - * compiler when compiling this kernel. - */ - inline Kernel kernel(std::string name, - jitify::detail::vector options = 0) const { - return Kernel(*this, name, options); - } - /*! Select a kernel. - * - * \see kernel - */ - inline Kernel operator()( - std::string name, jitify::detail::vector options = 0) const { - return this->kernel(name, options); - } -}; - -/*! An object that manages a cache of JIT-compiled CUDA kernels. - * - */ -class JitCache { - friend class Program; - std::unique_ptr _impl; - - public: - /*! JitCache constructor. - * \param cache_size The number of kernels to hold in the cache - * before overwriting the least-recently-used ones. - */ - enum { DEFAULT_CACHE_SIZE = 128 }; - JitCache(size_t cache_size = DEFAULT_CACHE_SIZE) - : _impl(new JitCache_impl(cache_size)) {} - - /*! Create a program. - * - * \param source A string containing either the source filename or - * the source itself; in the latter case, the first line must be - * the name of the program. - * \param headers A vector of strings representing the source of - * each header file required by the program. Each entry can be - * either the header filename or the header source itself; in - * the latter case, the first line must be the name of the header - * (i.e., the name by which the header is #included). - * \param options A vector of options to be passed to the - * NVRTC compiler. Include paths specified with \p -I - * are added to the search paths used by Jitify. The environment - * variable JITIFY_OPTIONS can also be used to define additional - * options. - * \param file_callback A pointer to a callback function that is - * invoked whenever a source file needs to be loaded. Inside this - * function, the user can either load/specify the source themselves - * or defer to Jitify's file-loading mechanisms. - * \note Program or header source files referenced by filename are - * looked-up using the following mechanisms (in this order): - * \note 1) By calling file_callback. - * \note 2) By looking for the file embedded in the executable via the GCC - * linker. - * \note 3) By looking for the file in the filesystem. - * - * \note Jitify recursively scans all source files for \p #include - * directives and automatically adds them to the set of headers needed - * by the program. - * If a \p #include directive references a header that cannot be found, - * the directive is automatically removed from the source code to prevent - * immediate compilation failure. This may result in compilation errors - * if the header was required by the program. - * - * \note Jitify automatically includes NVRTC-safe versions of some - * standard library headers. - */ - inline Program program(std::string source, - jitify::detail::vector headers = 0, - jitify::detail::vector options = 0, - file_callback_type file_callback = 0) { - return Program(*this, source, headers, options, file_callback); - } -}; - -inline Program::Program(JitCache& cache, std::string source, - jitify::detail::vector headers, - jitify::detail::vector options, - file_callback_type file_callback) - : _impl(new Program_impl(*cache._impl, source, headers, options, - file_callback)) {} - -inline Kernel::Kernel(Program const& program, std::string name, - jitify::detail::vector options) - : _impl(new Kernel_impl(*program._impl, name, options)) {} - -inline KernelInstantiation::KernelInstantiation( - Kernel const& kernel, std::vector const& template_args) - : _impl(new KernelInstantiation_impl(*kernel._impl, template_args)) {} - -inline KernelLauncher::KernelLauncher(KernelInstantiation const& kernel_inst, - dim3 grid, dim3 block, unsigned int smem, - cudaStream_t stream) - : _impl(new KernelLauncher_impl(*kernel_inst._impl, grid, block, smem, - stream)) {} - -inline std::ostream& operator<<(std::ostream& stream, dim3 d) { - if (d.y == 1 && d.z == 1) { - stream << d.x; - } else { - stream << "(" << d.x << "," << d.y << "," << d.z << ")"; - } - return stream; -} - -inline CUresult KernelLauncher_impl::launch( - jitify::detail::vector arg_ptrs, - jitify::detail::vector arg_types) const { -#if JITIFY_PRINT_LAUNCH - Kernel_impl const& kernel = _kernel_inst._kernel; - std::string arg_types_string = - (arg_types.empty() ? "..." : reflection::reflect_list(arg_types)); - std::cout << "Launching " << kernel._name << _kernel_inst._template_inst - << "<<<" << _grid << "," << _block << "," << _smem << "," << _stream - << ">>>" - << "(" << arg_types_string << ")" << std::endl; -#endif - if (!_kernel_inst._cuda_kernel) { - throw std::runtime_error( - "Kernel pointer is NULL; you may need to define JITIFY_THREAD_SAFE 1"); - } - return _kernel_inst._cuda_kernel->launch(_grid, _block, _smem, _stream, - arg_ptrs); -} - -inline KernelInstantiation_impl::KernelInstantiation_impl( - Kernel_impl const& kernel, std::vector const& template_args) - : _kernel(kernel), _options(kernel._options) { - _template_inst = - (template_args.empty() ? "" - : reflection::reflect_template(template_args)); - using detail::hash_combine; - using detail::hash_larson64; - _hash = _kernel._hash; - _hash = hash_combine(_hash, hash_larson64(_template_inst.c_str())); - JitCache_impl& cache = _kernel._program._cache; - uint64_t cache_key = _hash; -#if JITIFY_THREAD_SAFE - std::lock_guard lock(cache._kernel_cache_mutex); -#endif - if (cache._kernel_cache.contains(cache_key)) { -#if JITIFY_PRINT_INSTANTIATION - std::cout << "Found "; - this->print(); -#endif - _cuda_kernel = &cache._kernel_cache.get(cache_key); - } else { -#if JITIFY_PRINT_INSTANTIATION - std::cout << "Building "; - this->print(); -#endif - _cuda_kernel = &cache._kernel_cache.emplace(cache_key); - this->build_kernel(); - } -} - -inline void KernelInstantiation_impl::print() const { - std::string options_string = reflection::reflect_list(_options); - std::cout << _kernel._name << _template_inst << " [" << options_string << "]" - << std::endl; -} - -inline void KernelInstantiation_impl::build_kernel() { - Program_impl const& program = _kernel._program; - - std::string instantiation = _kernel._name + _template_inst; - - std::string log, ptx, mangled_instantiation; - std::vector linker_files, linker_paths; - detail::instantiate_kernel(program.name(), program.sources(), instantiation, - _options, &log, &ptx, &mangled_instantiation, - &linker_files, &linker_paths); - - _cuda_kernel->set(mangled_instantiation.c_str(), ptx.c_str(), linker_files, - linker_paths); -} - -Kernel_impl::Kernel_impl(Program_impl const& program, std::string name, - jitify::detail::vector options) - : _program(program), _name(name), _options(options) { - // Merge options from parent - _options.insert(_options.end(), _program.options().begin(), - _program.options().end()); - detail::detect_and_add_cuda_arch(_options); - detail::detect_and_add_cxx11_flag(_options); - std::string options_string = reflection::reflect_list(_options); - using detail::hash_combine; - using detail::hash_larson64; - _hash = _program._hash; - _hash = hash_combine(_hash, hash_larson64(_name.c_str())); - _hash = hash_combine(_hash, hash_larson64(options_string.c_str())); -} - -Program_impl::Program_impl(JitCache_impl& cache, std::string source, - jitify::detail::vector headers, - jitify::detail::vector options, - file_callback_type file_callback) - : _cache(cache) { - // Compute hash of source, headers and options - std::string options_string = reflection::reflect_list(options); - using detail::hash_combine; - using detail::hash_larson64; - _hash = hash_combine(hash_larson64(source.c_str()), - hash_larson64(options_string.c_str())); - for (size_t i = 0; i < headers.size(); ++i) { - _hash = hash_combine(_hash, hash_larson64(headers[i].c_str())); - } - _hash = hash_combine(_hash, (uint64_t)file_callback); - // Add pre-include built-in JIT-safe headers - for (int i = 0; i < detail::preinclude_jitsafe_headers_count; ++i) { - const char* hdr_name = detail::preinclude_jitsafe_header_names[i]; - const std::string& hdr_source = - detail::get_jitsafe_headers_map().at(hdr_name); - headers.push_back(std::string(hdr_name) + "\n" + hdr_source); - } - // Merge options from parent - options.insert(options.end(), _cache._options.begin(), _cache._options.end()); - // Load sources -#if JITIFY_THREAD_SAFE - std::lock_guard lock(cache._program_cache_mutex); -#endif - if (!cache._program_config_cache.contains(_hash)) { - _config = &cache._program_config_cache.insert(_hash); - this->load_sources(source, headers, options, file_callback); - } else { - _config = &cache._program_config_cache.get(_hash); - } -} - -inline void Program_impl::load_sources(std::string source, - std::vector headers, - std::vector options, - file_callback_type file_callback) { - _config->options = options; - detail::load_program(source, headers, file_callback, &_config->include_paths, - &_config->sources, &_config->options, &_config->name); -} - -enum Location { HOST, DEVICE }; - -/*! Specifies location and parameters for execution of an algorithm. - * \param stream The CUDA stream on which to execute. - * \param headers A vector of headers to include in the code. - * \param options Options to pass to the NVRTC compiler. - * \param file_callback See jitify::Program. - * \param block_size The size of the CUDA thread block with which to - * execute. - * \param cache_size The number of kernels to store in the cache - * before overwriting the least-recently-used ones. - */ -struct ExecutionPolicy { - /*! Location (HOST or DEVICE) on which to execute.*/ - Location location; - /*! List of headers to include when compiling the algorithm.*/ - std::vector headers; - /*! List of compiler options.*/ - std::vector options; - /*! Optional callback for loading source files.*/ - file_callback_type file_callback; - /*! CUDA stream on which to execute.*/ - cudaStream_t stream; - /*! CUDA device on which to execute.*/ - int device; - /*! CUDA block size with which to execute.*/ - int block_size; - /*! The number of instantiations to store in the cache before overwriting - * the least-recently-used ones.*/ - size_t cache_size; - ExecutionPolicy(Location location_ = DEVICE, - jitify::detail::vector headers_ = 0, - jitify::detail::vector options_ = 0, - file_callback_type file_callback_ = 0, - cudaStream_t stream_ = 0, int device_ = 0, - int block_size_ = 256, - size_t cache_size_ = JitCache::DEFAULT_CACHE_SIZE) - : location(location_), - headers(headers_), - options(options_), - file_callback(file_callback_), - stream(stream_), - device(device_), - block_size(block_size_), - cache_size(cache_size_) {} -}; - -template -class Lambda; - -/*! An object that captures a set of variables for use in a parallel_for - * expression. See JITIFY_CAPTURE(). - */ -class Capture { - public: - std::vector _arg_decls; - std::vector _arg_ptrs; - - public: - template - inline Capture(std::vector arg_names, Args const&... args) - : _arg_ptrs{(void*)&args...} { - std::vector arg_types = {reflection::reflect()...}; - _arg_decls.resize(arg_names.size()); - for (int i = 0; i < (int)arg_names.size(); ++i) { - _arg_decls[i] = arg_types[i] + " " + arg_names[i]; - } - } -}; - -/*! An object that captures the instantiated Lambda function for use - in a parallel_for expression and the function string for NVRTC - compilation - */ -template -class Lambda { - public: - Capture _capture; - std::string _func_string; - Func _func; - - public: - inline Lambda(Capture const& capture, std::string func_string, Func func) - : _capture(capture), _func_string(func_string), _func(func) {} -}; - -template -inline Lambda make_Lambda(Capture const& capture, std::string func, - T lambda) { - return Lambda(capture, func, lambda); -} - -#define JITIFY_CAPTURE(...) \ - jitify::Capture(jitify::detail::split_string(#__VA_ARGS__, -1, ","), \ - __VA_ARGS__) - -#define JITIFY_MAKE_LAMBDA(capture, x, ...) \ - jitify::make_Lambda(capture, std::string(#__VA_ARGS__), \ - [x](int i) { __VA_ARGS__; }) - -#define JITIFY_ARGS(...) __VA_ARGS__ - -#define JITIFY_LAMBDA_(x, ...) \ - JITIFY_MAKE_LAMBDA(JITIFY_CAPTURE(x), JITIFY_ARGS(x), __VA_ARGS__) - -// macro sequence to strip surrounding brackets -#define JITIFY_STRIP_PARENS(X) X -#define JITIFY_PASS_PARAMETERS(X) JITIFY_STRIP_PARENS(JITIFY_ARGS X) - -/*! Creates a Lambda object with captured variables and a function - * definition. - * \param capture A bracket-enclosed list of variables to capture. - * \param ... The function definition. - * - * \code{.cpp} - * float* capture_me; - * int capture_me_too; - * auto my_lambda = JITIFY_LAMBDA( (capture_me, capture_me_too), - * capture_me[i] = i*capture_me_too ); - * \endcode - */ -#define JITIFY_LAMBDA(capture, ...) \ - JITIFY_LAMBDA_(JITIFY_ARGS(JITIFY_PASS_PARAMETERS(capture)), \ - JITIFY_ARGS(__VA_ARGS__)) - -// TODO: Try to implement for_each that accepts iterators instead of indices -// Add compile guard for NOCUDA compilation -/*! Call a function for a range of indices - * - * \param policy Determines the location and device parameters for - * execution of the parallel_for. - * \param begin The starting index. - * \param end The ending index. - * \param lambda A Lambda object created using the JITIFY_LAMBDA() macro. - * - * \code{.cpp} - * char const* in; - * float* out; - * parallel_for(0, 100, JITIFY_LAMBDA( (in, out), {char x = in[i]; out[i] = - * x*x; } ); \endcode - */ -template -CUresult parallel_for(ExecutionPolicy policy, IndexType begin, IndexType end, - Lambda const& lambda) { - using namespace jitify; - - if (policy.location == HOST) { -#ifdef _OPENMP -#pragma omp parallel for -#endif - for (IndexType i = begin; i < end; i++) { - lambda._func(i); - } - return CUDA_SUCCESS; // FIXME - replace with non-CUDA enum type? - } - - thread_local static JitCache kernel_cache(policy.cache_size); - - std::vector arg_decls; - arg_decls.push_back("I begin, I end"); - arg_decls.insert(arg_decls.end(), lambda._capture._arg_decls.begin(), - lambda._capture._arg_decls.end()); - - std::stringstream source_ss; - source_ss << "parallel_for_program\n"; - for (auto const& header : policy.headers) { - std::string header_name = header.substr(0, header.find("\n")); - source_ss << "#include <" << header_name << ">\n"; - } - source_ss << "template\n" - "__global__\n" - "void parallel_for_kernel(" - << reflection::reflect_list(arg_decls) - << ") {\n" - " I i0 = threadIdx.x + blockDim.x*blockIdx.x;\n" - " for( I i=i0+begin; i arg_ptrs; - arg_ptrs.push_back(&begin); - arg_ptrs.push_back(&end); - arg_ptrs.insert(arg_ptrs.end(), lambda._capture._arg_ptrs.begin(), - lambda._capture._arg_ptrs.end()); - - size_t n = end - begin; - dim3 block(policy.block_size); - dim3 grid((unsigned int)std::min((n - 1) / block.x + 1, size_t(65535))); - cudaSetDevice(policy.device); - return program.kernel("parallel_for_kernel") - .instantiate() - .configure(grid, block, 0, policy.stream) - .launch(arg_ptrs); -} - -namespace experimental { - -using jitify::file_callback_type; - -namespace serialization { - -namespace detail { - -// This should be incremented whenever the serialization format changes in any -// incompatible way. -static constexpr const size_t kSerializationVersion = 1; - -inline void serialize(std::ostream& stream, size_t u) { - uint64_t u64 = u; - stream.write(reinterpret_cast(&u64), sizeof(u64)); -} - -inline bool deserialize(std::istream& stream, size_t* size) { - uint64_t u64; - stream.read(reinterpret_cast(&u64), sizeof(u64)); - *size = u64; - return stream.good(); -} - -inline void serialize(std::ostream& stream, std::string const& s) { - serialize(stream, s.size()); - stream.write(s.data(), s.size()); -} - -inline bool deserialize(std::istream& stream, std::string* s) { - size_t size; - if (!deserialize(stream, &size)) return false; - s->resize(size); - if (s->size()) { - stream.read(&(*s)[0], s->size()); - } - return stream.good(); -} - -inline void serialize(std::ostream& stream, std::vector const& v) { - serialize(stream, v.size()); - for (auto const& s : v) { - serialize(stream, s); - } -} - -inline bool deserialize(std::istream& stream, std::vector* v) { - size_t size; - if (!deserialize(stream, &size)) return false; - v->resize(size); - for (auto& s : *v) { - if (!deserialize(stream, &s)) return false; - } - return true; -} - -inline void serialize(std::ostream& stream, - std::map const& m) { - serialize(stream, m.size()); - for (auto const& kv : m) { - serialize(stream, kv.first); - serialize(stream, kv.second); - } -} - -inline bool deserialize(std::istream& stream, - std::map* m) { - size_t size; - if (!deserialize(stream, &size)) return false; - for (size_t i = 0; i < size; ++i) { - std::string key; - if (!deserialize(stream, &key)) return false; - if (!deserialize(stream, &(*m)[key])) return false; - } - return true; -} - -template -inline void serialize(std::ostream& stream, T const& value, Rest... rest) { - serialize(stream, value); - serialize(stream, rest...); -} - -template -inline bool deserialize(std::istream& stream, T* value, Rest... rest) { - if (!deserialize(stream, value)) return false; - return deserialize(stream, rest...); -} - -inline void serialize_magic_number(std::ostream& stream) { - stream.write("JTFY", 4); - serialize(stream, kSerializationVersion); -} - -inline bool deserialize_magic_number(std::istream& stream) { - char magic_number[4] = {0, 0, 0, 0}; - stream.read(&magic_number[0], 4); - if (!(magic_number[0] == 'J' && magic_number[1] == 'T' && - magic_number[2] == 'F' && magic_number[3] == 'Y')) { - return false; - } - size_t serialization_version; - if (!deserialize(stream, &serialization_version)) return false; - return serialization_version == kSerializationVersion; -} - -} // namespace detail - -template -inline std::string serialize(Values const&... values) { - std::ostringstream ss(std::stringstream::out | std::stringstream::binary); - detail::serialize_magic_number(ss); - detail::serialize(ss, values...); - return ss.str(); -} - -template -inline bool deserialize(std::string const& serialized, Values*... values) { - std::istringstream ss(serialized, - std::stringstream::in | std::stringstream::binary); - if (!detail::deserialize_magic_number(ss)) return false; - return detail::deserialize(ss, values...); -} - -} // namespace serialization - -class Program; -class Kernel; -class KernelInstantiation; -class KernelLauncher; - -/*! An object representing a program made up of source code, headers - * and options. - */ -class Program { - private: - friend class KernelInstantiation; - std::string _name; - std::vector _options; - std::map _sources; - - // Private constructor used by deserialize() - Program() {} - - public: - /*! Create a program. - * - * \param source A string containing either the source filename or - * the source itself; in the latter case, the first line must be - * the name of the program. - * \param headers A vector of strings representing the source of - * each header file required by the program. Each entry can be - * either the header filename or the header source itself; in - * the latter case, the first line must be the name of the header - * (i.e., the name by which the header is #included). - * \param options A vector of options to be passed to the - * NVRTC compiler. Include paths specified with \p -I - * are added to the search paths used by Jitify. The environment - * variable JITIFY_OPTIONS can also be used to define additional - * options. - * \param file_callback A pointer to a callback function that is - * invoked whenever a source file needs to be loaded. Inside this - * function, the user can either load/specify the source themselves - * or defer to Jitify's file-loading mechanisms. - * \note Program or header source files referenced by filename are - * looked-up using the following mechanisms (in this order): - * \note 1) By calling file_callback. - * \note 2) By looking for the file embedded in the executable via the GCC - * linker. - * \note 3) By looking for the file in the filesystem. - * - * \note Jitify recursively scans all source files for \p #include - * directives and automatically adds them to the set of headers needed - * by the program. - * If a \p #include directive references a header that cannot be found, - * the directive is automatically removed from the source code to prevent - * immediate compilation failure. This may result in compilation errors - * if the header was required by the program. - * - * \note Jitify automatically includes NVRTC-safe versions of some - * standard library headers. - */ - Program(std::string const& cuda_source, - std::vector const& given_headers = {}, - std::vector const& given_options = {}, - file_callback_type file_callback = nullptr) { - // Add pre-include built-in JIT-safe headers - std::vector headers = given_headers; - for (int i = 0; i < detail::preinclude_jitsafe_headers_count; ++i) { - const char* hdr_name = detail::preinclude_jitsafe_header_names[i]; - const std::string& hdr_source = - detail::get_jitsafe_headers_map().at(hdr_name); - headers.push_back(std::string(hdr_name) + "\n" + hdr_source); - } - - _options = given_options; - detail::add_options_from_env(_options); - std::vector include_paths; - detail::load_program(cuda_source, headers, file_callback, &include_paths, - &_sources, &_options, &_name); - } - - /*! Restore a serialized program. - * - * \param serialized_program The serialized program to restore. - * - * \see serialize - */ - static Program deserialize(std::string const& serialized_program) { - Program program; - if (!serialization::deserialize(serialized_program, &program._name, - &program._options, &program._sources)) { - throw std::runtime_error("Failed to deserialize program"); - } - return program; - } - - /*! Save the program. - * - * \see deserialize - */ - std::string serialize() const { - // Note: Must update kSerializationVersion if this is changed. - return serialization::serialize(_name, _options, _sources); - }; - - /*! Select a kernel. - * - * \param name The name of the kernel (unmangled and without - * template arguments). - * \param options A vector of options to be passed to the NVRTC - * compiler when compiling this kernel. - */ - Kernel kernel(std::string const& name, - std::vector const& options = {}) const; -}; - -class Kernel { - friend class KernelInstantiation; - Program const* _program; - std::string _name; - std::vector _options; - - public: - Kernel(Program const* program, std::string const& name, - std::vector const& options = {}) - : _program(program), _name(name), _options(options) {} - - /*! Instantiate the kernel. - * - * \param template_args A vector of template arguments represented as - * code-strings. These can be generated using - * \code{.cpp}jitify::reflection::reflect()\endcode or - * \code{.cpp}jitify::reflection::reflect(value)\endcode - * - * \note Template type deduction is not possible, so all types must be - * explicitly specified. - */ - KernelInstantiation instantiate( - std::vector const& template_args = - std::vector()) const; - - // Regular template instantiation syntax (note limited flexibility) - /*! Instantiate the kernel. - * - * \note The template arguments specified on this function are - * used to instantiate the kernel. Non-type template arguments must - * be wrapped with - * \code{.cpp}jitify::reflection::NonType\endcode - * - * \note Template type deduction is not possible, so all types must be - * explicitly specified. - */ - template - KernelInstantiation instantiate() const; - - // Template-like instantiation syntax - // E.g., instantiate(myvar,Type())(grid,block) - /*! Instantiate the kernel. - * - * \param targs The template arguments for the kernel, represented as - * values. Types must be wrapped with - * \code{.cpp}jitify::reflection::Type()\endcode or - * \code{.cpp}jitify::reflection::type_of(value)\endcode - * - * \note Template type deduction is not possible, so all types must be - * explicitly specified. - */ - template - KernelInstantiation instantiate(TemplateArgs... targs) const; -}; - -class KernelInstantiation { - friend class KernelLauncher; - std::unique_ptr _cuda_kernel; - - // Private constructor used by deserialize() - KernelInstantiation(std::string const& func_name, std::string const& ptx, - std::vector const& link_files, - std::vector const& link_paths) - : _cuda_kernel(new detail::CUDAKernel(func_name.c_str(), ptx.c_str(), - link_files, link_paths)) {} - - public: - KernelInstantiation(Kernel const& kernel, - std::vector const& template_args) { - Program const* program = kernel._program; - - std::string template_inst = - (template_args.empty() ? "" - : reflection::reflect_template(template_args)); - std::string instantiation = kernel._name + template_inst; - - std::vector options; - options.insert(options.begin(), program->_options.begin(), - program->_options.end()); - options.insert(options.begin(), kernel._options.begin(), - kernel._options.end()); - detail::detect_and_add_cuda_arch(options); - detail::detect_and_add_cxx11_flag(options); - - std::string log, ptx, mangled_instantiation; - std::vector linker_files, linker_paths; - - std::cout << "About to instantiate kernel" << std::endl; - detail::instantiate_kernel(program->_name, program->_sources, instantiation, - options, &log, &ptx, &mangled_instantiation, - &linker_files, &linker_paths); - - std::cout << "instantiated kernel" << std::endl; - _cuda_kernel.reset(new detail::CUDAKernel(mangled_instantiation.c_str(), - ptx.c_str(), linker_files, - linker_paths)); - } - - /*! Implicit conversion to the underlying CUfunction object. - * - * \note This allows use of CUDA APIs like - * cuOccupancyMaxActiveBlocksPerMultiprocessor. - */ - operator CUfunction() const { return *_cuda_kernel; } - - /*! Restore a serialized kernel instantiation. - * - * \param serialized_kernel_inst The serialized kernel instantiation to - * restore. - * - * \see serialize - */ - static KernelInstantiation deserialize( - std::string const& serialized_kernel_inst) { - std::string func_name, ptx; - std::vector link_files, link_paths; - if (!serialization::deserialize(serialized_kernel_inst, &func_name, &ptx, - &link_files, &link_paths)) { - throw std::runtime_error("Failed to deserialize kernel instantiation"); - } - return KernelInstantiation(func_name, ptx, link_files, link_paths); - } - - /*! Save the program. - * - * \see deserialize - */ - std::string serialize() const { - // Note: Must update kSerializationVersion if this is changed. - - std::cout << "Inside serialize!!!!" << std::endl; - return serialization::serialize( - _cuda_kernel->function_name(), _cuda_kernel->ptx(), - _cuda_kernel->link_files(), _cuda_kernel->link_paths()); - } - - /*! Configure the kernel launch. - * - * \param grid The thread grid dimensions for the launch. - * \param block The thread block dimensions for the launch. - * \param smem The amount of shared memory to dynamically allocate, in - * bytes. - * \param stream The CUDA stream to launch the kernel in. - */ - KernelLauncher configure(dim3 grid, dim3 block, unsigned int smem = 0, - cudaStream_t stream = 0) const; - - /*! Configure the kernel launch with a 1-dimensional block and grid chosen - * automatically to maximise occupancy. - * - * \param max_block_size The upper limit on the block size, or 0 for no - * limit. - * \param smem The amount of shared memory to dynamically allocate, in bytes. - * \param smem_callback A function returning smem for a given block size - * (overrides \p smem). - * \param stream The CUDA stream to launch the kernel in. - * \param flags The flags to pass to - * cuOccupancyMaxPotentialBlockSizeWithFlags. - */ - KernelLauncher configure_1d_max_occupancy( - int max_block_size = 0, unsigned int smem = 0, - CUoccupancyB2DSize smem_callback = 0, cudaStream_t stream = 0, - unsigned int flags = 0) const; - - /* - * \deprecated Use \p get_global_ptr instead. - */ - CUdeviceptr get_constant_ptr(const char* name, size_t* size = nullptr) const { - return get_global_ptr(name, size); - } - - /* - * Get a device pointer to a global __constant__ or __device__ variable using - * its un-mangled name. If provided, *size is set to the size of the variable - * in bytes. - */ - CUdeviceptr get_global_ptr(const char* name, size_t* size = nullptr) const { - return _cuda_kernel->get_global_ptr(name, size); - } - - /* - * Copy data from a global __constant__ or __device__ array to the host using - * its un-mangled name. - */ - template - CUresult get_global_array(const char* name, T* data, size_t count, - CUstream stream = 0) const { - return _cuda_kernel->get_global_data(name, data, count, stream); - } - - /* - * Copy a value from a global __constant__ or __device__ variable to the host - * using its un-mangled name. - */ - template - CUresult get_global_value(const char* name, T* value, - CUstream stream = 0) const { - return get_global_array(name, value, 1, stream); - } - - /* - * Copy data from the host to a global __constant__ or __device__ array using - * its un-mangled name. - */ - template - CUresult set_global_array(const char* name, const T* data, size_t count, - CUstream stream = 0) const { - return _cuda_kernel->set_global_data(name, data, count, stream); - } - - /* - * Copy a value from the host to a global __constant__ or __device__ variable - * using its un-mangled name. - */ - template - CUresult set_global_value(const char* name, const T& value, - CUstream stream = 0) const { - return set_global_array(name, &value, 1, stream); - } - - const std::string& mangled_name() const { - return _cuda_kernel->function_name(); - } - - const std::string& ptx() const { return _cuda_kernel->ptx(); } - - const std::vector& link_files() const { - return _cuda_kernel->link_files(); - } - - const std::vector& link_paths() const { - return _cuda_kernel->link_paths(); - } -}; - -class KernelLauncher { - KernelInstantiation const* _kernel_inst; - dim3 _grid; - dim3 _block; - unsigned int _smem; - cudaStream_t _stream; - - public: - KernelLauncher(KernelInstantiation const* kernel_inst, dim3 grid, dim3 block, - unsigned int smem = 0, cudaStream_t stream = 0) - : _kernel_inst(kernel_inst), - _grid(grid), - _block(block), - _smem(smem), - _stream(stream) {} - - // Note: It's important that there is no implicit conversion required - // for arg_ptrs, because otherwise the parameter pack version - // below gets called instead (probably resulting in a segfault). - /*! Launch the kernel. - * - * \param arg_ptrs A vector of pointers to each function argument for the - * kernel. - * \param arg_types A vector of function argument types represented - * as code-strings. This parameter is optional and is only used to print - * out the function signature. - */ - CUresult launch(std::vector arg_ptrs = {}, - std::vector arg_types = {}) const { -#if JITIFY_PRINT_LAUNCH - std::string arg_types_string = - (arg_types.empty() ? "..." : reflection::reflect_list(arg_types)); - std::cout << "Launching " << _kernel_inst->_cuda_kernel->function_name() - << "<<<" << _grid << "," << _block << "," << _smem << "," - << _stream << ">>>" - << "(" << arg_types_string << ")" << std::endl; -#endif - - return _kernel_inst->_cuda_kernel->launch(_grid, _block, _smem, _stream, - arg_ptrs); - } - - /*! Launch the kernel. - * - * \param args Function arguments for the kernel. - */ - template - CUresult launch(ArgTypes... args) const { - return this->launch(std::vector({(void*)&args...}), - {reflection::reflect()...}); - } -}; - -inline Kernel Program::kernel(std::string const& name, - std::vector const& options) const { - return Kernel(this, name, options); -} - -inline KernelInstantiation Kernel::instantiate( - std::vector const& template_args) const { - return KernelInstantiation(*this, template_args); -} - -template -inline KernelInstantiation Kernel::instantiate() const { - return this->instantiate( - std::vector({reflection::reflect()...})); -} - -template -inline KernelInstantiation Kernel::instantiate(TemplateArgs... targs) const { - return this->instantiate( - std::vector({reflection::reflect(targs)...})); -} - -inline KernelLauncher KernelInstantiation::configure( - dim3 grid, dim3 block, unsigned int smem, cudaStream_t stream) const { - return KernelLauncher(this, grid, block, smem, stream); -} - -inline KernelLauncher KernelInstantiation::configure_1d_max_occupancy( - int max_block_size, unsigned int smem, CUoccupancyB2DSize smem_callback, - cudaStream_t stream, unsigned int flags) const { - int grid; - int block; - CUfunction func = *_cuda_kernel; - detail::get_1d_max_occupancy(func, smem_callback, &smem, max_block_size, - flags, &grid, &block); - return this->configure(grid, block, smem, stream); -} - -} // namespace experimental - -} // namespace jitify - -#if defined(_WIN32) || defined(_WIN64) -#pragma pop_macro("max") -#pragma pop_macro("min") -#pragma pop_macro("strtok_r") -#endif diff --git a/GraphBLAS/CUDA/test/.gitignore b/GraphBLAS/CUDA/test/.gitignore deleted file mode 100644 index ab8dd2b30f..0000000000 --- a/GraphBLAS/CUDA/test/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -# Ignore these files: -graphblascuda_test - -# Do not ignore this file -!.gitignore - diff --git a/GraphBLAS/CUDA/test/AxB_dot3_cuda_tests.cpp b/GraphBLAS/CUDA/test/AxB_dot3_cuda_tests.cpp deleted file mode 100644 index ca7c5de350..0000000000 --- a/GraphBLAS/CUDA/test/AxB_dot3_cuda_tests.cpp +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/test/AxB_dot3_cuda_tests.cpp -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -// Test AxB_dot3_cuda kernels -// Using data generators and test classes, cover -// all NBUCKETS cases for the masked GEMM ( C, M, A, B) in GraphBLAS -// Tests Semirings, data types and a range of data input sizes and shapes -// Connects to the jitFactory for launches. - -#include -#include -#include -#include -#include - -//Test instances and groupings - diff --git a/GraphBLAS/CUDA/test/GB_cuda_type_wrap.hpp b/GraphBLAS/CUDA/test/GB_cuda_type_wrap.hpp deleted file mode 100644 index 3acf26553f..0000000000 --- a/GraphBLAS/CUDA/test/GB_cuda_type_wrap.hpp +++ /dev/null @@ -1,246 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/test/GB_cuda_type_wrap.hpp -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -/* - * Copyright (c) 2019,2020 NVIDIA CORPORATION. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once -#ifndef GB_CONV_TYPE_H -#define GB_CONV_TYPE_H - -extern "C" { -#include "GB.h" -}; -#include -#include -#include -#include -#include -#include - -/**---------------------------------------------------------------------------* - * @file type_convert.hpp - * @brief Defines the mapping between concrete C++ types and Grb types. - *---------------------------------------------------------------------------**/ -namespace cuda::jit { - -template -GrB_Type to_grb_type(); - -template<> inline GrB_Type to_grb_type() { return GrB_INT8; } -template<> inline GrB_Type to_grb_type() { return GrB_INT16; } -template<> inline GrB_Type to_grb_type() { return GrB_INT32; } -template<> inline GrB_Type to_grb_type() { return GrB_INT64; } -template<> inline GrB_Type to_grb_type() { return GrB_UINT8; } -template<> inline GrB_Type to_grb_type() { return GrB_UINT16; } -template<> inline GrB_Type to_grb_type() { return GrB_UINT32; } -template<> inline GrB_Type to_grb_type() { return GrB_UINT64; } -template<> inline GrB_Type to_grb_type() { return GrB_FP32; } -template<> inline GrB_Type to_grb_type() { return GrB_FP64; } -template<> inline GrB_Type to_grb_type() { return GrB_BOOL; } - - -template -void set_element(GrB_Matrix A, T x, int64_t i, int64_t j); - -template<> inline void set_element(GrB_Matrix A, int8_t x, int64_t i, int64_t j) { GrB_Matrix_setElement_INT8(A, x, i, j); } -template<> inline void set_element(GrB_Matrix A, int16_t x, int64_t i, int64_t j) { GrB_Matrix_setElement_INT16(A, x, i, j); } -template<> inline void set_element(GrB_Matrix A, int32_t x, int64_t i, int64_t j) { GrB_Matrix_setElement_INT32(A, x, i, j); } -template<> inline void set_element(GrB_Matrix A, int64_t x, int64_t i, int64_t j) { GrB_Matrix_setElement_INT64(A, x, i, j); } -template<> inline void set_element(GrB_Matrix A, uint8_t x, int64_t i, int64_t j) { GrB_Matrix_setElement_UINT8(A, x, i, j); } -template<> inline void set_element(GrB_Matrix A, uint16_t x, int64_t i, int64_t j) { GrB_Matrix_setElement_UINT16(A, x, i, j); } -template<> inline void set_element(GrB_Matrix A, uint32_t x, int64_t i, int64_t j) { GrB_Matrix_setElement_UINT32(A, x, i, j); } -template<> inline void set_element(GrB_Matrix A, uint64_t x, int64_t i, int64_t j) { GrB_Matrix_setElement_UINT64(A, x, i, j); } -template<> inline void set_element(GrB_Matrix A, float x, int64_t i, int64_t j) { GrB_Matrix_setElement_FP32(A, x, i, j); } -template<> inline void set_element(GrB_Matrix A, double x, int64_t i, int64_t j) { GrB_Matrix_setElement_FP64(A, x, i, j); } -template<> inline void set_element(GrB_Matrix A, bool x, int64_t i, int64_t j) { GrB_Matrix_setElement_BOOL(A, x, i, j); } - - -template -void vector_set_element(GrB_Vector A, T x, int64_t i); - -template<> inline void vector_set_element(GrB_Vector A, int8_t x, int64_t i) { GrB_Vector_setElement_INT8(A, x, i); } -template<> inline void vector_set_element(GrB_Vector A, int16_t x, int64_t i) { GrB_Vector_setElement_INT16(A, x, i); } -template<> inline void vector_set_element(GrB_Vector A, int32_t x, int64_t i) { GrB_Vector_setElement_INT32(A, x, i); } -template<> inline void vector_set_element(GrB_Vector A, int64_t x, int64_t i) { GrB_Vector_setElement_INT64(A, x, i); } -template<> inline void vector_set_element(GrB_Vector A, uint8_t x, int64_t i) { GrB_Vector_setElement_UINT8(A, x, i); } -template<> inline void vector_set_element(GrB_Vector A, uint16_t x, int64_t i) { GrB_Vector_setElement_UINT16(A, x, i); } -template<> inline void vector_set_element(GrB_Vector A, uint32_t x, int64_t i) { GrB_Vector_setElement_UINT32(A, x, i); } -template<> inline void vector_set_element(GrB_Vector A, uint64_t x, int64_t i) { GrB_Vector_setElement_UINT64(A, x, i); } -template<> inline void vector_set_element(GrB_Vector A, float x, int64_t i) { GrB_Vector_setElement_FP32(A, x, i); } -template<> inline void vector_set_element(GrB_Vector A, double x, int64_t i) { GrB_Vector_setElement_FP64(A, x, i); } -template<> inline void vector_set_element(GrB_Vector A, bool x, int64_t i) { GrB_Vector_setElement_BOOL(A, x, i); } - - - template - void scalar_set_element(GrB_Scalar A, T x); - - template<> inline void scalar_set_element(GrB_Scalar A, int8_t x) { GrB_Scalar_setElement_INT8(A, x); } - template<> inline void scalar_set_element(GrB_Scalar A, int16_t x) { GrB_Scalar_setElement_INT16(A, x); } - template<> inline void scalar_set_element(GrB_Scalar A, int32_t x) { GrB_Scalar_setElement_INT32(A, x); } - template<> inline void scalar_set_element(GrB_Scalar A, int64_t x) { GrB_Scalar_setElement_INT64(A, x); } - template<> inline void scalar_set_element(GrB_Scalar A, uint8_t x) { GrB_Scalar_setElement_UINT8(A, x); } - template<> inline void scalar_set_element(GrB_Scalar A, uint16_t x) { GrB_Scalar_setElement_UINT16(A, x); } - template<> inline void scalar_set_element(GrB_Scalar A, uint32_t x) { GrB_Scalar_setElement_UINT32(A, x); } - template<> inline void scalar_set_element(GrB_Scalar A, uint64_t x) { GrB_Scalar_setElement_UINT64(A, x); } - template<> inline void scalar_set_element(GrB_Scalar A, float x) { GrB_Scalar_setElement_FP32(A, x); } - template<> inline void scalar_set_element(GrB_Scalar A, double x) { GrB_Scalar_setElement_FP64(A, x); } - template<> inline void scalar_set_element(GrB_Scalar A, bool x) { GrB_Scalar_setElement_BOOL(A, x); } - - -template -GrB_Info vector_reduce(T *scalar, GrB_Vector A, GrB_Monoid op); - -template<> inline GrB_Info vector_reduce(int8_t *scalar, GrB_Vector A, GrB_Monoid op) { return GrB_Vector_reduce_INT8(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info vector_reduce(int16_t *scalar, GrB_Vector A, GrB_Monoid op) { return GrB_Vector_reduce_INT16(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info vector_reduce(int32_t *scalar, GrB_Vector A, GrB_Monoid op) { return GrB_Vector_reduce_INT32(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info vector_reduce(int64_t *scalar, GrB_Vector A, GrB_Monoid op) { return GrB_Vector_reduce_INT64(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info vector_reduce(uint8_t *scalar, GrB_Vector A, GrB_Monoid op) { return GrB_Vector_reduce_UINT8(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info vector_reduce(uint16_t *scalar, GrB_Vector A, GrB_Monoid op) { return GrB_Vector_reduce_UINT16(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info vector_reduce(uint32_t *scalar, GrB_Vector A, GrB_Monoid op) { return GrB_Vector_reduce_UINT32(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info vector_reduce(uint64_t *scalar, GrB_Vector A, GrB_Monoid op) { return GrB_Vector_reduce_UINT64(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info vector_reduce(float *scalar, GrB_Vector A, GrB_Monoid op) { return GrB_Vector_reduce_FP32(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info vector_reduce(double *scalar, GrB_Vector A, GrB_Monoid op) { return GrB_Vector_reduce_FP64(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info vector_reduce(bool *scalar, GrB_Vector A, GrB_Monoid op) { return GrB_Vector_reduce_BOOL(scalar, NULL, op, A, NULL); } - -/** - * GxB_Matrix_reduce_FC32 // c = accum (c, reduce_to_scalar (A)) - ( - GxB_FC32_t *c, // result scalar - const GrB_BinaryOp accum, // optional accum for c=accum(c,t) - const GrB_Monoid monoid, // monoid to do the reduction - const GrB_Matrix A, // matrix to reduce - const GrB_Descriptor desc - - * @tparam T - * @param scalar - * @param A - * @param op - * @return - */ - -template -GrB_Info matrix_reduce(T *scalar, GrB_Matrix A, GrB_Monoid op); - -template<> inline GrB_Info matrix_reduce(int8_t *scalar, GrB_Matrix A, GrB_Monoid op) { return GrB_Matrix_reduce_INT8(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info matrix_reduce(int16_t *scalar, GrB_Matrix A, GrB_Monoid op) { return GrB_Matrix_reduce_INT16(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info matrix_reduce(int32_t *scalar, GrB_Matrix A, GrB_Monoid op) { return GrB_Matrix_reduce_INT32(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info matrix_reduce(int64_t *scalar, GrB_Matrix A, GrB_Monoid op) { return GrB_Matrix_reduce_INT64(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info matrix_reduce(uint8_t *scalar, GrB_Matrix A, GrB_Monoid op) { return GrB_Matrix_reduce_UINT8(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info matrix_reduce(uint16_t *scalar, GrB_Matrix A, GrB_Monoid op) { return GrB_Matrix_reduce_UINT16(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info matrix_reduce(uint32_t *scalar, GrB_Matrix A, GrB_Monoid op) { return GrB_Matrix_reduce_UINT32(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info matrix_reduce(uint64_t *scalar, GrB_Matrix A, GrB_Monoid op) { return GrB_Matrix_reduce_UINT64(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info matrix_reduce(float *scalar, GrB_Matrix A, GrB_Monoid op) { return GrB_Matrix_reduce_FP32(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info matrix_reduce(double *scalar, GrB_Matrix A, GrB_Monoid op) { return GrB_Matrix_reduce_FP64(scalar, NULL, op, A, NULL); } -template<> inline GrB_Info matrix_reduce(bool *scalar, GrB_Matrix A, GrB_Monoid op) { return GrB_Matrix_reduce_BOOL(scalar, NULL, op, A, NULL); } - - -template -GrB_Info get_element(GrB_Matrix A, T* x, int64_t i, int64_t j); -template<> inline GrB_Info get_element(GrB_Matrix A, int8_t *x, int64_t i, int64_t j) { return GrB_Matrix_extractElement_INT8(x, A, i, j); } -template<> inline GrB_Info get_element(GrB_Matrix A, int16_t *x, int64_t i, int64_t j) { return GrB_Matrix_extractElement_INT16(x, A, i, j); } -template<> inline GrB_Info get_element(GrB_Matrix A, int32_t *x, int64_t i, int64_t j) { return GrB_Matrix_extractElement_INT32(x, A, i, j); } -template<> inline GrB_Info get_element(GrB_Matrix A, int64_t *x, int64_t i, int64_t j) { return GrB_Matrix_extractElement_INT64(x, A, i, j); } -template<> inline GrB_Info get_element(GrB_Matrix A, uint8_t *x, int64_t i, int64_t j) { return GrB_Matrix_extractElement_UINT8(x, A, i, j); } -template<> inline GrB_Info get_element(GrB_Matrix A, uint16_t *x, int64_t i, int64_t j) { return GrB_Matrix_extractElement_UINT16(x, A, i, j); } -template<> inline GrB_Info get_element(GrB_Matrix A, uint32_t *x, int64_t i, int64_t j) { return GrB_Matrix_extractElement_UINT32(x, A, i, j); } -template<> inline GrB_Info get_element(GrB_Matrix A, uint64_t *x, int64_t i, int64_t j) { return GrB_Matrix_extractElement_UINT64(x, A, i, j); } -template<> inline GrB_Info get_element(GrB_Matrix A, float *x, int64_t i, int64_t j) { return GrB_Matrix_extractElement_FP32(x, A, i, j); } -template<> inline GrB_Info get_element(GrB_Matrix A, double *x, int64_t i, int64_t j) { return GrB_Matrix_extractElement_FP64(x, A, i, j); } -template<> inline GrB_Info get_element(GrB_Matrix A, bool *x, int64_t i, int64_t j) { return GrB_Matrix_extractElement_BOOL(x, A, i, j); } - - - - - -template -class type_name { -public: - static const char *name; -}; - -#define DECLARE_TYPE_NAME(x) template<> inline const char *type_name::name = #x; -#define GET_TYPE_NAME(x) (type_name::name) - - DECLARE_TYPE_NAME(int); - DECLARE_TYPE_NAME(int&); - DECLARE_TYPE_NAME(int*); - DECLARE_TYPE_NAME(int8_t); - DECLARE_TYPE_NAME(int8_t&); - DECLARE_TYPE_NAME(int8_t*); - DECLARE_TYPE_NAME(unsigned char); - DECLARE_TYPE_NAME(unsigned char&); - DECLARE_TYPE_NAME(unsigned char*); -// DECLARE_TYPE_NAME(unsigned int); -// DECLARE_TYPE_NAME(unsigned int&); -// DECLARE_TYPE_NAME(unsigned int*); -// DECLARE_TYPE_NAME(unsigned int32_t); -// DECLARE_TYPE_NAME(unsigned int32_t&); -// DECLARE_TYPE_NAME(unsigned int32_t*); - DECLARE_TYPE_NAME(unsigned int64_t); - DECLARE_TYPE_NAME(unsigned int64_t&); - DECLARE_TYPE_NAME(unsigned int64_t*); - DECLARE_TYPE_NAME(long); - DECLARE_TYPE_NAME(long&); - DECLARE_TYPE_NAME(long*); - DECLARE_TYPE_NAME(float); - DECLARE_TYPE_NAME(float&); - DECLARE_TYPE_NAME(float*); - DECLARE_TYPE_NAME(double); - DECLARE_TYPE_NAME(double&); - DECLARE_TYPE_NAME(double*); - DECLARE_TYPE_NAME(bool); - - - - inline const std::string grb_str_type(GB_Type_code grb_type_code) { - switch(grb_type_code) { - case GB_BOOL_code: - return "bool"; - case GB_INT8_code: - return "int8_t"; - case GB_UINT8_code: - return "uint8_t"; - case GB_INT16_code: - return "int16_t"; - case GB_UINT16_code: - return "uint16_t"; - case GB_INT32_code: - return "int32_t"; - case GB_UINT32_code: - return "uint32_t"; - case GB_INT64_code: - return "int64_t"; - case GB_UINT64_code: - return "uint64_t"; - case GB_FP32_code: - return "float"; - case GB_FP64_code: - return "double"; - default: - printf("Error: GrB_Type not supported.\n"); - exit(1); - } - } - - -} // namespace cuda::jit -#endif diff --git a/GraphBLAS/CUDA/test/GpuTimer.h b/GraphBLAS/CUDA/test/GpuTimer.h deleted file mode 100644 index ed5b52520d..0000000000 --- a/GraphBLAS/CUDA/test/GpuTimer.h +++ /dev/null @@ -1,49 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/test/GpuTimer.h -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -#ifndef __GPU_TIMER_H__ -#define __GPU_TIMER_H__ - -#include -struct GpuTimer -{ - cudaEvent_t start; - cudaEvent_t stop; - - GpuTimer() - { - cudaEventCreate(&start); - cudaEventCreate(&stop); - } - - ~GpuTimer() - { - cudaEventDestroy(start); - cudaEventDestroy(stop); - } - - void Start() - { - cudaEventRecord(start, 0); - } - - void Stop() - { - cudaEventRecord(stop, 0); - } - - float Elapsed() - { - float elapsed; - cudaEventSynchronize(stop); - cudaEventElapsedTime(&elapsed, start, stop); - return elapsed; - } -}; - -#endif /* __GPU_TIMER_H__ */ diff --git a/GraphBLAS/CUDA/test/Makefile b/GraphBLAS/CUDA/test/Makefile deleted file mode 100644 index 412ac47294..0000000000 --- a/GraphBLAS/CUDA/test/Makefile +++ /dev/null @@ -1,133 +0,0 @@ -#------------------------------------------------------------------------------- -# GraphBLAS/CUDA/test/Makefile -#------------------------------------------------------------------------------- - -# cuda 10.1+ is assumed - -all: cudaTest - - -LIBS = -L/usr/local/cuda/lib64 -L/usr/local/cuda/lib64/stubs -lpthreads -lcudadevrt -lcudart -lnvrtc -INC += -I$(CUDA_DIR)/include -I../ -I../../Source -I../../Include -I../../Source/Template -I$(TEMPLATE_DIR) -Igoogletest/include - -CUDA_OPTS = -O2 --cudart=shared --gpu-architecture=compute_75\ - --relocatable-device-code true --device-c\ - --std=c++17 -Xcompiler -fPIC - -%.o: %.cu - nvcc -c $(I) $(CUDA_OPTS) $(INC) -o $@ $< - -config: - nvidia-smi - nvcc --version - @echo " " - @echo "SO_NAME: " $(SO_NAME) - @echo "SO_OPTS: " $(SO_OPTS) - @echo "LIBS: " $(LIBS) - @echo "CUDA_OPTS: " $(CUDA_OPTS) - @echo "SRC: " $(SRC) - @echo "OBJ: " $(OBJ) - @echo "I: " $(I) - @echo " " - gcc --version - icc --version - -clean: - rm -f *.o - rm -f stringify - rm -f cudaTest - rm -f testJit -.PHONY: clean - -distclean: clean - rm -f *.so *.a - -purge: distclean - -################################################################################ - -GXX ?= g++ -GCC ?= gcc -DOXYGEN ?= doxygen -CXXFLAGS ?= -O3 -Wall -g -fmessage-length=80 -CFLAGS ?= -O2 -g -std=c11 - -CXX11 ?= 1 - -CUDA_DIR ?= /usr/local/cuda - -CXXFLAGS += -pthread - -ifeq ($(CXX11),1) - CXXFLAGS += -std=c++17 -endif - -EMBED_BEGIN = -rdynamic -Wl,-b,binary, -EMBED_END = ,-b,default - -UNAME_S := $(shell uname -s) -ifeq ($(UNAME_S),Linux) - CXXFLAGS += -D LINUX - CUDA_LIB_DIR = $(CUDA_DIR)/lib64 -else ifeq ($(UNAME_S),Darwin) - CUDA_LIB_DIR = $(CUDA_DIR)/lib -endif - -TEMPLATE_DIR ?= ../templates - -LIB += -ldl -L$(CUDA_LIB_DIR) -L$(CUDA_LIB_DIR)/stubs -lcuda -lcudadevrt -lcudart -lnvrtc - -# FIXME: file names in HEADERS are old -HEADERS = jitify.hpp dataFactory.hpp jitFactory.hpp jitTestFactory.hpp semiringFactory.hpp \ - ../type_name.hpp - -TEMPLATES := $(wildcard $(TEMPLATE_DIR)/*.cu) - -CU_OBJS := ../GB_cuda_jitify_cache.o ../GB_cuda_jitify_launcher.o - -CFILES := $(wildcard ../*.c) - -COBJS := $(patsubst %.c, %.o, $(CFILES) ) - -JIT_TEMP := $(patsubst %.cu, %.cu.jit, $(TEMPLATES)) - -GTEST_LIB := googletest/build/lib/libgtest.a googletest/build/lib/libgtest_main.a - -%.cu.jit: %.cu - ../stringify $? > $@ - -stringify: stringify.cpp - $(GXX) -o $@ $< -O3 -Wall - -%.o: %.c - $(GXX) -c -o $@ $< $(CFLAGS) $(INC) - -%.o: %.cpp - $(GXX) -c -o $@ $< $(CXXFLAGS) $(INC) - -cu_link.o: $(CU_OBJS) - nvcc --gpu-architecture=compute_75 --device-link $(CU_OBJS) --output-file cu_link.o - - -testJit: ../tofix/testJit.cpp $(OBJS) $(HEADERS) $(JIT_TEMP) - $(GXX) -o $@ $< $(CXXFLAGS) $(INC) $(OBJS) $(LIB) - -AxB_dot3_test_instances.hpp: testGen.py - python3 testGen.py - - -instances := AxB_dot3_test_instances.hpp - - -cudaTest: cudaTest.cpp.bak $(COBJS) $(OBJS) $(HEADERS) $(JIT_TEMP) cu_link.o AxB_dot3_cuda_tests.hpp.bak $(instances) - $(GXX) -o $@ $< $(CXXFLAGS) $(INC) $(COBJS) $(CU_OBJS) cu_link.o $(LIB) $(GTEST_LIB) - -%.cu: %.cutmp - cp $? $@ - - -doc: jitify.hpp Doxyfile - $(DOXYGEN) Doxyfile -.PHONY: doc - - diff --git a/GraphBLAS/CUDA/test/cuda_tests_template.cpp b/GraphBLAS/CUDA/test/cuda_tests_template.cpp deleted file mode 100644 index 340ded031b..0000000000 --- a/GraphBLAS/CUDA/test/cuda_tests_template.cpp +++ /dev/null @@ -1,25 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/test/cuda_tests_template.cpp -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -// Test AxB_dot3_cuda kernels -// Using data generators and test classes, cover -// all NBUCKETS cases for the masked GEMM ( C, M, A, B) in GraphBLAS -// Tests Semirings, data types and a range of data input sizes and shapes -// Connects to the jitFactory for launches. - -#include -#include -#include -#include -#include -#include "problem_spec.hpp" -#include "jitTestFactory.hpp" -#include "../GB_cuda_buckets.h" - -//Test instances and groupings - diff --git a/GraphBLAS/CUDA/test/dataFactory.hpp b/GraphBLAS/CUDA/test/dataFactory.hpp deleted file mode 100644 index 5c6263c918..0000000000 --- a/GraphBLAS/CUDA/test/dataFactory.hpp +++ /dev/null @@ -1,382 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/test/dataFactory.hpp -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -#pragma once - -#include -#include -#include -#include - -#include "GB.h" -#include "GB_cuda_type_wrap.hpp" -#include "test_utility.hpp" -#include "GB_cuda_error.h" - -// CAUTION: This assumes our indices are small enough to fit into a 32-bit int. -inline std::int64_t gen_key(std::int64_t i, std::int64_t j) { - return (std::int64_t) i << 32 | (std::int64_t) j; -} - -//Vector generators -template -void fillvector_linear( int N, T *vec, int start=0) { - for (int i = start; i< N+start; ++i) vec[i] = T(i); -} -template -void fillvector_constant( int N, T *vec, T val) { - for (int i = 0; i< N; ++i) vec[i] = val; -} - -// Mix-in class to enable unified memory -class Managed { -public: - void *operator new(size_t len) { - void *ptr = nullptr; - //std::cout<<"in new operator, alloc for "< -class matrix : public Managed { - int64_t nrows_; - int64_t ncols_; - - public: - GrB_Matrix mat; - - matrix(int64_t nrows, int64_t ncols): nrows_(nrows), ncols_(ncols) {} - - GrB_Matrix get_grb_matrix() { - return mat; - } - - ~matrix() { - if(mat != NULL) { - GrB_Matrix_free(&mat); - mat = NULL; - } - } - - uint64_t get_zombie_count() { return mat->nzombies;} - - void clear() { - GRB_TRY (GrB_Matrix_clear (mat)) ; - } - - void alloc() { - GrB_Type type = cuda::jit::to_grb_type(); - - GRB_TRY (GrB_Matrix_new (&mat, type, nrows_, ncols_)) ; - - // GxB_Matrix_Option_set (mat, GxB_SPARSITY_CONTROL, - // GxB_SPARSE) ; - // or: - // GxB_HYPERSPARSE, GxB_BITMAP, GxB_FULL - } - - - void fill_random( int64_t nnz, int gxb_sparsity_control, int gxb_format, std::int64_t seed = 12345ULL, T val_min = 0.0, T val_max = 2.0 , bool debug_print = false) { - -// std::cout << "inside fill_random, using seed "<< seed << std::endl; - alloc(); - - double inv_sparsity ; - if (nnz < 0) - { - // build a matrix with all entries present - inv_sparsity = 1 ; - } - else - { - inv_sparsity = ceil(((double)nrows_*ncols_)/nnz); //= values not taken per value occupied in index space - } -// -// std::cout<< "fill_random nrows="<< nrows_<<"ncols=" << ncols_ <<" need "<< nnz<<" values, invsparse = "< dis(0.0, 1.0); - - if (nnz < 0 || inv_sparsity == 1.) - { -// std::cout<<"filling dense"< (mat, x, i, j) ; - // A (j,i) = x - cuda::jit::set_element (mat, x, j, i) ; - } - else - { - // A (i,j) = x - cuda::jit::set_element (mat, x, i, j) ; - } - } - } - -// std::cout << "done." << std::endl; - } - else - { -// std::cout<<"filling sparse"< row_lookup; - unordered_set key_lookup; - for ( int co = 0; co < 2*nrows_; co++ ) - { - GrB_Index i = ((GrB_Index) (dis(r) * nrows_)) % ((GrB_Index) nrows_) ; - - row_lookup.insert( i ); - } - int remain= nnz; //countdown to done - - while ( remain > 0) - { -// std::cout<< remain<<" nonzeroes left to fill.."< 0 ) - { - GrB_Index j = ((GrB_Index) (dis(r) * ncols_)) % ((GrB_Index) ncols_) ; - if (key_lookup.count( gen_key(i,j) ) == 1) continue; - if (no_self_edges && (i == j)) continue ; - - key_lookup.insert( gen_key(i, j) ); - col_guess--; - remain= (nnz- key_lookup.size() ); - if (remain <= 0) break; - if (make_symmetric) { - // A (j,i) = x - if (key_lookup.count( gen_key( j, i) ) == 0) - { - key_lookup.insert( gen_key( j, i) ) ; - col_guess--; - remain= (nnz- key_lookup.size() ); - } - } - if (remain <= 0) break; - } - if (remain <= 0) break; - //std::cout<< remain<<" nonzeroes left..."< 0 - /* - while(key_lookup.size() < nnz) { - GrB_Index i = ((GrB_Index) (dis(r) * nrows_)) % ((GrB_Index) nrows_) ; - GrB_Index j = ((GrB_Index) (dis(r) * ncols_)) % ((GrB_Index) ncols_) ; - - key_lookup.insert( gen_key(i, j) ); - if (make_symmetric) { - // A (j,i) = x - key_lookup.insert( gen_key( j, i) ) ; - } - } */ - - for (int64_t k : key_lookup) - { - GrB_Index i = k >> 32; - GrB_Index j = k & 0x0000ffff; - - T x = (T)val_min + (T)(dis(r) * (val_max - val_min)) ; - // A (i,j) = x - cuda::jit::set_element (mat, x, i, j) ; - if (make_symmetric) { - // A (j,i) = x - cuda::jit::set_element(mat, x, j, i) ; - } - } - } - - GRB_TRY (GrB_Matrix_wait (mat, GrB_MATERIALIZE)) ; - GB_convert_any_to_non_iso (mat, true) ; - // TODO: Need to specify these - GRB_TRY (GxB_Matrix_Option_set (mat, GxB_SPARSITY_CONTROL, gxb_sparsity_control)) ; - GRB_TRY (GxB_Matrix_Option_set(mat, GxB_FORMAT, gxb_format)); - GRB_TRY (GrB_Matrix_wait (mat, GrB_MATERIALIZE)) ; - GRB_TRY (GrB_Matrix_nvals ((GrB_Index *) &nnz, mat)) ; - //GRB_TRY (GxB_Matrix_fprint (mat, "my random mat", GxB_SHORT_VERBOSE, stdout)) ; - - bool iso ; - GRB_TRY (GxB_Matrix_iso (&iso, mat)) ; - if (iso) - { - printf ("Die! (cannot do iso)\n") ; - GRB_TRY (GrB_Matrix_free (&mat)) ; - } - - } - -}; - - - -template< typename T_C, typename T_M, typename T_A, typename T_B> -class SpGEMM_problem_generator { - - float Anzpercent,Bnzpercent,Mnzpercent; - int64_t Mnz; - int64_t *Bucket = nullptr; - - int64_t BucketStart[NBUCKETS+1]; - unsigned seed = 13372801; - bool ready = false; - - int64_t nrows_; - int64_t ncols_; - - public: - - matrix *C= nullptr; - matrix *M= nullptr; - matrix *A= nullptr; - matrix *B= nullptr; - - SpGEMM_problem_generator() {}; - - SpGEMM_problem_generator(int64_t nrows, int64_t ncols): nrows_(nrows), ncols_(ncols) { - - // Create sparse matrices - C = new matrix(nrows_, ncols_); - M = new matrix(nrows_, ncols_); - A = new matrix(nrows_, ncols_); - B = new matrix(nrows_, ncols_); - }; - - void initDim ( int64_t nrows, int64_t ncols){ - nrows_ = nrows; - ncols_ = ncols; - // Create sparse matrices - C = new matrix(nrows_, ncols_); - M = new matrix(nrows_, ncols_); - A = new matrix(nrows_, ncols_); - B = new matrix(nrows_, ncols_); - } - - matrix* getCptr(){ return C;} - matrix* getMptr(){ return M;} - matrix* getAptr(){ return A;} - matrix* getBptr(){ return B;} - - void init_A(std::int64_t Anz, int gxb_sparsity_control, int gxb_format, std::int64_t seed = 12345ULL, T_A min_val = 0.0, T_A max_val = 2.0) { - Anzpercent = float(Anz)/float(nrows_*ncols_); - A->fill_random(Anz, gxb_sparsity_control, gxb_format, seed, min_val, max_val); - } - - void init_B(std::int64_t Bnz, int gxb_sparsity_control, int gxb_format, std::int64_t seed = 54321ULL, T_B min_val = 0.0, T_B max_val = 2.0) { - Bnzpercent = float(Bnz)/float(nrows_*ncols_); - B->fill_random(Bnz, gxb_sparsity_control, gxb_format, seed, min_val, max_val); - } - - GrB_Matrix getC(){ return C->get_grb_matrix();} - GrB_Matrix getM(){ return M->get_grb_matrix();} - GrB_Matrix getA(){ return A->get_grb_matrix();} - GrB_Matrix getB(){ return B->get_grb_matrix();} - - int64_t* getBucket() { return Bucket;} - int64_t* getBucketStart(){ return BucketStart;} - - void init_C(float Mnzp, std::int64_t seed_c = 23456ULL, std::int64_t seed_m = 4567ULL){ - - // Get sizes relative to fully dense matrices - Mnzpercent = Mnzp; - Mnz = (int64_t)(Mnzp * nrows_ * ncols_); - - //Seed the generator - //std::cout<<"filling matrices"<fill_random(Mnz, GxB_SPARSE, GxB_BY_ROW, seed_m); - M->fill_random(Mnz, GxB_SPARSE, GxB_BY_ROW, seed_m); - - } - - void del(){ - C->clear(); - M->clear(); - A->clear(); - B->clear(); - //if (Bucket != nullptr) CHECK_CUDA( cudaFree(Bucket) ); - delete C; - delete M; - delete A; - delete B; - CHECK_CUDA( cudaDeviceSynchronize() ); - } - - // - void fill_buckets( int fill_bucket){ - - std::cout< fill_bucket) BucketStart[b] = Mnz; - //std::cout<< " one bucket "<< b<<"starts at "<\n", - "#include \n", - "\n", - "template\n", - "class TestData {\n", - "\n", - "public:\n", - " TestData( std::vector A_indptr_,\n", - " std::vector A_indices_,\n", - " std::vector A_data_,\n", - "\n", - " std::vector B_indptr_,\n", - " std::vector B_indices_,\n", - " std::vector B_data_,\n", - "\n", - "\n", - " std::vector C_indptr_,\n", - " std::vector C_indices_,\n", - " std::vector C_data_,\n", - "\n", - " std::vector M_indptr_,\n", - " std::vector M_indices_,\n", - " std::vector M_data_):\n", - " A_indptr(A_indptr_), A_indices(A_indices_), A_data(A_data_),\n", - " B_indptr(B_indptr_), B_indices(B_indices_), B_data(B_data_),\n", - " C_indptr(C_indptr_), C_indices(C_indices_), C_data(C_data_),\n", - " M_indptr(M_indptr_), M_indices(M_indices_), M_data(M_data_){}\n", - "\n", - "\n", - " std::vector A_indptr;\n", - " std::vector A_indices;\n", - " std::vector A_data;\n", - " \n", - " std::vector B_indptr;\n", - " std::vector B_indices;\n", - " std::vector B_data;\n", - " \n", - " \n", - " std::vector C_indptr;\n", - " std::vector C_indices;\n", - " std::vector C_data;\n", - "\n", - " std::vector M_indptr;\n", - " std::vector M_indices;\n", - " std::vector M_data;\n", - "\n", - "};\n", - "\n", - "template\n", - "std::unique_ptr> make_karate_tricount() {\n", - "\n", - " std::vector A_indptr = %s;\n", - " std::vector A_indices = %s;\n", - " std::vector A_data = %s;\n", - "\n", - " std::vector B_indptr = %s;\n", - " std::vector B_indices = %s;\n", - " std::vector B_data = %s;\n", - "\n", - " std::vector M_indptr = %s;\n", - " std::vector M_indices = %s;\n", - " std::vector M_data = %s;\n", - "\n", - " std::vector C_indptr = %s;\n", - " std::vector C_indices = %s;\n", - " std::vector C_data = %s;\n", - "\n", - " TestData karate_tricount(A_indptr, A_indices, A_data,\n", - " B_indptr, B_indices, B_data,\n", - " C_indptr, C_indices, C_data,\n", - " M_indptr, M_indices, M_data);\n", - "\n", - " return std::make_unique>(karate_tricount);\n", - "}\n", - "\n", - "\n", - "\n", - "TestData karate_tricount;\n", - "karate.A_indptr = %s;\n", - "karate.A_indices = %s;\n", - "karate.A_data = %s;\n", - "\n", - "karate.B_indptr = %s;\n", - "karate.B_indices = %s;\n", - "karate.B_data = %s;\n", - "\n", - "karate.M_indptr = %s;\n", - "karate.M_indices = %s;\n", - "karate.M_data = %s;\n", - "\n", - "karate.C_indptr = %s;\n", - "karate.C_indices = %s;\n", - "karate.C_data = %s;\n", - "\"\"\" % data" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "b8c2c497-7156-449e-9c44-6fa19bdedea3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'\\ntemplate\\nstruct TestData {\\n\\n std::vector A_indptr;\\n std::vector A_indices;\\n std::vector A_data;\\n \\n std::vector B_indptr;\\n std::vector B_indices;\\n std::vector B_data;\\n \\n \\n std::vector C_indptr;\\n std::vector C_indices;\\n std::vector C_data;\\n\\n std::vector M_indptr;\\n std::vector M_indices;\\n std::vector M_data;\\n\\n}\\n\\n\\nTestData karate_tricount;\\nkarate.A_indptr = { 0,16,24,32,35,37,40,41,41,44,45,45,45,45,46,48,50,50,50,52,53,55,55,57,\\n 62,65,66,68,69,71,73,75,77,78,78};\\nkarate.A_indices = { 1, 2, 3, 4, 5, 6, 7, 8,10,11,12,13,17,19,21,31, 2, 3, 7,13,17,19,21,30,\\n 3, 7, 8, 9,13,27,28,32, 7,12,13, 6,10, 6,10,16,16,30,32,33,33,33,32,33,\\n 32,33,32,33,33,32,33,32,33,25,27,29,32,33,25,27,31,31,29,33,33,31,33,32,\\n 33,32,33,32,33,33};\\nkarate.A_data = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\\n 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\\n 1,1,1,1};\\n\\nkarate.B_indptr = { 0, 0, 1, 3, 6, 7, 8,11,15,17,18,21,22,24,28,28,28,30,32,32,34,34,36,36,\\n 36,36,38,38,41,42,44,46,50,61,78};\\nkarate.B_indices = { 0, 0, 1, 3, 6, 7, 8,11,15,17,18,21,22,24,28,28,28,30,32,32,34,34,36,36,\\n 36,36,38,38,41,42,44,46,50,61,78};\\nkarate.B_data = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\\n 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\\n 1,1,1,1};\\n\\nkarate.M_indptr = { 0, 16, 25, 35, 41, 44, 48, 52, 56, 61, 63, 66, 67, 69, 74, 76, 78, 80,\\n 82, 84, 87, 89, 91, 93, 98,101,104,106,110,113,117,121,127,139,156};\\nkarate.M_indices = { 0, 16, 25, 35, 41, 44, 48, 52, 56, 61, 63, 66, 67, 69, 74, 76, 78, 80,\\n 82, 84, 87, 89, 91, 93, 98,101,104,106,110,113,117,121,127,139,156};\\nkarate.M_data = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\\n 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\\n 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\\n 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\\n 1,1,1,1,1,1,1,1};\\n\\nkarate.C_indptr = { 0, 0, 7,12,17,19,21,24,27,29,29,31,31,32,35,35,35,36,37,37,38,38,39,39,\\n 39,39,40,40,41,41,43,45,47,51,56};\\nkarate.C_indices = { 0, 0, 7,12,17,19,21,24,27,29,29,31,31,32,35,35,35,36,37,37,38,38,39,39,\\n 39,39,40,40,41,41,43,45,47,51,56};\\nkarate.C_data = { 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 2, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1,\\n 1, 2, 3, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1,\\n 1, 1,10, 1, 2, 1, 1,10};\\n'" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "output_str" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "f0c11d60-a542-41b7-afe6-38d93df094f7", - "metadata": {}, - "outputs": [], - "source": [ - "def store_file(output_string, filename = \"test_data.hpp\"):\n", - " with open(filename, 'w') as f:\n", - " f.write(output_string)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "bc22e70f-5373-4e80-88d5-c18e9c03cf76", - "metadata": {}, - "outputs": [], - "source": [ - "store_file(output_str)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "255965d0-b90b-4ad7-a53a-9f5eb4745906", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python (cuml_2204_0222222_2)", - "language": "python", - "name": "cuml_2204_022222_2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.7" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/GraphBLAS/CUDA/test/jitTestFactory.hpp b/GraphBLAS/CUDA/test/jitTestFactory.hpp deleted file mode 100644 index 9e83ae4dd0..0000000000 --- a/GraphBLAS/CUDA/test/jitTestFactory.hpp +++ /dev/null @@ -1,916 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/test/jitTestFactory.hpp -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -#pragma once - -#include -#include -#include -#include -#include -#include "GpuTimer.h" -#include "GB_cuda_buckets.h" -#include -#include "test_data.hpp" -#include "../rmm_wrap/rmm_wrap.hpp" -#include "problem_spec.hpp" - -extern "C" { - #include "GB.h" -} - -#include "GB_cuda_common_jitFactory.hpp" -#include "GB_cuda_mxm_dot3_jitFactory.hpp" -#include "GB_cuda_reduce_jitFactory.hpp" -#include "GB_cuda_reduce_factory.hpp" -#include "dataFactory.hpp" - -////Operations for test results on CPU -//template T myOP_plus( T a, T b) { return a + b;} -//template T myOP_min ( T a, T b) { return a < b ? a : b;} -//template T myOP_max ( T a, T b) { return a > b ? a : b;} -//template T myOP_first ( T a, T b) { return a ;} -//template T myOP_second ( T a, T b) { return b ;} -//template T myOP_times ( T a, T b) { return a * b ;} -// -//template T (*myOpPTR)(T a, T b); -//template T (*ADD_ptr)(T a, T b); -//template T (*MUL_ptr)(T a, T b); - -//AxB_dot3_phase1 kernels -template -bool test_AxB_phase1_factory( int64_t , int64_t , int64_t , int64_t ) ; - -//AxB_dot3_phase2 kernels -template -bool test_AxB_dot3_phase2_factory( int , int64_t , int64_t , int64_t, int64_t ) ; - -template -void make_grb_matrix(GrB_Matrix mat, int64_t n_rows, int64_t n_cols, - std::vector &indptr, - std::vector &indices, T *data, - int gxb_sparsity_control = GxB_SPARSE, - int gxb_format = GxB_BY_ROW) ; - -//Fixture to generate valid inputs and hold them for tests -class AxB_dot3_Test : public ::testing::Test -{ - void SetUp() {} - - void TearDown() {} -}; - -template -void print_array(void *arr, I size, const char *name) { - std::cout << "Printing " << name << std::endl; - for(I i = 0; i < size; ++i) { - std::cout << static_cast(arr)[i] << ", "; - } - std::cout << std::endl; -} - -//------------------------------------------------------------------------------ -// test_AxB_phase1_factory: test phase1 -//------------------------------------------------------------------------------ - -// Test generator code, to allow parameterized tests -// Uses jitFactory, dataFactory and GB_jit -template -bool test_AxB_phase1_factory(mxm_problem_spec &problem_spec) -{ - - cudaStream_t stream = (cudaStream_t)rmm_wrap_get_main_stream(); - - /******************** - * Launch kernel - */ - GB_cuda_mxm_factory mysemiringfactory = problem_spec.get_mxm_factory(); - phase1launchFactory p1lF(mysemiringfactory); - - GpuTimer kernTimer; - - int nthrd = p1lF.get_threads_per_block(); - int ntasks = p1lF.get_number_of_blocks(problem_spec.getM()); - - // TODO: Verify that RMM is checking and throwing exceptions - int nanobuckets_size = NBUCKETS * nthrd * ntasks; - int blockbuckets_size = NBUCKETS * ntasks; - - int64_t *Nanobuckets = (int64_t*)rmm_wrap_malloc(nanobuckets_size * sizeof (int64_t)); - int64_t *Blockbucket = (int64_t*)rmm_wrap_malloc(blockbuckets_size * sizeof (int64_t)); - - kernTimer.Start(); - p1lF.jitGridBlockLaunch(Nanobuckets, Blockbucket, - problem_spec.getC(), problem_spec.getM(), - problem_spec.getA(), problem_spec.getB(), stream); - - CHECK_CUDA(cudaStreamSynchronize(stream)); - kernTimer.Stop(); - std::cout<<"returned from phase1 kernel "<(Nanobuckets, nanobuckets_size, "Nanobuckets"); -// print_array(Blockbucket, blockbuckets_size, "Blockbucket"); - std::cout<<"==== phase1 done=============================" < -bool test_AxB_dense_phase1_factory(mxm_problem_spec &problem_spec) -{ - cudaStream_t stream = (cudaStream_t)rmm_wrap_get_main_stream(); - - /******************** - * Launch kernel - */ - GB_cuda_mxm_factory mysemiringfactory = problem_spec.get_mxm_factory(); - dense_phase1launchFactory p1lF(mysemiringfactory); - p1lF.jitGridBlockLaunch(problem_spec.getC(), problem_spec.getM(), problem_spec.getA(), problem_spec.getB(), stream); - return true; -} - - -//------------------------------------------------------------------------------ -// test_AxB_phase2_factory: test phase2 and phase2end -//------------------------------------------------------------------------------ - -template -bool test_AxB_phase2_factory(mxm_problem_spec &problem_spec) -{ - cudaStream_t stream = (cudaStream_t)rmm_wrap_get_main_stream(); - - auto mymxm = problem_spec.get_mxm_factory(); - phase1launchFactory p1lF(mymxm); - phase2launchFactory p2lF; - phase2endlaunchFactory p2elF; - - GpuTimer kernTimer; - kernTimer.Start(); - - const int64_t mnz = GB_nnz (problem_spec.getM()) ; - - int nthrd = p2lF.get_threads_per_block(); - int ntasks = p2elF.get_number_of_blocks(problem_spec.getM()); - - // fabricate data as if it came from phase1: - int64_t *nanobuckets = (int64_t*)rmm_wrap_malloc(NBUCKETS * nthrd * ntasks * sizeof (int64_t)); - int64_t *blockbucket = (int64_t*)rmm_wrap_malloc(NBUCKETS * ntasks * sizeof (int64_t)); - int64_t *bucketp = (int64_t*)rmm_wrap_malloc((NBUCKETS+1) * sizeof (int64_t)); - int64_t *offset = (int64_t*)rmm_wrap_malloc(NBUCKETS * sizeof (int64_t)); - int64_t *bucket = (int64_t*)rmm_wrap_malloc(mnz * sizeof (int64_t)); - - fillvector_constant(NBUCKETS, bucketp, (int64_t)0); - fillvector_constant(NBUCKETS, offset, (int64_t)0); - //fillvector_constant(problem_spec.getCnnz(), bucket, (int64_t)0); - - std::cout << "Running phase1 kernel" << std::endl; - kernTimer.Start(); - p1lF.jitGridBlockLaunch(nanobuckets, blockbucket, - problem_spec.getC(), problem_spec.getM(), - problem_spec.getA(), problem_spec.getB(), stream); - - - CHECK_CUDA(cudaStreamSynchronize(stream)); - kernTimer.Stop(); - - std::cout << " phase1 internal phase2 "<< kernTimer.Elapsed() <<"ms Done." << std::endl; - - // // launch phase2 (just with p2ntasks as the # of tasks) - kernTimer.Start(); - p2lF.jitGridBlockLaunch(blockbucket, offset, problem_spec.getM(), stream); - CHECK_CUDA(cudaStreamSynchronize(stream)); - kernTimer.Stop(); - std::cout << " phase2 kern "<< kernTimer.Elapsed() <<"ms Done." << std::endl; - -// -// // do the reduction between phase2 and phase2end - int64_t s= 0; - for ( int bucket = 0 ; bucket < NBUCKETS+1; ++bucket) - { - bucketp[bucket] = s; - s+= offset[bucket]; - } - - // launch phase2end: note same # of tasks as phase1 - kernTimer.Start(); - p2elF.jitGridBlockLaunch( nanobuckets, blockbucket, - bucketp, bucket, offset, problem_spec.getC(), - problem_spec.getM(),stream); - CHECK_CUDA(cudaStreamSynchronize(stream)); - kernTimer.Stop(); - std::cout<<"returned from phase2end kernel "<(bucketp, NBUCKETS, "bucketp"); -// print_array(bucket, mnz, "bucket"); - std::cout<<"phase2 done =================="< -void make_grb_matrix(GrB_Matrix mat, int64_t n_rows, int64_t n_cols, - std::vector &indptr, - std::vector &indices, T *data, - int gxb_sparsity_control, - int gxb_format ) -{ - - GrB_Type type = cuda::jit::to_grb_type(); - - GRB_TRY (GrB_Matrix_new (&mat, type, n_rows, n_cols)) ; - - for(int64_t row = 0; row < n_rows; ++row) { - int64_t start = indptr[row]; - int64_t stop = indptr[row+1]; - - for(int64_t offset = start; offset < stop; ++offset) { - GrB_Index i = (GrB_Index) row; - GrB_Index j = (GrB_Index) indices[offset]; - T x = data[offset]; - - cuda::jit::set_element (mat, x, i, j) ; - } - } - - GRB_TRY (GrB_Matrix_wait (mat, GrB_MATERIALIZE)) ; - GRB_TRY (GB_convert_any_to_non_iso (mat, true)) ; - GRB_TRY (GxB_Matrix_Option_set (mat, GxB_SPARSITY_CONTROL, gxb_sparsity_control)) ; - GRB_TRY (GxB_Matrix_Option_set(mat, GxB_FORMAT, gxb_format)); - - -} - -template < - typename T_C, typename T_M, typename T_A,typename T_B, - typename T_X, typename T_Y, typename T_Z> -bool test_AxB_dot3_sparse_factory(mxm_problem_spec &problem_spec) { - - // FIXME: Allow the adaptive tests in this guy - std::cout << "sparse test ======================" << std::endl; - - GpuTimer kernTimer; - - cudaStream_t strm; - CHECK_CUDA(cudaStreamCreate(&strm)); - - std::cout << "sr_code: " << problem_spec.get_mxm_factory().sr_code << std::endl; - - bool result = false; - - int64_t N = problem_spec.getN(); - /** - * Run Phase 1, phase 2 and phase2end: Compute nanobuckets and blockbuckets - */ - - auto mymxm = problem_spec.get_mxm_factory(); - phase1launchFactory p1lF(mymxm); - phase2launchFactory p2lF; - phase2endlaunchFactory p2elF; - - GrB_Matrix C = problem_spec.getC(); - GrB_Matrix M = problem_spec.getM(); - GrB_Matrix A = problem_spec.getA(); - GrB_Matrix B = problem_spec.getB(); - - const int64_t mnz = GB_nnz (M) ; - const int64_t cnz = GB_nnz (C) ; - const int64_t cvlen = C->vlen ; - const int64_t cvdim = C->vdim ; - const int64_t cnvec = C->nvec ; - - bool C_iso = false ; - int C_sparsity = GB_sparsity (M) ; - int M_sparsity = GB_sparsity (M) ; - GrB_Type ctype = problem_spec.getBinaryOp()->ztype ; - - int nthrd = p2lF.get_threads_per_block(); - int ntasks = p2elF.get_number_of_blocks(M); - - // fabricate data as if it came from phase1: - int64_t *nanobuckets = (int64_t*)rmm_wrap_malloc(NBUCKETS * nthrd * ntasks * sizeof (int64_t)); - int64_t *blockbucket = (int64_t*)rmm_wrap_malloc(NBUCKETS * ntasks * sizeof (int64_t)); - int64_t *bucketp = (int64_t*)rmm_wrap_malloc((NBUCKETS+1) * sizeof (int64_t)); - int64_t *bucket = (int64_t*)rmm_wrap_malloc(mnz * sizeof (int64_t)); - int64_t *offset = (int64_t*)rmm_wrap_malloc(NBUCKETS * sizeof (int64_t)); - - fillvector_constant(NBUCKETS, bucketp, (int64_t)0); - fillvector_constant(NBUCKETS, offset, (int64_t)0); - //fillvector_constant(problem_spec.getCnnz(), bucket, (int64_t)0); - - std::cout << "sparse phase1 kernel" << std::endl; - kernTimer.Start(); - p1lF.jitGridBlockLaunch(nanobuckets, blockbucket, - C, M, A, B, strm); - CHECK_CUDA(cudaStreamSynchronize(strm)); - kernTimer.Stop(); - std::cout<<"sparse test phase1 kernel "<nzombies += (bucketp[1]); //add pre-zombies to the count; - - GRB_TRY(GrB_Matrix_wait(C, GrB_MATERIALIZE)); - fflush(stdout); - - GrB_Matrix C_expected; - GrB_Type type = cuda::jit::to_grb_type(); - GRB_TRY (GrB_Matrix_new (&C_expected, type, N, N)) ; - - // ensure the GPU is not used - GRB_TRY (GxB_Global_Option_set (GxB_GLOBAL_GPU_ID, -1)) ; - GB_Global_hack_set (2, 2) ; // hack(2) = 2: never use the GPU - - // Use GrB_DESC_S for structural because dot3 mask will never be complemented - // The order of B and A is swapped to account for CSR vs CSC assumption - GRB_TRY (GrB_mxm(C_expected, problem_spec.getM(), NULL, problem_spec.get_semiring(), problem_spec.getB(), - problem_spec.getA(), problem_spec.get_mask_struct() ? GrB_DESC_ST1 : GrB_DESC_T1)); - - - GRB_TRY(GrB_Matrix_wait(C_expected, GrB_MATERIALIZE)); - - // compare - double tol = 0 ; - GrB_Index nvals1 = 0, nvals2 = 0 ; - GRB_TRY (GrB_Matrix_nvals (&nvals1, C)) ; - GRB_TRY (GrB_Matrix_nvals (&nvals2, C_expected)) ; - if (nvals1 != nvals2) { printf ("Wrong number of nonzeroes found, test fail!!!\n") ; ADD_FAILURE( ) ; } - GrB_Index nrows, ncols ; - GrB_Matrix_nrows (&nrows, C_expected) ; - GrB_Matrix_ncols (&ncols, C_expected) ; - - GrB_Matrix T; - - GRB_TRY (GrB_Matrix_new (&T, GrB_BOOL, nrows, ncols)) ; - GrB_BinaryOp op = NULL; - GrB_UnaryOp op_abs = NULL ; - if (type == GrB_BOOL ) op = GrB_EQ_BOOL ; - else if (type == GrB_INT8 ) op = GrB_EQ_INT8 ; - else if (type == GrB_INT16 ) op = GrB_EQ_INT16 ; - else if (type == GrB_INT32 ) op = GrB_EQ_INT32 ; - else if (type == GrB_INT64 ) op = GrB_EQ_INT64 ; - else if (type == GrB_UINT8 ) op = GrB_EQ_UINT8 ; - else if (type == GrB_UINT16) op = GrB_EQ_UINT16 ; - else if (type == GrB_UINT32) op = GrB_EQ_UINT32 ; - else if (type == GrB_UINT64) op = GrB_EQ_UINT64 ; - else if (type == GrB_FP32 ) - { tol = 1e-6; - op = (tol == 0)? GrB_EQ_FP32 : GrB_MINUS_FP32 ; - op_abs = GrB_ABS_FP32 ; - } - else if (type == GrB_FP64 ) - { tol = 1e12; - op = (tol == 0)? GrB_EQ_FP64 : GrB_MINUS_FP64 ; - op_abs = GrB_ABS_FP64 ; - } - else if (type == GxB_FC32 ) - { tol = 2e-6; - op = (tol == 0)? GxB_EQ_FC32 : GxB_MINUS_FC32 ; - op_abs = GxB_ABS_FC32 ; - } - else if (type == GxB_FC64 ) - { tol = 2e-12; - op = (tol == 0)? GxB_EQ_FC64 : GxB_MINUS_FC64 ; - op_abs = GxB_ABS_FC64 ; - } - - - - if (tol == 0) - { - // check for perfect equality - GRB_TRY (GrB_Matrix_eWiseMult_BinaryOp (T, NULL, NULL, op, C, C_expected, - NULL)) ; - GrB_Index nvals3 = 1 ; - GRB_TRY (GrB_Matrix_nvals (&nvals3, T)) ; -// if (nvals1 != nvals3) { printf (" difference matrix wrong size, test fail!!\n") ; ADD_FAILURE( ) ; } - bool is_same = false ; - GRB_TRY (GrB_Matrix_reduce_BOOL (&is_same, NULL, GrB_LAND_MONOID_BOOL, - T, NULL)) ; - if (!is_same) { printf (" results don't match, test fail!!\n") ; ADD_FAILURE ( ) ; } - GRB_TRY (GrB_Matrix_free (&T)) ; - } - else - { - // TODO: check with roundoff - // Diff = C - C_expected - GrB_Matrix Diff ; - GRB_TRY (GrB_Matrix_new (&Diff, GrB_FP64, nrows, ncols)) ; - GRB_TRY (GrB_Matrix_apply (Diff, NULL, NULL, GrB_AINV_FP64, C_expected, NULL)) ; - GRB_TRY (GrB_Matrix_eWiseAdd_BinaryOp (Diff, NULL, NULL, GrB_PLUS_FP64, - C, Diff, NULL)) ; - GRB_TRY( GrB_Matrix_apply( Diff, NULL, NULL, op_abs, Diff, NULL) ); - GrB_Index nvals3 = 1 ; - GRB_TRY (GrB_Matrix_nvals (&nvals3, Diff)) ; - if (nvals1 != nvals3) { printf ("fp difference matrix wrong size, test fail!!\n") ; ADD_FAILURE( ) ; } - double is_same = false ; - GRB_TRY (GrB_Matrix_reduce_FP64 (&is_same, NULL, GrB_PLUS_MONOID_FP64, - Diff, NULL)) ; - printf("difference = %12.6g, rel_l1_err=%12.6g\n", is_same, is_same/nvals3 ); - EXPECT_LT( is_same/nvals3, tol); - GRB_TRY (GrB_Matrix_free (&Diff)) ; - - } - - // re-enable the GPU - GRB_TRY (GxB_Global_Option_set (GxB_GLOBAL_GPU_ID, 0)) ; - GB_Global_hack_set (2, 1) ; // hack(2) = 1: always use the GPU - - rmm_wrap_free(nanobuckets); - rmm_wrap_free(blockbucket); - rmm_wrap_free(bucketp); - rmm_wrap_free(bucket); - rmm_wrap_free(offset); - GRB_TRY(GrB_Matrix_free(&C_expected)); - CHECK_CUDA(cudaStreamDestroy(strm)); - - std::cout << "phase 3 test complete ======================" << std::endl; - return result; -} - -template < - typename T_C, typename T_M, typename T_A,typename T_B, - typename T_X, typename T_Y, typename T_Z> -bool test_AxB_dot3_dense_factory(mxm_problem_spec &problem_spec) { - - std::cout << "phase dense test ======================" << std::endl; - - GpuTimer kernTimer; - - cudaStream_t strm = (cudaStream_t)rmm_wrap_get_main_stream(); - - bool result = false; - - int64_t N = problem_spec.getN(); - - auto mymxm = problem_spec.get_mxm_factory(); - dense_phase1launchFactory p1lF(mymxm); - - GrB_Matrix C = problem_spec.getC(); - GrB_Matrix M = problem_spec.getM(); - GrB_Matrix A = problem_spec.getA(); - GrB_Matrix B = problem_spec.getB(); - - problem_spec.set_sparsity_control( A, GxB_FULL, GxB_BY_ROW); - problem_spec.set_sparsity_control( B, GxB_FULL, GxB_BY_ROW); - - const int64_t mnz = GB_nnz (M) ; - const int64_t cnz = GB_nnz (C) ; - const int64_t cvlen = C->vlen ; - const int64_t cvdim = C->vdim ; - const int64_t cnvec = C->nvec ; - - bool C_iso = false ; - GrB_Type ctype = problem_spec.getBinaryOp()->ztype ; - - std::cout << "Running phase1 kernel" << std::endl; - kernTimer.Start(); - p1lF.jitGridBlockLaunch(C, M, A, B, strm); - CHECK_CUDA(cudaStreamSynchronize(strm)); - kernTimer.Stop(); - std::cout<<"Dense internal phase1 kernel done "<(); - GRB_TRY (GrB_Matrix_new (&C_expected, type, N, N)) ; - - // ensure the GPU is not used - GRB_TRY (GxB_Global_Option_set (GxB_GLOBAL_GPU_ID, -1)) ; - GB_Global_hack_set (2, 2) ; // hack(2) = 2: never use the GPU - - // Use GrB_DESC_S for structural because dot3 mask will never be complemented - // The order of B and A is swapped to account for CSR vs CSC assumption - GRB_TRY (GrB_mxm(C_expected, problem_spec.getM(), NULL, problem_spec.get_semiring(), problem_spec.getB(), - problem_spec.getA(), problem_spec.get_mask_struct() ? GrB_DESC_ST1 : GrB_DESC_T1)); - - GRB_TRY(GrB_Matrix_wait(C_expected, GrB_MATERIALIZE)); - std::cout << "nnz: " << GB_nnz (C_expected) << std::endl ; - - // compare - double tol = 0 ; - GrB_Index nvals1 = 0, nvals2 = 0 ; - GRB_TRY (GrB_Matrix_nvals (&nvals1, C)) ; - GRB_TRY (GrB_Matrix_nvals (&nvals2, C_expected)) ; - if (nvals1 != nvals2) { printf ("Wrong number of nonzeroes found, test fail!!! nvals1=%lu, nvals2=%lu\n", nvals1, nvals2) ; ADD_FAILURE( ) ; } - GrB_Index nrows, ncols ; - GrB_Matrix_nrows (&nrows, C_expected) ; - GrB_Matrix_ncols (&ncols, C_expected) ; - - GrB_Matrix T; - - GRB_TRY (GrB_Matrix_new (&T, GrB_BOOL, nrows, ncols)) ; - GrB_BinaryOp op = NULL; - GrB_UnaryOp op_abs = NULL ; - if (type == GrB_BOOL ) op = GrB_EQ_BOOL ; - else if (type == GrB_INT8 ) op = GrB_EQ_INT8 ; - else if (type == GrB_INT16 ) op = GrB_EQ_INT16 ; - else if (type == GrB_INT32 ) op = GrB_EQ_INT32 ; - else if (type == GrB_INT64 ) op = GrB_EQ_INT64 ; - else if (type == GrB_UINT8 ) op = GrB_EQ_UINT8 ; - else if (type == GrB_UINT16) op = GrB_EQ_UINT16 ; - else if (type == GrB_UINT32) op = GrB_EQ_UINT32 ; - else if (type == GrB_UINT64) op = GrB_EQ_UINT64 ; - else if (type == GrB_FP32 ) - { tol = 5e-6; - op = (tol == 0)? GrB_EQ_FP32 : GrB_MINUS_FP32 ; - op_abs = GrB_ABS_FP32 ; - } - else if (type == GrB_FP64 ) - { tol = 1e12; - op = (tol == 0)? GrB_EQ_FP64 : GrB_MINUS_FP64 ; - op_abs = GrB_ABS_FP64 ; - } - else if (type == GxB_FC32 ) - { tol = 2e-6; - op = (tol == 0)? GxB_EQ_FC32 : GxB_MINUS_FC32 ; - op_abs = GxB_ABS_FC32 ; - } - else if (type == GxB_FC64 ) - { tol = 2e-12; - op = (tol == 0)? GxB_EQ_FC64 : GxB_MINUS_FC64 ; - op_abs = GxB_ABS_FC64 ; - } - - - - if (tol == 0) - { - // check for perfect equality - GRB_TRY (GrB_Matrix_eWiseMult_BinaryOp (T, NULL, NULL, op, C, C_expected, - NULL)) ; - GrB_Index nvals3 = 1 ; - GRB_TRY (GrB_Matrix_nvals (&nvals3, T)) ; -// if (nvals1 != nvals3) { printf (" difference matrix wrong size, test fail!! nvals1=%ld nvals3=%ld\n", nvals1, nvals3) ; ADD_FAILURE( ) ; } - bool is_same = false ; - GRB_TRY (GrB_Matrix_reduce_BOOL (&is_same, NULL, GrB_LAND_MONOID_BOOL, - T, NULL)) ; - if (!is_same) { printf (" results don't match, test fail!!\n") ; ADD_FAILURE ( ) ; } - GRB_TRY (GrB_Matrix_free (&T)) ; - } - else - { - // TODO: check with roundoff - // Diff = C - C_expected - GrB_Matrix Diff ; - GRB_TRY (GrB_Matrix_new (&Diff, GrB_FP64, nrows, ncols)) ; - GRB_TRY (GrB_Matrix_apply (Diff, NULL, NULL, GrB_AINV_FP64, C_expected, NULL)) ; - GRB_TRY (GrB_Matrix_eWiseAdd_BinaryOp (Diff, NULL, NULL, GrB_PLUS_FP64, - C, Diff, NULL)) ; - GRB_TRY( GrB_Matrix_apply( Diff, NULL, NULL, op_abs, Diff, NULL) ); - GrB_Index nvals3 = 1 ; - GRB_TRY (GrB_Matrix_nvals (&nvals3, Diff)) ; - if (nvals1 != nvals3) { printf ("fp difference matrix wrong size, test fail!!\n") ; ADD_FAILURE( ) ; } - double is_same = false ; - GRB_TRY (GrB_Matrix_reduce_FP64 (&is_same, NULL, GrB_PLUS_MONOID_FP64, - Diff, NULL)) ; - printf("difference = %12.6g, rel_l1_err=%12.6g\n", is_same, is_same/nvals3 ); - EXPECT_LT( is_same/nvals3, tol); - GRB_TRY (GrB_Matrix_free (&Diff)) ; - - } - - // re-enable the GPU - GRB_TRY (GxB_Global_Option_set (GxB_GLOBAL_GPU_ID, 0)) ; - GB_Global_hack_set (2, 1) ; // hack(2) = 1: always use the GPU - - - GRB_TRY(GrB_Matrix_free(&C_expected)); - - std::cout << "phase 3 dense test complete ======================" << std::endl; - return result; -} - -template < - typename T_C, typename T_M, typename T_A,typename T_B, - typename T_X, typename T_Y, typename T_Z> -bool test_AxB_dot3_sparse_dense_factory(mxm_problem_spec &problem_spec) { - - std::cout << "sparse dense test ======================" << std::endl; - - GpuTimer kernTimer; - - cudaStream_t strm; - CHECK_CUDA(cudaStreamCreate(&strm)); - - bool result = false; - - int64_t N = problem_spec.getN(); - - GrB_Matrix C = problem_spec.getC(); - GrB_Matrix M = problem_spec.getM(); - GrB_Matrix A = problem_spec.getA(); - GrB_Matrix B = problem_spec.getB(); - - problem_spec.set_sparsity_control( A, GxB_SPARSE, GxB_BY_ROW); - - // TODO: Need to make sure the format itself is actually dense. - problem_spec.set_sparsity_control( B, GxB_FULL, GxB_BY_ROW); - - auto mymxm = problem_spec.get_mxm_factory(); - dense_phase1launchFactory p1lF(mymxm); - - const int64_t mnz = GB_nnz (M) ; - const int64_t cnz = GB_nnz (C) ; - const int64_t cvlen = C->vlen ; - const int64_t cvdim = C->vdim ; - const int64_t cnvec = C->nvec ; - - bool C_iso = false ; - GrB_Type ctype = problem_spec.getBinaryOp()->ztype ; - - std::cout << "Running dense_phase1 kernel" << std::endl; - kernTimer.Start(); - p1lF.jitGridBlockLaunch(C, M, A, B, strm); - CHECK_CUDA(cudaStreamSynchronize(strm)); - kernTimer.Stop(); - std::cout<<"Dense internal phase1 kernel done "<(); - GRB_TRY (GrB_Matrix_new (&C_expected, type, N, N)) ; - - // ensure the GPU is not used - GRB_TRY (GxB_Global_Option_set (GxB_GLOBAL_GPU_ID, -1)) ; - GB_Global_hack_set (2, 2) ; // hack(2) = 2: never use the GPU - - // Use GrB_DESC_S for structural because dot3 mask will never be complemented - // The order of B and A is swapped to account for CSR vs CSC assumption - GRB_TRY (GrB_mxm(C_expected, problem_spec.getM(), NULL, problem_spec.get_semiring(), problem_spec.getB(), - problem_spec.getA(), problem_spec.get_mask_struct() ? GrB_DESC_ST1 : GrB_DESC_T1)); - - GRB_TRY(GrB_Matrix_wait(C_expected, GrB_MATERIALIZE)); - std::cout << "nnz: " << GB_nnz (C_expected) << std::endl ; - - // compare - double tol = 0 ; - GrB_Index nvals1 = 0, nvals2 = 0 ; - GRB_TRY (GrB_Matrix_nvals (&nvals1, C)) ; - GRB_TRY (GrB_Matrix_nvals (&nvals2, C_expected)) ; - if (nvals1 != nvals2) { printf ("Wrong number of nonzeroes found, test fail!!! nvals1=%lu, nvals2=%lu\n", nvals1, nvals2) ; ADD_FAILURE( ) ; } - GrB_Index nrows, ncols ; - GrB_Matrix_nrows (&nrows, C_expected) ; - GrB_Matrix_ncols (&ncols, C_expected) ; - - GrB_Matrix T; - - GRB_TRY (GrB_Matrix_new (&T, GrB_BOOL, nrows, ncols)) ; - GrB_BinaryOp op = NULL; - GrB_UnaryOp op_abs = NULL ; - if (type == GrB_BOOL ) op = GrB_EQ_BOOL ; - else if (type == GrB_INT8 ) op = GrB_EQ_INT8 ; - else if (type == GrB_INT16 ) op = GrB_EQ_INT16 ; - else if (type == GrB_INT32 ) op = GrB_EQ_INT32 ; - else if (type == GrB_INT64 ) op = GrB_EQ_INT64 ; - else if (type == GrB_UINT8 ) op = GrB_EQ_UINT8 ; - else if (type == GrB_UINT16) op = GrB_EQ_UINT16 ; - else if (type == GrB_UINT32) op = GrB_EQ_UINT32 ; - else if (type == GrB_UINT64) op = GrB_EQ_UINT64 ; - else if (type == GrB_FP32 ) - { tol = 5e-6; - op = (tol == 0)? GrB_EQ_FP32 : GrB_MINUS_FP32 ; - op_abs = GrB_ABS_FP32 ; - } - else if (type == GrB_FP64 ) - { tol = 1e12; - op = (tol == 0)? GrB_EQ_FP64 : GrB_MINUS_FP64 ; - op_abs = GrB_ABS_FP64 ; - } - else if (type == GxB_FC32 ) - { tol = 2e-6; - op = (tol == 0)? GxB_EQ_FC32 : GxB_MINUS_FC32 ; - op_abs = GxB_ABS_FC32 ; - } - else if (type == GxB_FC64 ) - { tol = 2e-12; - op = (tol == 0)? GxB_EQ_FC64 : GxB_MINUS_FC64 ; - op_abs = GxB_ABS_FC64 ; - } - - - - if (tol == 0) - { - // check for perfect equality - GRB_TRY (GrB_Matrix_eWiseMult_BinaryOp (T, NULL, NULL, op, C, C_expected, - NULL)) ; - GrB_Index nvals3 = 1 ; - GRB_TRY (GrB_Matrix_nvals (&nvals3, T)) ; -// if (nvals1 != nvals3) { printf (" difference matrix wrong size, test fail!! nvals1=%ld nvals3=%ld\n", nvals1, nvals3) ; ADD_FAILURE( ) ; } - bool is_same = false ; - GRB_TRY (GrB_Matrix_reduce_BOOL (&is_same, NULL, GrB_LAND_MONOID_BOOL, - T, NULL)) ; - if (!is_same) { printf (" results don't match, test fail!!\n") ; ADD_FAILURE ( ) ; } - GRB_TRY (GrB_Matrix_free (&T)) ; - } - else - { - // TODO: check with roundoff - // Diff = C - C_expected - GrB_Matrix Diff ; - GRB_TRY (GrB_Matrix_new (&Diff, GrB_FP64, nrows, ncols)) ; - GRB_TRY (GrB_Matrix_apply (Diff, NULL, NULL, GrB_AINV_FP64, C_expected, NULL)) ; - GRB_TRY (GrB_Matrix_eWiseAdd_BinaryOp (Diff, NULL, NULL, GrB_PLUS_FP64, - C, Diff, NULL)) ; - GRB_TRY( GrB_Matrix_apply( Diff, NULL, NULL, op_abs, Diff, NULL) ); - GrB_Index nvals3 = 1 ; - GRB_TRY (GrB_Matrix_nvals (&nvals3, Diff)) ; - if (nvals1 != nvals3) { printf ("fp difference matrix wrong size, test fail!!\n") ; ADD_FAILURE( ) ; } - double is_same = false ; - GRB_TRY (GrB_Matrix_reduce_FP64 (&is_same, NULL, GrB_PLUS_MONOID_FP64, - Diff, NULL)) ; - printf("difference = %12.6g, rel_l1_err=%12.6g\n", is_same, is_same/nvals3 ); - EXPECT_LT( is_same/nvals3, tol); - GRB_TRY (GrB_Matrix_free (&Diff)) ; - - } - - // re-enable the GPU - GRB_TRY (GxB_Global_Option_set (GxB_GLOBAL_GPU_ID, 0)) ; - GB_Global_hack_set (2, 1) ; // hack(2) = 1: always use the GPU - - - GRB_TRY(GrB_Matrix_free(&C_expected)); - CHECK_CUDA(cudaStreamDestroy(strm)); - - std::cout << "phase 3 dense test complete ======================" << std::endl; - return result; -} - - -template -bool test_reduce_factory(mxm_problem_spec &problem_spec) { - - std::cout << "reduce test ======================" << std::endl; - - // TODO: This test doesn't really fit the `mxm` category - GrB_Monoid monoid = problem_spec.getMonoid(); - int64_t N = problem_spec.getN(); - - GrB_Matrix A; - - // TODO: Using C here so that the reduced type matches - GrB_Matrix_dup(&A, problem_spec.getC()); - GrB_Type type = cuda::jit::to_grb_type(); - - A->i[0] = GB_FLIP(A->i[0]); // FIXME - A->i[1] = GB_FLIP(A->i[1]); // FIXME - A->nzombies = 2; // FIXME: use an opaque method to insert zombies into A - - //GRB_TRY (GxB_Matrix_fprint (A, "A", GxB_SHORT_VERBOSE, stdout)) ; - - GB_cuda_reduce_factory myreducefactory; - myreducefactory.reduce_factory(monoid, A); - - T_C actual; - GB_cuda_reduce(myreducefactory, A, &actual, monoid ); - - GRB_TRY (GxB_Global_Option_set (GxB_GLOBAL_GPU_ID, -1)) ; - GB_Global_hack_set (2, 2) ; // hack(2) = 2: never use the GPU - - T_C expected; - GRB_TRY(cuda::jit::matrix_reduce(&expected, A, monoid)); - - GRB_TRY (GxB_Global_Option_set (GxB_GLOBAL_GPU_ID, 0)) ; - GB_Global_hack_set (2, 1) ; // hack(2) = 1: always use the GPU - - double tol = 0; - GrB_BinaryOp op = NULL; - GrB_UnaryOp op_abs = NULL ; - - if (type == GrB_BOOL ) op = GrB_EQ_BOOL ; - else if (type == GrB_INT8 ) op = GrB_EQ_INT8 ; - else if (type == GrB_INT16 ) op = GrB_EQ_INT16 ; - else if (type == GrB_INT32 ) op = GrB_EQ_INT32 ; - else if (type == GrB_INT64 ) op = GrB_EQ_INT64 ; - else if (type == GrB_UINT8 ) op = GrB_EQ_UINT8 ; - else if (type == GrB_UINT16) op = GrB_EQ_UINT16 ; - else if (type == GrB_UINT32) op = GrB_EQ_UINT32 ; - else if (type == GrB_UINT64) op = GrB_EQ_UINT64 ; - else if (type == GrB_FP32 ) - { tol = 1e-6; - op = (tol == 0)? GrB_EQ_FP32 : GrB_MINUS_FP32 ; - op_abs = GrB_ABS_FP32 ; - } - else if (type == GrB_FP64 ) - { tol = 1e12; - op = (tol == 0)? GrB_EQ_FP64 : GrB_MINUS_FP64 ; - op_abs = GrB_ABS_FP64 ; - } - else if (type == GxB_FC32 ) - { tol = 2e-6; - op = (tol == 0)? GxB_EQ_FC32 : GxB_MINUS_FC32 ; - op_abs = GxB_ABS_FC32 ; - } - else if (type == GxB_FC64 ) - { tol = 2e-12; - op = (tol == 0)? GxB_EQ_FC64 : GxB_MINUS_FC64 ; - op_abs = GxB_ABS_FC64 ; - } - - if(tol == 0) { - EXPECT_EQ( actual , expected); - //std::cout << "results do not match: reduced=" << expected << ", actual=" << actual << std::endl; - //exit(1); - } else if ( (tol > 0) && ( ( type ==GrB_FP32) || ( type ==GxB_FC32) - || ( type ==GrB_FP64) || ( type ==GxB_FC64) ) ){ - EXPECT_LT( abs((double)actual - (double)expected)/(abs((double)expected)+1.e-12), tol) ; - } - - std::cout<< expected<< " " << actual<< "reduce test complete ======================" << std::endl; - GRB_TRY(GrB_Matrix_free(&A)); - - return expected == actual; -} - diff --git a/GraphBLAS/CUDA/test/problem_spec.hpp b/GraphBLAS/CUDA/test/problem_spec.hpp deleted file mode 100644 index c1997771ab..0000000000 --- a/GraphBLAS/CUDA/test/problem_spec.hpp +++ /dev/null @@ -1,129 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/test/problem_spec.hpp -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -#pragma once - -#include -#include -#include -#include -#include -#include "GpuTimer.h" -#include "GB_cuda_buckets.h" -#include "../../rmm_wrap/rmm_wrap.h" -#include -#include "test_data.hpp" -extern "C" { -#include "GB.h" -} - -#include "../GB_cuda_common_jitFactory.hpp" -#include "../GB_cuda_mxm_dot3_jitFactory.hpp" -#include "../GB_cuda_reduce_jitFactory.hpp" -#include "dataFactory.hpp" - -template -class mxm_problem_spec { - -public: - mxm_problem_spec(GrB_Monoid monoid_, GrB_BinaryOp binop_, int64_t N_, int64_t Annz_, int64_t Bnnz_, int64_t Cnnz_, - int sparsity_control_A_ = GxB_SPARSE, int sparsity_control_B_ = GxB_SPARSE) : - mysemiring(), binop(binop_), monoid(monoid_), N(N_), - G(N_, N_), Annz(Annz_), Bnnz(Bnnz_), Cnnz(Cnnz_), mask_struct(true), flipxy(false), mask_comp(false) { - - // FIXME: This should be getting set automatically somehow. - float Cnzpercent = (float) Cnnz_/(N_*N_); - - // TODO: Allocate and fill arrays for buckets and nano buckets - G.init_A(Annz_, sparsity_control_A_, GxB_BY_ROW); - G.init_B(Bnnz_, sparsity_control_B_, GxB_BY_ROW); - G.init_C(Cnzpercent); -// G.fill_buckets( TB ); // all elements go to testbucket= TB - - /************************ - * Create mxm factory - */ - auto grb_info = GrB_Semiring_new(&mysemiring, monoid_, binop_); - GRB_TRY (grb_info) ; - GrB_Matrix A = G.getA(); - GrB_Matrix B = G.getB(); - //GRB_TRY (GxB_Matrix_fprint (A, "A", GxB_SHORT_VERBOSE, stdout)) ; - //GRB_TRY (GxB_Matrix_fprint (B, "B", GxB_SHORT_VERBOSE, stdout)) ; - } - - ~mxm_problem_spec() { - - std::cout << "Calling G.del()" << std::endl; - G.del(); - - } - - GrB_Matrix getC(){ return G.getC(); } - GrB_Matrix getM(){ return G.getM(); } - GrB_Matrix getA(){ return G.getA(); } - GrB_Matrix getB(){ return G.getB(); } - - GrB_Monoid getMonoid() { return monoid; } - GrB_BinaryOp getBinaryOp() { return binop; } - - int64_t getN() { return N; } - int64_t getAnnz() { return Annz; } - int64_t getBnnz() { return Bnnz; } - int64_t getCnnz() { return Cnnz; } - - auto &getG() { return G; } - - GB_cuda_mxm_factory &get_mxm_factory() { - - // Lazily create the mxm factory - if(!mymxmfactory.has_value()) { - - mymxmfactory.emplace(GB_cuda_mxm_factory()); - GrB_Matrix C = G.getC(); - GrB_Matrix M = G.getM(); - GrB_Matrix A = G.getA(); - GrB_Matrix B = G.getB(); - - bool C_iso = false ; - int C_sparsity = GB_sparsity (M) ; - GrB_Type ctype = binop->ztype ; - - (*mymxmfactory).mxm_factory ( - C_iso, C_sparsity, ctype, - M, mask_struct, mask_comp, - mysemiring, flipxy, - A, B) ; - } - return *mymxmfactory; - } - GrB_Semiring get_semiring() { return mysemiring; } - - void set_sparsity_control(GrB_Matrix mat, int gxb_sparsity_control, int gxb_format) { - GRB_TRY (GxB_Matrix_Option_set (mat, GxB_SPARSITY_CONTROL, gxb_sparsity_control)) ; - GRB_TRY (GxB_Matrix_Option_set(mat, GxB_FORMAT, gxb_format)); - GRB_TRY (GrB_Matrix_wait (mat, GrB_MATERIALIZE)) ; - } - - bool get_mask_struct() { return mask_struct; } - -private: - - bool mask_struct{false}; - bool flipxy{false}; - bool mask_comp{false}; - - int64_t Annz; - int64_t Bnnz; - int64_t Cnnz; - int64_t N; - GrB_BinaryOp binop; - GrB_Monoid monoid; - GrB_Semiring mysemiring; - std::optional mymxmfactory; - SpGEMM_problem_generator G; -}; diff --git a/GraphBLAS/CUDA/test/run_tests.cpp b/GraphBLAS/CUDA/test/run_tests.cpp deleted file mode 100644 index 2618b9f688..0000000000 --- a/GraphBLAS/CUDA/test/run_tests.cpp +++ /dev/null @@ -1,45 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/test/run_tests.cpp -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -#include - -#include "GraphBLAS_cuda.h" -#include "rmm_wrap.h" - -#include "test_utility.hpp" - -int main(int argc, char **argv) { - - size_t init_size, max_size, stream_pool_size; - init_size = 256*(1ULL<<10); - max_size = 256*(1ULL<<20); - stream_pool_size = 1; - - printf(" pool init size %ld, max size %ld\n", init_size, max_size); - rmm_wrap_initialize_all_same( rmm_wrap_managed, init_size, max_size, stream_pool_size); - - GRB_TRY (GxB_init (GxB_NONBLOCKING_GPU, - rmm_wrap_malloc, rmm_wrap_calloc, rmm_wrap_realloc, rmm_wrap_free)) ; - - std::cout << "Done initializing graphblas and rmm" << std::endl; - - GRB_TRY (GxB_Global_Option_set (GxB_GLOBAL_GPU_ID, 0)) ; - - size_t buff_size = (1ULL<<13)+152; - void *p = (void *)rmm_wrap_allocate( &buff_size ); - - ::testing::InitGoogleTest(&argc, argv); - auto r = RUN_ALL_TESTS(); - - rmm_wrap_deallocate( p, buff_size); - GRB_TRY (GrB_finalize()); - rmm_wrap_finalize(); - std::cout << "Tests complete" << std::endl; - - return r; -} diff --git a/GraphBLAS/CUDA/test/testGen_cmake.py b/GraphBLAS/CUDA/test/testGen_cmake.py deleted file mode 100644 index 52857f0bd0..0000000000 --- a/GraphBLAS/CUDA/test/testGen_cmake.py +++ /dev/null @@ -1,176 +0,0 @@ -#------------------------------------------------------------------------------- -# GraphBLAS/CUDA/test/testGen_cmake.py -#------------------------------------------------------------------------------- - -# SPDX-License-Identifier: Apache-2.0 - -#------------------------------------------------------------------------------- - -# Generate test instances from a large tensor product set of options - -GB_TYPE_PREFIX = "GrB" - -SUPPORTED_TYPES = { - "int32_t": "INT32", - "uint32_t": "UINT32", - "int64_t": "INT64", - "uint64_t": "UINT64", - "bool": "BOOL", - "float": "FP32", - "double": "FP64" -} - -DOT3_BUCKETS = [1, 2] # NBUCKETS, hard-coded - -DataShapes ={ - "nanoxnano": {'N':32, 'Anz':64, 'Bnz':56, 'Cnz': 256}, - "tinyxtiny": {'N':128, 'Anz':1256, 'Bnz':1028, 'Cnz': 1640}, - "smallxsmall": {'N':1024, 'Anz': 65_536, 'Bnz':65_536, 'Cnz': 10000}, - "ti_denxti_den": {'N':32, 'Anz':1024, 'Bnz':1024, 'Cnz': 1024}, - "ti_spaxti_den": {'N':32, 'Anz':256, 'Bnz':1024, 'Cnz': 1024}, - "medxmed": {'N':4096, 'Anz': 2**20, 'Bnz':2**20}, - "largexlarge": {'N':2**16, 'Anz': 64*2**20, 'Bnz':64*2**20} -} - -FORMATS = { "sparse": ["phase1", "phase2", "mxm_sparse"], - "dense": ["dense_phase1", "mxm_dense"], - "sparse_dense": ["dense_phase1", "mxm_sparse_dense"], - "reduce": ["reduce"]} - -FORMAT_INPUTS = { - "sparse": [("GxB_SPARSE", "GxB_SPARSE")], - "dense": [("GxB_FULL", "GxB_FULL"), ("GxB_BITMAP", "GxB_BITMAP")], - "sparse_dense": [("GxB_SPARSE", "GxB_FULL")], - "reduce": [("GxB_SPARSE", "GxB_SPARSE")] -} - -FORMAT_DATASETS = { - "sparse": ["nanoxnano", "tinyxtiny", "smallxsmall"], - "dense": ["ti_denxti_den"], - "sparse_dense": ["ti_spaxti_den"], - "reduce": ["nanoxnano", "smallxsmall", "ti_denxti_den", "ti_spaxti_den"] -} - -def std_type_to_gb_type(t): - return SUPPORTED_TYPES[t] - -def build_gb_monioid(t, m): - # Example: GrB_PLUS_MONIOD_UINT64 - gb_type = std_type_to_gb_type(t) - return f"{GB_TYPE_PREFIX}_{m}_MONOID_{gb_type}" - -def build_gb_binop(t, b): - # Example: GrB_TIMES_UINT64 - gb_type = std_type_to_gb_type(t) - return f"{GB_TYPE_PREFIX}_{b}_{gb_type}" - - - - -def buildTest(ts="TestsuiteName", ds="tiny-tiny", df=("GxB_SPARSE", "GxB_SPARSE"), - SUM="PLUS", PRODUCT="TIMES", - typeC="int32_t",typeM="int32_t", - typeA="int32_t",typeB="int32_t", - type_x="int32_t", type_y="int32_t",type_z="int32_t"): - - # build string interpolation from pieces - format_A, format_B = df - - Test_name = f"{ds}{SUM}_{PRODUCT}__{format_A}_{format_B}__C{typeC}M{typeM}A{typeA}B{typeB}X{type_x}Y{type_y}Z{type_z}" - Test_suite = f"{ts}" - - N = DataShapes[ds]['N'] - Anz = DataShapes[ds]['Anz'] - Bnz = DataShapes[ds]['Bnz'] - Cnz = DataShapes[ds]['Cnz'] - - gb_monoid = build_gb_monioid(typeC, SUM) - gb_binop = build_gb_binop(typeC, PRODUCT) - - TEST_HEAD = f""" - TEST( {Test_suite}, {Test_name}) {{ - - /************************** - * Create reference and input data - */ - GrB_Monoid monoid = {gb_monoid}; - GrB_BinaryOp binop = {gb_binop}; - - mxm_problem_spec<{typeC}, {typeM}, {typeA}, {typeB}> problem_spec(monoid, binop, {N}, {Anz}, {Bnz}, {Cnz}, - {format_A}, {format_B}); - """ - phase1_body= f""" test_AxB_phase1_factory< {typeC}, {typeM}, {typeA}, {typeB}>(problem_spec);""" - phase2_body= f""" test_AxB_phase2_factory< {typeC}, {typeM}, {typeA}, {typeB} >(problem_spec);""" - dense_phase1_body = f""" test_AxB_dense_phase1_factory<{typeC}, {typeM}, {typeA}, {typeB}>(problem_spec);""" - mxm_sparse_body = f""" test_AxB_dot3_sparse_factory< {typeC},{typeM},{typeA},{typeB},{type_x},{type_y},{type_z} > (problem_spec);\n""" - mxm_dense_body = f""" test_AxB_dot3_dense_factory< {typeC},{typeM},{typeA},{typeB},{type_x},{type_y},{type_z} > (problem_spec);\n""" - mxm_sparse_dense_body = f""" test_AxB_dot3_sparse_dense_factory< {typeC},{typeM},{typeA},{typeB},{type_x},{type_y},{type_z} > (problem_spec);\n""" - reduce_body = f""" test_reduce_factory<{typeC}, {typeM}, {typeA}, {typeB}>(problem_spec);""" - phasedict = { "phase1": phase1_body, - "phase2": phase2_body, - "mxm_sparse": mxm_sparse_body, - "mxm_dense": mxm_dense_body, - "mxm_sparse_dense": mxm_sparse_dense_body, - "reduce": reduce_body, - "dense_phase1": dense_phase1_body } - - return TEST_HEAD, phasedict - -def load_types(argv): - test_suite_name = argv[2] - Monoids = argv[3].split(";") - Binops = argv[4].split(";") - Semirings = argv[5] - DataTypes = argv[6].split(";") - - # Hard-coding data shapes for now - Kernels= argv[7] - - return argv[1], test_suite_name, Monoids, Binops, Semirings, DataTypes, DataShapes, Kernels - -def write_test_instances_header(test_suite_name, mat_format, tests, Monoids, Binops, Semirings, DataTypes, DataShapes, Kernels): - outfile = f'{test_suite_name}_{Semirings}_{mat_format}_test_instances.hpp' - with open(outfile, 'w') as fp: - fp.write("#pragma once\n#include \"problem_spec.hpp\"\n"); - m, b = Semirings.split("_") - Test_suite = f'{test_suite_name}_tests_{mat_format}_{m}_{b}' - for dtC in DataTypes: - dtX = dtC - dtY = dtC - dtZ = dtC - for dtM in ["bool", "int32_t", "int64_t", "float", "double"]: - for dtA in DataTypes: - for dtB in DataTypes: - for ds in FORMAT_DATASETS[mat_format]: - for df in FORMAT_INPUTS[mat_format]: - TEST_HEAD, TEST_BODY = buildTest( Test_suite, ds, df, m, b, - dtC, dtM, dtA, dtB, dtX, dtY, dtZ) - fp.write( TEST_HEAD) - for test in tests: - fp.write( TEST_BODY[test] ) - fp.write( "}\n") - -def write_cuda_test(source_dir, test_suite_name, mat_format, semiring, kernel): - import shutil - - shutil.copy(f"{source_dir}/test/cuda_tests_template.cpp", f"{test_suite_name}_{semiring}_{mat_format}_cuda_tests.cpp") - - with open(f"{test_suite_name}_{semiring}_{mat_format}_cuda_tests.cpp", "a") as file_object: - # Keeping this as a separate file for now to allow for further nesting - # of test instances for each test_suite_name - file_object.write(f"\n#include \"{test_suite_name}_{semiring}_{mat_format}_test_instances.hpp\"") - -if __name__ == "__main__": - import sys - - if(len(sys.argv) != 8): - raise ValueError("Expected 7 arguments but only got %s" % len(sys.argv)) - - """ - First load values - """ - source_dir, test_suite_name, Monoids, Binops, Semirings, DataTypes, DataShapes, Kernels = load_types(sys.argv) - - for mat_format, tests in FORMATS.items(): - write_test_instances_header(test_suite_name, mat_format, tests, Monoids, Binops, Semirings, DataTypes, DataShapes, DOT3_BUCKETS) - write_cuda_test(source_dir, test_suite_name, mat_format, Semirings, Kernels) diff --git a/GraphBLAS/CUDA/test/test_data.hpp b/GraphBLAS/CUDA/test/test_data.hpp deleted file mode 100644 index d6cca87d0e..0000000000 --- a/GraphBLAS/CUDA/test/test_data.hpp +++ /dev/null @@ -1,113 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/test/test_data.hpp -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -#include -#include - -#pragma once - -template -class TestData { - -public: - TestData( std::vector A_indptr_, - std::vector A_indices_, - std::vector A_data_, - - std::vector B_indptr_, - std::vector B_indices_, - std::vector B_data_, - - - std::vector C_indptr_, - std::vector C_indices_, - std::vector C_data_, - - std::vector M_indptr_, - std::vector M_indices_, - std::vector M_data_): - A_indptr(A_indptr_), A_indices(A_indices_), A_data(A_data_), - B_indptr(B_indptr_), B_indices(B_indices_), B_data(B_data_), - C_indptr(C_indptr_), C_indices(C_indices_), C_data(C_data_), - M_indptr(M_indptr_), M_indices(M_indices_), M_data(M_data_){} - - - std::vector A_indptr; - std::vector A_indices; - std::vector A_data; - - std::vector B_indptr; - std::vector B_indices; - std::vector B_data; - - - std::vector C_indptr; - std::vector C_indices; - std::vector C_data; - - std::vector M_indptr; - std::vector M_indices; - std::vector M_data; - -}; - -template -std::unique_ptr> make_karate_tricount() { - - std::vector A_indptr = { 0,16,24,32,35,37,40,41,41,44,45,45,45,45,46,48,50,50,50,52,53,55,55,57, - 62,65,66,68,69,71,73,75,77,78,78}; - std::vector A_indices = { 1, 2, 3, 4, 5, 6, 7, 8,10,11,12,13,17,19,21,31, 2, 3, 7,13,17,19,21,30, - 3, 7, 8, 9,13,27,28,32, 7,12,13, 6,10, 6,10,16,16,30,32,33,33,33,32,33, - 32,33,32,33,33,32,33,32,33,25,27,29,32,33,25,27,31,31,29,33,33,31,33,32, - 33,32,33,32,33,33}; - std::vector A_data = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1}; - - std::vector B_indptr = { 0, 0, 1, 3, 6, 7, 8,11,15,17,18,21,22,24,28,28,28,30,32,32,34,34,36,36, - 36,36,38,38,41,42,44,46,50,61,78}; - std::vector B_indices = { 0, 0, 1, 0, 1, 2, 0, 0, 0, 4, 5, 0, 1, 2, 3, 0, 2, 2, 0, 4, 5, 0, 0, 3, - 0, 1, 2, 3, 5, 6, 0, 1, 0, 1, 0, 1,23,24, 2,23,24, 2,23,26, 1, 8, 0,24, - 25,28, 2, 8,14,15,18,20,22,23,29,30,31, 8, 9,13,14,15,18,19,20,22,23,26, - 27,28,29,30,31,32}; - std::vector B_data = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1}; - - std::vector M_indptr = { 0, 16, 25, 35, 41, 44, 48, 52, 56, 61, 63, 66, 67, 69, 74, 76, 78, 80, - 82, 84, 87, 89, 91, 93, 98,101,104,106,110,113,117,121,127,139,156}; - std::vector M_indices = { 1, 2, 3, 4, 5, 6, 7, 8,10,11,12,13,17,19,21,31, 0, 2, 3, 7,13,17,19,21, - 30, 0, 1, 3, 7, 8, 9,13,27,28,32, 0, 1, 2, 7,12,13, 0, 6,10, 0, 6,10,16, - 0, 4, 5,16, 0, 1, 2, 3, 0, 2,30,32,33, 2,33, 0, 4, 5, 0, 0, 3, 0, 1, 2, - 3,33,32,33,32,33, 5, 6, 0, 1,32,33, 0, 1,33,32,33, 0, 1,32,33,25,27,29, - 32,33,25,27,31,23,24,31,29,33, 2,23,24,33, 2,31,33,23,26,32,33, 1, 8,32, - 33, 0,24,25,28,32,33, 2, 8,14,15,18,20,22,23,29,30,31,33, 8, 9,13,14,15, - 18,19,20,22,23,26,27,28,29,30,31,32}; - std::vector M_data = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1}; - - std::vector C_indptr = { 0, 0, 7,12,17,19,21,24,27,29,29,31,31,32,35,35,35,36,37,37,38,38,39,39, - 39,39,40,40,41,41,43,45,47,51,56}; - std::vector C_indices = { 2, 3, 7,13,17,19,21, 1, 3, 7, 8,13, 1, 2, 7,12,13, 6,10, 6,10, 4, 5,16, - 1, 2, 3, 2,32, 4, 5, 3, 1, 2, 3, 6, 1, 1, 1,31,33,32,33,32,33,25,33, 8, - 29,30,33,27,29,30,31,32}; - std::vector C_data = { 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 2, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 3, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, - 1, 1,10, 1, 2, 1, 1,10}; - - TestData karate_tricount(A_indptr, A_indices, A_data, - B_indptr, B_indices, B_data, - C_indptr, C_indices, C_data, - M_indptr, M_indices, M_data); - - return std::make_unique>(karate_tricount); -} - diff --git a/GraphBLAS/CUDA/test/test_jitify.cpp b/GraphBLAS/CUDA/test/test_jitify.cpp deleted file mode 100644 index 30aab0adc2..0000000000 --- a/GraphBLAS/CUDA/test/test_jitify.cpp +++ /dev/null @@ -1,51 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/test/test_jitify.cpp -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -#include "jitify.hpp" -#include "GB_cuda_jitify_launcher.h" - -int main(int argc, char **argv) { - -#if 0 - -BROKEN - - std::string named_program = "GB_jit_AxB_phase2"; - std::string kern_name = "AxB_phase2"; - - - jitify::experimental::Program& program = *std::get<1>(named_program); - auto instantiated_kernel = program.kernel(kern_name).instantiate({}); - - // hashable name is program name - // string to be jitted is the actual prgram - // - - dim3 grid(1); - dim3 block(1); - -// std::cout<< kernel_name<<" with types " <mat, cnz); - - -#endif - -} diff --git a/GraphBLAS/CUDA/test/test_utility.hpp b/GraphBLAS/CUDA/test/test_utility.hpp deleted file mode 100644 index 3eb6ba942e..0000000000 --- a/GraphBLAS/CUDA/test/test_utility.hpp +++ /dev/null @@ -1,22 +0,0 @@ -//------------------------------------------------------------------------------ -// GraphBLAS/CUDA/test/test_utility.hpp -//------------------------------------------------------------------------------ - -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - -#pragma once - -// try calling a GrB_method and check the result -#define GRB_TRY(GrB_method) \ -{ \ - GrB_Info GB_info_result = GrB_method ; \ - if (GB_info_result < GrB_SUCCESS) \ - { \ - printf ("test failure: file %s line %d status %d\n", \ - __FILE__, __LINE__, GB_info_result) ; \ - exit (EXIT_FAILURE) ; \ - } \ -} - diff --git a/GraphBLAS/CUDA/GB_cuda_cumsum.cu b/GraphBLAS/CUDA/unused/GB_cuda_cumsum.cu similarity index 98% rename from GraphBLAS/CUDA/GB_cuda_cumsum.cu rename to GraphBLAS/CUDA/unused/GB_cuda_cumsum.cu index da6b32f504..8ed9726afa 100644 --- a/GraphBLAS/CUDA/GB_cuda_cumsum.cu +++ b/GraphBLAS/CUDA/unused/GB_cuda_cumsum.cu @@ -18,7 +18,7 @@ // sum (count [0..j-1]). count [n] is implicitly zero on input. // On output, count [n] is the total sum. -#include "GB_cuda.h" +#include "GB_cuda.hpp" // #include #include diff --git a/GraphBLAS/CUDA/unused/GB_search_for_vector_device.cuh b/GraphBLAS/CUDA/unused/GB_search_for_vector_device.cuh new file mode 100644 index 0000000000..6384c1c840 --- /dev/null +++ b/GraphBLAS/CUDA/unused/GB_search_for_vector_device.cuh @@ -0,0 +1,69 @@ +//------------------------------------------------------------------------------ +// GB_search_for_vector_device +//------------------------------------------------------------------------------ + +static __device__ __inline__ int64_t GB_search_for_vector_device +( + const int64_t p, // search for vector k that contains p + const int64_t *restrict Ap, // vector pointers to search + int64_t kleft, // left-most k to search + int64_t anvec, // Ap is of size anvec+1 + int64_t avlen // A->vlen +) +{ + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + if (Ap == NULL) + { + // A is full or bitmap + ASSERT (p >= 0 && p < avlen * anvec) ; + return ((avlen == 0) ? 0 : (p / avlen)) ; + } + + // A is sparse or hypersparse + ASSERT (p >= 0 && p < Ap [anvec]) ; + + //-------------------------------------------------------------------------- + // search for k + //-------------------------------------------------------------------------- + + int64_t k = kleft ; + int64_t kright = anvec ; + bool found ; + GB_SPLIT_BINARY_SEARCH (p, Ap, k, kright, found) ; + + // FIXME: this is not needed if the search is approximate: + if (found) + { + // Ap [k] == p has been found, but if k is an empty vector, then the + // next vector will also contain the entry p. In that case, k needs to + // be incremented until finding the first non-empty vector for which + // Ap [k] == p. + ASSERT (Ap [k] == p) ; + while (k < anvec-1 && Ap [k+1] == p) + { + k++ ; + } + } + else + { + // p has not been found in Ap, so it appears in the middle of Ap [k-1] + // ... Ap [k], as computed by the binary search. This is the range of + // entries for the vector k-1, so k must be decremented. + k-- ; + } + + //-------------------------------------------------------------------------- + // return result + //-------------------------------------------------------------------------- + + // The entry p must reside in a non-empty vector. + ASSERT (k >= 0 && k < anvec) ; + ASSERT (Ap [k] <= p && p < Ap [k+1]) ; + + return (k) ; +} + diff --git a/GraphBLAS/Config/GB_config.h.in b/GraphBLAS/Config/GB_config.h.in index 3585ce4c20..513cc40f94 100644 --- a/GraphBLAS/Config/GB_config.h.in +++ b/GraphBLAS/Config/GB_config.h.in @@ -21,7 +21,7 @@ // GB_C_FLAGS: the C compiler flags used to compile GraphBLAS. Used // for compiling and linking: #ifndef GB_C_FLAGS -#define GB_C_FLAGS "@GB_C_FLAGS@" +#define GB_C_FLAGS "@GB_C_FLAGS@ @GB_OPENMP_C_FLAGS@" #endif // GB_C_LINK_FLAGS: the flags passed to the C compiler for the link phase: @@ -49,7 +49,7 @@ #define GB_OMP_INC "@GB_OMP_INC@" #endif -// GB_OMP_INC_DIRS: include directories OpenMP, if in use by GraphBLAS, +// GB_OMP_INC_DIRS: include directories for OpenMP, if in use by GraphBLAS, // for cmake: #ifndef GB_OMP_INC_DIRS #define GB_OMP_INC_DIRS "@GB_OMP_INC_DIRS@" @@ -65,5 +65,25 @@ #define GB_CMAKE_LIBRARIES "@GB_CMAKE_LIBRARIES@" #endif +// GB_CUDA_COMPILER: the CUDA compiler to compile CUDA JIT kernels: +#ifndef GB_CUDA_COMPILER +#define GB_CUDA_COMPILER "@GB_CUDA_COMPILER@" +#endif + +// GB_CUDA_FLAGS: the CUDA flags to compile CUDA JIT kernels: +#ifndef GB_CUDA_FLAGS +#define GB_CUDA_FLAGS "@GB_CUDA_FLAGS@" +#endif + +// GB_CUDA_INC: -I includes for CUDA JIT kernels: +#ifndef GB_CUDA_INC +#define GB_CUDA_INC "@GB_CUDA_INC@" +#endif + +// GB_CUDA_ARCHITECTURES: the CUDA ARCHITECTURES for CUDA JIT kernels: +#ifndef GB_CUDA_ARCHITECTURES +#define GB_CUDA_ARCHITECTURES "@GB_CUDA_ARCHITECTURES@" +#endif + #endif diff --git a/GraphBLAS/Config/GraphBLAS.h.in b/GraphBLAS/Config/GraphBLAS.h.in index e01f63c2c3..0dbdd56fe8 100644 --- a/GraphBLAS/Config/GraphBLAS.h.in +++ b/GraphBLAS/Config/GraphBLAS.h.in @@ -279,7 +279,7 @@ // The 'spec' string describes the GraphBLAS spec: #define GxB_SPEC_ABOUT \ "GraphBLAS C API, by Benjamin Brock, Aydin Buluc, Raye Kimmerer,\n" \ -"Jim Kitchen, Major Kumar, Timothy Mattson, Scott McMillan, Jose' Moreira,\n" \ +"Jim Kitchen, Manoj Kumar, Timothy Mattson, Scott McMillan, Jose' Moreira,\n" \ "Erik Welch, and Carl Yang. Based on 'GraphBLAS Mathematics by Jeremy\n" \ "Kepner. See also 'Graph Algorithms in the Language of Linear Algebra,'\n" \ "edited by J. Kepner and J. Gilbert, SIAM, 2011.\n" @@ -3772,6 +3772,8 @@ typedef enum // for global options or matrix options GxB_JIT_USE_CMAKE = 7032, // CPU JIT: use cmake or direct compile GxB_JIT_ERROR_LOG = 7033, // CPU JIT: error log file + GxB_JIT_CUDA_PREFACE = 7100, // CUDA JIT C++ preface + //------------------------------------------------------------ // GrB_get for GrB_Matrix: //------------------------------------------------------------ @@ -3973,7 +3975,7 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; _Generic \ ( \ (arg1), \ - default : GxB_Global_Option_set , \ + default: GxB_Global_Option_set , \ GxB_Option_Field : GxB_Global_Option_set , \ GrB_Vector : GxB_Vector_Option_set , \ GrB_Matrix : GxB_Matrix_Option_set , \ @@ -3986,7 +3988,7 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; _Generic \ ( \ (arg1), \ - default : GxB_Global_Option_get , \ + default: GxB_Global_Option_get , \ GxB_Option_Field : GxB_Global_Option_get , \ GrB_Vector : GxB_Vector_Option_get , \ GrB_Matrix : GxB_Matrix_Option_get , \ diff --git a/GraphBLAS/Demo/Program/gauss_demo.c b/GraphBLAS/Demo/Program/gauss_demo.c index 3411a31a8a..b32ec76b06 100644 --- a/GraphBLAS/Demo/Program/gauss_demo.c +++ b/GraphBLAS/Demo/Program/gauss_demo.c @@ -7,7 +7,7 @@ //------------------------------------------------------------------------------ -#include "GraphBLAS.h" +#include "graphblas_demos.h" #undef I //------------------------------------------------------------------------------ diff --git a/GraphBLAS/Demo/Program/reduce_demo.c b/GraphBLAS/Demo/Program/reduce_demo.c index 492b51423d..303cca39a4 100644 --- a/GraphBLAS/Demo/Program/reduce_demo.c +++ b/GraphBLAS/Demo/Program/reduce_demo.c @@ -7,7 +7,7 @@ //------------------------------------------------------------------------------ -#include "GraphBLAS.h" +#include "graphblas_demos.h" #undef I #if defined ( _OPENMP ) #include diff --git a/GraphBLAS/Demo/Program/wildtype_demo.c b/GraphBLAS/Demo/Program/wildtype_demo.c index 8eb761ee95..36e312746e 100644 --- a/GraphBLAS/Demo/Program/wildtype_demo.c +++ b/GraphBLAS/Demo/Program/wildtype_demo.c @@ -10,7 +10,7 @@ // Each "scalar" entry of this type consists of a 4x4 matrix and a string of // length 64. -#include "GraphBLAS.h" +#include "graphblas_demos.h" #undef I #if defined __INTEL_COMPILER @@ -196,13 +196,7 @@ int main (void) { // start GraphBLAS - #if 1 GrB_init (GrB_NONBLOCKING) ; - #else - GxB_init (GxB_NONBLOCKING_GPU, NULL, NULL, NULL, NULL, NULL) ; - GxB_set (GxB_GPU_ID, 0) ; - GB_Global_hack_set (2, 1) ; // always use the GPU - #endif GxB_Global_Option_set (GxB_BURBLE, true) ; int nthreads ; diff --git a/GraphBLAS/Doc/ChangeLog b/GraphBLAS/Doc/ChangeLog index 15e87e79d8..e1ef26ee59 100644 --- a/GraphBLAS/Doc/ChangeLog +++ b/GraphBLAS/Doc/ChangeLog @@ -1,4 +1,4 @@ -Feb XX, 2024: version 9.1.0 +Mar 22, 2024: version 9.1.0 * minor updates to build system * C11 complex type detection: this is now detected and configured by @@ -9,6 +9,18 @@ Feb XX, 2024: version 9.1.0 GraphBLAS.h to indicate which kind of complex data types are available in C11 or MSVC. Contributed by Markus Mützel. * port to clang-cl: fixing the GxB_get and GxB_set macro + * (53) bug fix: eWiseAdd C=A+B when M, A, and B are all hypersparse; + access to M was incorrect (also affects C+=T for any operation, if + M and T are both hypersparse). + +Mar 1, 2024: version 9.0.3 + + * (52) performance bug fix: JIT kernels since v8.3.1 were not compiled with + OpenMP. + +Feb 26, 2024: version 9.0.2 + + * (51) bug fix: GraphBLAS/Makefile "make static" was incorrect. Jan 20, 2024: version 9.0.1 diff --git a/GraphBLAS/Doc/FUTURE.txt b/GraphBLAS/Doc/FUTURE.txt index 7327aa3ccf..79dd37efa8 100644 --- a/GraphBLAS/Doc/FUTURE.txt +++ b/GraphBLAS/Doc/FUTURE.txt @@ -12,9 +12,13 @@ CUDA: Future features: + cumulative sum (or other monoid) + pack/unpack COO kernel fusion CUDA kernels + distributed framework + fine-grain parallelism for dot-product based mxm, mxv, vxm, then add GxB_vxvt (outer product) and GxB_vtxv (inner product) (or call them GxB_outerProduct and GxB_innerProduct?) @@ -40,3 +44,21 @@ Future features: GrB_set (op, GxB_DEFN, "string" also for all ops + candidates for kernel fusion: + * triangle counting: mxm then reduce to scalar + * lcc: mxm then reduce to vector + * FusedMM: see https://arxiv.org/pdf/2011.06391.pdf + + more: + * consider algorithms where fusion can occur + * performance monitor, or revised burble, to detect generic cases + * check if vectorization of GrB_mxm is effective when using clang + * see how HNSW vector search could be implemented in GraphBLAS + +CUDA JIT: + + https://developer.nvidia.com/blog/cuda-12-0-compiler-support-for-runtime-lto-using-nvjitlink-library/ + Developer webpage talking about ways to do nvJit with link time + optimization using CUDA 12.0 Shows precompiled path and JIT path to + generate kernels + diff --git a/GraphBLAS/Doc/GraphBLAS_UserGuide.pdf b/GraphBLAS/Doc/GraphBLAS_UserGuide.pdf index 2560e6e7aa986bb7b6b4bd036319dd95bcf191a8..15a176c9603b4c7af1310e97c9c4d5adf90f238a 100644 GIT binary patch delta 68671 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 delta 67992 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

x>5J7DnlH;ZTf05;OgC`F>PxT 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 diff --git a/GraphBLAS/Doc/GraphBLAS_UserGuide.tex b/GraphBLAS/Doc/GraphBLAS_UserGuide.tex index 07f87969a8..598b4c7484 100644 --- a/GraphBLAS/Doc/GraphBLAS_UserGuide.tex +++ b/GraphBLAS/Doc/GraphBLAS_UserGuide.tex @@ -14768,7 +14768,7 @@ \section{Release Notes} \begin{itemize} -\item Feb XX, 2024: version 9.1.0 % FIXME for SuiteSparse 7.7.0 +\item Mar 22, 2024: version 9.1.0 \begin{itemize} \item minor updates to build system @@ -14780,6 +14780,23 @@ \section{Release Notes} \verb'GxB_HAVE_COMPLEX*' to GraphBLAS.h to indicate which kind of complex data types are available in C11 or MSVC. Contributed by Markus M\"{u}tzel. + \item (53) bug fix: eWiseAdd \verb'C=A+B' when \verb'M', \verb'A', + and \verb'B' are all hypersparse; access to \verb'M' was incorrect + (also affects \verb'C+=T' for any operation, if \verb'M' and + \verb'T' are both hypersparse). + \end{itemize} + +\item Mar 1, 2024: version 9.0.3 + + \begin{itemize} + \item (52) performance bug fix: JIT kernels since v8.3.1 were not compiled + with OpenMP. + \end{itemize} + +\item Feb 26, 2024: version 9.0.2 + + \begin{itemize} + \item GraphBLAS/Makefile \verb"make static" was incorrect. \end{itemize} \item Jan 20, 2024: version 9.0.1 diff --git a/GraphBLAS/Doc/GraphBLAS_version.tex b/GraphBLAS/Doc/GraphBLAS_version.tex index e970a35c25..c4b9b9002b 100644 --- a/GraphBLAS/Doc/GraphBLAS_version.tex +++ b/GraphBLAS/Doc/GraphBLAS_version.tex @@ -1,5 +1,5 @@ % version of SuiteSparse:GraphBLAS \date{VERSION 9.1.0, -Feb XX, 2024} +Mar 22, 2024} diff --git a/GraphBLAS/GraphBLAS/CMakeLists.txt b/GraphBLAS/GraphBLAS/CMakeLists.txt index e69ed35478..51156a96ea 100644 --- a/GraphBLAS/GraphBLAS/CMakeLists.txt +++ b/GraphBLAS/GraphBLAS/CMakeLists.txt @@ -42,6 +42,7 @@ include ( SuiteSparsePolicy ) # option ( GRAPHBLAS_USE_CUDA "ON (default): enable CUDA acceleration for GraphBLAS, OFF: do not use CUDA" ${SUITESPARSE_USE_CUDA} ) set ( GRAPHBLAS_HAS_CUDA OFF ) +message ( STATUS "GraphBLAS CUDA JIT: disabled for MATLAB" ) # check for strict usage if ( SUITESPARSE_USE_STRICT AND GRAPHBLAS_USE_CUDA AND NOT GRAPHBLAS_HAS_CUDA ) diff --git a/GraphBLAS/GraphBLAS/rename/GB_rename.h b/GraphBLAS/GraphBLAS/rename/GB_rename.h index a2a7b272ee..d3362f4ee5 100644 --- a/GraphBLAS/GraphBLAS/rename/GB_rename.h +++ b/GraphBLAS/GraphBLAS/rename/GB_rename.h @@ -535,6 +535,7 @@ #define GB_jitifyer_get_C_link_flags GM_jitifyer_get_C_link_flags #define GB_jitifyer_get_control GM_jitifyer_get_control #define GB_jitifyer_get_C_preface GM_jitifyer_get_C_preface +#define GB_jitifyer_get_CUDA_preface GM_jitifyer_get_CUDA_preface #define GB_jitifyer_get_error_log GM_jitifyer_get_error_log #define GB_jitifyer_get_use_cmake GM_jitifyer_get_use_cmake #define GB_jitifyer_hash_encoding GM_jitifyer_hash_encoding @@ -544,6 +545,7 @@ #define GB_jitifyer_load GM_jitifyer_load #define GB_jitifyer_load_worker GM_jitifyer_load_worker #define GB_jitifyer_lookup GM_jitifyer_lookup +#define GB_jitifyer_nvcc_compile GM_jitifyer_nvcc_compile #define GB_jitifyer_path_256 GM_jitifyer_path_256 #define GB_jitifyer_query GM_jitifyer_query #define GB_jitifyer_set_cache_path GM_jitifyer_set_cache_path @@ -561,6 +563,8 @@ #define GB_jitifyer_set_control GM_jitifyer_set_control #define GB_jitifyer_set_C_preface GM_jitifyer_set_C_preface #define GB_jitifyer_set_C_preface_worker GM_jitifyer_set_C_preface_worker +#define GB_jitifyer_set_CUDA_preface GM_jitifyer_set_CUDA_preface +#define GB_jitifyer_set_CUDA_preface_worker GM_jitifyer_set_CUDA_preface_worker #define GB_jitifyer_set_error_log GM_jitifyer_set_error_log #define GB_jitifyer_set_error_log_worker GM_jitifyer_set_error_log_worker #define GB_jitifyer_set_use_cmake GM_jitifyer_set_use_cmake @@ -696,8 +700,27 @@ #define GB_JITpackage_214 GM_JITpackage_214 #define GB_JITpackage_215 GM_JITpackage_215 #define GB_JITpackage_216 GM_JITpackage_216 +#define GB_JITpackage_217 GM_JITpackage_217 +#define GB_JITpackage_218 GM_JITpackage_218 +#define GB_JITpackage_219 GM_JITpackage_219 #define GB_JITpackage_21 GM_JITpackage_21 +#define GB_JITpackage_220 GM_JITpackage_220 +#define GB_JITpackage_221 GM_JITpackage_221 +#define GB_JITpackage_222 GM_JITpackage_222 +#define GB_JITpackage_223 GM_JITpackage_223 +#define GB_JITpackage_224 GM_JITpackage_224 +#define GB_JITpackage_225 GM_JITpackage_225 +#define GB_JITpackage_226 GM_JITpackage_226 +#define GB_JITpackage_227 GM_JITpackage_227 +#define GB_JITpackage_228 GM_JITpackage_228 +#define GB_JITpackage_229 GM_JITpackage_229 #define GB_JITpackage_22 GM_JITpackage_22 +#define GB_JITpackage_230 GM_JITpackage_230 +#define GB_JITpackage_231 GM_JITpackage_231 +#define GB_JITpackage_232 GM_JITpackage_232 +#define GB_JITpackage_233 GM_JITpackage_233 +#define GB_JITpackage_234 GM_JITpackage_234 +#define GB_JITpackage_235 GM_JITpackage_235 #define GB_JITpackage_23 GM_JITpackage_23 #define GB_JITpackage_24 GM_JITpackage_24 #define GB_JITpackage_25 GM_JITpackage_25 @@ -885,6 +908,7 @@ #define GB_macrofy_input GM_macrofy_input #define GB_macrofy_mask GM_macrofy_mask #define GB_macrofy_monoid GM_macrofy_monoid +#define GB_macrofy_multadd GM_macrofy_multadd #define GB_macrofy_mxm GM_macrofy_mxm #define GB_macrofy_name GM_macrofy_name #define GB_macrofy_nvals GM_macrofy_nvals diff --git a/GraphBLAS/Include/GraphBLAS.h b/GraphBLAS/Include/GraphBLAS.h index 6659650a9a..680ebdfd92 100644 --- a/GraphBLAS/Include/GraphBLAS.h +++ b/GraphBLAS/Include/GraphBLAS.h @@ -234,7 +234,7 @@ // The version of this implementation, and the GraphBLAS API version: #define GxB_IMPLEMENTATION_NAME "SuiteSparse:GraphBLAS" -#define GxB_IMPLEMENTATION_DATE "Feb XX, 2024" +#define GxB_IMPLEMENTATION_DATE "Mar 22, 2024" #define GxB_IMPLEMENTATION_MAJOR 9 #define GxB_IMPLEMENTATION_MINOR 1 #define GxB_IMPLEMENTATION_SUB 0 @@ -279,7 +279,7 @@ // The 'spec' string describes the GraphBLAS spec: #define GxB_SPEC_ABOUT \ "GraphBLAS C API, by Benjamin Brock, Aydin Buluc, Raye Kimmerer,\n" \ -"Jim Kitchen, Major Kumar, Timothy Mattson, Scott McMillan, Jose' Moreira,\n" \ +"Jim Kitchen, Manoj Kumar, Timothy Mattson, Scott McMillan, Jose' Moreira,\n" \ "Erik Welch, and Carl Yang. Based on 'GraphBLAS Mathematics by Jeremy\n" \ "Kepner. See also 'Graph Algorithms in the Language of Linear Algebra,'\n" \ "edited by J. Kepner and J. Gilbert, SIAM, 2011.\n" @@ -3772,6 +3772,8 @@ typedef enum // for global options or matrix options GxB_JIT_USE_CMAKE = 7032, // CPU JIT: use cmake or direct compile GxB_JIT_ERROR_LOG = 7033, // CPU JIT: error log file + GxB_JIT_CUDA_PREFACE = 7100, // CUDA JIT C++ preface + //------------------------------------------------------------ // GrB_get for GrB_Matrix: //------------------------------------------------------------ @@ -3973,7 +3975,7 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; _Generic \ ( \ (arg1), \ - default : GxB_Global_Option_set , \ + default: GxB_Global_Option_set , \ GxB_Option_Field : GxB_Global_Option_set , \ GrB_Vector : GxB_Vector_Option_set , \ GrB_Matrix : GxB_Matrix_Option_set , \ @@ -3986,7 +3988,7 @@ GrB_Info GxB_Context_get (GxB_Context, GxB_Context_Field, ...) ; _Generic \ ( \ (arg1), \ - default : GxB_Global_Option_get , \ + default: GxB_Global_Option_get , \ GxB_Option_Field : GxB_Global_Option_get , \ GrB_Vector : GxB_Vector_Option_get , \ GrB_Matrix : GxB_Matrix_Option_get , \ diff --git a/GraphBLAS/JITpackage/CMakeLists.txt b/GraphBLAS/JITpackage/CMakeLists.txt index 3b5d11ab68..3d3dab7563 100644 --- a/GraphBLAS/JITpackage/CMakeLists.txt +++ b/GraphBLAS/JITpackage/CMakeLists.txt @@ -78,8 +78,8 @@ if ( TARGET grb_jitpackage ) "../Include/GraphBLAS.h" "../Source/Template/*.[ch]" "../Source/JitKernels/*.[ch]" - "../CUDA/Template/*h" - "../CUDA/JitKernels/*h" + "../CUDA/Template/*" + "../CUDA/JitKernels/*" "../Source/Shared/*.h" ) add_custom_command ( OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/GB_JITpackage.c diff --git a/GraphBLAS/Makefile b/GraphBLAS/Makefile index ff91ca7266..f1d5ecef93 100644 --- a/GraphBLAS/Makefile +++ b/GraphBLAS/Makefile @@ -80,7 +80,7 @@ setup: # build the static library static: - ( cd build && cmake $(CMAKE_OPTIONS) -DNSTATIC=0 .. && cmake --build . --config Release -j$(JOBS) ) + ( cd build && cmake $(CMAKE_OPTIONS) -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF .. && cmake --build . --config Release -j$(JOBS) ) # installs GraphBLAS to the install location defined by cmake, usually # /usr/local/lib and /usr/local/include diff --git a/GraphBLAS/README.md b/GraphBLAS/README.md index cbb8760b20..b2ce94c06e 100644 --- a/GraphBLAS/README.md +++ b/GraphBLAS/README.md @@ -4,7 +4,7 @@ SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. SPDX-License-Identifier: Apache-2.0 -VERSION 9.1.0, Feb XX, 2024 +VERSION 9.1.0, Mar 22, 2024 SuiteSparse:GraphBLAS is a complete implementation of the GraphBLAS standard, which defines a set of sparse matrix operations on an extended algebra of diff --git a/GraphBLAS/Source/Factories/GB_search_for_vector_template.c b/GraphBLAS/Source/Factories/GB_search_for_vector_template.c index 4a8ff482d1..fd7d8588ba 100644 --- a/GraphBLAS/Source/Factories/GB_search_for_vector_template.c +++ b/GraphBLAS/Source/Factories/GB_search_for_vector_template.c @@ -18,13 +18,11 @@ #ifdef GB_CUDA_KERNEL __device__ -static inline int64_t GB_search_for_vector_device -#else -static inline int64_t GB_search_for_vector // return vector k that contains p #endif +static inline int64_t GB_search_for_vector // return vector k that contains p ( const int64_t p, // search for vector k that contains p - const int64_t *restrict Ap, // vector pointers to search + const int64_t *restrict Ap, // vector pointers to search int64_t kleft, // left-most k to search int64_t anvec, // Ap is of size anvec+1 int64_t avlen // A->vlen @@ -42,7 +40,7 @@ static inline int64_t GB_search_for_vector // return vector k that contains p return ((avlen == 0) ? 0 : (p / avlen)) ; } - // A is sparse + // A is sparse or hypersparse ASSERT (p >= 0 && p < Ap [anvec]) ; //-------------------------------------------------------------------------- diff --git a/GraphBLAS/Source/Factories/GB_twotype_factory.c b/GraphBLAS/Source/Factories/GB_twotype_factory.c index 3548761d68..d3cbeeec90 100644 --- a/GraphBLAS/Source/Factories/GB_twotype_factory.c +++ b/GraphBLAS/Source/Factories/GB_twotype_factory.c @@ -36,11 +36,8 @@ switch (code1) case GB_UINT64_code : GB_WORKER (GB_OPNAME, _bool, bool, _uint64, uint64_t ) case GB_FP32_code : GB_WORKER (GB_OPNAME, _bool, bool, _fp32, float ) case GB_FP64_code : GB_WORKER (GB_OPNAME, _bool, bool, _fp64, double ) - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA case GB_FC32_code : GB_WORKER (GB_OPNAME, _bool, bool, _fc32, GxB_FC32_t) case GB_FC64_code : GB_WORKER (GB_OPNAME, _bool, bool, _fc64, GxB_FC64_t) - #endif default: ; } break ; @@ -62,11 +59,8 @@ switch (code1) case GB_UINT64_code : GB_WORKER (GB_OPNAME, _int8, int8_t, _uint64, uint64_t ) case GB_FP32_code : GB_WORKER (GB_OPNAME, _int8, int8_t, _fp32, float ) case GB_FP64_code : GB_WORKER (GB_OPNAME, _int8, int8_t, _fp64, double ) - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA case GB_FC32_code : GB_WORKER (GB_OPNAME, _int8, int8_t, _fc32, GxB_FC32_t) case GB_FC64_code : GB_WORKER (GB_OPNAME, _int8, int8_t, _fc64, GxB_FC64_t) - #endif default: ; } break ; @@ -88,11 +82,8 @@ switch (code1) case GB_UINT64_code : GB_WORKER (GB_OPNAME, _int16, int16_t, _uint64, uint64_t ) case GB_FP32_code : GB_WORKER (GB_OPNAME, _int16, int16_t, _fp32, float ) case GB_FP64_code : GB_WORKER (GB_OPNAME, _int16, int16_t, _fp64, double ) - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA case GB_FC32_code : GB_WORKER (GB_OPNAME, _int16, int16_t, _fc32, GxB_FC32_t) case GB_FC64_code : GB_WORKER (GB_OPNAME, _int16, int16_t, _fc64, GxB_FC64_t) - #endif default: ; } break ; @@ -114,11 +105,8 @@ switch (code1) case GB_UINT64_code : GB_WORKER (GB_OPNAME, _int32, int32_t, _uint64, uint64_t ) case GB_FP32_code : GB_WORKER (GB_OPNAME, _int32, int32_t, _fp32, float ) case GB_FP64_code : GB_WORKER (GB_OPNAME, _int32, int32_t, _fp64, double ) - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA case GB_FC32_code : GB_WORKER (GB_OPNAME, _int32, int32_t, _fc32, GxB_FC32_t) case GB_FC64_code : GB_WORKER (GB_OPNAME, _int32, int32_t, _fc64, GxB_FC64_t) - #endif default: ; } break ; @@ -140,11 +128,8 @@ switch (code1) case GB_UINT64_code : GB_WORKER (GB_OPNAME, _int64, int64_t, _uint64, uint64_t ) case GB_FP32_code : GB_WORKER (GB_OPNAME, _int64, int64_t, _fp32, float ) case GB_FP64_code : GB_WORKER (GB_OPNAME, _int64, int64_t, _fp64, double ) - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA case GB_FC32_code : GB_WORKER (GB_OPNAME, _int64, int64_t, _fc32, GxB_FC32_t) case GB_FC64_code : GB_WORKER (GB_OPNAME, _int64, int64_t, _fc64, GxB_FC64_t) - #endif default: ; } break ; @@ -166,11 +151,8 @@ switch (code1) case GB_UINT64_code : GB_WORKER (GB_OPNAME, _uint8, uint8_t, _uint64, uint64_t ) case GB_FP32_code : GB_WORKER (GB_OPNAME, _uint8, uint8_t, _fp32, float ) case GB_FP64_code : GB_WORKER (GB_OPNAME, _uint8, uint8_t, _fp64, double ) - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA case GB_FC32_code : GB_WORKER (GB_OPNAME, _uint8, uint8_t, _fc32, GxB_FC32_t) case GB_FC64_code : GB_WORKER (GB_OPNAME, _uint8, uint8_t, _fc64, GxB_FC64_t) - #endif default: ; } break ; @@ -192,11 +174,8 @@ switch (code1) case GB_UINT64_code : GB_WORKER (GB_OPNAME, _uint16, uint16_t, _uint64, uint64_t ) case GB_FP32_code : GB_WORKER (GB_OPNAME, _uint16, uint16_t, _fp32, float ) case GB_FP64_code : GB_WORKER (GB_OPNAME, _uint16, uint16_t, _fp64, double ) - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA case GB_FC32_code : GB_WORKER (GB_OPNAME, _uint16, uint16_t, _fc32, GxB_FC32_t) case GB_FC64_code : GB_WORKER (GB_OPNAME, _uint16, uint16_t, _fc64, GxB_FC64_t) - #endif default: ; } break ; @@ -218,11 +197,8 @@ switch (code1) case GB_UINT64_code : GB_WORKER (GB_OPNAME, _uint32, uint32_t, _uint64, uint64_t ) case GB_FP32_code : GB_WORKER (GB_OPNAME, _uint32, uint32_t, _fp32, float ) case GB_FP64_code : GB_WORKER (GB_OPNAME, _uint32, uint32_t, _fp64, double ) - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA case GB_FC32_code : GB_WORKER (GB_OPNAME, _uint32, uint32_t, _fc32, GxB_FC32_t) case GB_FC64_code : GB_WORKER (GB_OPNAME, _uint32, uint32_t, _fc64, GxB_FC64_t) - #endif default: ; } break ; @@ -244,11 +220,8 @@ switch (code1) #endif case GB_FP32_code : GB_WORKER (GB_OPNAME, _uint64, uint64_t, _fp32, float ) case GB_FP64_code : GB_WORKER (GB_OPNAME, _uint64, uint64_t, _fp64, double ) - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA case GB_FC32_code : GB_WORKER (GB_OPNAME, _uint64, uint64_t, _fc32, GxB_FC32_t) case GB_FC64_code : GB_WORKER (GB_OPNAME, _uint64, uint64_t, _fc64, GxB_FC64_t) - #endif default: ; } break ; @@ -270,11 +243,8 @@ switch (code1) case GB_FP32_code : GB_WORKER (GB_OPNAME, _fp32, float, _fp32, float ) #endif case GB_FP64_code : GB_WORKER (GB_OPNAME, _fp32, float, _fp64, double ) - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA case GB_FC32_code : GB_WORKER (GB_OPNAME, _fp32, float, _fc32, GxB_FC32_t) case GB_FC64_code : GB_WORKER (GB_OPNAME, _fp32, float, _fc64, GxB_FC64_t) - #endif default: ; } break ; @@ -296,11 +266,8 @@ switch (code1) #if !defined ( GB_EXCLUDE_SAME_TYPES ) case GB_FP64_code : GB_WORKER (GB_OPNAME, _fp64, double, _fp64, double ) #endif - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA case GB_FC32_code : GB_WORKER (GB_OPNAME, _fp64, double, _fc32, GxB_FC32_t) case GB_FC64_code : GB_WORKER (GB_OPNAME, _fp64, double, _fc64, GxB_FC64_t) - #endif default: ; } break ; @@ -320,13 +287,10 @@ switch (code1) case GB_UINT64_code : GB_WORKER (GB_OPNAME, _fc32, GxB_FC32_t, _uint64, uint64_t ) case GB_FP32_code : GB_WORKER (GB_OPNAME, _fc32, GxB_FC32_t, _fp32, float ) case GB_FP64_code : GB_WORKER (GB_OPNAME, _fc32, GxB_FC32_t, _fp64, double ) - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA #if !defined ( GB_EXCLUDE_SAME_TYPES ) case GB_FC32_code : GB_WORKER (GB_OPNAME, _fc32, GxB_FC32_t, _fc32, GxB_FC32_t) #endif case GB_FC64_code : GB_WORKER (GB_OPNAME, _fc32, GxB_FC32_t, _fc64, GxB_FC64_t) - #endif default: ; } break ; @@ -346,13 +310,10 @@ switch (code1) case GB_UINT64_code : GB_WORKER (GB_OPNAME, _fc64, GxB_FC64_t, _uint64, uint64_t ) case GB_FP32_code : GB_WORKER (GB_OPNAME, _fc64, GxB_FC64_t, _fp32, float ) case GB_FP64_code : GB_WORKER (GB_OPNAME, _fc64, GxB_FC64_t, _fp64, double ) - #if !defined ( GRAPHBLAS_HAS_CUDA ) - // TODO: does not yet work in CUDA case GB_FC32_code : GB_WORKER (GB_OPNAME, _fc64, GxB_FC64_t, _fc32, GxB_FC32_t) #if !defined ( GB_EXCLUDE_SAME_TYPES ) case GB_FC64_code : GB_WORKER (GB_OPNAME, _fc64, GxB_FC64_t, _fc64, GxB_FC64_t) #endif - #endif default: ; } break ; diff --git a/GraphBLAS/Source/FactoryKernels/GB_AxB__include2.h b/GraphBLAS/Source/FactoryKernels/GB_AxB__include2.h index a3ed1a352f..f662aa1138 100644 --- a/GraphBLAS/Source/FactoryKernels/GB_AxB__include2.h +++ b/GraphBLAS/Source/FactoryKernels/GB_AxB__include2.h @@ -6,6 +6,7 @@ // SPDX-License-Identifier: Apache-2.0 // This file has been automatically generated from Generator/GB_AxB.h +#include "GB_math.h" GrB_Info GB (_Adot2B__plus_pair_int8) ( diff --git a/GraphBLAS/Source/FactoryKernels/GB_aop__include.h b/GraphBLAS/Source/FactoryKernels/GB_aop__include.h index a5a6add698..ee91742be7 100644 --- a/GraphBLAS/Source/FactoryKernels/GB_aop__include.h +++ b/GraphBLAS/Source/FactoryKernels/GB_aop__include.h @@ -6,6 +6,7 @@ // SPDX-License-Identifier: Apache-2.0 // This file has been automatically generated from Generator/GB_aop.h +#include "GB_math.h" GrB_Info GB (_subassign_23__first_bool) ( diff --git a/GraphBLAS/Source/FactoryKernels/GB_as__include.h b/GraphBLAS/Source/FactoryKernels/GB_as__include.h index 89776b5481..e02fbfddf9 100644 --- a/GraphBLAS/Source/FactoryKernels/GB_as__include.h +++ b/GraphBLAS/Source/FactoryKernels/GB_as__include.h @@ -6,6 +6,7 @@ // SPDX-License-Identifier: Apache-2.0 // This file has been automatically generated from Generator/GB_as.h +#include "GB_math.h" GrB_Info GB (_subassign_05d__bool) ( diff --git a/GraphBLAS/Source/FactoryKernels/GB_bld__include.h b/GraphBLAS/Source/FactoryKernels/GB_bld__include.h index ddf238d831..6197da7d5b 100644 --- a/GraphBLAS/Source/FactoryKernels/GB_bld__include.h +++ b/GraphBLAS/Source/FactoryKernels/GB_bld__include.h @@ -6,6 +6,7 @@ // SPDX-License-Identifier: Apache-2.0 // This file has been automatically generated from Generator/GB_bld.h +#include "GB_math.h" GrB_Info GB (_bld__min_int8) ( diff --git a/GraphBLAS/Source/FactoryKernels/GB_ew__include.h b/GraphBLAS/Source/FactoryKernels/GB_ew__include.h index 630b328472..c3be2bc1ce 100644 --- a/GraphBLAS/Source/FactoryKernels/GB_ew__include.h +++ b/GraphBLAS/Source/FactoryKernels/GB_ew__include.h @@ -6,6 +6,7 @@ // SPDX-License-Identifier: Apache-2.0 // This file has been automatically generated from Generator/GB_ew.h +#include "GB_math.h" GrB_Info GB (_Cewise_fulln__first_bool) diff --git a/GraphBLAS/Source/FactoryKernels/GB_red__include.h b/GraphBLAS/Source/FactoryKernels/GB_red__include.h index 1dd63cdb28..ac6b8122b1 100644 --- a/GraphBLAS/Source/FactoryKernels/GB_red__include.h +++ b/GraphBLAS/Source/FactoryKernels/GB_red__include.h @@ -6,6 +6,7 @@ // SPDX-License-Identifier: Apache-2.0 // This file has been automatically generated from Generator/GB_red.h +#include "GB_math.h" GrB_Info GB (_red__min_int8) ( diff --git a/GraphBLAS/Source/FactoryKernels/GB_sel__include.h b/GraphBLAS/Source/FactoryKernels/GB_sel__include.h index 2667deb07e..c495c3f5e9 100644 --- a/GraphBLAS/Source/FactoryKernels/GB_sel__include.h +++ b/GraphBLAS/Source/FactoryKernels/GB_sel__include.h @@ -6,6 +6,7 @@ // SPDX-License-Identifier: Apache-2.0 // This file has been automatically generated from Generator/GB_sel.h +#include "GB_math.h" GrB_Info GB (_sel_phase2__nonzombie_bool) diff --git a/GraphBLAS/Source/FactoryKernels/GB_unop__include.h b/GraphBLAS/Source/FactoryKernels/GB_unop__include.h index edef1e6ddc..cef8329258 100644 --- a/GraphBLAS/Source/FactoryKernels/GB_unop__include.h +++ b/GraphBLAS/Source/FactoryKernels/GB_unop__include.h @@ -6,6 +6,7 @@ // SPDX-License-Identifier: Apache-2.0 // This file has been automatically generated from Generator/GB_unop.h +#include "GB_math.h" GrB_Info GB (_unop_tran__identity_bool_bool) diff --git a/GraphBLAS/Source/GB.h b/GraphBLAS/Source/GB.h index 580dee9cfe..1ee458b44f 100644 --- a/GraphBLAS/Source/GB.h +++ b/GraphBLAS/Source/GB.h @@ -19,8 +19,6 @@ #endif #include "GB_static_header.h" #include "GB_positional.h" -#include "GB_casting.h" -#include "GB_math.h" #include "GB_bitwise.h" #include "GB_check.h" #include "GB_nnz.h" @@ -53,7 +51,6 @@ #include "GB_cast.h" #include "GB_wait.h" #include "GB_convert.h" -#include "GB_ops.h" #include "GB_where.h" #include "GB_Context.h" #include "GB_cuda_gateway.h" diff --git a/GraphBLAS/Source/GB_AxB__include1.h b/GraphBLAS/Source/GB_AxB__include1.h index 22bec25456..03fdcc2f41 100644 --- a/GraphBLAS/Source/GB_AxB__include1.h +++ b/GraphBLAS/Source/GB_AxB__include1.h @@ -6,6 +6,7 @@ // SPDX-License-Identifier: Apache-2.0 // This file has been automatically generated from Generator/GB_AxB.h +#include "GB_math.h" GrB_Info GB (_Adot2B__any_pair_iso) ( diff --git a/GraphBLAS/Source/GB_AxB_dot.c b/GraphBLAS/Source/GB_AxB_dot.c index f43a4dc80e..785091002a 100644 --- a/GraphBLAS/Source/GB_AxB_dot.c +++ b/GraphBLAS/Source/GB_AxB_dot.c @@ -187,10 +187,10 @@ GrB_Info GB_AxB_dot // dot product (multiple methods) GB_sparsity_char_matrix (B)) ; #if defined ( GRAPHBLAS_HAS_CUDA ) - if (!C_iso && // fixme for CUDA, remove and create C iso on output + if (!C_iso && // FIXME for CUDA, remove and create C iso on output GB_cuda_AxB_dot3_branch (M, Mask_struct, A, B, semiring, flipxy)) { - info = (GB_cuda_AxB_dot3_jit (C, M, Mask_struct, A, B, semiring, + info = (GB_cuda_AxB_dot3 (C, M, Mask_struct, A, B, semiring, flipxy)) ; } else diff --git a/GraphBLAS/Source/GB_AxB_dot3.c b/GraphBLAS/Source/GB_AxB_dot3.c index daf0cf0b68..8893196d8d 100644 --- a/GraphBLAS/Source/GB_AxB_dot3.c +++ b/GraphBLAS/Source/GB_AxB_dot3.c @@ -192,6 +192,7 @@ GrB_Info GB_AxB_dot3 // C = A'*B using dot product method // M is sparse or hypersparse; C is the same as M nthreads = GB_nthreads (cnvec, chunk, nthreads_max) ; + // TODO: try this with Cp and Ch shallow GB_memcpy (Cp, Mp, (cnvec+1) * sizeof (int64_t), nthreads) ; if (M_is_hyper) @@ -304,6 +305,11 @@ GrB_Info GB_AxB_dot3 // C = A'*B using dot product method { #include "GB_AxB_factory.c" } + + if (info == GrB_SUCCESS) + { + GBURBLE (" factory ") ; + } } #endif diff --git a/GraphBLAS/Source/GB_AxB_saxpy.h b/GraphBLAS/Source/GB_AxB_saxpy.h index 9f0df1790b..5a37f7d999 100644 --- a/GraphBLAS/Source/GB_AxB_saxpy.h +++ b/GraphBLAS/Source/GB_AxB_saxpy.h @@ -10,6 +10,7 @@ #ifndef GB_AXB_SAXPY_H #define GB_AXB_SAXPY_H #include "GB.h" +#include "GB_math.h" #include "GB_AxB_saxpy3.h" //------------------------------------------------------------------------------ diff --git a/GraphBLAS/Source/GB_AxB_saxpy3.h b/GraphBLAS/Source/GB_AxB_saxpy3.h index d672effd33..6d23a54897 100644 --- a/GraphBLAS/Source/GB_AxB_saxpy3.h +++ b/GraphBLAS/Source/GB_AxB_saxpy3.h @@ -14,6 +14,7 @@ #define GB_AXB_SAXPY3_H #include "GB.h" +#include "GB_math.h" GrB_Info GB_AxB_saxpy3 // C = A*B using Gustavson+Hash ( diff --git a/GraphBLAS/Source/GB_add.h b/GraphBLAS/Source/GB_add.h index c8b974c0c4..1f3a6152b8 100644 --- a/GraphBLAS/Source/GB_add.h +++ b/GraphBLAS/Source/GB_add.h @@ -10,6 +10,7 @@ #ifndef GB_ADD_H #define GB_ADD_H #include "GB.h" +#include "GB_math.h" GrB_Info GB_add // C=A+B, C=A+B, or C=A+B ( diff --git a/GraphBLAS/Source/GB_add_phase0.c b/GraphBLAS/Source/GB_add_phase0.c index 067eded6b7..a965bf5486 100644 --- a/GraphBLAS/Source/GB_add_phase0.c +++ b/GraphBLAS/Source/GB_add_phase0.c @@ -677,8 +677,8 @@ GrB_Info GB_add_phase0 // find vectors in C for C=A+B or C=A+B GB_OK (GB_hyper_hash_build (M, Werk)) ; const int64_t *restrict M_Yp = (M->Y == NULL) ? NULL : M->Y->p ; - const int64_t *restrict M_Yi = (M->Y == NULL) ? NULL : M->Y->p ; - const int64_t *restrict M_Yx = (M->Y == NULL) ? NULL : M->Y->p ; + const int64_t *restrict M_Yi = (M->Y == NULL) ? NULL : M->Y->i ; + const int64_t *restrict M_Yx = (M->Y == NULL) ? NULL : M->Y->x ; const int64_t M_hash_bits = (M->Y == NULL) ? 0 : (M->Y->vdim - 1) ; int64_t k ; diff --git a/GraphBLAS/Source/GB_assign.h b/GraphBLAS/Source/GB_assign.h index 3b891f33d0..c9ce0530fb 100644 --- a/GraphBLAS/Source/GB_assign.h +++ b/GraphBLAS/Source/GB_assign.h @@ -10,6 +10,7 @@ #ifndef GB_ASSIGN_H #define GB_ASSIGN_H #include "GB.h" +#include "GB_math.h" GrB_Info GB_assign // C(Rows,Cols) += A or A' ( diff --git a/GraphBLAS/Source/GB_bitmap_assign.h b/GraphBLAS/Source/GB_bitmap_assign.h index f294e89cdf..a45a05bfbe 100644 --- a/GraphBLAS/Source/GB_bitmap_assign.h +++ b/GraphBLAS/Source/GB_bitmap_assign.h @@ -10,6 +10,7 @@ #ifndef GB_BITMAP_ASSIGN_H #define GB_BITMAP_ASSIGN_H #include "GB.h" +#include "GB_math.h" GrB_Info GB_bitmap_assign ( diff --git a/GraphBLAS/Source/GB_cast.h b/GraphBLAS/Source/GB_cast.h index fbf3587465..5312d08c58 100644 --- a/GraphBLAS/Source/GB_cast.h +++ b/GraphBLAS/Source/GB_cast.h @@ -10,6 +10,18 @@ #ifndef GB_CAST_H #define GB_CAST_H +//------------------------------------------------------------------------------ +// pointer casting function, returned by GB_cast_factory. +//------------------------------------------------------------------------------ + +typedef void (*GB_cast_function) (void *, const void *, size_t) ; + +GB_cast_function GB_cast_factory // returns pointer to function to cast x to z +( + const GB_Type_code code1, // the type of z, the output value + const GB_Type_code code2 // the type of x, the input value +) ; + //------------------------------------------------------------------------------ // GB_cast_scalar: typecast or copy a scalar //------------------------------------------------------------------------------ diff --git a/GraphBLAS/Source/GB_cast_factory.c b/GraphBLAS/Source/GB_cast_factory.c index c97e60cef5..67907852fa 100644 --- a/GraphBLAS/Source/GB_cast_factory.c +++ b/GraphBLAS/Source/GB_cast_factory.c @@ -16,6 +16,7 @@ // function GB_copy_user_user. #include "GB.h" +#include "GB_casting.h" GB_cast_function GB_cast_factory // returns pointer to function to cast x to z ( diff --git a/GraphBLAS/Source/GB_casting.c b/GraphBLAS/Source/GB_casting.c index 90def26d33..bac1c2d87c 100644 --- a/GraphBLAS/Source/GB_casting.c +++ b/GraphBLAS/Source/GB_casting.c @@ -8,6 +8,7 @@ //------------------------------------------------------------------------------ #include "GB.h" +#include "GB_casting.h" //------------------------------------------------------------------------------ // typecasting from double to integer diff --git a/GraphBLAS/Source/GB_casting.h b/GraphBLAS/Source/GB_casting.h index e6cc7b4edb..cfe83d362b 100644 --- a/GraphBLAS/Source/GB_casting.h +++ b/GraphBLAS/Source/GB_casting.h @@ -9,21 +9,13 @@ // The GJ_cast* methods are only used in JIT kernels. +#ifdef __cplusplus +#error "not used for C++" +#endif + #ifndef GB_CASTING_H #define GB_CASTING_H -//------------------------------------------------------------------------------ -// pointer casting function, returned by GB_cast_factory. -//------------------------------------------------------------------------------ - -typedef void (*GB_cast_function) (void *, const void *, size_t) ; - -GB_cast_function GB_cast_factory // returns pointer to function to cast x to z -( - const GB_Type_code code1, // the type of z, the output value - const GB_Type_code code2 // the type of x, the input value -) ; - //------------------------------------------------------------------------------ // typecasting from double to integer //------------------------------------------------------------------------------ @@ -215,16 +207,12 @@ GB_CAST_FUNCTION (bool , uint32_t ) GB_CAST_FUNCTION (bool , uint64_t ) GB_CAST_FUNCTION (bool , float ) GB_CAST_FUNCTION (bool , double ) - -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA #undef GB_CAST #define GB_CAST(ztype,x) (GB_crealf (x) != 0 || GB_cimagf (x) != 0) GB_CAST_FUNCTION (bool , GxB_FC32_t) #undef GB_CAST #define GB_CAST(ztype,x) (GB_creal (x) != 0 || GB_cimag (x) != 0) GB_CAST_FUNCTION (bool , GxB_FC64_t) -#endif //------------------------------------------------------------------------------ // typecast to int8_t @@ -246,15 +234,11 @@ GB_CAST_FUNCTION (int8_t , uint64_t ) GB_CAST_FUNCTION (int8_t , float ) GB_CAST_FUNCTION (int8_t , double ) #undef GB_CAST - -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA #define GB_CAST(ztype,x) GB_cast_to_int8_t ((double) GB_crealf (x)) GB_CAST_FUNCTION (int8_t , GxB_FC32_t) #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_int8_t (GB_creal (x)) GB_CAST_FUNCTION (int8_t , GxB_FC64_t) -#endif //------------------------------------------------------------------------------ // typecast to int16_t @@ -275,16 +259,12 @@ GB_CAST_FUNCTION (int16_t , uint64_t ) #define GB_CAST(ztype,x) GB_cast_to_int16_t ((double) x) GB_CAST_FUNCTION (int16_t , float ) GB_CAST_FUNCTION (int16_t , double ) - -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_int16_t ((double) GB_crealf (x)) GB_CAST_FUNCTION (int16_t , GxB_FC32_t) #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_int16_t (GB_creal (x)) GB_CAST_FUNCTION (int16_t , GxB_FC64_t) -#endif //------------------------------------------------------------------------------ // typecast to int32_t @@ -305,16 +285,12 @@ GB_CAST_FUNCTION (int32_t , uint64_t ) #define GB_CAST(ztype,x) GB_cast_to_int32_t ((double) x) GB_CAST_FUNCTION (int32_t , float ) GB_CAST_FUNCTION (int32_t , double ) - -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_int32_t ((double) GB_crealf (x)) GB_CAST_FUNCTION (int32_t , GxB_FC32_t) #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_int32_t (GB_creal (x)) GB_CAST_FUNCTION (int32_t , GxB_FC64_t) -#endif //------------------------------------------------------------------------------ // typecast to int64_t @@ -335,16 +311,12 @@ GB_CAST_FUNCTION (int64_t , uint64_t ) #define GB_CAST(ztype,x) GB_cast_to_int64_t ((double) x) GB_CAST_FUNCTION (int64_t , float ) GB_CAST_FUNCTION (int64_t , double ) - -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_int64_t ((double) GB_crealf (x)) GB_CAST_FUNCTION (int64_t , GxB_FC32_t) #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_int64_t (GB_creal (x)) GB_CAST_FUNCTION (int64_t , GxB_FC64_t) -#endif //------------------------------------------------------------------------------ // typecast to uint8_t @@ -365,16 +337,12 @@ GB_CAST_FUNCTION (uint8_t , uint64_t ) #define GB_CAST(ztype,x) GB_cast_to_uint8_t ((double) x) GB_CAST_FUNCTION (uint8_t , float ) GB_CAST_FUNCTION (uint8_t , double ) - -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_uint8_t ((double) GB_crealf (x)) GB_CAST_FUNCTION (uint8_t , GxB_FC32_t) #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_uint8_t (GB_creal (x)) GB_CAST_FUNCTION (uint8_t , GxB_FC64_t) -#endif //------------------------------------------------------------------------------ // typecast to uint16_t @@ -395,16 +363,12 @@ GB_CAST_FUNCTION (uint16_t , uint64_t ) #define GB_CAST(ztype,x) GB_cast_to_uint16_t ((double) x) GB_CAST_FUNCTION (uint16_t , float ) GB_CAST_FUNCTION (uint16_t , double ) - -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_uint16_t ((double) GB_crealf (x)) GB_CAST_FUNCTION (uint16_t , GxB_FC32_t) #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_uint16_t (GB_creal (x)) GB_CAST_FUNCTION (uint16_t , GxB_FC64_t) -#endif //------------------------------------------------------------------------------ // typecast to uint32_t @@ -425,16 +389,12 @@ GB_CAST_FUNCTION (uint32_t , uint64_t ) #define GB_CAST(ztype,x) GB_cast_to_uint32_t ((double) x) GB_CAST_FUNCTION (uint32_t , float ) GB_CAST_FUNCTION (uint32_t , double ) - -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_uint32_t ((double) GB_crealf (x)) GB_CAST_FUNCTION (uint32_t , GxB_FC32_t) #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_uint32_t (GB_creal (x)) GB_CAST_FUNCTION (uint32_t , GxB_FC64_t) -#endif //------------------------------------------------------------------------------ // typecast to uint64_t @@ -455,16 +415,12 @@ GB_CAST_FUNCTION (uint64_t , uint64_t ) #define GB_CAST(ztype,x) GB_cast_to_uint64_t ((double) x) GB_CAST_FUNCTION (uint64_t , float ) GB_CAST_FUNCTION (uint64_t , double ) - -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_uint64_t ((double) GB_crealf (x)) GB_CAST_FUNCTION (uint64_t , GxB_FC32_t) #undef GB_CAST #define GB_CAST(ztype,x) GB_cast_to_uint64_t (GB_creal (x)) GB_CAST_FUNCTION (uint64_t , GxB_FC64_t) -#endif //------------------------------------------------------------------------------ // typecast to float @@ -483,16 +439,12 @@ GB_CAST_FUNCTION (float , uint32_t ) GB_CAST_FUNCTION (float , uint64_t ) GB_CAST_FUNCTION (float , float ) GB_CAST_FUNCTION (float , double ) - -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA #undef GB_CAST #define GB_CAST(ztype,x) GB_crealf (x) GB_CAST_FUNCTION (float , GxB_FC32_t) #undef GB_CAST #define GB_CAST(ztype,x) ((float) GB_creal (x)) GB_CAST_FUNCTION (float , GxB_FC64_t) -#endif //------------------------------------------------------------------------------ // typecast to double @@ -511,24 +463,17 @@ GB_CAST_FUNCTION (double , uint32_t ) GB_CAST_FUNCTION (double , uint64_t ) GB_CAST_FUNCTION (double , float ) GB_CAST_FUNCTION (double , double ) - -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA #undef GB_CAST #define GB_CAST(ztype,x) ((double) GB_crealf (x)) GB_CAST_FUNCTION (double , GxB_FC32_t) #undef GB_CAST #define GB_CAST(ztype,x) GB_creal (x) GB_CAST_FUNCTION (double , GxB_FC64_t) -#endif //------------------------------------------------------------------------------ // typecast to float complex //------------------------------------------------------------------------------ -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA - #undef GB_CAST #define GB_CAST(ztype,x) GB_CMPLX32 ((float) x, (float) 0) GB_CAST_FUNCTION (GxB_FC32_t, bool ) @@ -573,8 +518,6 @@ GB_CAST_FUNCTION (GxB_FC64_t, GxB_FC32_t) #define GB_CAST(ztype,x) x GB_CAST_FUNCTION (GxB_FC64_t, GxB_FC64_t) -#endif - #undef GB_CAST #undef GB_CAST_FUNCTION diff --git a/GraphBLAS/Source/GB_copy_user_user.c b/GraphBLAS/Source/GB_copy_user_user.c index 84c69a3a86..797f94e3d1 100644 --- a/GraphBLAS/Source/GB_copy_user_user.c +++ b/GraphBLAS/Source/GB_copy_user_user.c @@ -8,6 +8,7 @@ //------------------------------------------------------------------------------ #include "GB.h" +#include "GB_casting.h" void GB_copy_user_user (void *z, const void *x, size_t s) { diff --git a/GraphBLAS/Source/GB_cuda_gateway.h b/GraphBLAS/Source/GB_cuda_gateway.h index cfb00a72ed..72bd217d73 100644 --- a/GraphBLAS/Source/GB_cuda_gateway.h +++ b/GraphBLAS/Source/GB_cuda_gateway.h @@ -66,17 +66,15 @@ static inline int GB_ngpus_to_use // get # of GPUs avaiable int gpu_count = GB_Global_gpu_count_get ( ) ; - if (gpu_hack == 2 || gpu_count == 0) + if (gpu_hack == 2 || gpu_count == 0 || work == 0) { // never use the GPU(s) - // printf ("(GPU: disabled, gpu_count: %d) ", gpu_count) ; return (0) ; } else if (gpu_hack == 1) { // always use all available GPU(s) // fixme for CUDA: allow 1 to gpu_count to be requested - // printf ("(using the GPU: %d) ", gpu_count) ; return (gpu_count) ; } else @@ -84,15 +82,12 @@ static inline int GB_ngpus_to_use // default: use no more than max_gpus_to_use double gpu_chunk = 2e6 ; double max_gpus_to_use = floor (work / gpu_chunk) ; - // printf ("(work %g gpu_chunk: %g max gpus to use: %g) ", - // work, gpu_chunk, max_gpus_to_use) ; // but use no more than the # of GPUs available if (max_gpus_to_use > gpu_count) return (gpu_count) ; return ((int) max_gpus_to_use) ; } } - //------------------------------------------------------------------------------ // GB_cuda_* gateway functions //------------------------------------------------------------------------------ @@ -116,13 +111,18 @@ bool GB_cuda_get_device_properties GB_cuda_device *prop ) ; +bool GB_cuda_type_branch // return true if the type is OK on GPU +( + const GrB_Type type // type to query +) ; + bool GB_cuda_reduce_to_scalar_branch // return true to use the GPU ( const GrB_Monoid monoid, // monoid to do the reduction const GrB_Matrix A // input matrix ) ; -GrB_Info GB_cuda_reduce_to_scalar_jit +GrB_Info GB_cuda_reduce_to_scalar ( // output: GB_void *s, // note: statically allocated on CPU stack; if @@ -134,12 +134,7 @@ GrB_Info GB_cuda_reduce_to_scalar_jit const GrB_Matrix A ) ; -bool GB_cuda_type_branch // return true if the type is OK on GPU -( - const GrB_Type type // type to query -) ; - -GrB_Info GB_cuda_AxB_dot3_jit // C = A'*B using dot product method +GrB_Info GB_cuda_AxB_dot3 // C = A'*B using dot product method ( GrB_Matrix C, // output matrix, static header const GrB_Matrix M, // mask matrix diff --git a/GraphBLAS/Source/GB_emult.h b/GraphBLAS/Source/GB_emult.h index c5661f9c00..7a9e7e2a03 100644 --- a/GraphBLAS/Source/GB_emult.h +++ b/GraphBLAS/Source/GB_emult.h @@ -10,6 +10,7 @@ #ifndef GB_EMULT_H #define GB_EMULT_H #include "GB.h" +#include "GB_math.h" #include "GB_bitmap_assign_methods.h" #define GB_EMULT_METHOD1_ADD 1 /* use GB_add instead of emult */ diff --git a/GraphBLAS/Source/GB_encodify_reduce.c b/GraphBLAS/Source/GB_encodify_reduce.c index 61fb3f5425..5112883246 100644 --- a/GraphBLAS/Source/GB_encodify_reduce.c +++ b/GraphBLAS/Source/GB_encodify_reduce.c @@ -17,6 +17,7 @@ uint64_t GB_encodify_reduce // encode a GrB_reduce problem // except for the suffix char **suffix, // suffix for user-defined kernel // input: + const GB_jit_kcode kcode, // kernel to encode GrB_Monoid monoid, // the monoid to enumify GrB_Matrix A // input matrix to reduce ) @@ -40,7 +41,7 @@ uint64_t GB_encodify_reduce // encode a GrB_reduce problem GB_enumify_reduce (&encoding->code, monoid, A) ; bool builtin = (monoid->hash == 0) ; - encoding->kcode = GB_JIT_KERNEL_REDUCE ; + encoding->kcode = kcode ; //-------------------------------------------------------------------------- // determine the suffix and its length diff --git a/GraphBLAS/Source/GB_enumify_cuda_atomic.c b/GraphBLAS/Source/GB_enumify_cuda_atomic.c index 315f78ed5c..e10b97dc39 100644 --- a/GraphBLAS/Source/GB_enumify_cuda_atomic.c +++ b/GraphBLAS/Source/GB_enumify_cuda_atomic.c @@ -37,12 +37,11 @@ bool GB_enumify_cuda_atomic { // user defined monoid: can apply GB_ADD via atomicCAS if the ztype has - // 16, 32, or 64 bits + // 32 or 64 bits case 0 : (*user_monoid_atomically) = - (zsize == sizeof (uint16_t) || - zsize == sizeof (uint32_t) || + (zsize == sizeof (uint32_t) || zsize == sizeof (uint64_t)) ; break ; @@ -234,14 +233,10 @@ bool GB_enumify_cuda_atomic { //---------------------------------------------------------------------- - // user-defined monoid with a type of 16, 32, or 64 bits + // user-defined monoid with a type of 32 or 64 bits //---------------------------------------------------------------------- - if (zsize == sizeof (uint16_t)) - { - (*cuda_type) = "unsigned short int" ; - } - else if (zsize == sizeof (uint32_t)) + if (zsize == sizeof (uint32_t)) { (*cuda_type) = "unsigned int" ; } @@ -261,7 +256,7 @@ bool GB_enumify_cuda_atomic //---------------------------------------------------------------------- // either built-in (GxB_ANY_FC64_MONOID or GxB_TIMES_FC64_MONOID), - // or user-defined where the type is not 16, 32, or 64 bits in size + // or user-defined where the type is not 32 or 64 bits in size has_cheeseburger = false ; diff --git a/GraphBLAS/Source/GB_ewise_kernels.h b/GraphBLAS/Source/GB_ewise_kernels.h index de2665caa1..b90a8a4f65 100644 --- a/GraphBLAS/Source/GB_ewise_kernels.h +++ b/GraphBLAS/Source/GB_ewise_kernels.h @@ -7,7 +7,6 @@ //------------------------------------------------------------------------------ -#include "GB.h" #include "GB_emult.h" #include "GB_ek_slice.h" #include "GB_bitmap_assign_methods.h" diff --git a/GraphBLAS/Source/GB_helper.h b/GraphBLAS/Source/GB_helper.h index 317b6ac3ba..5cb05a5c27 100644 --- a/GraphBLAS/Source/GB_helper.h +++ b/GraphBLAS/Source/GB_helper.h @@ -14,6 +14,7 @@ #define GB_HELPER_H #include "GB.h" +#include "GB_math.h" double GB_helper0 (void) ; diff --git a/GraphBLAS/Source/GB_init.c b/GraphBLAS/Source/GB_init.c index 7b55498369..c3d6e6d253 100644 --- a/GraphBLAS/Source/GB_init.c +++ b/GraphBLAS/Source/GB_init.c @@ -31,7 +31,8 @@ // The calloc function pointer is also optional and can be NULL. // If the mode is GxB_BLOCKING_GPU or GxB_NONBLOCKING_GPU, the 4 function -// pointers are ignored, and rmm_wrap_malloc/.../rmm_wrap_free are used instead. +// pointers are ignored, and rmm_wrap_malloc/.../rmm_wrap_free are used +// instead. #define GB_FREE_ALL ; #include "GB.h" @@ -44,7 +45,7 @@ GrB_Info GB_init // start up GraphBLAS ( - const GrB_Mode mode, // blocking or non-blocking mode + GrB_Mode mode, // blocking or non-blocking mode // pointers to memory management functions. void * (* malloc_function ) (size_t), // required @@ -78,7 +79,10 @@ GrB_Info GB_init // start up GraphBLAS // establish malloc/calloc/realloc/free //-------------------------------------------------------------------------- + bool malloc_is_thread_safe = true ; + #if defined ( GRAPHBLAS_HAS_CUDA ) + mode = GxB_NONBLOCKING_GPU ; // HACK FIXME if (mode == GxB_NONBLOCKING_GPU || mode == GxB_BLOCKING_GPU) { // ignore the memory management function pointers and use rmm_wrap_* @@ -86,6 +90,8 @@ GrB_Info GB_init // start up GraphBLAS calloc_function = rmm_wrap_calloc ; realloc_function = rmm_wrap_realloc ; free_function = rmm_wrap_free ; + // the rmm_wrap methods are not thread-safe + malloc_is_thread_safe = false ; } #endif @@ -104,7 +110,7 @@ GrB_Info GB_init // start up GraphBLAS GB_Global_realloc_function_set (realloc_function) ; // ok if NULL GB_Global_free_function_set (free_function ) ; // cannot be NULL - GB_Global_malloc_is_thread_safe_set (true) ; // malloc must be thread-safe + GB_Global_malloc_is_thread_safe_set (malloc_is_thread_safe) ; GB_Global_memtable_clear ( ) ; GB_Global_malloc_tracking_set (false) ; @@ -182,7 +188,7 @@ GrB_Info GB_init // start up GraphBLAS GB_Global_timing_clear_all ( ) ; //-------------------------------------------------------------------------- - // set up the JIT folder locations and compiler flags + // set up the JIT setting and emit the source to the cache folder //-------------------------------------------------------------------------- GB_OK (GB_jitifyer_init ( )) ; @@ -192,6 +198,12 @@ GrB_Info GB_init // start up GraphBLAS //-------------------------------------------------------------------------- #pragma omp flush + #if defined ( GRAPHBLAS_HAS_CUDA ) +// this hack_get setting is used by GB_ngpus_to_use: +// GB_Global_hack_set (2,0) ; // HACK FIXME: default: GPU for big enough probs +// GB_Global_hack_set (2,1) ; // HACK FIXME: force the GPU always to be used +// GB_Global_hack_set (2,2) ; // HACK FIXME: force the GPU never to be used + #endif return (GrB_SUCCESS) ; } diff --git a/GraphBLAS/Source/GB_init.h b/GraphBLAS/Source/GB_init.h index 9bd15d962e..8664293dc3 100644 --- a/GraphBLAS/Source/GB_init.h +++ b/GraphBLAS/Source/GB_init.h @@ -12,7 +12,7 @@ GrB_Info GB_init // start up GraphBLAS ( - const GrB_Mode mode, // blocking or non-blocking mode + GrB_Mode mode, // blocking or non-blocking mode // pointers to memory management functions. void * (* malloc_function ) (size_t), // required diff --git a/GraphBLAS/Source/GB_jitifyer.c b/GraphBLAS/Source/GB_jitifyer.c index 7e96b03f04..d430977e57 100644 --- a/GraphBLAS/Source/GB_jitifyer.c +++ b/GraphBLAS/Source/GB_jitifyer.c @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -// GB_jitifyer.c: CPU jitifyer +// GB_jitifyer.c: CPU / CUDA jitifyer //------------------------------------------------------------------------------ // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. @@ -71,10 +71,14 @@ static size_t GB_jit_C_libraries_allocated = 0 ; static char *GB_jit_C_cmake_libs = NULL ; static size_t GB_jit_C_cmake_libs_allocated = 0 ; -// preface to add to each JIT kernel: +// preface to add to each CPU JIT kernel: static char *GB_jit_C_preface = NULL ; static size_t GB_jit_C_preface_allocated = 0 ; +// preface to add to each CUDA JIT kernel: +static char *GB_jit_CUDA_preface = NULL ; +static size_t GB_jit_CUDA_preface_allocated = 0 ; + // temporary workspace for filenames and system commands: static char *GB_jit_temp = NULL ; static size_t GB_jit_temp_allocated = 0 ; @@ -208,11 +212,12 @@ void GB_jitifyer_finalize (void) GB_FREE_STUFF (GB_jit_C_libraries) ; GB_FREE_STUFF (GB_jit_C_cmake_libs) ; GB_FREE_STUFF (GB_jit_C_preface) ; + GB_FREE_STUFF (GB_jit_CUDA_preface) ; GB_FREE_STUFF (GB_jit_temp) ; } //------------------------------------------------------------------------------ -// GB_jitifyer_init: initialize the CPU and CUDA JIT folders, flags, etc +// GB_jitifyer_init: initialize the JIT folders, flags, etc //------------------------------------------------------------------------------ // Returns GrB_SUCCESS or GrB_OUT_OF_MEMORY. If any other error occurs (such @@ -308,6 +313,7 @@ GrB_Info GB_jitifyer_init (void) GB_COPY_STUFF (GB_jit_C_libraries, GB_C_LIBRARIES) ; GB_COPY_STUFF (GB_jit_C_cmake_libs, GB_CMAKE_LIBRARIES) ; GB_COPY_STUFF (GB_jit_C_preface, "") ; + GB_COPY_STUFF (GB_jit_CUDA_preface, "") ; OK (GB_jitifyer_alloc_space ( )) ; //-------------------------------------------------------------------------- @@ -438,6 +444,7 @@ GrB_Info GB_jitifyer_init (void) else if (IS ("union" )) c = GB_JIT_KERNEL_UNION ; else if (IS ("user_op" )) c = GB_JIT_KERNEL_USEROP ; else if (IS ("user_type" )) c = GB_JIT_KERNEL_USERTYPE ; + else if (IS ("cuda_reduce" )) c = GB_JIT_CUDA_KERNEL_REDUCE ; else { // PreJIT error: kernel_name is invalid; ignore this kernel @@ -548,8 +555,6 @@ GrB_Info GB_jitifyer_establish_paths (GrB_Info error_condition) // construct the c, lib, and lock paths and their 256 subfolders ok = ok && GB_jitifyer_path_256 ("c") ; - ok = ok && GB_jitifyer_path_256 ("cu") ; - ok = ok && GB_jitifyer_path_256 ("libcu") ; ok = ok && GB_jitifyer_path_256 ("lib") ; ok = ok && GB_jitifyer_path_256 ("lock") ; @@ -558,7 +563,7 @@ GrB_Info GB_jitifyer_establish_paths (GrB_Info error_condition) ok = ok && GB_file_mkdir (GB_jit_temp) ; // construct the tmp path - snprintf (GB_jit_temp, GB_jit_temp_allocated, "%s/tmp", GB_jit_cache_path); + snprintf (GB_jit_temp, GB_jit_temp_allocated, "%s/tmp", GB_jit_cache_path) ; ok = ok && GB_file_mkdir (GB_jit_temp) ; //-------------------------------------------------------------------------- @@ -1230,7 +1235,6 @@ GrB_Info GB_jitifyer_set_C_cmake_libs_worker (const char *new_cmake_libs) return (GB_jitifyer_alloc_space ( )) ; } - //------------------------------------------------------------------------------ // GB_jitifyer_get_C_preface: return the current C preface //------------------------------------------------------------------------------ @@ -1286,6 +1290,61 @@ GrB_Info GB_jitifyer_set_C_preface_worker (const char *new_C_preface) return (GrB_SUCCESS) ; } +//------------------------------------------------------------------------------ +// GB_jitifyer_get_CUDA_preface: return the current C preface +//------------------------------------------------------------------------------ + +const char *GB_jitifyer_get_CUDA_preface (void) +{ + const char *s ; + #pragma omp critical (GB_jitifyer_worker) + { + s = GB_jit_CUDA_preface ; + } + return (s) ; +} + +//------------------------------------------------------------------------------ +// GB_jitifyer_set_CUDA_preface: set new C preface +//------------------------------------------------------------------------------ + +GrB_Info GB_jitifyer_set_CUDA_preface (const char *new_CUDA_preface) +{ + + //-------------------------------------------------------------------------- + // check inputs + //-------------------------------------------------------------------------- + + if (new_CUDA_preface == NULL) + { + return (GrB_NULL_POINTER) ; + } + + //-------------------------------------------------------------------------- + // set the C preface in a critical section + //-------------------------------------------------------------------------- + + GrB_Info info ; + #pragma omp critical (GB_jitifyer_worker) + { + info = GB_jitifyer_set_CUDA_preface_worker (new_CUDA_preface) ; + } + return (info) ; +} + +//------------------------------------------------------------------------------ +// GB_jitifyer_set_CUDA_preface_worker: set C preface in a critical section +//------------------------------------------------------------------------------ + +GrB_Info GB_jitifyer_set_CUDA_preface_worker (const char *new_CUDA_preface) +{ + // free the old strings that depend on the C preface + GB_FREE_STUFF (GB_jit_CUDA_preface) ; + // allocate the new GB_jit_CUDA_preface + GB_COPY_STUFF (GB_jit_CUDA_preface, new_CUDA_preface) ; + return (GrB_SUCCESS) ; +} + //------------------------------------------------------------------------------ // GB_jitifyer_query: check if the type/op/monoid definitions match //------------------------------------------------------------------------------ @@ -1677,6 +1736,10 @@ GrB_Info GB_jitifyer_worker // lock the kernel //-------------------------------------------------------------------------- + // FIXME: add kernel_name to the lock filename. If the lock fails, + // sleep for 1 second and try again repeatedly, with a timeout limit of + // (say) 60 seconds. + uint32_t bucket = hash & 0xFF ; snprintf (GB_jit_temp, GB_jit_temp_allocated, "%s/lock/%02x/%016" PRIx64 "_lock", GB_jit_cache_path, bucket, hash) ; @@ -1797,15 +1860,19 @@ GrB_Info GB_jitifyer_load_worker //---------------------------------------------------------------------- GBURBLE ("(jit: compile and load) ") ; + GB_jit_kcode kcode = encoding->kcode ; + const char *kernel_filetype = + (kcode < GB_JIT_CUDA_KERNEL) ? "c" : "cu" ; // create (or recreate) the kernel source, compile it, and load it - snprintf (GB_jit_temp, GB_jit_temp_allocated, "%s/c/%02x/%s.c", - GB_jit_cache_path, bucket, kernel_name) ; + snprintf (GB_jit_temp, GB_jit_temp_allocated, "%s/c/%02x/%s.%s", + GB_jit_cache_path, bucket, kernel_name, kernel_filetype) ; FILE *fp = fopen (GB_jit_temp, "w") ; if (fp != NULL) { // create the preface - GB_macrofy_preface (fp, kernel_name, GB_jit_C_preface) ; + GB_macrofy_preface (fp, kernel_name, + GB_jit_C_preface, GB_jit_CUDA_preface, kcode) ; // macrofy the kernel operators, types, and matrix formats GB_macrofy_family (fp, family, encoding->code, semiring, monoid, op, type1, type2, type3) ; @@ -1814,12 +1881,14 @@ GrB_Info GB_jitifyer_load_worker "#define GB_jit_kernel %s\n" "#define GB_jit_query %s_query\n" "#endif\n" - "#include \"GB_jit_kernel_%s.c\"\n", - kernel_name, kernel_name, kname) ; + "#include \"GB_jit_kernel_%s.%s\"\n", + kernel_name, kernel_name, kname, + kernel_filetype) ; + // macrofy the query function bool builtin = (encoding->suffix_len == 0) ; GB_macrofy_query (fp, builtin, monoid, op1, op2, type1, type2, - type3, hash) ; + type3, hash, kcode) ; fclose (fp) ; } @@ -1827,16 +1896,22 @@ GrB_Info GB_jitifyer_load_worker // gracefully fail. // compile the kernel to get the lib*.so file - if (GB_jit_use_cmake) + if (kcode >= GB_JIT_CUDA_KERNEL) + { + // use NVCC to directly compile the CUDA kernel + GB_jitifyer_nvcc_compile (kernel_name, bucket) ; + } + else if (GB_jit_use_cmake) { - // use cmake to compile the kernel + // use cmake to compile the CPU kernel GB_jitifyer_cmake_compile (kernel_name, hash) ; } else { - // use the compiler to directly compile the kernel + // use the compiler to directly compile the CPU kernel GB_jitifyer_direct_compile (kernel_name, bucket) ; } + // load the kernel from the lib*.so file snprintf (GB_jit_temp, GB_jit_temp_allocated, "%s/lib/%02x/%s%s%s", GB_jit_cache_path, bucket, GB_LIB_PREFIX, kernel_name, @@ -1865,7 +1940,7 @@ GrB_Info GB_jitifyer_load_worker } //-------------------------------------------------------------------------- - // get the jit_kernel_function pointer + // get the GB_jit_kernel function pointer //-------------------------------------------------------------------------- (*dl_function) = GB_file_dlsym (dl_handle, "GB_jit_kernel") ; @@ -2314,6 +2389,87 @@ void GB_jitifyer_cmake_compile (char *kernel_name, uint64_t hash) #endif } +//------------------------------------------------------------------------------ +// GB_jitifyer_nvcc_compile: compile a CUDA kernel with NVRTC +//------------------------------------------------------------------------------ + +// Compiles a CUDA JIT kernel in a *.cu file, containing host code that +// launches one or more device kernels. + +// The input file has the form: +// +// %s/c/%02x/%s or [cache_path]/c/[bucket]/[kernel_name].cu +// +// and the libary file is linked as +// +// %s/lib/%02x/lib%s.so or [cache_path]/lib/[bucket]/lib[kernel_name].so +// +// All other temporary files (including *.o object files) are removed. + +void GB_jitifyer_nvcc_compile (char *kernel_name, uint32_t bucket) +{ + +#if defined ( GRAPHBLAS_HAS_CUDA ) && !defined ( NJIT ) + + char *burble_stdout = GB_Global_burble_get ( ) ? "" : GB_DEV_NULL ; + char *err_redirect = (strlen (GB_jit_error_log) > 0) ? " 2>> " : "" ; + + GBURBLE ("(jit compiling cuda with nvcc: %s/c/%02x/%s.cu) ", + GB_jit_cache_path, bucket, kernel_name) ; + + snprintf (GB_jit_temp, GB_jit_temp_allocated, + + // compile: + "sh -c \"" // execute with POSIX shell + "nvcc " // compiler command + "-forward-unknown-to-host-compiler " + "-DGB_JIT_RUNTIME=1 " // nvcc flags + "-I/usr/local/cuda/include -std=c++17 -arch=sm_60 -fPIC " + "-I%s/src " // include source directory + "-o %s/c/%02x/%s%s " // *.o output file + "-c %s/c/%02x/%s.cu " // *.cu input file + "%s " // burble stdout + "%s %s ; " // error log file + + // link: + "nvcc " // compiler + "-DGB_JIT_RUNTIME=1 " // nvcc flags + "-I/usr/local/cuda/include -std=c++17 -arch=sm_60 " + " -shared " + "-o %s/lib/%02x/%s%s%s " // lib*.so output file + "%s/c/%02x/%s%s " // *.o input file + " -cudart shared " +// "%s " // libraries to link with (any?) + "%s " // burble stdout + "%s %s\"", // error log file + + // compile: + GB_jit_cache_path, // include source directory (cache/src) + GB_jit_cache_path, bucket, kernel_name, GB_OBJ_SUFFIX, // *.o output file + GB_jit_cache_path, bucket, kernel_name, // *.cu input file + burble_stdout, // burble stdout + err_redirect, GB_jit_error_log, // error log file + + // link: + GB_jit_cache_path, bucket, + GB_LIB_PREFIX, kernel_name, GB_LIB_SUFFIX, // lib*.so file + GB_jit_cache_path, bucket, kernel_name, GB_OBJ_SUFFIX, // *.o input file +// GB_jit_C_libraries // libraries to link with + burble_stdout, // burble stdout + err_redirect, GB_jit_error_log) ; // error log file + + // compile the library and return result + GBURBLE ("\n(jit: %s) ", GB_jit_temp) ; + GB_jitifyer_command (GB_jit_temp) ; // OK: see security comment above + + // remove the *.o file + snprintf (GB_jit_temp, GB_jit_temp_allocated, "%s/c/%02x/%s%s", + GB_jit_cache_path, bucket, kernel_name, GB_OBJ_SUFFIX) ; + remove (GB_jit_temp) ; + +#endif +} + //------------------------------------------------------------------------------ // GB_jitifyer_direct_compile: compile a kernel with just the compiler //------------------------------------------------------------------------------ diff --git a/GraphBLAS/Source/GB_jitifyer.h b/GraphBLAS/Source/GB_jitifyer.h index 7aaefde893..cd75830a2b 100644 --- a/GraphBLAS/Source/GB_jitifyer.h +++ b/GraphBLAS/Source/GB_jitifyer.h @@ -169,6 +169,25 @@ typedef enum GB_JIT_KERNEL_CONVERTBITMAP = 85, // GB_convert_bitmap_worker GB_JIT_KERNEL_EXPANDISO = 86, // GB_expand_iso GB_JIT_KERNEL_SORT = 87, // GB_sort + + //-------------------------------------------------------------------------- + // future:: CUDA kernels + //-------------------------------------------------------------------------- + + GB_JIT_CUDA_KERNEL = 1000, // no CUDA kernel + + // reduce to scalar in CUDA + GB_JIT_CUDA_KERNEL_REDUCE = 1001, // GB_cuda_reduce_to_scalar + + // C = A*B, except for row/col scale (which are ewise methods) + // ... + GB_JIT_CUDA_KERNEL_AXB_DOT3 = 1004, // GB_cuda_AxB_dot3 + + // ewise methods: + // ... + GB_JIT_CUDA_KERNEL_ROWSCALE = 1011, + // ... + } GB_jit_kcode ; @@ -326,6 +345,7 @@ bool GB_jitifyer_query void GB_jitifyer_cmake_compile (char *kernel_name, uint64_t hash) ; void GB_jitifyer_direct_compile (char *kernel_name, uint32_t bucket) ; +void GB_jitifyer_nvcc_compile (char *kernel_name, uint32_t bucket) ; GrB_Info GB_jitifyer_init (void) ; // initialize the JIT @@ -372,6 +392,10 @@ const char *GB_jitifyer_get_C_preface (void) ; GrB_Info GB_jitifyer_set_C_preface (const char *new_C_preface) ; GrB_Info GB_jitifyer_set_C_preface_worker (const char *new_C_preface) ; +const char *GB_jitifyer_get_CUDA_preface (void) ; +GrB_Info GB_jitifyer_set_CUDA_preface (const char *new_CUDA_preface) ; +GrB_Info GB_jitifyer_set_CUDA_preface_worker (const char *new_CUDA_preface) ; + const char *GB_jitifyer_get_error_log (void) ; GrB_Info GB_jitifyer_set_error_log (const char *new_error_log) ; GrB_Info GB_jitifyer_set_error_log_worker (const char *new_error_log) ; diff --git a/GraphBLAS/Source/GB_macrofy_assign.c b/GraphBLAS/Source/GB_macrofy_assign.c index 776faf2583..4517fa023c 100644 --- a/GraphBLAS/Source/GB_macrofy_assign.c +++ b/GraphBLAS/Source/GB_macrofy_assign.c @@ -176,7 +176,7 @@ void GB_macrofy_assign // construct all macros for GrB_assign { fprintf (fp, "\n// accum operator:\n") ; GB_macrofy_binop (fp, "GB_ACCUM_OP", false, true, false, accum_ecode, - C_iso, accum, NULL, NULL) ; + C_iso, accum, NULL, NULL, NULL) ; char *yname = "ywork" ; diff --git a/GraphBLAS/Source/GB_macrofy_binop.c b/GraphBLAS/Source/GB_macrofy_binop.c index 3d170bf2a8..08cb51d91a 100644 --- a/GraphBLAS/Source/GB_macrofy_binop.c +++ b/GraphBLAS/Source/GB_macrofy_binop.c @@ -8,6 +8,7 @@ //------------------------------------------------------------------------------ #include "GB.h" +#include "GB_math.h" #include "GB_stringify.h" #include @@ -25,8 +26,9 @@ void GB_macrofy_binop bool C_iso, // if true: C is iso GrB_BinaryOp op, // NULL if C is iso // output: - const char **f_handle, - const char **u_handle + const char **f_handle, // basic expression z=f(x,y) + const char **u_handle, // update z=f(z,y) for the CPU + const char **g_handle // update z=f(z,y) for the GPU (if different) ) { @@ -758,10 +760,11 @@ void GB_macrofy_binop } //-------------------------------------------------------------------------- - // return the u and f expressions + // return the u, f, and g expressions //-------------------------------------------------------------------------- if (u_handle != NULL) (*u_handle) = u ; if (f_handle != NULL) (*f_handle) = f ; + if (g_handle != NULL) (*g_handle) = g ; } diff --git a/GraphBLAS/Source/GB_macrofy_build.c b/GraphBLAS/Source/GB_macrofy_build.c index 1c824908d4..2f3b481283 100644 --- a/GraphBLAS/Source/GB_macrofy_build.c +++ b/GraphBLAS/Source/GB_macrofy_build.c @@ -85,7 +85,7 @@ void GB_macrofy_build // construct all macros for GB_build fprintf (fp, "\n// binary dup operator:\n") ; GB_macrofy_binop (fp, "GB_DUP", false, true, false, dup_ecode, false, dup, - NULL, NULL) ; + NULL, NULL, NULL) ; fprintf (fp, "\n// build copy/dup methods:\n") ; diff --git a/GraphBLAS/Source/GB_macrofy_cast_expression.c b/GraphBLAS/Source/GB_macrofy_cast_expression.c index 566ec1b071..001f26c9cf 100644 --- a/GraphBLAS/Source/GB_macrofy_cast_expression.c +++ b/GraphBLAS/Source/GB_macrofy_cast_expression.c @@ -10,6 +10,7 @@ // Return a typecast expression to cast from xtype to ztype. #include "GB.h" +#include "GB_math.h" #include "GB_stringify.h" const char *GB_macrofy_cast_expression // return cast expression diff --git a/GraphBLAS/Source/GB_macrofy_ewise.c b/GraphBLAS/Source/GB_macrofy_ewise.c index 5f9ea7cb10..95168262a5 100644 --- a/GraphBLAS/Source/GB_macrofy_ewise.c +++ b/GraphBLAS/Source/GB_macrofy_ewise.c @@ -128,7 +128,7 @@ void GB_macrofy_ewise // construct all macros for GrB_eWise fprintf (fp, "\n// binary operator%s:\n", flipxy ? " (flipped)" : "") ; GB_macrofy_binop (fp, "GB_BINOP", flipxy, false, true, binop_ecode, C_iso, - binaryop, NULL, NULL) ; + binaryop, NULL, NULL, NULL) ; if (binaryop->opcode == GB_SECOND_binop_code) { diff --git a/GraphBLAS/Source/GB_macrofy_monoid.c b/GraphBLAS/Source/GB_macrofy_monoid.c index 46538ed278..a4fe05120b 100644 --- a/GraphBLAS/Source/GB_macrofy_monoid.c +++ b/GraphBLAS/Source/GB_macrofy_monoid.c @@ -24,7 +24,8 @@ void GB_macrofy_monoid // construct the macros for a monoid // semiring, times is normally a terminal monoid, but // it's not worth exploiting in GrB_mxm. // output: - const char **u_expression + const char **u_expression, + const char **g_expression ) { @@ -39,7 +40,7 @@ void GB_macrofy_monoid // construct the macros for a monoid //-------------------------------------------------------------------------- GB_macrofy_binop (fp, "GB_ADD", false, true, false, add_ecode, C_iso, - op, NULL, u_expression) ; + op, NULL, u_expression, g_expression) ; //-------------------------------------------------------------------------- // create macros for the identity value @@ -260,6 +261,7 @@ void GB_macrofy_monoid // construct the macros for a monoid // create macros for atomics on the CPU //-------------------------------------------------------------------------- + fprintf (fp, "#define GB_Z_SIZE %d\n", (int) zsize) ; fprintf (fp, "#define GB_Z_NBITS %d\n", 8 * (int) zsize) ; // atomic write diff --git a/GraphBLAS/Source/GB_macrofy_multadd.c b/GraphBLAS/Source/GB_macrofy_multadd.c new file mode 100644 index 0000000000..f739b65752 --- /dev/null +++ b/GraphBLAS/Source/GB_macrofy_multadd.c @@ -0,0 +1,47 @@ +//------------------------------------------------------------------------------ +// GB_macrofy_multadd: create a fused multiply-add operator +//------------------------------------------------------------------------------ + +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +//------------------------------------------------------------------------------ + +#include "GB.h" +#include "GB_stringify.h" + +void GB_macrofy_multadd +( + FILE *fp, + const char *update_expression, // has the form "z = f(z,y)" + const char *multiply_expression, // has the form "z = mult(x,y)" + bool flipxy +) +{ + + // CPU kernels can use the fused multiply-add + if (flipxy) + { + fprintf (fp, "#define GB_MULTADD(z,y,x,j,k,i) ") ; + } + else + { + fprintf (fp, "#define GB_MULTADD(z,x,y,i,k,j) ") ; + } + for (const char *p = update_expression ; (*p) != '\0' ; p++) + { + // all update operators have a single 'y' + if ((*p) == 'y') + { + // inject the multiply operator; all have the form "z = ..." + fprintf (fp, "%s", multiply_expression + 4) ; + } + else + { + // otherwise, print the update operator character + fprintf (fp, "%c", (*p)) ; + } + } + fprintf (fp, "\n") ; +} + diff --git a/GraphBLAS/Source/GB_macrofy_mxm.c b/GraphBLAS/Source/GB_macrofy_mxm.c index 58d917f3bd..919025e27c 100644 --- a/GraphBLAS/Source/GB_macrofy_mxm.c +++ b/GraphBLAS/Source/GB_macrofy_mxm.c @@ -2,7 +2,7 @@ // GB_macrofy_mxm: construct all macros for a semiring //------------------------------------------------------------------------------ -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 //------------------------------------------------------------------------------ @@ -10,10 +10,14 @@ #include "GB.h" #include "GB_stringify.h" -void GB_macrofy_mxm // construct all macros for GrB_mxm +//------------------------------------------------------------------------------ +// GB_macrofy_mxm: create all macros for GrB_mxm +//------------------------------------------------------------------------------ + +void GB_macrofy_mxm // construct all macros for GrB_mxm ( // output: - FILE *fp, // target file to write, already open + FILE *fp, // target file to write, already open // input: uint64_t scode, GrB_Semiring semiring, // the semiring to macrofy @@ -109,10 +113,10 @@ void GB_macrofy_mxm // construct all macros for GrB_mxm bool is_positional = GB_IS_BINARYOP_CODE_POSITIONAL (mult->opcode) ; fprintf (fp, "\n// monoid:\n") ; - const char *u_expr ; + const char *u_expr, *g_expr ; GB_macrofy_type (fp, "Z", "_", (zcode == 0) ? "GB_void" : ztype->name) ; GB_macrofy_monoid (fp, add_ecode, id_ecode, term_ecode, C_iso, monoid, - is_positional, &u_expr) ; + is_positional, &u_expr, &g_expr) ; //-------------------------------------------------------------------------- // construct macros for the multiply operator @@ -122,7 +126,7 @@ void GB_macrofy_mxm // construct all macros for GrB_mxm flipxy ? " (flipped)" : "") ; const char *f_expr ; GB_macrofy_binop (fp, "GB_MULT", flipxy, false, false, mult_ecode, C_iso, - mult, &f_expr, NULL) ; + mult, &f_expr, NULL, NULL) ; //-------------------------------------------------------------------------- // multiply-add operator @@ -165,29 +169,20 @@ void GB_macrofy_mxm // construct all macros for GrB_mxm // Since GB_MULT is not used, the fused GB_MULTADD must handle flipxy. - if (flipxy) - { - fprintf (fp, "#define GB_MULTADD(z,y,x,j,k,i) ") ; + if (g_expr == NULL) + { + // the CPU and GPU use the same macro + GB_macrofy_multadd (fp, u_expr, f_expr, flipxy) ; } else - { - fprintf (fp, "#define GB_MULTADD(z,x,y,i,k,j) ") ; - } - for (const char *p = u_expr ; (*p) != '\0' ; p++) { - // all update operators have a single 'y' - if ((*p) == 'y') - { - // inject the multiply operator; all have the form "z = ..." - fprintf (fp, "%s", f_expr + 4) ; - } - else - { - // otherwise, print the update operator character - fprintf (fp, "%c", (*p)) ; - } + // the CPU uses u_expr, and GPU uses g_expr + fprintf (fp, "#ifdef GB_CUDA_KERNEL\n") ; + GB_macrofy_multadd (fp, g_expr, f_expr, flipxy) ; + fprintf (fp, "#else\n") ; + GB_macrofy_multadd (fp, u_expr, f_expr, flipxy) ; + fprintf (fp, "#endif\n") ; } - fprintf (fp, "\n") ; } else diff --git a/GraphBLAS/Source/GB_macrofy_preface.c b/GraphBLAS/Source/GB_macrofy_preface.c index 0ad00c6f07..25363e5b75 100644 --- a/GraphBLAS/Source/GB_macrofy_preface.c +++ b/GraphBLAS/Source/GB_macrofy_preface.c @@ -14,9 +14,11 @@ void GB_macrofy_preface ( FILE *fp, // target file to write, already open char *kernel_name, // name of the kernel - char *preface // user-provided preface + char *C_preface, // user-provided preface for CPU JIT kernels + char *CUDA_preface, // user-provided preface for CUDA JIT kernels + GB_jit_kcode kcode ) -{ +{ const char *date = GxB_IMPLEMENTATION_DATE ; int len = (int) strlen (date) ; @@ -32,14 +34,25 @@ void GB_macrofy_preface "// The above copyright and license do not apply to any\n" "// user-defined types and operators defined below.\n" "//--------------------------------------" - "----------------------------------------\n" - "%s\n" - "#include \"GB_jit_kernel.h\"\n\n", + "----------------------------------------\n", kernel_name, GxB_IMPLEMENTATION_MAJOR, GxB_IMPLEMENTATION_MINOR, GxB_IMPLEMENTATION_SUB, - date + GB_IMAX (0, len - 4), - preface) ; + date + GB_IMAX (0, len - 4)) ; + + if (kcode >= GB_JIT_CUDA_KERNEL) + { + // for CUDA JIT kernels + fprintf (fp, "#define GB_CUDA_KERNEL\n%s\n", CUDA_preface) ; + } + else + { + // CPU JIT kernels + fprintf (fp, "%s\n", C_preface) ; + } + + // for all kernels: CPU and CUDA + fprintf (fp, "#include \"GB_jit_kernel.h\"\n\n") ; } diff --git a/GraphBLAS/Source/GB_macrofy_query.c b/GraphBLAS/Source/GB_macrofy_query.c index 87680f6190..c6ed31bbe8 100644 --- a/GraphBLAS/Source/GB_macrofy_query.c +++ b/GraphBLAS/Source/GB_macrofy_query.c @@ -20,7 +20,8 @@ void GB_macrofy_query GrB_Type type0, GrB_Type type1, GrB_Type type2, - uint64_t hash // hash code for the kernel + uint64_t hash, // hash code for the kernel + GB_jit_kcode kcode ) { @@ -28,8 +29,21 @@ void GB_macrofy_query // create the function header, and query the version //-------------------------------------------------------------------------- - fprintf (fp, - "GB_JIT_GLOBAL GB_JIT_QUERY_PROTO (GB_jit_query) ;\n" + if (kcode >= GB_JIT_CUDA_KERNEL) + { + // ensure the query function can be called from a C function + fprintf (fp, "extern \"C\"\n{\n") ; + } + + fprintf (fp, + "GB_JIT_GLOBAL GB_JIT_QUERY_PROTO (GB_jit_query) ;\n") ; + + if (kcode >= GB_JIT_CUDA_KERNEL) + { + fprintf (fp, "}\n") ; + } + + fprintf (fp, "GB_JIT_GLOBAL GB_JIT_QUERY_PROTO (GB_jit_query)\n" "{\n" " (*hash) = 0x%016" PRIx64 " ;\n" diff --git a/GraphBLAS/Source/GB_macrofy_reduce.c b/GraphBLAS/Source/GB_macrofy_reduce.c index 8c3f225f56..3ca25ac043 100644 --- a/GraphBLAS/Source/GB_macrofy_reduce.c +++ b/GraphBLAS/Source/GB_macrofy_reduce.c @@ -63,7 +63,7 @@ void GB_macrofy_reduce // construct all macros for GrB_reduce to scalar fprintf (fp, "\n// monoid:\n") ; GB_macrofy_type (fp, "Z", "_", monoid->op->ztype->name) ; GB_macrofy_monoid (fp, red_ecode, id_ecode, term_ecode, false, monoid, - false, NULL) ; + false, NULL, NULL) ; fprintf (fp, "#define GB_GETA_AND_UPDATE(z,Ax,p)") ; if (atype == monoid->op->ztype) diff --git a/GraphBLAS/Source/GB_macrofy_unop.c b/GraphBLAS/Source/GB_macrofy_unop.c index 3f074e527e..2c8658c627 100644 --- a/GraphBLAS/Source/GB_macrofy_unop.c +++ b/GraphBLAS/Source/GB_macrofy_unop.c @@ -16,6 +16,7 @@ // #define GB_UNARYOP(z,x,j,i,y) z = f (x,i,j,y) #include "GB.h" +#include "GB_math.h" #include "GB_stringify.h" #include diff --git a/GraphBLAS/Source/GB_mask.h b/GraphBLAS/Source/GB_mask.h index 27c6338f77..5033419bb3 100644 --- a/GraphBLAS/Source/GB_mask.h +++ b/GraphBLAS/Source/GB_mask.h @@ -10,6 +10,7 @@ #ifndef GB_MASK_H #define GB_MASK_H #include "GB.h" +#include "GB_math.h" GrB_Info GB_mask // C = Z ( diff --git a/GraphBLAS/Source/GB_math.c b/GraphBLAS/Source/GB_math.c index e4a6c1cf3b..c34f57ee11 100644 --- a/GraphBLAS/Source/GB_math.c +++ b/GraphBLAS/Source/GB_math.c @@ -8,6 +8,7 @@ //------------------------------------------------------------------------------ #include "GB.h" +#include "GB_math.h" #if !GB_HAS_CMPLX_MACROS // complex constructors when the C compiler does not provide CMPLX and CMPLXF diff --git a/GraphBLAS/Source/GB_math.h b/GraphBLAS/Source/GB_math.h index 559cdf16e2..8720efd778 100644 --- a/GraphBLAS/Source/GB_math.h +++ b/GraphBLAS/Source/GB_math.h @@ -7,6 +7,8 @@ //------------------------------------------------------------------------------ +#include "GB_casting.h" + #ifndef GB_MATH_H #define GB_MATH_H @@ -296,9 +298,6 @@ inline uint64_t GB_idiv_uint64 (uint64_t x, uint64_t y) // Three cases below are from ACM Algo 116, R. L. Smith, 1962. -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA - inline GxB_FC64_t GB_FC64_div (GxB_FC64_t x, GxB_FC64_t y) { double xr = GB_creal (x) ; @@ -401,8 +400,6 @@ inline GxB_FC32_t GB_FC32_div (GxB_FC32_t x, GxB_FC32_t y) " return (GJ_CMPLX32 ((float) GB_creal(zz), (float) GB_cimag(zz))) ; \n" \ "}" -#endif - //------------------------------------------------------------------------------ // z = x^y: wrappers for pow, powf, cpow, and cpowf //------------------------------------------------------------------------------ @@ -484,9 +481,6 @@ inline double GB_pow (double x, double y) " return (pow (x, y)) ; \n" \ "}" -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA - inline GxB_FC32_t GB_FC32_pow (GxB_FC32_t x, GxB_FC32_t y) { float xr = GB_crealf (x) ; @@ -608,7 +602,6 @@ inline GxB_FC64_t GB_FC64_pow (GxB_FC64_t x, GxB_FC64_t y) " } \n" \ " return (GB_cpow (x, y)) ; \n" \ "}" -#endif inline int8_t GB_pow_int8 (int8_t x, int8_t y) { @@ -792,9 +785,6 @@ inline double GB_signum (double x) " return ((double) ((x < 0) ? (-1) : ((x > 0) ? 1 : 0))) ; \n" \ "}" -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA - inline GxB_FC32_t GB_csignumf (GxB_FC32_t x) { if (GB_crealf (x) == 0 && GB_cimagf (x) == 0) @@ -1258,5 +1248,3 @@ inline bool GB_cisfinite (GxB_FC64_t x) #endif -#endif - diff --git a/GraphBLAS/Source/GB_ops.c b/GraphBLAS/Source/GB_ops.c index ccd8749bb5..58c61e51ec 100644 --- a/GraphBLAS/Source/GB_ops.c +++ b/GraphBLAS/Source/GB_ops.c @@ -11,6 +11,8 @@ // operators, index_unary operators, binary operators, monoids, and semirings. #include "GB.h" +#include "GB_math.h" +#include "GB_ops.h" //------------------------------------------------------------------------------ // compiler flags @@ -22,9 +24,7 @@ #pragma warning (disable: 144 ) #elif GB_COMPILER_GCC // disable gcc warnings - #if !defined ( __cplusplus ) #pragma GCC diagnostic ignored "-Wincompatible-pointer-types" - #endif #elif GB_COMPILER_MSC // disable MS Visual Studio warnings GB_PRAGMA (warning (disable : 4146 )) diff --git a/GraphBLAS/Source/GB_ops.h b/GraphBLAS/Source/GB_ops.h index d938bda669..0745ec3a64 100644 --- a/GraphBLAS/Source/GB_ops.h +++ b/GraphBLAS/Source/GB_ops.h @@ -7,6 +7,10 @@ //------------------------------------------------------------------------------ +#ifdef __cplusplus +#error "not used for C++" +#endif + #ifndef GB_OPS_H #define GB_OPS_H @@ -106,9 +110,6 @@ inline void GB_nonzombie_func (bool *z, const void *x, #define GB_DOUBLE #include "GB_ops_template.h" -#if !defined ( GBCUDA_CPLUSPLUS ) -// TODO: does not yet work in CUDA - #define GB_TYPE GxB_FC32_t #define GB_XTYPE FC32 #define GB_BITS 64 @@ -127,5 +128,3 @@ inline void GB_nonzombie_func (bool *z, const void *x, #endif -#endif - diff --git a/GraphBLAS/Source/GB_reduce_to_scalar.c b/GraphBLAS/Source/GB_reduce_to_scalar.c index 838c5c5259..d743f6b9a8 100644 --- a/GraphBLAS/Source/GB_reduce_to_scalar.c +++ b/GraphBLAS/Source/GB_reduce_to_scalar.c @@ -114,7 +114,7 @@ GrB_Info GB_reduce_to_scalar // z = reduce_to_scalar (A) //---------------------------------------------------------------------- GrB_Matrix V = NULL ; - info = GB_cuda_reduce_to_scalar_jit (z, &V, monoid, A) ; + info = GB_cuda_reduce_to_scalar (z, &V, monoid, A) ; if (V != NULL) { @@ -137,12 +137,12 @@ GrB_Info GB_reduce_to_scalar // z = reduce_to_scalar (A) } } - // GB_cuda_reduce_to_scalar_jit may refuse to do the reduction and + // GB_cuda_reduce_to_scalar may refuse to do the reduction and // indicate this by returning GrB_NO_VALUE. If so, the CPU will do it // below. if (!(info == GrB_SUCCESS || info == GrB_NO_VALUE)) { - // GB_cuda_reduce_to_scalar_jit has returned an error + // GB_cuda_reduce_to_scalar has returned an error // (out of memory, or other error) return (info) ; } diff --git a/GraphBLAS/Source/GB_reduce_to_scalar_jit.c b/GraphBLAS/Source/GB_reduce_to_scalar_jit.c index 05ceaf6fb5..991c48b0e9 100644 --- a/GraphBLAS/Source/GB_reduce_to_scalar_jit.c +++ b/GraphBLAS/Source/GB_reduce_to_scalar_jit.c @@ -32,7 +32,8 @@ GrB_Info GB_reduce_to_scalar_jit // z = reduce_to_scalar (A) via the JIT GB_jit_encoding encoding ; char *suffix ; - uint64_t hash = GB_encodify_reduce (&encoding, &suffix, monoid, A) ; + uint64_t hash = GB_encodify_reduce (&encoding, &suffix, + GB_JIT_KERNEL_REDUCE, monoid, A) ; //-------------------------------------------------------------------------- // get the kernel function pointer, loading or compiling it if needed diff --git a/GraphBLAS/Source/GB_select.h b/GraphBLAS/Source/GB_select.h index 7c5e6598da..e049edd6af 100644 --- a/GraphBLAS/Source/GB_select.h +++ b/GraphBLAS/Source/GB_select.h @@ -10,6 +10,7 @@ #ifndef GB_SELECT_H #define GB_SELECT_H #include "GB.h" +#include "GB_math.h" #include "GB_is_nonzero.h" GrB_Info GB_select // C = accum (C, select(A,k)) or select(A',k) diff --git a/GraphBLAS/Source/GB_stringify.h b/GraphBLAS/Source/GB_stringify.h index 9b54b3d55d..630fcac01b 100644 --- a/GraphBLAS/Source/GB_stringify.h +++ b/GraphBLAS/Source/GB_stringify.h @@ -22,7 +22,9 @@ void GB_macrofy_preface ( FILE *fp, // target file to write, already open char *kernel_name, // name of the kernel - char *preface // user-provided preface + char *C_preface, // user-provided preface for CPU JIT kernels + char *CUDA_preface, // user-provided preface for CUDA JIT kernels + GB_jit_kcode kcode ) ; //------------------------------------------------------------------------------ @@ -73,6 +75,7 @@ uint64_t GB_encodify_reduce // encode a GrB_reduce problem // except for the suffix char **suffix, // suffix for user-defined kernel // input: + const GB_jit_kcode kcode, // kernel to encode GrB_Monoid monoid, // the monoid to enumify GrB_Matrix A // input matrix to reduce ) ; @@ -422,10 +425,10 @@ void GB_enumify_mxm // enumerate a GrB_mxm problem GrB_Matrix B ) ; -void GB_macrofy_mxm // construct all macros for GrB_mxm +void GB_macrofy_mxm // construct all macros for GrB_mxm ( // output: - FILE *fp, // target file to write, already open + FILE *fp, // target file to write, already open // input: uint64_t scode, GrB_Semiring semiring, // the semiring to macrofy @@ -434,6 +437,14 @@ void GB_macrofy_mxm // construct all macros for GrB_mxm GrB_Type btype ) ; +void GB_macrofy_multadd +( + FILE *fp, + const char *update_expression, // has the form "z = f(z,y)" + const char *multiply_expression, // has the form "z = mult(x,y)" + bool flipxy +) ; + GrB_Info GB_AxB_saxpy3_jit // C=A*B, saxpy3, via the JIT ( // input/output: @@ -639,7 +650,8 @@ void GB_macrofy_monoid // construct the macros for a monoid // semiring, times is normally a terminal monoid, but // it's not worth exploiting in GrB_mxm. // output: - const char **u_expression + const char **u_expression, + const char **g_expression ) ; bool GB_enumify_cuda_atomic // return true if CUDA can do it atomically @@ -665,7 +677,8 @@ void GB_macrofy_query GrB_Type type0, GrB_Type type1, GrB_Type type2, - uint64_t hash // hash code for the kernel + uint64_t hash, // hash code for the kernel + GB_jit_kcode kcode ) ; //------------------------------------------------------------------------------ @@ -687,16 +700,18 @@ void GB_macrofy_binop FILE *fp, // input: const char *macro_name, - bool flipxy, // if true: op is f(y,x) + bool flipxy, // if true: op is f(y,x) for a semiring bool is_monoid_or_build, // if true: additive operator for monoid, - // or binary op for GrB_Matrix_build + // or binary op for GrB_Matrix_build, or + // accum operator bool is_ewise, // if true: binop for ewise methods int ecode, bool C_iso, // if true: C is iso GrB_BinaryOp op, // NULL if C is iso // output: - const char **f_handle, - const char **u_handle + const char **f_handle, // basic expression z=f(x,y) + const char **u_handle, // update z=f(z,y) for the CPU + const char **g_handle // update z=f(z,y) for the GPU (if different) ) ; //------------------------------------------------------------------------------ diff --git a/GraphBLAS/Source/GrB_Global_get.c b/GraphBLAS/Source/GrB_Global_get.c index 31850b9e39..9bfb095a86 100644 --- a/GraphBLAS/Source/GrB_Global_get.c +++ b/GraphBLAS/Source/GrB_Global_get.c @@ -306,6 +306,11 @@ static GrB_Info GB_global_string_get (const char **value, int field) (*value) = GB_jitifyer_get_C_preface ( ) ; break ; + case GxB_JIT_CUDA_PREFACE : + + (*value) = GB_jitifyer_get_CUDA_preface ( ) ; + break ; + case GxB_JIT_ERROR_LOG : (*value) = GB_jitifyer_get_error_log ( ) ; diff --git a/GraphBLAS/Source/GrB_Global_set.c b/GraphBLAS/Source/GrB_Global_set.c index d8897cf680..540b69d06e 100644 --- a/GraphBLAS/Source/GrB_Global_set.c +++ b/GraphBLAS/Source/GrB_Global_set.c @@ -202,6 +202,10 @@ GrB_Info GrB_Global_set_String return (GB_jitifyer_set_C_preface (value)) ; + case GxB_JIT_CUDA_PREFACE : + + return (GB_jitifyer_set_CUDA_preface (value)) ; + case GxB_JIT_ERROR_LOG : return (GB_jitifyer_set_error_log (value)) ; diff --git a/GraphBLAS/Source/GrB_init.c b/GraphBLAS/Source/GrB_init.c index d0204449d4..c4fe7d0e51 100644 --- a/GraphBLAS/Source/GrB_init.c +++ b/GraphBLAS/Source/GrB_init.c @@ -8,7 +8,11 @@ //------------------------------------------------------------------------------ // GrB_init (or GxB_init) must called before any other GraphBLAS operation. -// GrB_finalize must be called as the last GraphBLAS operation. +// GrB_finalize must be called as the last GraphBLAS operation. To use CUDA +// and its RMM memory manager: use a mode of GxB_BLOCKING_GPU or +// GxB_NONBLOCKING_GPU. + +// FIXME: rename GxB_*BLOCKING_GPU to GxB_*BLOCKING_CUDA. #include "GB.h" #include "GB_init.h" @@ -29,8 +33,17 @@ GrB_Info GrB_init // start up GraphBLAS // initialize GraphBLAS //-------------------------------------------------------------------------- - // default: use the C11 malloc memory manager, which is thread-safe - +#if defined ( GRAPHBLAS_HAS_CUDA ) + if (mode == GxB_BLOCKING_GPU || mode == GxB_NONBLOCKING_GPU) + { + return (GB_init (mode, // blocking or non-blocking mode + // RMM C memory management functions + rmm_wrap_malloc, rmm_wrap_calloc, rmm_wrap_realloc, rmm_wrap_free, + Werk)) ; + } +#endif + + // default: use the C11 malloc memory manager, which is thread-safe return (GB_init (mode, // blocking or non-blocking mode malloc, calloc, realloc, free, // ANSI C memory management functions Werk)) ; diff --git a/GraphBLAS/Source/GxB_Global_Option_get.c b/GraphBLAS/Source/GxB_Global_Option_get.c index 20b41cef7b..226a315fb7 100644 --- a/GraphBLAS/Source/GxB_Global_Option_get.c +++ b/GraphBLAS/Source/GxB_Global_Option_get.c @@ -334,6 +334,11 @@ GrB_Info GxB_Global_Option_get_CHAR // gets the current global option (*value) = GB_jitifyer_get_C_preface ( ) ; break ; + case GxB_JIT_CUDA_PREFACE : + + (*value) = GB_jitifyer_get_CUDA_preface ( ) ; + break ; + case GxB_JIT_ERROR_LOG : (*value) = GB_jitifyer_get_error_log ( ) ; @@ -910,6 +915,17 @@ GrB_Info GxB_Global_Option_get // gets the current global option } break ; + case GxB_JIT_CUDA_PREFACE : + + { + va_start (ap, field) ; + const char **preface = va_arg (ap, const char **) ; + va_end (ap) ; + GB_RETURN_IF_NULL (preface) ; + (*preface) = GB_jitifyer_get_CUDA_preface ( ) ; + } + break ; + case GxB_JIT_C_CONTROL : { diff --git a/GraphBLAS/Source/GxB_Global_Option_set.c b/GraphBLAS/Source/GxB_Global_Option_set.c index ed47db4aeb..05905ddfc2 100644 --- a/GraphBLAS/Source/GxB_Global_Option_set.c +++ b/GraphBLAS/Source/GxB_Global_Option_set.c @@ -267,6 +267,10 @@ GrB_Info GxB_Global_Option_set_CHAR // set a global default option return (GB_jitifyer_set_C_preface (value)) ; + case GxB_JIT_CUDA_PREFACE : + + return (GB_jitifyer_set_CUDA_preface (value)) ; + case GxB_JIT_ERROR_LOG : return (GB_jitifyer_set_error_log (value)) ; @@ -544,6 +548,15 @@ GrB_Info GxB_Global_Option_set // set a global default option return (GB_jitifyer_set_C_preface (C_preface)) ; } + case GxB_JIT_CUDA_PREFACE : + + { + va_start (ap, field) ; + char *CUDA_preface = va_arg (ap, char *) ; + va_end (ap) ; + return (GB_jitifyer_set_CUDA_preface (CUDA_preface)) ; + } + case GxB_JIT_USE_CMAKE : { diff --git a/GraphBLAS/Source/GxB_init.c b/GraphBLAS/Source/GxB_init.c index d1d999caee..fb453ccf50 100644 --- a/GraphBLAS/Source/GxB_init.c +++ b/GraphBLAS/Source/GxB_init.c @@ -53,7 +53,7 @@ GrB_Info GxB_init // start up GraphBLAS and also define malloc, etc ( - GrB_Mode mode, // blocking or non-blocking mode, GPU or not + GrB_Mode mode, // blocking or non-blocking mode // pointers to memory management functions void * (* user_malloc_function ) (size_t), // required diff --git a/GraphBLAS/Source/JitKernels/GB_jit_kernel.h b/GraphBLAS/Source/JitKernels/GB_jit_kernel.h index 826a44cc70..f421485751 100644 --- a/GraphBLAS/Source/JitKernels/GB_jit_kernel.h +++ b/GraphBLAS/Source/JitKernels/GB_jit_kernel.h @@ -1,5 +1,5 @@ //------------------------------------------------------------------------------ -// GB_jit_kernel.h: JIT kernel #include for all kernels +// GB_jit_kernel.h: JIT kernel #include for all kernels (both CPU and CUDA) //------------------------------------------------------------------------------ // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. @@ -13,10 +13,17 @@ #define GB_JIT_KERNEL_H #define GB_JIT_KERNEL -#include "GB_Template.h" -#include "GB_jit_kernel_proto.h" -// for JIT kernels +#ifndef GB_CUDA_KERNEL + // for CPU JIT kernels: + #include "GB_Template.h" +#else + // for CUDA JIT kernels: + #include "GB_cuda_kernel.cuh" +#endif + +// for all JIT kernels +#include "GB_jit_kernel_proto.h" #if defined (_MSC_VER) && !(defined (__INTEL_COMPILER) || defined(__INTEL_CLANG_COMPILER)) #define GB_JIT_GLOBAL extern __declspec ( dllexport ) #else @@ -24,7 +31,7 @@ #endif #ifndef GB_JIT_RUNTIME - // for PreJIT kernels + // for PreJIT kernels (CPU and CUDA) #include "GB_callbacks.h" #endif diff --git a/GraphBLAS/Source/Template/GB_Template.h b/GraphBLAS/Source/Template/GB_Template.h index c608047fa7..f89ae26041 100644 --- a/GraphBLAS/Source/Template/GB_Template.h +++ b/GraphBLAS/Source/Template/GB_Template.h @@ -27,6 +27,10 @@ #include "GraphBLAS.h" #undef I +#ifdef GBMATLAB +#undef GRAPHBLAS_HAS_CUDA +#endif + //------------------------------------------------------------------------------ // handle the restrict and 'static inline' keywords //------------------------------------------------------------------------------ diff --git a/GraphBLAS/Source/Template/GB_jit_kernel_proto.h b/GraphBLAS/Source/Template/GB_jit_kernel_proto.h index 47b2fb6ed8..5c260789ab 100644 --- a/GraphBLAS/Source/Template/GB_jit_kernel_proto.h +++ b/GraphBLAS/Source/Template/GB_jit_kernel_proto.h @@ -15,7 +15,7 @@ //------------------------------------------------------------------------------ #define GB_JIT_QUERY_PROTO(query_func) \ -bool query_func (uint64_t *hash, int v [3], char *defn [5], \ +bool query_func (uint64_t *hash, int v [3], const char *defn [5], \ void *id, void *term, size_t id_size, size_t term_size) #define GB_JIT_KERNEL_USER_OP_PROTO(GB_jit_kernel_user_op) \ @@ -557,6 +557,34 @@ GrB_Info GB_jit_kernel_union \ const bool M_is_B \ ) +//------------------------------------------------------------------------------ +// CUDA JIT prototypes +//------------------------------------------------------------------------------ + +#define GB_JIT_CUDA_KERNEL_REDUCE_PROTO(GB_jit_kernel_reduce) \ +GrB_Info GB_jit_kernel_reduce \ +( \ + GB_void *zscalar, \ + GrB_Matrix V, \ + const GrB_Matrix A, \ + cudaStream_t stream, \ + int32_t gridsz, \ + int32_t blocksz \ +) + +#define GB_JIT_CUDA_KERNEL_DOT3_PROTO(GB_jit_kernel_AxB_dot3) \ +GrB_Info GB_jit_kernel_AxB_dot3 \ +( \ + GrB_Matrix C, \ + const GrB_Matrix M, \ + const GrB_Matrix A, \ + const GrB_Matrix B, \ + cudaStream_t stream, \ + int device, \ + int number_of_sms, \ + const GB_callback_struct *restrict my_callback \ +) + //------------------------------------------------------------------------------ // shorthand macros for GB_prejit.c: //------------------------------------------------------------------------------ @@ -603,5 +631,12 @@ GrB_Info GB_jit_kernel_union \ #define JIT_UTYP(g) GB_JIT_KERNEL_USER_TYPE_PROTO(g) ; #define JIT_Q(q) GB_JIT_QUERY_PROTO(q) ; +//------------------------------------------------------------------------------ +// shorthand macros for GB_cuda_prejit.c: +//------------------------------------------------------------------------------ + +#define JIT_CUDA_RED(g) GB_JIT_CUDA_KERNEL_REDUCE_PROTO(g) ; +#define JIT_CUDA_DOT3(g) GB_JIT_CUDA_KERNEL_DOT3_PROTO(g) ; + #endif diff --git a/GraphBLAS/Source/codegen_aop.m b/GraphBLAS/Source/codegen_aop.m index 5ebb329e63..709eaecbdb 100644 --- a/GraphBLAS/Source/codegen_aop.m +++ b/GraphBLAS/Source/codegen_aop.m @@ -17,7 +17,7 @@ fprintf (fh, '// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved.\n') ; fprintf (fh, '// SPDX-License-Identifier: Apache-2.0\n\n') ; fprintf (fh, '// This file has been automatically generated from Generator/GB_aop.h') ; -fprintf (fh, '\n\n') ; +fprintf (fh, '\n#include "GB_math.h"\n\n') ; fclose (fh) ; % The ANY operator is not used as a binary operator in the generated functions. diff --git a/GraphBLAS/Source/codegen_as.m b/GraphBLAS/Source/codegen_as.m index 12796e3147..78a741395a 100644 --- a/GraphBLAS/Source/codegen_as.m +++ b/GraphBLAS/Source/codegen_as.m @@ -17,7 +17,7 @@ fprintf (fh, '// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved.\n') ; fprintf (fh, '// SPDX-License-Identifier: Apache-2.0\n\n') ; fprintf (fh, '// This file has been automatically generated from Generator/GB_as.h') ; -fprintf (fh, '\n\n') ; +fprintf (fh, '\n#include "GB_math.h"\n\n') ; fclose (fh) ; codegen_as_template ('bool') ; diff --git a/GraphBLAS/Source/codegen_axb.m b/GraphBLAS/Source/codegen_axb.m index 354aed8efb..b0207b5290 100644 --- a/GraphBLAS/Source/codegen_axb.m +++ b/GraphBLAS/Source/codegen_axb.m @@ -28,7 +28,7 @@ fprintf (fh, '// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved.\n') ; fprintf (fh, '// SPDX-License-Identifier: Apache-2.0\n\n') ; fprintf (fh, '// This file has been automatically generated from Generator/GB_AxB.h') ; - fprintf (fh, '\n\n') ; + fprintf (fh, '\n#include "GB_math.h"\n\n') ; fclose (fh) ; end diff --git a/GraphBLAS/Source/codegen_ew.m b/GraphBLAS/Source/codegen_ew.m index 93ea69ef85..8f705b9b84 100644 --- a/GraphBLAS/Source/codegen_ew.m +++ b/GraphBLAS/Source/codegen_ew.m @@ -17,7 +17,7 @@ fprintf (fh, '// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved.\n') ; fprintf (fh, '// SPDX-License-Identifier: Apache-2.0\n\n') ; fprintf (fh, '// This file has been automatically generated from Generator/GB_ew.h') ; -fprintf (fh, '\n\n') ; +fprintf (fh, '\n#include "GB_math.h"\n\n') ; fclose (fh) ; % The ANY operator is not used as a binary operator in the generated functions. diff --git a/GraphBLAS/Source/codegen_red.m b/GraphBLAS/Source/codegen_red.m index 4b76152909..d48a24747d 100644 --- a/GraphBLAS/Source/codegen_red.m +++ b/GraphBLAS/Source/codegen_red.m @@ -17,7 +17,7 @@ fprintf (fh, '// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved.\n') ; fprintf (fh, '// SPDX-License-Identifier: Apache-2.0\n\n') ; fprintf (fh, '// This file has been automatically generated from Generator/GB_red.h') ; -fprintf (fh, '\n\n') ; +fprintf (fh, '\n#include "GB_math.h"\n\n') ; fclose (fh) ; fh = fopen ('FactoryKernels/GB_bld__include.h', 'w') ; @@ -28,7 +28,7 @@ fprintf (fh, '// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved.\n') ; fprintf (fh, '// SPDX-License-Identifier: Apache-2.0\n\n') ; fprintf (fh, '// This file has been automatically generated from Generator/GB_bld.h') ; -fprintf (fh, '\n\n') ; +fprintf (fh, '\n#include "GB_math.h"\n\n') ; fclose (fh) ; %------------------------------------------------------------------------------- diff --git a/GraphBLAS/Source/codegen_sel.m b/GraphBLAS/Source/codegen_sel.m index 2ff31c8e32..dd41aca256 100644 --- a/GraphBLAS/Source/codegen_sel.m +++ b/GraphBLAS/Source/codegen_sel.m @@ -18,7 +18,7 @@ fprintf (fh, '// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved.\n') ; fprintf (fh, '// SPDX-License-Identifier: Apache-2.0\n\n') ; fprintf (fh, '// This file has been automatically generated from Generator/GB_sel.h') ; -fprintf (fh, '\n\n') ; +fprintf (fh, '\n#include "GB_math.h"\n\n') ; fclose (fh) ; % NONZOMBIE: name selector type diff --git a/GraphBLAS/Source/codegen_unop.m b/GraphBLAS/Source/codegen_unop.m index 9753df6449..45116d7ab1 100644 --- a/GraphBLAS/Source/codegen_unop.m +++ b/GraphBLAS/Source/codegen_unop.m @@ -17,7 +17,7 @@ fprintf (fh, '// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved.\n') ; fprintf (fh, '// SPDX-License-Identifier: Apache-2.0\n\n') ; fprintf (fh, '// This file has been automatically generated from Generator/GB_unop.h') ; -fprintf (fh, '\n\n') ; +fprintf (fh, '\n#include "GB_math.h"\n\n') ; fclose (fh) ; codegen_unop_identity ; diff --git a/GraphBLAS/Tcov/.gitignore b/GraphBLAS/Tcov/.gitignore new file mode 100644 index 0000000000..8faafc0802 --- /dev/null +++ b/GraphBLAS/Tcov/.gitignore @@ -0,0 +1,2 @@ +# ignore these files +log_GB_mex_test21.txt diff --git a/GraphBLAS/Tcov/log_GB_mex_test21.txt b/GraphBLAS/Tcov/log_GB_mex_test21.txt deleted file mode 100644 index 369fe5ae07..0000000000 --- a/GraphBLAS/Tcov/log_GB_mex_test21.txt +++ /dev/null @@ -1,2574 +0,0 @@ - - -================================================================================ -GB_macrofy_cast_output, ztype NULL -#define GB_PUTC(z,Cx,p) - - -================================================================================ -GB_macrofy_cast_output, cast FC64 to bool -#define GB_PUTC(z,Cx,p) Cx [p] = (GB_creal (z) != 0 || GB_cimag (z) != 0) - - -================================================================================ -GB_assign_describe -C = A - - -================================================================================ -GB_enumify_ewise / GB_macrofy_ewise, C iso -// op: symbolic only (C is iso) - -// binary operator types: -#define GB_Z_TYPE void -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// binary operator: -#define GB_BINOP(z,x,y,i,j) -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) -#define GB_COPY_B_to_C(Cx,pC,Bx,pB,B_iso) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE void -#define GB_PUTC(c,Cx,p) -#define GB_EWISEOP(Cx,p,aij,bij,i,j) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 0 -#define GB_B_TYPE bool -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_ewise_shared_definitions.h" - - -================================================================================ -GB_enumify_ewise / GB_macrofy_ewise, C non iso -// op: (and, bool) - -// binary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE bool -#define GB_Y_TYPE bool - -// binary operator: -#define GB_BINOP(z,x,y,i,j) z = ((x) && (y)) -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_B_to_C(Cx,pC,Bx,pB,B_iso) Cx [pC] = Bx [pB] - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(c,Cx,p) Cx [p] = c -#define GB_EWISEOP(Cx,p,aij,bij,i,j) GB_BINOP (Cx [p], aij, bij, i, j) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE bool -#define GB_DECLAREA(a) bool a -#define GB_GETA(a,Ax,p,iso) a = Ax [p] - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 0 -#define GB_B_TYPE bool -#define GB_B2TYPE bool -#define GB_DECLAREB(b) bool b -#define GB_GETB(b,Bx,p,iso) b = Bx [p] - -#include "GB_ewise_shared_definitions.h" - - -================================================================================ -GB_enumify_mxm / GB_macrofy_mxm, C iso -// semiring: symbolic only (C is iso) - -// monoid: -#define GB_Z_TYPE void -#define GB_UPDATE(z,y) -#define GB_ADD(z,x,y) -#define GB_DECLARE_IDENTITY(z) -#define GB_DECLARE_IDENTITY_CONST(z) -#define GB_IS_ANY_MONOID 1 -#define GB_Z_IGNORE_OVERFLOW 1 -#define GB_Z_NBITS 0 -#define GB_Z_ATOMIC_BITS 0 - -// multiplicative operator (flipped): -#define GB_MULT(z,x,y,i,k,j) - -// multiply-add operator: -#define GB_MULTADD(z,x,y,i,k,j) - -// special cases: - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(c,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 1 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 1 -#define GB_B_IS_PATTERN 1 -#define GB_B_TYPE void -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_mxm_shared_definitions.h" - - -================================================================================ -GB_enumify_mxm / GB_macrofy_mxm, any_pair, flipxy -// semiring: symbolic only (C is iso) - -// monoid: -#define GB_Z_TYPE void -#define GB_UPDATE(z,y) -#define GB_ADD(z,x,y) -#define GB_DECLARE_IDENTITY(z) -#define GB_DECLARE_IDENTITY_CONST(z) -#define GB_IS_ANY_MONOID 1 -#define GB_Z_NBITS 0 -#define GB_Z_ATOMIC_BITS 0 - -// multiplicative operator (flipped): -#define GB_MULT(z,x,y,i,k,j) - -// multiply-add operator: -#define GB_MULTADD(z,x,y,i,k,j) - -// special cases: -#define GB_IS_ANY_PAIR_SEMIRING 1 -#define GB_IS_PAIR_MULTIPLIER 1 - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE void -#define GB_PUTC(c,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 1 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 1 -#define GB_B_IS_PATTERN 1 -#define GB_B_TYPE void -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_mxm_shared_definitions.h" - - -================================================================================ -GB_enumify_mxm / GB_macrofy_mxm, any_pair fp32 -// semiring: (any, pair (flipped), float) - -// monoid: -#define GB_Z_TYPE float -#define GB_ADD(z,x,y) z = y -#define GB_UPDATE(z,y) z = y -#define GB_DECLARE_IDENTITY(z) float z = 0 -#define GB_DECLARE_IDENTITY_CONST(z) const float z = 0 -#define GB_HAS_IDENTITY_BYTE 1 -#define GB_IDENTITY_BYTE 0x00 -#define GB_IS_ANY_MONOID 1 -#define GB_Z_NBITS 32 -#define GB_Z_ATOMIC_BITS 32 -#define GB_Z_HAS_ATOMIC_UPDATE 1 -#define GB_Z_HAS_OMP_ATOMIC_UPDATE 1 -#define GB_Z_HAS_CUDA_ATOMIC_BUILTIN 1 -#define GB_Z_CUDA_ATOMIC GB_cuda_atomic_write -#define GB_Z_CUDA_ATOMIC_TYPE float - -// multiplicative operator (flipped): -#define GB_MULT(z,y,x,j,k,i) z = 1 - -// multiply-add operator: -#define GB_MULTADD(z,y,x,j,k,i) z = 1 - -// special cases: -#define GB_IS_PAIR_MULTIPLIER 1 - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE float -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 1 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 1 -#define GB_B_IS_PATTERN 1 -#define GB_B_TYPE void -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_mxm_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowindex -// op: (rowindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowindex -// op: (rowindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colindex -// op: (colindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colindex -// op: (colindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: diagindex -// op: (diagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) - ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_OFFDIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: diagindex -// op: (diagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) - ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_OFFDIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: tril -// op: (tril, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) <= ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_TRIL_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: triu -// op: (triu, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) >= ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_TRIU_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: diag -// op: (diag, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) == ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_DIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: offdiag -// op: (offdiag, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) != ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_OFFDIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colle -// op: (colle, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) <= (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLLE_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colgt -// op: (colgt, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) > (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLGT_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowle -// op: (rowle, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) <= (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWLE_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowgt -// op: (rowgt, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) > (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWGT_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: flipdiagindex -// op: (flipdiagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) - ((j) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_ENTRY_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: flipdiagindex -// op: (flipdiagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) - ((j) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_ENTRY_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: opi32 -// op: opi32func, ztype: GxB_FC32_t, xtype: GxB_FC32_t, ytype: GxB_FC32_t - -// unary operator types: -#define GB_Z_TYPE GxB_FC32_t -#define GB_X_TYPE GxB_FC32_t -#define GB_Y_TYPE GxB_FC32_t - -// index unary operator: -#ifndef GB_GUARD_opi32func_DEFINED -#define GB_GUARD_opi32func_DEFINED -GB_STATIC_INLINE -void opi32func (GxB_FC32_t *z, const GxB_FC32_t *x, GrB_Index i, GrB_Index j, - const GxB_FC32_t *y) -{ - (*z) = (*x) ; -} -#define GB_opi32func_USER_DEFN \ -"void opi32func (GxB_FC32_t *z, const GxB_FC32_t *x, GrB_Index i, GrB_Index j, \n" \ -" const GxB_FC32_t *y) \n" \ -"{ \n" \ -" (*z) = (*x) ; \n" \ -"}" -#endif -#define GB_IDXUNOP(z,x,i,j,y) opi32func (&(z), &(x), i, j, &(y)) -#define GB_DEPENDS_ON_X 1 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_ENTRY_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_DECLAREA (x) ; \ - GB_GETA (x, Ax, p, ) ; \ - GB_IDXUNOP (z, x, i, j, y) ; \ - bool keep = (GB_crealf (z) != 0 || GB_cimagf (z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE GxB_FC32_t - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE GxB_FC32_t -#define GB_A2TYPE GxB_FC32_t -#define GB_DECLAREA(a) GxB_FC32_t a -#define GB_GETA(a,Ax,p,iso) a = Ax [p] - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: one -// op: (one, void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], , , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni -// op: (positioni, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], i, , ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni -// op: (positioni, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], i, , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni1 -// op: (positioni1, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], i, , ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni1 -// op: (positioni1, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], i, , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj -// op: (positionj, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], , j, ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj -// op: (positionj, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], , j, ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj1 -// op: (positionj1, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], , j, ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj1 -// op: (positionj1, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], , j, ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: sqrt -// op: (sqrt, GxB_FC64_t) - -// unary operator types: -#define GB_Z_TYPE GxB_FC64_t -#define GB_X_TYPE GxB_FC64_t -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = GB_csqrt (x) -#define GB_DEPENDS_ON_X 1 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREA (aij) ; \ - GB_GETA (aij, Ax, pA, ) ; \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, , , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#ifndef GB_GUARD_GJ_cast_to_int32_DEFINED -#define GB_GUARD_GJ_cast_to_int32_DEFINED -GB_STATIC_INLINE -int32_t GJ_cast_to_int32 (double x) -{ - if (isnan (x)) return (0) ; - if (x <= (double) INT32_MIN) return (INT32_MIN) ; - if (x >= (double) INT32_MAX) return (INT32_MAX) ; - return ((int32_t) x) ; -} -#endif -#define GB_PUTC(c,Cx,p) Cx [p] = GJ_cast_to_int32 (GB_creal (c)) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_TYPE int32_t -#define GB_A2TYPE GxB_FC64_t -#define GB_DECLAREA(a) GxB_FC64_t a -#define GB_GETA(a,Ax,p,iso) a = (GxB_FC64_t) (Ax [p]) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_build / GB_macrofy_build: times -// op: (times, GxB_FC32_t) - -// binary dup operator types: -#define GB_Z_TYPE GxB_FC32_t -#define GB_X_TYPE GxB_FC32_t -#define GB_Y_TYPE GxB_FC32_t - -// S and T data types: -#define GB_T_TYPE bool -#define GB_S_TYPE bool - -// binary dup operator: -#define GB_DUP(z,x,y) z = GB_FC32_mul (x,y) -#define GB_UPDATE(z,y) GB_DUP(z,z,y) - -// build copy/dup methods: -#define GB_BLD_COPY(Tx,p,Sx,k) Tx [p] = Sx [k] -#define GB_BLD_DUP(Tx,p,Sx,k) \ - GxB_FC32_t y = (GxB_FC32_t) Sx [k] ; \ - GxB_FC32_t x = (GxB_FC32_t) Tx [p] ; \ - GxB_FC32_t z ; \ - GB_DUP (z, x, y) ; \ - Tx [p] = (GB_crealf (z) != 0 || GB_cimagf (z) != 0) ; - -#include "GB_kernel_shared_definitions.h" - - -================================================================================ -GB_enumify_build / GB_macrofy_build: and -// op: (and, bool) - -// binary dup operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE bool -#define GB_Y_TYPE bool - -// S and T data types: -#define GB_T_TYPE GxB_FC32_t -#define GB_S_TYPE GxB_FC32_t - -// binary dup operator: -#define GB_DUP(z,x,y) z = ((x) && (y)) -#define GB_UPDATE(z,y) z &= y - -// build copy/dup methods: -#define GB_BLD_COPY(Tx,p,Sx,k) Tx [p] = Sx [k] -#define GB_BLD_DUP(Tx,p,Sx,k) \ - bool y = (GB_crealf (Sx [k]) != 0 || GB_cimagf (Sx [k]) != 0) ; \ - bool x = (GB_crealf (Tx [p]) != 0 || GB_cimagf (Tx [p]) != 0) ; \ - bool z ; \ - GB_DUP (z, x, y) ; \ - Tx [p] = (GxB_FC32_t) z ; - -#include "GB_kernel_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)=A (assign) -// assign/subassign: C(I,J) = A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:s:hi,lo:s:hi)=A (assign) -// assign/subassign: C(I,J) = A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_STRIDE -#define GB_J_KIND GB_STRIDE -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(i,J)=s (row assign) -// assign/subassign: C(i,J) = A -#define GB_ASSIGN_KIND GB_ROW_ASSIGN -#define GB_I_KIND GB_ALL -#define GB_J_KIND GB_LIST -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) Cx [pC] = cwork -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(I,j)=s (col assign) -// assign/subassign: C(I,j) = A -#define GB_ASSIGN_KIND GB_COL_ASSIGN -#define GB_I_KIND GB_LIST -#define GB_J_KIND GB_ALL -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) Cx [pC] = cwork -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)=A (assign) -// assign/subassign: C(I,J) = scalar -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(cwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)+=s (assign) -// assign/subassign: C(I,J) += scalar -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (plus, float) - -// accum operator types: -#define GB_Z_TYPE float -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) float zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_UPDATE(z,y) -#define GB_ACCUM_OP(z,x,y) -#define GB_ACCUMULATE_scalar(Cx,pC,ywork) - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(zwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool -#define GB_COPY_scalar_to_ywork(ywork,scalar) ywork = (float) (scalar) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)+=s (assign) -// assign/subassign: C(I,J) += scalar -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (plus, float) - -// accum operator types: -#define GB_Z_TYPE float -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) float zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_UPDATE(z,y) -#define GB_ACCUM_OP(z,x,y) -#define GB_ACCUMULATE_scalar(Cx,pC,ywork) - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(zwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool -#define GB_COPY_scalar_to_ywork(ywork,scalar) ywork = (float) (scalar) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)+=A (assign) -// assign/subassign: C(I,J) += A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (plus, float) - -// accum operator types: -#define GB_Z_TYPE float -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) float zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) z = (x) + (y) -#define GB_UPDATE(z,y) z += y -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) \ -{ \ - GB_DECLAREY (ywork) ; \ - GB_GETA (ywork, Ax, pA, ) ; \ - GB_DECLAREX (xwork) ; \ - GB_COPY_C_to_xwork (xwork, Cx, pC) ; \ - GB_DECLAREZ (zwork) ; \ - GB_ACCUM_OP (zwork, xwork, ywork) ; \ - GB_PUTC (zwork, Cx, pC) ; \ -} - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(zwork,Cx,p) Cx [p] = ((zwork) != 0) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) xwork = (float) (Cx [p]) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE float -#define GB_DECLAREA(a) float a -#define GB_GETA(a,Ax,p,iso) a = (float) (Ax [p]) -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)&=A (assign) -// assign/subassign: C(I,J) &= A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (and, bool) - -// accum operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE bool -#define GB_Y_TYPE bool -#define GB_DECLAREZ(zwork) bool zwork -#define GB_DECLAREX(xwork) bool xwork -#define GB_DECLAREY(ywork) bool ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) z = ((x) && (y)) -#define GB_UPDATE(z,y) z &= y -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) \ -{ \ - GB_UPDATE (Cx [pC], Ax [pA]) ; \ -} - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(zwork,Cx,p) Cx [p] = zwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) xwork = Cx [p] - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE bool -#define GB_DECLAREA(a) bool a -#define GB_GETA(a,Ax,p,iso) a = Ax [p] -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)<=A (assign) -// assign/subassign: C(I,J) lt= A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (lt, float) - -// accum operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) bool zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) z = ((x) < (y)) -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) \ -{ \ - GB_DECLAREY (ywork) ; \ - GB_GETA (ywork, Ax, pA, ) ; \ - GB_DECLAREX (xwork) ; \ - GB_COPY_C_to_xwork (xwork, Cx, pC) ; \ - GB_ACCUM_OP (Cx [pC], xwork, ywork) ; \ -} - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(zwork,Cx,p) Cx [p] = zwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) xwork = (float) (Cx [p]) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE float -#define GB_DECLAREA(a) float a -#define GB_GETA(a,Ax,p,iso) a = (float) (Ax [p]) -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)<=H (assign) -// assign/subassign: C(I,J) lt= A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (lt, float) - -// accum operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) bool zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(zwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE float -#define GB_DECLAREA(a) float a -#define GB_GETA(a,Ax,p,iso) a = (float) (Ax [p]) -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" diff --git a/GraphBLAS/Test/.gitignore b/GraphBLAS/Test/.gitignore new file mode 100644 index 0000000000..8faafc0802 --- /dev/null +++ b/GraphBLAS/Test/.gitignore @@ -0,0 +1,2 @@ +# ignore these files +log_GB_mex_test21.txt diff --git a/GraphBLAS/Test/GB_mex_test11.c b/GraphBLAS/Test/GB_mex_test11.c index 6ee30630ae..cd33b115c3 100644 --- a/GraphBLAS/Test/GB_mex_test11.c +++ b/GraphBLAS/Test/GB_mex_test11.c @@ -235,6 +235,17 @@ if (jit_enabled) OK (GxB_Global_Option_get_CHAR (GxB_JIT_C_PREFACE, &t)) ; CHECK (MATCH (t, "// more stuff here")) ; + OK (GxB_get (GxB_JIT_CUDA_PREFACE, &s)) ; + printf ("default CUDA preface [%s]\n", s) ; + OK (GxB_set (GxB_JIT_CUDA_PREFACE, "// cuda stuff here")) ; + OK (GxB_get (GxB_JIT_CUDA_PREFACE, &s)) ; + CHECK (MATCH (s, "// cuda stuff here")) ; + OK (GxB_Global_Option_get_CHAR (GxB_JIT_CUDA_PREFACE, &t)) ; + CHECK (MATCH (t, "// cuda stuff here")) ; + OK (GxB_Global_Option_set_CHAR (GxB_JIT_CUDA_PREFACE, + "// more cuda stuff here")) ; + OK (GxB_Global_Option_get_CHAR (GxB_JIT_CUDA_PREFACE, &t)) ; + CHECK (MATCH (t, "// more cuda stuff here")) ; OK (GxB_Type_new (&MyType, 0, "mytype", "typedef double mytype ;")) ; OK (GxB_Type_size (&mysize, MyType)) ; diff --git a/GraphBLAS/Test/GB_mex_test13.c b/GraphBLAS/Test/GB_mex_test13.c index fa359450bb..1e7872a342 100644 --- a/GraphBLAS/Test/GB_mex_test13.c +++ b/GraphBLAS/Test/GB_mex_test13.c @@ -57,6 +57,7 @@ void mexFunction ERR (GxB_Global_Option_set_CHAR (GxB_JIT_C_COMPILER_FLAGS, NULL)) ; ERR (GxB_Global_Option_set_CHAR (GxB_JIT_C_LINKER_FLAGS, NULL)) ; ERR (GxB_Global_Option_set_CHAR (GxB_JIT_C_PREFACE, NULL)) ; + ERR (GxB_Global_Option_set_CHAR (GxB_JIT_CUDA_PREFACE, NULL)) ; OK (GxB_Global_Option_set_CHAR (GxB_JIT_ERROR_LOG, NULL)) ; //-------------------------------------------------------------------------- diff --git a/GraphBLAS/Test/GB_mex_test16.c b/GraphBLAS/Test/GB_mex_test16.c index 21e955e111..998f111825 100644 --- a/GraphBLAS/Test/GB_mex_test16.c +++ b/GraphBLAS/Test/GB_mex_test16.c @@ -120,7 +120,7 @@ void mexFunction GrB_FP32, NULL, false, false, s, false, A, B) ; CHECK (code == UINT64_MAX) ; - code = GB_encodify_reduce (&e, &suffix, mon, A) ; + code = GB_encodify_reduce (&e, &suffix, GB_JIT_KERNEL_REDUCE, mon, A) ; CHECK (code == UINT64_MAX) ; code = GB_encodify_assign (&e, &suffix, 0, C, false, 0, 0, NULL, diff --git a/GraphBLAS/Test/GB_mex_test21.c b/GraphBLAS/Test/GB_mex_test21.c index 37a5bad838..ef7f4c58dc 100644 --- a/GraphBLAS/Test/GB_mex_test21.c +++ b/GraphBLAS/Test/GB_mex_test21.c @@ -74,7 +74,7 @@ void mexFunction const char *a, *cuda_type ; bool user_monoid_atomically ; bool has_cheeseburger = GB_enumify_cuda_atomic (&a, - &user_monoid_atomically, &cuda_type, NULL, 0, sizeof (uint16_t), 0) ; + &user_monoid_atomically, &cuda_type, NULL, 0, sizeof (uint32_t), 0) ; CHECK (!has_cheeseburger) ; CHECK (user_monoid_atomically) ; CHECK (cuda_type == NULL) ; diff --git a/GraphBLAS/Test/GB_mex_test29.c b/GraphBLAS/Test/GB_mex_test29.c index 0ec8a45325..14a5b748e5 100644 --- a/GraphBLAS/Test/GB_mex_test29.c +++ b/GraphBLAS/Test/GB_mex_test29.c @@ -347,6 +347,15 @@ void mexFunction OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_C_PREFACE)) ; CHECK (MATCH (defn2, defn)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_JIT_CUDA_PREFACE)) ; + printf ("JIT CUDA preface: [%s]\n", defn) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, "// cu", GxB_JIT_CUDA_PREFACE)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_CUDA_PREFACE)) ; + CHECK (MATCH (defn2, "// cu")) ; + OK (GrB_Global_set_String_ (GrB_GLOBAL, defn, GxB_JIT_CUDA_PREFACE)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn2, GxB_JIT_CUDA_PREFACE)) ; + CHECK (MATCH (defn2, defn)) ; + OK (GrB_Global_get_String_ (GrB_GLOBAL, defn, GxB_JIT_ERROR_LOG)) ; printf ("JIT error log: [%s]\n", defn) ; OK (GrB_Global_set_String_ (GrB_GLOBAL, "errlog.txt", GxB_JIT_ERROR_LOG)) ; diff --git a/GraphBLAS/Test/GB_mex_test9.c b/GraphBLAS/Test/GB_mex_test9.c index e4f164c6b8..1f5de9ce09 100644 --- a/GraphBLAS/Test/GB_mex_test9.c +++ b/GraphBLAS/Test/GB_mex_test9.c @@ -174,7 +174,7 @@ void mexFunction FILE *fp = fopen ("/tmp/GB_tcov_gunk.h", "w") ; GB_macrofy_binop (fp, "nothing", false, false, false, - 199, false, NULL, NULL, NULL) ; + 199, false, NULL, NULL, NULL, NULL) ; fclose (fp) ; //-------------------------------------------------------------------------- diff --git a/GraphBLAS/Test/log_GB_mex_test21.txt b/GraphBLAS/Test/log_GB_mex_test21.txt deleted file mode 100644 index 369fe5ae07..0000000000 --- a/GraphBLAS/Test/log_GB_mex_test21.txt +++ /dev/null @@ -1,2574 +0,0 @@ - - -================================================================================ -GB_macrofy_cast_output, ztype NULL -#define GB_PUTC(z,Cx,p) - - -================================================================================ -GB_macrofy_cast_output, cast FC64 to bool -#define GB_PUTC(z,Cx,p) Cx [p] = (GB_creal (z) != 0 || GB_cimag (z) != 0) - - -================================================================================ -GB_assign_describe -C = A - - -================================================================================ -GB_enumify_ewise / GB_macrofy_ewise, C iso -// op: symbolic only (C is iso) - -// binary operator types: -#define GB_Z_TYPE void -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// binary operator: -#define GB_BINOP(z,x,y,i,j) -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) -#define GB_COPY_B_to_C(Cx,pC,Bx,pB,B_iso) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE void -#define GB_PUTC(c,Cx,p) -#define GB_EWISEOP(Cx,p,aij,bij,i,j) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 0 -#define GB_B_TYPE bool -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_ewise_shared_definitions.h" - - -================================================================================ -GB_enumify_ewise / GB_macrofy_ewise, C non iso -// op: (and, bool) - -// binary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE bool -#define GB_Y_TYPE bool - -// binary operator: -#define GB_BINOP(z,x,y,i,j) z = ((x) && (y)) -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_B_to_C(Cx,pC,Bx,pB,B_iso) Cx [pC] = Bx [pB] - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(c,Cx,p) Cx [p] = c -#define GB_EWISEOP(Cx,p,aij,bij,i,j) GB_BINOP (Cx [p], aij, bij, i, j) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE bool -#define GB_DECLAREA(a) bool a -#define GB_GETA(a,Ax,p,iso) a = Ax [p] - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 0 -#define GB_B_TYPE bool -#define GB_B2TYPE bool -#define GB_DECLAREB(b) bool b -#define GB_GETB(b,Bx,p,iso) b = Bx [p] - -#include "GB_ewise_shared_definitions.h" - - -================================================================================ -GB_enumify_mxm / GB_macrofy_mxm, C iso -// semiring: symbolic only (C is iso) - -// monoid: -#define GB_Z_TYPE void -#define GB_UPDATE(z,y) -#define GB_ADD(z,x,y) -#define GB_DECLARE_IDENTITY(z) -#define GB_DECLARE_IDENTITY_CONST(z) -#define GB_IS_ANY_MONOID 1 -#define GB_Z_IGNORE_OVERFLOW 1 -#define GB_Z_NBITS 0 -#define GB_Z_ATOMIC_BITS 0 - -// multiplicative operator (flipped): -#define GB_MULT(z,x,y,i,k,j) - -// multiply-add operator: -#define GB_MULTADD(z,x,y,i,k,j) - -// special cases: - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(c,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 1 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 1 -#define GB_B_IS_PATTERN 1 -#define GB_B_TYPE void -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_mxm_shared_definitions.h" - - -================================================================================ -GB_enumify_mxm / GB_macrofy_mxm, any_pair, flipxy -// semiring: symbolic only (C is iso) - -// monoid: -#define GB_Z_TYPE void -#define GB_UPDATE(z,y) -#define GB_ADD(z,x,y) -#define GB_DECLARE_IDENTITY(z) -#define GB_DECLARE_IDENTITY_CONST(z) -#define GB_IS_ANY_MONOID 1 -#define GB_Z_NBITS 0 -#define GB_Z_ATOMIC_BITS 0 - -// multiplicative operator (flipped): -#define GB_MULT(z,x,y,i,k,j) - -// multiply-add operator: -#define GB_MULTADD(z,x,y,i,k,j) - -// special cases: -#define GB_IS_ANY_PAIR_SEMIRING 1 -#define GB_IS_PAIR_MULTIPLIER 1 - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE void -#define GB_PUTC(c,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 1 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 1 -#define GB_B_IS_PATTERN 1 -#define GB_B_TYPE void -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_mxm_shared_definitions.h" - - -================================================================================ -GB_enumify_mxm / GB_macrofy_mxm, any_pair fp32 -// semiring: (any, pair (flipped), float) - -// monoid: -#define GB_Z_TYPE float -#define GB_ADD(z,x,y) z = y -#define GB_UPDATE(z,y) z = y -#define GB_DECLARE_IDENTITY(z) float z = 0 -#define GB_DECLARE_IDENTITY_CONST(z) const float z = 0 -#define GB_HAS_IDENTITY_BYTE 1 -#define GB_IDENTITY_BYTE 0x00 -#define GB_IS_ANY_MONOID 1 -#define GB_Z_NBITS 32 -#define GB_Z_ATOMIC_BITS 32 -#define GB_Z_HAS_ATOMIC_UPDATE 1 -#define GB_Z_HAS_OMP_ATOMIC_UPDATE 1 -#define GB_Z_HAS_CUDA_ATOMIC_BUILTIN 1 -#define GB_Z_CUDA_ATOMIC GB_cuda_atomic_write -#define GB_Z_CUDA_ATOMIC_TYPE float - -// multiplicative operator (flipped): -#define GB_MULT(z,y,x,j,k,i) z = 1 - -// multiply-add operator: -#define GB_MULTADD(z,y,x,j,k,i) z = 1 - -// special cases: -#define GB_IS_PAIR_MULTIPLIER 1 - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE float -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 1 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -// B matrix: hypersparse -#define GB_B_IS_HYPER 1 -#define GB_B_IS_SPARSE 0 -#define GB_B_IS_BITMAP 0 -#define GB_B_IS_FULL 0 -#define GBP_B(Bp,k,vlen) Bp [k] -#define GBH_B(Bh,k) Bh [k] -#define GBI_B(Bi,p,vlen) Bi [p] -#define GBB_B(Bb,p) 1 -#define GB_B_NVALS(e) int64_t e = B->nvals -#define GB_B_NHELD(e) GB_B_NVALS(e) -#define GB_B_ISO 1 -#define GB_B_IS_PATTERN 1 -#define GB_B_TYPE void -#define GB_B2TYPE void -#define GB_DECLAREB(b) -#define GB_GETB(b,Bx,p,iso) - -#include "GB_mxm_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowindex -// op: (rowindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowindex -// op: (rowindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colindex -// op: (colindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colindex -// op: (colindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) + (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLINDEX_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: diagindex -// op: (diagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) - ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_OFFDIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: diagindex -// op: (diagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) - ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_OFFDIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: tril -// op: (tril, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) <= ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_TRIL_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: triu -// op: (triu, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) >= ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_TRIU_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: diag -// op: (diag, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) == ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_DIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: offdiag -// op: (offdiag, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) != ((i) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_OFFDIAG_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colle -// op: (colle, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) <= (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLLE_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: colgt -// op: (colgt, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((j) > (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_COLGT_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowle -// op: (rowle, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) <= (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWLE_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: rowgt -// op: (rowgt, GB_void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) > (y)) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_DEPENDS_ON_Y 1 -#define GB_ROWGT_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - bool keep ; \ - GB_IDXUNOP (keep, , i, j, y) ; - -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: flipdiagindex -// op: (flipdiagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE int32_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) - ((j) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_ENTRY_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: flipdiagindex -// op: (flipdiagindex, GB_void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE int64_t - -// index unary operator: -#define GB_IDXUNOP(z,x,i,j,y) z = ((i) - ((j) + (y))) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_ENTRY_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_IDXUNOP (z, , i, j, y) ; \ - bool keep = ((z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE bool - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_select / GB_macrofy_select: opi32 -// op: opi32func, ztype: GxB_FC32_t, xtype: GxB_FC32_t, ytype: GxB_FC32_t - -// unary operator types: -#define GB_Z_TYPE GxB_FC32_t -#define GB_X_TYPE GxB_FC32_t -#define GB_Y_TYPE GxB_FC32_t - -// index unary operator: -#ifndef GB_GUARD_opi32func_DEFINED -#define GB_GUARD_opi32func_DEFINED -GB_STATIC_INLINE -void opi32func (GxB_FC32_t *z, const GxB_FC32_t *x, GrB_Index i, GrB_Index j, - const GxB_FC32_t *y) -{ - (*z) = (*x) ; -} -#define GB_opi32func_USER_DEFN \ -"void opi32func (GxB_FC32_t *z, const GxB_FC32_t *x, GrB_Index i, GrB_Index j, \n" \ -" const GxB_FC32_t *y) \n" \ -"{ \n" \ -" (*z) = (*x) ; \n" \ -"}" -#endif -#define GB_IDXUNOP(z,x,i,j,y) opi32func (&(z), &(x), i, j, &(y)) -#define GB_DEPENDS_ON_X 1 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 1 -#define GB_DEPENDS_ON_Y 1 -#define GB_ENTRY_SELECTOR - -// test if A(i,j) is to be kept: -#define GB_TEST_VALUE_OF_ENTRY(keep,p) \ - GB_Z_TYPE z ; \ - GB_DECLAREA (x) ; \ - GB_GETA (x, Ax, p, ) ; \ - GB_IDXUNOP (z, x, i, j, y) ; \ - bool keep = (GB_crealf (z) != 0 || GB_cimagf (z) != 0) -// copy A(i,j) to C(i,j): -#define GB_SELECT_ENTRY(Cx,pC,Ax,pA) Cx [pC] = Ax [pA] - -// C type: -#define GB_C_TYPE GxB_FC32_t - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE GxB_FC32_t -#define GB_A2TYPE GxB_FC32_t -#define GB_DECLAREA(a) GxB_FC32_t a -#define GB_GETA(a,Ax,p,iso) a = Ax [p] - -#include "GB_select_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: one -// op: (one, void) - -// unary operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], , , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni -// op: (positioni, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], i, , ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni -// op: (positioni, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], i, , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni1 -// op: (positioni1, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], i, , ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positioni1 -// op: (positioni1, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (i) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 1 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], i, , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj -// op: (positionj, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], , j, ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj -// op: (positionj, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], , j, ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj1 -// op: (positionj1, void) - -// unary operator types: -#define GB_Z_TYPE int32_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) GB_UNARYOP (Cx [pC], Ax [pA], , j, ) - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = c - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: positionj1 -// op: (positionj1, void) - -// unary operator types: -#define GB_Z_TYPE int64_t -#define GB_X_TYPE void -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = (j) + 1 -#define GB_DEPENDS_ON_X 0 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 1 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, Ax [pA], , j, ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#define GB_PUTC(c,Cx,p) Cx [p] = (int32_t) (c) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_IS_PATTERN 1 -#define GB_A_TYPE void -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_apply / GB_macrofy_apply: sqrt -// op: (sqrt, GxB_FC64_t) - -// unary operator types: -#define GB_Z_TYPE GxB_FC64_t -#define GB_X_TYPE GxB_FC64_t -#define GB_Y_TYPE void - -// unary operator: -#define GB_UNARYOP(z,x,i,j,y) z = GB_csqrt (x) -#define GB_DEPENDS_ON_X 1 -#define GB_DEPENDS_ON_Y 0 -#define GB_DEPENDS_ON_I 0 -#define GB_DEPENDS_ON_J 0 -#define GB_UNOP(Cx,pC,Ax,pA,A_iso,i,j,y) \ -{ \ - GB_DECLAREA (aij) ; \ - GB_GETA (aij, Ax, pA, ) ; \ - GB_DECLAREZ (z) ; \ - GB_UNARYOP (z, aij, , , ) ; \ - GB_PUTC (z, Cx, pC) ; \ -} - -// C matrix: sparse -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 1 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE int32_t -#ifndef GB_GUARD_GJ_cast_to_int32_DEFINED -#define GB_GUARD_GJ_cast_to_int32_DEFINED -GB_STATIC_INLINE -int32_t GJ_cast_to_int32 (double x) -{ - if (isnan (x)) return (0) ; - if (x <= (double) INT32_MIN) return (INT32_MIN) ; - if (x >= (double) INT32_MAX) return (INT32_MAX) ; - return ((int32_t) x) ; -} -#endif -#define GB_PUTC(c,Cx,p) Cx [p] = GJ_cast_to_int32 (GB_creal (c)) - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_HAS_ZOMBIES 0 -#define GB_A_TYPE int32_t -#define GB_A2TYPE GxB_FC64_t -#define GB_DECLAREA(a) GxB_FC64_t a -#define GB_GETA(a,Ax,p,iso) a = (GxB_FC64_t) (Ax [p]) - -#include "GB_apply_shared_definitions.h" - - -================================================================================ -GB_enumify_build / GB_macrofy_build: times -// op: (times, GxB_FC32_t) - -// binary dup operator types: -#define GB_Z_TYPE GxB_FC32_t -#define GB_X_TYPE GxB_FC32_t -#define GB_Y_TYPE GxB_FC32_t - -// S and T data types: -#define GB_T_TYPE bool -#define GB_S_TYPE bool - -// binary dup operator: -#define GB_DUP(z,x,y) z = GB_FC32_mul (x,y) -#define GB_UPDATE(z,y) GB_DUP(z,z,y) - -// build copy/dup methods: -#define GB_BLD_COPY(Tx,p,Sx,k) Tx [p] = Sx [k] -#define GB_BLD_DUP(Tx,p,Sx,k) \ - GxB_FC32_t y = (GxB_FC32_t) Sx [k] ; \ - GxB_FC32_t x = (GxB_FC32_t) Tx [p] ; \ - GxB_FC32_t z ; \ - GB_DUP (z, x, y) ; \ - Tx [p] = (GB_crealf (z) != 0 || GB_cimagf (z) != 0) ; - -#include "GB_kernel_shared_definitions.h" - - -================================================================================ -GB_enumify_build / GB_macrofy_build: and -// op: (and, bool) - -// binary dup operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE bool -#define GB_Y_TYPE bool - -// S and T data types: -#define GB_T_TYPE GxB_FC32_t -#define GB_S_TYPE GxB_FC32_t - -// binary dup operator: -#define GB_DUP(z,x,y) z = ((x) && (y)) -#define GB_UPDATE(z,y) z &= y - -// build copy/dup methods: -#define GB_BLD_COPY(Tx,p,Sx,k) Tx [p] = Sx [k] -#define GB_BLD_DUP(Tx,p,Sx,k) \ - bool y = (GB_crealf (Sx [k]) != 0 || GB_cimagf (Sx [k]) != 0) ; \ - bool x = (GB_crealf (Tx [p]) != 0 || GB_cimagf (Tx [p]) != 0) ; \ - bool z ; \ - GB_DUP (z, x, y) ; \ - Tx [p] = (GxB_FC32_t) z ; - -#include "GB_kernel_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)=A (assign) -// assign/subassign: C(I,J) = A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:s:hi,lo:s:hi)=A (assign) -// assign/subassign: C(I,J) = A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_STRIDE -#define GB_J_KIND GB_STRIDE -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE void -#define GB_DECLAREA(a) -#define GB_GETA(a,Ax,p,iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(i,J)=s (row assign) -// assign/subassign: C(i,J) = A -#define GB_ASSIGN_KIND GB_ROW_ASSIGN -#define GB_I_KIND GB_ALL -#define GB_J_KIND GB_LIST -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) Cx [pC] = cwork -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(I,j)=s (col assign) -// assign/subassign: C(I,j) = A -#define GB_ASSIGN_KIND GB_COL_ASSIGN -#define GB_I_KIND GB_LIST -#define GB_J_KIND GB_ALL -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(cwork,Cx,p) Cx [p] = cwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) Cx [pC] = cwork -#define GB_COPY_C_to_xwork(xwork,Cx,p) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)=A (assign) -// assign/subassign: C(I,J) = scalar -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: not present - - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(cwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)+=s (assign) -// assign/subassign: C(I,J) += scalar -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (plus, float) - -// accum operator types: -#define GB_Z_TYPE float -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) float zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_UPDATE(z,y) -#define GB_ACCUM_OP(z,x,y) -#define GB_ACCUMULATE_scalar(Cx,pC,ywork) - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(zwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool -#define GB_COPY_scalar_to_ywork(ywork,scalar) ywork = (float) (scalar) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)+=s (assign) -// assign/subassign: C(I,J) += scalar -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (plus, float) - -// accum operator types: -#define GB_Z_TYPE float -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) float zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_UPDATE(z,y) -#define GB_ACCUM_OP(z,x,y) -#define GB_ACCUMULATE_scalar(Cx,pC,ywork) - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(zwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_scalar_to_cwork(cwork,scalar) cwork = scalar -#define GB_COPY_scalar_to_C(Cx,pC,cwork) -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// scalar: -#define GB_A_TYPE bool -#define GB_COPY_scalar_to_ywork(ywork,scalar) ywork = (float) (scalar) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)+=A (assign) -// assign/subassign: C(I,J) += A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (plus, float) - -// accum operator types: -#define GB_Z_TYPE float -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) float zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) z = (x) + (y) -#define GB_UPDATE(z,y) z += y -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) \ -{ \ - GB_DECLAREY (ywork) ; \ - GB_GETA (ywork, Ax, pA, ) ; \ - GB_DECLAREX (xwork) ; \ - GB_COPY_C_to_xwork (xwork, Cx, pC) ; \ - GB_DECLAREZ (zwork) ; \ - GB_ACCUM_OP (zwork, xwork, ywork) ; \ - GB_PUTC (zwork, Cx, pC) ; \ -} - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(zwork,Cx,p) Cx [p] = ((zwork) != 0) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) xwork = (float) (Cx [p]) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE float -#define GB_DECLAREA(a) float a -#define GB_GETA(a,Ax,p,iso) a = (float) (Ax [p]) -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)&=A (assign) -// assign/subassign: C(I,J) &= A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (and, bool) - -// accum operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE bool -#define GB_Y_TYPE bool -#define GB_DECLAREZ(zwork) bool zwork -#define GB_DECLAREX(xwork) bool xwork -#define GB_DECLAREY(ywork) bool ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) z = ((x) && (y)) -#define GB_UPDATE(z,y) z &= y -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) \ -{ \ - GB_UPDATE (Cx [pC], Ax [pA]) ; \ -} - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(zwork,Cx,p) Cx [p] = zwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) xwork = Cx [p] - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE bool -#define GB_DECLAREA(a) bool a -#define GB_GETA(a,Ax,p,iso) a = Ax [p] -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C(lo:hi,lo:hi)<=A (assign) -// assign/subassign: C(I,J) lt= A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (lt, float) - -// accum operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) bool zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) z = ((x) < (y)) -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) \ -{ \ - GB_DECLAREY (ywork) ; \ - GB_GETA (ywork, Ax, pA, ) ; \ - GB_DECLAREX (xwork) ; \ - GB_COPY_C_to_xwork (xwork, Cx, pC) ; \ - GB_ACCUM_OP (Cx [pC], xwork, ywork) ; \ -} - -// C matrix: hypersparse -#define GB_C_IS_HYPER 1 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 0 -#define GBP_C(Cp,k,vlen) Cp [k] -#define GBH_C(Ch,k) Ch [k] -#define GBI_C(Ci,p,vlen) Ci [p] -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = C->nvals -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 0 -#define GB_C_IN_ISO 0 -#define GB_C_TYPE bool -#define GB_PUTC(zwork,Cx,p) Cx [p] = zwork -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) Cx [pC] = Ax [pA] -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) \ - GB_COPY_A_to_C (Cx, pC, Ax, pA, A_iso) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,p) xwork = (float) (Cx [p]) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE float -#define GB_DECLAREA(a) float a -#define GB_GETA(a,Ax,p,iso) a = (float) (Ax [p]) -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" - - -================================================================================ -GB_enumify_assign / GB_macrofy_assign: C_iso(lo:hi,lo:hi)<=H (assign) -// assign/subassign: C(I,J) lt= A -#define GB_ASSIGN_KIND GB_ASSIGN -#define GB_I_KIND GB_RANGE -#define GB_J_KIND GB_RANGE -#define GB_C_REPLACE 0 -// accum: (lt, float) - -// accum operator types: -#define GB_Z_TYPE bool -#define GB_X_TYPE float -#define GB_Y_TYPE float -#define GB_DECLAREZ(zwork) bool zwork -#define GB_DECLAREX(xwork) float xwork -#define GB_DECLAREY(ywork) float ywork - -// accum operator: -#define GB_ACCUM_OP(z,x,y) -#define GB_ACCUMULATE_aij(Cx,pC,Ax,pA,A_iso,ywork) - -// C matrix: full -#define GB_C_IS_HYPER 0 -#define GB_C_IS_SPARSE 0 -#define GB_C_IS_BITMAP 0 -#define GB_C_IS_FULL 1 -#define GBP_C(Cp,k,vlen) ((k) * (vlen)) -#define GBH_C(Ch,k) (k) -#define GBI_C(Ci,p,vlen) ((p) % (vlen)) -#define GBB_C(Cb,p) 1 -#define GB_C_NVALS(e) int64_t e = 0 ; GB_INT64_MULT (e, C->vlen, C->vdim) -#define GB_C_NHELD(e) GB_C_NVALS(e) -#define GB_C_ISO 1 -#define GB_C_IN_ISO 1 -#define GB_C_TYPE void -#define GB_PUTC(zwork,Cx,p) -#define GB_DECLAREC(cwork) bool cwork -#define GB_COPY_A_to_C(Cx,pC,Ax,pA,A_iso) -#define GB_COPY_aij_to_C(Cx,pC,Ax,pA,A_iso,cwork) -#define GB_COPY_aij_to_cwork(cwork,Ax,p,iso) cwork = Ax [p] -#define GB_COPY_C_to_xwork(xwork,Cx,pC) - -// M matrix: none -#define GB_M_TYPE void -#define GB_MCAST(Mx,p,msize) 1 -#define GB_MASK_STRUCT 1 -#define GB_MASK_COMP 0 -#define GB_NO_MASK 1 - -// A matrix: hypersparse -#define GB_A_IS_HYPER 1 -#define GB_A_IS_SPARSE 0 -#define GB_A_IS_BITMAP 0 -#define GB_A_IS_FULL 0 -#define GBP_A(Ap,k,vlen) Ap [k] -#define GBH_A(Ah,k) Ah [k] -#define GBI_A(Ai,p,vlen) Ai [p] -#define GBB_A(Ab,p) 1 -#define GB_A_NVALS(e) int64_t e = A->nvals -#define GB_A_NHELD(e) GB_A_NVALS(e) -#define GB_A_ISO 0 -#define GB_A_TYPE bool -#define GB_A2TYPE float -#define GB_DECLAREA(a) float a -#define GB_GETA(a,Ax,p,iso) a = (float) (Ax [p]) -#define GB_COPY_aij_to_ywork(ywork,Ax,pA,A_iso) GB_GETA (ywork, Ax, pA, A_iso) - -#include "GB_assign_shared_definitions.h" diff --git a/GraphBLAS/Test/test169.m b/GraphBLAS/Test/test169.m new file mode 100644 index 0000000000..33c5509b92 --- /dev/null +++ b/GraphBLAS/Test/test169.m @@ -0,0 +1,49 @@ +function test169 +%TEST169 C=A+B with different sparsity formats + +% SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2023, All Rights Reserved. +% SPDX-License-Identifier: Apache-2.0 + +rng ('default') ; + +fprintf ('test169:\n') ; + +n = 50 ; + +desc = struct ('mask', 'complement') ; + +for trial = 1:5 + + C = GB_spec_random (n, n, 0.5, 1, 'double') ; + M = GB_spec_random (n, n, 0.2, 1, 'double') ; + A = GB_spec_random (n, n, 0.5, 1, 'double') ; + B = GB_spec_random (n, n, 0.5, 1, 'double') ; + + for C_sparsity = [1 2 4 8] + C.sparsity = C_sparsity ; + + for M_sparsity = [1 2 4 8] + M.sparsity = M_sparsity ; + + for A_sparsity = [1 2 4 8] + A.sparsity = A_sparsity ; + + for B_sparsity = [1 2 4 8] + B.sparsity = B_sparsity ; + + C1 = GB_spec_Matrix_eWiseAdd (C, M, [], 'plus', A, B, desc); + C2 = GB_mex_Matrix_eWiseAdd (C, M, [], 'plus', A, B, desc); + GB_spec_compare (C1, C2) ; + + C1 = GB_spec_Matrix_eWiseAdd (C, M, [], 'plus', A, B, [ ]) ; + C2 = GB_mex_Matrix_eWiseAdd (C, M, [], 'plus', A, B, [ ]) ; + GB_spec_compare (C1, C2) ; + end + end + end + fprintf ('.') ; + end +end + +fprintf ('\ntest169: all tests passed\n') ; + diff --git a/GraphBLAS/Test/testall.m b/GraphBLAS/Test/testall.m index 17204c2a56..50cec10f01 100644 --- a/GraphBLAS/Test/testall.m +++ b/GraphBLAS/Test/testall.m @@ -99,6 +99,7 @@ function testall (threads,longtests) % tests with high rates (over 100/sec) %---------------------------------------- +logstat ('test169' ,t, j0 , f1 ) ; % C=A+B with many formats logstat ('test250' ,t, j44 , f10 ) ; % JIT tests, set/get, other tests logstat ('test279' ,t, j0 , f1 ) ; % blob get/set logstat ('test278' ,t, j0 , f1 ) ; % descriptor get/set diff --git a/GraphBLAS/Test/unused/test169.m b/GraphBLAS/Test/unused/test169_orig.m similarity index 100% rename from GraphBLAS/Test/unused/test169.m rename to GraphBLAS/Test/unused/test169_orig.m diff --git a/GraphBLAS/cmake_modules/GraphBLAS_JIT_configure.cmake b/GraphBLAS/cmake_modules/GraphBLAS_JIT_configure.cmake index db377d925e..0ae9693a6b 100644 --- a/GraphBLAS/cmake_modules/GraphBLAS_JIT_configure.cmake +++ b/GraphBLAS/cmake_modules/GraphBLAS_JIT_configure.cmake @@ -114,7 +114,7 @@ if ( GRAPHBLAS_USE_JIT OR GRAPHBLAS_USE_CUDA ) message ( STATUS "------------------------------------------------------------------------" ) # one or both JITs are enabled; make sure the cache path exists message ( STATUS "JIT C compiler: ${GB_C_COMPILER}" ) - message ( STATUS "JIT C flags: ${GB_C_FLAGS}" ) + message ( STATUS "JIT C flags: ${GB_C_FLAGS} ${GB_OPENMP_C_FLAGS}" ) message ( STATUS "JIT link flags: ${GB_C_LINK_FLAGS}" ) message ( STATUS "JIT lib prefix: ${GB_LIB_PREFIX}" ) message ( STATUS "JIT lib suffix: ${GB_LIB_SUFFIX}" ) @@ -133,6 +133,4 @@ file ( MAKE_DIRECTORY "${GRAPHBLAS_CACHE_PATH}/lib" ) file ( MAKE_DIRECTORY "${GRAPHBLAS_CACHE_PATH}/tmp" ) file ( MAKE_DIRECTORY "${GRAPHBLAS_CACHE_PATH}/lock" ) file ( MAKE_DIRECTORY "${GRAPHBLAS_CACHE_PATH}/c" ) -file ( MAKE_DIRECTORY "${GRAPHBLAS_CACHE_PATH}/cu" ) - diff --git a/GraphBLAS/cmake_modules/GraphBLAS_PreJIT.cmake b/GraphBLAS/cmake_modules/GraphBLAS_PreJIT.cmake index ffc8aa851b..e9078c8b0f 100644 --- a/GraphBLAS/cmake_modules/GraphBLAS_PreJIT.cmake +++ b/GraphBLAS/cmake_modules/GraphBLAS_PreJIT.cmake @@ -7,7 +7,10 @@ #------------------------------------------------------------------------------- -# create a list of files +#------------------------------------------------------------------------------- +# create a list of files of CPU PreJIT kernels +#------------------------------------------------------------------------------- + file ( GLOB PRE1 "PreJIT/GB_jit_*.c" ) set ( PREJIT "" ) set ( PREPRO "" ) @@ -112,3 +115,18 @@ configure_file ( "Config/GB_prejit.c.in" "${PROJECT_SOURCE_DIR}/Config/GB_prejit.c" NEWLINE_STYLE LF ) +#------------------------------------------------------------------------------- +# create a list of files of CUDA PreJIT kernels +#------------------------------------------------------------------------------- + +# FIXME: add CUDA PreJIT kernels. For example: + +# ... +# elseif ( ${F} MATCHES "^GB_jit__cuda_reduce" ) +# list ( APPEND PREPRO "JIT_CUDA_RED (" ${F} ")\n" ) +# endif ( ) + +# configure_file ( "CUDA/Config/GB_prejit.c.in" +# "${PROJECT_SOURCE_DIR}/CUDA/Config/GB_prejit.c" +# NEWLINE_STYLE LF ) + diff --git a/GraphBLAS/cmake_modules/GraphBLAS_version.cmake b/GraphBLAS/cmake_modules/GraphBLAS_version.cmake index f5df5d16ae..a3eba6df7d 100644 --- a/GraphBLAS/cmake_modules/GraphBLAS_version.cmake +++ b/GraphBLAS/cmake_modules/GraphBLAS_version.cmake @@ -8,7 +8,7 @@ #------------------------------------------------------------------------------- # version of SuiteSparse:GraphBLAS -set ( GraphBLAS_DATE "Feb XX, 2024" ) # FIXME for SuiteSparse 7.7.0 +set ( GraphBLAS_DATE "Mar 22, 2024" ) set ( GraphBLAS_VERSION_MAJOR 9 CACHE STRING "" FORCE ) set ( GraphBLAS_VERSION_MINOR 1 CACHE STRING "" FORCE ) set ( GraphBLAS_VERSION_SUB 0 CACHE STRING "" FORCE ) diff --git a/GraphBLAS/rmm_wrap/README.md b/GraphBLAS/rmm_wrap/README.md index 1b66003598..f0120f4b3e 100644 --- a/GraphBLAS/rmm_wrap/README.md +++ b/GraphBLAS/rmm_wrap/README.md @@ -5,7 +5,9 @@ SPDX-License-Identifier: Apache-2.0 rmm_wrap defines a single global object, the RMM_Wrap_Handle that holds an RMM (Rapids Memory Manager) memory resource and a hash map (C++ std:unordered_map). This allows rmm_wrap to provide 7 functions to a C -application: +application. + +Note that the rmm_wrap functions are NOT thread safe. Create/destroy an RMM resource: diff --git a/GraphBLAS/rmm_wrap/rmm_wrap.cpp b/GraphBLAS/rmm_wrap/rmm_wrap.cpp index 7246baca51..22362b7c98 100644 --- a/GraphBLAS/rmm_wrap/rmm_wrap.cpp +++ b/GraphBLAS/rmm_wrap/rmm_wrap.cpp @@ -36,6 +36,8 @@ // RMM_Wrap_Handle: a global object containing the RMM context //------------------------------------------------------------------------------ +// NOTE: this is not thread-safe + // rmm_wrap_context is a pointer to an array of global RMM_Wrap_Handle objects // (one per GPU) that all methods in this file can access. The array of // objects cannot be accessed outside this file. @@ -81,7 +83,6 @@ inline auto make_cuda() inline auto make_managed() { - std::cout << "Inside make_managed" << std::endl; return std::make_shared() ; } @@ -131,16 +132,14 @@ inline auto make_and_set_managed_pool std::size_t maximum_size ) { - std::cout<< " make_managed_pool called with init_size" - < ( make_managed(), initial_size, maximum_size ) ; - std::cout << "Created resource" << std::endl; + // std::cout << "Created resource" << std::endl; rmm::mr::set_current_device_resource( resource.get()) ; - std::cout << "Set resource" << std::endl; + // std::cout << "Set resource" << std::endl; return resource; } @@ -185,7 +184,9 @@ void rmm_wrap_finalize (void) //------------------------------------------------------------------------------ // get_current_device: helper to get id for currently selected device //------------------------------------------------------------------------------ -int get_current_device(void) { + +int get_current_device(void) +{ int device_id; cudaGetDevice(&device_id); return device_id; @@ -194,26 +195,29 @@ int get_current_device(void) { //------------------------------------------------------------------------------ // rmm_wrap_initialize: initialize rmm_wrap_context[device_id] //------------------------------------------------------------------------------ -int rmm_wrap_initialize // returns -1 on error, 0 on success + +int rmm_wrap_initialize // returns -1 on error, 0 on success ( - uint32_t device_id, // 2, 5, or 7 - RMM_MODE mode, // TODO: describe. Should we default this? - size_t init_pool_size, // TODO: describe. Should we default this? - size_t max_pool_size, // TODO: describe. Should we default this? - size_t stream_pool_size // TODO: describe. Should we default this? + uint32_t device_id, // 2, 5, or 7 + RMM_MODE mode, // TODO: describe. Should we default this? + size_t init_pool_size, // TODO: describe. Should we default this? + size_t max_pool_size, // TODO: describe. Should we default this? + size_t stream_pool_size // TODO: describe. Should we default this? ) { //-------------------------------------------------------------------------- // check inputs //-------------------------------------------------------------------------- - if(rmm_wrap_context[device_id] != NULL) { - return (-1); + + if (rmm_wrap_context[device_id] != NULL) + { + return (-1) ; } if(stream_pool_size <= 0) { - std::cout << "Stream pool size must be >=0" << std::endl; + // std::cout << "Stream pool size must be >=0" << std::endl; // failed to create the alloc_map return (-1) ; } @@ -230,7 +234,7 @@ int rmm_wrap_initialize // returns -1 on error, 0 on success //-------------------------------------------------------------------------- // Set CUDA stream pool - std::cout << "Creating rmm_wrap stream pool" << std::endl; + // std::cout << "Creating rmm_wrap stream pool" << std::endl; rmm_wrap_context[device_id]->stream_pool = make_and_set_cuda_stream_pool(stream_pool_size); RMM_WRAP_CHECK_CUDA(cudaStreamCreate(&(rmm_wrap_context[device_id]->main_stream))); @@ -255,8 +259,9 @@ int rmm_wrap_initialize // returns -1 on error, 0 on success } else if ( mode == rmm_wrap_managed ) { - std::cout << "Seting managed pool" << std::endl; - rmm_wrap_context[device_id]->resource = make_and_set_managed_pool( init_pool_size, max_pool_size); + // std::cout << "Seting managed pool" << std::endl; + rmm_wrap_context[device_id]->resource = + make_and_set_managed_pool( init_pool_size, max_pool_size); } else { @@ -264,7 +269,7 @@ int rmm_wrap_initialize // returns -1 on error, 0 on success return (-1) ; } - std::cout << "Setting mode for rmm_wrap context" << std::endl; + // std::cout << "Setting mode for rmm_wrap context" << std::endl; // Mark down the mode for reference later rmm_wrap_context[device_id]->mode = mode; @@ -272,11 +277,11 @@ int rmm_wrap_initialize // returns -1 on error, 0 on success // create size map to lookup size of each allocation //-------------------------------------------------------------------------- - std::cout << "Setting size_map for rmm_wrap context" << std::endl; + // std::cout << "Setting size_map for rmm_wrap context" << std::endl; rmm_wrap_context[device_id]->size_map = std::make_shared () ; if (rmm_wrap_context[device_id]->size_map.get() == NULL) { - std::cout << "Failed to create size_map" << std::endl; + // std::cout << "Failed to create size_map" << std::endl; // failed to create the alloc_map return (-1) ; } @@ -291,12 +296,14 @@ int rmm_wrap_initialize // returns -1 on error, 0 on success int rmm_wrap_initialize_all_same ( RMM_MODE mode, // TODO: describe. Should we default this? - size_t init_pool_size, // TODO: describe. Should we default this? + size_t init_pool_size, // TODO: describe. Should we default this? size_t max_pool_size, // TODO: describe. Should we default this? size_t stream_pool_size // TODO: describe. Should we default this? -) { +) +{ - if(rmm_wrap_context != NULL) { + if (rmm_wrap_context != NULL) + { return (-1); } @@ -316,7 +323,7 @@ int rmm_wrap_initialize_all_same intermediate.erase(std::remove_if(intermediate.begin(), intermediate.end(), ::isspace), intermediate.end()); uint32_t device_id = static_cast(stoi(intermediate)); - std::cout << "Found device_id " << device_id << std::endl; + // std::cout << "Found device_id " << device_id << std::endl; devices.push_back(device_id); } /** @@ -325,7 +332,7 @@ int rmm_wrap_initialize_all_same */ } else { devices.push_back(0); - std::cout << "Using default device_id 0" << std::endl; + // std::cout << "Using default device_id 0" << std::endl; } // Allocate rmm_wrap_contexts @@ -333,7 +340,7 @@ int rmm_wrap_initialize_all_same for(int i = 0; i < devices.size(); ++i) { rmm_wrap_context[i] = NULL; uint32_t device_id = devices[i]; - std::cout << "Creating rmm_wrap_context for device_id " << device_id << std::endl; + // std::cout << "Creating rmm_wrap_context for device_id " << device_id << std::endl; int ret = rmm_wrap_initialize(device_id, mode, init_pool_size, max_pool_size, stream_pool_size); if(ret < 0) { return ret; @@ -347,7 +354,8 @@ int rmm_wrap_initialize_all_same // rmm_wrap_get_next_stream_from_pool: return the next available stream from the pool // Output is cudaStream_t //------------------------------------------------------------------------------ -void* rmm_wrap_get_next_stream_from_pool(void) { +void* rmm_wrap_get_next_stream_from_pool(void) +{ return rmm_wrap_context[get_current_device()]->stream_pool->get_stream(); } @@ -355,7 +363,8 @@ void* rmm_wrap_get_next_stream_from_pool(void) { // rmm_wrap_get_stream_from_pool: return specific stream from the pool // Output is cudaStream_t //------------------------------------------------------------------------------ -void* rmm_wrap_get_stream_from_pool(std::size_t stream_id) { +void* rmm_wrap_get_stream_from_pool(std::size_t stream_id) +{ return rmm_wrap_context[get_current_device()]->stream_pool->get_stream(stream_id); } @@ -363,7 +372,8 @@ void* rmm_wrap_get_stream_from_pool(std::size_t stream_id) { // rmm_wrap_get_main_stream: return the main cuda stream // Output is cudaStream_t //------------------------------------------------------------------------------ -void* rmm_wrap_get_main_stream(void) { +void* rmm_wrap_get_main_stream(void) +{ return rmm_wrap_context[get_current_device()]->main_stream; } //------------------------------------------------------------------------------ @@ -477,7 +487,10 @@ void rmm_wrap_free (void *p) void *rmm_wrap_allocate( std::size_t *size) { - if (rmm_wrap_context == NULL) return (NULL) ; + if (rmm_wrap_context == NULL) + { + return (NULL) ; + } uint32_t device_id = get_current_device(); @@ -499,9 +512,6 @@ void *rmm_wrap_allocate( std::size_t *size) *size += (256 - aligned) ; } -// printf(" rmm_wrap_alloc %ld bytes\n",*size) ; - - rmm::mr::device_memory_resource *memoryresource = rmm::mr::get_current_device_resource() ; void *p = memoryresource->allocate( *size ) ; @@ -525,7 +535,10 @@ void *rmm_wrap_allocate( std::size_t *size) void rmm_wrap_deallocate( void *p, std::size_t size) { - if (rmm_wrap_context == NULL) return ; + if (rmm_wrap_context == NULL) + { + return ; + } // Note: there are 3 PANIC cases below. The API of rmm_wrap_deallocate // does not allow an error condition to be returned. These PANICs could be @@ -543,6 +556,7 @@ void rmm_wrap_deallocate( void *p, std::size_t size) } uint32_t device_id = get_current_device(); + // check the size given. If the input size is zero, then the // size is unknown (say rmm_wrap_free(p)). In that case, just trust the // hashmap. Otherwise, double-check to make sure the size is correct. @@ -560,7 +574,7 @@ void rmm_wrap_deallocate( void *p, std::size_t size) //actual_size = am->at( (std::size_t)(p) ) ; auto iter = am->find( (std::size_t)(p) ) ; if (iter != am->end() ) actual_size = iter->second; - else std::cout<< " rmm_wrap:: tried to free unallocated pointer ! " << p ; + // else std::cout<< " rmm_wrap:: tried to free unallocated pointer ! " << p ; } if (actual_size == 0) From 0ddfe4d0c3ff6fa491820badc67037640f5b3fe6 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 21 Mar 2024 10:26:32 -0500 Subject: [PATCH 85/98] dates and changelog --- ChangeLog | 35 +++++++++++++++++++++++++++++++---- Example/Include/my_internal.h | 4 ++-- LAGraph/CMakeLists.txt | 2 +- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4dbc3a759a..70e52bcb58 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,11 +1,11 @@ -Mar XX, 2024: version 7.7.0 +Mar XX, 2024: version 7.7.0 FIXME date * SPEX 3.1.0: major revision to API, new methods. Added SPEX_Cholesky, SPEX_Backslash, and python interface. MATLAB interface revised. * Example 1.7.0: revised for change in SPEX API - * GraphBLAS 9.1.0: revised definitions of C11 or MSVC complex type + * GraphBLAS 9.1.0: revised defn of C11 or MSVC complex type, bug fix + * CXSparse 4.4.0: revise malloc/calloc/realloc/free wrappers * All others: minor changes to build system - * Package versions in this release: SuiteSparse_config 7.7.0 AMD 3.3.2 @@ -15,7 +15,7 @@ Mar XX, 2024: version 7.7.0 CHOLMOD 5.2.1 COLAMD 3.3.3 CSparse 4.3.2 - CXSparse 4.3.2 + CXSparse 4.4.0 Example 1.7.0 GraphBLAS 9.1.0 KLU 2.3.3 @@ -28,6 +28,33 @@ Mar XX, 2024: version 7.7.0 SPQR 4.3.3 UMFPACK 6.3.3 +Mar 2, 2024: version 7.6.1 + + * GraphBLAS 9.0.3: performance bug fix (JIT kernels were not compiled with + OpenMP, since v8.3.1), and fix to Makefile ("make static") + * SuiteSparse_config 7.6.1: version number, added link to math.js in README + * Package versions in this release: + SuiteSparse_config 7.6.1 + AMD 3.3.1 + BTF 2.3.1 + CAMD 3.3.1 + CCOLAMD 3.3.2 + CHOLMOD 5.2.0 + COLAMD 3.3.2 + CSparse 4.3.1 + CXSparse 4.3.1 + Example 1.6.2 + GraphBLAS 9.0.3 + KLU 2.3.2 + LDL 3.3.1 + LAGraph 1.1.2 + SuiteSparse_Mongoose 3.3.2 + ParU 0.1.2 + RBio 4.3.1 + SPEX 2.3.2 + SPQR 4.3.2 + UMFPACK 6.3.2 + Jan 20, 2024: version 7.6.0 * CHOLMOD 5.2.0: bug fix (restore ABI compatibility with 5.0.x, i.e., 5.2.0 diff --git a/Example/Include/my_internal.h b/Example/Include/my_internal.h index 4485256d53..e304740860 100644 --- a/Example/Include/my_internal.h +++ b/Example/Include/my_internal.h @@ -49,8 +49,8 @@ #endif #include "cs.h" -#if !defined (CXSPARSE__VERSION) || CXSPARSE__VERSION < SUITESPARSE__VERCODE(4,3,2) -#error "This library requires CXSparse 4.3.2 or later" +#if !defined (CXSPARSE__VERSION) || CXSPARSE__VERSION < SUITESPARSE__VERCODE(4,4,0) +#error "This library requires CXSparse 4.4.0 or later" #endif #if ! defined (NO_GRAPHBLAS) diff --git a/LAGraph/CMakeLists.txt b/LAGraph/CMakeLists.txt index 9c01755fda..8cb5b28ce3 100644 --- a/LAGraph/CMakeLists.txt +++ b/LAGraph/CMakeLists.txt @@ -39,7 +39,7 @@ cmake_minimum_required ( VERSION 3.20 ) # LAGraph can be built stand-alone # version of LAGraph -set ( LAGraph_DATE "Feb XX, 2024" ) +set ( LAGraph_DATE "Feb XX, 2024" ) # FIXME date for 7.7.0 set ( LAGraph_VERSION_MAJOR 1 CACHE STRING "" FORCE ) set ( LAGraph_VERSION_MINOR 1 CACHE STRING "" FORCE ) set ( LAGraph_VERSION_SUB 3 CACHE STRING "" FORCE ) From 9fc13e0541323ec8f84f902d030cb7d50191d7df Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 21 Mar 2024 10:56:00 -0500 Subject: [PATCH 86/98] sync with dev2 --- ChangeLog | 30 ++++++++++++++++++ GraphBLAS/Doc/ChangeLog | 15 +++++++++ GraphBLAS/Doc/GraphBLAS_UserGuide.pdf | Bin 1126948 -> 1127926 bytes GraphBLAS/Doc/GraphBLAS_UserGuide.tex | 18 +++++++++++ GraphBLAS/Doc/GraphBLAS_version.tex | 4 +-- GraphBLAS/Include/GraphBLAS.h | 8 ++--- GraphBLAS/README.md | 2 +- .../cmake_modules/GraphBLAS_version.cmake | 6 ++-- README.md | 2 +- SuiteSparse_config/CMakeLists.txt | 8 ++--- SuiteSparse_config/SuiteSparse_config.h | 10 +++--- 11 files changed, 83 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index 59349c3c3b..70e52bcb58 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,33 @@ +Mar XX, 2024: version 7.7.0 FIXME date + + * SPEX 3.1.0: major revision to API, new methods. Added SPEX_Cholesky, + SPEX_Backslash, and python interface. MATLAB interface revised. + * Example 1.7.0: revised for change in SPEX API + * GraphBLAS 9.1.0: revised defn of C11 or MSVC complex type, bug fix + * CXSparse 4.4.0: revise malloc/calloc/realloc/free wrappers + * All others: minor changes to build system + * Package versions in this release: + SuiteSparse_config 7.7.0 + AMD 3.3.2 + BTF 2.3.2 + CAMD 3.3.2 + CCOLAMD 3.3.3 + CHOLMOD 5.2.1 + COLAMD 3.3.3 + CSparse 4.3.2 + CXSparse 4.4.0 + Example 1.7.0 + GraphBLAS 9.1.0 + KLU 2.3.3 + LDL 3.3.2 + LAGraph 1.1.3 + SuiteSparse_Mongoose 3.3.3 + ParU 0.1.3 + RBio 4.3.2 + SPEX 3.1.0 + SPQR 4.3.3 + UMFPACK 6.3.3 + Mar 2, 2024: version 7.6.1 * GraphBLAS 9.0.3: performance bug fix (JIT kernels were not compiled with diff --git a/GraphBLAS/Doc/ChangeLog b/GraphBLAS/Doc/ChangeLog index 03f1ca055d..e1ef26ee59 100644 --- a/GraphBLAS/Doc/ChangeLog +++ b/GraphBLAS/Doc/ChangeLog @@ -1,3 +1,18 @@ +Mar 22, 2024: version 9.1.0 + + * minor updates to build system + * C11 complex type detection: this is now detected and configured by + cmake, instead of using an #if ... in the GraphBLAS.h header. + This change was required to port GraphBLAS to the clang-cl compiler + on Windows when it simulates the MSVC compiler. Also added a new + feature (thus the minor version update to 9.1.0): GxB_HAVE_COMPLEX* to + GraphBLAS.h to indicate which kind of complex data types are available + in C11 or MSVC. Contributed by Markus Mützel. + * port to clang-cl: fixing the GxB_get and GxB_set macro + * (53) bug fix: eWiseAdd C=A+B when M, A, and B are all hypersparse; + access to M was incorrect (also affects C+=T for any operation, if + M and T are both hypersparse). + Mar 1, 2024: version 9.0.3 * (52) performance bug fix: JIT kernels since v8.3.1 were not compiled with diff --git a/GraphBLAS/Doc/GraphBLAS_UserGuide.pdf b/GraphBLAS/Doc/GraphBLAS_UserGuide.pdf index b7d8c07e821b5e03914128cf5467bdd2d84b5f58..15a176c9603b4c7af1310e97c9c4d5adf90f238a 100644 GIT binary patch delta 66173 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 delta 65150 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

`;;9Ld|tXH*bBYPyR^JC`}GNhP4 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 O=A+B' when \verb'M', \verb'A', + and \verb'B' are all hypersparse; access to \verb'M' was incorrect + (also affects \verb'C+=T' for any operation, if \verb'M' and + \verb'T' are both hypersparse). + \end{itemize} + \item Mar 1, 2024: version 9.0.3 \begin{itemize} diff --git a/GraphBLAS/Doc/GraphBLAS_version.tex b/GraphBLAS/Doc/GraphBLAS_version.tex index 8d9b11a930..c4b9b9002b 100644 --- a/GraphBLAS/Doc/GraphBLAS_version.tex +++ b/GraphBLAS/Doc/GraphBLAS_version.tex @@ -1,5 +1,5 @@ % version of SuiteSparse:GraphBLAS \date{VERSION -9.0.3, -Mar 1, 2024} +9.1.0, +Mar 22, 2024} diff --git a/GraphBLAS/Include/GraphBLAS.h b/GraphBLAS/Include/GraphBLAS.h index d2c0c2ddf2..41890a09e9 100644 --- a/GraphBLAS/Include/GraphBLAS.h +++ b/GraphBLAS/Include/GraphBLAS.h @@ -1,4 +1,4 @@ -// SuiteSparse:GraphBLAS 9.0.3 +// SuiteSparse:GraphBLAS 9.1.0 //------------------------------------------------------------------------------ // GraphBLAS.h: definitions for the GraphBLAS package //------------------------------------------------------------------------------ @@ -226,10 +226,10 @@ // The version of this implementation, and the GraphBLAS API version: #define GxB_IMPLEMENTATION_NAME "SuiteSparse:GraphBLAS" -#define GxB_IMPLEMENTATION_DATE "Mar 1, 2024" +#define GxB_IMPLEMENTATION_DATE "Mar 22, 2024" #define GxB_IMPLEMENTATION_MAJOR 9 -#define GxB_IMPLEMENTATION_MINOR 0 -#define GxB_IMPLEMENTATION_SUB 3 +#define GxB_IMPLEMENTATION_MINOR 1 +#define GxB_IMPLEMENTATION_SUB 0 #define GxB_SPEC_DATE "Dec 22, 2023" #define GxB_SPEC_MAJOR 2 #define GxB_SPEC_MINOR 1 diff --git a/GraphBLAS/README.md b/GraphBLAS/README.md index b3f529bd49..b2ce94c06e 100644 --- a/GraphBLAS/README.md +++ b/GraphBLAS/README.md @@ -4,7 +4,7 @@ SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. SPDX-License-Identifier: Apache-2.0 -VERSION 9.0.3, Mar 1, 2024 +VERSION 9.1.0, Mar 22, 2024 SuiteSparse:GraphBLAS is a complete implementation of the GraphBLAS standard, which defines a set of sparse matrix operations on an extended algebra of diff --git a/GraphBLAS/cmake_modules/GraphBLAS_version.cmake b/GraphBLAS/cmake_modules/GraphBLAS_version.cmake index 847ec977a3..a3eba6df7d 100644 --- a/GraphBLAS/cmake_modules/GraphBLAS_version.cmake +++ b/GraphBLAS/cmake_modules/GraphBLAS_version.cmake @@ -8,10 +8,10 @@ #------------------------------------------------------------------------------- # version of SuiteSparse:GraphBLAS -set ( GraphBLAS_DATE "Mar 1, 2024" ) +set ( GraphBLAS_DATE "Mar 22, 2024" ) set ( GraphBLAS_VERSION_MAJOR 9 CACHE STRING "" FORCE ) -set ( GraphBLAS_VERSION_MINOR 0 CACHE STRING "" FORCE ) -set ( GraphBLAS_VERSION_SUB 3 CACHE STRING "" FORCE ) +set ( GraphBLAS_VERSION_MINOR 1 CACHE STRING "" FORCE ) +set ( GraphBLAS_VERSION_SUB 0 CACHE STRING "" FORCE ) # GraphBLAS C API Specification version, at graphblas.org set ( GraphBLAS_API_DATE "Dec 22, 2023" ) diff --git a/README.md b/README.md index 8ec613ea69..37824afef5 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ SuiteSparse: A Suite of Sparse matrix packages at http://suitesparse.com ----------------------------------------------------------------------------- -Mar 2, 2024, SuiteSparse VERSION 7.6.1 +Feb XX, 2024, SuiteSparse VERSION 7.7.0 SuiteSparse is a set of sparse-matrix-related packages written or co-authored by Tim Davis, available at https://github.com/DrTimothyAldenDavis/SuiteSparse . diff --git a/SuiteSparse_config/CMakeLists.txt b/SuiteSparse_config/CMakeLists.txt index d7886a0ab9..7c06afcb53 100644 --- a/SuiteSparse_config/CMakeLists.txt +++ b/SuiteSparse_config/CMakeLists.txt @@ -15,10 +15,10 @@ cmake_minimum_required ( VERSION 3.22 ) # version of both SuiteSparse and SuiteSparse_config -set ( SUITESPARSE_DATE "Mar 2, 2024" ) +set ( SUITESPARSE_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 set ( SUITESPARSE_VERSION_MAJOR 7 ) -set ( SUITESPARSE_VERSION_MINOR 6 ) -set ( SUITESPARSE_VERSION_SUB 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 ) @@ -174,7 +174,7 @@ if ( BUILD_STATIC_LIBS ) OUTPUT_NAME suitesparseconfig PUBLIC_HEADER "SuiteSparse_config.h" ) - if ( MSVC ) + if ( MSVC OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC") ) set_target_properties ( SuiteSparseConfig_static PROPERTIES OUTPUT_NAME suitesparseconfig_static ) endif ( ) diff --git a/SuiteSparse_config/SuiteSparse_config.h b/SuiteSparse_config/SuiteSparse_config.h index b5a0bc96b3..bcea44c1fe 100644 --- a/SuiteSparse_config/SuiteSparse_config.h +++ b/SuiteSparse_config/SuiteSparse_config.h @@ -420,19 +420,19 @@ int SuiteSparse_version // returns SUITESPARSE_VERSION #define SUITESPARSE_HAS_VERSION_FUNCTION -#define SUITESPARSE_DATE "Mar 2, 2024" +#define SUITESPARSE_DATE "Feb XX, 2024" #define SUITESPARSE_MAIN_VERSION 7 -#define SUITESPARSE_SUB_VERSION 6 -#define SUITESPARSE_SUBSUB_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(7, 6) +#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,6,1) +#define SUITESPARSE__VERSION SUITESPARSE__VERCODE(7,7,0) //============================================================================== // SuiteSparse interface to the BLAS and LAPACK libraries From 03806f0f8b9c709b967cd8c3bdd0ba6faa455861 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 21 Mar 2024 11:31:36 -0500 Subject: [PATCH 87/98] test coverage for GraphBLAS 9.1.0 --- GraphBLAS/Tcov/log_Jan9.txt | 204 ---------------------------------- GraphBLAS/Tcov/log_Mar21.txt | 205 +++++++++++++++++++++++++++++++++++ SPEX/Tcov/.gitignore | 1 + SPEX/Tcov/tcov_for_other | Bin 450208 -> 0 bytes 4 files changed, 206 insertions(+), 204 deletions(-) delete mode 100644 GraphBLAS/Tcov/log_Jan9.txt create mode 100644 GraphBLAS/Tcov/log_Mar21.txt delete mode 100755 SPEX/Tcov/tcov_for_other diff --git a/GraphBLAS/Tcov/log_Jan9.txt b/GraphBLAS/Tcov/log_Jan9.txt deleted file mode 100644 index 6cc3b2d621..0000000000 --- a/GraphBLAS/Tcov/log_Jan9.txt +++ /dev/null @@ -1,204 +0,0 @@ - ----------------------------------------------- [malloc] [cover] -09-Jan 19:02:10 test250 1.4 sec 415: 24525 of 25102 2.3% 286.32/s -09-Jan 19:02:12 test250 2.1 sec 57: 24468 of 25102 2.5% 26.91/s -09-Jan 19:02:12 test279 0.1 sec 130: 24338 of 25102 3.0% 1120.05/s -09-Jan 19:02:12 test278 0.1 sec 49: 24289 of 25102 3.2% 518.63/s -09-Jan 19:02:12 test277 0.1 sec 38: 24251 of 25102 3.4% 412.87/s -09-Jan 19:02:13 test276 0.1 sec 1626: 22625 of 25102 9.9% 16727.71/s -09-Jan 19:02:13 test275 0.1 sec 117: 22508 of 25102 10.3% 1260.79/s -09-Jan 19:02:13 test274 0.1 sec 129: 22379 of 25102 10.8% 1407.42/s -09-Jan 19:02:13 test273 0.2 sec 110: 22269 of 25102 11.3% 479.04/s -09-Jan 19:02:13 test272 0.1 sec 11: 22258 of 25102 11.3% 117.72/s -09-Jan 19:02:13 test271 0.1 sec 497: 21761 of 25102 13.3% 5283.36/s -09-Jan 19:02:14 test270 0.1 sec 286: 21475 of 25102 14.4% 3084.52/s -09-Jan 19:02:14 test269 0.1 sec 87: 21388 of 25102 14.8% 927.38/s -09-Jan 19:02:14 test268 0.2 sec 102: 21286 of 25102 15.2% 441.67/s -09-Jan 19:02:17 test145 2.5 sec 221: 21065 of 25102 16.1% 88.45/s -09-Jan 19:02:17 test145 0.0 sec 1: 21064 of 25102 16.1% 20.22/s -09-Jan 19:02:17 test145 0.0 sec 18: 21046 of 25102 16.2% 818.74/s -09-Jan 19:02:17 test145 0.0 sec 4: 21042 of 25102 16.2% 225.43/s -09-Jan 19:02:18 test145 1.5 sec 34: 21008 of 25102 16.3% 22.38/s -09-Jan 19:02:18 test145 0.0 sec 3: 21005 of 25102 16.3% 178.81/s -09-Jan 19:02:20 test240 1.2 sec 80: 20922 of 25102 16.7% 68.04/s -09-Jan 19:02:20 test240 0.3 sec 1: 20921 of 25102 16.7% 3.39/s -09-Jan 19:02:22 test237 1.4 sec 42: 20879 of 25102 16.8% 29.50/s -09-Jan 19:02:25 test237 2.8 sec 2: 20877 of 25102 16.8% 0.70/s -09-Jan 19:02:25 test237 0.1 sec 18: 20859 of 25102 16.9% 174.87/s -09-Jan 19:02:25 test237 0.0 sec 6: 20853 of 25102 16.9% 219.04/s -09-Jan 19:02:25 test237 0.1 sec 4: 20849 of 25102 16.9% 46.63/s -09-Jan 19:02:26 test267 0.7 sec 8: 20841 of 25102 17.0% 11.91/s -09-Jan 19:02:26 test267 0.0 sec 1: 20840 of 25102 17.0% 1733.10/s -09-Jan 19:02:26 test265 0.5 sec 36: 20804 of 25102 17.1% 68.46/s -09-Jan 19:02:27 test264 0.1 sec 173: 20631 of 25102 17.8% 1794.94/s -09-Jan 19:02:27 test263 0.8 sec 16: 20615 of 25102 17.9% 19.09/s -09-Jan 19:02:28 test262 0.1 sec 76: 20539 of 25102 18.2% 736.18/s -09-Jan 19:02:28 test261 0.1 sec 22: 20517 of 25102 18.3% 238.46/s -09-Jan 19:02:28 test260 0.1 sec 3: 20514 of 25102 18.3% 33.11/s -09-Jan 19:02:31 test259 2.4 sec 4: 20510 of 25102 18.3% 1.64/s -09-Jan 19:02:31 test258 0.4 sec 20: 20490 of 25102 18.4% 55.72/s -09-Jan 19:02:32 test257 0.3 sec 54: 20436 of 25102 18.6% 187.42/s -09-Jan 19:02:32 test255 0.1 sec 8: 20428 of 25102 18.6% 76.72/s -09-Jan 19:02:32 test254 0.1 sec 29: 20399 of 25102 18.7% 365.91/s -09-Jan 19:02:37 test254 4.9 sec 20: 20379 of 25102 18.8% 4.12/s -09-Jan 19:02:37 test254 0.1 sec 1: 20378 of 25102 18.8% 10.57/s -09-Jan 19:02:37 test253 0.2 sec 8: 20370 of 25102 18.9% 38.22/s -09-Jan 19:02:38 test252 0.1 sec 7: 20363 of 25102 18.9% 78.65/s -09-Jan 19:04:00 test251 81.9 sec 472: 19891 of 25102 20.8% 5.76/s -09-Jan 19:07:30 test251 210.0 sec 76: 19815 of 25102 21.1% 0.36/s -09-Jan 19:07:31 test249 1.3 sec 27: 19788 of 25102 21.2% 20.92/s -09-Jan 19:07:32 test247 0.0 sec 24: 19764 of 25102 21.3% 1196.89/s -09-Jan 19:07:43 test246 11.0 sec 72: 19692 of 25102 21.6% 6.56/s -09-Jan 19:08:02 test01 18.8 sec 1420: 18272 of 25102 27.2% 75.59/s -09-Jan 19:08:03 test245 1.0 sec 34: 18238 of 25102 27.3% 34.16/s -09-Jan 19:08:03 test245 0.0 sec 8: 18230 of 25102 27.4% 216.93/s -09-Jan 19:08:03 test199 0.0 sec 1: 18229 of 25102 27.4% 153.73/s -09-Jan 19:08:03 test83 0.1 sec 15: 18214 of 25102 27.4% 159.22/s -09-Jan 19:08:03 test210 0.0 sec 9: 18205 of 25102 27.5% 2048.71/s -09-Jan 19:08:04 test165 0.0 sec 1: 18204 of 25102 27.5% 180.60/s -09-Jan 19:08:04 test219 0.1 sec 9: 18195 of 25102 27.5% 95.65/s -09-Jan 19:08:04 test219 0.3 sec 3: 18192 of 25102 27.5% 11.22/s -09-Jan 19:08:04 test241 0.1 sec 10: 18182 of 25102 27.6% 99.45/s -09-Jan 19:08:05 test220 0.1 sec 15: 18167 of 25102 27.6% 114.71/s -09-Jan 19:08:05 test211 0.0 sec 15: 18152 of 25102 27.7% 422.63/s -09-Jan 19:08:05 test202 0.1 sec 83: 18069 of 25102 28.0% 601.38/s -09-Jan 19:08:05 test202 0.0 sec 1: 18068 of 25102 28.0% 23.24/s -09-Jan 19:08:09 test152 3.0 sec 827: 17241 of 25102 31.3% 278.37/s -09-Jan 19:08:13 test152 4.1 sec 13: 17228 of 25102 31.4% 3.18/s -09-Jan 19:09:30 test152 76.7 sec 245: 16983 of 25102 32.3% 3.19/s -09-Jan 19:09:30 test222 0.2 sec 18: 16965 of 25102 32.4% 95.26/s -09-Jan 19:09:31 test256 0.7 sec 58: 16907 of 25102 32.6% 87.95/s -09-Jan 19:09:34 test186 2.9 sec 44: 16863 of 25102 32.8% 15.25/s -09-Jan 19:09:35 test186 0.5 sec 3: 16860 of 25102 32.8% 6.63/s -09-Jan 19:09:35 test186(0) 0.4 sec 5: 16855 of 25102 32.9% 12.37/s -09-Jan 19:09:36 test150 0.2 sec 44: 16811 of 25102 33.0% 212.26/s -09-Jan 19:09:36 test239 0.1 sec 15: 16796 of 25102 33.1% 117.90/s -09-Jan 19:09:37 test239 1.0 sec 2: 16794 of 25102 33.1% 2.10/s -09-Jan 19:09:38 test235 0.0 sec 4: 16790 of 25102 33.1% 96.59/s -09-Jan 19:09:38 test226 0.0 sec 8: 16782 of 25102 33.1% 568.87/s -09-Jan 19:09:38 test223 0.0 sec 2: 16780 of 25102 33.2% 61.10/s -09-Jan 19:09:38 test204 0.2 sec 14: 16766 of 25102 33.2% 77.02/s -09-Jan 19:09:39 test203 0.1 sec 19: 16747 of 25102 33.3% 203.20/s -09-Jan 19:09:39 test183 0.0 sec 12: 16735 of 25102 33.3% 417.67/s -09-Jan 19:09:39 test179 0.1 sec 15: 16720 of 25102 33.4% 103.52/s -09-Jan 19:09:41 test179 2.0 sec 4: 16716 of 25102 33.4% 2.05/s -09-Jan 19:09:42 test174 0.1 sec 10: 16706 of 25102 33.4% 195.47/s -09-Jan 19:09:42 test155 0.2 sec 43: 16663 of 25102 33.6% 278.84/s -09-Jan 19:09:43 test136 0.2 sec 57: 16606 of 25102 33.8% 253.63/s -09-Jan 19:09:44 test02 0.7 sec 247: 16359 of 25102 34.8% 333.30/s -09-Jan 19:09:44 test109 0.5 sec 10: 16349 of 25102 34.9% 20.75/s -09-Jan 19:09:45 test109 0.0 sec 4: 16345 of 25102 34.9% 1176.82/s -09-Jan 19:09:45 test109 0.4 sec 8: 16337 of 25102 34.9% 22.49/s -09-Jan 19:09:45 test04 0.1 sec 15: 16322 of 25102 35.0% 124.60/s -09-Jan 19:09:46 test207 0.0 sec 2: 16320 of 25102 35.0% 423.64/s -09-Jan 19:09:46 test221 0.0 sec 2: 16318 of 25102 35.0% 267.45/s -09-Jan 19:09:46 test162 0.1 sec 5: 16313 of 25102 35.0% 93.93/s -09-Jan 19:09:49 test159 2.5 sec 72: 16241 of 25102 35.3% 28.98/s -09-Jan 19:09:49 test09 0.0 sec 5: 16236 of 25102 35.3% 503.93/s -09-Jan 19:09:50 test132 0.1 sec 8: 16228 of 25102 35.4% 70.67/s -09-Jan 19:10:03 test141 12.7 sec 551: 15677 of 25102 37.5% 43.39/s -09-Jan 19:10:04 testc2(1,1) 1.4 sec 20: 15657 of 25102 37.6% 14.22/s -09-Jan 19:10:11 testc2(1,1) 6.6 sec 4: 15653 of 25102 37.6% 0.61/s -09-Jan 19:10:12 test214 0.0 sec 3: 15650 of 25102 37.7% 300.90/s -09-Jan 19:10:12 test213 0.0 sec 2: 15648 of 25102 37.7% 182.93/s -09-Jan 19:10:15 test206 2.5 sec 221: 15427 of 25102 38.5% 88.15/s -09-Jan 19:10:32 test206 16.9 sec 24: 15403 of 25102 38.6% 1.42/s -09-Jan 19:10:32 test212 0.0 sec 9: 15394 of 25102 38.7% 429.04/s -09-Jan 19:10:33 test212 0.2 sec 2: 15392 of 25102 38.7% 10.21/s -09-Jan 19:10:33 test128 0.3 sec 49: 15343 of 25102 38.9% 149.05/s -09-Jan 19:10:34 test82 0.1 sec 18: 15325 of 25102 38.9% 201.77/s -09-Jan 19:10:37 test229 3.1 sec 9: 15316 of 25102 39.0% 2.90/s -09-Jan 19:10:39 test229 1.1 sec 1: 15315 of 25102 39.0% 0.93/s -09-Jan 19:10:39 test144 0.6 sec 2: 15313 of 25102 39.0% 3.32/s -09-Jan 19:12:02 test14 82.0 sec 671: 14642 of 25102 41.7% 8.18/s -09-Jan 19:16:28 test14 265.8 sec 118: 14524 of 25102 42.1% 0.44/s -09-Jan 19:16:38 test180 8.7 sec 136: 14388 of 25102 42.7% 15.60/s -09-Jan 19:16:42 test236 3.6 sec 74: 14314 of 25102 43.0% 20.57/s -09-Jan 19:16:44 test232 2.6 sec 22: 14292 of 25102 43.1% 8.46/s -09-Jan 19:17:04 test228 19.0 sec 27: 14265 of 25102 43.2% 1.42/s -09-Jan 19:19:00 test154 115.8 sec 1502: 12763 of 25102 49.2% 12.97/s -09-Jan 19:25:17 test154 376.6 sec 2: 12761 of 25102 49.2% 0.01/s -09-Jan 19:25:31 test238 13.9 sec 54: 12707 of 25102 49.4% 3.88/s -09-Jan 19:26:41 test238 68.9 sec 9: 12698 of 25102 49.4% 0.13/s -09-Jan 19:28:21 test151b 99.9 sec 174: 12524 of 25102 50.1% 1.74/s -09-Jan 19:28:24 test184 3.1 sec 38: 12486 of 25102 50.3% 12.20/s -09-Jan 19:28:38 test191 12.7 sec 21: 12465 of 25102 50.3% 1.65/s -09-Jan 19:29:06 test191 28.4 sec 3: 12462 of 25102 50.4% 0.11/s -09-Jan 19:36:33 test188 445.8 sec 212: 12250 of 25102 51.2% 0.48/s -09-Jan 19:39:01 test188 147.5 sec 3: 12247 of 25102 51.2% 0.02/s -09-Jan 19:39:07 test224 5.0 sec 24: 12223 of 25102 51.3% 4.79/s -09-Jan 19:39:10 test196 2.4 sec 11: 12212 of 25102 51.4% 4.56/s -09-Jan 19:39:16 test209 6.2 sec 20: 12192 of 25102 51.4% 3.24/s -09-Jan 19:39:35 test104 18.4 sec 40: 12152 of 25102 51.6% 2.17/s -09-Jan 19:39:43 test189 7.9 sec 1: 12151 of 25102 51.6% 0.13/s -09-Jan 19:40:51 test194 67.5 sec 5: 12146 of 25102 51.6% 0.07/s -09-Jan 19:41:07 test76 15.4 sec 15: 12131 of 25102 51.7% 0.97/s -09-Jan 19:41:48 test244 39.9 sec 17: 12114 of 25102 51.7% 0.43/s -[malloc debugging turned off] -09-Jan 19:41:48 test201 0.0 sec 3: 12111 of 25102 51.8% 339.14/s -09-Jan 19:41:49 test225 0.1 sec 4: 12107 of 25102 51.8% 26.83/s -09-Jan 19:41:49 test176 0.1 sec 5: 12102 of 25102 51.8% 65.21/s -09-Jan 19:41:50 test208 0.0 sec 5: 12097 of 25102 51.8% 294.38/s -09-Jan 19:41:50 test216 0.1 sec 3: 12094 of 25102 51.8% 28.18/s -09-Jan 19:42:14 test142 23.8 sec 631: 11463 of 25102 54.3% 26.56/s -09-Jan 19:46:53 test142 278.2 sec 10: 11453 of 25102 54.4% 0.04/s -09-Jan 19:47:18 test142 23.9 sec 2: 11451 of 25102 54.4% 0.08/s -09-Jan 19:47:19 test137 0.4 sec 3: 11448 of 25102 54.4% 7.13/s -09-Jan 19:47:19 test137 0.0 sec 2: 11446 of 25102 54.4% 281.14/s -09-Jan 19:47:20 test139 0.4 sec 2: 11444 of 25102 54.4% 4.65/s -09-Jan 19:47:21 test172 0.1 sec 3: 11441 of 25102 54.4% 39.03/s -09-Jan 19:47:22 test148 0.9 sec 4: 11437 of 25102 54.4% 4.47/s -09-Jan 19:47:23 test157 0.6 sec 12: 11425 of 25102 54.5% 19.20/s -09-Jan 19:47:25 test182 1.0 sec 8: 11417 of 25102 54.5% 8.26/s -09-Jan 19:47:26 test108 0.6 sec 2: 11415 of 25102 54.5% 3.29/s -09-Jan 19:47:27 test108 0.4 sec 2: 11413 of 25102 54.5% 5.31/s -09-Jan 19:47:28 test130 0.9 sec 25: 11388 of 25102 54.6% 28.82/s -09-Jan 19:47:29 test124 0.2 sec 3: 11385 of 25102 54.6% 16.23/s -09-Jan 19:47:29 test138 0.1 sec 1: 11384 of 25102 54.6% 19.12/s -09-Jan 19:47:35 test227 4.6 sec 27: 11357 of 25102 54.8% 5.89/s -09-Jan 19:48:03 test125 28.1 sec 630: 10727 of 25102 57.3% 22.39/s -09-Jan 19:50:25 test234 141.5 sec 397: 10330 of 25102 58.8% 2.81/s -09-Jan 19:54:09 test234 222.8 sec 3: 10327 of 25102 58.9% 0.01/s -09-Jan 19:54:56 test242 46.1 sec 77: 10250 of 25102 59.2% 1.67/s -09-Jan 19:54:58 test173 1.5 sec 12: 10238 of 25102 59.2% 7.93/s -09-Jan 19:55:01 test200 3.2 sec 10: 10228 of 25102 59.3% 3.17/s -09-Jan 19:55:02 test197 0.2 sec 1: 10227 of 25102 59.3% 6.26/s -09-Jan 19:55:04 test84 1.3 sec 18: 10209 of 25102 59.3% 13.73/s -09-Jan 19:55:10 test19b 5.8 sec 59: 10150 of 25102 59.6% 10.09/s -09-Jan 19:55:11 test133 0.4 sec 2: 10148 of 25102 59.6% 4.77/s -09-Jan 19:55:16 test80 4.1 sec 12: 10136 of 25102 59.6% 2.93/s -09-Jan 19:56:20 test23 63.5 sec 148: 9988 of 25102 60.2% 2.33/s -09-Jan 19:56:23 test135 1.9 sec 7: 9981 of 25102 60.2% 3.69/s -09-Jan 19:57:36 test160 72.5 sec 24: 9957 of 25102 60.3% 0.33/s -09-Jan 19:57:42 test54 5.2 sec 20: 9937 of 25102 60.4% 3.87/s -09-Jan 19:57:43 test129 1.1 sec 4: 9933 of 25102 60.4% 3.50/s -09-Jan 19:57:46 test69 2.0 sec 6: 9927 of 25102 60.5% 2.95/s -09-Jan 19:59:15 test230 88.0 sec 114: 9813 of 25102 60.9% 1.30/s -09-Jan 20:31:54 test74 1958.2 sec 6637: 3176 of 25102 87.3% 3.39/s -09-Jan 20:43:55 test127 721.3 sec 1707: 1469 of 25102 94.1% 2.37/s -09-Jan 20:43:59 test19 3.2 sec 12: 1457 of 25102 94.2% 3.75/s -09-Jan 20:44:04 test11 3.7 sec 3: 1454 of 25102 94.2% 0.81/s -09-Jan 20:44:08 test215 3.2 sec 1: 1453 of 25102 94.2% 0.31/s -09-Jan 20:44:25 test193 16.6 sec 5: 1448 of 25102 94.2% 0.30/s -09-Jan 20:47:04 test195 158.6 sec 39: 1409 of 25102 94.4% 0.25/s -09-Jan 20:47:29 test243 23.9 sec 7: 1402 of 25102 94.4% 0.29/s -09-Jan 20:47:40 test29 10.6 sec 3: 1399 of 25102 94.4% 0.28/s -09-Jan 20:47:42 testc2(0,0) 1.3 sec 7: 1392 of 25102 94.5% 5.23/s -09-Jan 20:48:02 testc2(0,0) 19.6 sec 1: 1391 of 25102 94.5% 0.05/s -09-Jan 20:48:04 testc4(0) 0.6 sec 4: 1387 of 25102 94.5% 6.36/s -09-Jan 20:48:19 testc7(0) 14.5 sec 3: 1384 of 25102 94.5% 0.21/s -09-Jan 20:48:24 testcc(1) 5.0 sec 1: 1383 of 25102 94.5% 0.20/s -09-Jan 20:48:33 test187 8.2 sec 3: 1380 of 25102 94.5% 0.36/s -09-Jan 20:48:40 test192 5.6 sec 1: 1379 of 25102 94.5% 0.18/s -09-Jan 20:48:59 test181 18.2 sec 10: 1369 of 25102 94.5% 0.55/s -09-Jan 20:50:48 test185 109.1 sec 6: 1363 of 25102 94.6% 0.05/s -09-Jan 20:51:33 test53 43.6 sec 4: 1359 of 25102 94.6% 0.09/s -09-Jan 20:52:22 test17 48.6 sec 27: 1332 of 25102 94.7% 0.56/s -09-Jan 20:59:30 test231 427.7 sec 162: 1170 of 25102 95.3% 0.38/s -09-Jan 21:48:34 test10 2943.1 sec 970: 200 of 25102 99.2% 0.33/s -09-Jan 22:06:39 test75b 1058.8 sec 155: 45 of 25102 99.8% 0.15/s -09-Jan 22:08:08 test21b 87.4 sec 26: 19 of 25102 99.9% 0.30/s -09-Jan 22:09:00 testca(1) 51.4 sec 5: 14 of 25102 99.9% 0.10/s -09-Jan 22:10:54 test81 112.6 sec 1: 13 of 25102 99.9% 0.01/s -09-Jan 22:16:46 test18 351.2 sec 13: all 25102 full 100% 0.04/s -[malloc debugging turned back on] diff --git a/GraphBLAS/Tcov/log_Mar21.txt b/GraphBLAS/Tcov/log_Mar21.txt new file mode 100644 index 0000000000..2278483a35 --- /dev/null +++ b/GraphBLAS/Tcov/log_Mar21.txt @@ -0,0 +1,205 @@ + +---------------------------------------------- [malloc] [cover] +21-Mar 07:50:09 test169 17.1 sec 550: 24397 of 25111 2.8% 32.14/s +21-Mar 07:50:11 test250 1.4 sec 372: 24025 of 25111 4.3% 272.03/s +21-Mar 07:50:13 test250 2.1 sec 57: 23968 of 25111 4.6% 27.46/s +21-Mar 07:50:13 test279 0.1 sec 119: 23849 of 25111 5.0% 1305.15/s +21-Mar 07:50:13 test278 0.1 sec 48: 23801 of 25111 5.2% 538.99/s +21-Mar 07:50:13 test277 0.1 sec 38: 23763 of 25111 5.4% 444.59/s +21-Mar 07:50:13 test276 0.1 sec 1626: 22137 of 25111 11.8% 20321.70/s +21-Mar 07:50:14 test275 0.1 sec 117: 22020 of 25111 12.3% 1536.24/s +21-Mar 07:50:14 test274 0.1 sec 129: 21891 of 25111 12.8% 1739.53/s +21-Mar 07:50:14 test273 0.2 sec 112: 21779 of 25111 13.3% 645.76/s +21-Mar 07:50:14 test272 0.1 sec 11: 21768 of 25111 13.3% 145.87/s +21-Mar 07:50:14 test271 0.1 sec 497: 21271 of 25111 15.3% 6612.74/s +21-Mar 07:50:14 test270 0.1 sec 286: 20985 of 25111 16.4% 3856.58/s +21-Mar 07:50:14 test269 0.1 sec 83: 20902 of 25111 16.8% 1100.91/s +21-Mar 07:50:15 test268 0.1 sec 5: 20897 of 25111 16.8% 46.09/s +21-Mar 07:50:17 test145 2.2 sec 210: 20687 of 25111 17.6% 94.84/s +21-Mar 07:50:17 test145 0.0 sec 1: 20686 of 25111 17.6% 27.58/s +21-Mar 07:50:17 test145 0.0 sec 18: 20668 of 25111 17.7% 794.04/s +21-Mar 07:50:17 test145 0.0 sec 4: 20664 of 25111 17.7% 221.86/s +21-Mar 07:50:19 test145 1.5 sec 34: 20630 of 25111 17.8% 22.54/s +21-Mar 07:50:19 test145 0.0 sec 3: 20627 of 25111 17.9% 182.85/s +21-Mar 07:50:20 test240 1.2 sec 74: 20550 of 25111 18.2% 62.30/s +21-Mar 07:50:20 test240 0.3 sec 1: 20549 of 25111 18.2% 3.54/s +21-Mar 07:50:22 test237 1.4 sec 40: 20509 of 25111 18.3% 27.64/s +21-Mar 07:50:25 test237 2.8 sec 2: 20507 of 25111 18.3% 0.72/s +21-Mar 07:50:25 test237 0.1 sec 18: 20489 of 25111 18.4% 170.21/s +21-Mar 07:50:25 test237 0.0 sec 6: 20483 of 25111 18.4% 227.98/s +21-Mar 07:50:25 test237 0.1 sec 4: 20479 of 25111 18.4% 47.65/s +21-Mar 07:50:26 test267 0.7 sec 8: 20471 of 25111 18.5% 12.09/s +21-Mar 07:50:26 test267 0.0 sec 1: 20470 of 25111 18.5% 1390.82/s +21-Mar 07:50:27 test265 0.5 sec 36: 20434 of 25111 18.6% 71.16/s +21-Mar 07:50:27 test264 0.1 sec 173: 20261 of 25111 19.3% 2187.82/s +21-Mar 07:50:28 test263 0.8 sec 13: 20248 of 25111 19.4% 15.74/s +21-Mar 07:50:28 test262 0.1 sec 22: 20226 of 25111 19.5% 281.16/s +21-Mar 07:50:28 test261 0.1 sec 22: 20204 of 25111 19.5% 283.35/s +21-Mar 07:50:28 test260 0.1 sec 3: 20201 of 25111 19.6% 40.57/s +21-Mar 07:50:31 test259 2.3 sec 4: 20197 of 25111 19.6% 1.71/s +21-Mar 07:50:31 test258 0.4 sec 20: 20177 of 25111 19.6% 56.34/s +21-Mar 07:50:32 test257 0.3 sec 41: 20136 of 25111 19.8% 143.05/s +21-Mar 07:50:32 test255 0.1 sec 8: 20128 of 25111 19.8% 91.47/s +21-Mar 07:50:32 test254 0.1 sec 14: 20114 of 25111 19.9% 207.79/s +21-Mar 07:50:37 test254 4.9 sec 20: 20094 of 25111 20.0% 4.09/s +21-Mar 07:50:37 test254 0.1 sec 1: 20093 of 25111 20.0% 9.10/s +21-Mar 07:50:38 test253 0.2 sec 9: 20084 of 25111 20.0% 56.44/s +21-Mar 07:50:38 test252 0.1 sec 7: 20077 of 25111 20.0% 92.50/s +21-Mar 07:52:03 test251 85.0 sec 434: 19643 of 25111 21.8% 5.11/s +21-Mar 07:55:34 test251 211.5 sec 76: 19567 of 25111 22.1% 0.36/s +21-Mar 07:55:36 test249 1.3 sec 24: 19543 of 25111 22.2% 18.88/s +21-Mar 07:55:36 test247 0.0 sec 23: 19520 of 25111 22.3% 811.86/s +21-Mar 07:55:47 test246 11.1 sec 70: 19450 of 25111 22.5% 6.32/s +21-Mar 07:56:06 test01 18.6 sec 1340: 18110 of 25111 27.9% 71.92/s +21-Mar 07:56:07 test245 1.0 sec 34: 18076 of 25111 28.0% 34.71/s +21-Mar 07:56:07 test245 0.0 sec 8: 18068 of 25111 28.0% 216.93/s +21-Mar 07:56:08 test199 0.0 sec 1: 18067 of 25111 28.1% 149.90/s +21-Mar 07:56:08 test83 0.1 sec 10: 18057 of 25111 28.1% 129.77/s +21-Mar 07:56:08 test210 0.0 sec 7: 18050 of 25111 28.1% 2143.29/s +21-Mar 07:56:08 test165 0.0 sec 1: 18049 of 25111 28.1% 206.83/s +21-Mar 07:56:08 test219 0.1 sec 9: 18040 of 25111 28.2% 114.72/s +21-Mar 07:56:09 test219 0.3 sec 3: 18037 of 25111 28.2% 10.46/s +21-Mar 07:56:09 test241 0.1 sec 10: 18027 of 25111 28.2% 88.80/s +21-Mar 07:56:09 test220 0.1 sec 10: 18017 of 25111 28.3% 88.20/s +21-Mar 07:56:10 test211 0.0 sec 15: 18002 of 25111 28.3% 450.46/s +21-Mar 07:56:10 test202 0.1 sec 67: 17935 of 25111 28.6% 552.40/s +21-Mar 07:56:10 test202 0.0 sec 1: 17934 of 25111 28.6% 23.10/s +21-Mar 07:56:13 test152 3.1 sec 827: 17107 of 25111 31.9% 270.41/s +21-Mar 07:56:18 test152 4.2 sec 13: 17094 of 25111 31.9% 3.11/s +21-Mar 07:57:35 test152 76.9 sec 245: 16849 of 25111 32.9% 3.19/s +21-Mar 07:57:35 test222 0.2 sec 18: 16831 of 25111 33.0% 112.61/s +21-Mar 07:57:36 test256 0.6 sec 58: 16773 of 25111 33.2% 90.36/s +21-Mar 07:57:39 test186 2.9 sec 44: 16729 of 25111 33.4% 15.37/s +21-Mar 07:57:40 test186 0.4 sec 3: 16726 of 25111 33.4% 6.70/s +21-Mar 07:57:40 test186(0) 0.4 sec 5: 16721 of 25111 33.4% 12.60/s +21-Mar 07:57:41 test150 0.2 sec 36: 16685 of 25111 33.6% 173.63/s +21-Mar 07:57:41 test239 0.1 sec 15: 16670 of 25111 33.6% 135.61/s +21-Mar 07:57:42 test239 0.9 sec 2: 16668 of 25111 33.6% 2.18/s +21-Mar 07:57:42 test235 0.0 sec 4: 16664 of 25111 33.6% 102.84/s +21-Mar 07:57:43 test226 0.0 sec 8: 16656 of 25111 33.7% 531.21/s +21-Mar 07:57:43 test223 0.0 sec 2: 16654 of 25111 33.7% 66.81/s +21-Mar 07:57:43 test204 0.1 sec 14: 16640 of 25111 33.7% 95.85/s +21-Mar 07:57:43 test203 0.1 sec 9: 16631 of 25111 33.8% 116.95/s +21-Mar 07:57:44 test183 0.0 sec 12: 16619 of 25111 33.8% 449.15/s +21-Mar 07:57:44 test179 0.1 sec 15: 16604 of 25111 33.9% 120.94/s +21-Mar 07:57:46 test179 1.9 sec 4: 16600 of 25111 33.9% 2.10/s +21-Mar 07:57:47 test174 0.1 sec 10: 16590 of 25111 33.9% 193.64/s +21-Mar 07:57:47 test155 0.1 sec 41: 16549 of 25111 34.1% 293.90/s +21-Mar 07:57:47 test136 0.2 sec 55: 16494 of 25111 34.3% 283.29/s +21-Mar 07:57:48 test02 0.7 sec 247: 16247 of 25111 35.3% 348.25/s +21-Mar 07:57:49 test109 0.5 sec 10: 16237 of 25111 35.3% 21.79/s +21-Mar 07:57:49 test109 0.0 sec 4: 16233 of 25111 35.4% 1164.82/s +21-Mar 07:57:50 test109 0.4 sec 8: 16225 of 25111 35.4% 21.68/s +21-Mar 07:57:50 test04 0.1 sec 15: 16210 of 25111 35.4% 135.88/s +21-Mar 07:57:50 test207 0.0 sec 2: 16208 of 25111 35.5% 470.37/s +21-Mar 07:57:51 test221 0.0 sec 2: 16206 of 25111 35.5% 281.25/s +21-Mar 07:57:51 test162 0.1 sec 3: 16203 of 25111 35.5% 48.76/s +21-Mar 07:57:54 test159 2.5 sec 72: 16131 of 25111 35.8% 29.25/s +21-Mar 07:57:54 test09 0.0 sec 5: 16126 of 25111 35.8% 414.52/s +21-Mar 07:57:54 test132 0.1 sec 8: 16118 of 25111 35.8% 82.14/s +21-Mar 07:58:07 test141 12.7 sec 549: 15569 of 25111 38.0% 43.27/s +21-Mar 07:58:09 testc2(1,1) 1.4 sec 20: 15549 of 25111 38.1% 14.56/s +21-Mar 07:58:16 testc2(1,1) 6.6 sec 4: 15545 of 25111 38.1% 0.60/s +21-Mar 07:58:16 test214 0.0 sec 3: 15542 of 25111 38.1% 308.10/s +21-Mar 07:58:17 test213 0.0 sec 2: 15540 of 25111 38.1% 176.41/s +21-Mar 07:58:20 test206 2.6 sec 221: 15319 of 25111 39.0% 83.80/s +21-Mar 07:58:37 test206 17.1 sec 24: 15295 of 25111 39.1% 1.40/s +21-Mar 07:58:37 test212 0.0 sec 8: 15287 of 25111 39.1% 394.19/s +21-Mar 07:58:38 test212 0.2 sec 2: 15285 of 25111 39.1% 10.49/s +21-Mar 07:58:39 test128 0.3 sec 41: 15244 of 25111 39.3% 118.86/s +21-Mar 07:58:39 test82 0.1 sec 16: 15228 of 25111 39.4% 176.26/s +21-Mar 07:58:42 test229 3.1 sec 9: 15219 of 25111 39.4% 2.92/s +21-Mar 07:58:44 test229 1.1 sec 1: 15218 of 25111 39.4% 0.95/s +21-Mar 07:58:45 test144 0.6 sec 2: 15216 of 25111 39.4% 3.41/s +21-Mar 08:00:07 test14 82.4 sec 662: 14554 of 25111 42.0% 8.03/s +21-Mar 08:04:35 test14 267.4 sec 118: 14436 of 25111 42.5% 0.44/s +21-Mar 08:04:45 test180 9.0 sec 128: 14308 of 25111 43.0% 14.21/s +21-Mar 08:04:49 test236 3.7 sec 74: 14234 of 25111 43.3% 20.20/s +21-Mar 08:04:52 test232 2.6 sec 22: 14212 of 25111 43.4% 8.38/s +21-Mar 08:05:12 test228 19.7 sec 27: 14185 of 25111 43.5% 1.37/s +21-Mar 08:07:15 test154 122.3 sec 1502: 12683 of 25111 49.5% 12.28/s +21-Mar 08:13:36 test154 381.2 sec 2: 12681 of 25111 49.5% 0.01/s +21-Mar 08:13:51 test238 14.8 sec 54: 12627 of 25111 49.7% 3.65/s +21-Mar 08:15:02 test238 69.8 sec 9: 12618 of 25111 49.8% 0.13/s +21-Mar 08:16:43 test151b 101.3 sec 126: 12492 of 25111 50.3% 1.24/s +21-Mar 08:16:47 test184 3.1 sec 38: 12454 of 25111 50.4% 12.26/s +21-Mar 08:17:00 test191 12.9 sec 21: 12433 of 25111 50.5% 1.63/s +21-Mar 08:17:29 test191 28.6 sec 3: 12430 of 25111 50.5% 0.10/s +21-Mar 08:25:00 test188 450.3 sec 212: 12218 of 25111 51.3% 0.47/s +21-Mar 08:27:30 test188 148.9 sec 3: 12215 of 25111 51.4% 0.02/s +21-Mar 08:27:36 test224 5.2 sec 24: 12191 of 25111 51.5% 4.58/s +21-Mar 08:27:38 test196 2.4 sec 11: 12180 of 25111 51.5% 4.56/s +21-Mar 08:27:44 test209 5.4 sec 20: 12160 of 25111 51.6% 3.68/s +21-Mar 08:28:04 test104 19.0 sec 40: 12120 of 25111 51.7% 2.11/s +21-Mar 08:28:12 test189 8.0 sec 1: 12119 of 25111 51.7% 0.12/s +21-Mar 08:29:23 test194 70.1 sec 5: 12114 of 25111 51.8% 0.07/s +21-Mar 08:29:39 test76 16.0 sec 15: 12099 of 25111 51.8% 0.94/s +21-Mar 08:30:21 test244 41.0 sec 17: 12082 of 25111 51.9% 0.41/s +[malloc debugging turned off] +21-Mar 08:30:21 test201 0.0 sec 3: 12079 of 25111 51.9% 377.74/s +21-Mar 08:30:22 test225 0.1 sec 1: 12078 of 25111 51.9% 6.95/s +21-Mar 08:30:22 test176 0.1 sec 5: 12073 of 25111 51.9% 66.48/s +21-Mar 08:30:23 test208 0.0 sec 5: 12068 of 25111 51.9% 302.72/s +21-Mar 08:30:23 test216 0.1 sec 3: 12065 of 25111 52.0% 33.92/s +21-Mar 08:30:48 test142 24.0 sec 631: 11434 of 25111 54.5% 26.33/s +21-Mar 08:35:28 test142 279.9 sec 10: 11424 of 25111 54.5% 0.04/s +21-Mar 08:35:53 test142 23.6 sec 2: 11422 of 25111 54.5% 0.08/s +21-Mar 08:35:53 test137 0.4 sec 3: 11419 of 25111 54.5% 7.70/s +21-Mar 08:35:54 test137 0.0 sec 2: 11417 of 25111 54.5% 281.53/s +21-Mar 08:35:55 test139 0.4 sec 2: 11415 of 25111 54.5% 5.41/s +21-Mar 08:35:55 test172 0.1 sec 3: 11412 of 25111 54.6% 39.19/s +21-Mar 08:35:57 test148 0.8 sec 4: 11408 of 25111 54.6% 4.94/s +21-Mar 08:35:58 test157 0.7 sec 12: 11396 of 25111 54.6% 17.23/s +21-Mar 08:35:59 test182 1.0 sec 5: 11391 of 25111 54.6% 5.25/s +21-Mar 08:36:00 test108 0.6 sec 2: 11389 of 25111 54.6% 3.23/s +21-Mar 08:36:01 test108 0.4 sec 2: 11387 of 25111 54.7% 5.41/s +21-Mar 08:36:03 test130 0.8 sec 22: 11365 of 25111 54.7% 26.46/s +21-Mar 08:36:03 test124 0.2 sec 3: 11362 of 25111 54.8% 17.33/s +21-Mar 08:36:04 test138 0.0 sec 1: 11361 of 25111 54.8% 20.29/s +21-Mar 08:36:09 test227 4.8 sec 27: 11334 of 25111 54.9% 5.58/s +21-Mar 08:36:39 test125 29.4 sec 630: 10704 of 25111 57.4% 21.46/s +21-Mar 08:39:05 test234 144.9 sec 385: 10319 of 25111 58.9% 2.66/s +21-Mar 08:42:51 test234 225.6 sec 3: 10316 of 25111 58.9% 0.01/s +21-Mar 08:43:40 test242 48.2 sec 77: 10239 of 25111 59.2% 1.60/s +21-Mar 08:43:42 test173 1.6 sec 11: 10228 of 25111 59.3% 7.06/s +21-Mar 08:43:46 test200 3.2 sec 10: 10218 of 25111 59.3% 3.09/s +21-Mar 08:43:46 test197 0.1 sec 1: 10217 of 25111 59.3% 7.52/s +21-Mar 08:43:48 test84 1.3 sec 18: 10199 of 25111 59.4% 13.38/s +21-Mar 08:43:55 test19b 6.0 sec 59: 10140 of 25111 59.6% 9.83/s +21-Mar 08:43:56 test133 0.4 sec 2: 10138 of 25111 59.6% 5.21/s +21-Mar 08:44:00 test80 4.0 sec 12: 10126 of 25111 59.7% 3.03/s +21-Mar 08:45:05 test23 63.9 sec 148: 9978 of 25111 60.3% 2.31/s +21-Mar 08:45:07 test135 1.9 sec 7: 9971 of 25111 60.3% 3.69/s +21-Mar 08:46:23 test160 74.6 sec 24: 9947 of 25111 60.4% 0.32/s +21-Mar 08:46:28 test54 5.2 sec 20: 9927 of 25111 60.5% 3.85/s +21-Mar 08:46:30 test129 1.2 sec 4: 9923 of 25111 60.5% 3.45/s +21-Mar 08:46:33 test69 2.1 sec 6: 9917 of 25111 60.5% 2.91/s +21-Mar 08:48:07 test230 93.5 sec 114: 9803 of 25111 61.0% 1.22/s +21-Mar 09:21:15 test74 1987.5 sec 6637: 3166 of 25111 87.4% 3.34/s +21-Mar 09:33:25 test127 729.1 sec 1703: 1463 of 25111 94.2% 2.34/s +21-Mar 09:33:29 test19 3.3 sec 12: 1451 of 25111 94.2% 3.65/s +21-Mar 09:33:33 test11 3.8 sec 3: 1448 of 25111 94.2% 0.78/s +21-Mar 09:33:37 test215 2.9 sec 1: 1447 of 25111 94.2% 0.34/s +21-Mar 09:33:55 test193 17.1 sec 5: 1442 of 25111 94.3% 0.29/s +21-Mar 09:36:35 test195 159.4 sec 39: 1403 of 25111 94.4% 0.24/s +21-Mar 09:37:00 test243 24.9 sec 7: 1396 of 25111 94.4% 0.28/s +21-Mar 09:37:12 test29 10.8 sec 3: 1393 of 25111 94.5% 0.28/s +21-Mar 09:37:14 testc2(0,0) 1.3 sec 7: 1386 of 25111 94.5% 5.30/s +21-Mar 09:37:34 testc2(0,0) 19.6 sec 1: 1385 of 25111 94.5% 0.05/s +21-Mar 09:37:35 testc4(0) 0.6 sec 4: 1381 of 25111 94.5% 6.53/s +21-Mar 09:37:51 testc7(0) 14.7 sec 3: 1378 of 25111 94.5% 0.20/s +21-Mar 09:37:57 testcc(1) 5.1 sec 1: 1377 of 25111 94.5% 0.20/s +21-Mar 09:38:06 test187 8.6 sec 3: 1374 of 25111 94.5% 0.35/s +21-Mar 09:38:12 test192 5.8 sec 1: 1373 of 25111 94.5% 0.17/s +21-Mar 09:38:32 test181 18.5 sec 4: 1369 of 25111 94.5% 0.22/s +21-Mar 09:40:22 test185 109.6 sec 6: 1363 of 25111 94.6% 0.05/s +21-Mar 09:41:06 test53 43.6 sec 4: 1359 of 25111 94.6% 0.09/s +21-Mar 09:41:57 test17 49.7 sec 27: 1332 of 25111 94.7% 0.54/s +21-Mar 09:49:21 test231 443.1 sec 162: 1170 of 25111 95.3% 0.37/s +21-Mar 10:44:39 test10 3317.2 sec 970: 200 of 25111 99.2% 0.29/s +21-Mar 11:03:35 test75b 1112.2 sec 155: 45 of 25111 99.8% 0.14/s +21-Mar 11:05:08 test21b 90.6 sec 26: 19 of 25111 99.9% 0.29/s +21-Mar 11:06:01 testca(1) 52.1 sec 5: 14 of 25111 99.9% 0.10/s +21-Mar 11:08:01 test81 119.4 sec 1: 13 of 25111 99.9% 0.01/s +21-Mar 11:14:12 test18 369.8 sec 13: all 25111 full 100% 0.04/s +[malloc debugging turned back on] diff --git a/SPEX/Tcov/.gitignore b/SPEX/Tcov/.gitignore index 16893476e8..14492e7198 100644 --- a/SPEX/Tcov/.gitignore +++ b/SPEX/Tcov/.gitignore @@ -7,3 +7,4 @@ spex_demo_lu_extended tcov_for_cholesky tcov_for_lu tcov_for_lu2 +tcov_for_other diff --git a/SPEX/Tcov/tcov_for_other b/SPEX/Tcov/tcov_for_other deleted file mode 100755 index 1f3b2c57be83cb7bf6b69b8e17c8e49d4a3ec910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 450208 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 b{282k3PWmNjuY0&fBV46+i`KPB9;FSqoM`& From 9a45c2165cf7777b26cb9e9da75867886e69ad4f Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 21 Mar 2024 13:11:07 -0500 Subject: [PATCH 88/98] LAGraph: test BF --- LAGraph/experimental/test/test_BF.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/LAGraph/experimental/test/test_BF.c b/LAGraph/experimental/test/test_BF.c index e5e88ff4e6..ad48ca5d68 100644 --- a/LAGraph/experimental/test/test_BF.c +++ b/LAGraph/experimental/test/test_BF.c @@ -396,6 +396,8 @@ void test_BF (void) // since d5 is a dense vector filled with infinity, we have // to compare it against d seperaterly OK (GrB_Vector_extractElement (&di, d5, i)) ; + printf ("di %g d[i] %g difference %g\n", + di, d [i], di - d [i]) ; TEST_CHECK (di == d[i]) ; // since d5a is a dense vector filled with infinity, we From e14cf132c0cdbefae34b5d71b15071ee0e2b8a94 Mon Sep 17 00:00:00 2001 From: Erick Date: Thu, 21 Mar 2024 15:30:08 -0500 Subject: [PATCH 89/98] Copyright Updates Updated to 2024 Homogenized all names, and orders. --- LICENSE.txt | 4 ++-- SPEX/CMakeLists.txt | 3 ++- SPEX/Config/SPEX.h.in | 8 ++++---- SPEX/Config/SPEX.pc.in | 6 +++--- SPEX/Config/SPEXConfig.cmake.in | 6 +++--- SPEX/Config/Tcov_Makefile.in | 4 ++-- SPEX/Config/spex_deps.m.in | 2 +- SPEX/Demo/Utilities/spex_demo_check_solution.c | 2 +- SPEX/Demo/Utilities/spex_demo_determine_error.c | 2 +- SPEX/Demo/Utilities/spex_demo_process_command_line.c | 2 +- SPEX/Demo/Utilities/spex_demo_read_dense.c | 2 +- SPEX/Demo/Utilities/spex_demo_tripread.c | 2 +- SPEX/Demo/spex_demo_backslash.c | 2 +- SPEX/Demo/spex_demo_cholesky_extended.c | 2 +- SPEX/Demo/spex_demo_cholesky_simple.c | 2 +- SPEX/Demo/spex_demo_lu_doub.c | 2 +- SPEX/Demo/spex_demo_lu_extended.c | 2 +- SPEX/Demo/spex_demo_lu_simple1.c | 2 +- SPEX/Demo/spex_demo_lu_simple2.c | 2 +- SPEX/Demo/spex_demo_threaded.c | 2 +- SPEX/Demo/spex_demos.h | 2 +- SPEX/Doc/Makefile | 4 ++-- SPEX/Doc/SPEX_UserGuide.tex | 6 +++--- SPEX/Include/SPEX.h | 12 ++++++------ 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 ++-- SPEX/MATLAB/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 | 4 ++-- SPEX/MATLAB/spex_mex_test.m | 4 ++-- SPEX/Makefile | 2 +- SPEX/Python/SPEXpy/Options.py | 4 ++-- SPEX/Python/SPEXpy/SPEX_error.py | 4 ++-- SPEX/Python/SPEXpy/Source/spex_python_connect.c | 4 ++-- SPEX/Python/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 ++-- SPEX/SPEX_Cholesky/Source/SPEX_cholesky_analyze.c | 4 ++-- SPEX/SPEX_Cholesky/Source/SPEX_cholesky_backslash.c | 4 ++-- SPEX/SPEX_Cholesky/Source/SPEX_cholesky_factorize.c | 4 ++-- SPEX/SPEX_Cholesky/Source/SPEX_cholesky_solve.c | 4 ++-- .../Source/spex_cholesky_backward_sub.c | 4 ++-- SPEX/SPEX_Cholesky/Source/spex_cholesky_counts.c | 4 ++-- SPEX/SPEX_Cholesky/Source/spex_cholesky_ereach.c | 4 ++-- SPEX/SPEX_Cholesky/Source/spex_cholesky_etree.c | 4 ++-- SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c | 4 ++-- .../SPEX_Cholesky/Source/spex_cholesky_forward_sub.c | 4 ++-- SPEX/SPEX_Cholesky/Source/spex_cholesky_internal.h | 4 ++-- SPEX/SPEX_Cholesky/Source/spex_cholesky_leaf.c | 4 ++-- .../SPEX_Cholesky/Source/spex_cholesky_left_factor.c | 4 ++-- .../Source/spex_cholesky_left_triangular_solve.c | 4 ++-- SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c | 4 ++-- SPEX/SPEX_Cholesky/Source/spex_cholesky_post.c | 4 ++-- .../Source/spex_cholesky_pre_left_factor.c | 4 ++-- SPEX/SPEX_Cholesky/Source/spex_cholesky_preorder.c | 4 ++-- .../Source/spex_cholesky_symbolic_analysis.c | 4 ++-- SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c | 4 ++-- SPEX/SPEX_Cholesky/Source/spex_cholesky_up_factor.c | 4 ++-- .../Source/spex_cholesky_up_triangular_solve.c | 4 ++-- 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/SPEX_LU/Source/spex_left_lu_forward_sub.c | 4 ++-- SPEX/SPEX_LU/Source/spex_left_lu_get_largest_pivot.c | 4 ++-- SPEX/SPEX_LU/Source/spex_left_lu_get_nonzero_pivot.c | 4 ++-- SPEX/SPEX_LU/Source/spex_left_lu_get_pivot.c | 4 ++-- .../SPEX_LU/Source/spex_left_lu_get_smallest_pivot.c | 4 ++-- SPEX/SPEX_LU/Source/spex_left_lu_reach.c | 4 ++-- .../Source/spex_left_lu_ref_triangular_solve.c | 4 ++-- 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 ++-- SPEX/SPEX_Utilities/Source/SPEX_determine_symmetry.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_factorization_free.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_finalize.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_free.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_gmp.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_initialize.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_malloc.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_matrix_allocate.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_realloc.c | 4 ++-- .../Source/SPEX_symbolic_analysis_free.c | 4 ++-- SPEX/SPEX_Utilities/Source/SPEX_thread_finalize.c | 4 ++-- SPEX/SPEX_Utilities/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 | 4 ++-- SPEX/SPEX_Utilities/Source/spex_cast_matrix.c | 4 ++-- SPEX/SPEX_Utilities/Source/spex_colamd.c | 4 ++-- SPEX/SPEX_Utilities/Source/spex_create_mpfr_array.c | 4 ++-- SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c | 4 ++-- SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c | 4 ++-- SPEX/SPEX_Utilities/Source/spex_cumsum.c | 4 ++-- .../SPEX_Utilities/Source/spex_expand_double_array.c | 4 ++-- SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c | 4 ++-- SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c | 4 ++-- SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c | 2 +- SPEX/SPEX_Utilities/Source/spex_free_mpq_array.c | 2 +- SPEX/SPEX_Utilities/Source/spex_free_mpz_array.c | 2 +- SPEX/SPEX_Utilities/Source/spex_gmp.h | 4 ++-- SPEX/SPEX_Utilities/Source/spex_matrix_mul.c | 4 ++-- .../Source/spex_permute_dense_matrix.c | 4 ++-- SPEX/SPEX_Utilities/Source/spex_sparse_collapse.c | 4 ++-- SPEX/SPEX_Utilities/Source/spex_sparse_realloc.c | 4 ++-- SPEX/SPEX_Utilities/Source/spex_util_internal.h | 4 ++-- SPEX/Tcov/simple_rand.c | 4 ++-- SPEX/Tcov/simple_rand.h | 4 ++-- SPEX/Tcov/tcov_for_cholesky.c | 4 ++-- SPEX/Tcov/tcov_for_lu.c | 4 ++-- SPEX/Tcov/tcov_for_lu2.c | 4 ++-- SPEX/Tcov/tcov_for_other.c | 4 ++-- SPEX/Tcov/tcov_utilities.c | 4 ++-- SPEX/Tcov/tcov_utilities.h | 4 ++-- SPEX/cmake_modules/FindGMP.cmake | 2 +- SPEX/cmake_modules/FindMPFR.cmake | 2 +- 143 files changed, 274 insertions(+), 273 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 8c6d47346c..a7c00205be 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -6,8 +6,8 @@ found in the lists below. SPEX: a Sparse Left-looking Integer-Preserving LU Factorization - Copyright (c) 2019-2023, Christopher Lourenco, JinHao Chen, Erick Moreno- - Centeno, and Timothy A. Davis. + Copyright (c) 2019-2024, Christopher Lourenco, JinHao Chen, + Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. Available at: diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index 29b647e064..a41d1eaf74 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -3,7 +3,8 @@ #------------------------------------------------------------------------------- # SPEX: (c) 2019-2024, Chris Lourenco (US Naval Academy), Jinhao Chen, -# Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights Reserved. +# 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 #------------------------------------------------------------------------------- diff --git a/SPEX/Config/SPEX.h.in b/SPEX/Config/SPEX.h.in index fb5865182b..c0146ba50a 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, 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 @@ -1060,7 +1060,7 @@ SPEX_info SPEX_mpfr_clear (mpfr_t x) ; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// Christopher Lourenco, Jinhao Chen, Timothy A. Davis, and Erick Moreno-Centeno +// Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis //------------------------------------------------------------------------------ @@ -1211,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. //------------------------------------------------------------------------------ diff --git a/SPEX/Config/SPEX.pc.in b/SPEX/Config/SPEX.pc.in index ce8eeef1ef..2f347cfa1f 100644 --- a/SPEX/Config/SPEX.pc.in +++ b/SPEX/Config/SPEX.pc.in @@ -1,6 +1,6 @@ -# SPEX, Copyright (c) 2019-2024, Chris Lourenco (US Naval Academy), Jinhao -# Chen, Erick Moreno-Centeno, Lorena Mejia Domenzain, Timothy A. Davis, Texas -# A&M. All Rights Reserved. +# 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@ diff --git a/SPEX/Config/SPEXConfig.cmake.in b/SPEX/Config/SPEXConfig.cmake.in index 66c7c54741..d61890d67b 100644 --- a/SPEX/Config/SPEXConfig.cmake.in +++ b/SPEX/Config/SPEXConfig.cmake.in @@ -2,9 +2,9 @@ # SuiteSparse/SPEX/cmake_modules/SPEXConfig.cmake #------------------------------------------------------------------------------- -# SPEX, Copyright (c) 2019-2023, Chris Lourenco (US Naval Academy), Jinhao -# Chen, Erick Moreno-Centeno, Timothy A. Davis, Texas A&M. All Rights -# Reserved. +# 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 #------------------------------------------------------------------------------- diff --git a/SPEX/Config/Tcov_Makefile.in b/SPEX/Config/Tcov_Makefile.in index 7ebcba74b7..450815feae 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 diff --git a/SPEX/Config/spex_deps.m.in b/SPEX/Config/spex_deps.m.in index 40fd02a461..73e347c8e5 100644 --- a/SPEX/Config/spex_deps.m.in +++ b/SPEX/Config/spex_deps.m.in @@ -9,7 +9,7 @@ function [suitesparse_libdir, suitesparse_incdir, gmp_lib, gmp_include, mpfr_lib % LD_LIBRARY_PATH=$LD_LIBRARY_PATH:@matlab_libdir@ % SPEX: (c) 2022-2024, Chris Lourenco, Jinhao Chen, -% Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +% 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_check_solution.c b/SPEX/Demo/Utilities/spex_demo_check_solution.c index d55aa92e88..adaf402b4b 100644 --- a/SPEX/Demo/Utilities/spex_demo_check_solution.c +++ b/SPEX/Demo/Utilities/spex_demo_check_solution.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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_determine_error.c b/SPEX/Demo/Utilities/spex_demo_determine_error.c index 1133903dd4..d11d518c6b 100644 --- a/SPEX/Demo/Utilities/spex_demo_determine_error.c +++ b/SPEX/Demo/Utilities/spex_demo_determine_error.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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_process_command_line.c b/SPEX/Demo/Utilities/spex_demo_process_command_line.c index ce0e7ba31a..84b8de4302 100644 --- a/SPEX/Demo/Utilities/spex_demo_process_command_line.c +++ b/SPEX/Demo/Utilities/spex_demo_process_command_line.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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 003a5b5c83..2bd6d59c05 100644 --- a/SPEX/Demo/Utilities/spex_demo_read_dense.c +++ b/SPEX/Demo/Utilities/spex_demo_read_dense.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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 d39f0a2e1e..363937e0a0 100644 --- a/SPEX/Demo/Utilities/spex_demo_tripread.c +++ b/SPEX/Demo/Utilities/spex_demo_tripread.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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/spex_demo_backslash.c b/SPEX/Demo/spex_demo_backslash.c index 13242134a0..59e0ea70dd 100644 --- a/SPEX/Demo/spex_demo_backslash.c +++ b/SPEX/Demo/spex_demo_backslash.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2021-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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/spex_demo_cholesky_extended.c b/SPEX/Demo/spex_demo_cholesky_extended.c index bc09149cf5..abe4595c4d 100644 --- a/SPEX/Demo/spex_demo_cholesky_extended.c +++ b/SPEX/Demo/spex_demo_cholesky_extended.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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/spex_demo_cholesky_simple.c b/SPEX/Demo/spex_demo_cholesky_simple.c index 9511578168..4652358e30 100644 --- a/SPEX/Demo/spex_demo_cholesky_simple.c +++ b/SPEX/Demo/spex_demo_cholesky_simple.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2022-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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/spex_demo_lu_doub.c b/SPEX/Demo/spex_demo_lu_doub.c index 9b77c861e3..fbe973bd50 100644 --- a/SPEX/Demo/spex_demo_lu_doub.c +++ b/SPEX/Demo/spex_demo_lu_doub.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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/spex_demo_lu_extended.c b/SPEX/Demo/spex_demo_lu_extended.c index dc959dae42..7502b6c293 100644 --- a/SPEX/Demo/spex_demo_lu_extended.c +++ b/SPEX/Demo/spex_demo_lu_extended.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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/spex_demo_lu_simple1.c b/SPEX/Demo/spex_demo_lu_simple1.c index 1ca3b87386..7e8f654ade 100644 --- a/SPEX/Demo/spex_demo_lu_simple1.c +++ b/SPEX/Demo/spex_demo_lu_simple1.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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/spex_demo_lu_simple2.c b/SPEX/Demo/spex_demo_lu_simple2.c index ffecb9d933..219316dcf4 100644 --- a/SPEX/Demo/spex_demo_lu_simple2.c +++ b/SPEX/Demo/spex_demo_lu_simple2.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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/spex_demo_threaded.c b/SPEX/Demo/spex_demo_threaded.c index f434155e40..05753f2c97 100644 --- a/SPEX/Demo/spex_demo_threaded.c +++ b/SPEX/Demo/spex_demo_threaded.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2021-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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/spex_demos.h b/SPEX/Demo/spex_demos.h index b3b8109cd7..8c7fef404a 100644 --- a/SPEX/Demo/spex_demos.h +++ b/SPEX/Demo/spex_demos.h @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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/Makefile b/SPEX/Doc/Makefile index 2d933eea0f..a210f9ee24 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_UserGuide.tex b/SPEX/Doc/SPEX_UserGuide.tex index 548e75723b..e0d56eee3a 100644 --- a/SPEX/Doc/SPEX_UserGuide.tex +++ b/SPEX/Doc/SPEX_UserGuide.tex @@ -1918,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, @@ -2373,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, @@ -2535,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/Include/SPEX.h b/SPEX/Include/SPEX.h index 00cbbdba23..b05e9efd21 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, 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 @@ -67,7 +67,7 @@ // 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. +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // @@ -1060,7 +1060,7 @@ SPEX_info SPEX_mpfr_clear (mpfr_t x) ; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// Christopher Lourenco, Jinhao Chen, Timothy A. Davis, and Erick Moreno-Centeno +// Christopher Lourenco, Jinhao Chen, Erick Moreno-Centeno, and Timothy A. Davis //------------------------------------------------------------------------------ @@ -1210,8 +1210,8 @@ 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. +// Christopher Lourenco, Lorena Mejia Domenzain, Jinhao Chen, +// Erick Moreno-Centeno, and Timothy A. Davis. //------------------------------------------------------------------------------ diff --git a/SPEX/LICENSE.txt b/SPEX/LICENSE.txt index 0020fe095d..2516bc7174 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 a951aefd59..07f418ccbd 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 6242b4f381..bfadbfbf70 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 3d978a1a59..f28cbd669e 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 f9c32d3d42..10713b0104 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 624b1f8710..b2ee0980df 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 73b30bdac5..b783ab2935 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 a6b84e3a5a..664b5a3fb0 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 791af8aed2..1f2c67fdc3 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 7684c0e20f..7c9b7389d6 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 15f45be0b4..1afe394284 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 151d55f87d..8530b170f2 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 bb393a5cab..e20780f0a1 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 a443f60a6b..91570067eb 100644 --- a/SPEX/MATLAB/spex_mex_install.m +++ b/SPEX/MATLAB/spex_mex_install.m @@ -11,8 +11,8 @@ function spex_mex_install(run_demo) % 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, 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_test.m b/SPEX/MATLAB/spex_mex_test.m index 610f45726a..797092a100 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 diff --git a/SPEX/Makefile b/SPEX/Makefile index 68328e2859..4ededd7184 100644 --- a/SPEX/Makefile +++ b/SPEX/Makefile @@ -3,7 +3,7 @@ #------------------------------------------------------------------------------- # SPEX: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -# Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +# 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/Options.py b/SPEX/Python/SPEXpy/Options.py index 85a28f7541..54e07b0172 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 5680bb2a5b..d15ae43d34 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 728505f891..d3fe5e10f9 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 eb227efd49..06d0e6d861 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 0d348eab60..ab83e6dfc0 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 b057b94fad..66ea49dc1c 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 bde5ff4ce1..61b56bcc34 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 3810af8820..4db6b36c08 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 b8c4a1a273..2a1c98f07b 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 37e151356b..f70668b961 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 f1e7e01621..71c3a2a9b9 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 f81e281688..d289a39f3e 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 76433e5082..623a767ec7 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 ac5cd4a939..b29eb69089 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 05e169045f..26173b2904 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 575812b01a..88c9a10693 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 c662cb9acb..387f75cf78 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 f42f15a7f4..5fa2a7d0fc 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 6e70d9f283..0f6d0fbad5 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 1802865a97..91009aaea1 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 a7559a0b53..80e917d355 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 8c2d8f2fc5..dd35212831 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 a5dc8350ff..a8dab71dac 100644 --- a/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c +++ b/SPEX/SPEX_Cholesky/Source/spex_cholesky_factor.c @@ -2,8 +2,8 @@ // 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 diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_forward_sub.c index d4880ffeec..385151684e 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 67013e6264..73a6206175 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 1ac8814249..cbbd375a80 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 d9c03227e9..3611b41677 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 e6838cd62c..e3d7392c6c 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 diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_permute_A.c index bcc3a5d7b8..1280d97485 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 6142df5330..6ff7d7215b 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 5b42a4e363..75871a454a 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 4c953fdfff..dd3560d347 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 bd62a25f32..aac78c1074 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 diff --git a/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c b/SPEX/SPEX_Cholesky/Source/spex_cholesky_tdfs.c index a1456cfc4d..9f7bf67d3f 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 67dcaca5bc..06ef00a717 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 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 084114f668..e6c8a4d163 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 diff --git a/SPEX/SPEX_LU/License/license.txt b/SPEX/SPEX_LU/License/license.txt index 5174d2bd10..a4615bf8a8 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 970a4347b7..63ed8f92ec 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 8739db221c..db16f1ce1c 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 eac7505861..0e79ac62ac 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 4dca51d78c..09ace23d35 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 6cc147e7c1..a0ff47f82f 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 2f0b8cbeaf..1cb5f11975 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 1e1366905e..4177697c60 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 0bb4b9c822..a09a28dd16 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 //------------------------------------------------------------------------------ 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 3dc8e88bf0..0366c092a3 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 72d1f4ff83..21ae715deb 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 //------------------------------------------------------------------------------ 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 987ba23472..e50cfb8558 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 //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_left_lu_reach.c b/SPEX/SPEX_LU/Source/spex_left_lu_reach.c index e73d84f413..03cb5e6a65 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 093732bec8..d5a7b89c6c 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 //------------------------------------------------------------------------------ diff --git a/SPEX/SPEX_LU/Source/spex_lu_internal.h b/SPEX/SPEX_LU/Source/spex_lu_internal.h index 577e4bf463..73ba8990e9 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 44cb885689..dc36687051 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 49bdc9d4f8..fa982af825 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 e521a3e8df..1636682402 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 a6f14b86d8..f85cc5f961 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 124f19807d..bce7d24f6c 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 diff --git a/SPEX/SPEX_Utilities/Source/SPEX_finalize.c b/SPEX/SPEX_Utilities/Source/SPEX_finalize.c index 9276f9fcef..5bfeed3553 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 28db44e25e..c746a62e2c 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 d70f46347a..217a91100e 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 diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize.c index 61bb943e98..869eb91580 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 diff --git a/SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c b/SPEX/SPEX_Utilities/Source/SPEX_initialize_expert.c index 5d1d7e58b3..819ef97b94 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 422a138f61..ac93fdc7e1 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 9c06edf046..95ac35c7e6 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 diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c index ee85fbe857..f40223b84b 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_check.c @@ -2,8 +2,8 @@ // 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 diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_copy.c index efb5fafe75..dc27a9b63c 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 1a7d51daa3..0edf8e5dcf 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_free.c @@ -2,8 +2,8 @@ // 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 diff --git a/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c b/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c index 12ee7faca6..0747e676aa 100644 --- a/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c +++ b/SPEX/SPEX_Utilities/Source/SPEX_matrix_nnz.c @@ -2,8 +2,8 @@ // 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 diff --git a/SPEX/SPEX_Utilities/Source/SPEX_realloc.c b/SPEX/SPEX_Utilities/Source/SPEX_realloc.c index b5e9ebcede..a8b0a52679 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 7666123b80..e32a7bf319 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 2e53c7a85e..fddb7f96e9 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 67ab3bd2b5..f13b5bf733 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 177ee8c361..6fa83e825e 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 de4c09d4a4..46918528a1 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 7f41ab8949..d5dfa81dc7 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 0f2e30fba4..f1bb6349f8 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 diff --git a/SPEX/SPEX_Utilities/Source/spex_cast_matrix.c b/SPEX/SPEX_Utilities/Source/spex_cast_matrix.c index 223971e2c0..38fdd594a0 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 ff9cfb27f1..b1abcd43bc 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 94cc3c0479..85b9e36382 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 diff --git a/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c b/SPEX/SPEX_Utilities/Source/spex_create_mpq_array.c index 4921cd093c..480b09fc7a 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 diff --git a/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c b/SPEX/SPEX_Utilities/Source/spex_create_mpz_array.c index f49e176a7e..e758be61bc 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 diff --git a/SPEX/SPEX_Utilities/Source/spex_cumsum.c b/SPEX/SPEX_Utilities/Source/spex_cumsum.c index d7f8ccd887..6a386a2a06 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 58ec0837aa..57ce2bed33 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 diff --git a/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c b/SPEX/SPEX_Utilities/Source/spex_expand_mpfr_array.c index 60e0a65927..44ddb5919a 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 diff --git a/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c b/SPEX/SPEX_Utilities/Source/spex_expand_mpq_array.c index 291954252c..1904cee678 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 diff --git a/SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c b/SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c index bd6e22a6b6..939e48a37a 100644 --- a/SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_free_mpfr_array.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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_mpq_array.c b/SPEX/SPEX_Utilities/Source/spex_free_mpq_array.c index 782c0be7ac..1abb64b911 100644 --- a/SPEX/SPEX_Utilities/Source/spex_free_mpq_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_free_mpq_array.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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_mpz_array.c b/SPEX/SPEX_Utilities/Source/spex_free_mpz_array.c index e556947d4a..28b7fee8d6 100644 --- a/SPEX/SPEX_Utilities/Source/spex_free_mpz_array.c +++ b/SPEX/SPEX_Utilities/Source/spex_free_mpz_array.c @@ -3,7 +3,7 @@ //------------------------------------------------------------------------------ // SPEX_Utilities: (c) 2019-2024, Christopher Lourenco, Jinhao Chen, -// Lorena Mejia Domenzain, Timothy A. Davis, and Erick Moreno-Centeno. +// 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.h b/SPEX/SPEX_Utilities/Source/spex_gmp.h index e47dd12f69..0c8cc7c4c0 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 diff --git a/SPEX/SPEX_Utilities/Source/spex_matrix_mul.c b/SPEX/SPEX_Utilities/Source/spex_matrix_mul.c index bb7ba8a0c0..4cf2f29fea 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 0e886696a4..93378e22c8 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 3754bf6d92..ff914337fd 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 0607a5cd6e..8428f77320 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 39d774b92f..fbf11c4199 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 diff --git a/SPEX/Tcov/simple_rand.c b/SPEX/Tcov/simple_rand.c index c61c65a414..6902ec3f18 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 ba362469b3..f6c1cb0113 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 a701822b20..9721cf7605 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 diff --git a/SPEX/Tcov/tcov_for_lu.c b/SPEX/Tcov/tcov_for_lu.c index c8bdeb0e48..8cd13cb381 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 diff --git a/SPEX/Tcov/tcov_for_lu2.c b/SPEX/Tcov/tcov_for_lu2.c index a44077d118..af4abec6a9 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 diff --git a/SPEX/Tcov/tcov_for_other.c b/SPEX/Tcov/tcov_for_other.c index 8eb4f68c0f..b0f9b08e75 100644 --- a/SPEX/Tcov/tcov_for_other.c +++ b/SPEX/Tcov/tcov_for_other.c @@ -2,8 +2,8 @@ // SPEX/Tcov/tcov_for_other.c: test coverage for other methods // ---------------------------------------------------------------------------- -// 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_utilities.c b/SPEX/Tcov/tcov_utilities.c index d0954b90f7..c257d8d879 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 diff --git a/SPEX/Tcov/tcov_utilities.h b/SPEX/Tcov/tcov_utilities.h index c1615b42f4..af23bdd571 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 a772d89515..bd4a224f03 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 #------------------------------------------------------------------------------- diff --git a/SPEX/cmake_modules/FindMPFR.cmake b/SPEX/cmake_modules/FindMPFR.cmake index 4f0589617b..c5a3e03742 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 #------------------------------------------------------------------------------- From b1bd9ccc5838178698daaf7c082371c27f86f3e2 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 21 Mar 2024 19:18:07 -0500 Subject: [PATCH 90/98] disable mingw(clang32) github tests in build.yaml --- .github/workflows/build.yaml | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 047745d646..e305fbc71c 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -298,8 +298,18 @@ jobs: # 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: - msystem: [MINGW64, MINGW32, CLANG64, CLANG32] +# CLANG32 disabled for now: +# msystem: [MINGW64, MINGW32, CLANG64, CLANG32] + msystem: [MINGW64, MINGW32, CLANG64] include: - msystem: MINGW64 target-prefix: mingw-w64-x86_64 @@ -310,10 +320,11 @@ jobs: - msystem: CLANG64 target-prefix: mingw-w64-clang-x86_64 f77-package: mingw-w64-clang-x86_64-fc - - msystem: CLANG32 - target-prefix: mingw-w64-clang-i686 - # There's no Fortran compiler for this environment. - f77-package: mingw-w64-clang-i686-cc +# 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 From ebc0966974109c8dc03b2752dad24f04f1d6ad8d Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 21 Mar 2024 21:16:59 -0500 Subject: [PATCH 91/98] date, demo output, and docs for SuiteSparse 7.7.0 --- AMD/CMakeLists.txt | 2 +- AMD/Demo/amd_demo.out | 6 +- AMD/Demo/amd_demo2.out | 4 +- AMD/Demo/amd_l_demo.out | 6 +- AMD/Doc/AMD_UserGuide.pdf | Bin 238936 -> 238498 bytes AMD/Doc/ChangeLog | 2 +- AMD/Doc/amd_version.tex | 2 +- AMD/Include/amd.h | 2 +- BTF/CMakeLists.txt | 2 +- BTF/Doc/ChangeLog | 2 +- BTF/Include/btf.h | 2 +- CAMD/CMakeLists.txt | 2 +- CAMD/Demo/camd_demo.out | 6 +- CAMD/Demo/camd_demo2.out | 4 +- CAMD/Demo/camd_l_demo.out | 6 +- CAMD/Doc/CAMD_UserGuide.pdf | Bin 232215 -> 231506 bytes CAMD/Doc/ChangeLog | 2 +- CAMD/Doc/camd_version.tex | 2 +- CAMD/Include/camd.h | 2 +- CAMD/Makefile | 2 +- CCOLAMD/CMakeLists.txt | 2 +- CCOLAMD/Demo/ccolamd_example.out | 6 +- CCOLAMD/Demo/ccolamd_l_example.out | 6 +- CCOLAMD/Doc/ChangeLog | 2 +- CCOLAMD/Include/ccolamd.h | 2 +- CHOLMOD/CMakeLists.txt | 2 +- CHOLMOD/Doc/CHOLMOD_UserGuide.pdf | Bin 510613 -> 510149 bytes CHOLMOD/Doc/ChangeLog | 2 +- CHOLMOD/Doc/cholmod_version.tex | 2 +- CHOLMOD/Include/cholmod.h | 2 +- COLAMD/CMakeLists.txt | 2 +- COLAMD/Demo/colamd_example.out | 6 +- COLAMD/Demo/colamd_l_example.out | 6 +- COLAMD/Doc/ChangeLog | 2 +- COLAMD/Include/colamd.h | 2 +- CSparse/CMakeLists.txt | 2 +- CSparse/Demo/cs_demo.out | 140 +++---- CSparse/Doc/ChangeLog | 2 +- CSparse/Include/cs.h | 2 +- CXSparse/CMakeLists.txt | 2 +- CXSparse/Demo/cs_demo.out | 188 ++++----- CXSparse/Doc/ChangeLog | 2 +- CXSparse/Include/cs.h | 2 +- ChangeLog | 2 +- Example/CMakeLists.txt | 2 +- Example/Demo/mydemo.out | 240 +++--------- Example/Include/my.h | 2 +- GraphBLAS/Source/GB_init.c | 7 - KLU/CMakeLists.txt | 2 +- KLU/Demo/kludemo.out | 364 ++++++++---------- KLU/Doc/ChangeLog | 4 + KLU/Doc/KLU_UserGuide.pdf | Bin 285135 -> 284548 bytes KLU/Doc/klu_version.tex | 2 +- KLU/Include/klu.h | 2 +- LAGraph/CMakeLists.txt | 2 +- LAGraph/ChangeLog | 2 +- LAGraph/include/LAGraph.h | 2 +- LDL/CMakeLists.txt | 2 +- LDL/Demo/ldlamd.out | 98 ++--- LDL/Demo/ldllamd.out | 98 ++--- LDL/Demo/ldllmain.out | 2 +- LDL/Demo/ldlmain.out | 2 +- LDL/Demo/ldlsimple.out | 2 +- LDL/Doc/ChangeLog | 2 +- LDL/Doc/ldl_userguide.pdf | Bin 221993 -> 221632 bytes LDL/Doc/ldl_version.tex | 2 +- LDL/Include/ldl.h | 2 +- Mongoose/CMakeLists.txt | 4 +- Mongoose/Doc/ChangeLog | 2 +- Mongoose/Doc/title-info.tex | 2 +- Mongoose/Include/Mongoose.hpp | 2 +- Mongoose/codemeta.json | 2 +- ParU/CMakeLists.txt | 2 +- ParU/Doc/ChangeLog | 2 +- ParU/Doc/paru_user_guide.pdf | Bin 184266 -> 184268 bytes ParU/Doc/paru_version.tex | 2 +- ParU/Include/ParU_definitions.h | 2 +- RBio/CMakeLists.txt | 2 +- RBio/Demo/RBdemo.out | 20 +- RBio/Doc/ChangeLog | 2 +- RBio/Include/RBio.h | 2 +- README.md | 2 +- SPEX/CMakeLists.txt | 2 +- SPEX/Doc/ChangeLog | 2 +- SPEX/Doc/SPEX_UserGuide.pdf | Bin 386707 -> 386707 bytes SPEX/Doc/SPEX_version.tex | 2 +- SPEX/Include/SPEX.h | 8 +- SPEX/TODO.txt | 4 - SPQR/CMakeLists.txt | 2 +- SPQR/Demo/spqr_demo.out | 164 ++++---- SPQR/Doc/ChangeLog | 2 +- SPQR/Doc/spqr_user_guide.pdf | Bin 165719 -> 165708 bytes SPQR/Doc/spqr_version.tex | 2 +- SPQR/GPUQREngine/Include/GPUQREngine.hpp | 2 +- .../Include/SuiteSparse_GPURuntime.hpp | 2 +- SPQR/Include/SuiteSparseQR_definitions.h | 2 +- SuiteSparse_config/CMakeLists.txt | 2 +- SuiteSparse_config/SuiteSparse_config.h | 2 +- UMFPACK/CMakeLists.txt | 2 +- UMFPACK/Demo/umf4hb.out | 8 +- UMFPACK/Demo/umf4hb64.out | 12 +- UMFPACK/Demo/umf4zhb.out | 8 +- UMFPACK/Demo/umf4zhb64.out | 16 +- UMFPACK/Demo/umfpack_di_demo.out | 24 +- UMFPACK/Demo/umfpack_dl_demo.out | 24 +- UMFPACK/Demo/umfpack_simple.out | 4 +- UMFPACK/Demo/umfpack_zi_demo.out | 24 +- UMFPACK/Demo/umfpack_zl_demo.out | 24 +- UMFPACK/Doc/ChangeLog | 2 +- UMFPACK/Doc/UMFPACK_QuickStart.pdf | Bin 219302 -> 218853 bytes UMFPACK/Doc/UMFPACK_UserGuide.pdf | Bin 487039 -> 486612 bytes UMFPACK/Doc/umfpack_version.tex | 2 +- UMFPACK/Include/umfpack.h | 2 +- 113 files changed, 763 insertions(+), 918 deletions(-) delete mode 100644 SPEX/TODO.txt diff --git a/AMD/CMakeLists.txt b/AMD/CMakeLists.txt index 5bf1c2c9e8..372e60e6cd 100644 --- a/AMD/CMakeLists.txt +++ b/AMD/CMakeLists.txt @@ -12,7 +12,7 @@ cmake_minimum_required ( VERSION 3.22 ) -set ( AMD_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 +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 ) diff --git a/AMD/Demo/amd_demo.out b/AMD/Demo/amd_demo.out index baa827eb94..0422dc5be3 100644 --- a/AMD/Demo/amd_demo.out +++ b/AMD/Demo/amd_demo.out @@ -1,7 +1,7 @@ -AMD version 3.3.1, date: Jan 10, 2024 +AMD version 3.3.2, date: Mar 22, 2024 AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24: -AMD version 3.3.1, Jan 10, 2024: 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.3.1, Jan 10, 2024, 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 aa11272d47..f384d828d5 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.1, Jan 10, 2024: 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.3.1, Jan 10, 2024, 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.out b/AMD/Demo/amd_l_demo.out index 34234be69c..019ce0ce9c 100644 --- a/AMD/Demo/amd_l_demo.out +++ b/AMD/Demo/amd_l_demo.out @@ -1,7 +1,7 @@ -AMD version 3.3.1, date: Jan 10, 2024 +AMD version 3.3.2, date: Mar 22, 2024 AMD demo, with the 24-by-24 Harwell/Boeing matrix, can_24: -AMD version 3.3.1, Jan 10, 2024: 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.3.1, Jan 10, 2024, 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 84e47700453f0f5312aff2d1f780cf9a09862849..7b3fd6bf6a243c92793e131a0e79a6f749b92942 100644 GIT binary patch delta 20991 zcmV(yKZuH~pmf!DgRv$zX@RSK2t6=vS2o*Cf zlORbolTrq|JoqhKf4W;NWhBC1I@{9fhjWqJ#qYZxK|mUC&P*H&6tLt`#D7wq2EfK7 z=Op2$g-FA!Z;Jyio#^d{z!sJlh=5cA@N($&FC|N#fhG(`zj*!mm1ZT#)qt^NyXNwO2fPJ*NDp* zJ+Wa)B3|i)v2_VtrtRv{dj7MO{=#Jbzb2$n8^W{bAGQ zwk_%>f4_WcmiQDf+6RmLO2)TEe?%Fn3?cvEE5g$PoE+Mg6gZV|+MTkt^Xtl`v3m&e zw?)%VMaZxw+rW%NRub1Ec(iGY|7LyB)Q}i)BE#L$ww8{w*3163aLPO2>WFdy8+-5$ zz9G7{-esDU;og~yiGS|4xA;+ER_C<;u+S3R(zgrnM@@%m3PvcU!ZqzbtruE_yN~Pl zv@a+ewgtm2iE;78BM?&`%5!dWHY5p;n28McfFQ z&om{bQoud~nHCLo5%U>UT(C&#fr%TFEFsY)Y1$7}59-;TSb$nehkS^Y^CE_zqmYpGi#QImqRjTFz!Jx~&K*!AQwd?Lsd!*pLh9BodwKXz zA{`ovHdehO><1W08QnwVN0U(l7JuuP(lbOHene9``*tR@TChZp@!!}-e2vh;)tCV9 zJA^<2NL$@GVt812iLC$L(620xe5=1&O6u8EV^vx3`;RBqC_85tg&y2;Ow$ zi)RAdM0d>qufFm7;X;<@Meo_P?~apWTNcpYvi?PoZ*9i6rl#wcV>g(loo{@82q4>` z%1AOSjz|KCpymh!ryIUG6#)(k)NC&u9gH##O?j?rPrcAnz0|y^{eS9mEK0w88LwV$ zWPan`1>Y{)@8Ox$B2igC_o{85)liwfmHko|qoex);1T17UiZ-<)}8ZVFe7#~dbT zrX%l&`_J3^`-gw+mJgeU9mJSRZbE@y0khTF`qgb#Ve>NK(UzVhVSrBkh226!1kRWS z&AGEECkEj8fMlqhgLTNS!Ce)A(OdA0;yBX5&^0!{cbG1=IDev+o;|i~tf*LP*Z)my zMu0LCfEq7qcX8z(ZYB>m;Fz)PM>3l64R9psz>|5q3^wI>Y(i6?0|GDwdUoi712LDazm; ze|6yZ1y^uKxMBueG0w4y+J#$O;|fv;SB%FMq`cq?-GA8os1dF>;@2pSE;vBrtd4|7 zoSd*6>)gSzqqR*n_s$6vDuhC~b%ln`YCIy}D?cPjB{1A~$hk(YTcW`aD+p`_Ch@td zf#F(5LPBD8#@gi()JVZPmb-!cU0bs3z|PNq zAGof5(XrwF%Kuhu;0Nrg=yLpHbh9eah$NN1##78rO8VzUR{nHop(P~*6EvBbsw zPuqE@G(6kzAOsK^eqelj-aqM@ zuI)ZIALrAB!c*b#q~HDQzcVbugccaNqk24s(~Kp>fBYUr8Ro^DhQ&CZogd=nPr|k# z7(uUycO2l5Bv@lx&fgbvOAMapYCt?&tuW{Nus3~O`^)*oayFUGul|*J!LB*5Elc~2 zQ54ZtF%J=maL|*4v0_{^dK=-m_>xjuOd`a-Y$6Q~1v9<88Go2c@=d#IdX8JdAjvvQ zi>dIOf5kXSx%w)dBsA6AN`i+G@qT$GxOjIxJNqz^5Vnb^Ac#@Q$Pf8g!chAXDqc_= zEGY{xlYHHZy%r8~IB*Dt_Nb0YMp@A)ixcVdJ8tC0DNFShpd{$4a6z_?$O@&>K=8u| zZunU<%*89v6|n`oy4def&_>jW+Ep1tj`&B)e~@%d*;kn#7O7)Z8zOI#e39mNxXPOf z?%yfy)Tn$SmI&kCR_Z9(0}(Suner@m-Bdhp8fsW?;Mb4y5u2L-KR_|`GEMqDW}MLE zxA5$V|2GqEV_4^TQ_T|sTNkgAiWD=|W2-0&@K)J`R7lWwT~3?kC8_Yp!6yCyc$U{% ze-&e{OGg$iiq{eD)yq1?T$UIKw?fyp=qJs#Bq!qlThSY zD%8#7YB8N(?yzu9y%PK<(E?SI&BHgZ8@`rr=jW5s1omt(!2GXx2msgz5GR3%_`tNv zo<|XGcuSH&I zWq&$N@w;#Bl3Epgg3ci6l-OVHWdKJU|0X8gH;6?)YcL-O<^R-*lnvcia7#CGP(&$5 zPo(UW-L>tnu0p?l z$(5q5c3u&8xhYIv?Z@r)yq;B)TPm{_L$R{CNXdfL&Ex<_2@=EKGQ!l&a*>e~FV={0 zyj;;FBvQOR-~p>e!8)z1)#RbJNBT|wVrb+x)(GZ5CT)8N+<`0n*ds6+IK^^!nlC+? z_(%T%%V?RjgOHB5kd6TvHW4*B3NK7$ZfA68G9WQBF)=ZhF@^#Z1u-)+H#e67DFG;d zv;|Nc+7c~_6Wl$7A-KB}+}$-egEPS3?(Xg$+}$l$aMutdNO0Fc;Bn-hoO}PTdatHx zW>$Bvmc3VR3Q{Fi24Pb>W1xf`$ccf4k(n1DDzC!A3SeetV`OG#MWmomvvjfn{%uC2 z&;WuRE$u+O{|XQV1C5+sZDK}FuW|B!b|8R^vkicS4Zy<5%fiLW%nV>PFhMj(K^ zk&^|`_O+skkqtoA&cqVv5nw8rz{RK6}7Xq1%jL$5&!5<%n}SVc|CS_roV318f51R^86c^S%OT>{usj4 z*`7%qWa;1xlotCtz$IFuzXV z?P+gk4={Tj0_bgN27LWN^mH_G0Ro)B&OmR^e>?sgA+oRlOf5~E0LDObOAzAk?5}2^ z*j#Pw!P;rgk73_ut`v-Y=7|oP?~fINe_p|Kk%8v2z1> zGO)1&7+5)206g5>04@%HW`Os9XHhb;{JRV0-&ARknH_-VuV!CQ=|2s-{C)q_fA0nj z;J5 zrb?DhCKi8*blssI>Rn3?~__qtgo)~_#zr49QroW2pKlsmQ8whj*njo$$+L`bLS=9%1-q#8fxiaidewd@! z)l8#d@LU0ZcRBw=g-@ob$qLv2-wG#>d`4f}7N@=uS|$1AdDPYjAKIR%-0|r3WDu`1 zv)h5VJdHav_322sVUQT%ErXiSp4Tr2FAaZd=r+h68HzjyXKqxb0<3%20ZF%p!Sb); zA&a}pdo`T0NKfUn4AJUQAN@<_De{f87x3T1IWZ7_zoErEcSD=Mxt+tzoq8dWiKj#K zK8|K9^3>U6jd@t`_*SXL>ex#_PN0KN41I$+K11m#vY#S@x8zw`v;iJZUBK;{*s@Jx zvDv5g*i}%u2OnJOQ&LRvQWM}aL1RltMs2i9CD@jbCcv?0pRdVmxJh4fwHZ6oD<)XJ zDB5s;HE^gP@$B~f%x&=4ho{D=*P;zovA{`gAOZDrgc3vMHc+C574Di3KSkrMe;hXX zHu?>_sg(!SP@K4}%kR5+R=unL!8bM1ku|q3((@NG9Fqa<4R6%@rtcuhHlA(#XM7o z6kKUmeZHFLzBkAkyb)?8koQEs<@fh4ngr zl|T##dhzTJ2dswrl`o3ZZxG}>I&?ze33OR8>!-RMrPM1AK2vG+ADs9e1c!H85+IN8 z5xDD&DBU=&tHox4`Op zGM=0AGXy8toMXrbIw0lC83f`(;9DYp9?1X;zbK!nldE|eem2z^e3W3*o(d?Leuzap zxpxku9mNRufV>^gq?)G_cy;?CT;wtxEs*Lc(FE1eU6T*&=P zVnY7;BTBBVQU#40)z9r%N>)x!LwmDD3$$>&yQwF1_-IR*U*;FY@)c7bI~3q6uTU@E z)d^~3l+NP0&1Px=PfdvIEsIBGk^9oo4pO<+J_{P*{P<;Rry@Gg%}&GdoOfsOi4 z91qfRJ*rT!;G-a|8Og@ISKPww40VC{wPfE=j}UAJG6u*x)5l{Uc(NLQF<7X0E6~5b zEt3<~Ae>8+GnrNqsyl!H*HMX`L98C$|KS&``&l$T#|@5s(s`>&uKHc;B^Ko{b7y-g zR$Ks83d3e*Sv@ya@{E)8i?AE*cp>=~>6$r-3N*fypDM)L3OJ`Y~-bA7-Mtkf49!eDZ7#3t29AD zROn5jy+T=umVDb={AqK=D>Grf|6Q2+rx%ln>WzYZ)R9t~dEc!>&RL5LPFP(8)|HK> z>D;(?Bs!Ze>em_HZ90{_C}=c>TTyM#+m|Y`i7_!hP<9$2{;0%%y_SjTcT5X1ATAuQ zPe_M#kMUh0^zu{*D2V19Xv`T+6-kZdvXZ_dg!jh__4|^>no9Vq!3aD2se}UgB~6Hn z9ZBc~0_TvOI^k_6;|Iu7zyyh5&a4HMedX*nom;ZYgqC+my!@Kut67L#yG0ga`EroA+;c1) z#CamG;&T&!)41WCP~eZb+_{)t90;5d_STrj3K>MyAQ9xq@h{{R+C~etQaA|0@xJEF zxYEi=1Xuj)d~m6cE?)d6obdCKD?36?(GFT6Q36{dvG&q z+{#9OClCD2!igw$Qjm?8wa97ZV#S@3NFtromH*a(S48&}9HiTVaw;CUt1L25XR$GLQT?^D&Me$sO~M%pUD-sumhV7rx6~-~p*B=^}c?7I;po%_4%W zDGZx}29l6W#GscD1;s=BRWdgt2!v5ZwVXE^y9^!FEu=C{Ejr!qS{n#mrKEZ_9!qON zON`BaWe+&W94FxrQw*_*Vsecf2H+KcsojGr2lIfE8m4#PA0+|k`{olhN)(BaZh%VD z!=990x4e1bUnWO`X`}5^`2|nfrr)T8XnAw)?V?Q$!wL$7<$o#}2StT2fIh{C9@IF& zB(DqY|IZUx;Xcff~IO0(1)YUA05`439>EY=hGN6Hfe3&N~ zC$|^P%osW%MyDI6Zk3NgSm<0;den$aP_)k<9dv|HECQN;O3Pblpf5m?q@ijqmji@ROk~L|!tqSIHx!iWwh8JI zBIy%FNhY&X57~6yd-dFZ(MoKOhsTUF0l0Qm6&?;^w23of7=|D; z4TV3DF2BAEd<(eGa?4qNw(=kQ5Z35h)4|iT>(MXWO$t*y)C|S|N-FedDcB2#r?A7R zJL(zpna4xEi)N7H{SkG?gj2a%J#LR>w4Cw=jdy#R#qD7@>GI2tVLY5hZ}J7DxHwd< zzhJWoIzH;+JvOrF*VN&3F0Oh8!{HTjn3^himkszs;zL}ohG0s6$APFx>Y-Ce?1Zt`)` zJ^F}U*HyaYrebP`I*aHJ$g}-c11*~YiI!f9j6cMAT#Z$s+8qZ);638D7Bjvyk~U?q znx8{`T71IhEJfdc{5oL_ZvsvuX}kOyuSv*)>MQ(y1Ef_je!f!Dwh0z2*sblY(}`u!$*Up@65g@ z4DZ8sM5ty_YT|fm5G_Jf!+kY)K`BSw94KjGN=?@^LG(x2Wl3D-$aRnBZXjYpZeN7c zXy2|Wxn3!0>%a65$VR8tm+&SeArnMaBHD{-^<#j0I`c^(wC(q?I#0?Vz+QW~qFx6=IKpMUhcn3W<4pH#{t)jrxe3#oGcb zw}_bu_9Cvx6YjB=lOVsk&@TlX);z=6R`q2?6S{MrX~gxgrm*OttaGZ4GJp?HV)Mjlv+# z&p7boCO@iI_4!k?R5&JF7+kAqcjeKRW5XVpc1aOg4;5XbQNPx+me5_l9cR{F*_Y^0@#^S(J| z_kTEZ1ftcBe;CVA~RWDMjO3U+fyc|o8B@I?MQ24ej~K(V{2{ZQYy;*ZFCqb zCF)U%h!)!cV%Gdv_dH(!vJd?wn!6_pb4N)H)6qN}{-bhkg8nCweIZ zkw@cCxzTGYA5K98vz<5I1E28`M!2VMdi;{hUbHf=P_6{CNJgZM`Q{emCR4@dq0sh) zlP@r)3c*F`I}Mg(&C~X-5D}4AEh*~WDk=|ezh4186>9xgCvhHv#m z4~F$j==S~mXQJAJ8ewSzM<1H1cjbwg+d4z;@|QkNe0hem8zT976?0|Vu7OxaU!IPT@J9d4Qio4>v_$#y^pJ=fn(zIDiS z^0S4(Fp6li2Dyxnb5H)K*I;hHxzDBFoi@O^T({2VlG?6wR=? zyG?jMRUD*>nfy@&Cm$})Jym>e3(Y_CGj#grKq9NDCp8`x{4=G*5^zoP%C(-F*T9T3 zbGpZ-rhJ6zj}NtRiO^RdBFJxqfwR_`51G#c(QknB(e(R&(E|(jB*KM@64}evjZDTL zZ?^aAU8KL=?TtXSAVKFVW3FRfWkZV9%^zMpTHiaS6j%r}XBY;@=Nd(qDb-T@SWzfd zhqQhf5kNz1lGLvLB~rPC8jC2I^4Dw^>CeW{&yk|_=esQI+Abr>kjB^1@>ka} zsn$b%`3&_zew@c!i&*!o3ftCCVOBbYK+~i5-(4UiI1$8e5_HcP(efwfbQBZ<#E6Ku zKmQeL<)cXB{>>W?E$7R9Bm% zwKM4kp^})v@ChR-IXo%;Vj`ZjsD#0*>_$aH9?XegN{(R_eOKXH4J6EMuZljQreHK= zyuCzm>Px#8d&nqGLuAf~M zooN+@?@_HG+)N^}(_b_S=lggnr9L}w*Rqa$n!;eaD44vwT=HGWye7d9)4dG%zIIP zdqs?~JAbT<4)dXK2O@qS`}=sdW)l%KF1P2qcw15RF>yNG?P%Ge7X9BJuJGc-3crT+R0Uz>s3!xfN;mFj2df5?n$??$f+BD8U=X zx6m!lY9{tAXJd^PkVJ*4&&8j%+vcJ&EWUGc<{PxqZ^AL(xF)P#&VNWhI5J5Hvdya{ zI!ZM9Udq)k4Euz%cmfk-XsasxMQQvxCY!f1HLX104H6Q6UhUm6)Y2~@rSWBd?!9tu z#57GJO}nu@kEhXk)XUN zOmQZaBHDDExLOaKjma)wbhUR`-|3$pk9G2EtV(G14+f&R+xbK3BE;Fw=Ko~Zn)8jC z-B(U>3EWie$E=6F8K5VS44XxNT!T~`Ngk_4G*Cf~CQVE+Az_^g5)I~r7Y|_dF!ui7 zb$WQ6eT*xW5U*nsI-m{TYQ&{pAE_x=(bH9ijzVhgnJr8-JDZbND2gS7Y3Fx= zxH)B~u~Y9&Wt}*X6no^p*)6+Qoh&S!gKXnBD!rr@r;xsh$ZbHIi z1Kn9m{WhTm#5?EZhPrisuYo>CNE+DB8OUT;IAHKb%EFA5`q4-$-$0QN?Olb&Q5r9a zSux?-DBtu8tBicy%K^{qrj7}1*0+M=MACA9^J_#ZL{^R(Cjrcp-ZwO#6Wf|Qja39q zCD$D9`Dr%ekzLgs?YS5--oWt=ZGL+aRJDp$^~}*dfsfx)lXhEwIw4~u94m!#)t_Xe z^A|nw8I%avn_9rVP2+UWa(mAc6+p*P<^1)oBs3l^0Ly7)P|O7jrV4E?xkd7mhJ(CS z-p@#}LGwUCr7$A8d@Jkxrl@-Vl#FoRH|1Ag2pEOH(@UB)Au*RpS#b=(Pgr#AvMGnG zq1tTc=$oH~HFrvX6;56X2XXl}LI(YaVon1h=V+n4tAndIbfAFv3Z&5}mSbgdV*C@d`{uc{Y+mFpUwZg;jsOAS{nLT@_A z58#ls7ZCH@;%S4J*vE)v0NRe)dTm&9@pgt@!fBFwS?7K=@tsNbj}>{%3w&Q$gifzg zpOqW>#b_bEAX`)h^3}+`hpp%TLFDCw{|&Pvhzc_j1B(9YfS3{3)^8=mN$2OQX<~Z3 z*r(S9fe8?QcSbpFMJn5E8h9*=K9ce~)NfLCv$|woJMEJRaK^)@O_4ziNugng8eO6B zpjAu@fB;qSYFtLwtcQm$aG{~0Z zZ(JQ7iJnaP5_0vW2}4JS=gw$g&a%%+!2g=5jISGijll!EV1VOj`?T^>#blSO2;FQ| zS>wHI`*jq;9qoa2fZo>e?uSasPOr$+JF3thG@X0EGA-XceSM&)xm7O&_4mULJGaa= zj!A@)8}$|n7x|H2SZm`{vzwP}Q(C_3UU<2?>54T!1jRF5H)m3p$KU9p8`ia0P4<^` z@D7br{KSl+656iRD2+0^p z7E4Aqjs2)FkkOZEnEfbSv%f+^{~e>V;P?}Ne(zkY*`do9NCJ(_7QHQ5^b3m1QtQy` z2J?@bloEkij}G2QW>OkL>z&S~UFVc!@+><%*;~1pOa1W>{UyfT^BaEhM|pC36O)=M zHRH=KLsKVKe4eeM5cJ(nit}-AEUI#V1M&WM*-E|dG?%&b&w?LTX#|Y;9%9-}PAD#a zUFt-?UrMQ4G4|VP5HlhgV3ys{*U^TY+b&AGs(h9%R|z&2k3%eX=q?HsU7`(H2pEs*pT$Yyg;Zzt6&ZJsJW(Y-qH2BhB9l@iCAydu zvdqI!tAVk_RX1zCm5c?x$x`S42^+-B-YLUV3=H5YBz}0e)waDJD z`lFCVw39ZNa1w8UO<#Rc&(Rd|m=e#_$COfdd{bUHZZ8E>CYGa#u}KG^abvbPLyCnnB}lM+N6l1&V9zUDq(S+mmjlOt5#Q!p zJYP!^%MXOxb*=<~z2z$(C2(5--NARo(cTzh?Jx))o<=qXLYvA3-4p>Fhwk`rZ@E+M ze$tG+UE127R!@jM#kvH(Od7#E6o?;6sew_0S(Mz1Gi*v|UtI9TKiOB2D9+18l1Ck$ z8_-zM+(~PVRgXr!KU`w2?sc$#HXNrT2veYyr~Y9D$8RQuE}FRYFn`ov-g=PvcANT1 zC;gTQZR>oMR?j?Ec9G88wJeT@zi14!75tgrr2D3F2rDvlEKXwZ@+k^6#OBW0by6vo zNLh&fR~op;l~uRiM*H!3!RLI*5GANM38XEKHncbyxB_jZu=gpgU+BXVlHyXy{o=DL$} zO%{5D9gwXHx`tv|w+gR+z+(x4G3U!9d?N?N@Z=v5K4acvC9yy(XB{xSJzbPOv1PvA z?1RKB(%PqWvrS+j9D^%$eYi(tNBD%-IwVw(R>hM5iw@hN-$y3l)EkiYi)KXBf1>U% zO2v26&vi}TkQ&>=uiH-ThO*(E!@N0yO@v6WAgza!OVXq~=Q_-PSEbG&eNUq^q6!jh zu|4?$Djm^;A2=4_t*~KQ*SXJ5k)<4b8dBh&WvzudtGfqp)4z^2+dO`f?613SSMI)IZAXnU+9`JbR8rhT0PQ$p>vQqZ{{zMR zsv)s~7FmU$JIyb6HXZRIiM@u%G?G*eMb+~v4vJ}rpFC@Sq0wjw@C2k5ESU-J=q|C@ zcV39S+J)yqHP|;uTX9D@b<*0@3mjuC#K0 zXx5Ro<`kwWN1i|e7so%+kaMv0lJms?4%G%1amR+pE!}z@L1)qjFsOg_f`ubn&YbYx>O7XvDwT!zbe!-NzNj zFnhG(g#3aD?7BJDjO-O^G5h5rQpfnPE*8O2F516^7)CW31FibUk21Bh0?N|F?`4%c z%;VXVR_Wj5i|c06s*=dW3$5_ln|F4)f=5}iyWaeN+Tb>;v$1+hLi9z!B7+atwe=8& zeKw^judjE@cU2vYK=tim<I|iW^h5V2X;sB@eep=6TE_!5atXs9HbJTvRUxdG?e7xsLZqG2qq~2dS1g0h|qc_A(2jtQxrYS8JY^0%dS)AHm}s-B6Y|Jd8vw-@FZ#2xQ%|wBAPnrYel`N&p*Yy zic@O+WCdrt>KoxA2H-tr((`A0YXOB`uV-R^ycp2Fq!5zEk)E4#L=`Eji}A>+LC(BY z6)oz%Xr5v=mHsUvd&q2>e9U8pMNpJtg~j3#Rd-1-euOORy06&Yzchx&2!>+ts(p%J zR@i3u5l$Y3I>f?oNYD$E&|-lyuJ?XCy(5-7Sdv?-dtv0(<+Jr6r z`Ez!e{AEVW4)$JnB)z!I$XcKs>&CX~eW^c@ucdiLoZ=B<)OsNJYL zyN*BPMoo`MQ!n&r7E@Y#vvwF z1-^oc%L2QsTBnHjBNHkl1r*zVF-UFP64dm_bg`B4?p7kvU6Z(jqGqGtrhbxQf0M>W zHX_U6KqgvB`wn&Ad5#sn@1oWaPZw%t4Gv@<*(zihrZYELi&yP=u8?t&gS|9u`OK*5 z_Wp`sS~Mh!d!XC^p+_$f8*V=dA4}Q|Pr0IGo8Dx}DluM%I+!eObYp#g3qu<}4f|}~ z(6ezfzobA6<(P@x!B!6brK!1Vz!ZIz!9FU)dT~M*YJnl$ol>=OYqFQa$75B`hTI;m zFQXX;L`k<>Q3jMcq~la1B$%4U>j9#rp#=u6Owv5a5u)UN(S0AQjG@Q8*A2(=W3^i* z(y4fpgkv|LR#pndY=QNEa_xQiJgxjm{`>i8@szG09E_-6`CXddb^PLst<0>BV?J6K z9vACg8ABvyI2mkIVzs3T-6lJ&o@R%&=C^J6GvJyg(-BA%wG z4A2I_ghIHPosXQ-r3VRyE>66@K5b&+Q;Y}j!7&)rw6(X67TXnY(hEamY2>$fM7xdf zu31NvHpQ!2KWbT)U3R7b98l z)-*`qsq=G+Zf`?&Qa}_-C^u(B&Sg+!pLZDYMAREC1hugpOx^RhV3sJJ#t(AD$ zA6E#M0DE?>)*FQV&F~|9?sBNQwUeVtQx3=~ikeiDX<<-BXdn5y{7zt&l|Tb%4>&H0 z0tF=97>PiCjbD(4gi(mDOs;+nzam;vOAmcJKUSSFdp|%=E@}cv&YqmyuSpK2s8m^99H`^WtYlEyNlLtsEqO!$qYlKT7T+4&&pSMktrr@r0(& zfmEYD7pD1wF)DOLmwjXW;_)#F!oIx)x3aTK%&ABAkz}nZ1TB33;8}{Pc z@ym@)(s=y3HSPoALnv95`J6s|?W}yvJPkmC*4k1%Q_R|n8fPneX9H&;(#u-t&_v88 zgNEhMe_!6BB%A17-+KRjPHSiJ^qzn+kdzI7&Xy@cacZ%o4;dW=?Dwqb0vCpZXHeoH z+2WRLlD~uboJ^^aOj1AF%9xmN8HNA||kajbb7FfGk99 zq!jOh%wD`iN*rXp<0j9~Ka@0<+2!x$K=UZX9jh6}lwSh#zNeD`l(mB ztW_iS){iaR)CmO!j&JD&&7Vx+8;Q3Yf@0$^7#TYzFhlZ+c(;9>;GOV}Aww6abSl+4MeY6x4GpM-~Psc+E6OHjJ21>jRQo z+Xdx3Bz5nnyfuD+R2b#V**Y%cm;~5!F?L;ZSp^$@(vFMvYL-%`5wc z>fMXHY=g_st|&h<+O+T-9h%q!r?`#1pB1s9a=5%3O`BI%0`&=hLe`{*_?WC1b1Wj1 zB;{*mS!LlQNAjl48#U(A>?zp(6aFv^6{ClB8}HPsIEc>cyS_jS3b#QX==tvZ=?a8dgr-)ss7ej-g_REk`FlKE^uF~2$|_sU z^OK(?d*-;k;W^`f6_iP%v?_gptJSM~Qi+lIEQ>$6@fsqzuBy(1Bsow>6yTI=9e1$F1)3FuD}lqd(_FL)uhD?eiYv-oBF& z(U_L9SvKA;;&aiv-Q1ePK5Lj!AsWa8#q&V3mIW-}6;cxl+mdLa?+bk}SE#GKqT-!~ z&gML$0@IVoIP^VVWZvBA;C8N5d{I^9rokb+iP_M~QKbKDQigu|F-oY|*ly)^fGonH z?@Bp;ypZ9h%Omw@oMiXO1bPGxF~C3Wourxe6qM%ad}OL&nd^Ci#w7LEiHjR5vWEvy zBe=&%o)@|K*?D1tfgRjb6kosJ9rRv?V${5|YGGMgoue0%zeG5{cM7u_BGr zbFEvVTumO`1GA3Pi*9Ygk2gOb-m`--iPkKCVx34|l%%-&bkC87_}qHHBrQqyNK5$@ z)I|#GdAZiqX2Cen*a-J2R1`@heK;LQPWOIQ(lTDSQP!F>FwrMg)rnfgldZXmeEiDT zx^5$4{ej}94=l`7{=qM~XFT#d$#aIpJ62wfsE{HYuPYnHRkyKD;WGn^`I!uBeRJeO zodYR*&e|5zytP(os?JvTCHw^qr8(W^kov+f`cMfg??T+5^kR*X`iCH5<)P_>?A!OQ z4{TtoWX3AZ{{vs;nKF~{oD+we`T@6_`U3fu3^Ot@GBGd#=Mfn0Gcq(SFg2H;kpmYD zGcqwUF)%YSG%YYSm&1_*#*-j?DSz!d*=`%jweS3jdd$Uz*|jggAb>0{@pu{Ak}Wxg zA84s%F(Zi@lA3t(^*Ku~)!n2dQgko@0-L4ks#A5=I!iUFg%nDpAe0x{Lf;8vlF&}r zU|~eKV1!O0$RKnSQF>vtNYVq%%fcG&9 z0MQ`^;Q>B6B|N|kgSXdK$;3c1O=P~FMv&BycGdBw^9ojG6|#sAXXlS-C@n>YQ}|J!T#zsVqVN>~fHrAdCXZtQAp(xU3gtlvN-KQAS$}QtDTa~KsB9N- z3?TyWqrgg(kwBJ0(=b|L4^|kP&?I1mNe1K&X5kPIEU_M_G}sBCCN0rok{uyNC*cuh z8~_Pe>oh0~P066KB7j430H^a{QU<32fFM>E0Y*c|OV|p*JYX0hsa}IUgEc5`z_u*H zSTIVkE9G588i6P8QGWsk!Gn>bpMDw@hksm`qIf&`R*s7O+10YVS}ufv!}ESrye}8C zoB2t(fRjW6uglZv&qQ%p zeqV|&H90H!Rbjxe+Xctgp*0LRYT1P2tQzh-8cM|xXt(AL{f4gl7PbBWPPOlIs_l>C zv?aHrNA!4M1=lMDvn8WO4j7HQV05(_@8WY?CI$!5s2|2eu8EwXj*Vt&&JQN}sa-KW zIE-c|hcUOhHGd}B3PYjyULlv2ve=SQs|JjwO&GQMF70;Im>;@ajjJqRTaH|xBWrfS zQO?Jmwwp7TsWDgGgKgBt0i%8=jNWad54AcsusXXFtGhb_JXq?^_DOg8M@fBK5(m!9 zxjz|+eh?YmMv>90A5Y>y(O&=ANE|5IyFVF;VW4RLXMa<47$i7B?SjNL&S;BF`m^_b zjK%jY?U&K#5W*Nr>3g(FO3BUYQCEH1kqo$f_DYRa)vg59!BvnMxiQ9Zs#=n(b7Nn% z41uVF)?;0_8Ig=Fq&Rk9?H)#)_Rxp&bZntdkSgLX$s!(WVb)RWc^^2(KBh6&)>0yf zmbgLk$bU>iGNK|vZNNp6$b$`lJne`C4Q+~y%8U(=9mjOlaF>=kBD1ikUD4LkHzXo% zHIZJ=@Otd=cr-u-SO8t!{O|Lh{QOVqKR}{Jk{e(ve?ZIoRD8Wq&*IX{YrS2A%M1dva)ufg!0)3HQlI zJb9K{66hClspLHIh=rUAKkXCGwqyAk9Mz6}9eEa_E0+uHrxn6V@m`v zW>FrfH&5`uDaIpR#emj%yCyP_Co|}MgM%@L?mQ^;pAlpUqb34250U^4MUT=o3glr; zqJLn4?mXIra*A?{H@OlZBj^uxg8K51#)c$Glc|!Y#@pjDURNW8izIpSxltnpj`qS? z-|@cOw$aT}d~mSF6SsH)Pdid1u^#1WBT{Muzy+k=PzbUhTZV&b5p)ii1JDX_NMi(t z_=1u%cwY`t#*tng*7818Ymu`EyE~Aku76s5Mp0>HSN=yo8TzBg}eWH^59s5I)WMfaVq@XM6}}P{?o) z6|F{>q3KZTdLLfLJ9Eo2fpyjH41Y(hlFpBHXUNm$xfq81j*#$G3hRw}cycm*2bJ4^ z)s47gLskpP^Z4S-LKbRkRW&or0Qaf=l9f4FiHwSao3BfH#6dGE-b^k_dX2%Q%InE; zKE(oOEFl>Vl#plrFAVjViXdUdBc<^A-gqcXvVsZgoqqZ9;u6ZN$KngsHh<5i^Tl%i zd@=`jIVxUFst09&qNC~Q@_d1>@~G%~dUY~8onC#zcX~8{khu8*-|khF7GwxxYnj^r zs(+X$sH)ACRdYQmo=nfqN+>K*uAi+gCKjVhF}|8DPs=lW_g74+#x#X30>!HK$60W$ z%>%mZyh6Q?b?AY0(2Fjz4S()+EyIaN;2iO_s@&Q#l<~P~_|%w2GCk8sc3>K=F%1i4 z`h)cZVII!ZJv0PVqmVtm(rlIF6Ab#)>IWf`s&(Sgc{c=e9+H>ARL@l{=TC;K(5yDE zKbSwYbz@#I<8zXlVnh{G+JvkvC>c%L%c1i0$7N+b&1K}RB5d794}YlOU2QuOQl}RcJvxtOVy@ay;OaT38`_aTEU~W9Ef7+ zn~~(G+T)cCG(%Xb{;Z?cVoc9xSytSq_TF(AeO}+wI_VouvGdFg5hKA0=-Zs)Yej5XXv z-F@1c8vImrdwqvk_SN19h2M3O(l-x|iu9J@Zm)g9ZCD*`FIOXuwyJf?lhfBEdRoyy@m#G0x;mhK zJICa5pIUJ7C?ve9vUD9C$RIpjS<^)dxK5~dKzT+mq<_(Yt|t^-ys%3JL%?uH^Eei( z)m1-ADsu4BhA~t)sZDexlaDx$fkj(VxWlWGVLu>{&Q5N5d zY4K}uQCt>R#jKbYi(*;)Ui`E8#s6s+d|_~`HZ#~+w~y@r2-{Nwi- zP1+6rGTqAmK1kqM@q(oAOYy!qC=QDcl{8Qew6HiU&ZfVY#TkT1kj!~;{>Sxsc?BY3 z0bNb6N|4eF+Uw%FoKI(`B(g>MJ3uX_-$8iG^Lbeo%YV*_8x~~oudXQLCZhaw^z`YI zcYh$tr)y0~Lxk7K<5xBvUWn*cmRPvAqLi5+y_9PNX+tJQqjEWZolj1FEtePN+4Ac$ ze=5J{Ps{82X^y+Jp!C?n(&O^FBON6-kD~fzYXsy>E+E+#&~p&a2eRZT zaeUKZPH*I{-~D{_{1a(Et>G=zr{4ITXg}BuPJMgg-!*6c7_4Ek%yOpw$v$gLq;q;V zKD*sC;?_ghw=lg?B-#7$@%i39DB<8>O(gNI)`F+%XT28i@g7=;VQp%5*nj0@qbPFp z*~`x-r_+Xn+}0c!0|g1Kny;UiBcVz z;A0~bt@ZAcp?95h=ok{BzoUy>U|O;G^{(8g@tt)dbW7TE|BR=f)ZFGpZ>~_;hvwZlleGN%!UVlZ(k^ui&nWrhz?Nl#4|hPp@t+zXHkAZ+9CB z%5qJ5ylpZ(u%MNBv9b4hjSAX(JXw_VMc~1`QOD%yH>7ko+}_K(nBU85)xHD`n`7_a z+VrufK6dLm*me7MUQln2y?@cs!>-hTcbQ>#u0bBQ5Pbh0p^x0$E_hs1vo5z#d$+dl zBX@n|N_GS96G5?>+QRsEG=Cu5) zV#_}_ay;nxcRTLR-QBv~9h2#KBhM^&9t`@fZP8QlKB^**+2tQ2^;YgrAm^NY8}Swm zAprAlynE9A3T19&b98cLVQmVN{G14v-l79uQ8za^K{GT%LoqZkMKU--ML|PDIWaaf zI7T%!I5aXwF+LzXH#a#!Gc-d(F*GnmGB`p-K|@11F*Y+eMm04!G%`jpK3xhgOl59o zbZ8(mI5Cq^f+>F`(YHzlQ4j^-IlJccn{$r8Ip>^n&KX5PEffSRtwa$7BbaT())x>g zEUfIr(#Fac5Y$4^J!A86&dj~Luqz_+YlwJ)2t;hc)Ju9uA!#GsB%7p@J~9Y%|4eU; z5|bDZ=O3N5lYY`ky2ub2CXU1b5^$%7M~E|Vg2cV+%$0w*Kr#-s4iIp?*H3jNgRnM2_%su5j#mHDI}GoL5^(J?>Tz2IKI)R zWROgf1v!6Nv=*nsy2v59B#-2i0?7HQb>w2o;?l0?ibydjA*H0u+J5V{9P%`ysRFRR zEmI|6ztvO)G<|BS24-J0)c_CMnreZsS50*=!k#tN!1bFz&WA yHN*J0*VF>Dx<*qgnIMxe_jUy4Rf7Bh$@fB>3T2lur2`xbH#jyi3MC~)PeuwX?7|uV delta 21462 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 Pq)DCn8 z9p+6wxEPy5C68fY43wrvSdM|)^6J=#W>`jp2EbaVO7-xR z4y<-ov3V=@6)vL{UA0iUb*wuNO!4&$!>S`eha^@+q>4 z5^$8F0;f-;U090h5$pCh9EZ~f%}%+{_51Qis*StyS8=a1;RP>gv7-MA0`JO4LeF^$ zFHMx+2xG1!^pA1$Z=8nqb29u5a{X(MuJD$F_LRKwIfIlpYt_4!3m?m|0zVaM+uffB zU{g1WUz!zj&HJ0ph5*IK>~?yAhrK#Rbua9cYfBT8;OnIUWH_Z!;=sSCi;sAGHTdP z#moOF*oCq9Kn4>>o&G;d9%L&V-b_Q9pHEIo2*5AEBP7Vj1rXqq;o%VwlH?bZ6#xkG z^2vx(i~g@KrvG0eMa>IH!46~rG0cjoYkwt1{Co6Pi`Mc}urkd_cFWk9y(}tBE2h(c zfT`ua+Uu(&btr-YpB~C_$oH?B$o}mZ8^S5qI(w2=oy=gh&+lVqjWdvAaVwIi=@=} z+(c3jjHM6L#{D9~pJrO@$<(O5JUx5?K&b-+wnxoI`=XqMz7o$2{$wPBa^-t^$FQ_W z9rYxx^Kk9B#QD0_+=|Hq3>S_HqtEt=_yYf=8;OOGjX#yQB;E#Z>U9B)6v-SJDT-3Q zCAs1 build/camd_demo.out && ( command -v d2u && d2u ./build/amd_demo.out || true ) - - diff Demo/camd_demo.out build/camd_demo.camd_demo + - diff Demo/camd_demo.out build/camd_demo.out ./build/camd_l_demo > build/camd_l_demo.out && ( command -v d2u && d2u ./build/camd_l_demo.out || true ) - diff Demo/camd_l_demo.out build/camd_l_demo.out ./build/camd_demo2 > build/camd_demo2.out && ( command -v d2u && d2u ./build/camd_demo2.out || true ) diff --git a/CCOLAMD/CMakeLists.txt b/CCOLAMD/CMakeLists.txt index 52c2ac3086..723cc6f2be 100644 --- a/CCOLAMD/CMakeLists.txt +++ b/CCOLAMD/CMakeLists.txt @@ -11,7 +11,7 @@ cmake_minimum_required ( VERSION 3.22 ) -set ( CCOLAMD_DATE "Feb XX, 2024" ) +set ( CCOLAMD_DATE "Mar 22, 2024" ) set ( CCOLAMD_VERSION_MAJOR 3 CACHE STRING "" FORCE ) set ( CCOLAMD_VERSION_MINOR 3 CACHE STRING "" FORCE ) set ( CCOLAMD_VERSION_SUB 3 CACHE STRING "" FORCE ) diff --git a/CCOLAMD/Demo/ccolamd_example.out b/CCOLAMD/Demo/ccolamd_example.out index 89ce91dd51..6d263377ad 100644 --- a/CCOLAMD/Demo/ccolamd_example.out +++ b/CCOLAMD/Demo/ccolamd_example.out @@ -1,4 +1,4 @@ -CCOLAMD v3.3.1 +CCOLAMD v3.3.3 ccolamd 5-by-4 input matrix: Column 0, with 3 entries: row 0 @@ -16,7 +16,7 @@ Column 3, with 2 entries: row 1 row 3 -ccolamd version 3.3.1, Jan 10, 2024: OK. +ccolamd version 3.3.3, Mar 22, 2024: OK. ccolamd: number of dense or empty rows ignored: 0 ccolamd: number of dense or empty columns ignored: 0 ccolamd: number of garbage collections performed: 0 @@ -39,7 +39,7 @@ Column 3, with 1 entries: row 4 Column 4, with 0 entries: -csymamd version 3.3.1, Jan 10, 2024: OK. +csymamd version 3.3.3, Mar 22, 2024: OK. csymamd: number of dense or empty rows ignored: 0 csymamd: number of dense or empty columns ignored: 0 csymamd: number of garbage collections performed: 0 diff --git a/CCOLAMD/Demo/ccolamd_l_example.out b/CCOLAMD/Demo/ccolamd_l_example.out index ec9a7186c3..ab5776af6b 100644 --- a/CCOLAMD/Demo/ccolamd_l_example.out +++ b/CCOLAMD/Demo/ccolamd_l_example.out @@ -1,4 +1,4 @@ -CCOLAMD v3.3.1 +CCOLAMD v3.3.3 ccolamd 5-by-4 input matrix: Column 0, with 3 entries: row 0 @@ -16,7 +16,7 @@ Column 3, with 2 entries: row 1 row 3 -ccolamd version 3.3.1, Jan 10, 2024: OK. +ccolamd version 3.3.3, Mar 22, 2024: OK. ccolamd: number of dense or empty rows ignored: 0 ccolamd: number of dense or empty columns ignored: 0 ccolamd: number of garbage collections performed: 0 @@ -39,7 +39,7 @@ Column 3, with 1 entries: row 4 Column 4, with 0 entries: -csymamd version 3.3.1, Jan 10, 2024: OK. +csymamd version 3.3.3, Mar 22, 2024: OK. csymamd: number of dense or empty rows ignored: 0 csymamd: number of dense or empty columns ignored: 0 csymamd: number of garbage collections performed: 0 diff --git a/CCOLAMD/Doc/ChangeLog b/CCOLAMD/Doc/ChangeLog index fb0ec795dd..d2146eb441 100644 --- a/CCOLAMD/Doc/ChangeLog +++ b/CCOLAMD/Doc/ChangeLog @@ -1,4 +1,4 @@ -Feb XX, 2024: version 3.3.3 +Mar 22, 2024: version 3.3.3 * minor updates to build system diff --git a/CCOLAMD/Include/ccolamd.h b/CCOLAMD/Include/ccolamd.h index 85e8e6e389..a8c92ef95a 100644 --- a/CCOLAMD/Include/ccolamd.h +++ b/CCOLAMD/Include/ccolamd.h @@ -36,7 +36,7 @@ * #endif */ -#define CCOLAMD_DATE "Feb XX, 2024" +#define CCOLAMD_DATE "Mar 22, 2024" #define CCOLAMD_MAIN_VERSION 3 #define CCOLAMD_SUB_VERSION 3 #define CCOLAMD_SUBSUB_VERSION 3 diff --git a/CHOLMOD/CMakeLists.txt b/CHOLMOD/CMakeLists.txt index 7fcb7e4162..78d2588792 100644 --- a/CHOLMOD/CMakeLists.txt +++ b/CHOLMOD/CMakeLists.txt @@ -12,7 +12,7 @@ # cmake 3.22 is required to find the BLAS/LAPACK cmake_minimum_required ( VERSION 3.22 ) -set ( CHOLMOD_DATE "Feb XX, 2024" ) +set ( CHOLMOD_DATE "Mar 22, 2024" ) set ( CHOLMOD_VERSION_MAJOR 5 CACHE STRING "" FORCE ) set ( CHOLMOD_VERSION_MINOR 2 CACHE STRING "" FORCE ) set ( CHOLMOD_VERSION_SUB 1 CACHE STRING "" FORCE ) diff --git a/CHOLMOD/Doc/CHOLMOD_UserGuide.pdf b/CHOLMOD/Doc/CHOLMOD_UserGuide.pdf index 01c2339e340f1e7d9f32af68ec8278a9c42b53a1..bd9334823f9afd4a7f3ab12cd009f8cb493c157a 100644 GIT binary patch delta 23689 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 c3H*Y3q8ICxW

Sk0SsQ#9?8PQ-|XG4{KBXp#T5? delta 24211 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 SSp*&nGd4Ll3MC~)PeuwH#Nnj? delta 19983 zcmV(sK<&STuMy9)5s)MTI5?AW#wdSnR>^YXHW0n*D|n<*BbWeJ

>JP2zDTv7DMJ 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 diff --git a/KLU/Doc/klu_version.tex b/KLU/Doc/klu_version.tex index d693fca078..17c39e27b4 100644 --- a/KLU/Doc/klu_version.tex +++ b/KLU/Doc/klu_version.tex @@ -1,2 +1,2 @@ % version of SuiteSparse/KLU -\date{VERSION 2.3.3, Feb XX, 2024} +\date{VERSION 2.3.3, Mar 22, 2024} diff --git a/KLU/Include/klu.h b/KLU/Include/klu.h index 2d69356898..461cda90c2 100644 --- a/KLU/Include/klu.h +++ b/KLU/Include/klu.h @@ -823,7 +823,7 @@ void klu_version (int version [3]) ; * #endif */ -#define KLU_DATE "Feb XX, 2024" +#define KLU_DATE "Mar 22, 2024" #define KLU_MAIN_VERSION 2 #define KLU_SUB_VERSION 3 #define KLU_SUBSUB_VERSION 3 diff --git a/LAGraph/CMakeLists.txt b/LAGraph/CMakeLists.txt index 8cb5b28ce3..b8685d669b 100644 --- a/LAGraph/CMakeLists.txt +++ b/LAGraph/CMakeLists.txt @@ -39,7 +39,7 @@ cmake_minimum_required ( VERSION 3.20 ) # LAGraph can be built stand-alone # version of LAGraph -set ( LAGraph_DATE "Feb XX, 2024" ) # FIXME date for 7.7.0 +set ( LAGraph_DATE "Mar 22, 2024" ) set ( LAGraph_VERSION_MAJOR 1 CACHE STRING "" FORCE ) set ( LAGraph_VERSION_MINOR 1 CACHE STRING "" FORCE ) set ( LAGraph_VERSION_SUB 3 CACHE STRING "" FORCE ) diff --git a/LAGraph/ChangeLog b/LAGraph/ChangeLog index 96081e4c2c..995f8d43d6 100644 --- a/LAGraph/ChangeLog +++ b/LAGraph/ChangeLog @@ -1,4 +1,4 @@ -Feb XX, 2024: version 1.1.3 +Mar 22, 2024: version 1.1.3 * minor updates to build system diff --git a/LAGraph/include/LAGraph.h b/LAGraph/include/LAGraph.h index d9d2ea39e0..baa9bbaf62 100644 --- a/LAGraph/include/LAGraph.h +++ b/LAGraph/include/LAGraph.h @@ -37,7 +37,7 @@ // See also the LAGraph_Version utility method, which returns these values. // These definitions are derived from LAGraph/CMakeLists.txt. -#define LAGRAPH_DATE "Feb XX, 2024" +#define LAGRAPH_DATE "Mar 22, 2024" #define LAGRAPH_VERSION_MAJOR 1 #define LAGRAPH_VERSION_MINOR 1 #define LAGRAPH_VERSION_UPDATE 3 diff --git a/LDL/CMakeLists.txt b/LDL/CMakeLists.txt index d110990a33..84f504b9ba 100644 --- a/LDL/CMakeLists.txt +++ b/LDL/CMakeLists.txt @@ -11,7 +11,7 @@ cmake_minimum_required ( VERSION 3.22 ) -set ( LDL_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 +set ( LDL_DATE "Mar 22, 2024" ) set ( LDL_VERSION_MAJOR 3 CACHE STRING "" FORCE ) set ( LDL_VERSION_MINOR 3 CACHE STRING "" FORCE ) set ( LDL_VERSION_SUB 2 CACHE STRING "" FORCE ) diff --git a/LDL/Demo/ldlamd.out b/LDL/Demo/ldlamd.out index 6e77bae680..efb268129c 100644 --- a/LDL/Demo/ldlamd.out +++ b/LDL/Demo/ldlamd.out @@ -1,4 +1,4 @@ -LDL version 3.3.1, date: Jan 10, 2024 +LDL version 3.3.2, date: Mar 22, 2024 -------------------------------------------------------- @@ -7,7 +7,7 @@ name: Dense/0 n: 0 entries: 0 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -15,7 +15,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 0 @@ -38,7 +38,7 @@ name: Dense/0 n: 0 entries: 0 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -46,7 +46,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 0 @@ -69,7 +69,7 @@ name: Dense/1 n: 1 entries: 1 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -77,7 +77,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 1 nz, number of nonzeros in A: 1 @@ -120,7 +120,7 @@ name: Dense/1 n: 1 entries: 2 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -128,7 +128,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 1 nz, number of nonzeros in A: 1 @@ -171,7 +171,7 @@ name: Dense/2 n: 2 entries: 4 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -179,7 +179,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 2 nz, number of nonzeros in A: 4 @@ -222,7 +222,7 @@ name: Dense/2 n: 2 entries: 5 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -230,7 +230,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 2 nz, number of nonzeros in A: 4 @@ -273,7 +273,7 @@ name: Dense/3 n: 3 entries: 9 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -281,7 +281,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 3 nz, number of nonzeros in A: 9 @@ -324,7 +324,7 @@ name: Dense/3 n: 3 entries: 11 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -332,7 +332,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 3 nz, number of nonzeros in A: 9 @@ -375,7 +375,7 @@ name: HB/can_24 n: 24 entries: 160 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -383,7 +383,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 24 nz, number of nonzeros in A: 160 @@ -426,7 +426,7 @@ name: HB/can_24 n: 24 entries: 188 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -434,7 +434,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, 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: 160 @@ -477,7 +477,7 @@ name: FIDAP/ex5 n: 27 entries: 279 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -485,7 +485,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 27 nz, number of nonzeros in A: 279 @@ -528,7 +528,7 @@ name: FIDAP/ex5 n: 27 entries: 325 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -536,7 +536,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 27 nz, number of nonzeros in A: 279 @@ -579,7 +579,7 @@ name: HB/bcsstk01 n: 48 entries: 400 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -587,7 +587,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 48 nz, number of nonzeros in A: 400 @@ -630,7 +630,7 @@ name: HB/bcsstk01 n: 48 entries: 472 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -638,7 +638,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 48 nz, number of nonzeros in A: 400 @@ -681,7 +681,7 @@ name: HB/bcsstm01 n: 48 entries: 24 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -689,7 +689,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 48 nz, number of nonzeros in A: 24 @@ -732,7 +732,7 @@ name: HB/bcsstm01 n: 48 entries: 26 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -740,7 +740,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 48 nz, number of nonzeros in A: 24 @@ -783,7 +783,7 @@ name: Pothen/mesh1e1 n: 48 entries: 306 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -791,7 +791,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 48 nz, number of nonzeros in A: 306 @@ -834,7 +834,7 @@ name: Pothen/mesh1e1 n: 48 entries: 359 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -842,7 +842,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 48 nz, number of nonzeros in A: 306 @@ -885,7 +885,7 @@ name: Bai/bfwb62 n: 62 entries: 342 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -893,7 +893,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 62 nz, number of nonzeros in A: 342 @@ -936,7 +936,7 @@ name: Bai/bfwb62 n: 62 entries: 407 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -944,7 +944,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 62 nz, number of nonzeros in A: 342 @@ -987,7 +987,7 @@ name: HB/bcsstk02 n: 66 entries: 4356 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -995,7 +995,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 66 nz, number of nonzeros in A: 4356 @@ -1038,7 +1038,7 @@ name: HB/bcsstk02 n: 66 entries: 5175 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -1046,7 +1046,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 66 nz, number of nonzeros in A: 4356 @@ -1089,7 +1089,7 @@ name: HB/bcsstm02 n: 66 entries: 66 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -1097,7 +1097,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 66 nz, number of nonzeros in A: 66 @@ -1140,7 +1140,7 @@ name: HB/bcsstm02 n: 66 entries: 72 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -1148,7 +1148,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 4 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 66 nz, number of nonzeros in A: 66 diff --git a/LDL/Demo/ldllamd.out b/LDL/Demo/ldllamd.out index f3c4001e20..8b11c9b218 100644 --- a/LDL/Demo/ldllamd.out +++ b/LDL/Demo/ldllamd.out @@ -1,4 +1,4 @@ -LDL version 3.3.1, date: Jan 10, 2024 +LDL version 3.3.2, date: Mar 22, 2024 -------------------------------------------------------- @@ -7,7 +7,7 @@ name: Dense/0 n: 0 entries: 0 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -15,7 +15,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 0 @@ -38,7 +38,7 @@ name: Dense/0 n: 0 entries: 0 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -46,7 +46,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 0 @@ -69,7 +69,7 @@ name: Dense/1 n: 1 entries: 1 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -77,7 +77,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 1 nz, number of nonzeros in A: 1 @@ -120,7 +120,7 @@ name: Dense/1 n: 1 entries: 2 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -128,7 +128,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 1 nz, number of nonzeros in A: 1 @@ -171,7 +171,7 @@ name: Dense/2 n: 2 entries: 4 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -179,7 +179,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 2 nz, number of nonzeros in A: 4 @@ -222,7 +222,7 @@ name: Dense/2 n: 2 entries: 5 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -230,7 +230,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 2 nz, number of nonzeros in A: 4 @@ -273,7 +273,7 @@ name: Dense/3 n: 3 entries: 9 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -281,7 +281,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 3 nz, number of nonzeros in A: 9 @@ -324,7 +324,7 @@ name: Dense/3 n: 3 entries: 11 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -332,7 +332,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 3 nz, number of nonzeros in A: 9 @@ -375,7 +375,7 @@ name: HB/can_24 n: 24 entries: 160 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -383,7 +383,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 24 nz, number of nonzeros in A: 160 @@ -426,7 +426,7 @@ name: HB/can_24 n: 24 entries: 188 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -434,7 +434,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, 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: 160 @@ -477,7 +477,7 @@ name: FIDAP/ex5 n: 27 entries: 279 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -485,7 +485,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 27 nz, number of nonzeros in A: 279 @@ -528,7 +528,7 @@ name: FIDAP/ex5 n: 27 entries: 325 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -536,7 +536,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 27 nz, number of nonzeros in A: 279 @@ -579,7 +579,7 @@ name: HB/bcsstk01 n: 48 entries: 400 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -587,7 +587,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 48 nz, number of nonzeros in A: 400 @@ -630,7 +630,7 @@ name: HB/bcsstk01 n: 48 entries: 472 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -638,7 +638,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 48 nz, number of nonzeros in A: 400 @@ -681,7 +681,7 @@ name: HB/bcsstm01 n: 48 entries: 24 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -689,7 +689,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 48 nz, number of nonzeros in A: 24 @@ -732,7 +732,7 @@ name: HB/bcsstm01 n: 48 entries: 26 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -740,7 +740,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 48 nz, number of nonzeros in A: 24 @@ -783,7 +783,7 @@ name: Pothen/mesh1e1 n: 48 entries: 306 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -791,7 +791,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 48 nz, number of nonzeros in A: 306 @@ -834,7 +834,7 @@ name: Pothen/mesh1e1 n: 48 entries: 359 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -842,7 +842,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 48 nz, number of nonzeros in A: 306 @@ -885,7 +885,7 @@ name: Bai/bfwb62 n: 62 entries: 342 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -893,7 +893,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 62 nz, number of nonzeros in A: 342 @@ -936,7 +936,7 @@ name: Bai/bfwb62 n: 62 entries: 407 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -944,7 +944,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 62 nz, number of nonzeros in A: 342 @@ -987,7 +987,7 @@ name: HB/bcsstk02 n: 66 entries: 4356 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -995,7 +995,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 66 nz, number of nonzeros in A: 4356 @@ -1038,7 +1038,7 @@ name: HB/bcsstk02 n: 66 entries: 5175 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -1046,7 +1046,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 66 nz, number of nonzeros in A: 4356 @@ -1089,7 +1089,7 @@ name: HB/bcsstm02 n: 66 entries: 66 -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -1097,7 +1097,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK n, dimension of A: 66 nz, number of nonzeros in A: 66 @@ -1140,7 +1140,7 @@ name: HB/bcsstm02 n: 66 entries: 72 (jumbled version) -------------------------------------------------------- -AMD version 3.3.1, Jan 10, 2024: 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) @@ -1148,7 +1148,7 @@ AMD version 3.3.1, Jan 10, 2024: approximate minimum degree ordering size of AMD integer: 8 -AMD version 3.3.1, Jan 10, 2024, results: +AMD version 3.3.2, Mar 22, 2024, results: status: OK, but jumbled n, dimension of A: 66 nz, number of nonzeros in A: 66 diff --git a/LDL/Demo/ldllmain.out b/LDL/Demo/ldllmain.out index 5de32dd310..6618789c9c 100644 --- a/LDL/Demo/ldllmain.out +++ b/LDL/Demo/ldllmain.out @@ -1,4 +1,4 @@ -LDL version 3.3.1, date: Jan 10, 2024 +LDL version 3.3.2, date: Mar 22, 2024 -------------------------------------------------------- diff --git a/LDL/Demo/ldlmain.out b/LDL/Demo/ldlmain.out index 5de32dd310..6618789c9c 100644 --- a/LDL/Demo/ldlmain.out +++ b/LDL/Demo/ldlmain.out @@ -1,4 +1,4 @@ -LDL version 3.3.1, date: Jan 10, 2024 +LDL version 3.3.2, date: Mar 22, 2024 -------------------------------------------------------- diff --git a/LDL/Demo/ldlsimple.out b/LDL/Demo/ldlsimple.out index 3eaeafdda2..ceb3ceb7fd 100644 --- a/LDL/Demo/ldlsimple.out +++ b/LDL/Demo/ldlsimple.out @@ -1,4 +1,4 @@ -LDL 3.3.1 in SuiteSparse 7.5.0 +LDL 3.3.2 in SuiteSparse 7.7.0 Nonzeros in L, excluding diagonal: 13 x [0] = 0.1 x [1] = 0.2 diff --git a/LDL/Doc/ChangeLog b/LDL/Doc/ChangeLog index 0ef247bfba..825cd63522 100644 --- a/LDL/Doc/ChangeLog +++ b/LDL/Doc/ChangeLog @@ -1,4 +1,4 @@ -Feb XX, 2024: version 3.3.2 +Mar 22, 2024: version 3.3.2 * minor updates to build system diff --git a/LDL/Doc/ldl_userguide.pdf b/LDL/Doc/ldl_userguide.pdf index 2a23e5b83f4500de47c98036fa87a0751e89b7d7..3b2c114ba27cc883600cfac59940be82c626a3e8 100644 GIT binary patch delta 25491 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 a-jVzR7CAJ_mSY1S3NSM?3MC~)Peuxz8qD7S delta 25866 zcmV(yKD^tlzngH-zAsi!4}XU|iKoNBhOr@ebP@((JA{<3u8T1PrCM&n8wm`JYt*N?w_{^{3W_!=8v zhZM$TA6KdIiw$r5@rO{2GNH&|J%6o&Op)xct`6cP^VU%kC@n|dZu+6iw}bGTIsaP6 zkSy`m@Q^X7sDBVk*>KKlY!Jq&r`7o;+a~}F);7R)|gw}Th`fm+jKO=@}T7?#W|3}k~S%vhbe7`hT?*bJeyT0^I{FNgAlv@6!T z;)~K@Qw|i0nLURkxa*w0EP4`KCH`xP@M5O67MA>YtjcY^DXY@i?2XAoD~xaT{Q9!t z>sVUFaz-qsh>+OnT7+*DhkyQ0L(lYMSJrv=CW})yDkGnjjxFT7X@mkV0~28SLx1az*f9Z$EC@fj zJWMVehUGIdkfJUh%C;d=48!CDZ*JTAcp4~dX~jld{-$d=pD0i_E=<-Fi9Xq!24?K> zWzjDQS&~jF^j$Kv73ECb&|!eP^%jJ>LA=CK>VUwp77bl7lrDo+M7j}S!$z%0M`FvH z9q&8#Q(bht6V0;^3V&hoC(WT31vTIPq!f z!b~L`4DeYI5D3Jq5N)`^kk0VOs?;Z8dY--_?1n-vC}q5R$D>n|Hz`@+axiAbs5^ntQ~&|OCJRhVH3-$jN=?)-kbgFj|Le=jYQN}S%HmZ% zMmf_cBi;hV7csPDWe2vIjEU%5QI&yatsJN!fV7p>Oz?F zuEvt0ST+f$i?g~jS&}T!S@umKiIkTFS)#a(#6g&#ma1?pN=s^C8pk2Z-I?zyXXa{+ z>YlL&nW6(7qkmwcK!>4}?Rn;EGa}N0CRvDTI~BXzMF~})qsj0A*CNJY9DT-NS}+bL zg2SLV9M+a`nATMVqn@Fdgrl@Qxng=?ii>@Wj3StfP|UP;yl&*1n?tKGNTC3mBf3On zOHI@ak!@r+HHhBxNI*ud1`|ixgvdMe z@X@8*xnn*DH&{09u;febBoAf5Z5RxY#uEIP^m#3_s$f|wUb-N`$SDVOZo4{fw!-Y< z8RJY^p&*-_mFWnIl{7+RH@$o}4<3XDG&TS0P-XAcdrzZb1~rshoDbY=0(6x8HxS02X? z*?-%#!Ql(S1Y}GrxeLg-Iu-LHgdGXwy8ab>K=0_bq z$@TZ{ww~!OAuOlPLQu|LTIgx&V^!4B6@QME7IbH3ODN%544YnpGZEw!m`qNTPfHok z{sxbQph==eqMRA>CVK$uh==_Y>+YUrNehRI%+|fYW7Jf+P;}ZO6b}O5Zs9QBxabhV zK_Cv0YTsD1Ta3 z$w;GkJ4N(D(YWdoxv@9aM|2cj^(IeYdlk$M&5gZC7Gvd|ZY9ek-gZpmG$|@BE95?i zHvORxs*7p|k+hlmr>{$bqYa!oMFKCnqaTW+%-ZUV1jh0|2eTTSx*AL*!17oPtqEd% zRSnPeIi-xp4K>YEDHDj^65;MLZht`$9pT6_;B;@8;U(h<$oo{(-x*v z#@p66k59_mfe!QtY?gYjj;r=`n&9C=Zmzt~H~+l(K>u!{uZkhEO-YJ03V^GyL=vbd zyZ95(n%RGah&+09SOlVEWKjc&e?UWoC+~eX`vdZ}LMgp>0RK|hF#GDsXM472fj2wTrxTk~uZZ$YI+VXgdCW382vh6$W@PZ4)ZTz5>9O2qG+#lIDF zpb|X5fvKU*M%a@4`UNliCq3AM#|gK`2?2Jo5i>UmFHB`_XLM*XATc>IGB}rEZ2=So zGB7qcF_-bE0wXY%$=R>c^Dbp+}s!pZJZeF9L)r%=>TpP z&gK9WpcBy16=(u~_+2nS!O#ZyPh|{nZUu9%%cIvD`lfbbx>N2Efd~{GV|D_Wm8n!uDUzhQ`KrHui?L9u~G{ z08Fa;F>^sz7ng8spIIT^YF0nUytKp(Ha75|Okn3(}47RJs1BcPdu zE!>~zATiMN9}F74qlG)*6BB6nm;p?`|Niq$7qng`cDB|Yf6V_iUq&@CVNDSU+J7qk zk4{9y&K=-I&&md%XJKasaC311IN6y1KK~s>$T!)FB$r$v({Qtb^|8n{NTkzje{%_YmA?OZ-ZOyFz z(?$z_CkYF8pox-&v$6R<%kqz0{r8bsTi61X?3^rqKUDzq%uG!GO9#3vV=K^;!wIyJ z|55=#hx6Z*;yBZIA-Gsp!1 zD$fUCYUc>|d!iid07l{8qJIzvfKlWR;sh{%ivB@d07kJth#SBt{vX821Ynf-gO~w~ zl7A2jfKloXVg)ct|3Pd3Mwved#4h&-f!O8$AP~F49|U4o{14&+u`B&SAU>5p2*juQ z2Z8w1{vc58>VFW3UE>b|v1|T8Aa? zKk|Pr;y(&dDaQXn?4V%AcGjS6_#X)y+i!`D%^$+wYr<&q7X(oP|3mRt6&iWg={>g&*x8P53_TT1q zE{=b(feg(4f}r?+vSR}c#@xf+9BBK0mjy`n7e5oIOv}F@Xe3sDK~Nk2E)CRUo4-l} z_3uw)c95$r=+^$ygKD??lMKk&?!VNaV(kB@LBZ@nZ&2I+8aEsBzoq{@Y&KBV_MnHJ z-JkKXff`|N?c(%Te2~Q9F9>SQUyWl1_2G{(J199PppC_U?+p8I8=&i7?PCXj1#tqs zPyWLSD%#2V?~Pz)2IclAQ_z!|(b?P)_}5~A3Uzj~`^y0o!{sjs>bdJ*5R{qQU;6^` zcK-{4!h8G$K`r(ClN>0LC(!X9s{eZ08M`=wdg}bI_Yr8L{|Eo;#|04R4m5^aoU=3L z4YsTeZo97*#&e_J8RMTO-_cBeqo(&-bZmEdM1)DEuF48rcf1u&9_&V5*%GI^5n3X8 z@j7a*g9&R%Qf__ne%4P=ncQiGTbRJ?AOCtJ{JoC=7N1^CXxID2!CNE13bGlzLxw!h z!G#M^=?mJuTd$=1_rB8Qka9Q}i+F(K-P|GvxV3*|XSxB+$VhbI0F^WD;oMe2!yS3%#^|vBW;idajnMu{d?&kl|=!6F}aej!aT`iR`Dy zV9k3K7p^;wq|Rctk8ap}X13m^^4w8SxpzFc)T1CD=b^&EW`snSj*4DykxH~FB2I*6 z%RXO`S$CJdoNDc=ROP-My(c2n2I?@@^>QJ9`-N- z@Z9edh~Wi0W&_VLSZg{1#;ZfC==Dw9hz8;W&F%i1W?8jv0SBvU#DgpDKc#0bWIU(B zT@SWstkKV}jWg}~J9bB%Ol)xUz>~@A>jU}st6P$D#XivDMPYt_&n9rW;#sv=163f7;|v~v{W<<6$_ zW7+Zaxa)e*UwMjuWLs#UyiXb|_VKVQX_ww`Ovw@yvaXT5wO?eE(2r*;t_k|2h`FRF^2KNwzkH;+;Xzm~FJAQIC zL(RvkI*E-CV$x9tA=3jkhb2eoKofP-L5>%)#pg!JoaYp9rKcd~TF?-kgPg@6*;}V- z+vcu)cKS6D({noWi6L7xDoOsDh&ptcZ?G}?)b&Ma+T5R%k6D^jQGds2^=oVIPl-D- zm+GFa6HKFjUzW?X&d{OvZ%K*y=T8W^HcDmG?v#&PaTF{ZUIzB2bLL19Sa;*k$S^S$ z?_SI<2;|Ggby^i*%C8VF2x|m2GK#0L+@~_NfTzZI_7>lUWZ}Egkq%NhSGon2(dDLJ%BCG%GUnXgCx8Ry(P;-B@Y>9e2ZxnZeF*V3AB46#YX6%DoDnr>kIhW&G@; zkILS-*}x9BZ`H(s^MSScBZen&sV-%hqu`SujVaOky?6ZV?IhI~@oUMh{th9iR(KR! zt4v>i&wb#@Qe+LlaC^mpN0>YTB(vanCRu+XjL=otj+5k34bP#$M7*z7kL z_Mgw2RC3ktnl8~O2AJAfiqYZ&DO2cwWtP-(p(Rf`OTP)b(~K05Z4j@R5vf38OZlsU z;g|8MbZLN{sQ>am79_U*79+n{KFMN+rntX<%zz%E*2|fM{n+3(p5#X@*bG@H`hGnx zMZ*Z4Q*YBMGpFQ6hPT`p0ZyUwGtCvkVvHny=eMuF7QHhQXL<<3)xW+Ok5;aK*+(2K zwx03ZNaC0>&)|Ui1k19xUO$l=Pe`Qw%T@h4W7E1#$(x*7W1tDq=DcOTESmrom7k)2 z%@A&{9P?Txw#O+gSf8L^q&6`f$|Kfq5!c&GCGblOM{ixuP^w639H*u99WG1&R+#_K zG?rA{m+yw?5zj^B@Na2CoNOP2-oP*p*{Bln+Zg!4PXVJu202sal=kIQTeR-UuA^E$ zp|yfhBPfz{tSDjxJgI?t4RQ7P)4B0~G!)Hj7xoK|o9;2s8|*+x!n`;=bEHfwp$k?0 zk=Pv~QENRt=np_a*Y;M*FkP)+OWH<-Le??^ZKNXH~&bnbN}465xMJ}a(P zm@3}nQqBP>#-xHqwp5iRDePAE9~IO7&~rQL^%(PX68PSuG%G>T!H{U>k%mNnJN6NX z*g*=a@DrbiDJr1Q;_-L-$o#x#?`+5+1k~Ect*STPA2_;%RDTqbw~cIc8PhZ%7sN$U z<|4RulVmj`@PFlP`(RQC-LzsoWCuHn+syI;pQOHVb>q^>v6&`17e$WS_fhSJQsp{& z0M~K~EZ1(1nLxhO)<^C&juz~HJc&o~wVrXr;7%xLZ#s86b_W9tW00*WwysPD4l!5+ zK5FDAS=mR!*=i{aSm6XeGbT)F<z@E?^9BAle&;;Gai3`)mSH7>vLdS zQKsM=O|Y&QSkb7#H&9iU=;rhwaj>f_(0}Tp60bNGmLXghb2QTIX`6=F5guwKT3l`F zph>@&{1U|B5Mc*HlV(qU%W!LEX|0{-NNDbi7dIxz%EMCVym+zbL4hZcPVB~a>p*md zcv9Ue!5}}4=!IRf!J8q>Wcz58SSje*i}q1rj8-PKf2#_ukAotQ>^So&p6`PP>LIB; z(%pD9q%CgHwPiJf+II2>u$wUKeTp)aFs_}MT+f=mY)QLt?#_{a84^9LiU)rc3r32OBMH-m+rY*zg#QDiz+2DRI+pA!V1lS$En|E-nvh0?HK4 z$7O^E(lfrd3FsA}a=YeE$9vG=!B9%uI5$mK@|Y-)o}~sBe3qNW+ci{i&+8!$c{U+# zSNQ<`InysZqn_q}A`d#CW1D+74@pZ;I~i(#Y5~RQg=fz*dax=oc9_#^sQ8l z#4`1b+CMzB)?wR=iFKEn`r#N_JO^&JR8O7iX+On?-2`otMo}D=JszP( zUCsOvXVuz&wS&7APoEn6VFqV}%w9AzqyLBinRbM#Nj?^Kwrxr2Nh2yz(LR4@z}Z;T zpk+31lPNQ{x7NRsi@p4#FjXJrL1H+wOvVRlc-$(q&(r)vwu0jJv9TM54k%wDb*df? zDXE9`*%k?Y_{e_DucECtnG?`6Uek!;=tpG|*Y0!#qh^R~a2|`TiO`s(YNQN$bvwW=AWV_gD_~B!z0LFd( z7c0_Vm2QGv_B|VQZ=*>)FB{JF*_Z^&oy7XgfVSyg6USPw!eu+#G0ZJ-#XernWN2IVpt2^l$@tP%o6UNZX@$5z4F=CW2RgT!B87`!}N8;I< zV0M2P_|Irbyz4rD z%pt)cruX*{3a8%aG5AUjE#h7?Qd^Vpuun;DDBHmSwp76;i?OM8Gj>FGMfxGfpY2!> zxA<0DOJO0xYw!mUx{x3U!`$WLr91TC+OI1X6*kMjuV9)hP;QEfo2;VXXt8AgZl;$Xv7-f{5@r?_E@G z3Ye_+KEyRsM^2=T27l!?U)x4{fE;^-GV0C=k~ zg`QxKRhCM_Rdkk`djX#@RhBAUIO`k`j$7|7ZLHx!BQscYiC4~XxE&LJgO6}yEMO0i z4P1J;h-=x&aK9VBD}GQ{Pk&Y%;`Q}eE=FoXxi=9Aj{J%Heh6_SwVvSM{Ga2LKt3>gj;$<*7Sx|NYISDUr%?^xtF4?V59->1-Z z%lVZ=eS)7?^jTI0W~^R+ZqU&vj`|@!9Pk2bBsu33p$er_?xWk8luf%BTM}+zBcF(H z*3U9?fW)es-Yl_65)-^JbMdwq{;WJVl9usdchtUC$r&Sy@|40+MawDzqWCTA@_Igx zx}hd=A}&o-ZfQUJC;+pPGBikMGe1;gn7q;VMcw=DItncmqWxumg%pI+qL0wi?o6wC zw^tv6Sk|h)c3aFj=5tO$g_7fcL359s9Azuyj5^^OZafM0uL=A4h26?`mgluSTg=U# zq>R_{qFVUfV+HJ(fvSp5!^d}sH4Ia33cs*kL~9bPc0AC^eAis0NDrvE5XTibzXM#6 z))}R-2tSzd?k6#S$(!POEhIikuoA!~#RRFkN!i-_h}AHiz&svZd)#arntl!PFU}HX z6%@aXWl%xR6+r}FhuR59g)$yj_g1_trfpUyAggnncK{E};9h z!8miS=g7-0h|4{+aE>IPoTV@?sciuhRK9+fm0*?{YR~U~6*{et^fR4lMru@mYPilt zvwgbI(>qgbq;5+?T7Ij_lxDpkn4=p5X2f`}a!HRbHA{tk)Ro??l4eI9X(2BB;VOkW zP~*!tc#AN>?Jt2cBBmjEIN3)8D&HVrEWEa*NbA_lKTw5$=i!<4`L@Av{h*(Voj(j| zA4M0sr}8;}&cuF>*u_-Kf>!$=pPCh{R8bRXaArRfo^Rk8?e$8TnHBC1A9033n~?}N zjKz1#=RBXtt&p+UHL`9kEk%&G>XhBXf93>4svg-Kd53lD_mx>@th9tCX1=7pPa zg+zG_{{1`_t4~9-6eF5gi(>|uq1AfD=;z~f?=hO4aYD81!_6FV($3Vm?X;K{-V1%_ z0u`};dyTbM?KDsziQo~g^A$_bhR!?Tj;@K3OHO;y z^1K4MBGf_|k!GfwTa=qj72k&fn>P;Lpx6pnSEWsAG|8&xtsNz7a->>QUGg|Z=K#OB z=AA8UYtuGiE11oERDr>{+>niWBA*7KaQ*Rr#@eknsFEv9bc(%VYADi&v3dXMjOe*1 z+I%ds!FZNk3;pyGk!(-bcV`Cpx}paIy2iBo{sEKGEx~nAG(kfT^_4sFcudW0p?CT7 zI-@^dq3!yKmak&3Y+5wnO6UsJKDAvz7c9;h2A@&(ImRyiSZo~Qr_EzHaMrJ%qNDVG z|JJQUy>vBEl;cPKmZDWk}02gw)r-f|eknzfUN?zr$k=`I0?^hLk2`|U4{G)eYZjYJorT^VW zfJ^D88tY3cySBwQ=$QaB+;nSkq+_>#q{gPMxnNrVXg~XFlcn!k*649!S}sKBUveZr zG!q)J$U^`t5OyMHfb;YB>lP}@TJBuU!uzS>wyLPfIw~0X(0LxI;?o;Q0h!&9>D@ti zmgCQA+|1Z#N=ZeIRSk>Rx@z9NlP*l@p1(BZBUShKtK*X(uWa$aS8;=;tTG>eGGBXR z-UDZ1==NiJXYYxG3+5!U7p&?SjdX6d_G?|GSMPQQAsRnG<}0JFpZ2ua8_j44s7rt-BUSE>wc`Z*|o1XnMqX`L(=FewO;o*lMbfBx|8_T6ei z2}M_=xyub0MLVG|cqkcibYRSX4EbX$x3P{AJc%R~$r^m$X6eJrO?~LbG1OpZ7kcs( zGMHz`JN)R}R9cdxZGXHb^rfbtQjJZi$n?aUC7k*gX33@8J1O_b&5uZJ2WqvWQ)PqT zPVw|T_Nvj)WnH4*Yx5j<-~u7Jx!r-r(7GzqUY?>gkYO!?9*Qlha}2wGw7=9y4W121 z761XT{ZnYy z;D8msN&IxifRsNrt*xMc5GaO6u+_asWR8syUEocGdM>*sz&;hlz)mH*@rW@kKnoKZ zM9bFdF)LJzu?CeLJ0UWA`spK4Q`_eo*m44TgJ+cJ@{Sy^ zCS)jxUw#+-`03=(_$z`BQ z_Ah@@+XtI%^fkq5h}XqXY`1PVMHd={fqO(NFn8m~?DRK{f|)Mva;a_yu4#vNLn6jQozjU>hu9AANHqTeBVy5|hh|Fu_Jt zeW8)JQQ7$wZ!7y#Wu*3cDJqI(e@316M@VHhqMy5>d>Gom@r6??yX~Dvu@I-LIWF*V zsj|oH<#$8!*HWqb&F6W0tY9bUmS?RM-XT5qT<0Nk{6uem4k&_CZ6Rol{Nmz>zzIl! zO^zJd03TD93pc|AT|)r@ONqh8nvhqx)ST4P7pJz6h6%8yOW4T7pD;h3HR7Y#lOWok zhQIdm(%6m~kzJ}*x}KOn57YZ|d5jLn*ZgXDJtgEnw{TkSj3#oV%4S4310sQOQEG%Y zKWazFF>!K#rORO;3{ZuC4wGLbDeX#14Q!FK)EKMlupLc*ivO+wRqgyE=|S4@(3k3m z%GcC(DdMfh26hZ@cDnU^WN-OlA3~aMg0{1O6do@tJM{eodowY-W{&CUC+jE{r=t9S_uYxQ$40|8FWpDJ%DTQ&H3dbP zpDvhu^qsXocFEnUU!#y+*2O(&uXue*5H>gbwkmudKj6ENcu}Ya={pi3Jl&5p>7DGgO&6f}*=#ck`daMf14S@udKly)>cu5ouI zB{*#2@nAa=+l!7vRD8ofu$$$99>he4 z%LqQyF|A#IFij*mq9z*^$`Fs7!koEjJ=pkvI^Brid}>B96v@}>fobKh;82xiSF2wo z!gDc5rp7!7e#J!sRr^U4nZ#BisH@*S*X^$M!9<&RTK{)o(eCvG*At}N2PQ}()Fy424}opGn&|4f>sBXO0ROL97Y z2xgoTTF|C10)33gnYXTpa=*>iqt)DdiL-We!cSf)(R|fGHNP8)WBu{2S1Ms<=chwW zl#05JNEg?{eTa8f-mbMpITqyN2MYIQ*iSt;WulKNCq2-5oX1;_y`w(V?Gtr^2C+~I z1u-@d4Wbl+loJU(LaRGyTlpgh5iePPgvAkE?se_g%rnVa@kBKd)#qmC@HFt4LkUi5 zqh4AluM@A;*U6}b?1zg~{ zMN2RmS(=ZYvqBWbA>7~znPJ(wQIbTR|ERC|o~sUjQq-~hWaS8;C}&8Ob<0_X(%QUh znqwW>DdAXp&K1_6`eX^Q-NAl;wvqHG3?a2&=yq|hLf0BW_26icgJ z7+IDX zHY};l?FLY*2fOOLItM<%HTDRwX|(au29c+=vluJ_G&1aD+xu*I1RBGCPNgW{%cX7M zZilYM9n_Y)8K`TAoH%&7x{$=WQGvAo}tk6Uu=?`2F%mltW?nC!n31Ws z_;cgU=v&=AUPKB(J>b26FCQXJY?P2(<@0%B#}Q`DhZ^GZQlkku#H<=k+|m=2=)IK4 zMlAEV<|w?}l!xV^?06WRgFM9!hZk)6QIr#M_1URS3IRA83rROU2wtPfj!D$Cw2z+D=+v1JtTXA!G=h_Ztp2(;3_~Ivj8}uYmn>Se^wKvfk zc4yW__R_tQJ`G!ymp>z)a_hy}#xi>{DQzbx1mf8ed*4D&d(Rva2`%r(?sp@3jxFT` zk3Ow_k|&F4@jr(Ugnyse!>V7HgS@IjyC1P?g~La=_Ray4F>XtP>Y*q`qqb!7Y2;L> zCKib{J9(&4=V5byS!_d|*9EBda;zs2OhG~Qp>~@!IPw_A>!&ZF2GlvP((QmvqB3I6 z$B&LwuSdkl7;_0k!$`;Z_U*0ERs)>pB~4f@u-X}Eog1|sL8xfMA!Az1Dh#l_HoBGU zWCwLJ9i%=#A3lFKO0^*iJk7-jR=w@ApBDGS_DLK#aS(!kQ58l#DL$9gK^)tZ5Y-H7 zYnN}x;~{cqF6kkrla_I<9>Y>DjAy2JG3|_Axh9kyC#32lc%UhrQ)(gZ}6#C;W`HlMtov# zy5Gs+2J(@AJy@3?u}&h{UlFH&&eA2-)h9N)fo1hf!##?tuN4YjA{Wbr)DKOrMU@hA zO~9dD4S((3BV*A=*ZMjHNr<&$^3!yVva>)%u5fV(4{EUfsEH6dhUkFFb}HBTF9~XR zn)>3~KO8@C2niWBr#@F^R+W4q@ty8Ub@p1;55IbUGH%!4jNK(=l_>jW1(nLem_kpw z8KkTWe`tw$kVJu(pFSdEx)!)axTT!BeZ-9+#joej)gj+a9S;{2&Al9p+&B#@spwKb zO-N?-h_+AqcCZuZJI#&VyBqE0`M9IGiXPy@;M*8uFV?_$tTm%sqDlIA0e)NMiYB8><*2}dak>)0zc1Y*}u#TRht6bWczL${x(v>g@j7xo;HHdnf-}K z8om33SjhWQG7Xjam}9q7+bUG<3q<7EuP8=OKelvq`1v>+a(0>&DW&LM-{snkh%Dn2 zz7szM4C#XpbBDmDJ)wGQ9irrb3|A5JW51t&z5pg>@=AkZmpnldnUo3Wt5b7WR^8`C zctM>W$<;Il&E#sU1fl>VtB$k|-Q!pDAvdHt1vmmVXt0#EZ&jXCv3m`E6mI@!1(zc} z{T6__b$iu2xlVpnw54-STF-uFUTwb*&86Sj2peqE-q!mJz-u#@zE z5Xt>VoO0Ryy91}7LW<+E`18fBwv4>#{Zis>@DDN1!o(_Z=(k}P>P@TEGm@sqX?7T~ zT(GU-bi!&Lll(&3PWDEU?GrqoYTi`!){5zRDp^`-ft^9=>j{#6;Jy<}Bp1*h=~Y`Z zMC^A@yYQ5%-*mqLDmSkxKDsYMA->yxf_IAKY^WCHtIeQQz77h7d?y1ALonaHoucO1 z9nF4szKR+?_|WKoSvGD8;7rKY=L@(`7!`4{K`!+2NtZJYA!}1w5RNec*Q&zl$YDXHD3aBt zy{j_34ulUE{W1q3A2>J{V^%l?E@^=%Z`Jc0Z;E&Jg(yPS>nQ?6GagX)CWJ32&5C2^ zYe1iO3M>sHg~cxAV-J2T0b;p-lXEbqA4^8Bd)TFF`!y;x`*l%wnaU8!`!zatJU<{I ze7~w1Ke-^nT|$(Ce*NV44wp8SAR+JMEY3nc7!}vwlCDCj+FcBWeMMo zT^FXsb+_R!s}e`z=_;}Hn(-XP^^jQ=4*TQ#3@wf^uELV?{0)tA@4i8Q_4yiPq?yBS z+`}Bn6+!5W?=;$w7K)d*9Xe$v?jOp$&^`J^N&)mZXd%VOTJKqWU=qOI%Q-y`Q%qwgoC=?x_!cW4QGeFdYK{rP;kS4psYp ze;^n+JiLK(YtbO2Oj|e2bs|RG&@)1eEVpzbTX-jnBGLZ%uDWX(u{WyKH8NoECk0dQ zZ10WD!u56||9s*%0ge_5QNHLQj6PcKT)67^M&=d<=%m0Ex)v>eq!!j3WH#4OI#}Im z3M5?bMpE9#)ICR=O_ntNkg7F~FNRDvIToHirty>E!{-wXJ z`*a;UAL;a=obus|xlW(zLFzt7hEWY_Bmp4=FaGFl9+O-zub;*sMe#=eQ;k7&GR_%H zLkG+^BP2E_uD5_qeRhS(hf1N;_fmebays$0cSg24f;(qo?^j+QcD_<-W)dXEvroNl z;sj=YHrP5&O%vu##*Jw_rSW>aqvqYy72rIiU2fN4>J=%_u+6|=*NZ%23p#Khb=OdI z<)&N_ilB=kSk;ouS56h!lqqlcNZ_muof@kEGiHKxxq_~Xjjd&PC6+DY*Mp4AVjwp^ z&DV5Yt13AFpz(!xW+kCUyk)G z_C#ktxqA8xOL!dt;#QTnn#{HW>Bkm->0v(rss{<@30Y>gtjr>oz6DlPt9p1hd?In* zB-nt&!DuB;gnA!Cey-hcF5j`V)7w+kNA!a8wq|&V8}{Lz`(a(knCn0Y?-QW`LV3Hb zTgSXYxS0_;B>L55jj!Ivm-bld2upj=jyA-}c(VKfRi?0E^hF%5=y zf6A;?Smz5xY_>3Fk|z`U(ktgDBRl3~tK!^C2mVkPTa{%L57(j?2r&$picP?_=}3cP z*5ng5dhF;QAoohoKu~+iUv?aaoD-Hed&D%-%R9@3zAMoF<{6a} zb~~kUrrlJISyHMggv^&YIz!ifeYiE-a-wWMRKkwO-C_4E6$csK;(D$po;#t!u-nsU z$1mw@a-q`EKvqLA0WcEcG$?s{$d+&oWhA1(_^ylr%XOj@RGe-(Jm)NbyKs)PrWGHI z+Y~IQq?^!m%_&QvS+5Pd&W|;kjs00Dx!Hw^k(?~s5 z++GT@{p>f@kJG7M#UEL$9&Pf=&b1%1olu>$+^J zI;T|Ve?O(9O8mSp$(P7bAt2j7sMz&fru}cf;5S9K3 ze!{{7T02geQYEt@n}Q5RLRs!kxq@h2dU_$=4DSN1(X-s-J0?^n<3b{fG#`m^CHxmh zEo<9((x2MLo;bAF4PHY)2dQFNxR`~BNIOp3#bS}=ju?1{fqjDx$<&)7dNWxla~~{ASsIWsLb$-J*w_AEqUWd9CV+ zm1eJ{O_rUi`^WgYU4W7r^1#_BSgvP1uYCDOai=zDSW&w(rJl}}#>3Y;^9Gk70VXT= z_A7l~1wG~3?D+>Zb<;=YmYSvk0Q{uSHtV^9A>}fDB-mqhXWtEzu%{5mQJM#vV>1x9 zc$3A>yK?q_*ZN4KqyPcZ@DAPC9n|u5HnOgee{^)bk22Ck)tUBNI~=-1_Kz{8VI^qc zlHD#0Ya(o2s+!GnQE$Lu8YcF)JYi)SAsl)AX;g6B_Q3m_7gaHBKdF47M%1FsS43|{ zUL{5y)4?t%tJmQwy$9P>AsdLK5t|)~4Vq1|DWf8PQJfyuBKH~r9P6b!r|&&F)>t!o zG%XSr_fb0vcvTr}{;Xaa=^`(1C4z+N?_ob5?{IM;VdPF2?6L&mv*yDtJPP*7O|*jh zkb(_<&Jaz3u7Hq4K!bU$wZ~QGb=NY~EuZShW)sP}+qmAPF=x_wZfxwBWuQ=Q+#Xan z=-Cf{p_8zi5=1*|_}J@VzCG;w9@F|J!TMMUynO7{F()m-jP|?a(H8s3D|^xb-zb+0 z;#!?BW%``47~q7V+`HHncZH)vpg&hd!k9jHy)L7voxnlgHFsM)iD1XF{VY0sLEo&1 z8D4cY__5)7%N)M=@I5Izi{|9u=lXy+#zbO&1)NF3b!sgRHT5k_I!Z%tP73iD#t;XF zKxCF}?w9~B%ve*Qo#@br1=7uIR6Jg z%h)yWZ9LBP%Rl@CBI8YAk$V}V(r$m4^G%>{S0j{E85#8cf}h62t~J8Y6{$&|yVd3S zYB}iDVd(X2@c#1TIeX%pAx1Uq5S~6u>dqo&a_#c5{z`!nz1!R{$a8-AqC#K^VeiBvZTF4>($B5fh9a;>gVcc7QXVv8j{*yOcP(2S;PMSaTMXBi;IcUZke$ zS*jSejq6Ar-DPh4r$MzMj+)0l3k6SK<$3RXTwigWkq&f81X1$ zMolUbVp65MXNMKkH5&QDUIyn-t^TuGDPj>s{f!%*wORxsrLr59$X)aLwnN>*$hS@qNwlk5~1 z4&P(Q)#fK;r`eZOWNGkGdlFP?=N6+OyfCoGP=1)z@k~SP+8;|npI%)ybGteGs1>J$ zs*E|HWW$!XWO*PXGMUn2x%vU|)-|fzz zH&3t9;#=01?CStAD zmMSa>*Bq!th&{D`VkG}cJC?}KYCCLXR}D$TkGWuZI!uQdj?c2KL)pw*eS*U7-&-SHoqg9WZ$xgT?mk4p9uo=_&Gt6aFo;Vlq%%B8cLDx#A>;n}dFfwVuW<64Im& z@@pKz=CYpR64#mu!f2levdW4u=?A5T%WDz<+otVvmF*E*8L0u$UR9Z$n9?_CJzm4B za+Yr=$NU91Jr!)ncdMOQZ#Q3yL&`)}EI4^rc5W2Iyzdo?*r?65Y_YAE@+Ev0&hLjX z{3ng0q`{$o0&XTrf{=MaOB%>w9XC z!tdwManSd0=H#2KUk0f=Eh{ns0U%5sE0jRqf90(i4|arwoI_kD4zz}Aa!s~v+x)U^ zyS_M?U$$-A_JqlHO`dGq_kVYHcXwy;p2fR;&hI&@ClYhlrzF9dt;P;gL1R9@XvPUb z7>Z72O~@LWq}t*b0y6jp^D6ETl`a2dbIRL1 za^$!TZlV2+*q^})u19MexWX;^V6R=R0Xe#3Y$WoCbM&GU@VW&sE-#pyXSK&qD2HEW z3nx{9-}bi^jo}IO)k|I|s|@llvC7bH4c3JU6Cmu#9L>FbIh`b}qv$~j6+NLGM!*Z` zn6Uz^&)^|>EMIB>d&ia0Q$dcbV|F*rtwjtd+1l5bTF|H{YFjXmHSW(b7#~t?li+fP z&{1LSc3SXIMXGVRn7WP#p5Ad(=eqWmWH?2 z&{*t-b`}02Z7S~A(jwRA06Pi}0|GOI492jg-9nW5aB9knh+m5L39hEA<_e7c>L zidhJTUY4*e=(dgUo!JbHLiD+eY}i_0s!$UnhuJ4%7NM)zIk!8UdE$z8kc~hNzvcgB zroY*Q5yc8-ox!n`Y(jmBjF_fkeywGl3sh&`RWb$H#8F-aOGWfiytgyAIARn05uVI$ z)Wv?F=|v)ZDlrX-t}sTgc>Jum3_7hk_aCIcg{Jqeh#V`Jxyr%ezhhep)TMi_uUf-A zwWz?qL<0AOxbk%~WeSol$LSE-+>JI6Er)%pOSniH(mp$%!x1 zR1$S!>6Y}dd3*Q5#e!MY))C*R@BP~Ep-mgx-J)lCA={AaWOu-^x&TpbuC!Hup|syg(|xdZpmU<@$b>3`Tp50 z%-BDq!f|MyqDaagacrodN{!&1>pc4~gxrF5)GM7lK%aj#c{>Oq;AA3jeI8O1I%Bz_ zR^pl^W`ORLaP*B*ZTP+M__VscQ`VVRl-aB3Hoz**HQZsL^=EaGGx6Ly-H=_0Dr1lq zIw=?=wbq6oKpBsbWuUB=kv=@Q==j-B0HPVrPtbOxCh+T}+hedF5X-JkCN~SU|8;-W zTqipc+gEYtYS{_$@2%7S)_&61<1odTnEgS(VOvXAldj{q)JY(x2Djulrv+|vk_3RfociaDF7Y&8^B0QL_S`6p zYOH$o?zQ2!nLZ`#by$q7iMw5U3pPrUDk|8bY%eiAT246sJ6xh$n3&;E#SKCXxFpE9 zCzG5{gtl0qoIifJz{L+{HjXsjRIQGL?oN73ARMacxM!RnS_##oO;3aC?Hk>NC)UQr z(@JN4R9b+pGX%;J4E{_;8v^@Ey{q}=V(dHplsCWaB0H!?CsT`N#D@Q1*o5#<@-X_L z6n{mB;olZF0Ykd^MRiGm@(+Y+Jb1%LB`qC2bxtgX>UQ9jo)2azQpmXlxRm>)u`h=+bm|e%2(2Hy~LsyOIs)5YSUKlYpKHBe1!~+ zu& z_75O+5ALD zKqX4t=yBsp)oHSxJe=bIenbCnkC8BfKNTo$zDgLNpGLl*IJ=SkcB0sm{Vo9uL~T}V z1WbO>OPb~#t8b;gV&2JO%Ulwf73u2OW*je}dCV|b7g0L?GCMa-U4#MFb!&l@j)UvV z8b?IaBN(dehYta)K z_x%ew6p?Q3T2$^8J#en?&i~Glet=MxlYLjlEsunB@mC_x1uW2V#eCdjacHW`2gtC}e zEsVNm^y!ok4eoX0hkG`&x&a!;3)*%0!7Ne=Fv#8+iRt|Drga%m4Ec9RzEE(C6PlfR z-fC6X2Z61oj9g!AwnfJ;9G#03rReJ2BkW&5$kLTeZ>-;g zV=~Y6^E#W-zUFK{bAJ>RyJa*cHpWZ+@W}HdE^a;ODK~!*CYBoEB?p9>SKuT)OPzgv zg_lRSIjGG+F#SG|!Q+STiDS*F@m;X{byg>-}oFwy>~g`4}`)JqCJ7z5~xlttsp!1 zKUFWFkuqn=+f}>7NO9`V)@u{UFvxcddQntp-3|X3dxbhcHV4^M#wIEI0RW@j!4hUh zxy0x*8tu4d`>wZ>%cfay~+C3596T(KLA$4g!#X7$<^W7oKieG#=nRi zp&YV?`Qt+oZMt>W?#tv&Mw{+M64@3IEqe=wWuyOiD&zh^Cf@%ZUjy~$bU6GYtKCYM zYXmHd-NIb#rh~M^WNadl;}cY6@w1A(8k(Y!uq(=H#zU#W{VYZpH+@14l;y}F>QX~~ zqZPa-)L>J?bV2ik5nJy4d^#ZWPvD;sg^KsP_*>$LMt??>AAs7y{ws1J^P%J&(xAbL zR<$s;d0Oq`m)+Ffvn)Yg-kAvu)tCU-4v*8MWyY0ruoGyOm-nN&IX=kTYxq_X7BBTZ z_r?^Cj~Z)!3kI~A&kK?BWD8~SIq}3;j3#VyrYUYS7ScWDEQdAa{DT02h7U8+g|=4T z%!Ta?CaXATj~Vf9Ae~LnENY`LvNB6Q3Mwbq#=j9!<1?uq&BkUEXY?)>G-s+I*w(r= zz%lO^#0pAqAnazq%Q34)5@mY(B`{ZKzhy}9>$=T7K`l>E`3|xdRbHjZ;H5S%Mqh07I5g~mS-+^~N(-YX}>~wEmVtz3Q9)(TeQDo^WQ?IRIi%Z7uys?w~rgMnpcU{3vm4%ITXM9oUzvZ9qI<1}Lzj z_}A%JIjMU##%O_fth=G^WjgnuU4C0Jlz3&hn8*+m1amEc9jD$>YYh{9Ykvd)c<2ew zn>k~H-H=%Dj~cn!3+u{UCUhNErv#sscu;`-H^zTFGFmG{6JC!_o9RuiW2h8vLT9uC zA+bezs;eZV5c(SWcmnCg+z)#E5(KE&@`X7fx`jJLxYpfI?xn*kVY>P~YQ-noz9#J4 zuubnCWwe_^vdED-j>(c(_~DH5e4R|wq|HGOVR$q)yUH9ZBnY#a+dpTamOx(j={NrE zH|2(?Tz4gO%1V7o389iB%t^TRpi|g35>e6{N>!UB*fF}021#_`;451? zzX$(ILx9eFiTr@F4d`Yp?wA;*MSQM~4MXhjQo9>S?&pdNSKxN>C;}~k@gWUN$!L3; zns3L&LS|qVmi!VCbC1IRea<7wM6K3U_tiWe zv8a%5@#Kr>LWB{U&oI|421VvfQ{<7LEJ2Z4_+%ubmzaDd#=)Yb=nyF}Y?4SEYh_wwGqPX}<-qi=+mfHAmj%WW9G%9D%{!P!z{xCBmFx~v8{Mk% zn|_=qGR!|jL>d{XQM%jea$Di#Z)za1NHVt zrS>@QRqI#?JE% zPbXTaO=Dm&HQGDzQV4$r&0p&o41xh2%m;^rQ z?&NP`y8WuMA_{}Xj&RVjX zrWrJXqojWErYl9`1YVJ+F0y-lN3!7gjEU>?jR1JfK&~SQtAeEKiYRMwTkCs-rM(l? z0}~%(hPefO5)k>@__X|$qNYFo3{0z41t8RSP5wUIqzhUqqaIvd|Fqt&yTs#$(8;Rd zJ}eA*j$(+JcTq{)n1(dghDpAQG+aR!4FYQ37$O9of86=48XZR3H(ngP-EabnO=bmDT zj8JuXuI93aF39al+4gu&LuE+fv&F&>nX#FS9G+aNQuS2-MODEt<^@z1Q2 zJmG7@CsrYh0?3jmpvBDR9n(Li{C5H^Wqzl7j~}A*XV9pV*@IiO-xqT8v+jkQzC zX;ffABdC)RLm)m#vKUg79>WMOtG?cX>TzK~;GLfmuvblh4GpV!(!MmfA#F@BBS4r3 ztLx=wUm6c?@qx=IlOnK;ong)v{U@UMl!?&%=mJyEZeMy~KqDaU9E@{BRFo$um(G?F6 zBQr7;W6uE`$oh=<(%cn&8QMAc-{DD*Bz1-JYoasIGbp{gF3@XF7sJ zR?r9hy7mPhCaQ)BoqWC7#T}R)4y`!~Dm3>Txh-XR)_E7KFOQ7&?g5;P*K$E!Wn-}k zHijfi@6&68vbnm#4#aifZ`rDJRT`m`bw~g$R?3nL z9@-C}9NZgkQa2aLTH*BEYP|E)z-)3Q7WA>Gc#dyW4j%#&Vf5OJW;EiNRaD8kBBPsI zsVCjUwK0YDrkyJ0yqdG%kE6AT-_uU)+7g*LSQMw1ESaWVM{sj)#7%i+exLhbg`lf; z0sSA4l|yiw&*FL|(33nsgagt<#931_lg7NzR-h3su5`<)Gyo!y{(WR)9s4IwFsPt| zwKTV*%{~kuvUHQJtIvtqV&T+prR^0lOG~Tg+j$R|>CEMP(Lw|KurA$4n$vz-`iwls zC1*V6gnq2X#fctRz4&D-VB;dV4>E>P+&1{MQQrT(6uC^QRa8-CY;t7jx|{n^KkAfr zL(mp+183RnjvmY^U5vV=FxOE+fs1-j&rE@@U(u>}hi{_<=Q^l{!>_z~YKuz0(3Q`C zlxgC3jNZMiwW{+MAw_ljNHi=A&DH|{RONi%ZRlh|VqQJ0SfK;f4i%s$3Hk|QH^zb4 zt=j7G7VZ0KZc6-_UrlwtjE0H1DMS18vI;Sx9Mj|*ClVjnUU%b;FgZN*q#DxX#B%Kh zY5&@@7&%Q`i~9m4*4dJ`lw2B!fV%^`WRt!f4f=<#(6OeWD&4Oq2^H=^@vI?q^}W*dnw-g`9SntY+bplnIEsdGcNX>7k_7yDdpcxC9=d z&$e=v=8qdMsxq@tXSay*PFvX;X79+$wLIZ*tam1}-4SnE(KdyYKxBfNf5R^Q^VQU2 zW3SO&3N=vLe(rw*6`gy6iwOe}39{bzh;QmQS^Go?|BU5Dnrn&-{;s{L0hjNR8PQi6 z1R0HzsVDa$R3uadfwp&ZL78)(NgXuJf;>Qwhcw0o_ z-WJ(t5bp`BHhe~oKujjFCjnLyE@M$0IES>K>j;BqUm292OCJ5pTSPtD0B3TF&0hYk zRL-23#r^_7!N_gt7sfC4lT92EcrL|auH&IiW(JlT1Ybp<9+ii4cut89ipnVBl6Pqe2a_GdJ=CebS}pRy=1?}(Td$pKOf@}k2IWUT6wF;v!0daaKoePw!rx{>%{Eq_dsspeN)YAN@^H+Gq3dx?8L%(g|Q(r<+)Q_-0Vc=ko*D@nvsfdb|%wY%>4w&*H;9B zy}c|`D{e!30`OfXV>12tSp5%~V@~oaMg{6T+MMfnTl741F-rV^-t8Ek8^OHaQs)^q zOtZ@m3DCt=)nd`)nc%>Nlx^g&Hn$f6EN6sC&d%nK%jE(r$gSb#;L=`(!GScQNb z7*-d8Oil@t7xo@~;aOtsKMspe(Ow9c=Hzmc7i*)&(OmzHMe8Y})S5uFU`;;iMy|7+6Ld?Kz4uY02VLWwD-8S0Gu|G48uO&~~0c={BNFiPU1!O;pY<`uQ#2+NPD*T(I<(ve@r_|htV2uFzUx4 z2f_$MY@OCn`y;df$F%QV^ByrQIGEn~!QGi>mY=S~?pu6@JGb*OvHSShiWv8Vt64b+ zv*R@&p?*o3b3az#FQk`!uQ_*`NyI#OWSyYiOv$dw34D5E4y!SQ-^2fCzlVpQ0x+|& zaIkW)bFpzVvT#weuu#*&Gb=cni<`JwkkE+pv9Yjmu>9Xhy0jw1NHVw*zC$AWlH1kmP08xcf)DI8qvd~e&ES(~8Fyzeevcx=PiWl%p)w~PH_zGij zOIR2glr#Xkj&Uwkl&b_NC=`}qJt4w`AkA~2mHN^YFy|nmCTd!SicS{0Vp9}>VN4a7 zY=L5HCT$U5HGrpLB`{yxz}>$G+sg=&Uaqlz<3=eMkX20~F)Pr44IYh$dA*IFWSc~m zvN|N$$yCHTG-sW~@ESfB{p!k5s<)&*%+U|QMw(c>wf1=vd{>_fg0rNFG^!t-3!jAu zVk;gEB&?(3EZEXJ~}>n$AnfNjOa;dH7PKN#Kj}^ z(G2xk)C9Ees!TAs@3)d-Luj|d9aj(avS5z7ho$~_OsGvFc^^3c_Olynr_+3S0u}bE zt*d#pxOS$DmI>5)cA_Cqt5ty@B5z!Yy|wI=GW*zndk2ehh*FJ3LOKz2_OokV* zavll2(xtF)4__;I-O&rI^<{5P%YM!62HMD5`1zS0CY72>7u$AH-Rk4Va9gaqXL7wU zb8yim$LO(Z`?Hxxg~=LJ)r4~_$g7Z+Q$+2U9v+4gsm6v{S%(*6YVCj;ZKd51;^VI5 zyer>`o^baXvxfP*yfe)eD3!JzOOvqwWk8lCyGvViJr}?O;n^qEb@TYm!t2({2_(-9 zJPrQI9Ue*!|<7Iuq~UkCU^>Am+vj=-0`4iE(Gf^`il6 zR{X)Da41eX7NNJ*DdACr4ZBD4W~|1HFQM`;@cS#g^Jav*s>=&@y}NBsE~5)y{OK`; zOA-*PZ2fku686rKHOks}p1fjN`TjUApM+t*qDX$RRgJ)T@)HQa_Lj2o)+yS{|Mm8t z>kDa<4=W*5WO91nL4u$oR#avoeR(dtFT8(A&Re+3)vM+?_vk}Kiwg@MlJ&rmxp;eE<8$s&58CrROdlx6nt1^_M9ySGaI(%#KLi!YFe?h% z?bRWmVL)*n?c4U(jX&N@L*i(;Jil4)xZ5Yb;cSeBL9)7@hNq+oZI1UIuRchWGFjH8 zf#)ql=l_``P5MP4Ee<(fCP(tn{=Rw7XzTNiqWfdZxUZ1MRwm^1wZ%58}6*@2Bzk~(o+4tm^FK? zY_S^5Uxt?if*X8sH4i6Psq8bO6i6pipE{kDWD(2#&9e0s;1y`uYWpmC-(8k)%2uCr zqxF_A-PF(3v^3J$k9^gGS>9}&`t-)VpEtJOgDxuor74jEEgsjQM6Hf?JcltWklthw z4&^O=R1Wc7JfQ>wfObil2~#!F=2JDcRl{GHm)O8{M(u3Ixm0!^>z7WILLF0YO7rW> zh5N7=NAB5Wd-bn43=}uNw?kivQxAsAI;wK<;c-{ZZS}+PJl};^jL?=Q!L0NTiStym zzBJlhEuRlo$$L21kD6D$D(l`j(An_YSa-OK{eh@!A~`zun8n>8Z=cZJm8d36=NTC{ z?Ju*e>s_q#{i{55H>YgOO`+k-^bQ4WVvlF(^5BiFi0nNja@S^|yO~H?nCGb0&WFia zrq`=x17f#h*pgVhKCa64B zXm8+O{%LdU*Qm}yJ?VsK=*|r=uj<0{JwsOR+By&RZc)!uR|CRL)8S3u32r7^;KtAr zzn|*=<}v-s>bM))-18TP?H&GX8MonEcWEyNSMTQQ7dFlbszz~C}yrn^qM-zwkA+_K4hf?8D&r3x-`?LlupkISv+D!=Z}`( zU#NWy>(#{F?g-rIefV`oJ!3HY_kwqvLe!Cw5Q5ms_v>fnhb*S-jZqcJbN-5J2z#Cj zG_eqm{iiVm4``m39pH>HvU~r??DZ~H$C``w z81b#kfVj+A3iqkTDR~pd!msWkAkcoVu!`nT5VQFd^K;WuKqb7iUq#8FQgqhu|IDN; zErD#ZS{&qaPGnO>;{Ce}fU2a>7y?wuAXbJF)SbCJmIQJnQ7y>pO4Hw>5!;YomOv!k zog#EaZ`nMG8s@jYk>*?JYKW4Y8v?;@@@+!{LK9X<5|Dt1;K<)b z_+ic^Eq_=B$ZJtE9$ji-r*5NHXr_k0kqLu4-E3k9dxUKi`ag2475-HDFJ+N!P{7e+ fp=k3v-og9?aucPen?Ml5v-5JoQ&LJONy7gROO;20 diff --git a/LDL/Doc/ldl_version.tex b/LDL/Doc/ldl_version.tex index fc154fa71d..010dc47b6d 100644 --- a/LDL/Doc/ldl_version.tex +++ b/LDL/Doc/ldl_version.tex @@ -1,2 +1,2 @@ % version of SuiteSparse/LDL -\date{VERSION 3.3.2, Feb XX, 2024} +\date{VERSION 3.3.2, Mar 22, 2024} diff --git a/LDL/Include/ldl.h b/LDL/Include/ldl.h index caf66fd7a0..5df8412a28 100644 --- a/LDL/Include/ldl.h +++ b/LDL/Include/ldl.h @@ -112,7 +112,7 @@ int64_t ldl_l_valid_matrix ( int64_t n, int64_t Ap [ ], int64_t Ai [ ]) ; /* === LDL version ========================================================== */ /* ========================================================================== */ -#define LDL_DATE "Feb XX, 2024" +#define LDL_DATE "Mar 22, 2024" #define LDL_MAIN_VERSION 3 #define LDL_SUB_VERSION 3 #define LDL_SUBSUB_VERSION 2 diff --git a/Mongoose/CMakeLists.txt b/Mongoose/CMakeLists.txt index b03a304d65..a6ba8a3687 100644 --- a/Mongoose/CMakeLists.txt +++ b/Mongoose/CMakeLists.txt @@ -35,8 +35,8 @@ cmake_minimum_required ( VERSION 3.22 ) -set ( Mongoose_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 -set ( Mongoose_NUMERIC_DATE "2024-02-XX" ) +set ( Mongoose_DATE "Mar 22, 2024" ) +set ( Mongoose_NUMERIC_DATE "2024-03-22" ) set ( Mongoose_VERSION_MAJOR 3 CACHE STRING "" FORCE ) set ( Mongoose_VERSION_MINOR 3 CACHE STRING "" FORCE ) set ( Mongoose_VERSION_PATCH 3 CACHE STRING "" FORCE ) diff --git a/Mongoose/Doc/ChangeLog b/Mongoose/Doc/ChangeLog index 77d71ddf23..93c65e8c23 100644 --- a/Mongoose/Doc/ChangeLog +++ b/Mongoose/Doc/ChangeLog @@ -1,4 +1,4 @@ -Feb XX, 2024: version 3.3.3 +Mar 22, 2024: version 3.3.3 * minor updates to build system diff --git a/Mongoose/Doc/title-info.tex b/Mongoose/Doc/title-info.tex index c1d6eebe69..3666b87459 100644 --- a/Mongoose/Doc/title-info.tex +++ b/Mongoose/Doc/title-info.tex @@ -1,3 +1,3 @@ \title{Mongoose User Guide, Version 3.3.3} \author{Scott Kolodziej, Nuri Yeralan, Tim Davis, William W. Hager} -\date{Feb XX, 2024} +\date{Mar 22, 2024} diff --git a/Mongoose/Include/Mongoose.hpp b/Mongoose/Include/Mongoose.hpp index e2b0796c5f..f4c2ba2686 100644 --- a/Mongoose/Include/Mongoose.hpp +++ b/Mongoose/Include/Mongoose.hpp @@ -21,7 +21,7 @@ #define Mongoose_VERSION_MAJOR 3 #define Mongoose_VERSION_MINOR 3 #define Mongoose_VERSION_PATCH 3 -#define Mongoose_DATE "Feb XX, 2024" +#define Mongoose_DATE "Mar 22, 2024" #define Mongoose__VERSION SUITESPARSE__VERCODE(3,3,3) #if !defined (SUITESPARSE__VERSION) || \ diff --git a/Mongoose/codemeta.json b/Mongoose/codemeta.json index a9c795725e..2b66c49d4c 100644 --- a/Mongoose/codemeta.json +++ b/Mongoose/codemeta.json @@ -66,7 +66,7 @@ ], "dateCreated":"2018-04-09", "datePublished":"2018-05-25", - "dateModified":"2024-02-XX", + "dateModified":"2024-03-22", "programmingLanguage": "C++", "programmingLanguage": "MATLAB" } diff --git a/ParU/CMakeLists.txt b/ParU/CMakeLists.txt index 085269c52f..7055750b13 100644 --- a/ParU/CMakeLists.txt +++ b/ParU/CMakeLists.txt @@ -13,7 +13,7 @@ # cmake 3.22 is required to find the BLAS in SuiteSparse_config cmake_minimum_required ( VERSION 3.22 ) -set ( PARU_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 +set ( PARU_DATE "Mar 22, 2024" ) set ( PARU_VERSION_MAJOR 0 CACHE STRING "" FORCE ) set ( PARU_VERSION_MINOR 1 CACHE STRING "" FORCE ) set ( PARU_VERSION_UPDATE 3 CACHE STRING "" FORCE ) diff --git a/ParU/Doc/ChangeLog b/ParU/Doc/ChangeLog index ce30b52b08..26f80c2369 100644 --- a/ParU/Doc/ChangeLog +++ b/ParU/Doc/ChangeLog @@ -1,4 +1,4 @@ -Feb XX, 2024: version 0.1.3 +Mar 22, 2024: version 0.1.3 * minor updates to build system diff --git a/ParU/Doc/paru_user_guide.pdf b/ParU/Doc/paru_user_guide.pdf index ae29ff9a4468c59353ec1d17812a132bfeea968e..062390edd21c301d68007b52bd4896a290494ae6 100644 GIT binary patch delta 5109 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 Qw-meFhF{_N<0u^e2SEqMxc~qF diff --git a/ParU/Doc/paru_version.tex b/ParU/Doc/paru_version.tex index 214d01eba0..4af131c88e 100644 --- a/ParU/Doc/paru_version.tex +++ b/ParU/Doc/paru_version.tex @@ -1,2 +1,2 @@ % version of SuiteSparse/ParU -\date{VERSION 0.1.3, Feb XX, 2024} +\date{VERSION 0.1.3, Mar 22, 2024} diff --git a/ParU/Include/ParU_definitions.h b/ParU/Include/ParU_definitions.h index d221d1d6c0..84293a78e1 100644 --- a/ParU/Include/ParU_definitions.h +++ b/ParU/Include/ParU_definitions.h @@ -25,7 +25,7 @@ typedef enum ParU_Ret #define PARU_MEM_CHUNK (1024*1024) -#define PARU_DATE "Feb XX, 2024" +#define PARU_DATE "Mar 22, 2024" #define PARU_VERSION_MAJOR 0 #define PARU_VERSION_MINOR 1 #define PARU_VERSION_UPDATE 3 diff --git a/RBio/CMakeLists.txt b/RBio/CMakeLists.txt index b036ca903a..83e8617005 100644 --- a/RBio/CMakeLists.txt +++ b/RBio/CMakeLists.txt @@ -11,7 +11,7 @@ cmake_minimum_required ( VERSION 3.22 ) -set ( RBIO_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 +set ( RBIO_DATE "Mar 22, 2024" ) set ( RBIO_VERSION_MAJOR 4 CACHE STRING "" FORCE ) set ( RBIO_VERSION_MINOR 3 CACHE STRING "" FORCE ) set ( RBIO_VERSION_SUB 2 CACHE STRING "" FORCE ) diff --git a/RBio/Demo/RBdemo.out b/RBio/Demo/RBdemo.out index a698dcd0c6..54fc41c7d1 100644 --- a/RBio/Demo/RBdemo.out +++ b/RBio/Demo/RBdemo.out @@ -1,5 +1,5 @@ ( cd build && cmake .. && cmake --build . --config Release -j8 ) --- Building RBio version: v4.3.1 (Jan 10, 2024) +-- Building RBio version: v4.3.2 (Mar 22, 2024) -- Source: /home/faculty/d/davis/dev2/SuiteSparse/RBio -- Build: /home/faculty/d/davis/dev2/SuiteSparse/RBio/build -- Install lib: /home/faculty/d/davis/dev2/SuiteSparse/lib @@ -15,9 +15,9 @@ -- CUDA toolkit inc: /usr/local/cuda/include -- CUDA toolkit lib: /usr/local/cuda/lib64 -- CUDA: enabled --- SuiteSparse_config version: 7.5.0 +-- SuiteSparse_config version: 7.7.0 -- SuiteSparse_config include: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config --- SuiteSparse_config library: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.so.7.5.0 +-- SuiteSparse_config library: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.so.7.7.0 -- SuiteSparse_config static: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.a -- Also compiling the demos in RBio/Demo -- ------------------------------------------------------------------------ @@ -38,7 +38,7 @@ -- compile definitions: -- CUDA architectures: 52;75;80 -- ------------------------------------------------------------------------ --- Configuring done (0.7s) +-- Configuring done (0.6s) -- Generating done (0.0s) -- Build files have been written to: /home/faculty/d/davis/dev2/SuiteSparse/RBio/build gmake[1]: Entering directory '/home/faculty/d/davis/dev2/SuiteSparse/RBio/build' @@ -47,7 +47,7 @@ gmake[1]: Entering directory '/home/faculty/d/davis/dev2/SuiteSparse/RBio/build' [100%] Built target RBdemo gmake[1]: Leaving directory '/home/faculty/d/davis/dev2/SuiteSparse/RBio/build' ( cd build && cmake -DSUITESPARSE_DEMOS=1 .. && cmake --build . --config Release -j8 ) --- Building RBio version: v4.3.1 (Jan 10, 2024) +-- Building RBio version: v4.3.2 (Mar 22, 2024) -- Source: /home/faculty/d/davis/dev2/SuiteSparse/RBio -- Build: /home/faculty/d/davis/dev2/SuiteSparse/RBio/build -- Install lib: /home/faculty/d/davis/dev2/SuiteSparse/lib @@ -63,9 +63,9 @@ gmake[1]: Leaving directory '/home/faculty/d/davis/dev2/SuiteSparse/RBio/build' -- CUDA toolkit inc: /usr/local/cuda/include -- CUDA toolkit lib: /usr/local/cuda/lib64 -- CUDA: enabled --- SuiteSparse_config version: 7.5.0 +-- SuiteSparse_config version: 7.7.0 -- SuiteSparse_config include: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config --- SuiteSparse_config library: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.so.7.5.0 +-- SuiteSparse_config library: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.so.7.7.0 -- SuiteSparse_config static: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.a -- Also compiling the demos in RBio/Demo -- ------------------------------------------------------------------------ @@ -86,16 +86,16 @@ gmake[1]: Leaving directory '/home/faculty/d/davis/dev2/SuiteSparse/RBio/build' -- compile definitions: -- CUDA architectures: 52;75;80 -- ------------------------------------------------------------------------ --- Configuring done (0.7s) +-- Configuring done (0.6s) -- Generating done (0.0s) -- Build files have been written to: /home/faculty/d/davis/dev2/SuiteSparse/RBio/build gmake[1]: Entering directory '/home/faculty/d/davis/dev2/SuiteSparse/RBio/build' -[ 75%] Built target RBio +[ 37%] Built target RBio [ 75%] Built target RBio_static [100%] Built target RBdemo gmake[1]: Leaving directory '/home/faculty/d/davis/dev2/SuiteSparse/RBio/build' ./build/RBdemo < ./RBio/private/west0479.rua -RBio version 4.3.1, date: Jan 10, 2024 +RBio version 4.3.2, date: Mar 22, 2024 =========================================================== title: [1U 8 STAGE COLUMN SECTION, ALL SECTIONS RIGOROUS ( CHEM. ENG. )] diff --git a/RBio/Doc/ChangeLog b/RBio/Doc/ChangeLog index 0cdcc947d9..11c032ed2b 100644 --- a/RBio/Doc/ChangeLog +++ b/RBio/Doc/ChangeLog @@ -1,4 +1,4 @@ -Feb XX, 2024: version 4.3.2 +Mar 22, 2024: version 4.3.2 * minor updates to build system diff --git a/RBio/Include/RBio.h b/RBio/Include/RBio.h index a5ebd40299..d1714633f5 100644 --- a/RBio/Include/RBio.h +++ b/RBio/Include/RBio.h @@ -75,7 +75,7 @@ #define RBIO_VALUE_IOERROR (-94) /* I/O error: numerical values */ #define RBIO_FILE_IOERROR (-95) /* I/O error: cannot read/write the file */ -#define RBIO_DATE "Feb XX, 2024" +#define RBIO_DATE "Mar 22, 2024" #define RBIO_MAIN_VERSION 4 #define RBIO_SUB_VERSION 3 #define RBIO_SUBSUB_VERSION 2 diff --git a/README.md b/README.md index 7e91a14325..0ea96298a0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ SuiteSparse: A Suite of Sparse matrix packages at http://suitesparse.com ----------------------------------------------------------------------------- -Feb XX, 2024, SuiteSparse VERSION 7.7.0 +Mar 22, 2024, SuiteSparse VERSION 7.7.0 SuiteSparse is a set of sparse-matrix-related packages written or co-authored by Tim Davis, available at https://github.com/DrTimothyAldenDavis/SuiteSparse . diff --git a/SPEX/CMakeLists.txt b/SPEX/CMakeLists.txt index a41d1eaf74..b9a3929b9d 100644 --- a/SPEX/CMakeLists.txt +++ b/SPEX/CMakeLists.txt @@ -13,7 +13,7 @@ cmake_minimum_required ( VERSION 3.22 ) -set ( SPEX_DATE "Feb XX, 2024" ) # FIXME for 7.7.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 ) diff --git a/SPEX/Doc/ChangeLog b/SPEX/Doc/ChangeLog index 3ce42a77d0..ee528f91b9 100644 --- a/SPEX/Doc/ChangeLog +++ b/SPEX/Doc/ChangeLog @@ -1,4 +1,4 @@ -Feb XX, 2024: version 3.1.0 FIXME: date +Mar 22, 2024: version 3.1.0 * major update to build system * Added new methods to SPEX.h, available to the end user: diff --git a/SPEX/Doc/SPEX_UserGuide.pdf b/SPEX/Doc/SPEX_UserGuide.pdf index ebb2f30cb27971f5e7cfbf3ad791d0894bf1ca24..fc41510903f608a0d9b3589fdd3078f12222bc9c 100644 GIT binary patch delta 120 zcmbPyR($eV@rD-07N!>F7M3lnPcN|>8W|cG8=FmkbBR?3#@Wt)ne{c7v#YC%k*O)-VnLu|FZ` delta 120 zcmbPyR($eV@rD-07N!>F7M3lnPcN|>7#bTJ8yQT0bBR?3#@Wt)ne{c7vw^9xg|mg3 ptFxJ*lar&HiIcONi;0t^rHi?VrIV$Tg`I*8Atl>w@3Dq)005?cA>aT2 diff --git a/SPEX/Doc/SPEX_version.tex b/SPEX/Doc/SPEX_version.tex index 7120d15bd7..3acbff0d52 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, Feb XX, 2024 +VERSION 3.1.0, Mar 22, 2024 diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index b05e9efd21..79f9ef762b 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -67,7 +67,7 @@ // 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. +// Lorena Mejia Domenzain, Erick Moreno-Centeno and Timothy A. Davis. // All Rights Reserved. // @@ -106,7 +106,7 @@ //------------------------------------------------------------------------------ // Current version of the code -#define SPEX_DATE "Feb XX, 2024" +#define SPEX_DATE "Mar 22, 2024" #define SPEX_VERSION_STRING "3.1.0" #define SPEX_VERSION_MAJOR 3 #define SPEX_VERSION_MINOR 1 @@ -1210,8 +1210,8 @@ SPEX_info SPEX_lu_solve // solves the linear system LD^(-1)U x = b //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// Christopher Lourenco, Lorena Mejia Domenzain, Jinhao Chen, -// Erick Moreno-Centeno, and Timothy A. Davis. +// Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. //------------------------------------------------------------------------------ diff --git a/SPEX/TODO.txt b/SPEX/TODO.txt deleted file mode 100644 index bb6a7a7205..0000000000 --- a/SPEX/TODO.txt +++ /dev/null @@ -1,4 +0,0 @@ - -Erick: check copyright - -FIXME: date diff --git a/SPQR/CMakeLists.txt b/SPQR/CMakeLists.txt index c5ea3a5049..e45e168291 100644 --- a/SPQR/CMakeLists.txt +++ b/SPQR/CMakeLists.txt @@ -13,7 +13,7 @@ # cmake 3.22 is required to find the BLAS in SuiteSparsePolicy.cmake cmake_minimum_required ( VERSION 3.22 ) -set ( SPQR_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 +set ( SPQR_DATE "Mar 22, 2024" ) set ( SPQR_VERSION_MAJOR 4 CACHE STRING "" FORCE ) set ( SPQR_VERSION_MINOR 3 CACHE STRING "" FORCE ) set ( SPQR_VERSION_SUB 3 CACHE STRING "" FORCE ) diff --git a/SPQR/Demo/spqr_demo.out b/SPQR/Demo/spqr_demo.out index e1b435f3c1..c654139e58 100644 --- a/SPQR/Demo/spqr_demo.out +++ b/SPQR/Demo/spqr_demo.out @@ -1,5 +1,5 @@ ( cd build && cmake .. && cmake --build . --config Release -j8 ) --- Building SPQR version: v4.3.1 (Jan 10, 2024) +-- Building SPQR version: v4.3.3 (Mar 22, 2024) -- Source: /home/faculty/d/davis/dev2/SuiteSparse/SPQR -- Build: /home/faculty/d/davis/dev2/SuiteSparse/SPQR/build -- Install lib: /home/faculty/d/davis/dev2/SuiteSparse/lib @@ -15,36 +15,36 @@ -- CUDA toolkit inc: /usr/local/cuda/include -- CUDA toolkit lib: /usr/local/cuda/lib64 -- CUDA: enabled --- SuiteSparse_config version: 7.5.0 +-- SuiteSparse_config version: 7.7.0 -- SuiteSparse_config include: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config --- SuiteSparse_config library: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.so.7.5.0 +-- SuiteSparse_config library: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.so.7.7.0 -- SuiteSparse_config static: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.a --- AMD version: 3.3.1 +-- AMD version: 3.3.2 -- AMD include: /home/faculty/d/davis/dev2/SuiteSparse/AMD/Include --- AMD library: /home/faculty/d/davis/dev2/SuiteSparse/AMD/build/libamd.so.3.3.1 +-- AMD library: /home/faculty/d/davis/dev2/SuiteSparse/AMD/build/libamd.so.3.3.2 -- AMD static: /home/faculty/d/davis/dev2/SuiteSparse/AMD/build/libamd.a --- COLAMD version: 3.3.1 +-- COLAMD version: 3.3.3 -- COLAMD include: /home/faculty/d/davis/dev2/SuiteSparse/COLAMD/Include --- COLAMD library: /home/faculty/d/davis/dev2/SuiteSparse/COLAMD/build/libcolamd.so.3.3.1 +-- COLAMD library: /home/faculty/d/davis/dev2/SuiteSparse/COLAMD/build/libcolamd.so.3.3.3 -- COLAMD static: /home/faculty/d/davis/dev2/SuiteSparse/COLAMD/build/libcolamd.a --- CAMD version: 3.3.1 +-- CAMD version: 3.3.2 -- CAMD include: /home/faculty/d/davis/dev2/SuiteSparse/CAMD/Include --- CAMD library: /home/faculty/d/davis/dev2/SuiteSparse/CAMD/build/libcamd.so.3.3.1 +-- CAMD library: /home/faculty/d/davis/dev2/SuiteSparse/CAMD/build/libcamd.so.3.3.2 -- CAMD static: /home/faculty/d/davis/dev2/SuiteSparse/CAMD/build/libcamd.a --- CCOLAMD version: 3.3.1 +-- CCOLAMD version: 3.3.3 -- CCOLAMD include: /home/faculty/d/davis/dev2/SuiteSparse/CCOLAMD/Include --- CCOLAMD library: /home/faculty/d/davis/dev2/SuiteSparse/CCOLAMD/build/libccolamd.so.3.3.1 +-- CCOLAMD library: /home/faculty/d/davis/dev2/SuiteSparse/CCOLAMD/build/libccolamd.so.3.3.3 -- CCOLAMD static: /home/faculty/d/davis/dev2/SuiteSparse/CCOLAMD/build/libccolamd.a --- CHOLMOD version: 5.1.1 +-- CHOLMOD version: 5.2.1 -- CHOLMOD include: /home/faculty/d/davis/dev2/SuiteSparse/CHOLMOD/Include --- CHOLMOD library: /home/faculty/d/davis/dev2/SuiteSparse/CHOLMOD/build/libcholmod.so.5.1.1 +-- CHOLMOD library: /home/faculty/d/davis/dev2/SuiteSparse/CHOLMOD/build/libcholmod.so.5.2.1 -- CHOLMOD static: /home/faculty/d/davis/dev2/SuiteSparse/CHOLMOD/build/libcholmod.a -- Looking for Intel 32-bit BLAS -- Found Intel10_64lp 32-bit BLAS --- Building SPQR/GPURUNTIME version: v4.3.1 (Jan 10, 2024) --- Building SPQR/GPUQRENGINE version: v4.3.1 (Jan 10, 2024) +-- Building SPQR/GPURUNTIME version: v4.3.3 (Mar 22, 2024) +-- Building SPQR/GPUQRENGINE version: v4.3.3 (Mar 22, 2024) -- Also compiling the demos in GPUQREngine/Demo --- Building SPQR_CUDA version: v4.3.1 (Jan 10, 2024) +-- Building SPQR_CUDA version: v4.3.3 (Mar 22, 2024) -- Source: /home/faculty/d/davis/dev2/SuiteSparse/SPQR -- Build: /home/faculty/d/davis/dev2/SuiteSparse/SPQR/build -- Install lib: /home/faculty/d/davis/dev2/SuiteSparse/lib @@ -91,26 +91,26 @@ -- Generating done (0.1s) -- Build files have been written to: /home/faculty/d/davis/dev2/SuiteSparse/SPQR/build gmake[1]: Entering directory '/home/faculty/d/davis/dev2/SuiteSparse/SPQR/build' -[ 3%] Built target GPURuntime -[ 7%] Built target GPURuntime_static -[ 15%] Built target GPUQREngine -[ 23%] Built target GPUQREngine_static +[ 4%] Built target GPURuntime_static +[ 7%] Built target GPURuntime +[ 15%] Built target GPUQREngine_static +[ 23%] Built target GPUQREngine [ 25%] Built target gpuqrengine_demo -[ 56%] Built target SPQR -[ 86%] Built target SPQR_static +[ 55%] Built target SPQR_static +[ 86%] Built target SPQR [ 87%] Built target qrdemoc [ 88%] Built target qrsimplec -[ 89%] Built target qrdemo -[ 91%] Built target qrdemo_int32 -[ 93%] Built target qrsimple -[ 95%] Built target qrsimplec_int32 -[ 96%] Built target qrdemoc_int32 +[ 90%] Built target qrsimplec_int32 +[ 92%] Built target qrsimple +[ 93%] Built target qrdemo +[ 94%] Built target qrdemoc_int32 +[ 96%] Built target qrdemo_int32 [ 98%] Built target qrdemo_gpu -[ 99%] Built target qrdemo_gpu2 -[100%] Built target qrdemo_gpu3 +[ 99%] Built target qrdemo_gpu3 +[100%] Built target qrdemo_gpu2 gmake[1]: Leaving directory '/home/faculty/d/davis/dev2/SuiteSparse/SPQR/build' ( cd build && cmake -DSUITESPARSE_DEMOS=1 .. && cmake --build . --config Release -j8 ) --- Building SPQR version: v4.3.1 (Jan 10, 2024) +-- Building SPQR version: v4.3.3 (Mar 22, 2024) -- Source: /home/faculty/d/davis/dev2/SuiteSparse/SPQR -- Build: /home/faculty/d/davis/dev2/SuiteSparse/SPQR/build -- Install lib: /home/faculty/d/davis/dev2/SuiteSparse/lib @@ -126,36 +126,36 @@ gmake[1]: Leaving directory '/home/faculty/d/davis/dev2/SuiteSparse/SPQR/build' -- CUDA toolkit inc: /usr/local/cuda/include -- CUDA toolkit lib: /usr/local/cuda/lib64 -- CUDA: enabled --- SuiteSparse_config version: 7.5.0 +-- SuiteSparse_config version: 7.7.0 -- SuiteSparse_config include: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config --- SuiteSparse_config library: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.so.7.5.0 +-- SuiteSparse_config library: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.so.7.7.0 -- SuiteSparse_config static: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.a --- AMD version: 3.3.1 +-- AMD version: 3.3.2 -- AMD include: /home/faculty/d/davis/dev2/SuiteSparse/AMD/Include --- AMD library: /home/faculty/d/davis/dev2/SuiteSparse/AMD/build/libamd.so.3.3.1 +-- AMD library: /home/faculty/d/davis/dev2/SuiteSparse/AMD/build/libamd.so.3.3.2 -- AMD static: /home/faculty/d/davis/dev2/SuiteSparse/AMD/build/libamd.a --- COLAMD version: 3.3.1 +-- COLAMD version: 3.3.3 -- COLAMD include: /home/faculty/d/davis/dev2/SuiteSparse/COLAMD/Include --- COLAMD library: /home/faculty/d/davis/dev2/SuiteSparse/COLAMD/build/libcolamd.so.3.3.1 +-- COLAMD library: /home/faculty/d/davis/dev2/SuiteSparse/COLAMD/build/libcolamd.so.3.3.3 -- COLAMD static: /home/faculty/d/davis/dev2/SuiteSparse/COLAMD/build/libcolamd.a --- CAMD version: 3.3.1 +-- CAMD version: 3.3.2 -- CAMD include: /home/faculty/d/davis/dev2/SuiteSparse/CAMD/Include --- CAMD library: /home/faculty/d/davis/dev2/SuiteSparse/CAMD/build/libcamd.so.3.3.1 +-- CAMD library: /home/faculty/d/davis/dev2/SuiteSparse/CAMD/build/libcamd.so.3.3.2 -- CAMD static: /home/faculty/d/davis/dev2/SuiteSparse/CAMD/build/libcamd.a --- CCOLAMD version: 3.3.1 +-- CCOLAMD version: 3.3.3 -- CCOLAMD include: /home/faculty/d/davis/dev2/SuiteSparse/CCOLAMD/Include --- CCOLAMD library: /home/faculty/d/davis/dev2/SuiteSparse/CCOLAMD/build/libccolamd.so.3.3.1 +-- CCOLAMD library: /home/faculty/d/davis/dev2/SuiteSparse/CCOLAMD/build/libccolamd.so.3.3.3 -- CCOLAMD static: /home/faculty/d/davis/dev2/SuiteSparse/CCOLAMD/build/libccolamd.a --- CHOLMOD version: 5.1.1 +-- CHOLMOD version: 5.2.1 -- CHOLMOD include: /home/faculty/d/davis/dev2/SuiteSparse/CHOLMOD/Include --- CHOLMOD library: /home/faculty/d/davis/dev2/SuiteSparse/CHOLMOD/build/libcholmod.so.5.1.1 +-- CHOLMOD library: /home/faculty/d/davis/dev2/SuiteSparse/CHOLMOD/build/libcholmod.so.5.2.1 -- CHOLMOD static: /home/faculty/d/davis/dev2/SuiteSparse/CHOLMOD/build/libcholmod.a -- Looking for Intel 32-bit BLAS -- Found Intel10_64lp 32-bit BLAS --- Building SPQR/GPURUNTIME version: v4.3.1 (Jan 10, 2024) --- Building SPQR/GPUQRENGINE version: v4.3.1 (Jan 10, 2024) +-- Building SPQR/GPURUNTIME version: v4.3.3 (Mar 22, 2024) +-- Building SPQR/GPUQRENGINE version: v4.3.3 (Mar 22, 2024) -- Also compiling the demos in GPUQREngine/Demo --- Building SPQR_CUDA version: v4.3.1 (Jan 10, 2024) +-- Building SPQR_CUDA version: v4.3.3 (Mar 22, 2024) -- Source: /home/faculty/d/davis/dev2/SuiteSparse/SPQR -- Build: /home/faculty/d/davis/dev2/SuiteSparse/SPQR/build -- Install lib: /home/faculty/d/davis/dev2/SuiteSparse/lib @@ -209,14 +209,14 @@ gmake[1]: Entering directory '/home/faculty/d/davis/dev2/SuiteSparse/SPQR/build' [ 25%] Built target gpuqrengine_demo [ 56%] Built target SPQR [ 86%] Built target SPQR_static -[ 87%] Built target qrdemoc_int32 -[ 88%] Built target qrdemoc -[ 90%] Built target qrsimple -[ 91%] Built target qrsimplec +[ 87%] Built target qrdemoc +[ 88%] Built target qrsimplec +[ 89%] Built target qrdemo +[ 91%] Built target qrsimple [ 93%] Built target qrsimplec_int32 -[ 96%] Built target qrdemo_int32 -[ 96%] Built target qrdemo -[ 98%] Built target qrdemo_gpu +[ 95%] Built target qrdemo_gpu +[ 98%] Built target qrdemo_int32 +[ 98%] Built target qrdemoc_int32 [ 99%] Built target qrdemo_gpu2 [100%] Built target qrdemo_gpu3 gmake[1]: Leaving directory '/home/faculty/d/davis/dev2/SuiteSparse/SPQR/build' @@ -438,7 +438,7 @@ Matrix 841-by-841 nnz: 4089 residual: 1.8e-16 rank: 841 ./build/qrdemoc < Matrix/lp_e226_transposed.mtx Matrix 472-by-223 nnz: 2768 residual: 9.2e+00 rank: 223 ( cd build && cmake -DSUITESPARSE_DEMOS=1 .. && cmake --build . --config Release -j8 ) --- Building SPQR version: v4.3.1 (Jan 10, 2024) +-- Building SPQR version: v4.3.3 (Mar 22, 2024) -- Source: /home/faculty/d/davis/dev2/SuiteSparse/SPQR -- Build: /home/faculty/d/davis/dev2/SuiteSparse/SPQR/build -- Install lib: /home/faculty/d/davis/dev2/SuiteSparse/lib @@ -454,36 +454,36 @@ Matrix 472-by-223 nnz: 2768 residual: 9.2e+00 rank: 223 -- CUDA toolkit inc: /usr/local/cuda/include -- CUDA toolkit lib: /usr/local/cuda/lib64 -- CUDA: enabled --- SuiteSparse_config version: 7.5.0 +-- SuiteSparse_config version: 7.7.0 -- SuiteSparse_config include: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config --- SuiteSparse_config library: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.so.7.5.0 +-- SuiteSparse_config library: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.so.7.7.0 -- SuiteSparse_config static: /home/faculty/d/davis/dev2/SuiteSparse/SuiteSparse_config/build/libsuitesparseconfig.a --- AMD version: 3.3.1 +-- AMD version: 3.3.2 -- AMD include: /home/faculty/d/davis/dev2/SuiteSparse/AMD/Include --- AMD library: /home/faculty/d/davis/dev2/SuiteSparse/AMD/build/libamd.so.3.3.1 +-- AMD library: /home/faculty/d/davis/dev2/SuiteSparse/AMD/build/libamd.so.3.3.2 -- AMD static: /home/faculty/d/davis/dev2/SuiteSparse/AMD/build/libamd.a --- COLAMD version: 3.3.1 +-- COLAMD version: 3.3.3 -- COLAMD include: /home/faculty/d/davis/dev2/SuiteSparse/COLAMD/Include --- COLAMD library: /home/faculty/d/davis/dev2/SuiteSparse/COLAMD/build/libcolamd.so.3.3.1 +-- COLAMD library: /home/faculty/d/davis/dev2/SuiteSparse/COLAMD/build/libcolamd.so.3.3.3 -- COLAMD static: /home/faculty/d/davis/dev2/SuiteSparse/COLAMD/build/libcolamd.a --- CAMD version: 3.3.1 +-- CAMD version: 3.3.2 -- CAMD include: /home/faculty/d/davis/dev2/SuiteSparse/CAMD/Include --- CAMD library: /home/faculty/d/davis/dev2/SuiteSparse/CAMD/build/libcamd.so.3.3.1 +-- CAMD library: /home/faculty/d/davis/dev2/SuiteSparse/CAMD/build/libcamd.so.3.3.2 -- CAMD static: /home/faculty/d/davis/dev2/SuiteSparse/CAMD/build/libcamd.a --- CCOLAMD version: 3.3.1 +-- CCOLAMD version: 3.3.3 -- CCOLAMD include: /home/faculty/d/davis/dev2/SuiteSparse/CCOLAMD/Include --- CCOLAMD library: /home/faculty/d/davis/dev2/SuiteSparse/CCOLAMD/build/libccolamd.so.3.3.1 +-- CCOLAMD library: /home/faculty/d/davis/dev2/SuiteSparse/CCOLAMD/build/libccolamd.so.3.3.3 -- CCOLAMD static: /home/faculty/d/davis/dev2/SuiteSparse/CCOLAMD/build/libccolamd.a --- CHOLMOD version: 5.1.1 +-- CHOLMOD version: 5.2.1 -- CHOLMOD include: /home/faculty/d/davis/dev2/SuiteSparse/CHOLMOD/Include --- CHOLMOD library: /home/faculty/d/davis/dev2/SuiteSparse/CHOLMOD/build/libcholmod.so.5.1.1 +-- CHOLMOD library: /home/faculty/d/davis/dev2/SuiteSparse/CHOLMOD/build/libcholmod.so.5.2.1 -- CHOLMOD static: /home/faculty/d/davis/dev2/SuiteSparse/CHOLMOD/build/libcholmod.a -- Looking for Intel 32-bit BLAS -- Found Intel10_64lp 32-bit BLAS --- Building SPQR/GPURUNTIME version: v4.3.1 (Jan 10, 2024) --- Building SPQR/GPUQRENGINE version: v4.3.1 (Jan 10, 2024) +-- Building SPQR/GPURUNTIME version: v4.3.3 (Mar 22, 2024) +-- Building SPQR/GPUQRENGINE version: v4.3.3 (Mar 22, 2024) -- Also compiling the demos in GPUQREngine/Demo --- Building SPQR_CUDA version: v4.3.1 (Jan 10, 2024) +-- Building SPQR_CUDA version: v4.3.3 (Mar 22, 2024) -- Source: /home/faculty/d/davis/dev2/SuiteSparse/SPQR -- Build: /home/faculty/d/davis/dev2/SuiteSparse/SPQR/build -- Install lib: /home/faculty/d/davis/dev2/SuiteSparse/lib @@ -530,23 +530,23 @@ Matrix 472-by-223 nnz: 2768 residual: 9.2e+00 rank: 223 -- Generating done (0.1s) -- Build files have been written to: /home/faculty/d/davis/dev2/SuiteSparse/SPQR/build gmake[1]: Entering directory '/home/faculty/d/davis/dev2/SuiteSparse/SPQR/build' -[ 3%] Built target GPURuntime -[ 7%] Built target GPURuntime_static -[ 15%] Built target GPUQREngine -[ 23%] Built target GPUQREngine_static +[ 4%] Built target GPURuntime_static +[ 7%] Built target GPURuntime +[ 15%] Built target GPUQREngine_static +[ 23%] Built target GPUQREngine [ 25%] Built target gpuqrengine_demo -[ 56%] Built target SPQR -[ 86%] Built target SPQR_static +[ 55%] Built target SPQR_static +[ 86%] Built target SPQR [ 87%] Built target qrsimplec [ 89%] Built target qrsimplec_int32 -[ 90%] Built target qrdemoc_int32 -[ 92%] Built target qrdemo_int32 -[ 94%] Built target qrsimple -[ 95%] Built target qrdemoc -[ 96%] Built target qrdemo -[ 98%] Built target qrdemo_gpu -[ 99%] Built target qrdemo_gpu3 -[100%] Built target qrdemo_gpu2 +[ 90%] Built target qrdemoc +[ 91%] Built target qrdemo +[ 93%] Built target qrsimple +[ 95%] Built target qrdemo_int32 +[ 97%] Built target qrdemo_gpu +[ 98%] Built target qrdemoc_int32 +[ 99%] Built target qrdemo_gpu2 +[100%] Built target qrdemo_gpu3 gmake[1]: Leaving directory '/home/faculty/d/davis/dev2/SuiteSparse/SPQR/build' ./build/qrdemo_int32 < Matrix/a00.mtx Matrix 0-by-0 nnz: 0 diff --git a/SPQR/Doc/ChangeLog b/SPQR/Doc/ChangeLog index 30b1cebf58..12d53217d8 100644 --- a/SPQR/Doc/ChangeLog +++ b/SPQR/Doc/ChangeLog @@ -1,4 +1,4 @@ -Feb XX, 2024: version 4.3.3 +Mar 22, 2024: version 4.3.3 * minor updates to build system diff --git a/SPQR/Doc/spqr_user_guide.pdf b/SPQR/Doc/spqr_user_guide.pdf index 03cf4c5aacc60e816a2630011952b57b450c41f5..4a7ae601bebbf71892b4ea0fba8d36f3161e2547 100644 GIT binary patch delta 4609 zcmV+c68`Pijtb0<3Xmp~@DM3~jaXT8jlS@8gO_(_AAVMervi~AD)#O+o|G_FxtGM5 z$dbsrE4_RFt2O|z-P%Kv4oO2flV*YjXKR)bmZ7Sh*1k-mkI`Eq-I!K<1-%|a#q zSP#{v?^+xWx?Vio{pu}MD6%MmZzS>{;Uj16;i)&eG$jkMJKbA%{Fht&N`Iq^q3f&v z=mF2JKsb?ixbg&F!k;&=cln?H91Bd|C*xH+~&WNHgwdpl3 zf)I%Uz;~%9BN0Z4Lfhou4+0sP^JDGhysmPg1?_N5`R>dWrcy4 zi#&mFP#B~LGUdfWO&fh=XycPS}t^cF4RyR&&RW7gf^HT{CM&CiqBp9kvk!9|G^uPafyT1C{@5~P> ziqOgVP4`Sx%4w(q6*;Rz2m^Q@y|wX@Tx5`Z%QzK*bpBgC+M$OKJASp#zmy3al!6|C zP%7gME*mjXFhwGj``}~x>ekJhU2PiEVgLq;Dbu?Re}^Z-g9hF6p0pVyEv-zM7=?j9 z9rK=vD3NkoCL)A?YqXT1h@;%)wi%wf#S)~IkP4AZ{TmdmAvU$CD+?}HaX?C|7;e(* zuI|93lBbXGNqtNynpQ1ylgdcAyk4z&q}!6$bkTR#Nh_;wfecM=*c>JvScf|rJ@i#! zC^a$3_SGM4)owxWEby;*m#GmQkZ?!0bzZ+5t9ox%v(*KEZhE$m3o+QPdC@-U-jvJ6 zG+qD3q+Q=_d)+j%fW~>v)I3K3I-%gq)*}>zF-9@PC;}{11%d?Z1Ha;80&XXLp1{M! zF!sh`OaL>k2HsrgmKnRpL03+qW|AEtIW;?>BFuob4Q4CD5boMAmEwa07<9cEs=~pa zQ$A+hcci+1(a*@7PSYMNZ8Y3!q-IWL%37qec~t>|nN)PmZX8Tcwxkdix066ILr_c{ zC;|}^4L7~?)i9XW5nCpHIzMLu!6uPLCTwT=|!j-AIFMs*l*vwA#G#WWI%e`#H<};EEGE+HuD|?RvOT!huTc z$y6vAM+7P=7b=MX#Q~2)R{|xZjZ`sad?@{)hZKWvITq7ZXJnQlkK+lMRU%a8_EQ8R z^m@Goh!~z4%b@{hmb`)v_-$e>=?K3VC*0;OlZ1)Oz$FEBYl6!Z z^O)|=jL64kwp@|;dMZ=_ZggGa1`yLSk$i=JY-Ar&=n7(8+%GnQ+lmx!bAEWt`i9#f z*zu{`Q8Un2+b3rSlCd)>sIzbtGRUB+si}ry7XkY0H4>@6I_e|PWq>rRy5@!3=>+TM z#$qhdTb%jF&RE}k#?^l=ui+lG)-10|S0=D%M5h0UCnWwapvlekQiv$l4 zcTXU(;n~U?B|eS#h*D0#1|cOS15MByP|d1rQu%c(zstZkv#v~xy||b ze_Aw`YAdXDe>fYCaWFVUK;;ndE0_O&FpZBpEhJG~;R|q|M+EnO6dYBO!NUPNc!)4U zyu}-yfN-P-k_a_`=SQWPfb~a`LV^ibgJZF8t`B^5Tic=@OXF6} zj|ElWH=b^c#wLL|0R&DY8bcpgk4LIKAB4%i4^nt5ggI=cP2c-dev zmQWrEw~(Vb+L?#0=>wwCeO+OK;pAR|Q`N(Tdm7cFb=+lHP46A#bLP3#wi}qtsZH5i z)%vk^23D@g%>xm|;h`7ajYoe++)t@Ua%5nxYuhnJGod%T8XAWNFZhh`k(#=^WBSmbGZXtsT`1MC<4Fu20oAl2+0m@_Oa?-i z&D;k{e$C3@l_%KUI>9oSh}7DF2#O>U#uhq+rXwJckw5Oxmb0Jk&c2_2NpMi$NiS7i z4jm9Y>x$;={vq&6AVZdmFweXfVro2@r9$Q@jB9Uw_T}sneoDwyL2jeI{rHwEgQA z*#%eyKF=a(49eDu^ueAPdB)3!*|Pf)t(*sbM5?6;3U$OO5{m z-B!LPvseg>S^+YX@DM4J4r4ceCA*?$XP%j7c4wASB*~GHk~$sJaM=j3uB#!5PZ}gun-&_pcfA42)jmMgmDA; zgy1KRuL}bu5lji!m6Q;F3UC9~j6p07qzznAaL-s3TQZH4JW0%#A&W40$SF{5IQ9zu znxGQ=W|CMh=rjH8H>OAKo{I?#-pb!(w0aBcQZ3)?<5JJc16f(+j z>=iQ5SqTw;U zn&qRWs7j$;(|6wuUj0xubv2&1&t7j7*7w3c&5H7d&gVswpWkKmEdSRT6(xN*xOjhX z_{{40)fWYi_GV3gHkmxtb6wRmpXGh}R#ZMH{jvHVEvorH>YVC48!xD-XjDz_ib+nt zzN$*f$^}(-d7U+Ec(#}|`SjP1@)^OETlfn59I7P@MG0kp*V!oF%%ORa!z09KOh?~* z^CBYi42_K9Xo!_GDX!|QUi4__!g{}?^Q>n{2b~w3FUltS+#}zG?Kp3;VuGk$FM-^s zpj+LoeS7*7Wus9(X_Mxqz2WW`oaO(W7j-_(OYqCFJop6T*;O$qnx`T8h{H+J84XX0 z=91UHc{3P)UM%i%8lGl1`Cxcdfl*e4g9(Cz;aNVb=Jg0kfTN&&@*y7=* zp}ELh4xpgMO0I#e*g;uV(DM-|MQakJr5$uTTn<)@x59(r`TVMBzrQcaKL*3YsvhTc zYeroTzaRcEJi-^~xnx|UhCbS81s`2TC6V|@OiCnwoaaU-;WeW=p!EQbkb>ek`&7(i z%-SIC1&UEpM9-z$3CoD02z=-(Cr})FkzDN)i5J#6E(C(>kC8$-?ni=%<^?2gi^)}9 zHyY5K-hNHCk*v+{`d&qnguOJ`hjPGIY*g!W&A7viqaI@VE9Ess+U5(Cj zL>W8g_=JWR`R8Umo7c8dRO?$Qq_5dZkHLttH~K3g=nY*G`kCmji8;=ZxG}2Bk$g5v zyGF*XM<$vbBV+p`W4Fr7H8CHo2wL@uSsXxru~*FDyozX7d&JQ73h&G&K9)IH;bu8& z(bzwi<+uSP^;bAcPYOfQyK$CGFJ~(v*!|uMgUYlaE|0#g#^U+>-PQm2#DBk||DoUi zu$mVkAj@K(n6gTs5^lAfw@8`495N-%dd&EKwNp327o|Nm5V*1lz7ZLRc8~9^S_%h$ zigCk3If|Q${pYyd`^EMc4q?PQv$ckdZpIWo^RCsL0HXbtAlV`$Z->vg6fsiK?}ag_R1MFbGBbj zMJL?)!StLQS~C~@#)Exn2lf-YE1Bw(w`dN3gL#nDE9Ow4jqO+G4EkT+D`tZeK5QXp z&}FAyG2@ev!S84LE}zT0vTwo@_Kn+>edGJtUy%U~IAM+4Y6~nEp}%iC*e6Y>vgWG- zvQ(Y)y|esY?S72icz^rgmumN;>PFp-rW-E`5bgle8IbcNHaVm&^ zfL_$cgesUeSHGj%ylgM7-y@jyS@wH2&B|i*M>dsde-~M&t&r9~!ov;@psN?&BeZ?O z(aN^Hg7+v2&htC#wpZ{tF>t}&4Ci2)&zfq{qB@>mUnjpuP}&QA!TbdjUmcjjuLUK| z9^XJ{1EL;58KV%XEkLzsy7v(8v$~i?R(1a4jg-G-lbdRf_)yj(PL415&|~?yJG?z2 zvk{2+-mV1y1mU&d_v_wE5#$T+ZpP#B?YC*4KyWnhFAg4M&Uwc_lamT+8UjZ&lO}2) zMV%x>9G8l$RKoBtDG}s_7cLEFc~L_5Oolzi2baBo%bv4I#6-&R>qlU7I3wc=8S^fy z7k9<%-F%wWDdrD={scDb98H6YYKMwy0k?{30^|rUGcqwUF)%YTG%YYSConK4DGD!5 zZ)8MabY&nYL^?7sGBhwVGBGkSFf%hWEig5=opS;N5l}coIW{*iGe$NuLozisF+w>o zL@_r;GB!6kGBz?dFg_qWFgQawHa9RcMm94;GBq|aLOC!*F*imsHa9skHZnIbK3xhg zOl59obZ8(oGccF&gaRvnS$0i97={18bRik%%U^h$ivIi)0xA zreG~Emi=IvfH8RY#sCzq1OwRc5C{3{V9GM2vv>PQ2cLnSESDBdh; z9as;#@ou0tfQ_IBZw9pqG=YA+>!{6O3mC?`hH3^|!AZQUs1~q)4V=Ndf@%eAU;^(l zYCG5gCh?|GJHak+2@jNZup7+dT}15x9pFCR6si;K<&j!-~c!Xj%7rv zPwfym%x9;;IH-a#a0+;XX92UQ2H3th5_#b#KsBRj$&(%jBcL~%!A!>VCx78uxGyf!O>hg`26wp$1 zBja_aA6*)%BC4WF#!9mXsEVkHD2QATUohXOMtxR(`#qADZrHWGdJSMY7AwS^(T`&6ZB<(VYqlsD_K zJex^*`~Z`X%r!3>f*jlV`t${)Wvx<`ClQTCqx*E@prP}dlXpL<#8ZJt5*2$l8&693 zR=JnNnaGmJyD7a}|FbpyKkQ-|2Fm|=tV+Y5o37`N^;ivNy<13MgGBlkzRah8>ocC! z{L?H{;*a%EZThao??Km#yPIFUr3ytBMerMmJVaz=? zC`@g7jgw$Rq5;4z^<*T%C{c)i-BQ9JQPNw6v50cX25+jSgAG;czkn(5XeIdfqekKP z%CfC6@N$tSkPb?N6hWrESf~k+e;(U1@RoZjXKZ+F+QMLJ!2GXcU$OM}MW%d+pw{gf z&#iU)Kky-A$5Q`Vw}4jcYd8N}Wvyc@u?GK|`&Z1_K9icWggHRD|z}yClm6-@vZCFa_ zK>>Vpy&0;)G2nrJ^E>k0=ttB}r(qAFHX2SgN;79PWjE3}zN!GrEGoKYHx8z!U{c77 zTS>&2Au%S77(s}IhKrv1Y8XuGge?m{oSw3PsFOq^TnWc~uUt9wa1IPsM3nPAfgk@~ zEwa$Rxm=x}vEYOIr79)C=_$CI=E^^(>P8uqQ+=R@q1EPpnFsSJ+^<>I2PlsCXvZC6 z+Vyavgd>&Mlc`WLj)+uL4*V7alLIG*?i!R(H&Vq|@}cyH9%>AJ%dwb_Iwlh$Xh$cqw=z?0%+V6OB%oAGT;!|nrKahqK z4jl_eOa=*vjzD6&&A^Jv1%XoHHc;DEyhZE8EsJlHJ7UHRaGO+1+QKi!iMM&lWMR@W za7w}5n&>jcI;OKTGx8LsyEf^Zs>Gd7g)YF6u4`O>0A^Yi5>}{2@u7r{Al{ApmyO`o zA_cC@-)^(M;+6`n^mE@-HNAcI>?P4_5v65!8XGm-kMgI)q5 z1FBioHBVemJ6Jb17ITScapfO^vA+6Qwe~X+tMF}4hYBnHnbSae(VGqn&F*(tH19e!TuYrA z_Y3>QhGE(WJ! zUtAyf?3T7gJ(kAJn(qs`fnRvIF&euB)&vqbQfN$l5It_G_Am&OeGF1~FN8TPrbXX> z`eQgrexwBR{YrM7N0wL~1=mocImVfXuIU4z(S2QEf#Kj*0;uZl%sr3l(K_w2tfn^) z>bdaTY}*Yi=F+C>t!jN=y8tWK-2u zFu8>$)AD@f^k17mfM)IkCBJB8@XP~jZ=GQoOhRhyzyxIy1!D^xLemkE$jBdmcNojb zk2fdZP9y*nc+yLim*+wPghg|5dlz^mh@r|wm}lM-DK(zVQX%sczH4uN^6BIp|4s;{ zmjEPThM;Hg4u+RcE=8P0Z=SL6hI@VO0(J@T9b`zl$}tTT8Qe4}`1cVb2F9hXeIS;8 zS=DeWeI#lHw*A)@)dfTam}e1xbn-;y!|wgNcTZ1G!Xh_to4BV$4=!i{At%^}@mZ$d zff^3{dSac&y^(QECDL>rV#Q;TCC6GzY?VWJthpz47*T?_4+p~6^FIxswJs{-n)?V} z%#q(g#gWPxYfP6R%y04W;;P2-Y@h+ zObsKECgIfby3+U)y0yO#vrh<&S^_aRldfthlLlipf7`p1XJ((7XLe_nQY6Wdk>trb zN)#L^iJw5qkg^)Tq#~XIX^kP0j*heLGH&1* zHU4--e@dl<1>gbJ^Ki&UJbO}3TY^{48-godVqrXbn2gX401-8Ns|E^Il4KQ(j4WY{ zKw(KsED_`Gmz1$JfPy0(K)?pYcx>e?XFiZ^jx>fsye_kYH76$uv&#Br#uz zF{HeOGN?A5eTTm$fKjEGB(@9sO_V%=-DunBV$ur3UJ5(`Ymx)3K{l_akQi23o@h)U zY(b@F!-#~{;7Y+;s}oNgfFKnVlE#{ViNVD33i#AIq$2XjdgcQDTaPDYq0IqOoNdWl ze;7tiv2}%vavXbw40M*6Lk>FU5gWrvqj`cPitSQ{yliDGQpRzzaLzC;`0A~dgEwzz zcuvE&)kQ_aV|q2qM@>VLGT=KrX3s`G5T zpr)cxHN7h)IsN*oDk&=$RNduu*6_l!#jMGvzrOB4+&O(RFWXOMbXQlOig7+>^UZDE z;bhcxk12C+>HteV#&BmoZC_LC3! zxX2Ex&-76eR}9TX=5hc7H8i;fwqgfmS;5XnoD}VnIQQE@x5MRNW${*cFg%}MHSP2J zqWohpJgn+*UboAr%i;IKABIPGfSpUmHEQUijaKl{WmFQu^P#3h3OIaqe-hRk$Q{sn z07pncah!cBW-?}N5cdMbC@G@n((MEeN~59(eCR7Dqzb)AuJ(z<3+woF4kAS$GE%hV z)&}82+zjPyF}cd?=0k<-J0IQFd4b1eTuTY`pPzq0#{sqjmGjBua+3(M1Ke;;>Jc;E zi--c%BZlro7!=DDu@hu%f9ui-3Y!mIilesq*v+{|dq{m$uOJ`hjPGIYc!6$?M#?M#lC>#%`6DYhpfF5wz+Rv#H%|e?4Lj2UbMC+9QUx zS9omM4SXzfu)@u9)}r5iF3ZthCiPc1OHV38(z|h%OfP3EBG~;nB+z_sip!&KtFd@K ze|PmiKJnl0=zr+M5COe`hk)7G$chRpnim!}1`h zSInV88{2Qrp&wok{WD@VIJC)I$QiWRsaMSSBxLaW*}lu?@~-Tg@PvKic4goAe)d;n zKm$%#Be&WD%SGt#+Ya_g6RNEFs(>t2Cw=cMzgW8;V>jO4KKQNL{iwQ8ccbY>+l`&P z?c{AIZ})nCe|8dGE5A?<7*The3L>Bv^)aCerp?vw=r%9go9p)oW__0Zo=vl|82yn= zW!m3O)@duG^^fqdg9GU5h4%<;pK!FYZLi=xih}d}(z@*xJWdQ;us6dwnC7#lTC}K+ z=hxTC?-7*7y_sLXK7it@15^05prqO3D+p~s)FUWke-t9M1*jHH_a5SXRu|K%&VRg- z^0#bqQ|%ES%6i1f@dY1xEFX7=w?||)0ukTamEi9nyapovsz-_-UwDl)9*=LoP5T6b zqd_~w1ZB>7{xT&9?&H1nLVL9t$@_!TgQIu*1ELagDMWG@`CB3_gRp4bywoCT`@-w2 zs;T~+lP_uyM4}`_9G8l$RKoCADG}to^oH#$FG|>+$*{-x;IbER*>g6Dm`FLKG)Cue zM#dL1=3Q1V?uyyF`82Cj%pU;#2@XLVMT3KChl6SXw}WZ|WJFerP((E~L^MM=K}Ik| zLpe4wH$^ZrLqF)=YQJ|H|WL^U-;G($N-MleM~IW{skMKCi%MnW=1I5t5s zF)=YdT?#KuWo~D5XdpE+G?OuKDSsuC$#P9m7={0T>!OK72th&+5t5tcCPZ_IOLWmh zlSB|*OjJga@&?SjfPujpDOE}tcnx!90)LL6^iWmF4j1*h>Yp|*iGFo8FT+75Pri+G^4gPmX+?*eKU=m2wgb<}RKhevj)^E~ba zouCWs1N%WYIGhnJKD7hjAfKHChWXY<;??t`GJl%UIqR4CdEu93Jfm;U9_uS-fj3yo7^`~V9J4qwr&Z6W zee!@0%%|&PcODLk1m&sjfvJqikN(27a9>=cTi`ah1MY$c;30Sf7Qkch1Uv=Lz;kdP z%w$ZjPCpA4!3$P^C(0@pX+C5AojtlM$|@=kj5AQ%}W9tSFkqkjb; zDXTTpzA1Kfw?#rva2n{JD<0qF2)r*^q_pt0PE}+xm{^sCDIb2(?*WA3puT zG-73yC3=Z>l{XADMs6^H37KshFMl$X#UNVXI*OG^Lf|@6NhS|JziqoFUv-S0POyC) zXDUT0fmV_ro@gMosDYF;VB*LF(a@OV5PPlbcwOHypsD+=sFvDuOJ93}d{;L-Y3uU7 zs5Xq+BU+1SPcYfxWaqjDG|adpC!Uu@fW578>a7`&S29_H*owxjP;woEMxnv{@+*&bp!2#Z z{+D+}U4fy8Ci6ZBKB*JNhkvGk$5g~YaQt@ArXPmjh<{vvc>Uq}6Rr~P;*6mW1$Y9@ zavrYEk%^nj^S6vxFgLD&XE?Y$Nz+ry!h?+~3)k|zmODvqNad2u=^pW2>091?o405z zIK4dB9N5W}3o+*Na^r3rwAwWEuKU}4Q*WAlN9jt3Ad!6|%W zAdDol;oyvEUDSJAKYumFW=mAXqp~SIP4w*GGv5q|@$^=0Q~*I%kW3InK14Sw7ahlJ z08q?^ag4ra%;b4l^2V3pNiA=DaUdEtp|z3#4-DE=Q-B|&d;R$x;{4mcELLa|{s*uO zqEmbebm*ElXmXMF+viIkUi|k_LqH;w0DkQpzd;fJXmZQ}Xn&(UdT!@vzF(rv(v-6T z9UOH$DsNSjg{@^tQGhV}f#EfWiB-Ro2aCs(s6)Nbp|W9YB;u>gCJ?P4?PQ{1ux+hP zAR0GuYAU@^0>J>~~G#DV_! z;E)M$?*8hD!+%LGm^{;l8tloQCWEQTWy%_RnhlO@7c!zbNe2@QkYqAR2OwhaVau`f z5L-cElLOC}Ev!HZ+NfllaJH$rwT%K~5d>3%Ey|1rUH7Zw;vd=Mv!N z*iE4VurIzaRNw{!#wxFv4H z!}KK!_kY6}F0#k+9|9EQ?YyIB+tFt+`Gpv9N0sw7i4fu)l`Kxu6pI4$6^kA4ZaJCq zVyIt+s6B+P>0?fVkmg#|>X?EM47Ytzc0QIfxG52cw+7&}ctN=6gUnkD2cR61VFGdM z0pWQgSZtGcSI&vOE%SEEpnA`mZgSuTWIzRcKz~O#7tOGRH*xe%j-7Psf@MGNrB;t& zNtmUYL~}?mv4QuOWsUEAkfPj5eQ&tFhk(4Tn~ot;H8fI-_A7K6-a=zV?5|jaQQ-s& zDMWCen*+&Z2)HaifW!Kbja6{vRQZ(`Z&IYnRnr@^0LftOI$~RPzZ$r8r(-l zEPo3q1e+&btRQ_9ZP)S&Z^yIN@EUoTk_FHqb0H!JUOZXJeo?K;ek}_u7)qyptl%56 zA4%6#-1u&+q~HcUK8Z_V08AgCF^CDA>U0?I>b~J4_e-isTTYRFm7$ z;xHIa5* z#w-Bxl zkxU&m5l5Yql}(_?KM1Vf-R<+$cYn2=ky;e1(2R=Y#<3M1hBPlFT&g0SJQoAKXFc|4 zH0IT$<&pkPdRNYl-8SzS48ck=>TK|&@N--?(tiWxalqTvROpxtT8u6)O75ousNLNg z5zMhk2C*_GJ(N69ub>Y^5X8%VSMhq^EFnNRzov2RDE(LHC|Ko3kYPI7fqxPLhs_g1 zxg&@|$+ZCKr#~lrf`3nNbB7K39TBRlP8=7yJF9g3tZd}(6nx8!1}&K9p-(;IzmaK! zX;NtE6;>xHG@t@tF<&wC26Il6lf8u|_O9}7E7R-xuA^+rHG>oSWTZ9z_9TgC13|88 z1{lGDemIoreor`&r{l=iS$}kP_!pYdlTAVK>ETlh|5M8i6ja@IH<)9f67$R}Q){r% zjU|!7OWGjKL-3x)8*8T%~+u;K?T{9^<41lLq?UqH$|pQ4oeRW0gEt;+rg1Hi&=H)}gS1 zN#+LX+(#F}ul^4`lC@=*;XwivgMtdTf(ii- zo)I-S3NK7$ZfA68G9WQBIW{?;B|vb3JkB}a{c`U8|El+jDwx&Xd-dwx-Fu)QQB+|NHnlef zO4!?h7+4sYc>$tw$}Fq^W@a`1o#7}% z?HxRvEX^%I?`i($BY@h32Ef9@!$tr1ae%Nb(8i=8RZ3GkjApduv;P;da+{Sz$vPXImO zKfM94FtYrY?mwshBC@pm`>>ITiM_3Zk)4O7ojJhF(gp}nkdS2rxr68dMs}uu1sd6Z zINQIUH*z(yv@tS%5BOWT5kNv%31IYI;D5?J2K+CU|F;?czk(!OY;68^Q~&M%|8X1HTH1L0C*XZ%T|n>i zFK7S01$O^8R0H_W&dLEzEnRGX|F2gHWc0oV!gl61|81kCvxKEP&{WY9WMc8pu>50J z`)kQ;EbV}b_Rf}ny($0(7G~!E<9pvM6YKYv!})z8|8@c27w3Pc6t^?6H~nkFSUETW zMovyf9&pU>gT%_g0q|mZUqw@(``XrR{srILX8AApF2Lqr@LiqlAIS2a+3sKPJ+uA4;CpI^ zKf>R8;PAc{_WzQ~@}B!&%2?iWJO5Gs?sR^CDgI0F-Zp0&Bj2GGZ}s1A z$@>`p5B~d$0SI&ln!qhD*qeL`wyF>Ae5e)1cVpO};Gd<~*GQvb@LG22a(P06Nv5gE z3fy$M6HXrKLs{Dur@j?hA%5{XZEJ)HYfn__`0f2{5U)JF-vPHYh4p>%>#15L>pMQG)11H3pbKt0s4d6fTVlFVEO7;=)%6zK@F!2{B!vXL$q3y zZa~Q#MZR(NJPs)|h=K4UE!w3!^4#s+EL!g58?kge9h}cuG+U9E_7-c*bHVz@gE!x;LrI*N2iZu43S836v(^%>}R@eBpZ4!%r%@MWdzP$2-)A28TN{UHd zYFr#92n?w&QJd|b6KqRJ5}?_$FW00u-KBnUwHZ6pD(uOHpU?w*Z+x2sV5rXA5P$GpF?wb!iM`Lg34wvt#4}}*^mYkK5*T&YQ2tQPm@`5)G_D=_YgjKvWro!R{kbj zQ$J-}U&n>kGX?24+6S za&r|CWCVGeBy{Z@g*e%Z+58v|e0`qAevDV%5}9^dDDR&VaDl;ZUi}e(l`#ME1#$XK z+??Nzo#5C4T~^HcsqUvK^-6=URGR(A=YGc_5uKK}2qT|xJ+wy@Z$Yh)y9MA_0&jIo zYYvBhL@WU+>a}1#u|vGYJsagl*QU%C1B+gMetfpj^Q>;?W4S3$p_n1&9N&E*0#k-B zKEOQ&5#aMk23q(>`A(i+&(ZL)sZ8S_hM0C&fJ^s(SiqJga-{uo+f9KVvdia2#ggY7 zaIG&d=33Ysm4lMSC^^umV%O=eeev^a0+#20Z02vqY?UvGayP^@p{sl&Em1#RUleC8 z{K@!Oq{tKu_MO+ib_@(l+?%`9_V1o!8E;vw(t)5uAKnrZ@-KfQ=GrP&(701Q?Z#5F za(Wp$m@QZ!M_}JiKBK@yTSC5=UlGbxOzL*X!&F`)T@lp@s%MnWV7t#`Y65?n;5%4< z7LUpx^rj;pr*f_J2`Z&gVr8;}4`>g}(WJh9rNfJ`RT`i|=i%I5lH!6cFyh{)63YUg zCMDKnF1#9T&3L3cnKWJ36FE-7m_ZaAN-!@m@@T#gF0P-}-)kv1gpR%C!OGxZJhn`x z3yS(C4dq^gz}s7Rur_(2<)eH!X+E@n&*NJ&bqqSTQG3GlBq`UU3Ud5z2Us+_BK-}(!ka)`OJy%aqzkSc{?E3>Sg8$Ee{8YJ~5 z>`psYNWM+7W=^aOf%Dm4Sssmh! zI8V)PlZk#bf^85*q8~T&Qq+wxxb%0dGjqyrr9V}gAi~M_B+*_YE=Nle^b~*HTK3LN znCmABSNr;AGG4t|aD+5cYBT45x1Gp2W0AoLr31^lyxBCB8%IQ}z2&NQld)sdspw5X zqdwG%WP91ZSdmSLhQ?3XX#{sziFG3#)9;)XY(Q8zR-cd#?dHH z*f3|tg36(CW|z)A*>zmgC$wJh%NVNU0voCrA#ZA+esgS7{%md>EoB?~mBW(Lj(ha; zHU|)bC@)su0y)!K=t{+4EM}ir)J9()ddz2~nZc1qsC{}9__hHnRM+uZ43pR59qA?) z>6B=K!LzA|NxhfDXU*Mz0aNoSxtwe0GgD$=3wx^a%4eJoj&D`7{?H5iYE77n^b!Q# z>^uSCNvBw1o4oSxCw9EB-zXf{a-(I!kZRBx31ZY+QW{2fyjQ-8a9^PO|T z%tf2Y$}9nWLB#E!H7AFP(P-m z=q2`|&}BSr)!D?~7;s`EaZPO+^STGOf`G*efX>E-kzb8;vzG3fMCi&vcqOOvoU z^Fje>g$qvB3dazjv|r1I#hn}Fr=x5eO{U7P7#UX|1rWl2`od>_WeF&Chf%iSrwqAQ z@1KsfdD^8Rb%%#qiH#8=d~RYjB>L`UN~jjpE87*?VgMiss&vK(6!_z=%iD>@7ACX za#H4zpJo1kj^l&(KszCGK)#=>g|Nd5y0NNdRNYI4|8N_Ib3|Ez8pgdpm+M(Km@R1^ z&eJnCN2-rq_2{pR@)g}Z%v+m8e-Qbbo4C=US>4Rfkrqqax2$M(c6=t|YWcS_D!lYN z2$|JBw*4;Dt6#@;0Tl`slhVRN=@|{30{SIrJg&KavvD4@_%KvbwxHJ8YF<-$vWwKf z!X(*Q`~xFp_q=|RkY`hpE@gPIq)fl?j3(NvJm`S#J)VO+Y?bOkF;jHwrGC5wWAfT3 z^{b)Ka(z$=yN?A2Fn;5+e7MuV=PIcpdW9AkPO7aU-0ewJn}P=7&`h}Cw@`V76Py(? zccTw~u%im9IUm*c89Jz2NTi!uw7+?1Zo+nzlIYcVF0KhJGB*2{Jz^qooJV|^WQa`^ zlWpWMa9aMne_Z8g9#~StMC5c>5{PnSK3=0pk@&?OP-%M7ozml;Hz)jJaypnc+CG_I z@T_IJP903koAY2FZE6@^P#`S#q-Y!*70O_L_ccE3xCR87phwnJ6!G20oN{CqSejae ze3W9$VTwLYs~`@`5rgHzqN?7D=Ad&Pf)iz&VdwC4fIF{Ex+ z&-7dEmV1ogwaNuBAMy*V$+oK91bZES`nMb3#uNKrwn0tVScI!RBnB*i&e;J|r+TlV zXH$fPUHZfspZtfAaTRe5cz`W^6Sf-?f?&2?m0_V z0YCV|8~tiJc)IsJ`=!2-Ko);*c0vV8%6DtZI|xUlutTdk>luGCj|U@)W{~AQjJjvS ztX!!cb3iv*O8JP)yF10={y3C>^lNy}FdkaHC;5s}TpT<%K(N^a1qW&20RusFHFYSR zi>sc&aA=tvvZhMTbra@<@C3`dA%xO-AZh}knp2Zxz?{s^bTUjQ(G7JkIKYlN*mOB2 z)qc*N_`bv-5ajAFk`BN{8HkR7~|mdjaJU zVW!_|pk*sC(b8Li@lc${%~%Dz-FZ+1#xrhvA!E3aq$z{d{1W`@!ZQYEDazLBxG{{0 zQyOvGuhn=BJQgHBVbV=I&4RHjmL{+c_7J=H02#tw1yKepdEv5cejaRd4*qiuefRM( zYAE-B#(}q$9C1IQ+TIm^5H~i8k9_XUf>eyyXmC1q+KdGJ% zShEC1_h3)_vbZWb>#(h|B_C{YpA(xA7W2^QAPJG#PQuU;R7a#r7NrKJmpcB!hid3m zgEz!-q^*IHCZ^PM4HLKk#C?{;C5~K=c?QUM0Vxs88_ongQ$D(46(lEe1N}>34AW<4?dkNv_2Ns3NJ9ho~-Q zC9__p_V_#4$lt`cn-`fmKoXT5Z`PPZiK$P~3vqUs{%pLrl2&nH_cXrN$r)qIa#X@! zN>-HxL2zZlpIWs)3rG(!SY=p3h(LpM1pY0rc#Oj#OVV+KJ zJZ|@l%)SQsmu3mG35wsvFe;i=ejHTD!XR=0i3wY`fusnS8 zLEla|?r#hWF^eZ5UE>%+57a(qnK;i82Ux0E(5moqsae5_Rds=e7Y=jb`G%fRUawS{ zS>f&o5f_+r83}Mdu=#%Sfff^ZZ1mYeTOIs z&a>olXsKXrP7YL(t!Ut?|LV|#*n(v$bV#GD*ZXE6xT0el;vh(N=3bb}Ob_XHAZYK| z@GG-r?W5F=i@eBZWU4c;hRYc2L3NFPa?B_aP0l%BhGxe#lb?_CgU5Jw#yRz>4-ZSk zc^7lfp7U~A_yF|13sl6x4fbKJ^H8BAqDQ#yS8UN=(jW3@0w_0oY~>;-@F92e#=2oL zbRmVid#A>JaXE-q<`v48pcP4rv@ze_q26XH`#u)hzHxpEim8HiRotOLm#lez-rZNk zp+K%T)1!!000sEPw(alY*qC(+Tf^++qX~>G4{n5_4H|uH zs@|8wXKw2Zz0Y6N9Up#$w*O9lym}pTZQHI6S4Ll?s?&K5UAVkp6nsH7=oGW^ZMkKF zpDvH_7-Y~iLr>*j+^0yhay?a&<3u})y3MW;;;=}b2T!2pMaU4n5`ljW$c+lc zb6m+wFMu;LR2cJi+>J0zgUa97o?tu1gP84aC*M9{y7r!tQ+{e;FpR=~->N|<`^0%5 z_vAg8+i&js%l}>r;8LzrXY-5NzH|8vdM>~mFWp8Q`OGb`rL}h&r9smM zBUVh)g&3nCM-sk`$e2|Q99V_8A3+OTTzuHHR9@9|=WY`|N)@+LK}*(E#>|J#^GFq+ z-9`?`?1M<}3&OXWd{*UuVZpgjOe}G#XVdKNtaTfrrRfLfb&Q z&IS{!n>)GwZT;Y!QeYv_oM9LepKBCdrdUhuYek`09ojlPB7h8k*CeT7lPnuBEeM{T z9k$nW`B;1hxgK9e*&Au$a{Ga@i%1wOlpG~0FnW&SDTc>HR}q0!lA3e_VQ{DX@#VHD zbo&fyq^B1nc?RW!X9y%gRBkFAY2uzgek;aGYf!oR&gaPVgxeL|rf3$)mE8N!?vXoM z$eqWk_2V-YBVf*daSZ(qDpAlCy`l~Ed5*krfe<`A?m!c0J>^+1PtiJvuy#QYg?5z% z#sj)7RWie8L((Nc0PJ_`_$+Hy;Y@*jN`fH$`t>7RWzT7TGt`LV6q*NfE8+D-D)%sB z5k*tJn%yG(nHc(666F4T*ZFN+Nsdhp?YK5%}yF&-aHLY-A*w(Tcj zRyz40(^JwN*AEh$u;RA~Iv0${`4h9+^74UV_=LNChr|{*m{En^#Auf?hXNckUl=*4 zWwxI%X9ehBLWAhoJ3QuvN-;N}vSX%1=6~vF5w~_G-NIH9G8jIiMkPli#b1rblN6OO zc$eKOtIIimal)FCqgqAZSGZLJ@p9X%qR*)*7!4Wkej$Q-65$MSu7>@>bB^vBW9?Y> zEda=Np3|#9ksZGk=f~Q>V&zi{tE{1L{^ShhwJ zJ_HuG7g4;esM=D?rxqp9EBZ!HKVcH-d!Q9ev<;N;RzZ2P_a zC$SKJP@r;_7WeGwcF9|V@@}mE4zoEt7p17G7)79=eCp|c!T&oqH#>-ht8e#L1o*=d;0xLYYH-#zYgkofyHi)bB*u|La*PD*kJ}Z%b z{^i+^PCoS&361{2AVd%Q0B{}HINO>0Cw9$Qzo?lbr6kv&EtP(>dZ^n0dR)oy8Mrkt zg^}bR)o=#N2+<^oDJI0Mlfj}PoG{{nte(a`{N6uLZnDp?J}1O$+k_2h!L%B2DKm6k zjde>yN{iHCq+p8e3#-Atl#c<1zYHCJ_Fl=O(wAX3oqQvoQbRg%oEUy?9!>f%k)*I# zj*(dSLmf+*brBe@85RF4;ZaDDrp?u9)ytFSl%WjmXL6q!9sl}}g=tohV?aud2qUjP z79LHdU-~z67d}$H6{=xQKevivb=;MeBGfZQv~g@Yb4$~qk8sv_A+{o!v65}LJ{8hz*m*qob%zRf! z{Tp}lyao+_C$|o->cldq)$=D#q{i3=2{RcaAAhV&=tw)RgXISU#W145 zEbGxyfBSB@G2US?^L9IC?L*Bj{_f8^OXCAsLjATpN6;Fj!-_K9(9<=_Zqgc|u2I)+ z8pa+;cSU4&LP{01>qw8Mm=uV_;3%J&oP_$QCm!*IH6AArLPrXir6T^&dC^V_HbUIF z3$u_sO47m7^u?vyK^OFYSyScEa_fnHsFGJRF(Qz__XzIB5cp!l+vn1~2Y4f{zl)tz zQ$K$7cI8yz@z;w;@Tptr+Al~@c%u2h(iapdo)=U2+6#ljEcKLh5Lxl9l$F3dFCd}R zWVx4O@aAKGf(w+{M^6(liWz0R9O{U61V3sQJM282oNYmtI#Nx46O+VS0+*CD<2N=1 zy|m=@^R=txF9mTKxcFiY2W3c)d~%xVs7T-~7F~ljUP>s0v8QHbi>gqdlpDEJ)v91? zrR^@0p^J~-M(}e=^_8KH;$`mqtI^%5Ho}dM_3JZ;z8?+rs*1J}<|6&HgKi*7$=y?dHGMY-$E?MaBe&XS@qM0`(U2JT3) zDvaG|4U;aqEynzTM*Na8n%li20NX%yLllNVl>YkLIf_UikZLC zFSD0qa$^#I*f#S%>b(gy4$PwY1?Ku(a}1ZTCyQe2pxOeSU-I5=N9sY+{9ir9HGXO% z*tX>ZdA9O*%nVL>=x3G%ioHD2lSz(*%q!0xH*?}?jy|Os>sY=lh81OywkJVw$k(Nk z{oE~EMyw#s&*UoP`KYO@z{{9mFs2^LYN^pYE^v{5VBszM*2;$`%-78X2`NF>mgl;w zuhyLY1msyDx(LpaEKU@~jvz8K>=#`W!Wk8+0Nsx!@@u4Cr4*ro>90R4Csf_A!Pb@* z8Q3dtqif{fL=3i%PnwH{{4nN1+MDp^*SlX79Q@c~IaR+~vt@$Z6p?9%vr}YdgL-1G zO2E^9;7N6t#2!k18u$Z4-bWapox_rUzyZ1Ap|L6rB6AFqDAE@Jrcn{*$_Vb`DTi;S z!mT^jNEEgyZEHF%hAZ;bZ0Ron{V4a!r}T zL|{ArU|CqEnm!hhQs+5JsV9BMe!2r+ZqLP;6( z>1-f2`?-8SP0Q*em!)xr2RpbwC|r(zUw;Haf~%16?gvwXz1!-Z`Ab=_GsC)(yR`-g zXWN%;$nOk(1`6GFlLBifqK%%~wOznQ8cw{Lb?JJZu&^g5)Ig29_luvb^w%`ORrOcV z#}Xf+gX^)Pehbi)o5_#fplSmAzIp!vxf6hhl#RBs=`+{2=nj{gazS@68_vpqI{Q^V zvrp?T+Ia*&@#A3iv$wFVgo(5%tCVR9Sg{CBh+QwAd}X4bFw%lIEMc!e^I{*?D+I3;|+?Ntn7O`gL(Lr6@lL&xOB%86wxdrdMEe*O@&+DhFLs) z3lsdUUie%RZ7PGFMGRyxjvm-d_3DJn2#jvB${v(lA@i-%W-*vrZ^9~n*#Y^!?m}RM z2j{(9wQ&ZBJU2*KpuZv&6I%DveC}1<7Lfi}H{}YKM0@-e6`=sWIWs``2-nXI~jg5#lD2S=m>j;6^-0(ao%&%XG{qo)A zdFJ1GwSK?aRY7Q~(^=1dGTXkz7O+!QHZ_3@SvU{cZ=&zCrzet5jikI?WUcDKVxXqq z5bI6c9^LljJHpg41m(}t{U+STW4b9~5sxV_!2Ly=E&%sjtnq^-ZWsgA*){Ode7~5W zY+k5F%7>8p@>xqqhR%I&Ng*c2y){efE)dM*dpc}#!kbR@?vt*6|Cfq%X*EWooCd2D z5i~C0cCpVng&dRP1v&P;bHP_Qu`m_a%fv>A*9BEW?vJkiRY^1gxt6u0Y`Wn@cxujS zM^-8%u^Qt#uvoey1>&?lT?4^uriR0imfTMIpuvkr&mRJXyW8+R^2YU)3Z1o;gcb zKo}GKxG*FzkA==aQpk0P4q5Xk0ru#2H_E~@?Wb!2+N{xkR9W8@ZCTt3!sbJ|F?AsD57@5ss1r~RMC@hQmY`H`ewR8N!~wmFAe@Djp?#dG*UjFp0=ByIwXEC(<8(i$-i$m*lEB*w3GDY6c?k2IEWp9xaBA^x`~@5CRdh3Jr}LQ-a5%ky^YB zLgH9H_?ESE7HN@=^*h<0AiyNX*3LE><+UM)A3nY90ec_dzwdW{b;Mac4Nw|NN<>yzlgy0xYDSp% ztXwR*G|3E)BS+ox<~EIF@=m_-fOArkR!NefHKHO-=I6`B^=43uXzByL_2^4QdPxEM~;UOIJ(C7XukS=?C>6_ZHIRdS&jhMU6Iv^GG{Q!hRXq zV?*cSp99MYAj7{PFO= zS>*A@v9(AawSTN1{lE=Z@x}sHB@-Ej0+It5rVLD9{7^}1j5(kq%i&*sZkpJ4I`uL4 zU!!k(7JnANjYtY(Q*pA;0oO|~welUu7Npf6uj9u*Vl3@2Wp9&Ad**4<=aYpVrX!5s+PxGVm6l_5ueQ6Fi)6bvILlI!pWHDUFCkF z`Fics}1aD z)ixRcs;kT&+~reK39b;h0h?f(@&(va(Gg7q3EvQ3nnY94HM;#EG2xG$!8Y(3xMbEe zl-0H07;rEIoh{U!M7O?TUkrX3kq_UJo9BnjfAO56GJ+yhS0gD`9`u0U9$gN9Qc527 z&K2w4m@z_t&V+qbK0(Y9cAZD5h&G<%A(t3hbA*Ft4Q>%xoSzd#xtr$mpm*k~FWl4Q zEbni(89c>ppG~H!_I;xy=&R;h9My(;eH(2nXmGX`G_QnTL9!g`)Y4}Uf$xmi7mckT z40-4Q2S(|ip8(ao7=CA2rf6hG|}XX#%s zs?3sPud#Sg z0UtHEW>8_>uQ{Hu7uD}zNwZ>IGiXGUy_iB}+9(zpw1T!M^XyhsU{98y#3b{C&Xr;t z(&h}|-4?6VR&WHx@idG7erjPGU3VR6R`E7zKyJ~|3uRQQo;+YmFisna|zGsB4RnY}CI8r03$fE0I5Dl$_VuC4= zut(Mya<^x0DERuHv(v}&*bQ=5b58eY8dmd*Zb`(Sq?7XArb3>NFq6w>(hX*WR#rA1 zb<*q_iyW5^g14-HJu)XknYg4#K#N#t6~%9>*5`bhgGNTAyslTXXTyL;4B&7Ak2WSU zzR`qwdXxFUk9KYLYa1VW9#%>NU?pUS(-~QFg+w82h2bdf*r1yI>N|Fa>wC-((Cnt_GjFf+29`29kd9g$ zgU7U?$Ayk1LxTWbQlZX*0kr|te3Sk##G5u750aGt`={l^P2QL~eSMr%`zTj_9*#8g zAf-cEg@xXK`pij~oV&GffyTK56_R@i1%1PdV};40!`V>xG?YEk zeY!caoyN8ibG#JODvManPX!q|OxCgUShtp$9l?%&tjAV(91wLGELHYd`^W$hGKsh5 zwwaGSgiK)Nkn?n3Ts`Xrp^c+4GDr%E>85OGAJ-xjuTeR^)u*YA_c+33#55sEc|56E z`tHnc^&l*pJxC3$sD)|sjVCE1qvlodQwziBLI0o+-3A+*lf5Xm68DT=>mB~)BzI9# zSMbSyBzw2aPAZWe)zsp+(DgZ2`)e@$qJ$P^6G!6^K;oL=iZ+iwV*-850Mnl6u@#R)-4 z3LpH;c44?h7PVNn33{KE^`?M=KyAD?$2zCO-lw*RT}R+H$^q zU4qfBKo%qsqPd~QWWEc;z83E?jjUN&knA0Lf!WJ!c4Sl*qNdWvk~LB-vM_gHo|%Y$ z77CzZ$kiLEQm(CG5qQ4S)6dotRp^93*BjsJ)WXfgbS$Wo@xpR#4%YjS2YBUt9BN5OjPpU&Qj zp@F@H>hIbbaD=wDkkhh5nJ0dW7YY?;W7;91`ttdImz5N9 z3IRnLUUT(owjzPVObOR2RJjg=i&N`iGifr$dV!)#h@P4XrQI!jJt$Eu6p%!<=a<6+ z?svGF0>(N^8O^Qrzw*uDbUQVSvv2A@Xe^t~Zi;Hkptt6id=Z)Mmyq4ldl=oX_8U?e zJweM#`4C9BEB3~SM}OeGPPxl}S4m#)#(UP!@YK^+n(G3QQ{VR~tTck-B`Rt_?CBg* zdE3F59_vN4ZYaY_drb2)#&D2_vwQ3{!4_hKj_3;|^VNC~h*MhTXHi7UFjPtt)JQyP ze)g9Pz5XuB2pW;-%Bfx`pda=JCxy;PyLH^nX}0dQA>bL+T(eD^YlM^hEg?2 zfoX(K5K%_u49yaft*WvR)iWT0!xE2gOfIS4(ks8Yorhw7lW_Af-k>m>rYc3lYtCR= zyo3-5KsB02LV*p=_PdW33>?z5OCMYr(ukLUhKbGmna=8PyyUf^En&KhT6-V@@!QAD z7*erSi{mY_braudg0b>{eDm(`Tg;?h4%Ih=B`<7_&cs1TwKxy@cB2}x;EbUg`(AU{n=lbTtK`&^TcT_-n;n3ee|#w}Rb-D7R#Ekyv+sEEvLI=pJDT_L^eX z0$gx%gdmcyV(0Q&$K@ngmYXo1PN2EY?jrr)SeLsZMadH~z+s!tD>BH!4f7)Vn3Jhg zUww#CHwAo8?Nwa0L>IflYs%z0%zmGEiqB#)=@R}-ToLkFc9h)2#L)a)3gp8Ga7$&t zLsx!D{CiWrL#6e9=t@=KdfHN6h4kZ_<8hSLdVu=msT~>DghYc&1ANlXc%FYk%d@f74hELTGe!~ZZl5SSqaK^-WG$p-CeYB`v7I; zjIr%QV)NSPu5*II;x`m_8Qm0p!kY&L`s5>e|C8s=V1K_!rtyi)>7^O+Ibk|~a)RzX zwWXVX`u1JWoU_$b@g+ArK!fPD^^g_D9XZVz)cyXV)57CIFlwu| z=_r(B9P2NQ@PgM9~=J`D*7}rjK z*Q{`Z&KwFZV)I0lMpHK$<-+0CN%e<+yG7R?lRG_{F``W8WDGj`$KPRH$o`h?U(yn% zM4-EWM;&2KM)yqGuGk-0=E!dwoFr^xyF^GtE#&M&Nj3e|qVc<1RbJPOx#P)O{1<*-RMFk1ED* z?-p|iQHzaXv$aE#_&GWKJC&(7RJfT}%HF>C<9Kml31XF#mDdL)CPb0_o9$#T&eOaK zgk$OiHf||X@~5zUBv*Dd=YxP}x2Y19K6!yNOZoB2gRsMGf3RjG)~FuBqyuj{0eFFg zf3J~aZOLDtm)+!&WMW~?QI*G@kuV=;ZW>UR6s^>iTWe2CSWfwnmX6djhB*S0JTTaZ zmuhE8Br)Sd9hdq&P@Kcgg{(eK+dT4U{N|rguCQGiiM76n)?}|9t{OH!ZWfI9&4Ait z>9aW*@ZH54NlJS2^n{Qs(|<(AeT|gdf7?b1n?D7jpy@9*KIgN-9p5Q<*aTYi-eF#y z@h&3ct2qcsS6`iXBp-TMpG8C6i{Be6JA+*cLzsV-!Rl7|BI#B<`eRI3{f+>#qz0#= z=BsR}%@;@Upx1AjtA(;~yb~V+Mff={oTavFns`q%MTH@>XA^2`3# zpwDBEZ65~fv2XiHccW=~p{dEl<^KVANO?t<;XwiuhYI2Ww+i9{SYrb)IX9CLlqi4g zTU%2b#}aXbG2Ta_zSn2YTsI2iDi;z5W7bRr}oi3I1@=j)kWX~nWm1hPvH zDXi7(Y|qTsUw2RUYS)ShCRy}MTBcNB(lD(&n#?%Klw{TkhJG(_-LoKYU9u1b(}Kki zJK8WQ9C|gA(rKnKm4c*pOlswrk@$axxWPImL}nmwt!4)D&SDwJdkHzn2WdMNa=}9` zG8uhf5LLn`22mvq;Q=^+vB0B&hTv%jxyY1po&kcgfaoCawCFg<6L<%CLhm3KAdi14 zLf$KA0(mc?7E|CQ^f!B%}SPKr~yr&+JOGDvQ zHk}i>LUg1?Pw*rfK|65)&3uFf$ne1i>H))1LK*l^)Cx-y$1Zu7heJAYVIoEbax_Wo zdCUzr0$D+j^Fdwdp%APp;gjV1M3bl49Pt#PA^EaYq#4|lcmX=;$hm(lQAot9K+aFh z!qIK#`ST7x{&G_=e$cxtI(&OPniZqjlxf7+VTT_U)A8-3UrZ5jsbjx5AM{>~@7Rez zhmE$Y04o^T4e_*tStb~c$&>UCKcofrFe!Wfobf%1ExJNY7^G|>>|EIdn^h;=v}}UN zST&)HsM=62p<-BvA54G7{i9;WPN2%p9^=Qw-He@95FXS~x`vWw9a=uDL=AaO;be`9 z5-3!O)0R>xowk#wD5@IPRBJKk0$5$?7EQ4;SGG5_-&Jke^Bz!oZuH0M92+|Ob?97k z#uk+;n?DjbHlKUIwOBLohwS!Pw6=j(e=FB|EX2@&=vINK<2QeYXc{&*V$&ct3~ltL zL2MY>Y?`61Y(R{g2GQJyXw{}c^bLr16^J%`bBL~CXd5>TV#Cl*tpnn>Ni?oubGK|0Gz{&-ra^2NI>=3f*f4b1I72sXB7)yAh_O*R zMzLuS8>M4hsdRsg?t3Ph*syu@>p;6kh*C6+PQScu8c5p&sW%Q}Xo7T`22#o<$hdJJ z8|5VZio42B0n&cYIG3_%dg;~zxQ_CH--{j#ST)^1#*GHtbP1)_4)~v;JW<|v!)fQl zm*390u4i98Ldw#kgnvKZ^FuaLHnXo~SK~V<*ERUof^2`IEiA}#+e+D$Pdb)!){frY zpE>t%QV~jLUy~oM4QptqD*g7k9opO(HB7GKT`RbytK8AXgB@{st;~7_- zmo%S}BrAUio7PD}SEHRHOvVvohWPk5qP|lEX{oxF>GWinT4cMY9m^T>(J1l?%uW%i z$|Icz6LHA6@Ws)Ua-mL5sx?;Kl*GhfP6 zZ>4|gjdaXCQTtM2A)BuoOE?Th&{K22bS*QK+v#{(%chj=I{fJNY?e-`Q+N2A-gS|l zGUar*-}r}Gh^M^1JL-?m2ct_StH&-ROY=|DGx9Qzq}~clgfW;-WwiK`NdAIPb~ydWYxT(Rg-VTo8VAx;QUlN{RBerI((U z>v`pTVgosZO&el922DNrn92)moaw3%jgNn~f?k%O?VZk4+Tzm~I*)?VhZHj9mej3k zM-s`)ELwFb9n$Wbj%oV(wHmyKfVF*814W+Ic!HjfxrbEqB4x3xR@(0!BHC4X5fSf` zoOU^TEcB#kh|-nU%f2+WoE_OjmV}q{+e{~JgXhcR<5EgmD0;tDqaaOITBFvkSucO} zF4%2eVwO8r3w+W9o8AA%&3O2w(Lh{9lW zq?c?mDQT4`WS8C%qIGd!NM9rpk`;U)!Q2jcXVL^JkVLXdUKn>nsXL=cN1uFBOKQ7X z+veAeNWXk;V>xLq3d**kJzQH^j>vz#<+#-Agq!z7n~JDBaxR@EOe(63O-Dlsq<%GX zmD;CNxTq|)na!p%=?3`+_xw-#qKjnTC6E?R#InYw;G zjYxeKF&WZ%kmcC9RKBKD&enn8=Jw)RhMU{zNOxQ@)vT7Xze9?rT;xb$6^IPD7%FWT zPqQqk70DPcsiG)d4`D%}o~~10C`XrVprFhx$UV{u<(lajv9ew2v4{(LFC`fqF6bU; z*L(8JMv#Nm+X{6{SduBn=Kg;aXSv6FmG-|hwmxT)(LhK+lY_)mlJ~2EonqRb3~pxQ zNlx))P4LU^r#Hv{+unciQ3_lb_AaN))Qf;;)=?EeuiiOBdnO8jt!ba`v|WVccJJm@ zF}S?KX+Wl@W$4;7Nf%$wdc#3~Yjim*7^Xj(71!_SSDz05SPsHgmeYSdl@kBqTl{B! zz~Ayi{*L$f8SnE6pYj>M`)|gyH^5BNnED<5-|6^v|HJ-IM_EVJqN64q>6JK&y>;j) z;#YLs=6n1#|B3JOU!d&~Kb~vbA75Yh_&G251-}^ljxSVP{EA%^T+di`IE*|4~noz3cJ#a;buc2k{A zXqJU&I$g-7)7i~3J7E=ew%`5u>dg+=*?--}j#g##2owIsv-E%0JnI<+O=ifeR)(@S zENNuLDjK~zK0bK)9vU6CDP%;YkcdxFXl`&9Th-a(FAys`d>8TZlD|qZ^E0C6O^O@Z zC35V%=O6e-{wc*!%@LLioq}sP9@RoDt;vhuZhJ!tH;TA2=!QA&F6)u^|9R|<1_-@* z0Mf6HX|>eKYn6Xdc{9A7^56Jxx8qrHel|=})kzjiXSta|xVRo@6rEA5R3JBOb?C40AQjoRd`F@~@nbK9?&n@s(>G;lWVdlm{W_6u5(aa|=Q$C@n zI7->1pID-VF#!X&%gU~l1CHPP^yBs~q-wW<(=7i;km?^=BXLAR{RN*ngpyZ0}* zwxP<=QHw6lR=T)UPq*trr~g2g;9CoU<0VbpN*ndw$B*yczamXOwI=4so~67@kEp!2 z3sqpF$EANBO6V`z(yHNv7FEcVRGBGeSGBzzRH777ICn*XqO>bmGVRU66C`39kFfueSGcqwUF)%YS zHZ3qUmo`!Z@_$Qj;xG`$@A(vS-vb`MBUP1XfW9`AM}X4R9@s5vkyc9u^swK4$96>1 z#(g9bFxVOYfA-ASjs^xPAUD7za7AAY!ZI+Rm<9z}aFAe>1+-wT1SD_9EcpVW5D6L@ zt>^~<-9V&|VkAda3-T9$Ml%pJ&ME;;DU}9{bCC$C27ivii7DXR3ku-E$r_rCNKJBb zl5~oHPiyE5wto*vXZrl>;G3=!lg`;{zjjaP`AvU0EWTy=*)6ifyZ6@n-@DDzVY>sA zidH+J{>^TG$R1Za&?@PCUzH8yG-k26KRoWq7rpQ4X#@N?U*y-*faejsd5f3w6&_#k z6uHLu<$t2z?~MuHkFP#`i&w0ISL%h%O>=rSySfMKYxOk5A`L>wu(YzYAx4PoGlG1NKrd9KMybVFX+Mp) ztMXDLXowI56=rLKV5&=f717I9ht;3$Lkkjwk8>lR{}>s+>zCm{0uz_PRRdm8IYmK6 zHZ(ywH$gcxHa9{vI5k5zLoq`>T?#KuWo~D5XdpB=HJ5N!11o<^Y|LR41@LqJ(~frf=}TLWcD!23 zsPSm2Qd*|PpdG`Y42p_{joQqDja3&&ENmJHAtD+r5_=0Po7y+A5o@usvSH4d%`f-N zz2E&$zI*`iF9HGu2sEHvEyP8&aI8{yT$Sb)f~aFGbJyK^bz>qT5+(nZ5X(f3Sgx-2 zg(`odth*YPe_XQ$d?Ntqmrk?2S@ko701MJkrgMzNpVVy5$`^gALjfEpUsKWA}?gl zh_j*~&Jpjwc`D4u0Wk$8LuC6fZs$9uc zM#KHCCK(kgC$2Fny>)e+(Z?xQHyHi#y@V;o@^Rl#i)dvm_ZN(npU;0{X;_1oeOLn@ O3NbM<3MC~)Peux1mU0{b delta 21848 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 LU}IC!RVDae4L-A9 delta 24648 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 diff --git a/UMFPACK/Doc/umfpack_version.tex b/UMFPACK/Doc/umfpack_version.tex index 3d550cc932..1b79c818b0 100644 --- a/UMFPACK/Doc/umfpack_version.tex +++ b/UMFPACK/Doc/umfpack_version.tex @@ -1,2 +1,2 @@ % version of SuiteSparse/UMFPACK -\date{VERSION 6.3.3, Feb XX, 2024} +\date{VERSION 6.3.3, Mar 22, 2024} diff --git a/UMFPACK/Include/umfpack.h b/UMFPACK/Include/umfpack.h index a5f6c83c74..f213c3bd9e 100644 --- a/UMFPACK/Include/umfpack.h +++ b/UMFPACK/Include/umfpack.h @@ -74,7 +74,7 @@ * below. */ -#define UMFPACK_DATE "Feb XX, 2024" +#define UMFPACK_DATE "Mar 22, 2024" #define UMFPACK_MAIN_VERSION 6 #define UMFPACK_SUB_VERSION 3 #define UMFPACK_SUBSUB_VERSION 3 From d5c28f1878b014c5d8548d3c6ea382c918c85a7a Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Thu, 21 Mar 2024 21:22:06 -0500 Subject: [PATCH 92/98] Mongoose user guide --- Mongoose/Doc/Mongoose_UserGuide.pdf | Bin 209087 -> 208968 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Mongoose/Doc/Mongoose_UserGuide.pdf b/Mongoose/Doc/Mongoose_UserGuide.pdf index 94afae93bf86b4ec09b761d5d58730f2b1b155e1..6ae4d6d473fc3e9b5f657d3346f5f20b6a132e73 100644 GIT binary patch delta 52007 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 z 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

9Mfbaa@!b_PE{ABe+;hnJ{Ie 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

J#=BOY)twv{=*HZ50UjyACsb5E&@ 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 Yb97;HbeF9#0|*K?H!un%B}Gq03L078p8x;= delta 52135 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
  • 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 Date: Fri, 22 Mar 2024 02:25:02 +0000 Subject: [PATCH 93/98] Bump actions/cache from 3 to 4 Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/root-cmakelists.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/root-cmakelists.yaml b/.github/workflows/root-cmakelists.yaml index bcdcda49a9..0f8bc91f29 100644 --- a/.github/workflows/root-cmakelists.yaml +++ b/.github/workflows/root-cmakelists.yaml @@ -364,7 +364,7 @@ jobs: - name: save conda cache if: ${{ steps.conda-cache.outputs.cache-hit != 'true' }} - uses: actions/cache/save@v3 + uses: actions/cache/save@v4 with: path: C:/Miniconda/envs/test key: ${{ steps.conda-cache.outputs.cache-primary-key }} From cfda0f8b30841ea45083a3b97bceacf7416878d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 02:25:08 +0000 Subject: [PATCH 94/98] Bump github/codeql-action from 2 to 3 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v2...v3) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql-analysis.yaml b/.github/workflows/codeql-analysis.yaml index ec8b1ee459..b418add873 100644 --- a/.github/workflows/codeql-analysis.yaml +++ b/.github/workflows/codeql-analysis.yaml @@ -65,7 +65,7 @@ jobs: - name: initialize CodeQL # Initialize the CodeQL tools for scanning. - uses: github/codeql-action/init@v2 + 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. @@ -99,7 +99,7 @@ jobs: done - name: perform CodeQL analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: ${{ matrix.group }}-64 @@ -167,7 +167,7 @@ jobs: - name: initialize CodeQL # Initialize the CodeQL tools for scanning. - uses: github/codeql-action/init@v2 + 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. @@ -199,6 +199,6 @@ jobs: done - name: perform CodeQL analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: ${{ matrix.group }}-32 From e854bd04b3c0c973cf62a2169c77a88f4dfa8db1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 02:25:12 +0000 Subject: [PATCH 95/98] Bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yaml b/.github/workflows/codeql-analysis.yaml index ec8b1ee459..2f86e4e16b 100644 --- a/.github/workflows/codeql-analysis.yaml +++ b/.github/workflows/codeql-analysis.yaml @@ -40,7 +40,7 @@ jobs: steps: - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: install dependencies run: | @@ -163,7 +163,7 @@ jobs: msystem: MINGW32 - name: checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: initialize CodeQL # Initialize the CodeQL tools for scanning. From f30c90372407c004d3e629a9f514f0667b510382 Mon Sep 17 00:00:00 2001 From: Erick Date: Fri, 22 Mar 2024 04:19:46 -0500 Subject: [PATCH 96/98] Spex.h.in and Spex.h now match Spex.h.in and Spex.h now match --- SPEX/Config/SPEX.h.in | 4 ++-- SPEX/Include/SPEX.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/SPEX/Config/SPEX.h.in b/SPEX/Config/SPEX.h.in index c0146ba50a..cbdb791f0a 100644 --- a/SPEX/Config/SPEX.h.in +++ b/SPEX/Config/SPEX.h.in @@ -2,7 +2,7 @@ // SPEX/Include/SPEX.h: Include file for SPEX Library //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Chris Lourenco, Jinhao Chen, +// 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 @@ -67,7 +67,7 @@ // 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. +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index b05e9efd21..338de898ae 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -2,7 +2,7 @@ // SPEX/Include/SPEX.h: Include file for SPEX Library //------------------------------------------------------------------------------ -// SPEX: (c) 2019-2024, Chris Lourenco, Jinhao Chen, +// 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 @@ -1210,8 +1210,8 @@ SPEX_info SPEX_lu_solve // solves the linear system LD^(-1)U x = b //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -// Christopher Lourenco, Lorena Mejia Domenzain, Jinhao Chen, -// Erick Moreno-Centeno, and Timothy A. Davis. +// Christopher Lourenco, Jinhao Chen, +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. //------------------------------------------------------------------------------ From 7f07849e8735778277bbd137d43f5c447e04b1f2 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Fri, 22 Mar 2024 04:58:35 -0500 Subject: [PATCH 97/98] SPEX.h --- SPEX/Include/SPEX.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SPEX/Include/SPEX.h b/SPEX/Include/SPEX.h index d495bd87bd..a500a885bb 100644 --- a/SPEX/Include/SPEX.h +++ b/SPEX/Include/SPEX.h @@ -67,7 +67,7 @@ // 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. +// Lorena Mejia Domenzain, Erick Moreno-Centeno, and Timothy A. Davis. // All Rights Reserved. // From 8a8b6b8d140e863d4c958a40202446de9c3d4fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=BCtzel?= Date: Fri, 22 Mar 2024 18:29:48 +0100 Subject: [PATCH 98/98] CI: Add a runner (MinGW/UCRT64) that builds without Fortran compiler. --- .github/workflows/build.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index e305fbc71c..12b32e5a61 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -309,7 +309,7 @@ jobs: matrix: # CLANG32 disabled for now: # msystem: [MINGW64, MINGW32, CLANG64, CLANG32] - msystem: [MINGW64, MINGW32, CLANG64] + msystem: [MINGW64, MINGW32, UCRT64, CLANG64] include: - msystem: MINGW64 target-prefix: mingw-w64-x86_64 @@ -317,6 +317,10 @@ jobs: - 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
  • qzIx$cyG}(W7yOuU;nk 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 T#K=4x>}))U)YRgN5{Ul=X>Y*u delta 108281 zcmZs@V{oRy7Bw2%wr$(CZQJ%6+qN-rCeFl8Cbn(c`sSQdb#HxjZ`J;>emuRa`l;U4 zYpveh!;_eQN-!IcA+XpuiI|8SO>AKJ_+S|2%pEMK4&Msq0;i4?P@r-?@gi zQi*VuoDzO~_&q*@P9UL&#)KC6g;>c!Ct%B1Nl=BUMG@Q$7TJU(RxtORscUyQnfldL z`yYQhye&yuEP&_k6M6uWYJUKjPT}UpuAM|dPP*Vb_vlJefQm$Dl6kDKTx1;b`2Gwc z({>xgzgB%F)W>8v8&v((0RR`|7_7EHs#3YcaWZjZ8mR%k5t%a`98Wg`O`pp|mnAT? zoH~TvgF_eA{doFPd4eV5PnG2=QOll{K|Ug9+xOP_usf|bh(Z7nF(i((32 zU-zd{vvwx=GJs4O|8=8!*j2M@fh{N&MXu&L1#e^?orE-;5JDnvpI_!=6Q9?y<1)g5 zaCJ#-tLVk_JPMur8RBMV^h_c1;3yG>*7a7sHt|H2v$*I1+9VOnDs_?HKF&;>DP_#G zy8oh4l!S+qGt)0jH!1eB?Mu2EYggcP8tH%YO^S2u>#o#4+}HBLELBEH}R}B z$wm=o!Hez0(a0N}Z$>J64Hgs<<|f-U=DU!*^6z)!VBx5jq!uqc9i~IwGOs4>rJ5?w zMNq-z5LLbi*^7CZ@xT*+)|?vo_pOX+MYA9CM{`Qt(Kg$U_Vtnt20fg)ml3wWR89Cp z=ljHP_jbnHDdtWYqcx1VgPE(Fi@CA=f6#vx5i1vK##}ovT2m^N6C@}%Gt+;UQH!>` z>joD}_l4$erk)T`+zj=~BG;XlXBA6JWDF4x6ZEO(rSrl`F zd;@DA$zp#x$~ll7c5ZV6@YOgB08&m=fotZb#3@7{#Q=B(XOI4t4*Dk0wEGtMnFFez ziz$9hJXHtG;ie`M=5;y>>(w7k+SMP0dcTcRgjN(4)U7TPDu9}fL7n4`UzwP zS;4Kf?u}JJT&xFbHggC1=Q*FEH1HCYBr2VU$SoA_Y}Y7+?kunm`M$Iy9Nv;fCjiJL zRB@<72B?HsdkltHm&cozxKx%hk>t@54MZka&z#$r4*XS23VR4h$PEs^&=V)Lk0U89 zP=igXAKK&y3zgDrE*fM7KqL`wWXHYCya&uRcMobn8@5eP)O-TDm|X+`KWl(A087K< zR=7W|2vu3$7eKs{iWU$Qt)6a6q#wtHs$$N~5&B6A`s)s<(3EKgMobDSxgn{a2s$S@ zJJC`Zr_kruJQHE$5V9lziL=)LXy`d6_ zF&FZ1@A`rUn&kfQV`JBOb(kCD@Qk3ML2lRA6XM0Ym&lw+7X~fEr!wk z>4ibHiN#-4vAVoEN3qk++T2%9;lo4uN7bc;DhJkie!53(U%&J6qWrv7h;D{cY58$A zNsv8kE%_%yp1boKQ1LG9w({`cp`kdew6K)-y2`NI@Y=q1V?}A9OKA(`_V6dqkp4sF zF=GkeX)XXQqJ)38m4F8UJQs^(V3jqrRIjhPuKu_r(*yU|oBL~X>hHBnoNjzk9r*z# z*~5Edp8D3w#RuypAp_nI)ZS}1)aVZSG@I`u&|6I&AT;t5ppR_t;gyiu>dD4H1<+K= z>HZ3=`PA38ClS=wGZxjWU#5DQAmY>0-$Oo!X&Y?ao2@rY3SD#esOhA^+^QXOf9b^3 zY`E$0W#-c6+H;Y|ts-FgS-i68Cgx(sB(yEHp1o8jrYVf}%A$Si-hSa_>y|8-ouNj%g{uj*L;F;Pp( z=a~^erD}~|b70Q8=(h8LM|J7O?mx3!OBcs6vE?u|Wp$97^>Ejpz1%7p`Gwzv*yXCa zpGOsc@f~}GfIu;P_M}c8-F8%AqtfM&(_{0F;M>#(NKe_E%CM&lRCBoi3DFa;kD54h>%|ZIS<+OC-I!v7*dz+Xzp+m_2%dhwzd+aHfV{7 zv0;8Jn~nxx_M+F{f%5LLT5w+NX(%Oox@b^G@n^G2Q(P|8jLgd+SWr$p5F`%g{CU&E zBfx_L;G;!|PDZEfe|7G>-VAruSo(h~Jh~`*0;YC7mgF`J1)N)QTOTrvUf6=Ue5AGm zCFz!K(IH80@lQuG38rpvo6J{I8~Mj-8qfjEBDI$R->E+DKM19*z=*r?^P*34K`^FG3#uzP;({ zONOoa9X}>6L=jf!gdB5rIUsKcf4&L=yFj_X@Dj3*>^wZ`@gXXdIql<_$G{cgNBuC| zE~taHoU4Oi2KTRu^YYbh(On1Uep4w_*MD6h`}odBx>?RgzE`G%Po#wY3)hav4mdzZ zY=>O+e6`-O^yrE7s3l*)o!`g<_RRkPEH$o~znJmfsIIZS4!Jjl=YMs=c) z3J301%Zc<4b%810`p(r7nQwsv&|YeLtIO=_>G;wuhdGh8sMra+Ti_@z&5WN%NhHQ! z1f(CBoFwGny=s(Q}dU64ISbA~T8T(KRspx^z|xftrccl~$MuU)8Cc z^h0gd60#GVYRHt*7m{9lq6T>BY7-gZO4K{J?^FQkIVi+V0D*>VMWmxf+1`bOB+DPB zfx)YS2xt}Vo^FL%$Q>V<>L)1pUI0$^OJt@DF)Z)qnod?1?jG{O$NLM&$o+_dUA9xiP)sY z2tOb+&KrV5Dn9O$9+XwU@cJPdb4qme5+K5ysTG0iZzmktn`rcJ>p&hZwTz4gE^1y! zjRQFi7B_y^=FB&FXT6_kyYIi+Y26@;BT1^JU2aHT8z zpIy1|6tA2AV{~b)nlo5Dl!z28t_~xqILQR!?9_(9KUeSbdt>Qhr;cIf z=g<4m5^hzMrHeH39t<3M1&c3W8v8k&`IB7PqIVUMa64aIRRJwISyELZ5oJJs1X+9_ z3$h9QL5`R~&id>A>jHp@U|^W{brS2w$O z>^6d*pB2f%1mG=jVW0q*41AHRjzDdC-32KK6sWSVnYEpmCD+w&IgYP?du3SQzPfk2 z7`ndn4pX>dn0T)Ct556;6jKvJKo9PMO6E>zM9SQjB&bp^g5@cKj|dI~;etj;KtZM0 zi4YBxdzwiZ1v(6&2k-z2P-4dq^&8jCUVtFeQatZ?dK3^6+4WRP3}l#s*X<lQWJo&w@OYufgJ4)-Toj2E-`7S2yy1A3P@+dFk_@sQ4n1LA zm&%I>;w;{1tl?*zQj?UR&?!B32V;^4QqWi&#!g_mlazDf>2AyNN*2;YX842qhaADK zFB{0OQ~>HUNlHL@DWNJz3xz%Ww1U(Z-8)xlE)o1u!w?Me-x1-z;K7P0yuD#7Qyhw% z7y4~5!V&~kdpTwu^vTxA++dg=Pm=~4Rf_Ci-{+I4a~g?^%=SV2JqRe_B$We;!pj(% z1|HKy=qKaOYv=>NGxXVeAIy+%GQ1;9D}z?qVokwA!Wsa7PDZgDP6(FAbOl7fM`=B` z9>M#|RQTg5Dx3&;-7cj^Tn0OVu4_k z*eW{V(oTT+q{g7vBrwcA=d9hTfEbXKiskPfl{TKJl^(9_fJXVqkF!6tlS3XOY-iH^ ztpL?i%pXVhk&(dZTc%L13c(vZ25mL4NK zYt+bjBUv2g#Cc%6jNH2SJp0y{L9QwI&BNNM264)Qj&QyvjOgZz9(#-&|c4THA)RfE<0?OIVK=x6m1$A?En zIW0gke~rZ|ca@WXz8%Z!;lkj0%!haG=t5UyS$&m`NWp1FOSVwa_61>FKwyi+!D)P4 zpMo?5cAOSb+*;opR-ZFBPIbV_1*85@=;2hDogC9j6lJ2W4rmXW*hW1aui(<(dlRLB zto&&0?8{BWv-J$6JoFTO_0trR+#nnu9CJ)T;oHPu`xY!Jt`@Y-&5tN8$ zqUR$HGbb1{a=Es#Ju`DdI^y1HO53rgN6MrFZw5A#iv0659qJy4Z@WF2NX1OdqfUb> ztTu%#;ruCc4@?vnhQD8$R1*>NE|VdYOajCYmHu91%Ie>bH5(r=6{=#ahufLH z;dL%q_KSx^TwQq_B#798BkK=I5fmU_vG3b^Q(F9?sYQnIm6@ktj9W%HBT2(mEpA#{ zk5oo3F?aatJ~hFQZ-P_%ot%MH2o+>1QR8de6w{`DQd5z-;ur;FFrm4%^A}JDn2kc2 zR;C_EYv{gYgFV9^ttPfe0FCh!J{33^@vjC56XTQgXp<=mZB+iSSQof@L!j{` z8+ULt(6fTVPR*@W9fRiihthynnH7E7!%3nVaipD8)v?aTYh0Tw^<>MJ5Y5DI?{@7K z5bZ@7()yjvUXN?T?XY_0YO#49tWy}8xaVg!{vPwGzDDS#>hWxqk$Qqd?XGQm&dzCU zSs{7K9QRXoX4AE5y}gd=8GXzQ%z%{jXIc1Ii^bnQ)THR=B1;A+oi$KG zF=5RTCiYwG#)(A-Y~+A&loQnuM0501x!&(NjW3lkXj)DNkM>GPUE(>r@Qpm+I;8h4 zMO#nn`wsfAOB#&mrB@19^~>Ucl~|TW;kFUOd~cewdH60_}lhsFOsE8Y#v29N4yc zQ?6mtliitoAT{*P8Z!a9_KgllL()LzVjdCn-JmM>Z>ju~g9E_U9lR<9r(&iroElhQ z_Bh9ZWXP7XwNltD(*h>VDb){%ScHonTG?I4#J!8kzEzolqx!06v%^PA=4zy;ob_ir zJ?&HbS05XSL`x-;4z-f*bTSid@^U(n4-oplk(EmBe?qj$u>at7(3a!1wUqr0A(!KG z*6^6}^lr2n7y(SldV7Y?0rP8z$8y+T$8JXpV@s-qogr)MYRv&}Lhm&nDlDB3bhh<*~ z^bbiumy7P-B+08MQr||xYso?M3pqnhmOLeF-51Meu3XpBYd?=d_TlwC0UuXg1fZ8f zR2Gf`)mjm+&5Ee|ahHeO{!1JQ=_eV3BO-0g4Ao;4lYWUC=m@j|=~rDxn8tw^1YKyq z>Z(Bj%7LLrl$GUyf>mn}>EFRSOOn-62B}IGcmOI+fcJ8Ni7wZhS^pjm%u9(nm!R$5zzyN(&4=POzO<)*MQd`12imXIst104WD-~(aF3+kaYTTD zV7b`5VK1MyUIEqabS6u53@RE2Pk{F;he9grT)z<(ZKQzZfv|^$biV@18GEMGno|$4 z`4Mi&!3dG8kZY~I)EKdX5LBdrUtC$td`x}GZv#=CV%39;Mv#E2dOv+ z;+mYrmR)jh)oGsBn{k!e|1}i4ZnnvBco|xC(sIPb;aJfi5%#&}mnLHdhmgVYqfT;+Zlz{(DN8T0?hx=rDv5qqB*d#>Pj|r} zJ>r!rHP8BjVm)nrv>6UF)FNyu*7Pi2 zk&5oZ^?>hiC5+uGrLII{gUDMKSD}V`QM*kmtvEAlEy`vCKD~9&RMn+j&{CUS-#Iz| zrGEP&tnCa7__?Zj6z}Ju1eVaL2=$y3BG;fux(>qasuB3j z@pL9N#+Gf_rCqIqNGpj!leGg`Nx!|jDI!V*22*Xg97ToX!}|Q0IfESw$q9tKQEdP5 zclCF9RxJfJ&O*EO?S`s>i;c~izhy%d2zUIs^KtS2Hhz42$81xxu`s3GoDZc=bkd=6 z0*sHpJ&hYuf|&6k1u-GZCa>aS*P!bA07$Kzeg5j0RIh~}}ftZsYwAVw`DSU5n zld3QuY(j*~Ql$2?Zh~EE1c7yTAXL$5J#zGu7jv1=%zZumZ5$#4y-3R$;dge?Q}iOw zu&DUeREVMvYg4yNV^R^+G`)2AnJ}m248Z>8Nv8P3r=#&g`~H4-1B^A#Lx7~ll0;d? zrlDLX{yvto+Tax(b)+k3d8nm6`22y1d_sl4Yg z+?jRF^Y0hePQx&mEtThBz&xUqIAD?Yju8C`CZTG*ZcI zIzeW59VxBsV^3mvPC?N~A$-gDJU1!7>ZV|Nr&vDiJ?CSh42LSy_gN$MU_GWX&CgZ)>+CUWZWj0hlN1J0#p-2AN!PTQ#A`UKpe%IUcv^nhiCS@^({zyoU<)uU_%`1nd~1Bd_W?!b26lOosI zuBWwoqW+k#@cq@ofL&XMbbLCYv9J0JfSPYu)tX}vz~?~<>UXPo_jEZ41_)<2{{6`* zHjaqL3}&q^{(3tYlQ}6So+70{SyJr^(2}1ZDfohxpe6tUgfPwpi%WMp=5zG*O401f zfkSLeXWOSO0e;ensTN?yQj6(6JL#I##8;+BhB3S$1Z72)i!UL~eZ}!~n z(Zvs3<_~Ds43g-w9e`*<{ys_HH@l4YSb)?Rp?(BYaF4wlVldi^0@w$F8Gk8pu0=PL zxe=x$k{z@!UAK%H-n=t6c|hKM7~?PvddhwaxJ4>WM&ct^h*oHoU&XJ)D)Ej@*~0t< zx#@YrNMfdD9<}{67@y6E!D1Tq$rph!Y^-W{8LupchxrM zg01ji5sO_rcI}!03?P*1A^DkV+IJLP?bbbJU}u2#DJ_Log#yVb56uw$6;Sw?;=eyI z>0%U-kRkveHplZ3I_}tSRFm#C>_@%m5IE>(o1;cx9Vp-K26i`itHcZFx4NB2@q{MLp#l9phQc?g6jA{2pm>7L%)qsY`-#{-lG@1_zhDY z+B&`g8&;-*0K7Bm!Gg;c=2a>$whw1`h|YjI`OQ7u;g?dsGK%eFFgNQ?6rFHlkI!D< zn>mW!eki&*m5ynVx0l6r7!y!*g)B)H8HW9Chbc3GMVbBpnN%NeNeH5OsATJcVrakL zE#M*l4koyJld}kbk}NL43sMc;oO74;N31G1It1@x0UUdzc8K5ybSk6N7BIncw;0yB zn_~7+Mw{&B%aT!)hnm#Ps1p5h4K>_K%v^8Ah#DD$O)qQG)*!ro%7;L1@owEX4szQ$ z7GFK)Hc!Tw5RF?kZfzu3M!1$lP3KQ;pd;};ba`N~yz2jAE9d=M1Fs?-$YQnGSaZe@ z9Up<)1w>I}Z$c!9{qS+u+?0f_`4_d>Wy^n^UtU7!_2jWYfm=2ehpPDdL)g~_8a#8^ zqQHYMFwDNE@AI;Q!ss^9_FP|IYjua^s&$gZRPm!i*O(8O!0rjCA;mTIwtA;cQRB!l zVZ25%vA`fJ_u|x{p}vF#z3fNDNTaom&HIX6Z@IQw}Fv35e}tmy5vb^OG~#t(rJJ z0&2p56_igfO~>^(6RD&T*fm>1R$uxs|5y}O2Mp0gI=rQ(ElsUC{{Vl=mj)oE1*SJj zy3B%Mx2)6A>@-us=X6|e+-S4knGtvjkQ4P4HAxy6@xu^T(K8S$i--@$hv;LMhn}C@ zI1asUOgt`k-=YDhD?Jx7!g?nuz=8!a0q7^2`#$%{9P75{ns8>K-E=>~#04gn*(qQr z`-z;lNBXxn9-}arV-Q}d_1lBY9}IFqgmqG{GWK|-GRTHD`@%`)%-?_IJ|D5} zS`5>HEP(L?Jm8rTWjykQbx2WY*#87VL3RD@&c95-KW72joQ?y!8bpSPPlE{Tl34Bvr zv>%K|Nv^lLvCECJnji5p5JFCtQ=(w9i!Fey=LhrJgw_e$s4}FRS(AH938PRYPv(LH z=1Rp=7Rx=Putp(*OhXZYW&@yQLzPiz8ZWwRc5{iA?avogqLyZdVi5PWBFnf$h?*l; zHyX*KMmLJuR|$$Ir@9X@Y={7x~5^U42fo+UMgh4 zV8K#js7vI}qfJkDqi8RRtVCec2ExIdOS7vQ{F81{g<1n3$|%|Qpn`y#x zp`BG#$=5NZ15M)S(IZ*R+tPa!SqLh{@47pewFm1fM?wgp*0HU2#a0h-)bG+*cA<%> z{%XyxWEH4mm2QwESq0ZX)UDijWyQL1UM#e(IFx`k_H&Usr^50#c`p$#_xi)L|p zMW}|IX?o!h3=$n)8y~m(zHhrI%MmoFUG7}_9G=S2e|fvXtTwcKAY9IAIyzPlJP2QT z=$!&&|GY;3L2P<^I69l|rWvm8Zq;xMkdXEdrB$sWPzbY5*aD14<@7o|^wt^HZGA?4 zSj6BmF4HpR6Lj44xX3}NPz{)8_j2}SA50*JkXEEfnoo`K)id&yY z_g~Z9-&({o7$*~JpOSpm9qabUFTC2%>l;r~$8H^0ECA`3CBbw{%oxJu8~uu3p`j6S z(HVf&)m?+W$Pe$l_%^R9bHJd<_>RPc$d;BUZe`r>xXlrcUK?ChTvuFKT-%i10?W4m zK^0t6+>W^Uk-^W!k@Ms44MPtD2*%ndvWciR@YYOzUr+Ol^E07!j$qY{wo;x2)pNvJQ^S zK=FPsQy5d)WuS&_PJ3?|P&F$j8`u1egw}P}4MtKF(kGXgg+iK5!qkA_m`WSvgY<{k zs$7eTMj%jwC4|Q)k14Pi5ttNkpz9boP?VJUTdo{iMqp&sw40?z1uYQ9By(i9mO?J5 z&ko}C5zS6@j|V#l7Z1N?;haH?x16B%6ii3D|Fl(IM4*I4m>lYvJ5couO`ujt_}7M3 zie}>a zGaRo(4Jgm5Xr$<@-0nJ+l7E8=S55~I-u_miS|O^LZR)(hxxh1p?F-sar@*KJ>M2;A zYRyZsG2=2!F#Zu65osCpKpxbg4kg@Dsa6FTSoz~Anc}~J)-5LK?uI5M$Bf>Aq9@dD zAWGnPf)Z*i7F1Z|#{_`dROselxV+fqevxGMXei@4rCyD{Xw*Pp3${T?Xtej85LKGX z#8wniz_D&pdOT=Mcnr&EGNOIArx1h393R&aOQEfLc<)`m;`1Xjg(H<7P*9LpIr(xf zPC$RoHin-ZI) zMQNZeZzgS6{RtAp{QK|U{Z`qfJQj)lGpVD5e27784wZe!o5>tV$VDT?2aTP?LZ#Zx zT3&j`2}IK_-3AQ!oj|QcQgH22MEwiJoIQa%Jhcv7y#;dgl{gHA6!FAVirCA8dNITl zM3g)fg<1oMxVaggbZ;9kw;Y-p3&9!O4 zp+~-ehr8KPN9L{fSMDu*xr$#;2=t$#N`&(RGpJxsrjWfv;Sk-OA%GzOa{w!C5l}*8 zzVCdJJ_^=2z2B1&zPX>hm{K9gvYn3br_`i|_Eu#aOPG7;d`q+m*w0>_uc7K?5VLqM zYFZfu?*iBbo&HIWilYPV0v_KioFrMQ8gRMFcx9FypuSwr_5R<9hO|Uc8JLRI>0(4? zMB$$G`XRFR;3nnCD*GLvrPoxIg4@54+2bn`t4Yx#J=Rfksz2l66_-Ye)5GCrccOKo zgx{@2VQvW&T~$WkdDNy|iOlJ|AGzW*N)*{c2zdhKk_$VRcX4~YP2pfF8O*?LA|$ie z17vE`3M!LY4V0tO2s|m+l9vJcgrGF@&evzxOJLPmn5^&1dq@{RyCWEQTd>x6&t>;k z!pcXAw=w<>tvl^!*jf`eWn-B2YEpUPFvBwxan#>6Q4OmrOwc?z6)gLQi4iZ7al-evm6 z#jr&uTV%p@uNTC9$gpf{Qv_d#(u@b*`up5SDv8uMeMPh)@Nj`6M)gF_k~UoFNp(&{ z=E7)XY>7Mn6h9GZqRcwtX~xr(M`tYYVfBR}2Vw(lldf#H*|a?+KNPk=PBc`|ITLq(G|3dX}z3d=c{!Y;2$#n#jkVf20-?{XqC8&YpnSrN8PrHtT z=fw_`ZEt(ecFm5V9=*rJ-DUz(OLEH`V&A2i@?t-rZ#S^9ozKt_NueG?(-P5Hj4aho zzA#YzBK|k&QOXzJV59vv0J;z?ajj^bVR=Cw-5jlR9lp)>!tQP-ruOXI&EMO#1;_cz zju%YrFc31JGA;aoyAD5)-|o$BhFh(5;dyPEk_kp3bPmLC>n>CoV`kMaJ%Hn9obMw@ zy*&+Zw{a8ba_~f0uudrQz`W7BhdF)~lnZcfGum-?OD>_tR8iR&jANb9K?F=M`wa zu2@cjk6auo9M1S6;WgyZq)-2Oe|h{ptCK(>#pdRJg5~vNTRik?(2KQpyrl%&NE1H$rO zGqdTy5)VW=|;`L~AliOovH13qfmw$>D&> zAZGj5(yCTQ2@cHpAMt?RlvI@s3C#H~KU$Me;|C-N7fVyopeZycJJ){_qBY@8=|O|C zadZ3=7nF$X-2bn(U}pNCwph}!cibF7{toCh5u_mevzeE-wgw+sr~vmraZzYrh=_Sc z2b*>s>sxsM*s-Ld!MO1wb}!aJOKgyJkrLp2nB2H;hrq;JIW=ij){8z|Bqzo!ku7Vd zim%+o;hyHeprla{ancTnS+a&>l~Lg4RjD99Ag)siulbYAY6hr|3A!wg9c9T!S{z18 zM(rYR+{NhEVir+T$(L@>q;-f#Qs)y6q)Qi5pyGnLnp#p;^T@?hHp>M9Ly?QbXC{&v zA~zlevviruG7?q;QlsLj(n>}Gc5Yzx5(FkVL`CmR)*G0VhGB4KPTE&N00JhGMr9C| zuQI2Y)n|rNV+Jt8LE}JaB?v{E4rE0mJGlnSkoJ);(2E8a`Q;9P>9ndtU7I4G3d`M; zLyqvo@W&6=7!8!;3)!tmV!yL5xiA@zwMYi9m}zOlC0R3ywo*-@A^x(k+tj#2LFNUf zh0RPXsfCmMTbdZ*&w@*%oN?7G<;>kS;APUE++s3`?ge13v|#9x0$l^!Wb%==s2Gn0 z`4#P<#7Q_u>EWWf_j^(^{N}Gvk z+5qHh+#>Bh45S{r)(-icI%#cT!HBKMRwYcIDb!Tfw{3D$X=D#3DLci1tSM?FM?(?b z2qtF-Yy|L+6Cx>;FH5$xv}`)wI!SC$4*+|Yg)wDIrI`msa6oX!#C6l53N2YM7N zV0Xm8)O}$M+qboS-A(CGrrtgs;(kK{b8+%pWcbL^1j=ett;k~H0&Ps-RKQFIH zsD5Gn1aUKkcA7i-t$nQz8+nF$*95yhQJza+M2>n7FMvwi;0Y#7HQfj5jaJlKLEzBPFOV1trk+3=*~gba zGXPtIdQD76Or=^|gI>R*Y|j|Ow(Bm({FR65;hHz(dVRV!T&nK%D~psVo3`;n&^H*(Z$pSL?zv5bh zXm4J&c+7qIc}U}An=!=iP{n?p;L60M9{}20=g>e(EhUrHwnFpHQLWo)OHQxqGPOYy z?4^;1`gf0$j5_zpgF1o$SNBr3`n6=MXXL6d4t`>UEz^tKoBt0N=M-UK9@k#9Av{cPb#5$Mh<%LzF`Rp(b5N_p0CH zgbW_Gx+1>2f(AW;{N^J_eCE{xI)Ilbly31#9ly!5tRkF`;&@Y6MFetumQoiVKG_7+ zCQRE8Gl{$ECjl2-EJnp*x^ZB0>O8r%PIH|PCr+7vXPI%2%?-F4Av-iR$;cZ@W|sHE zGM|xutLWF2qx{&L?LB(!FzEI9eDBYwom&&YWuMayFzNCN;)as_auHzD4gtbDlef5H zZD=+*c`Py!M0{}J6<{GAle(CJ+kZnoPxI-2BGCu$0N~{21wzBVbWp5Tjw4u6FAs!w z?U8dSO*V+#u!(#ECVY?INz!$gvdQedJo>LvcT9eZs)LYe(u1I>cKU*@!5yS((escD zw zJH8>Jxt`yXb}DIy?mEEtrxbHjF>d{h z$y%D9-9{F(wk&3OUfedT`7jomK7*TAvmho0+k&R`D8axrQj*0U6|1&m{EYxc{AoEn zAvn1rY#{oShElE3sKm~5*k)uHzt$Rj zj#ZG;02F0)SnU6O(D0yHFc#j(FPY@8koCNtZF!#D!PscLZ9~ZQ~Rtb zP}n$MskY1uXlty$L=6y7NxfGh$vC|lMG5m0`_r;TUG?-znO*(l=iQ`hpc3iQvMK*E z6-ks;MI~t`+FY-C-6dCeBm$|!V4Rx{dt=)% z4D!Zn6~=OkmP3E;F*L_(9~M>Fo-4?q_4~J1x^wh z<+Pja=%JEnmC-T^A_x=OrQDubN}337tlYmo4z>m*2_`cYxl~=A+wF`bpJ#g|`yMRR(55gjb5R0-cfc(`&i!TY?)oWSm@V%&wrZ}I-03}6YTM@a z*FA1t?e3l;tBe@dWY2l&Miz-kM*6hC&e!Oe&GKlfqKMM^>~rH5uKg5+Qv%fvug%9^ z0I|3c8AChViQ$7)Z?7SgK!R(evRjXU*#yg)xww00^*-S9ZDDYxK;XNrYN&u&0w4lD zP?!vEnoC7v3HvJ^a-L;Kg~c#4?JOr!(NzOj>9sPI<& z?kYlT)Pr9JBS#^nd?O~Rr5r@i7NAJ)ayjOTKWB79|GS&UF{3uQBy6u|Q>+YH+}jQW z`*2k~>5rWq?6#V{^C<&oCg*KzoYyWcu5s*dWQnqISArvHxM9&FyZG{5ICs z;04@SPWaYLu)p` z?j;JpaOkoqCZMXxc-Y}&%LZs-ShNMiWa&IXZA6W82+!cn>DT#o#KNK&`tw&0uo#N% z?FcN@rKaV1m=*uh47y~TI0KCTN&q2i$SEP(`bV_TH!q8eULv!Qk^vP-cQ6yf6F?L% z$;5>33M2r^_nl(`IG@I8GuhJQ-5|jOE-== zBMzbB)I?sj!&o%c>d5J@9Za&_0hVZ$0TQTc<^u(<{G}!@&wVJ>BWLfirU83+@jeoG z>7Vb61ss7Sk>zEroapF57i>&%@gy?>Xkz6-4qK}&k=G*ZIj5z(2w?fMMmEm%HiCn> zj7d#(7JW>;CjBT0Ab=BL0(p(6b(JB9A^ZNH$5Zaw{2sEA8MI>#mJCa$DD^076}6U| zs?1k212h+)AZ&@$$^}Hmshqld3%LZ-y%^Kp*XPK=PSai^UO#Kk@|i1zkWy*mx@s%~ z=??15kQeu-;=VJ9S)drZ+`O^KTbt4+-oeEnP_BzQGhz|xUjP(&SR;KzoSdID>GxZ2 z&#{c(QGwhrz&UjKB3h?OeFv27&M@LL$5wIF=#$fEle~U?)utTe-GO~_75R$n530hy zcGB{uMM(J9GGqHEVeuf$eWXm70)x?@vyu!tRB-}(O;Ts*R~GDmP7<@;2Gw4R%7S5U z;fid=W-$b(RslFwAbNV!rgm)ae8%Tz2-T7d$aj z2F*w?i4X&rxO(BRr$qSBqMGX1K{hJejKA=&KT}5R6sf89O*~;Fk)7Huxhrp}d62 zolSbAlSD*|znK&aVO)9&~R33^a?~YuNPqtlj`R1-SxA-7-@B2>_`b>dfcMgP> zw>qW|UMm9?=v*(A&2C{F4~7@J)@&3)YoBy86k&jAusb@f@3E7FxxnRn$bum;sI{J~qDcDFh@o$s;k+Bv}$ z2qvZZ&G*!Xjw(A>KYiV&nwHSBM{KLC8^!aiXpqk4EzYXivnz!6LtXC7Vyc&~;cxv0 z&fnfX&O7v#fKvYYP~UZf{_e@vjU4+ohe&D(KSjBq%;X_JNmtbB!uh1>*7TZ}F}r1J zqw93+fDVC}djCZOyvk|#lm-{PT`h>07GvP=;p(kD?(W@uTegqZhOqSW>8&`5nh{Fx zG#TiL{ad(65@tq)^@7RYe{2}+jp-R;O0NnWi(CSEI8$2x2!>0ilpE6mTc5XZ*TnI? zsqsYb6W@setkRam-34J=G9M#Q>A8vq3WBYPjj^xun7?>d*WxiXMD1y9h5v&QR8Ao_ zG+s}D{*|)3Df|R-!B(WZA#7gJxD=5@;S{%2nrh)x(P$Qz=!ZSi`a#%|)y7{Pt6q2s z-$W74_0|DF*mcK)xog`ZR<{0~kHNNK@&hp@4gmPN9I^&I_5E}Fk?dySubE=It|1&3 z*@LLNjNh?{D5nOex*)tjshq%G(>rTUw@{`}zb|I*(6$?)E^P}iielk+7Bf;&sY9rt zBEFA<9Jy~WSGo>irVfr4**1K1xDX5C;8adW)-=3uXX*jK`5!pHhDkF95wpa`qF~Co z%m64wB*_yc{kaUfjzpW6Rg|+Hp`FBa;4i!WamFxtPMm11p7_(d0~T-hF!^-3!86C!M__KHWHbVC9^g@shPH+n+BMZx(F*jG8z|4JL z3PYZTq%E&%ey_}#x7^T+Xuh5UnnSQxrhtYkVt4tZ9fuL$u2vjJ-A(A5E8trNecc$x zwtQ1K)H6L44l#vRGB_MHSaQWfRp+=*&I%YD2+kVXT5F`tb#9csG|?q{*okcq2jgpa zK_6rSN@K3!v;12$=un&Zj3HvEuY&v3-C=y>L2g6G=;to z5wC|A1{3U9+Vu~pMo-z9#Dn*ci~cbguM;_E15&bBE1Lpgg5-*?YuZQtP`!uUjY|C5 z-{H#`-oej-v&E~jG9NYc5s~h$wt$$tNkv~)Ja{iIFm_~Us6Md0_M&eO=aHTUm90kV zfcCCLD~8~DxcK~KyWjGXe$aG6m8B_g2z$cpOF?>f`>*MkB<$Xr5(8f1Pf88s+LHW? zeSgwHqG^tM^*@2?!vhi-IG^NItsQeZ@@fI^oX7kDij~J{==i2Vvc*^zI)E&hec$gm zwP$+=SXu?i%P(i))ZBd{6{pNf@cqw_ZSqIY=FMH-7=u0MuGDNvUD*%UZS%H5oFU=h zO(GiJ-ff>#_f z^SWFpW=ni`Rc4>W8D%4De6s$gh-@L%&n||qUnZl zy2rm_D3aMEZNDVuLb+cutYIjY;kd+b1n@rLNyxDM?IwV%mq5;4fR>#A_`dx=Z2eE?^44rCrn$U19Ku;x zG#r_5hGM@UlxgAG*BV3b{5-Dj#|4ycgV|$w$36a^fv~)5a<{_V+3%QQA!yX$de+l1 zlycKVVO!K!aU<9^4wE4Zko4dr&a4HOKLFp?yTLb6B^F<|8A<{H2J_6}!G;M#8VcM7 z!Ztk0!a9Gr8FZ88!olR>VpL^xLFtw`(G4T(Z&Yrve5h3J(Doq1Ag8tEw-ZM`Z94qB zOq%{M2#W%{9{u%26dD;ECbWBERVAEtoB?=gs%tuzB;*lI+u@@(FdH^sWx(d9066=iN`URafZ@kKcg6ktM^NbXD03*_8zqX0SOrNFLg1?+ z8cQVs>ZZV^N^cAVwf)Q#gp!ztM9}CiMCHj>CjI62U@U=2ds9IZ&*|m-?1>GA}KqDf?F;+R|-A==m#8??2?nsTWJh6qp2 zhI-=tyb@?~PL$`#bKY2He}EY_P>(f8@+mP!l{upu>w@~hvF%gfLT-$-mG%S|9h^aN zr?Xw;fwSqyK=G*W1$Pz&XN}$Qi=b~xLNc;~-Uc6*vTw-Uy7N@I%m4#FKr!_mq6z_C zc=CI!F}p%K$7#Lu0fVpKSkW%Yt}vs{LinSCim4-Q=Pq&NxTAu9<16Ihs^7U8t@2cJ z`_gj@)*kb@mPIMURZ6D)tsxcTO?|_h2J&ZbK44yE-KyiYAKs3@rq2R+r}K$pok(ad zdvVo|)A5VoZkU56?g1{?GLgpl0sJ)Rr5ZnuU`wl6g=zJ~w)eWq(rA;+mcyJH;w=hd z9nF0HvZ+V@@Gho6u5rw`s|st@AT1;!D0-*(ct<(a!Ix|DF>I_8Ee4kUWTv*o9>QoAoOAPV6xx&#&iijOG8Zz@)E=mt7^m)K2KwFoE_eZ0yJ%MkE&8- zGsq}P;1nqkLbCP&_om#S;;W)fU_2DE7{}SHD#zK2;{d1X6X%w-o9DYk_$5M*Hn)&_ zN9P)H;n*EqYciwe8|6Yerf^`~Vyf}^SamHV>I}|}X`3E_QO-sb!rXH`s%>U^H0GIL8=>$%cv=~5KWvC z7=E!BPC%g&h*mv$kSj;$4k-G}uwMrKR3Q%aLm9gxkSb?{s7o9>?sCeK9~D2uUm_Wy zP8xT}Wm^m+4fJ>w^H4VS9m+ox_`v+pRYh|z6UfpkN=W@fHM06C986&)uyK4%@XA4f*wp7+Hkl&R&;In~A@drw+a@+63IHqjcno%x0F-IRAoygzI}yg)OucI3 zKIxUce%K)QYaBM@O?Z?bCrl`*(d!+JEs3E0(GpsNSM^&p7|6V+X*QT76U%vlVJa$< znA6;Skj?sVi|Xg~o3$@vxWcmr-opHvEm~2!6JFnA!++y;xn+1R9dbR}Lt}>)(Txe+ z7|=VJgex%g5{@CTtVWq5RU!tDUO1G7t0)4#l^rli5~d$AtDIB9tD9cRn}ng%<2A;D z@hG%!Keyrfkqh3f`4u>VW}6l)6PxfG6L_MBJzP<20_sT9jD*reuaV>%)F)H|QwsA$ zmr@0@V-8Jc?7~XEH1~P~ZXwi5al=!j3owTJSdgfjjoDOrkaPJ+CDS(7+^Q@xY}toPmC7_6eLWR2xGkQ%&D1Lq1CN}Uvnz51Wj!_B5P&Ls z*d_+4lr@2IKI-Hg+(DOh@6gDDO*hrBaNb)0!n)%(qBW%>WTo=t2#@WxCX1+m(w)FdA=vz ztt=sb3aX^JxJR`54v#dntP};QA;9^u1++!DV>||bVg_EW%)2h8&ydw`ONl6)HdvU9U`lZKo<+I>`d;Uh$=m^I-RKkQBvi+v zWB4A?su!#hXmOgwM^7~_V;?>Qk83V$3|m4pVKG#plqjrpl25W?()BR*F~EaF+}|bl zI1w)0IOFAc_`gAcxK{5{gsrLPc!Esqk(9r+N`?nX%jz{-gc5`Y>^o%lANq!Iu~j@s zK{a)Wc`mL$_<(q2e#MyO(cKuUeheClm`(*mZ8x&+5K{@&s*X)P@XecvD>BGv70Edw zm?n@YQEUxLR9JjW&JD|Bn*clj&@L``W_)9Y5aEM(?0>_|rQb6!MdevVZhSd0} zl8d{kkbvj+lOyJkHK7W7GZEDp-d8PndM`$r9`43^S3wVBb~*%bn6Q1WeT4xK>i0fZ zEctE@^Kn88SX=4%P}ja=+CkQQmPR_+T1%&tQ{Dnf=o}1hln~TvC$QWgMN!4(O5uZ? zn`y!!V=U@Btlt7VJOCMFExQ)9ua(@J=ou`j=tawXN=5tAwi76^c96f!X>(y-eH?*E z@_J=MiI`tOH;iJO9{C08-(hynEs7X*?r+($0;d=Q2z1ANauwkLgILpY`C@VvaO9@9{R1SGzu+D! zB4YSUzn6hjAgKlw;gfx$U3TZ!6%{P@W8^?a?1YcP;-P{6nB9rj<`S!)m?#{D!BCsL0<>-+bBB@pcwk{urcXY>F3w>1F7k(v zo(HX+<-#5}5mCaOc3KW-zyNP%G4g+1_m$t&FK}V<%BO&vPWMH>A}Fp^$oh&hPN4Fj zODZQ3Xc^tl+xrLu32!3u3v^kDef|3xW!p}gs~@Q`u>hjxn8i}$*OR1_oSiesWTbAm$`O5Uz0&uT(r8AcxSFrl> zw9}`EqKxrM?c&hT41;TrKiDJh+L<9+umubU_q^i7mHoL3BQ~xph%3MN6aTi;ZUD8j6iOHeXWl*bHz8Tu?KdSJ-6bD}T(yY4pSRbg@24Fe;YS@k&K=Yj50ed9 zsnbi5reE#tbQhHqN8a~c^y;z|v9WHEYm3DoIb^VIdj+1rD;E3s20-bk5Pdc;>90)z zKYkz#BdRbFu{V=zT;AQ;^q3bP?~67aRfsj`G=K|+qe+Ns-Ln9@>uLR^ldHjw_CE7b zDkjIzGgn25Zv6t3D#?EMwv9fi8+e_q>!FQ%gQQz4wPOQ^wjoaE_BIIl9f)7*V^)M` zDX*9fv%286Io90X>em=*5zo50Ihd6w9zUAk=r_swt=aLy8K^HPT9zugq;1;5_ByH;DJqj#|uC#&t-uQ zlz3j3HFF~l!};)b`{oy+Crfbc6oK4Z5ddEf@J5^=ttgD$NgpNqBOP4u#p2;+TkG1L zfezQD@@h4vj@b$+H^?XJviAG~o>rI#D>hvpevYLMusYrXB@oFEE{V{-8SOSFFelth|Xl;H~p2 zku6v~wAi)jc{~4T3rl4QC7$tTgsl1WBIuEIo6FfFbX-XLcx$xjQl&fF(YpSeL>%wy z6Kut4j3g+I#&=oj4&{?W*hztc4UY?jWi$czaL8! z{27sHR6d%_YaAMAs;O(rD+S($d2*brQf2U$uD>8_V`$ba#(>yjFTX^c;FL=(vz3%h`zDycPk~sHqB`=^CqHe4nQp-}yzW zP$;`8CD{tAR9SQp+JbP*i4`eBs_qg)wqzKSnR_nB=z_29TNAsfoMXC{rN?iRv7`Hv zP>~0z^`q=lm$RL!(0wW#)k|4fd+}(!hf`~$rC(1gu(XqjxlLmZSV^0khd0@U{DF?1 z1OR39NM!u?BmtPEHH!$C8x(|vEp^@>7!`z(Eg^^sP_4EVyZ##qa8kP}j@rNfb?@nQ zKFAgjR3b^)CRNGGjXl#N0-lNGv{H8dvz@N{%jQj)RM5?x?s{eYM<7YJQfHu!-&(`TV31X2}p4C91#&fZt0c=LP!=)ygp%0~+t+{xrlSo~OsT z91sx0x)=TaR*k^ny7V>P#q`J8>6Z<&oBkP*cJc-9M(3>i!{&+oqtKqV7)`>xf^z_+ zw^*`K^+Hu6>rKQzHxyJgGDQs{B9B$|cXOpdV5*E4%@_?;UF6qXWL{|kD+9`yrqoU# zfJQ2Kn}0{`zI5@nG9Jg*2*4dYisj@zfQu?F6g#E;j}?5#Yc5wkvAv!9E+rg}0Np(Q zaaBk073YP8b}}IS9o5CyPlDHeKcu>if~JWHr6crmYxZIQaBkVodN8g@>tj+M)fzzd9H$;VP3RVp5A(A! zt6*07MHHfCxp%csyiHDa4P4%CD?`d-v$ya^rfAXKAJmU`aU# z#~|>lu;Hk>F@+-r$flEV^6$(MX&KxFu~_f)NO0vvU@(L(5%X9W-e5mb^<~2VAdgs4 zN?$aPh1$g_iL91fJ?&u}-H=55a4^6=wHURcY!zwPP<2_#As8JqAqP<_!;ZaX?PaGq z#m6V6aC-%Rrd1xRi!}*bMATw89cs*K;B~fc=tKb-DO)h3bbTntMqM8}rCi>-rvg6l=vG^lW}?nZV?Rf7;Hx@$T~v z^43gYrdArPRUWF=w%*2Q&&FEweRoCP`!*i>DU?002EsX;sfX=P^T#;1_6@^%tHZj;#ug~{*^4|t}KVz%|T~oD)4uw(=eOb zmH-Fvg!}(ZBCP+7bhomx0tZ3EB0O6VqJO~_g$I597fsD10!B-{-~;Xe4rwjn2WEl- z>w2;X`!5E<#{M7jUn;0La2qgOYuCRAG+1;d{qFyv?EjsV&|3e+$@?K;lSry2k1h$6 zJLP5m59au9F0Ir}1K?g@@YXCt;Co20s<~v_|3CU)zF}&IjZ zN79Pm^HMu!{31poMM{P)G~X221g@30x&?9t|J*MdRbz+RDUoILvh!kZL-8H9celFn zYcte@6Gw^|QSwZpBu&R2tx@{CC~R`S=(qS%PCprpdxNo=csMSm*S@xBtx9&855?z_ zzlsZ&L7J8h^kG;cjm_+()QkltK%I&Qeq2#vSphE|qiNN`pD2x+2F!sp7=qMdJ`50m zkqigi-L%eG$3lS`Q8=)yJAHqSW;Uw86ibdtl^#b#*YE)T5|h}j(nKx41+nkx+R zS_HI09z9$PrNI^-As)C$L2r3KLe;nXIg&7d1L)|Ct?^*$7N;r^z zrH3oNS^$Ms8i0{DIY16J3R9RwSAqgD0cB-jXbfc}?C;l3Jcks}JwZ+h=A9C>r#d$< z&iH$iiz0A2983i507^Xy5XFl8fQFoeDJ~P z+}w$_i?jJ_<@0?5kR=O|N`c71aRaIE(=09C<{s5v;>wggwYipVO}`rlUT|e^_!Kpu z*+tloRQCq^DLLuDuv?QCcFdp_cWTan)%EuF$MeaR)hV^+?d>VpdOMnbX7ixyhX0Fg zAaswQQ0Rfq220iq@B*d7^ONVn(vi!*sT+O0(VTDlZt2X2@5}OaNSy_CBxDs zqCXkXzWrvxJgksv_w6drnx# zWI2Y>lYqjPOdr!`f;NpEMkwE{2N68$0>7)a?#b-Q)3S@mQGEKt$Vs6Gc=F_nAT2*?}`vlr`lFZ(pBs##xf z^7N5*(HT$zEcBr_xW!k4qji{~k5Aw|UVSWKvu+)^tqa2B$Ldk|tk&KAAp!QPe4&m| zlw4!O{Mu&GnrpSfvgRQ>_qO3*j zM9J#ZYamB^oudF}NIx!kb$If(-nsbJzg_P1y3qmw3{Cp8=Y@LPyxJ!)}c^q{ofIoL(J{Q47dF-xu*N;i3A@FF9h z(N<9PIu$iRXA#&P-V&}zU&AoZneW*3-0S%#6;{_s?iD3Q=qAiY=W--Q5R$5;)$rh_ zV2*tN{*q1bGFPxNFr~o9U^F@jbiGRFSD61Yu2ATWcx3W9@s5q7YsDR#8+FR23t-x0 zU|w|@EP0bwBE+a^vLOTji}fLU`(3`5`VChQod!Q@LO8JHM1R8b;>*^QFe%{q;Ob4g zIQuLW$JH#8UXY+ z5k@&0&r;P1u18*ebhTce2$nBvOIm9^wJjh$_8u+r8Dri!ub-Oj*?YS2zxjH8Jl&o6 zGBy#+31S)DsZA`{|~6q!wLZs6=N^y5Ve?s&@8 ztp(TuRB6~$=Yrbc+;F*}gs!iOrXp0jx(bG1IofIMh47x^>aVm4-uM-MMAMH$Ii%Z{5`x7 zr^-2!@MuWf%A(-$HWbq)r9&EQ^qDZvr718>%V9H}71J{?9}B8JL%tDT0}HkPyGW)+ zDgvXY273bc07OaVk)JO8xues_vn2f&8)Ljv7z_SoL9k5VwD7}4h84m}#A`@~uAjAw z;m2cIEkTYZAE@Vh?MwLv^XmWA(c^vs=HV`W* z%N&PUUv}HDb^H)J&26Wq_ZH60O_E`r9W)zbE?oBd39#n3TX7p@saa?%U(St1#rUOj z-nMq^V!S!uK`E=})zDeOmT6|xdCfJi?ljOqo4`wwK7mjUyBLwkI^8w!QHLt?sbFd# z<$TAK1)@(XXSk3b6XOh!J2|14NzKKAfz$&cap6o~h?8e}h5!A#av`vy9(xi{bP1JPf-y zK5mE_w>2sEyruVdu!p&63|l%+R&e$pqUiPwsrzHvbU~A)N~*(}zT|>Be6gldP@g?o zyOriZuOr7O+(zDEEF6o31^ieA@BVCV4FHjV7V&4tvo~ZYP@UQ{?nZ<#k0Y2v-thw{ z0)ub7hH3)Qi~4B8R@e4|*zRkDdDJ44E0&a&gjpyR3S@evA8p6+k!~p8V11dOCcRRC zVla=Xp(*GO=}6#+0z-OOF4&ViOTy!}rMky2;o|^{brLsI4lqcks5ndUcCq+_3IOH& zr0oHk1x;<3u9LRtPmzoPwkZ?zojDvYohPtOGaTbdMp1%`$}bbEM9lUrEyXBpm160m z^gQ|$3fJ0{*#P09xGozbJ$;lL_(bd|H6IyppW<*OPsEFTY70dy+y(w7ox%=^j5@8T zy}AkksMN=lsyY`l#yPHssYtTp5|8BwMU~Q-FN{1`4)m}D^+I`UhHA662(%0(flefBQZl*2gJtT9FD#Gbm<8@bF@YDy zhTY9Z98kC)+!@}SDH;es6I~ZWCLdj9dweef_>Y2*si#b4FjXdDA+5i^4B&?by{-zV z@TB;pNdxV)&7diOg-lU_f}Ec-`>PJR#84`P_EI%ado>S-zfZ)v6;Tmu0lr2!F#HdJ z5qVgF4_LlZc+>}e*lDz-cG+mO@kIehi(B-akx(LBaA;A`<}z($YNzA16Ox*SmUUG?TbeO{O_Yy! zkd<}t)xtl?M(6ZMpRe{#dm;>m(1Se|@z5MsKzSw9FA#rDgxOTYMYZIHKm&KYc~lzE zjB19?=<-O9o)%+poAos){T7dnj1Js#2!BMFY57lFuoa%{aZ8mC0RTK{x0K^ujcixi_d;Y zXu*|aXSsXP0MdF(&%>VuDPz=(LbSz#eBJDjQPQ*`(GCvst7zl7_jX>5N3iin-y43|2$FSWZ-2GNrzUR6yRoHK%Jr0+wSuAK6HKk z*g31dD(R^uF%nsktEW;NL-+^+40{mjwq|uE1s$>s+jChY&li!YS7$x$u=*ypDZV**2?qTYVo>wN)Q-4l~_C%_SXP9eteT>Sg z_oq7rdUM9~2?pXcfRj`bl21R!+2@K?vYK=Q{sUSY=RwL)7HUZ%J?HN%#Qm^4e{6u| z8QG0J1I3}C9&@THnTCza zi&-8BH~6Ep{QO7L|6=%kFuq%2)Rod11GvZ#ML?U>)&6*K z6yNr8*duRjFlU}52cp#Px!$*w4Kh42SNm9>r`9_30(8+KHaG})R&KtJe~H0k!#R%l z=rwQn)s#WwRm}a(@|silL%ri5IGNo|D~0HwA&kb$8EEc)Ts0PbYOZ~1il_}}@xb$y zALQ7vL6&JJ`YCU*45t`w5uZ7@j!9p-F76E6?Wc%$bvR(xHOVylp@wb1TlTX{-=V|% z^Rz{l2B^_hKZ>lYa;mXnC2+7M#7fL}5ohTPa9?**4WkWrx2O zc;VbIZl8#C7gyh{GBmpgLXx|+7gFNfiv(&@2M}50W6ph7^f{h>cLFDQJxl%dNAyb_ zKpj98WCOPJK8(7q=5hx`t>A{jrzzRJ3W?fsr{pqf&CzAO|-?v(-J@If#L_r zsxz)-Fpjf;bwZyUB?QrgmMrgw|IGWSV4fG+auuZ;3|`K2McgUtR@vd^3?}75DcOG( z22k|EMyb^7Tdc2RPZFj*Gqs(OVW{(lk2RiYt*fV>sH4oDbu-lpbr_3a^!n>OV6ocv zQ7rx022TDR--iNm8@qVmCh*i9D4A}X$ zTjTgLueYl*-Wf7)u-gp429^OpKf}LB8O&158~pBIlQ-#aN&>~W#C;RX-_p!ekI`f& z?ajLpN<6}Q3r>vt>B==V0n8=hg&2dSCNDeXyM5cH`pRnX5B{q#n7Dwa&e z!5`rw$PB9uzvG#98&(3%Fx7wy0Q>-fa7udI@h{*PcM%F{JgB1NoKQ0Sbp%P6ymi-H zQ`Fmx@Vzq`<~$0vj`&48ov{xIfqM}w&3h3n@&!gDJPke=cKrDf+ui5To*YbYkDKa+ zwy{uD?U}GBwyWeRXs|N0Q6rf%eeRB z6S#WIw(Sct?ZJsN?Rn^61B3o$)O)KH+3a*tJ9ctYO=1Q>bMET!61w|_)I`nw*#JoV6c`!_S!8=y}mJL%}B0&r92N5m%1;_cX9hX|~x93){+UaJWkLb%IqJ ziHGP*JgUFb?X^ISK0F5`8}0fTtdmoj|2nB1e#A=H|Q3fC^G{VNn1BsuS-%Lad_ zBdue?b#JaXC6{NPi`+r~`(xoL-77{?||{j&Hq?R znV9~+^{oCSboy^St5l6#U{pX3x!AhwJjRw8h6dqAppms%)H{>4SH|H^YSN*Hb9TIM{eXmQ@4&xX9yk>{9B})rx6W80&&F zwt0EjcSrBX=XT|F@8);362_L#bB26n@$tOpcwua%=~Q9nQR`Fag&TmF2Qr?zm^c+F zP$V8V8iQ6;%qZO=gDheQx-?yB`}_|m6p+9*EsW%%wjegrA&@YiC#fK(h!i^KKI+_q z4r7*Ld2GE(p!nKa$72FEZ`Pf*jDqMzY~`<7`p!XP+b>Pyksi;U0NIhkil>PJ>r{n2 zg4cS&bBn5u<;CxJfha)bOq6P8Fz)^rbI8L#9f@+r2i5_(L(Uv+BI$90RQkKS7mvmX zfb|rkh7w#3-K!WUt5msy=srDxlxn&??XvGz?|r*UA*8)(fQuJn_ucJsiXMlnuTPK; zp>c2hYzdTGXNxbi9{b+Nb+4L;I)NNCdI=xbQsUp+->2o-(j0(e83po3(_uY%ZRU!% zdeoc>hZVfvJIk^s4OBGl44Q39%0HCE`5;=4AV$&9;SaRO_$0;UQ-F;OE_B*-TAV-^ z-@6!DK4(4d6wNZU4#OeMQ*CcJ6@v$Euil`uq2uiEFl#YoAMclcl~yp5c2(+an3;VD z_5;e>1~fDlpMU|6C|z|fcxa>2e>QBr>p*4XVfXApIeJ>4jalJ~;c4ydZ1eE7Ws<>< z4T2K!&p?A~`-l)@l3BlkweUB$;D3h+TZ$_$fx>%OfhdH_=;pxPlF2#*_GQ3O%d7IN zjc1YT$Ub2`FY_JkyLP|2^^1t=0LPP&9tnzj$VHgl-9`iAQD*p&ekbZAQkbtHNvIkq zFCO~dnG>GEaw2Swt6qBtyIPwOHD=xGdY<&YZ2_c8GDekUSEJc$bXV0Xu%?b@iJH*iD?PFj#Bgq$KAe4GxQp=YF%KQhMWWWP7&S>20ouIGMoz`p^F>b_8MM`WG^8wJroEgCg{N zdxtoh=mnl{2X6WwEtvl!l}sJ11fB)1YfY>I{({0RFEZi#AC`%?4``{K&A{CN$^9&P z4N9^I)bzhH6_hDiW>Wbpj-6q_NJH1~IN4{R>qfp~ALM`u3#~GyubXxh$Bf2uzlzZ) zFJ-&A1>aCqzSM2i+z6&NY=lw6YZxla0g6^x9^RFF$1N96B1cE9!>q2rZqbB_{$DG$ zjX)@X_Sn0U>h<3%?(aiwR?XFb3|;S_?5HO6_oyUX|74^R-8>rF2#*wye2}Oha>)pE zKBnR0U9v^&6Vus#Y0Enp!~};>QD~)hBa?utfsS9!rS+u7xV=g!8~baGkcPLTpUW3W z8|+V1CTk&KUpsm}+KBi?KiU@%y1EOvi4*mu^vW!uYUJ2Q6|ab0;L{oa_V;cT*Bu0m zGg(o&VqWu?IZumB7_F2lABM7*W9(b)ES^+^tju)i`K*e)1VCg4%fw>Qd7x`nE@OSo z2S#-`-pgNX9_Q$b2)A>G0JiUCRl9ksR`lEA!wAix!kOp>mTSWt z0w3Bg?5x`d${N7n(dDHs=lp)p{f+71A3(KdTy|dFlmtHT zRMqzue&EjC<;VnEEw3U6eA`J&O&aMWx&fcF~E_3F@LoMHGuj-FWZr8Kc=T$#QE zgy)(m8`>&wAO~UFW9-$SaYYQ{@8Yr4zO^QM1N>mAI#_&{9OR20Ji4;Q#=wN z3a`-GR2++n1 zRR_fJj7?ye+*{qcoe}yKmB9c#PTcDI(wEGr#njN#(yO%q9KgQOkDI4ap3U|VTwM*k z)G>>C&%Ml#;MjexIx%l|2Ak{MZtGs&5Sd#WI9PrnL((%z6b82^#^GrnuJtq3kr(XJ z!B^4yh9@Q_2B%?xc!2wIN>ciI0Vri&Tme674PRuwN4pmXr@K&$fMVe1W@gAZMu!hidI>2RrY>P3RQ(=a=;So{M8YP{&SS%|D*J z)%*L%^N+{okL%kH#}Pp64S@Ifqa9zAS$(zR*#Ut220Rk-&}i2J==3O7rk`A3(Qx(L z`oDiNto(m8b(tWw8-FSRi4Nf1*8yeS!B>C{iz8yoBWQNz7Du+`Pjj8`c&&k7e}Kl;un&WW z-npeNb##CTT2@?GLA}2DhJgqpy8|yOVRw_W82UE*vCnEzkB&hAKw>{AUx97Fg7rIL zkU(fZ(c2(?H@+l#KnnZ4VWH?iNuSZHK!W8vVW2=sZ_#=zV?V!ZvC(`BSKuOg=dB@% ze+pV_v6BEKu0RS;9G=s8&%Yc%{LXvlX#}EoPT2yV0mwJju5)&e6)gW+H)eigI&`1Q z;MwRSo(UxM&cFaHo*})D;J$5tChl{Y-fDqAtmA7-Asy>K2hWm2-t1m+20jsAQy0$N zBw~8=J_xwJ7kJvZevq%1hV~I(*TZ(kIrV=To*h|0eS4Eea(?dJ;tXE>>ygaMzs?Boesi9y+s*!ab+7$*tL*|{ zzTg1He_ejcSNycY%4}unXCA%3*nV+a{qzF_eESXL>!=p?vjV9AVJ@~3AGXbu^^gzG zZM$ygw$;v_X1QV~2(4bMuW0WTmw5y;D+N>{`b=sqq^C8aDPuX_2wLZRgW8EI>-gIO zIAmpVwyi{TGW$N6l$=P_7ZhTohH98=9zTG?M?ID~hz{@u=@jmj@hiFvNBrk%@!TYH zUBKDB#p-6ugdBP+?!ECDt5ehnlnGFF`&-@JKEO|S8hOjq1E zIV15K{)j!=`)N(%==QW{ZAxWhr!%S&@;OSJu)blm-27|URq@3B><1bkJP|(f+Xx_M z#koSd=#SvIUqy7Ig+_^&zKTV($^nDMAhweM6Um~wR)q0uy;XJcjI?i}`hY6K*NA08 z+)?pt(`VozrY3FN6#?Vh?7*{V3O{E))8d2tFhUNi#)-k3!6nDbpYcXppmvAV)@MJm zS7HF9bKG3L8=oMK;#`peZT2etW(W|J#5X|EE$xy`Li8jFl|Upl$Cydxfgq4|H&0RB zZ47;J94KCScOpHLvH1E`XN?0n305bGaFwCs;kpQ*PH8Oq-T`?q6!e zQvGJ)b!qtf5Wj$OZRx(^DFN|aAR^rWIyQwy5P~ac@m>WzP!PO4-lIu$dJlk+D#kHU z1I2-&WHA3PHN&N#soXN>omc% z{~)I}iwIppok9hRyT}3w#(_MKgjO96r|&B%q5)eboounlddtZ+onx^tt>*4h@yW3z z_)$Y1{io5*Q5hg29WT}uCkJrS`Vn<74<&6qux5cI$GMCuyKS#V4w04*7fy5hD@)~Q zUX|LOp?)`_lRD0QtWnEU`>Wjeveo)%y8qQmjN^pM(?f`3GGTQs@2ubLATn3mE6Kb7 zKGGXHBV*j4v(r4zml-qG%bGEYu6K`e=c#i$f&Q@%@p)TqFE9fyzz#qnlDUCpESWRF z_GCjhJn2RuK|@wB2{(W;haR@CH+Gnyoikn)_&Ia>6-KpmmyVv$v$3OD%1aet*8^id z#)^m{57&Ii5*u}Fvx|DU=~}ZaEuB&UY$d{OM^IJs2cvw;OW8X#?l$AKFP{+Gr;|}E zj8Wht>QH|}oN}c-s0#2NB!7HQsX4<4>%>TPvjezA2e)76c~D=+B<(%h#A@xV|>#8NGIoJ%CE$gV?+@z zuM}6KbGz)L01kD3n)8ujQakjE5#K#f1e$g4i8%y0eD@M3jR%13YvWSuMXB%=V^Ex@@4;Tl65P&UH>a}sg~{%*NfpuJj-k^$^lR;6wPA)F?kgA@ z^lFw9tQt^mcTUrYk706y$v34T>?OE+2E zusPkd4n67)81x1h<4}eZR05BthbebnWdvJ(&x4EA2Pm70nyJMJQYjfeIG0D; zAx=*&>KBixdD-8FC#vrP$U6Hlo@VU(=zVy@*@z zh3m)>T+Z=}+o|R)Z}H=>7-<_YjY&YbmJ*H6Fqfm*_{wc;2oW0T|onht!(*xogW2~wbEINt_b>kXPXo*Mjz?bNeHIHD7S%+vh;(7gS zgt>DFasc_(7;aid*f}`*zwlNl4$IwD5?YVj&`&_Vj*KIdy!#52@{8xhX52#4CT}3y zhY7+vh*C`64}?R?&% z^RnPzE7V&)jlbuUiH2YSgfc9m-EPR)@;t1mA0zIX{lD=wkd>2)%mC_hy+`8M2X;Z@ zNM?fXNw_a^u2a-rtCpl&au|f_kc>BD(YHnloq?hc-7!rG3y04@Y(o2X3TuF+ zkak!D_lpXoUlX&}4bj*0441emOM1P?sEtXj!p-YAF($QZlaG(lo& z;&-l86$1Azi5zmO8c>v1MZ0gLD{pw%@2_U9SD)sq=h_Tpf=#n;9^U;QI&Q}A9QvBu z!SQkS-g=vo@r6=EL*qLlQx=en4zGX}vl6-5jz?eb(4CfV-6t~U^4m&oE91U0OL%YW z4?|%_m)*h@9-m-O88*GMVCCer=e5|G<5VTFkl1$}ojs}~?a1pk&wOswr^mKVcSnIG z7g0$_0!v{Zw-gHI2(&`ezUmYOLbs(5s6gFk|4nSQ6@yzRdo1s=hM!fRer2_;B8MB9(RQ z=PkR?M?&E*Gj5-Q4-|J%`Dlh-Li3uTm>w$~^7KgN+1i&C9>G(L}brqKX5>M*YK@0yGLYKZcUXynnB?aOlt^FiN6xA5{VX?K+E z>JHj0d;**H56*ex(-}y^YKh?u3vitfwM8p2jmku0j|W(%acqNlMo0c3iw4k<*D_>_ zC|);k7v;;;%Kl`xIA2I#44XHt25QE^^u}F-8zA|;9!_*S3}S1&g+Tz|7HmrFm$m)1 ze(gpz@AHTQ60@ss&t0Tb@@<|YFQo~Tj}Cu$3U)>tf#m=iW+SWTQHaPys{&qveJZ=t znNyYz$5CEBlFFv@HLfkalNyUmpH^SQp>1hsK!T_D5)bCuBQpB_^7}`Q0fGBaXdl8; z^Gu2Kvy|*Wkd#;|!Cyc<;>qcE_M%b0bPB;tYPrO5Iy-%kqw7F8J?`_-LJDP(fSgMH zblwR_#^mbgFk=MUh`WWU^(l`0x&&lH$qbFmT9T>S0mmN=8z)sW!s<}c@@l7uGfy1DWTEAm#C&M;M% zhTF{m=1Cqc5`ogFwD6vFNEfY`ge^h`2Y5g9ugbe>g4^)`Jk{Q4c7*($ce{JDWFhY{ zJWceu_W4Ev8EZgQ8?HuR1fO8vThDeo6XxeL=8_L4890`q5|Z_D2wM8%l=n36p_A2S zXcqFJR8>NrCz>guQ8>hQK_xWxa7!GSe^=>#Din;h?JB!1<|zfZc|oxL{||UThrbe4 z^@ks4_AW*O8Mj3~HC*AAVW-(BQks z+wTT+u_sGNeB0+B_SOR7DeRRMpU~XxEvcNjPY5EleBVCXmf!cgfOg*QEp|$^PHRS) zw_VC&wtrsfJSZHMffO)qIgVu(KE5*GXTCVVgOl=Aqk02+e~)sr;eayVXyZnE;*o{% zRF&ox2qF0^J!H+Xx1RkCPD@gsuMERlJ-(RugpikTrjpSRBy2lp8rCDkWh^Y0D@MSb-&74!paJ1YekiTm@4#GzZjKZA4wP>0=1>c3`;z5p_cQ%8T#xeRi&TeKxKhF4XtXf2gjXIAb zagiJ(jixe8ZLSovW}De<=mNOE6e^OB%p>p3%`8=N>JeKWlRyOKO zx?gD=YLOy$1=t=VQG3GbS=7&99EDnQ`xRn|BhTQjP$VWA+SrQMo_L|Ru27RalhIF7 z+c#>>N@gnoA#fBhGQ2AMhj3cYNxk=uzGGmI;UoalGXT@t7l%V zuFW$8WFZPQ4abWPM9_eVV7js7IeDv)$2swf1krnsmv3vdZo~T7&e{DcOZhUE5>+TM z7r`XJ^So`#=%(${6Izg%(u*JxEo<`{@QP0 z%eii!yb7AL?I~v}{;KVRxpKZk(@{W|!goePTBdZgV{RkhvX+nK!r0Ks5HNBo^Vg{L zZk?L%^z)HyxHs~YOIXxw!o~%`$tvUd(FytSZqoD?uDSPY8op2< z1jBaHcZ6$m?Gg)GLMu)OffO+oYD=hN*kCv3+~L?(EZl{6130^EQ<@NsBvh7CTK=U$zTcVjx{Ve@mWwo$u6bU!BpM_*{6X=rQU>$tLDGH6t;$ zY=|JAY}wf}{jgTBmoS$>u|qCal_IUufT^h0L92TEHS<<66u&tC<)a)%6d$ocUx65T zX+OTAaDXgs)X6UGyeP}HO}CGL^5EAr;cY6QN!}KK}h)vNfWR(Ht|tf(sN4X^Pxr-e28?Fuu&OmNZZx^C3gVo8ha$pH`H8 z<*wB5xKg5!n1Apmojg515R{DT75GM$i$0}C5$ef`1A)2qgq(4u>*Es?(|fr_#u7q+ za`bj&fVNQ=vA$=_2t;jRhU(Yme;;qMwI`=FQ+A+{>m7Cud7T$MtoSi3@0v*lFbO`k zLfnP26>5Ckt=KT#$`9*?Wdz!a+3%ER-_gUT5zV@*-i= zG6@CS9+2egIys3{8{aT6}RKi44KtJPy4DDk;%9^KyYxiqRHiFzGw z+mG#f-E>#!D-z{fq4C)?^>XAatgid?<%RJW=BHP)GZ#E5aIv;i_L&ME+u8!z$nS?x zyKX->pRRcjuv4}T^SvLLZ0BD4JkKe8S6w(`<9y~P69OR-TWEJVe{+`UUJ+Sk!t_-y z)3Y=vaAOcdCsd>1xZ_MVJmgwME8lt(DhtSS*aM ziNv_2c9EV255!X5JPw*^AICS~T*bC%OZY<6WFLiw?trzh+Kl#cY;9Fau(_Y$tQ?9% z0uv<#>f(twW-=aip`TYb6{+#oRNxFf#tBw~qkDa_Xe25=fAHnm2m;U}_leIkNyLh4 znq=M=rXc0`%`RnCnah<}*?1NL;*Pz0>>8Q@$lp2c7wi1&j%<)r^O+0%o3@v&{9RaZ7Di!Z?-#hxLAhdw)ag2Lj-V zPJ(rwirP|{fA-9#!u2n@xE*5BkE&)Cy7yX$B)-0dkeb!Qn8rpkuP^cv3E zJ(M9+RiNj``DP=<2_Fmef!}z>Edou&L)c=2I$|<}Jh38gos^#-BWSz>^ci?RAJ#@! zkMx4n1wH)z#hJI%vUy@~hjcUFzGIpiSe~++84ZR)(v)!WumClUkHS_vN_{jzjzSULA5i}ZuJ%v{OEQTiTgsaC*Lxr!? zUJp`cEm!g+Mcm}I)Nkb09M=<=GPmpugwW7 zCskNW*>}t{waYQf?2Lzjk-$k|k2)@zDtobre?<(JvO$K+&*BFe_fBpWa%9CJNcYPm zf4+x_=SBMgUNHG%$X6|(UCP(tu5ZL?66@`3t|xdn;`r_cNF31$v!{%P+&2poH!K1uQP-Kfb$UPf|?r5l@0@mPA_j_8$b2?xdXe8)}N$mF|JI zsVh$ms#=(t4HQEMapq1M<59JE9W8ndf9&LQX`agKk01)C0)83i8|Lt6(0&w;bPSgY z^t-vU^ygsvHL~&jlt%SE8U-|e&&$sHDYCO7H?lq_oDg{33Mx^>z@lkyLg#n5@dwnG zi!ZvGPzEc}g+ZUmsI+sbQx&4k!}Nif1c?<4b*i!cp(JkRt$}zl1eQ_$Av#AVe{sI* zpU4Z?8tLWcm03`SgcNY>4yMwbJz?4j&Ngdq?s`Ies80{wj0nRp9BXG`^hhy~8rpHW z^8JiC4%mboe;k1hDy$#O9Ms1Ler3=s7_4_8$m$I~SFh^r1&9oE(NIdhwc0{7FMChkj34A=e4?#sRVh$S#V?qW*D+k@Z=(>YQSO_N_GogJ7g3SAIV$HK}QMp`67jH{ZLI>aN&H@Kc^bzjEx@(#N$?PsF45VBW7`^(@|KFcPa&02i}1^nTa#GdVtr?%RI0Ye>WU|#mz_(&Q< zt*l230#W^Dng`-hhagXUe@aG}B>|N_rm$d)*>fz?@RFimrAEL=IipoRb)!}73QE3Z zdup7LYdK&R6riv!s^B@rh(1^JTtz z@!bqw0@Re*{86ti^apCiT|qbZ&&@!`S1Ckrbr;{eUxD}fNkuJfyM?9s zBe!twMA&%Mkx%eFNkl`nxihaXYk&^%Q9(bl$C<+-rS@M4MIWH z%bUgr286G3f4keNQvz;MQ%HK$7JI&!aYk=4M*DBa4xJ+rV4x>=Dy zxn~cfFjrtYr4_E)v0G~@DwA@IFYjh5CmIc|1sz)#Rs9G@&X5}nc84*}YY!VOJXlXS zduTM;ld69vEr*kU_hoo$jv!tY=MkEd7uxv+O`wGI5Jr!>6W_!D4w&AhXv%Zs2pev|}ofKRf#| z+*&cJ_yh*<$I$XeK$V7OJsC+rPo6%UvlA&MSKz8iEwim39; zQ6)U>e4-y{Bj%lHup1R)lg}+G-Ku z&E{Gdw0$1Hpvu)bSnqhtOrk)S63$aE>_hSzb8jm4A zYV^*bB3TicSEjYb;hS)j68^S4D)g8M5Us;X6w;JFSLMc|Z zT-uLCfX8ff8V)z8AlRG^y?sD(o)A_=9$jn3{_uXR=(HVgg^S%BC0~Ya>Z!bKN3M0I z%1$b)b+f(M4{yCxsCY`j>SSN!?O0;dNs`%Co~b|^O0%-HwU&fHrWM|0(Xe*oW= zJ(%Di(bY8bZv$w$UyWcZ&%$GC?TQe*iTy;b$K>9h%QQ90>3|Eh1Lj<@d3?dUzj#&0 zYN2N(!$h^+fAz8ou0KUV2>Tpv4q*9}jKp=cpSBs1>abTk7Reg%e7y@Y%8wUbq4%2F zIioRy@80UBm}xfy2E({lSI$5~f5le|c>%iOxfdnLOAP87xU{67tx;>tNaHg5n(c&_4u%uH(*N=rNu~vq zx*fgYA~g+LmwCp_u-ntrW`sHqrVas;Pw=!p?%jzQUZOV4ZEeVj>dYyle{Q1fjy0Wq z@SnAfN>`$vfqnhm|9+saa9t@WV!NRK{TpeBKx7ZZG5|=zu12dkmYif}ap0LRSCD;F zrq|sFYU~E}mnbB|N3#ZG=|~ABIZFj!358vic0m6`pSJt?GGbp;7##pP`EYJHA;(co z!lrbAv0Po+m)b~n{p$yde_RJC(^CM?gD-GWl8s)6SMU%x92WI+pKY3>&LS1mY96mW)5|{A=-AV{Ef>pVu+bGxV%HLK~b%TQg_Wm&{G@bDwCmUzN9f0!vIoVp3J- zqhn8@faD>qtVcVKfV8t@XyNCZ#sPILQ(sZ8jpw%`${4GiPl2#?e;FTOr9Q`**6`3P zeh!qis?IG}(DNI4=X6=N!g^_)yoP})pK;bTxdWw#+GA3# zAFQfgF!q5Y2=W>dX5?-MF`l?f(8z^Hfo~2?1QIRq9?5Eh?c@2Bpgc9@XbgH^#y1K( zi*%i@oSZOIGsyRpe{??SNv*tu_hE!^1}t~nU#amTi4YSPcvx%`Rz2Aqre}*_=@{(H zrZTjG{q8GNlD*&+GvnzTi6Vz9JtCSH{U&ms32)OfSyduM;#!hRr1(9^b+_Ti4LF(# zvmQi;pBmo=qq;=Pv`Z-znkTS| zLS=Pds)MWKb#7>M!e@de#vhm4ZTltt17%_C`zvcHLR9-DIoNVhuJY&&t}e?#1nfIl zLU^rUSl6ZKUVr@{E4{BG#NhQe_n%ZMCX2St?C19+X_k;wA+AQNa?tRqS;Sj)J|=zD zJIIe(kEJB(f9f|(LGQJ}>;0_YwMOdA)HeG~9eqUad^p4E%K5_nSip@p3^_l#O@3_~ z0zi=?RDTnUhPL%H!(uL!DI^q}Kw-?fDB~K+p^cBTJRSv6QXP?;bf-35#BC`~5>BBM zkwoJMA`6h7GUaXdNPKEAUK9V4(_;Zs_}03ZiPk_PfA)P^Yb(k+HZ$89F!I~NuCALs z3sW4;$6qavtxyQgOmghnRsB;2$fh#8(N+dBAMBQAbdv}nFRb^y!ae-S^aSiibpd_e zQtaei>Wlkzd?%78l=KdEJbSFo0iaGsn=KBc4Sa;KADGxeNTT9PpAgyAzfYSkmMtZR zFCHG_f2dy0=mW_R(-n_BZQDMTdh~9LiEOZhFQ{T34(AQy20g^-_02+hy&3Y~8$+6> zWrK766n?U$w?0Y-M6>pnAPYencT_=NL$opt^@{p|1{1;e8ck=i}i@>%e!*gB^UQKh)+4VK_( zsOj-0@oVRWwlB!ixCTgs$;VAE-$fOge_vudCX%TaR{OS#ptf}i&@&TviMV6kju-8> z)CGj>qu514qo>G(l6}Sctc= zQ>0Q8OC6K+Qi}heCdpZJJgN}19;;zR*d$(~GiqsUGtoL$vS_D5ZtH9F672Xje^ikE z;yzHU^Q!e?$3dE~U>J|+%w6IKcCy#E+#mkLive`jb4TXGl{S{*9_S9t0;$-6aOMtk z{d6z(P}E4H=&HiGpCIZHG~-8?q6V;BD@b&P-`qZ)LB4I;(sWzSK4wlF1=Tg?%yFv54S zn$29L{-0{`Eo9)hZY&A$I2V2>00JEzsF1`S%0^8l3J&c zn6HqwLviM`OquPzOlz71f4xur)9#CdLstyV`WIP*0d-f4&P{B$Vz&!T;p@m#Be4(P zE7OaMCEutc8Qv^zgxY*DWG!JSW_W>=P8WS5Gg&mK58@QmV){M?hoZ>UHv0AyF<)F% z8h*GVO&#Cb?Sz(VZ_i}(JcLR5jP_Qop5$dpQG2O;zZf8~Yv$w7L&&-j!= zx!c)EK1gVEFfOfHp2D^6sXcITtwvUQXp6_~Wg$07XDRudm+XzJ%fa3NY-E!6e6+W< zcIav~Ej>i+mbz$2GNgm<)@Bd^5zz)!)x&|~XaFc6!x_`@gswQEA?8{|^Cx5Lo>x*h zAHc|6e#qrgo5LARf5L?(f<6CnKapa5AbVhgDd$SVT_;hF#6fa3$hk9jbQ`CnRbCZFI0rCZa8g5f|KpaK_S1)*;mNwV!c0 znln1^!#>6tz^(j*Gcu1oQPxhS<*cE9Yiei2jGTpt>H?vPe>(2J`-N83VR5(>DD9o< zUA|+Y^uE{`K_3-s%;vPVCKnll`#HkPR62rCDT%M=Ku~i zl?+x85`frPE-u&TUgMJcAxFmLlWTTx8K;&Mo;PSY&2ONiS98LDOxkB7{SkIoPQYSb zuhWk!G&SbSf0}`FXV3DMHJlxopB@_Aj$|UNC`@hq@QAjCy;h4sKX!_jEK^Z2R%je< ziGc4o8apkahR*Bto$IsXWJH9gg{e;`%IWPTrzg_NR`-5331gwF`!OX^IDItN_lOPG zO9x2uW&N&YrUh6-->`;7%mv+~gFRj%BKoKIqa@}tf6l1ON8VUn#)BeK!foQrpX*h; zQl#cfU`Hd~=NrUqJ`7(qw23y}j>iubNkb2!D=0TvaW)T$JsbO8de5FAXVwniKiBGbLQnxy;m*RdFK1JV(XizIi2ANw;!mOAcM^i{oZ*lq&* zcls{d5&9WV77`1p;=XuG)QaMGn}*nee`2%B$lwua@zN5Fh_9@rp?`gEpiJh!^b-g; zr%&69BplIJjb!59oAQb($+eBUen3>kyUD6TuEUHHQqY zm!jE2>W<=KWd->9u>~{mIYG48kKiJ8WBHq zdtdD&585^G%GAm(9f2utT7t|R3+mvLYQz1HS7>R&wF%_TlO5ae%6ppmjtfF?6rO>wF-RHLJ~UGBNfLr^#bHw`4EKVU5%Vedxx4`tPB2IlMO zvO5L2)drl~xswwh9(8rJuHn~^Jn^I-y?110-hkX`?r>v9JNi{Vb5UPOf5IZ;I&v$n z5f|z@j#UhtT`bsyBSj3VeRLb1iU`IGDDp10hvf8+5Px)Y%`du#EcanQy@j=49`?_6 zn(rE?v*`b(Yz6avrMET|N&+TJRs60$*EQ)|5jX9oJ{_uennca{xQ3vYlb;D1Y)9WR z6qHj9H~Z+wuB5o+pfoUaIT4WkjdYL}zd4ch4r({#xK}EviWV0z7x=FcHK$(^tx8#cT!oB&# z``h@K>x4Zhvfh^7w>@uARSa5oGWZ8`^KJxhwHwEbU05XbkiFf;UsR&q z!%!@vmvsV{LTC9o9nX<9=e(*qV$6tt;@})}*D<|GW*;E478#o|)>FM%v0hPP9Su=N zyqSv(HTEcvckzUr&I*ZaKS{46a-J_&T04ONrD^at1*E1uFg!rG|J0oBl!DQ6V-=hn z2(f71(7YvAzY5j8f60SkT$I;2k1|IVtOO~)gb=s%K0A4x4` zGWpg;wj}`!>FyM<%|eOf1K9{^RvY;Gi|3=~JVn|4=TBUaf3=1w-toh{MXOnv*uf`p zjU1V1S};@I>;jmLG%k*@W_zXN<8frpxzL0;;Df-2Fa~xXPeKK4{j+(0z15^f%uCsa zWM84w$ZIb#WsJwWtDTz}FHxZq+M7s*$qq`cKAIqe_QolFPQE8Gx6Bl2+Z)@Od%tkq zf-M@og~f#ie|a|s`-z=3=wKCSD3MHv76|i(t^Xh;WyK4&Ply;dDnCeVDjp=J*RW)0 zrUb)BsmC5LI6z#NSx~eFiEZ&vOr;?*=DM@a=o7-3zEc-mt%Y+BlZU(Ckodrk=tf9S z%^&iJ=P+i2p3VipH)$D74on06^m{)O(}9${>AexAe{#LLH`lSm7LZ6uozuikiAL(E zgoTTKu0gb$l9qSVn_gpmxBd>!RBb>rjcu!b2fsiy(s8i|m!-$yB7Ac&Qe+;7$?Ok8q5?*}Wub-Ot-^~4bp8xqHaEHd{f)0@Ubw@6!p_sZO*|Z~1lMObf zgZd5Ifsd)q@+Xw1=VN#&wsPcpUepWn4k@V5VjPH+TsCzKn4^OozB6;T#_#k1=Od_` zsFDbpeOC8=g=X^%k@kEr4RRCXsTjN8(_1u+fBKH22kC0?HJOY{E^GJ!W2QO{I*RcwqH`9R?Df8jKfg>NjwAiSmku z@lS*z;leT?LZTOVTEDv66rm{_sH_0_}BaU_<%wUoAAI!Us( zwi^m_HtZVNVTjIJ#q(59!ZdrwKln3Aj}wB`80v{SsU)|I!7UX>jMag}-U{u|ME!c>au$$+|EF7tLqwBF?}8a$_~xMH({lVoCaa<4pYQNk1FnVbPXamC0n z;p8(Sl$u$XNcOJBC)6qY)L-e|Pb}!Rgx&Y| z#}6(0goKqLEn-miU2vi$R&mfTf4Gv1lisF9jAVAIW^-CX+d%-~iGsJGeBH#EQ|=Uk zfL-#G$5GnPY}s^b8HckmnI?h3YOyiZW|LhnL^7Z+o=WV~lhAI(eJ_Z36@tAB7I&#r zM?XBfAT5VJ5aM%CSb9X}L#OQGSQ9r|x9SFQyv1&@q(#%w2O|gOY+qa4f8@yd{2pL| zggy?J-rE_QDFGVW+X{M$KDauZ@+^$+nbF#=?mIoido|X*5S`AD+*>Nt8zc{LUE#bN z%L1RJ<%Gx>57WTv1-tkhFWCrRM2AuN`x(0hD`3UM8{x)rZ{v6`SXi=eEXv;5qlmU3 zB8!Hhm@qMToJ>}cGS{;4e?>0{lqdPY(GW-Os&U9P?)VES^WdiKUYxp-_j@d#*g9mM z3GNsrNq|UwvWW($uxEU!8(;XZl|2}jit)6?3RY*r_V3;Xm*C^|dbjhTd#xsgDpt`l zc!^QP-Fjt!gyrF5bX#}uQ8L1I`5(Mg!T|4K!jL%#$A6|0a8XDoK9UXS$kc`pa5~7(&ZU-BOYbmofQ?Z;#|ELzfdTeJ@%)g-!VkX4Th3-Xa5( z8v5H`q={9Q7cObADp=SPbB;4Yvv@BDnSvBO7zwsA(zS2A_almK%c zI=GroR;r}mxE0S`m=(0;PEW8SvGzp!8{sNJTsktbf4WAYvk_cGLF)SL9OsAvxhj%~YgSdJrpwXd3C1ouZL@PdQdMj+eM3Z;+E z%3;|e;!LNo@3bOu<_?w`pGJG~RjD{INPZL{`RPMRlxQRJ%V@6UC_<_oeyQ8O?i#db zBy}9=<)u7=+@1-rbBhyB6~red!r{5=CPISqf9h1(L7R2_f=C-s`JoD`quxYiv4!r# zded_Y&*8+v=f#I`d%S9~Txct{SuqQN(&Ahk4$ZuC$8+_>T`#VA!?+CiHN$CgdJJXC zg)T>)B(%x7@6e!PaW&p+^|y2>BkbzSH*jjPCh`+2$lvo%)PeNhjxl*3mW}YgQ;0gE ze-n5|(Hv$kF7+IAqTMe9brc@m+YciZ+(uqO-goA9qa<(!&3QdnOE3eq6Gi2fk>Fjj zf@!-nYlJA?rRHBliM>nwOy4I!pwWUQn7f22K1`#O9@sRBL33CGg7si@z@9v}%-sL?

    Q73GUnr;_w(wmvKqyjUq6||Ufgrva_I|HGc^N>e1((ue% z3W&S?#Fm8OjiZWh;H3dB1(4??8!DTlQXJ-(zd_C91_bv$q=9^g1A3ErTXOdaNz9Qh z1+tEzb_l%(c{h|>8yRbT6WK@?AS|ZSnyt`y!6Zj{;SFia0t_lhtraj zW@dM)GzJ3}8#~6B{j=OW1UnS3Yrg)ue>9Hdf+QB_K|8DJe02#gLOrx6*%s`&^INQv{nxep@|z5!FjROKZVSuDfy&&Rg)+Jc zO|2|wMxU+Jq1vB&)3!>69lJPdk9sv(wD>2^lO(4lw2 zxSQj;7kj^FjKCV%M#ORMn3AQrjwalGm1+s15jnAj;*c0=is^`WoD=(BwAMD}Zk z`B+yxPMqg(N4kS(5wiF*L;ZhdQJjLZ-P8B%@on0l3$v6UYWz}NZvlT4Q4ecwN)O%XaTiUy2VUK^X~M#{xe#WsPv_xh4>#sF)$ zj!-|MvvcTH&yCgHFkkdx@yJeDC0TK@~(pGp!Y zywpMWO2eY5v4$_SELZ@&v6bsu1B;c>@`T$HUa8QtOq)~~kbxJEeRXZh>i6#hC%9Xo zq4YYORqq%4bdar?csTdK{@!-N)pF$>`v4D-fiiwe#ZV~rNG9_{$`Dqp!xV}yUX$&* zZh!nZN9uL~4NsMne12)N72h=GpS3O>@DFw|Z@VW60(N#hXsZR!davSx%zZK&qRk5r zj`g%V3|G$q#-_Ye+5Uhsn=$h#ydBY3lm?z>4qRZuqBJD@PryL3l8 z8JBLuG3CIy2x@z~7e_Gen|5EF1**#I@#~+7sct--*r=gkmT+=YOVu7a!|PFaNbYgB z#OgMcvEy)(Yz6~J+EnwqYAYJ8UJvKzVtH48vd0AgQNBC2;Luoo%9JJ}dv8GYhM5>u z(vUwztko{}&P|Z!;+re;!biC#Rr>of>~A~Byq#i<5o$@wQ0Q{^--5*oyv16n^9vH6 zazK|Sx*(T<1vru63XYrs5zu(_sFR^ygRpct$4(0!K@TKij?E;UMWDh9UsQI&<#-Yd zcHK_^E~O%(OIdkPIJBtkm@}f=sT%#B_I3!aZqnVpri(6xoqk;s7iB`lxgmCPEy|VT zOO_=ztPO~WSP!Rj>YDg@ZEhT1q@^#3reUH$n(9|%`Gc}O(D>FW_M5Lb`WI+Ob6(p_ zi{QBw=&Bqikl9uYJ~^y5;HYiRTCvg>?%oIhDn5c2K3JmUZMtDOw^Y4x4TkhHPErvQ z$NhLf!b-iyv?qmM-RNeVF$DhJqhDsvUXTMHy z0^$14UMN(R{BMV>F6E)pxnzJv6igT?K5g(KnGQ!M0oP-!WbR1iJ$%mO@xk_Ma$Ke6NKazE5tnuokd1wuUYWvlpmI)J zPc+ynsO}&yv$Nh{xhE9xb@7lY9>-yFnuxI>5Gi9GFhyW7$X-peXQT{CeYB`vB zRVl9WRCpcR18G}xuY%+c9;1d`pDLVJK zBVcBru8roz-+&>tJ%Sp}pdsa?UPNwYY({waq-!i@&`j5NU%6Ihr=LSe`iE{EvVjk!|WHX%n`i5h> z@XtRvOkt*67#aVb1r7T=5_c$lt#`~3 z;k!@3!eBBQ9+~oJy;KCeiqrj(9?CAAKwXKyo?SQ8fN2y35nufoH-Wv#j3EE)v#)_Ku)&uFNrfXLfs#-m~7&NymEBPC(% zZO+?|T)SOOJ)tKbkGQ9<48iEMs91ONHcy#a#AE6_O1}5)_;v#ZD*G`Va<0!-uptAh zpsT8v98Ywnx*xaLaY(0 z_wq0^bX;?dBER(7hHDgbr<>9iq$mlO$Wwp5kI#>uIR1LCh~ZvyVRdkSl$N=!p)WPV zw;_Gpd-_EtmQ?^yE%__*Rd`gWfOr{)MI$LnrzO{Cw9GCS_9zIgj_&f8Y_LGWa6w@n z(UC6d=*;hhxx>vJ5^cMLU;PId&hCg22J61~S$BjZKzjMnDI^C%*bG4%>qO3bBPtEb zSQh7CTw!eY1(bDm6dQpbSAiS=b`W(d2F&Raex*h>IK*0OwYn=;}sLC?0XoLoIU zZQF1?qN0(6L2Zc&i%73s5qlma=#qgvRyY>8{P02qYoR2g(n+0t!x(NHjh^i>L;2M4 z)PTmA@|NR;Z$qU$O!2l|#pRP_{V6j&M$W!*5*C z;34bN?>U1^#1}A?rl+uUEq^F6l8I#g4?zb{-y?dT3Lwr(h2qN}OOZTaP%F#rcgrrs zuEuXd7NYsCFp~A3mor6C1YQBeQ$Gujex1Tl^V0$B7cS%iEOV`Eu02o1#~)y&)-22< zp-$9)zgvoZXdqnw6NCMSkW$&;MDsh*Fxe#o{<|8R4f`RQZ?iTvtt@HoR$|H=Sw*_O zs;r(8VDj@xpp%HtL(Z7(#)GEkRK4@&QgmzRwAgj$MK>bCS98-${;=E|LWsHcrDToL z+}#X`KjEm`!>9Fcj|%toYG>r%mH4fyvUuY3!C}kwRPE8Kg$W=oYchPRUYGH#V?1;o zzx~R-`9MsR$|Fb*enzNS0BlGX*vG|Q3#pj+thxY=4%dgXImpM|M3p2%5`~(hA@&Gi zgLEGsD`)AqWTN2gWs(rC(ew)x0(Y&h8BJ+6Ia2Wg27alnX%dhGa!w!h{M<$GQXn&% zbkasLP7ZUfC@J8NH8B57puJY?2?>DHUkdSUyG-&CZ_ulY-AwD2ucj++T(sa>goG*P zk)#EhdG`-Y6S&f^kXZYcP>aPI?{<)Bq^GR>`-LlQfm8j^*bEabQ@cFU@6pyX&F)O+ zqK{q`_F6`FQCyXaZSd^)h*NSw>BKqT#rYg!sCyBDgN zbU3=*+*j-&4#Fq2r0w%6dDD+7Dqr$~3IJZcP0+Rz18~sCE)9)#Lb<$ zf31Rp@-{g5l&lSItY@^^Fp zdyN}|f-(P=&kCRvK|C_YcwXDR63>yK9zw6E?*=`d==WNioLgt(_giXb!WO3b~7!I znhjWeeYLHdD z*n-D(zauMf$f20K2b+%`pE{y+9pIQ(d-^voX#(r8Sh*I?jI7nMpJA45#BR*VQ6r43 zPOgTM4;-(54uY{vAjZh2{UE#DZPSFEd) zK)bq0{n$5*Q*3`_a$G%x7d>&CN`2Dua%H{=?#gDhjA-i_$Oi&txh_gU$-6+29x1>! z?C_ZfMc!`!rkj-)#zMDQ`QL>i((D+diHUg4Y2##ghn27}dYgl~@wRoFlC zC35d;)$aASdK-wY>_C-f_6Q+hFyC?)_9UvD$0T&r41s6+fO|quY*T@yK zg;ICd1)e3Yve!3n^czIV9IhIceLp}P;*G(;b(^6Me=g03Y0UWuuqf@oQ#OV}{4+Nm z<5k~F@Vtx2kKcx7w7ygRgNDM?3mf&oUHg_*E*;Y({qGNu^}6bCXUC_LR^4{Y+pXj@ z&}by?P0W&86uNdH@ZuA)fMa_Dl;eyAOW(9jw3`B}q8ZHr%25F-DU+t>rygv=XdBka z?l^BoulMr(_4LEJk+C@dRDm$We@Z3Czf$@CXbD}KwsD33sQTSKAm#dQ3%wu#@nu%U zIg82KV(uF%iZr$w3BSTnpVIiADETldG`eQZtX zOu6#-w%C@=3u$Z4Qw_EQS<_8N+TQJ5gj;9TSKBCfglm+fW6h&`8B>ab-#c`Ks|K0E ziGXUu$XkkMqL3dn#!AfS>zka^9?Oyvof0PZHtgVsh_3N;$&^yDG)$^+4XR$;=i4xz zEhoMf2$TArtXjZd9qPPK@OmMTdo=vlf0QjD4>fG+fGPX|rxI#zJ16*GXe8mzK}Jk^ z56!lyNxCr!NQ0oYUH*S*m^a;22OV)cf&sb+Rd!m+)T z1*}@7v6AYOO)F;NaYnZtSU!JECD9@rk&+yKDU$ChPQ9tB&b|tRsSDA&WK*S4W0U7F zxtgC}OSd8EPeLe=0e@|LUjJ2ID9*-&*ujL30Syxm>>*Yd(9v7Oo(AsMs{BiWbWA$c z{z}cs-px`+%(=aI*WKPx!3?$^vI9Vd=|>kq>b`Z5l+p;Zk8%qfRjxmoF~~sU8nsM! zcJyDFYDbAR_9$7A`u&Gl1&j+SSm)S6?$jELADNaiCOK5vO1A@#w%BsFT~5~AZGqfR zJ%aF}PiZ7uXS-ZgTv$z^L>aPQ45e2!#-@fa_5Jr|ZS1vIB3XM_$SjqKC>8+Im|udU?wx z%emPCzCMm?|J%V<=2SUt`4K=7`xjP#lUL0wmrHmq8Y2kW>ad3l;V05#5D9VXLi|}O z?K9!acV#`hy1Q;nU(`4*3T%QVizVSg^in@y6~HryY25isQa4llh~1T=K&+B@rL$f< zzgM|O6)DBs)k877c+Yk(X~$ij;b4h0a3?qpq=~M9hC<<@#xd?>UlRat)TaKI+VBJG z$hWuX_6^>$dBA=6f_O7Agh+iRs}nKUe*oe2;^o_DuA7#f`+R!sD$I%FZ52-fZ=+N7 zR`?#8ucf-jcD1U#M!~m?1*%F%Xlw*%q0?xAPl{s=Be=HskCt!^isOn@dV&XJSc#^o z;55@whu}lWBuWBb9}^%?0nH3s_kx*eUU3-``0Zm9DOW&rt~qs~ zr)9X*4WY*~A(&&YDm!l!+p|X47{%X!()_Q7xdDa?UZ^dnEnbzvdah%`Y z5bS`Z^5#iFMZ6*Y$oS;3lMWM-&pP06{|sRs4H-a70pRuxt3@wDqzsV;UM)kGTyht3 ziPgh>xmd zon12h;sBUe&$^TiH})YWwc!PWu}GtEtpPyBWm50%)lH**$wB+)|H)_M6My4)DxvbR zA2SoFebVloL>t7HWcEP1cF(#)3MD7%dkn(kk&ps(cKZtCM&H2VxR4FNx6Aisno8C* zy?+L|#H;B6M29!Cvd#78PwG_TKGlvF65HHTw?dhJs+8T40MEOU`QS1FTQ$K71o5UGV z1$XdWPgpO5*3q?Ih~nEE-azJBazQtt-`{zYzt~E8kF(-CBAK543lX25eX@X_=Fsn2 zdnA+hg7KIP-A1Swj}~^gzX90fc5WM*3mY+GFe6-;$7RWW8daUy@{wXU{Y0wAH&)rN z=B^5^Vb8rUR+ws3^S&jd(+;DPF?w7^Z0C&MMZ}T@O6T1ggENbH@q6?%-YIU-s9O-C z1lXtVV4gG!eefELx>3B=_v3&XkE1_-R)o_cH@wOGct@UJ*9R|kNVJib4%Om*Kbhbf zzwuJF=X7&MVl{>|6KSZbCcg?vxye${J~!#tx87ViwIYshfftlST}>FF14D4PM-`V} zukxDF_@{dP7hCVZorxMO3&*x?+se|PPJXY(;*ZpZ)K$Yzf9$7XHAk616fH=xhTOTW^ z>MwgWF(}-YW55Pbp0vnXHHAqaYte{g4hu<+>~*L?m8Lq80dPcM(pxsUUq=6BJ2{5t zY5$VJVJONe4P-ld61)8c8o%xZ09U%M;`U&_sJx3kNb5T-sG6>Ah5_;Ql;0S82wl15 z@EKXdJAj8ga=DaDB9}-t?064sCA$g6tlE=qCtL4@-hUFiZI2M|YP8NLSG?tXU8jY1 z&NC;DuPrOv8@wq|tm{8YTB4vBYNFvV13>oM)7UO+bZ(lD#j?G6s20<0SmW*oJ1 ztK@f1ayHK-Qi#O>f1%n*g=B0a7zraO9bjuyO`_kOBMttz%N`5ysIK3s0w72AF8_%K zs7jp8!GgqNjzMvad5rBdF#|IA1B42*_~F8ZD<1EE`}d*q{k^n4due4RHUdguC3VyX zo_fjqF4P>)2-;R~BbQfLg88Cb?=dkF5LctgIWTvi#viWVK*-K1f$B?l+O1 zk{>6;s5wnpxxa|*pO-upvF*yp_=>d6kV-D>+{>m#EZ9HJoUn zhO1Ci1ErkkdHoAF)qqJ0WJ6!pV1;B`1^oxyS!?xLd^LNej5)V?z%udv)a}`l#HPNK z3kcT1+cN_ZPW2fgAts`fAQc%~vQ$B4nyc8Z8#R~9W(iw=UIa2jDu8-FPn8}qjK!py zj)k7IO0YLqE2#XYg(Ph2_TO-;%IFaMD+ zJ62dX-XFfE1pQP2D)je$gdz1b4hh=u%d%ARsOZUbjT@hwdGdk%^m$n>ehCYRHk=!k z+|x(3&E_SyttHNaLje5H+w(ci+P6kU9yf%xsM!qIiJ*g!>AU$^Y`x!36jEJP+;C0n zNV4@B7Sf@wF7-^a?lIHAEM$u2f4PF~YzLTJgYq$hnq<}-KJw{-ueqv&6kyg;c9Pnt zx+EIk%&hE8g1CRSSK*%sNA$unQ<+Hreq%t$rhoY&U1J)nX8}YN4-AiJbv43orB&n` z^`+msG<_w7saBu!QfeKElLex!d*CyB*02?8l=;9^LheT;^p6`fbN~?Q^Asfg7ZJ(x zNS4%?1hu3lAG8^S;AzT&KpD}jo);9Pv`Ss%1F(nVvoT-7!MQpodm0Y0$K3M{l50Mo z*12mRepTI<^aB1gfcFVUs|&@-1ah$AR3z!2oMqvOf;@-w&p9(C<++tk6#E71|D@gR zdJSQjL{jpxHYq_~nZy&dYc3>8xV)Np? zj6Q%4@)Ll#s?2TUV++yE7`bE51N+YZ5EP;IL0P*ly>sHVvoMK@b}y;CqZ;L8$$wq? z)IoT+9oM@3Su%P#P^m74HMM_7ST?Y0&4exQSr3XRc3TR;jF+6Eo{ORW1rn25j{F~` zm*f9dSwjCC@XGluv-IDl1!&o2GNJii*X-EXU_!+q{oat?s6v!(Zd7_*RE>v~vqHBv zmg#s{nbFVG8Vy*sjBFH*zi_%~TRpyalbFVU9Dp5J zRNARwcp93mA*!ky%rGNz!Yg!T|1Lh=Qt{iPA1KiL1BBb0t~*#*XaEHsDAZD^Qqhum z&`oQ;l*7PtlS>uumzbamY}n1m&+tpGc`9k*B~+;#1*n1IvN$zt z1S}dwY6SVzu|;_%agp|zYl$F`wpNIQPxabhprFL4qQEdn3{yiW;C(yso0Ye zj{a32zC#jCPsx0j2*vXCGSAiJ6&vz?G?s1KbKL~xxL1TOnfr}baEPCX2AwcjP{&4J z_LN_#TQBCfx1*U$5HZXSqfr<3Zd-CsDJ+5_blBb1jgQ>0G>5_%MgrSf{w74mA2!V^ z3uD}z^DD%32Eg?k>L4Zm7_0Pzm*#5tsYzsD%_n*BVbHQT}cZ%58ll=@wL?*_p2kCm(K zVEZQ2kaz>_;&02_>v^?Buz4<{-)9#dZAP^z`XT83G=Q^<_{}A&1goT-sk`&-^-kUE zyAG|5`eBxywH-^T>Cz5dy%HaB&dskMtsuapDj&s2N;MF_SR6j8l>G>bmujkdw!p0z zCAcCzAj^d%tktPhq&g*y(IzfR8qN>B*R4VC%POD6nbW35;*<{Sy{;opLNRkv&Skg9 zzZh$6W@zn)5kf;uqAKHmS;gKbL*`;a3IOl8f~Wt-GfFgwL#Ugq9T~QZ-ZDwjdJ(zPX)+Qsa%YE9g zYua=6X5zWGCT%3y7T_3WC9SVQ5*71{GkJ?=mW!?!i1%Q7h;x&;6Qz#u$2pKGl^a%K zA>~pfb#iv*|Fm8mo~^4I1qHy8VKQX&LQ=vm>6RU7;_x9DmxNG{qJR$LLe8RyP0*=- zfF~X?F}{K({PC0S-M^@Q;wFdw6P{e}DAm_H_5qP}?*7D3+BwNYDJipb!%=)_+nL*# zg@(A6q?pj#E{%oI__%B7(_bG23^)>JFHJ$nzG41@)9be3v^ek9#1A<572jZr$N>*g z!8tKTCkM7qAIgnEKGT4M759+wYBecSuUR=JyqY?1kd96idHA^*&Si z(55?0fdtNIRm^ORNFG2of04~X;pjJLk8c|Rlk(hLaxYBr5J{SX6ONIMScY&OBjfyf zz}_3Ba>ILQt3y0GMECU6jYke?Nqu8vFU}3K23FUQ9kFDEuOj6`XxUjZ_!u$x5FS?h zB2<_Y7g$gANYJ-$rU;r3$6bC-&4fZo_u=bw{%nz731;vgGZjE%l_AJXHf4qyu(=dV z+Yk|)nmF^2!@7vd^uBkpJ>1!m#Whaiy~mtbTxPamwbsFbDMN@8b+Uor{8azE%df_6 z;J_E0ub%>mCByiXLi%Z)q=tXY+tH!{0ZmI=?z%7*HFj;hTcxhLNY1JqG(e_9b3X+6 zj?tx+U+P1rn}k#_Kfj%aKF{Cf&+uG6V~OrhrM|My)n@aYVWjNJzdjACCTzUcLTLki z{ZG2NA39;8riBWGYDr689mHIX!DF2NxX`UQpwrxye`9_avIj_U_Bkz8(F7RvAJN|l z+P4L*-}mpJKB2V1gtm2${s(=2wJwXR`P3Pir}o6To$54#1$#s-tdx$~6Dgyn25+op zr}YXABF%zh?*7LNfBTP2!e|EX6_{*up6p-u$>{ECKz^Wp?DAC=Mk0gZmtLQ@@^qM5 zojYjT!d-U*k6YfV^q=D?XayoQh#^bxokT2wmCY^y{x56)S?I3OdjE3~Ulp1RIgI{I zn`tGQRIFx6dGi!SL)Rq1pNIk%i>tvob;m({D(Ben56Ev8zLZ3%#&B4di|w)_Fu`qo zhM3*TUA4GQ{5f4-e_I!Y$B^6RgzGru^f*B95>*hpmyM)TTbPhLW2tA(Iv}&4g6L1? zrd!qk$)u-5OfUt=ZHWPy7pRtCW^AIgU<(W_PKRDd^dLNZ&fU;js3*${<0Ew~Oh-Ft zCgX!daPRZ>aQlriW$U3q1t1O1MPDX>KTahB*`9#b^-~zq?DT+6c5xv+9|%tXu+Da~uxI3Ks8Y6% z=T*jXATN`yBxoYgre@S5MphW6-`0W5)AhUGA0XmS{^Ap``;ZdvG^y-Mg?0V{^O z;mZl_ST82L)%`1|UOcW_5g)(fqEv?L5^Vk^O_2F#)sR)IcS8rCNvuKK>KIc%27FC! zY469UZSn6-K(wfOOa2Ko5On-yI{d+FTs|l`{6;I%g>D=DLyR+chFXf~`VDQ8fS?Qq zbo)}tB#da-)05B$`bD{UIQjwp`G+`9BPZ&{m&L_eUXc94N;HEI?Y1jv900~k_vA0C zo&&c1uzqEY`@;Ld+{^n3CpqNFzo^G#`hQ5$|8gWIj>Neoc0fclITOcJxNCo2;#eM6 z3EKdcR!%892I+)se@#u)vI6#oKSjFn_|WUG>x~xQ4ivrjY5S|y5HnfI#Jb&)kVtq; zVp!sV*r*K#S%|rifyT6XzFi9QtaD-{ z9Fh`*L5+rpkrWAgg&QMx%ngcen$6<98vj+{0CO{<3Tr#L-z_w-=4gU9`~#;6o9^_a~8efTx(g&f$nWp$^TJ#!n!)8;*zfeKYz=KsU7#w7?{>_}~_Ia2Xb? zRA2HKLCyx&0WJgS^0W>KHcJ$pBf26$ANby&Ex|c61Zms%Z3hVijv9E;pA()QqQ)eH=H!-kqRHM^f;YXt&mU160yrTf|>#V;KDB(6+? zrq+Q}^Htp)TR0$vQGP@QK${tw-xC@-;DPCh&g^2;o75^uj0WlgBPCn9 z=N@v_A(8X{FX;ae7Y;U-Z!l8>4%HREDL<0$OwG@AX;gBsM3l*=MU{zxMcKsRoMsEh zUN&7Iafs&X9$$!DXt{Z|t@TQ!`v9A1w{4#%A8}IyJHBT;*o{7CPut+|!;X~Lxac_a z;pNnZ+us6r+SirZ^+M4PtjFYVRM8fd!w(esR=?z1XT82}4tk(!7)*Bn6pUpO5@0nD z`=2d0*@wSKG1q|mY1-M8YSb+ryLR#y#YXEu85P9z@MkQRk(=vqd!?=S%wF1QB6l$! zqDJTpaNZ$=SA0-k-I{l(BYUqD_IqyBm-IN4$5|k-tL@Su`<+zB3l)!J@2h25y1jo9-sPo1g`e^L&=k z1-kBzSg0$*pNo7QbNlbFrBBW$H!i(6mI-$*x0+K%H0V@D+~9&olZ;ap)yk_$cePi2L2zjgrB`G~Zu1&2U@ToDmHuCdsv{7+r< z;Jf!Pmi4*tg_F`RIA;}Y*v|^>a`0JYXkA_C_Qxqo^TFi+aWZgv6M@IecAepRP%ju0SPv5}xbOW8~AVf^N2NF?NyOt7{96U+JI7S_T(LA-?Dv+4Nq)gKiVGh4dD?Nc&tqEh*X-H9N-B9p{v zZ=}?4;Hh0DER4z*^GI=_*}Gv_y*q3$rZ)iCYZUUHKpXL#if+$gC8`kngcL9dgj1Mn zU7)G#!?$=^>|&HZAA1;9vRB;$OoB~RJ!ht9;3_6T!TU5%{pW%I&04yoCqU{dTU%AF+G zD9C&gDwE`x7!!pz-?4DmGF1>UCBQV3GC1w>L9t%ev_apg*6tK(FBY94Nbs<8JrjkqWMQL{vEmm+{!U^d{Tye|~iW$7aF z-j%?C6r3hcx94UU3xjjP9$>xDBI>O`g7S=H@;qOMvEno})P9+svtN-ZGuGRN89_n& zP$m>EA8>4w}ghT9O=n;4vxNwbhzn4!~DnA(pxMSm%Ypkz7wi3Hg?bPfP&1Y z7GuRQejMc8nOr|g=7rf;!P63}ZijjW9erLzr-B~~7E>e`4zOSxa$E!&i@JigQjb2= zh6GbMdB2p9$}W7$JOGv;ND$<~R5QQDMElikAT(;9Q z97CGO8Yp}d7hgtNSzyo^{7xA}YnSJ<8`>jr&03wR?(Nta2cT_XLTK!|+j|xkt!JU$ zHS>w1Du97rsTC-&2R9-IJ(NFsrdHh6rLeyc=>C{sV_gu^mHq~7o=)nJZ%RU`!menf z8RK?>d2Y_cmyhC3S1DFbUhROD=FA*xvFD~SYvbMd;Z0`nutxl|@jq$X!x+euuF-WBHQIl2Rh!9v{M5v;UUu{PY&9ZNx)Jgm-J$`8< zUQhvnr5YiEX9+b*X(P@psjf+k9+d}#k*18i1l0G9-0N9q)rTFV!afDPzqh5o8{{%% z1a(ctndD8=V+>f)tup>91v=K1QI>e1Psxh0K4ohFp+rVb5#HM;PtnoK#WXF5YS#K; zG){LegJHQg&hk{Nnw;zYG(9fYVI;lhopg|vuv&tLB}6R)8>ec3=z`&zHJ%7a_EuTz zM%o(spgP*uNzd@Sf4_KzrB-QIw+8a9+MT)DdJxlh857TNC&+hB2g@hgpF7YUjhjM^ zXh~a!wC2HL6Glz1FX+H*u?V91~ARc>TD7}ZSGsEv(Nr9j%Lt@ZpYTdp`0b=V2aq z14bDJZ}d}Z*1tf*KJHU9C<7SYc65}- z&4Rj)X}N5bgqXe=ahZ}9eJG8lOM@W4wK_6!u_!Qa|F5;9bJ*Kn2xBEX+{amM>;2om zQ}=(P?;Y6F{x+Ajg>dH1G^$p56z^*09Q{f$nC7=>S|YG(PO?+t!`n#lX)wopid&L;w*f-$&;m)Qi594fkWrPdQ?o3NZLkT+CFkBRr%t8UuK zv>-Kjt$s2i9uSrT)tgj{SzwRs&p2_+)0jSE=N$5GzKR0sFN!@D=R`3h2MDh*pFdOT zH)EZMt7a_R<#7Q0K-4 zorH{1I)bbn8TT_7=@Ui>1YM{Vhq&7_O2%))esU-QOPAL@dSTG%50mCfuz$ z@V>xdMD#)b@}+MApYl!QIXM59$oIvpe?#~lz0D;L2}PJlv4}vEJrqNAi#}@|CRiWC z$_STRa&2m5W!RO-!cPQNLX~^ah}9z}o%1$IKt{`FyAE#UL98H;SqD4Eq`jAQ7$|Ld zl(krTe`HHJX<9OZSlFQB80fhAUUjxpQpF#rM>B; zq{ib66>ki5gkx5}i-F*8a>zJBrED74;tERS3=(E6KtGakGa@-iE{lo0=r@Ch6xHfZ z-CGI06Tw1FW>ti$)CmaRX~+O$R@uxK7fL^Zq4vdw%aDe8P=Z`Ym9S?8*YvP0JJqbQtAMVcme5sOMi#s!)}bqsJ4a{}o;y_eM! z>qw&F)!bpl2?M!7aHE4x@GSR9>sP?-Er(@hYS*I8@I<>cz$rBqZY>29ag%9M=S=;?=(i*rNAv+Zv#W3 zL{6=1H#OW+n0YX%i;A15k91Ihl3||{M?{WriSu@+cJZ@Vq6rEg*`>3CJDG<9A~6Zs zPii=NaTQ+=Kz~m zdjg??iRPul<8?y8N_^TjTbUjjGH#^ZAi#j$<2t_cIp+Ogvpwm0QBY?DrpA>X6}8q6 zg-?4UWOU|{!U`R&VVHHj7TC@GH0(vuF$l9)NvFmM>H6jP^v51bSn%SEBPBn0gCy&d`wdWUS2i%Z+)Zcv#>B=nIZa7S9@L>Brp*P zhA;MxuHKvA$tJETZ!nbz$u{!|ZL|PKSm)t~w7>NH)kx{vr2&ORmy7^191hP# z#C~1i2HSd5r8||Xm3Hq9xoW6ISyc~rC?_ALW*ghnvyOTn=Pknx_+G7_P7*i1UYZe) zq5G_3GHK>ok1s&yqLzZTXaP%HN`JE6QhTV}5E)R2W-QUBSXGYR<;5RDZ5tr%K`=Fm z50QP_vLn$$zX1J{rBei@&%6M4p1Uu}{&tuiF^S#u3er{v&_O2^3dc&c6{1w>Wgw)1 z058o6K2obQnWa6oGUJP17^vQn3vm8SCZ5NiZAVx#GfQOCNwK| zWP~q8;C1qj?KS6q{=N$jI!{yW0sZo@w2}`mH~S@SC6tEustYVjktcwihf9O~Jp_K= zq>O!Ijb$FJ)`^RD67&M?<+GSs+_vGGOlKy|Jr5KoHw_Mnu`FLoL;_f@@!aHb|N)r?u*xms6v z)2_ZCvr;wq|E`u&)lGomFr7}v+b?LkuOP~X)|AtPHjD}Z zA}c9n%*sVBLZ|i|(mE$_G8v1A0+5g>ZvLVLJ`qOSPFK6fxXi}cpJ^mW{iDzPy(~z7 znSKI8LHUoy0%`fpY_;%*qC~XEDjl3#zs+|EqiI}p{5oCPVx4+SEV(JJNJn~(O^(Sij`Nr zp=Kr#`O$TE!pJ~=e}78FV0$7?w;jEX<+#`ssev`(&fS zwrS=TMZim=JzhiysisJMjMhH8Bs~VO4LUe1NwFTxpo}fkzI|CS$qBdf6!7~25b^ldzRc0QSmsZ_T2Y3C^#TUQE8oInX z8fmm3N#l5sd(e+M3cvOj&DzC-*7QJCOm?W0M%QrhiSok%3I;yH{`Oi{0;){hf1dpTIY0EJ zP921`VA|5B6^aX1rATTIRqFj8R&voS4&73xAIF_*-}AT3^m4Y)`E~H3rYZMxc{;FMXaAA&B#(J)*_S{^j&|R-wRb)DQhCht z1lUaPPzqaU;3IZCqsF$po;(LQY)S?#g^W2kj0`qqpUPNo+9C0XVX}qQBgLkij{jjh zvBzJ@@pM{6LC)DzDAPcovs)ffWI;-$e54!X(--OHzJi^6Gs6N0b?At9vlZ9}DcUdt zZLu2@^~;B%AJQqDvkF{-&pXQqu(4Y_1Sp;jMkR^>;ws7h<{ZlLdGYXKMAq?VPe$hn z->$iDimL<=%D-CWi`YN%4N{XJt6x8{3<>8YF*Tu;+8kz=Eo83U7ZilY`0+N3T*;hb zM_1}SkaiVd%+r*K1sU@|vV&Tk$)4ZxD$ay^7TcMRnqZ^9*;Y^g&`KriO)@$s z8Dt};4G=sz?5L2QXxLJpVtD0`2XL{)|9$=Q)!F(au$g84Toq;<;T^e1E|E`HY}qwL zH?5R(wMI$kt(3~9s4mEm?ew`@l8|(rM!p@Z=(dboYPxNMROLvoJLrltJW-(A{hQ|zdZAq&3LFnh{j=WlwKT_#<- zkE66BB)HR#Ek>CXmKQ&HDLZz4vI~%m-#zOVE^8jjR@dgFe1S`cp1s&LK7vmwKW2n< zCM`6PRg;J8Q84x_br_Mc0PZy!Nd2QFj``R0C_ms?cse{*f9j9vmbSzCiInbQ0MFt0 zTGP9w=-$&C;;qD^z@!Xmg>YlCit{E%6iLoigFrBc{Pwk*(A_)e_zdfIygwVFB{-rs zG^Ei8ByT^{#~Ba3oNW#_S0S-~Cyxg$SfJP(WNW^xaw_3Zak$(k2TTtX@TwF%7A{1q zzzH^5@<`_Z=~A_8WRkPxDS2$18`^&u3`GZVf)(MH-T-w~fVbhAF^gaIF?yDi-kA$5 zVFd0ZYULg4daXCx6uf;VdzrPl=?s0eBTMsZH-$xNb}vhpY?d2NfG5t>+lY`EO9<_1 z7Jz<>tjK%@F=f%80kv=-b2@TBn$B979mKV7h(vL0b9RC72n4-Nra(R-$k0gQ4Qh+EWJTuLDYN2)eWCWDVCNtqqwLdm2Q8UAw0V}zCrd455rD|zf5Mm#4j z23NKXXUOmb1GLv^YhD(7}rQRsh>XQQ%U%=ja7CO+7QH>c{BR3G*M@jY_b? zX85&=P)$VbR|`@`0PV}7vco7K0o?H(@v+U~&%`)j>b*aZF#AOEHLJurld8Q(_(|7l{Q%} zF(FA&fUsb#7V@TVNc96~@^HKCPy)O{>*F^2eX}wHTyZ^SISA4*#J=X`;@UC-_3+Fw zHvHY0;R*6FY542FG3>ftTh4naKK6>RUU`&ehhbLemJgV5e>zWYP|?E1WsTeJ6V}0T z8l7(cwzD5iasxd54ACRcDl-uW#z?O5y=Ya5F1k`RhO^KRQ-=^RL+J05ECcGpsZx}X zrPgm_EXer#Wf-r-B0ilImTr-WkV-vkmR<S1rMlM~TvAJ*+6+H1eB_mQEv%VYM<)BEme?F2xpU^IQPT%=G zuXXT1QnG(x?^NCna4@wa(Btl1llrd0R~`NtLBjCN$q2v6wyWTu4d6-c?@{JG! z(Vm$PEzR5y4g_2Ni@udDQaX@FzsFq4=GT5gSJGgHYm{;i;6^*rX8VrsR4(27(0i(} z4_qfvoPtGz4}uP^Y_TU;$$U0k)CTF;yXgqCc>2=%)5EpMW4m(Av5GakT*lD$=%tB} zRK%do)Y}9#?f{|Z`umbtrf~HH(-RyqW9(Vyi^5_E8eYyynnsszBhtoN!1I7}e?55P z(?NV3Plm@BF!j>=rY?%#15{X53cp)Zb@F!!J^RE@=M#XA|5XqnhfsOq7ZTNwKyA=g zBmO)Tm3~oXiBc70Y>B@y)=EUpLUMNctu&O0oW%UthnxCM1oaX8iwfk8X~=>HF|whx zfW|fY6d5c;#0Oq-WEZs$?1LRv82``OW7Qvx?&+m@fDjNXSQ5RYN@p8t-uh3;bJbX( z9>Q}>?USNU3&>`&IXyw=?A_T4DELJ%qwY!G#(d+IDJhhLWcQI(Nyl55K5cq zvB|fGt>{mi5pAk$d=;fi9wo`pFt&-lpB>07U!?|Fw2GTL9r#QF)VPu9VtZuy_mDV`&E6DO91q$!cqNk)iUmdIz&t0j=V z9>WJ=x51YZ>q=!%1VBQ-E2%VAE?T;;SD%201B|=C^vNYJuCmTm)N!n9v2BQW(GMT# z2Z>0TG3tL6s{B|#a0`PLGfv$wQ;#N7q>dH>a|<1UoSPB0KFWpK_|;{8&qkb31Z66? z6r$w2dZCov2M>V%UH0}m24B%g1T&aPB?BR1ExV0y!D!n&;CK{IGMd6>gS*MA(y;i$ z7|>3_uA$ig$vRMB-#CS1ODWsPGpp2HIi{o<9b_;E=kboLG+1aL%zTN*GAo!;Dx*I< zb=&nA+Yx4U0<$l@G0e3G!1_-`qZG z3(bFXRW-ILdvQ^ zd83Lnq$X_;u5rVC>-60}K7>Fd)9nIslOF&7cOqr0vASHqUpvG+42nAuK;GC=#? zc~Hn)oyY&G=7{r|aDxu-QcPw2X>EEPtm@VzDR1%Vnx*(;i-G+r&r_(`apmJ%m1GuD z4QYugB-vgCef!wqCWiVOcn>S$K@$nc!l8h=)Gjjk@aQ^KGO6gLr&<0KRi*Bz15kCm z*rOS(WZq)1!667866n>{5DarY5yNz|TN=Xl>v*@I9p>_Uqlw-!*8~6J&l{>6OWL}^ zT;4txdK-7uj5)~DfVsWKTWhwm6(A9>9Aol@$pgo%VVx?i;>+;-hFtC>Y9+Wh{m!I= z3kIGe^?9E*0q6cZvB|emMzKF_M2bJmQ0W81KHFcOSYbWSgDC(NU;XC9kA9V<6Y+7 zZu2?*?Y7Xc>@w2?5d&~pYATkVaLX3lXnD;!cF$pluL`|~D$af~@-%o}@4DY0(y3f~ z@~3a0(9(i$PB?+o=M9?!G$`|9OsyW#YjxL?Yu3B?b7;Ud0ft@-km^Ix>XOHgAQ?>; zVwZbeHeFZh`B!eeet=E``#5+p0OKh$iEDN1kW7kJ`}-lNuTk`JEQJ+Z<0md8Fy2n z3Egotf()Vh5Jo>2Z2v8xvw~Ep3#ycQKI{>wgJM2Sr+pKuU{{~r-+Bgv^#EK6)M5h5 z6dqJXj_Yk9?BJfmK*$;EaKk?YOeRY8A}%Yd=R`Rjq?Nd4j-wEfN<4mq`7k=Smr}yl3rLKmi9EbsvQKqpdl#ko@lU?ZE5(!HdB|1x$0YJ)}& z&Czd+77F%<>$6lbrw#}vWg-F#YL;3_QZNENJnHVj|K!bvyZ*tBjxk+PV5o%!P74+o z{cz)}&teWE6lmp07a$)RUH8XkSbS4yl+jYd8?TC}pU8O<>3RQCf0;gWVCy&&7u2t~ z5hsVlqKMWUkb(!)A%YDjnl#)$#^_m1&)H{b@_+;R(Fu_T;PrLi`}mS?Zp|lGf&|K6 z3ZhV-YNXWEng(8E$xdRK@A^>96ud+G@OJaLH&8i%<4oySMSUbF&u+7bGLGsu$A;c) ztK?IGps+bbT5v=5fwrObcr0}HtvxAOd-pMT-bwJ4O3RR zD7)j7-}vCxgdUU-$VR0|A&p;KoVzyFO80*QrtRhm2Q_xJvB-wDOuwN(vJq@6qk28| z;0EUcDb&P1Gcy%Fos`zBL>LA3P7HmKAxt^Vl(sYV;sH+zAkCWLYTV>j`HctvSXk>4 zj$GmkkYCZB_Qt24+-n<^^*<|Fjao>Q1kE+^*x!N&_ZcY7icOa>VaQZ(!@~WgR{vpF z<7bf*;%K_c+tQ4qijzz)#59>ny5MX;QAom*W4KW~rOsz>Sr^c>T4gP_i9Kl{T?wZk6B z>`Hjkz5$UqsJ_kASPiMh(D&H&&Qf#vD!1KHPj%0WUo%kX`udV;29Tfm1btPMJ=>VdMhL+~l_jd_V4P1pKoOUyp~@ zpSQvV=J9ceZ52~ez{iIGdF~Tm)B|wgE;tz2zQ|TGFf?k1Dfnm;qCy4Hzv{DzHIgN% z1T^RATsG*gdOKdni7>qMh20LKAFL&;nZb#Ma3+@aRM-18bbAv9(<<3UE&c{9u&AaL zG_BuqI>`fA(XV(m&*mt&hQK4D3sQI!scuo2#?kl}WGH}sN+(V>Y@^G&alhQqm!yz~!^nh7ttky)&pBuQ2Eq3)hD0!j3LczG7}TLf>~**OjrI=3P3K{+7|=wf zt=i045Mi!Vj6{|!xaDTctL&kfKqCf6ec&8j&~ylB-7A8zBxH@4DlCIy134DgKN3|F z6HO16B;g*ZHU*tc;pz`VV}a(DjVFk`8{sg)x|0aMwTK!(CpS9#P;E6hCx`O%69X&fr`>Eo0vb`H?1!3=0+bU zUcP=*V-x|mSFVf>)YNc>f7oW1dDr}U-@kgUdDdPlh9h3V*2yft^;IXx0CmSSU-})g zRM}BBzDjv}AzE#k@_@lgJVFmzA#Y;VKbL(LxO+IF`Uo< zftiZGi+{s0=l_(i+uhVtM<1>;h`D$F+9d4Q{~Y{r${hpx>=V~0j9I{}YlsG5;@H5q zWWF2byU~Dtx)_ql8mbU>uD+Eqqne2qC45jX?aD0dOcwHCRqWZCP zl35%D1D8&CkG|j-UwXO|9BUU6`stFkNz#8^|H=K#uF_DLDME|&Tfi` z$F$da=^#0Qj1xcH8s(Q68%>Z)D=51@w&;zG*Q&=-fEA=}du;OZk2 zaR=?d%3D!!no_>Bo`FH>PUB>94nBU-jl#*7T>4pn&8tti1YNh> z=PG=N-~=>;Er1Asju-VZ9m&`b`30m*L7MpQ!jSDhdVg*p1t3y$|fcGon-!%jQj8S_#V?QU!x7Y9Hw)K$66-ltdj>W88U`F)8)QQ1XHcnNi%d z+b0%aRGOXT^6Bw(ykiI3<96tzIz?A+K%I@qnA20Jv{wvuwglb43D-VG3Je1PV9fUn z+mXM+tchCynnd+G;X9gtf!8!gL5Rm3ZXLs|F?wMV|4{=_TCm6-@)BmFp;wk1^?6{a zQ098-n3}G$y?00BU69uCz`SU_k>Msb@eq(#(uKkF_A96@kl*m+H}+b_wMeGTe5#m5 zzz+_TFKO`{1MF4!$!sUv@3k(zn#~sC+z2qt$T$F#G7uLtTdQK}Z6vN83}jhPQBX9 zJT2$fxX`act_vbh4=z-!gK!ybf8=II-H}_0qjrG+mDZbhNekCwc%a6lsZ|hlngzPz zna%-bK<&bH$WSlxjz`+RBKnp?3fNMi_3G;qlORWHgt{w~J*u8wyOUtwe65T}WyhaP zvg-GOiN81u*>WX^TI%lS_YaNDnRknrGv+!fXiceP=U(UKroJ}p9W%@{mZFVs<;3S7 z?zr?y$|B}3F5BgPwHIqG6-m)@N;6EwLDm7b!}l~8-X0tcql=FRB2THZb@-hy6F@r3 zyPD)`uHI?Xb_X06X zi898~sG>$u98h^J;3MLk;tZ)Qd}XrR06lc)?3hz9z47yOnH4KPi!J}r+hUr7`*)nj z_8%c1EUfJRv}&{fr;TQmfBLkIJX4YoqUwiCE8b{S-mzbnPCPb*`r#?=Lh&?`MGhaw zGYqwHRN>V#!WrDG1c|FU3cbEwFMfo@jJjPI??K^du*o?x*YeIV0E?{B3u7LE7xwn4 z>wAhCQxD!(pVy})E2sVhE@_sKVHOOfoG9fq24%Z1+Bbj?TZ$x#4<0tbPyur)MSIcl z8jW3tXHv!qa1*0oxdRhF2ghOBUF`lpXXwQ=E*rS+e^2W4nXE zZPTwchUb1&MfCrVt#^vfG}xj=W81ckj&0kvZRd||v*V6!+fF*RZFh9D_daKg^Kf6* zsE2y^#`soMtu<@boRvxyMbi_o$8Uw>Qd%4jUDOre(~Ou;STEiKsyTtUBe$r^2|QVa zIyJ^OFbPk-{Qxn#R8Fa`t;6%n5x`BgPF0+}?FyQKRcVo`cq+Y=TZ?}BU4RdEx;^-# zoGauB@?z;o*(hD2JP}En*@Rqp2@d`w8Mx$vCW}}?ad^V*ln6-@JsA!$@->I(Ik6DE z7AYCGAPJTb2!w_yCv+GvN`a>Uj6(lNTkfUq74qpwitFP4SVKnnwep{lF=n4E;R#I)qTyABMWpc8gsUC+%|lYAax zP^obmf#GPfiv21nM_8RqvM7>!IWn`%6tH_v-8;D7gsf}N6m14=---%K?mTM%7_Pn3 zpy_kuU%=km2*Z7tD}n@?yrh@S-ihiXVP}IHv&asBpnp|(Dqii+zl6eeW~g#w5^li5 z-oInezJF+nSLS>{eBxdzOV?%y7fs|{)~L-k8%^y10fS|;ZGZp1#JKCLs$heUNp~?l zFVI%Yzw?+UNKCcI4BlT=j!Zduk-#q%CdH_JF#y-X7Rlg$TE${NrlD5he~N6)EgmQN4% z>z)QY(=#ix+}i#I0<_TnX`|$J zbF&qM3%9^KCeI(dbv(&K=IPy-;MFK!(*SPkx)}kYj8=c1nG1UZn^rRoqq+NzGG|8O zPmztIO5z|;pGYx^!CB)5;HcG2t46~5ZnTozlOu1fRia^a@0N$~^)ye6hYM9In{o0=S@P?OX3qw3Bz6d=$r(d{vp@wR5FS^|kisoj**EDEMZCU(u zw~UM=ln`wYln~D?iu6Ynsos?wd`VYuaJ+<{2tu4-n0s1J{Au9SJQfweliyUwlK2kA z2Kd6k-ssoxi5O9k<#a#Y)HO^)cLBBM6qK;DYl8k#?gB}EhtLc3$NDthuLnuX;IGIzVh2P@zV+ z;Jp8O#|MjZf5<9JMfNQVZPwbK(~o@eE*WEEs^HbOAD0<~!3=U{&JQSY;6!&Q(g`SW zUpFR%-x12-rF3f|iexN7F5s#Z`AfG7Jeg4xZ#dT6HJqj}N7S5xCeYinDzEUuys=_5 z2tXFl#9zy9Kxgg0cp057_W|TzWU6J*(6eV=T1{R{?k%K#8NM>JgLDwdfMgoq^A4g= z%5x$v-Tv(ABZ%!L^^9RE&f^V1GRJ76@NOtaEqnYegMY;Vqy>|qf>TNmwR(FQga}cL zSO;$5pC#IG5&>yWBn>x?6!OU`xfJo*&oe`T8o>moUfxjD7eZM$A^-(^y}wHX?6H1l zYx;@?wjU2&<=-Sr=+hata<`W<(i2`H+VGP@gU%s@C z`Kc$FUxIix1|p{}0{V!&`fr5kr*HCg@q{~hJhp(_qDS}>|4a-?Pu!^4Vjq{wC<|Mq zdvJ&C2?d+(oewx7pEF6TS;WFh1#76d1KX2fKgOHyHRFf`av} zRi;TB*-Y-4m}U*@;&sAW?j?2#Vr+(1-En!0YuhxCcKKeP zlRIMh3(xXph9ZYKaiW%v8pgQ`^Kcgv7Rv0Q)fjUwS$E06J>9sDya&Ir!U$`01F^wa zg2gST1TbF0N6DOEMDG(L^-gV21(R9QatJY~=4lmmsXFQx3+yayarK2;ouX>4QYg{m zfYI7%IjVbsZ~?HpkjaV*{f-(7PKs@-;Yrsh;QYF(`itn5Oao-WliX;5A_7 zkU=>fnw5&G;q1Ts8{T)*!=h2!lrOEvj6i{@%)#&U@eJu&@MC8#mb@3?TaY+u>tYCj zQgU%p`Elr5fHLU?`yi7aZ}BDvLi;JX$NUR}t2zyfiU9jwdehN*p2v14l8-7eQlkKu zU|y$`>uftsVQk=;p}+QnfzQr#JlFzNq71OVpgj{%?!j$z}-EqF72458PoAJe3b zW84!&hAm{!5dIZ8QH~h@<842BY2Vm@bhTY*!|4&Vtpwoq#ZJuHZ%1zW;NLc{n;mpN z$Y!Jd69B5p;vHAg)$r+|qlD_WP(0R%{Poj3AnBq`WhBPev`^cEGHp(xARhRHyGzV` zFRmZ|E;ed=?bt|;W0;eoqp&b9H!x<~E})zwE#I zFLnQ@Nze@r#%(dwSKpqxo!gOI;oAEQ^&x(&$KW`SGY3_gOu*B%GyCY8f)kDhB%nh4 zd!|LF()#1gS~oI{c-Lsgiu<-*+81YiQSnBaQLHKhAc6!3-xgO1Oz0j;H40HDrVV5B6JnEBq&u2E}veN6?k>B#HwSg zxGCf=vJE$(Z=s&B_w0}RQX*x0PwzEJq=9L}G{@HiUfr#UJ#wCCNcOo@}V@?m*!j*9alp0lWaA?y^B4 zwR)|oVOu29jj*@wi24PS#rAo=$Vz57*IM2bv%|nxXG`$?I;?(1h9lj@KjrqdAhJAY zzn#JC=IIyzoEnan&xs(5dcnC12t@)48bf&Npq)i#=je0iZYf;b$Fzmh9^FsqrHV_B zwW;Maz56i=Bst$sPL3>)1SG|nmR#;kcod>7K2{Hp`bK5ez}`;{uQL*1v9v_jR*=F{0Shs`~C)oIR5??V5=>l=~yJWv!g2x$KsQj%m2PA~%wrv=KEeAT&*wGSbP6aG+=K|`TNkO4>x zGkp8MpZ*_U9P}6ae_rEL1G-bX&bW8u}T*!)~Q0w9_@?Ew)Ut<3R- zzL<#~`3WSDICN0cui7WozLuQP`_nN>;(l1_8xA_+zS7ar8lFNILC?zCunb}d7hUv0 zYssv^&Z**d1CqwE(3?vW>3b>}?vqx4HlSJp>?pUcRpkKwbt(-t+-5k(h0@ZdER}vm z(ypSmewC5qZb}=q0F+=Md2Pj=A<|_~H(aF*>JA3!oIu+PqL@(Z7PVD9>AeHaOnDho z#KiQeQyEgqt3Dxs*k-`GXbld3Sf7n~jKSxz`R*^8N5U!}`+uH~7>tmA_@u92I*sws z;IzSii&ZB`SuD6fYPu|N-9|j^fRjz0ID`1QA9~8g3{Vmzso?BuVX~1Q&>RLo^~}QK zOBe5bP@fC5lRd~C7fj7occs43J?I|yR>5j9HpH3wjdyHRNNANd_?ziXdhc{V9)1$t zzJv8YQjAJQDMuqXlv zk&4ubIy0mvQ>Od31tkKf_dqJ9$n5;TISD-Gp%lTc$`o;Q@2X@dX=q4g2$Tp7hwy{` zpuqT(`IpH6h`xIRKM6qxAt8vMO+m#1_64=_aUzT(82+1h5DY*TB9v$UJzLY=wScJ+ zm|+-Y|97nZAK-!taHXT?pu>UUw^F-Hs2Q0zNR0GIdn5g z>-zoqo3$&cMz*t_AH_0|2#HY)VVu<>Y_OdLHP@rR`CQnYIRbXPL{Zn0;r%qIV?Q{0 zJo1G>oU*zdE%y%`^NO-I8Qc?e5fghptw~RWg>?oj3zvyCfIk_Q+$)`!(O0-<cA6q_piY*+3Ps zSW^KC??O#b&KJZu?wsaOIIZwY@cv&w09N`U_hH14wWqd+i>xG8dlJKEYKck znXgmOW8aZeNG?@xcu9AW#1sk>jd<}_h)}j_2U+aj2&9Z((48!nrQCCJYz?rYJ}%AY zSwGH%h032K2`=Dkf7c%VYFavsIMn*#%X1)8cpxwP{Q6u&=zO|yh57M z)IXRLK)cHS>jtoF|1|hidog^zu@R4W5s&!7U=;q@ruo^{)BAaFz4eb^V;ZN&;K!%J z-|xM&^WHMRFAW*!S9nQFE9{hW_+G|laqrs*hG($UR;7mh6U4~)r4hRM?~0}YRq#Ex zii$8ES_R{PH`B5^;qUohR{y`7RR=H3F*?9kzx^kp}7Cd&GEY_ z;Ln(Rcc~h;dMvT;kt+h*@0JmL#cZAp^)r(ttQ?w2tt#dh-{N0(F;JbFEfyIn2ilSG zY&2hZI9GumP3|rS(=9)M9)9Kat_QgvaWG%`h>OyJ<`V>f&UxGJ35DnPWe5vcyR%|K z@0i08J=}7K(L!Kl1n|dA6o1Saj7gAbwVrWc2&}|3P+?+ z`yjKLdDh`L(5JU!TjPjFWCS`{+dB6c5lr5{*?{auZ z#YGoiSN(wN7vIpIQDMSOrAe;**<3r&Pss?oThb+&V9qY*7Dp>2vw#dncw<~5z;f`m zXZQCdRxlwT|6%W5aUz1nfM9~Xu!}c3d=H)#4B$mIx}$;k5%?6H{}=hlsMk95`AunL zet-UF+WbDV-hblVJ>Bnth=yG7Bh0Zq;faGC_5C9!U5OOPqb#F;QXh?lcz{}j@K3`} zGsQTJ*}MDy#FP40)=q1{I|$&Bkb1QD$&3$ne^5z3H6eY!Cr!NvoRIUb$G_(kvWk*% zGActc{oK1dqz;ZUbup*0Vd5auM`qe8)05S7+=du@TT#YI8NFJWglQ>j)!JE#TIf;@ zjg)NJ%yr$Ib*;+pqe<9SW;--8AxHf*Nxfyn>zE$Jwj?sLYsv>uHRX0ruhr$}zTU5^wB!Lsc%?N$F~oL@!Rk|IlDCmxNYg29p&ihY6<_R0z?^1i%e4`u+4im&Gt%23PZZN;~t&F+3{!{gdvr~Qy0R-sdnhyN;hqq zl=9x8Oy<~QkAxhMEl$tibrGE(RmzS+@`h;w)Dnz9o~hrQRBvfki`livThm<}Lb4r( z$9@T(tbONtVcxAbDeL*7HwEkcR&06bMw5KmV_!n!SCa1TpBewuAd^us?=Hk>LG*5o z?gQ*o3-uNg*+)n3k}J!DL0d9Q+VxM&=8gh@Cbnyl0i=UE(R6(a@k;}N zMa2cAFM610&MN!4#FjM5ZauPBL6nyfp; zl-Po5$rXEYj?c}ztRP!jGa*mGayV(@AF90p%3F=3opk}Q4Uq{<(VchEy1)FdT4#;Q zvvd{KmwaFV8;5ncAaRYFf-lr4Tzyl-t-JmMM#csjLA_UMPLy(C<6?|itf-?SY+*L+6l<47HvUV6c3c=`!(i`d)z|KHg;r@DbPa)a+veeVCoy`5x{7 z=_z^~_79>RBVZQA}_exAKwf*+PCEz_%=A+p&2 znzu?)u4)$y8V4IK{C~tp;YPb<1G7npHB~2NCK|~_#LxOm&0%epwK+cfAx8p{oU_(B zTv*A_;1{FxI#xWC*LqGehit>_u4<8cigN(wImE2+%5}ccCE(VJ%`N6an{!aCXkp7S zSGL$xAkYit)&(@b78Q}fkdv(I6DXJV`N2Is*<}nTRW(Ep`dpBh*HP%kDOO@cF0b^j zN=|3gbuDH_bV-jjrYTBtFV|Q%GX2&%ES^RhT3stw+p2AEW0q;>=^rF%$dkS8txSeWce;GSmI&%_psBd}OM(w~;Q(rp(p8@<1++i!Cx^^+|7Jc_o=_TOnhA%L%LRkwBrC;nQox z(PO^b|8DUpOt<5*KU=1+$~CHhy;EJiM{t8iAl#BXe}~8)$Pp&?a5!?7v0d53&0{Wj!nV z5-W?wPtm8uq|C$)_P-v4l=Y_v2}&f_B;iV*98Z=J(Cr_Kk=X&InkczBt5j50&H5Rj z?N%9%mE05}*_9b0O&*;U_Vo?+^$~?fq8?)5(j2bhe%;;@mYvi))ZLU@7z#WD2i|>y zLWKQ;h~OrI-wz%Vx+iiYLVqIiBl=vO0$&?FIv+K8=zRwKL6{D&0gB!l4Gn^5 zlrHN6ih;t($@zclNERYymS4Yqr3YdHql2-sGjk;~(@+9po4^(E)?4VKP&b1`l6SAK z5&E~fop5Y6^@401Jv_p9Q8vljl9BL&1X?y5U)sMlx;6BcwoKM>Txysx!84O+f+I4! zp%oVhz|0MeOpn1M#w+XUKr%Adurf2Xkg2KuR`s>?^-llz%?nam(E1?V^nwiK1dQx* zWVbQD(#r$33BVHE>cQ*kfHgV2wAwr~Gl8q7rg*&q(Ke$_Vxg7G~wGd4Fjv0|@su&;9Iz^qPz?bQK>G667i*r$guzd%3cnFRY+5neSc zVj|Fh*kou=dM_)Uj}19YD2aBb4Q zVKz7t+^(Uy`SHFHBoIEZpofagAAyNVFHQi^w`;?Pk^e>C=w$yku;JG-*xcv@-s^Ml z>5=Uv3|PPqdzD}R+x>$>*whF(Ln|`~m_iVi7HMB#X=h6Cq4##);^|@Xz6%r4e$?`vdjspo@x9f8Q zBjC%UjN-O7Hx)8Vt9|u{0tmPIY6n0R6~t)y#x6>2EKcQ_lO2b#wSG(2{A#HDt~YH_ zC(2LiZd@X)g$W1@&3psAZL?4QJ-#|}^jA5|W7yr;|9DA6AyV;a6kv}@4MsJ*JT$!w z9Q&XkQ%67uz?|Hm$pYT`{>u~)iEN7KF9Y1wd;-eU>LL7bAkM`FBufIw_yP!T0#V!n zkPri;_5~uMvHQs05RE~Z#y^6$@6o=59K52wg*F|$q`!&Ofs!W#POGEN1tReKik}hp z!I-RmX35X}L)_m3VZ#0n-u9*V7P@p$+a@6B1bhIdQpYb162SYwJ`fK*O-$`?_8%F) zb-*V9{jJDapRhf54PThPfFk1u#@CVIXMaZGTbpiUdc6mDvv~%s7b}u&fLLlLZe()ggVJGLeU}^8b zw~Xl@26=gh*~`4yzHE?h$nUp5pn=zdDnqGaJ}Nzi7you=cA7~-0QPY2$sjIh?^yyY+Abig-Aq>-%5hvKSH6JE4#1f=*38vfiVD z3&EdI7MI>@g;_pP0lEW{yrOuMtH8Su9StG&J(@C3t}P!pT3s@@RBDSG?p!1I1&Y?9 zx?Ec{O|CI{S7?_sb9?ub4=#3*MRpA1W);072};KH8N5<4?6_k~8M-h?w zH#HRBu3UYs1f`gVWn$w;!D8tjxU3uXxch5D=z!z+EAN&`{Yx(s)WU#W3CL>yLK{cQ0& z%TpnjB!k+jCjp}*job9Qo_evikDc!kQy-yKC$?=DcMR3^&u`6EVV{b#{UME+_&va; zEMh7u`F%=u03YW#P89sTlNWfcA%<37yO27tdBSAYMVF1$tdxW>_@|2(0MWeZUpzOs z4&pBaLf*Au1`S34dU^T8(aaE)XhK+gY`a4s%*Jm=FGjZRY1*DZ>=t@lf(K#zEI^6Y zk_X$opW7dUzP_nhP5T0xsIV%-?2wY=YAi~RA0Fu-K*+LhaW(#PK?x>#G#xk1Fs!Uyll-Q8$^jM)YGNE8Ts+3!AF`eOJEYBq>^o&VNru*b_ce zwgBITZq7k?-o0zHb?*@_f|3TL7OO3pw`#P#UyFM*qG3Lj1}dZP@BiWM2wP=edcZ}E zSingPz`zsfnG2*QwLpq^5fTmIRSr!1QtDAD)p+>zVOzoKNkweVhpyQ0i4@)DOcvLa z=ip5RCF1_JRi^2j3t9t*HlzoeRn#!gid_PMqb8Jl&27;OgSzcAW5&y3UhXfS(o0bS zt#?3Z7y0k#U)3**v+u+_vE!n`y`BeeqtU(yz+rBvjNSM3nNKqP1sgY$?&;0SP)OH< zL<$~H2@H-$MfjGcw7NVaDddBgOcT^*XE~+ot0irQMKrAOTNHIS0{H6$?O)g=ZsOR- z1ufl|H8}cRMipVm%KdtUv2H8N(Q@6L_mGrc#UJ6NaGW{pj8Z8->SEG}Iu(Naf&INr zfPUIu&?Lw4b}7niNY- zxJvM}{dpWx_lR{M4U%n<#tqd%!dOLI*TmJ%=}k0vR9l8%{Op*^23)NkX%#fl&|0Y` z4Jz7sWl@7@*jDu}R+Qs+sevU}13AhHj)!Ta9M@U6KCPf|ANpFVJg{UyN-<79TQ2ILF5*s5&n z%Hz?S;l76sHY~>ZJT9_BB4v?rEcc<%4~oAEFFEp>=c!ID_W{{&S~O?&CrY&WnWMgT z1QO}4+$qE5ZS3QpQ4pS`SVm1ZmWPORr%yW!ZUGw%rt8kI(M_jl&JFyoXrPH*>7UnQ zJ3(x1tKAN16lIh;@{0unZ7efDPJ zK%^C`Z6^M>zi-ti%ScwY)bUa^44Wx0MhHg$$z^80uFFMD2d#dG)}oGALDf8UUS;qN zfC=GVusRq1kg#GWHD+=djid9Zp&*)xQ2e0yd`hpa#+VQjL9 zS*B2Hx_04tX#^d1HY+1tf;!pvp-(?2OVy0bTSSOU(SU4?yKA!802(B@$7|Si( z?eb)4h6Afo#O(UZB)1d8QIO;XrZ}0n-_@jN*ymPu;bcW0comrXYwQLcP^_o@WChw| zZa^|RMoIGQZkDYOHVMfr=^qv&CU^o#kjLW^kWHQC+LlN{bIoq_MeF)3C_{2s+sJ0% z;#eEtKhD{eAEquuo7&44&1tCSwb3@WDMYa4mOaXd%&}WzueeUtr9NxX z+8T7GYz4YLKpDAsOBkSiVX|>E(ALIV16!upl#_&xEidD6iuQ}D|IleVGx{N)Jft+K z9<+5v?IDZWmsbX!PBJN*l$S}}Y4(Z|){BMoLRlyXAUkmjtKd-BJr)Xkx^}=dHmp`n zfW|S{pmj|t$wXZ1H`j)RK+geGTKBH$40OOzj6RSHQCw*nb&9UD%T?YIb=z9XWcz?C zDZ+{rY#@S;rf{n+(19yL6hmEM*1NcBahh*WoNQ-3fA&1LE_zBszF2#w`;Vb(X!X*- zJwA8};DiIrJdBi0#jrAFblODH4bVNZMAlRu6y0~#M2YY>WmYN@O?+L$SG00pNWNd< z^UyzBdmP2VNA17^xd@fXR5aNij z=1PWR8iZ3-%oWI-kPspwJJnK8D(+vbKm7@fKFuNWjJ|K5r?BqD<|=0%9R%?Q7blMk z5YCiI?i$wjNIJW!`T8qWy>(7dAb`Y5WJwnR5~?U;E=nimAoSUgigU>i_Aj~YI_(`4 zdCeou>Tg)G(X=0Vf2%nd?KkU~Vm*e42Oh?q;{)~PY{goUZ})=>QRD9i_BQGZzPoh| z77+}=lg)rkm2QpsWNhaF2EYBP+YW zL}M z^S*%7*;piii9xc5T_C}Tnj9so72-uD*7<=&Nn+eo=IE$uU{ENA%}E?#a5vl!Ahd^A zI9bW)(gFT4<2tL~g78X#w0)|v*uU6#v&Oh62cg3I_c8=HMfr4I*%2vH(kNWTW0_;G zF(RBS(mdgSFQ&s}pj@|_z@v{vU*0Qxq?2cQ-(Midm8-!54YBl&?JY=I7=(sWuxt$t zAJOfOgS}x@``i%+Q-d#f{uYJ{AS;*JbwTj~eK+oN6NV&x5?Cg6Xf03Q0301p)L726 z^+Rpx-UUK(t6P(nt@!NXJJX9a8k;5aQU9y=^%Um}R`$cEHcHX|MU}+l@y3}+06J82 zL8Ir)>eP&yEB5GfxaNNmm{#2XX!zr*9_>;# zFidGXqx@Li42|lkQp#9tmu_>H1x8oqPeRBpr2Te)Nhg|8FOH;UlUqb%1~SVdcgiFkCH>tQm;l}Ghb&*@*ZSws zyQH}Kn}vu8Hg{QYAw1x*2&n;OPe`^>0CaOP(*Y(>uebKeOWAw?z$2wW5=#tZHB|aw zChqFVM|1VDQIKJi+c$<+Ww{@5D|Q1aOCbF^RU`Bl-i4B(>B<~%ByXSy3n~~#Dva&& zog&47QV|WMz`;Ccpfn7w8T3xp#>mDLs(J{0r)X0BSRJ;l{lG+Y);(d}469K@Ix!o! zv+UjyQIL3M%VoL)n7#ALK?wpNiRuvJ72&qSIVLZ;B%uDv7)aT!tSsfDj=OvNSCv}W zZ2ZBF3Kxe*?8yD04u?FrZ5nA7ml47hEDu zMU3Xjz3T4WGox~AL?4u4c-jvjAwNjh;$ISwl%a6D=pnKUxEXw4pXFH9Oc4mnPl$U9 za8uTmfvyu{q3$i}$Vi>`$y`5hKqeuSy5pE-X$Ul};MuNXj!atgosV`R!UM2x<5FL= z)$!mMWFJ1>p?lFJ&XU{E1R0B7W#2>aBmOHecP?b8{%da_4nYkJtK86JY4NaCF+a7v zDq(yr^2{d&P=`_a$_qgc=@tF#`*OC>XRT}XCmiZf(pj}=K1~^A1I3m8(QrN@;9~99 zA9{LAdDoe=ssre)O7e%t-hkZ5Xr#4e4~E0=UqovoXN1#)NRg_ccbnT`{pB9f;s~YR zw5ad!%=Sa9g4uz`Jc}RwyIH0JqYDqD(IiKKt&2hifbA&~HTQA>sXYpjkYYCu89F6W zRPJDR zGrkuu#SToZi)gbJR@`(sAP%4RbO!!hW?%eh4@4ylM*^N*z30lxcm6YwloE&Tt9W#* zXWk_Sur3P@&^XN@UYEpq=z0txdTJHNoUUmnQMiF?z8lel$9~(waao@ZGMwSZdv#hI zJXZt#`YVeb2dx3oYQ65~)pWFa`(BBbCK&r+Z2Cjs>;4ebQhG?x{iq@wq8V1aRoC}f zAjDmxPb?E5a)G9Y@Z&*l@5IJ1Ns|}upr{K4094*TruuxMI6Z6Api9HZ^0Kh2RMjvo zU5}Xve_I@4A3X`DCSqU5;W>qgr2h_hg-`#+6!4@Dlpyvi@$g+#7tiAK*y5@**qy?T zQ0M7kMF{q}&=@1((b5;k?N;4Tp(xE>W_^?1x5Tkg{x_8+a}_mu5y5k# zdDr0OQ;$sckiyTu;nT6{cXq}v+o&R>iI!VHt@)*@+KDr1nOQv^6a zROb4EffG;JUwb0@b`Zo!D%?E2lBWl2n%M{HLYpU6S>irS(~ro7Mcw!XZqZU2D9WM- zRW2aFr>RaaUiY97fNOWR^NUrHaP~2_*a0wSm%CJkAp9v2RUBQJDNQ>g|CVY2I5!uOV}dYur)*nWvw_9y7N{S$>w zx7bVhDpS@k(v!tNdJG55t94d@wBHlGZ3>a*Pu3k|8U~lciXbE)8Z{{i#e~a+Hj4Y!Py;5e3Gs*fV^vZbA8`K&L(`+^^Xcd z`>CQFD2~-od(Naz>+lm_EtVH>gQ3BrgN&W(r;hZcp%7dGLnDTTu6ym zQ&PXg0iXqZ{P@q$5rc7zKSedfScdqeOc%*9e z@?eEp3kA)njBNIGO$4FUW(%}?H@#iuBsoy8=Gdd5Tl!kl= zMg1FuxZjn3`+Sg7Iek`Gov-a)9dA5E`c2Fvs>D_9N{I6E0j*Q7p%Xm8=3Y#?h+?mP zmtCk;tnPAMyhZBKG|wHsbWUkbD^8qyfb|bwwP=^ddl={31>Xx9w7|=AGw_e&KN=VP z-^OlpMpwcFQCAhwfEY+u9c#ka-!c4jpdd(Lw)?Dhnqn+qFVvAiaOW%Ww`#l=U{lN_ zaVnPnI-1c{l*;YlnGrOZcPp0|*i$2Ovxx;yC+!TE8}y{(Ny97i_ZlnA<;xr64hNMx1nHLk8`3MO2iu zD;l}?_OfULFrtYx*+UKlf5_Dcp*p^P{|(jAx-qz|SQYB61wHI?;iBSNpoaAoYYn<* zkCU1DT%p9YGpRzobuy+m$*s*9+V7qy;N{hR*qY#!OE`p;pM@a75kxB+xr~lo%fVFi z%{D3O!WvI!U{o|_1U}mKjp-8PWm{@@$z5iGpd`!-z-gZc{*s)Ed?|d6!ZHDTm9lWh z2=)_*ejq>3c&3@75=rnnA^EaOaNd^EeBD{XjP6XOn9Wj$$0qUXTl$4nX<7B#Uoa#EF*Gj5>sZ`Znc5qu$FbS+A%}mO8+FZ4#jF?4P$}8Tcnc z<>+wL`o)sC70wt7bAc8LIjUHNwDO&bjxoCcoJz;{^5Im%DMQC=eW`BbWZ`Yo8<#U| zFM;KX`9|0*`<8<`QE$w0G))NTVuHIDEX5@#a1Po*{rp>Ey=5tu)3oVIbtf-5b&B&>%gtl6y zEyA!fAI))@PwSov%ywFRA4o?&hcZ&=ip7U8d1uWb>=b`QuI~f*k3+zBMMGMg+O=jO z@xAG$NGNEQ*@!WpiPza|Df5>~z zhBcZ_e(8`C&N}sBR&>=69SK*Wz!XifR&b40nA{jJpuy-izsJ0vw<*CkbkJ%5`Xd>&{ll>HDce1hS**hv z%-NUq>PYDR*4;vS#r?4rt4!$uSivcQRa6k_kLO|DZ9{h~=dXYWlaQ8MAb!P6spXr? z4I*!86r>_h{9%)#18BatUuk6V=h@&;gdlcxxH^4?59m>IutR<(=B(+K2pcGy<9jfN67)d>ext zHjILypCBqr#VB_x)vbxVpe-v@`up0V#&0I?h%dW}#`${evQ=_bRF7KDzy5i5RPX%I z1W4%tY7UvpOULDNc*MqCz)!2=BbO=hqGR`c&Eu56Xmv_4DbSmCwz$^>uTZZ{j@a{4 z@HcJ^PW}CDKvEcStjHrIz?3Zs0Ex4vde3qH4;;G*ZdFC=eOle-VaVy9xl&hIx_UiqCRyRV4uYoEGA&PqQ{B3(G$S(02CR#5O>%${QU|>6JPB z$+k^{Mxrymps*)iTDuo*CV9+{cs%D{Nuh5B)L8oWo;DdHhhUmx!Y3Ny^wyv|Jd0lF zub3IfjkI!v0}F3!umnn_Fa#8SBKE`PC8Lh>a8MYb5*#?fzsP)wtl?=HK%1L2@81enzKgWk0zMUq-kNZ2 zrah33UmmiB1avbIxD7yZ4>t`iiZtOcI*9ramt6V9TnAMGYby1wV7F72(d#}Ap}Z%e z!s1v2gFEJ|PKW@_iNBJm*W#%a*2g8T)GlZhGSX|QHdzyvt?Ai<_ zN9yfbL}f`Z;? zbHPzoQ@=rB_U;C)AjV{EEV(fI#QR5IK&Qwg^)8~Bjj!a0V&mnyt5%OnTWR48=sxepEDJF^{&iKhOCVx1Qk z4!$xKVfA|CTZ1y6&W7}|hPu@mu@g#Qadt29Yl9mTtm>UKhK zE&y?yWpzoovTPAn>@1xVYD(=VnSdHCwSX`?oMyyNew|huJ}*})WxYjXE`(JGx2>lO zkOC$~U0G;)FTFS*q+Db2#^`2YWTK-X23TxQGZVg3Ad{h#f;w%%A0xz-sAk0(@hNym zOJ9DlN>Fg#-qFnES_!v@1vkX$7eJRyCb3|NGDFGxx>ScwrvkADifCZhf#VRez(fso3Y7!-L z2OCUJC2QuS(kRQKiNobOlASSilwc}?Ohj!wQ77(j`uc%->xBCv+BP_17=>W|$Z_8>zW7hk|?(##aE z5iEIkyqTpF^lTa8&TTQ>^p955B(X|uS>3HL;t%O4-uuF=@Zak*SoVYTR|36WT=9Dm zt92;>H5T+vmKWe??V8AgrO9Snr6RBxrTG(4>-_T5V7#4nd?5bvlFA%z0)Q`hcabwX z7WEY|TU)JK-%AqaZfax1rm-J+(vesE3t!+Wh zax6ltOco5tdVGYMGRIA64U9jwG>At~K^48Z$D&v1gV0oMt;|m8YQa^CSpuumgJh~l zJNe{-?b&Ev!`1Qip9vA!6#yz{&2{PFY%3`j-EeeA)+yE|E?+8wYm*!~n>$Xam@&WW zFVBEiNV~!fc7z-#_TRUz#qA9!KF16gmV-xafs}gndi_XhGr`l{js6d5Kl^rhxzyW8 z{u?*1R?Kq2ixR8CG|R^OVroskfrXjhNkN8#Z2|SiXzI}`u}AQ4M}X@JiaxLX(uvY2 z^z09wFXti(s0&SA6DNstO_ear%<&i$X4c~xA*d#i0g!*24CQPsF>y>)6_LNK9<2s!eW(MEmvystlI9M->up9u>_i)?@z*Nz` zX_iP?7>v`rs5I>#tAGf8B*!(W6lQ8D_s;c(>Ilt4+*%L+*W>b$QT3-)At`jOsRmE6 z&r{n|cYZ^oJhX2RYI1?aNBPXULyJ{aoM2ff#(m?8N#g+oI}kb%r|=^e=%R8YG_W9` znL1VZ9oj!HzQ+WuP0+?cf0XwFedAz8(lcjEj3BZR*fYg>Q~;MOkkK!@ws^A(E>d8r zkjerQw_;Yq&99Dvh##$v?|bA%n8&Y71ue`_R_|&1!)32Fdfq78oH7xyQvp39g%M5I z)eS+gtVh3q9TL|RY4+d^Ao!g&q1)2Ed?D zB-`?T=OMq|aiW>3{yzX-K%u{LMRFk$0Z`cTB4xRJsz!$d<(QYooc7Q<0{f=nqrb>P zqagN<-Jc|i3J1Xy>udeg=5L$|8(Sqf9e)*N95XO}zhv+9_(Vllf6uX>d&t-LOZ8=L zJ9HHr0Se*86Sjc8j+2IXLHk?aBx-_thKWzzP<8G4mu1roy;3uwZk_TKGKEhwih&gm z^kYzPCCc<6?94sR=@|(w+9fcFPtm|^{cwymOv4}MVu4>Y zgbp?$Nn8iMPd}E9e-)Fa$p-(fpZT)u58AgUz>%=L4s(^uA%Rh~xu4I_iQxxBkqfnX zlNX|uf)v2G`0{G+v>j60I@|_?n1J4Ctl|VmH@TvYj-zs3Ta>)9>uUYF9q*~$r3F1B z61(*!Q1x<596+rQvwpjQGWm>w_#R1$mZI24-RmoBfexl*e}^Dw^R6C$N%ph8!zni3 z3BKb(z$XlvW#pTp?*W9W@A+tJ7(uT@aGHU%>NJpH(Z54~@40F1;Rx$hXj-7oCzZ8g zn5*uG7wes<&;K-;-XV!u?ojD`8ZrSrT^|zmmh>rT5sbNrH;D1qIYeh=N2t#>bEB4 z5U6*qyiVYg<9hdk1K2>OYu-*UGj(V=!SAWPROF0Zn2K*QANLClQ9aKHM1_SzM5ReP zpM5rV{D{{LpGE|br!)?$0b;WO1Rndp4k3(7oZ8=)rI$PXHRoerKq=z<#1jb>t+(<-W zJ`E8pCA4MjhBg@CZBoC70bvL%SrXj%`=LmauLX4s;++n1CNW_;8mP(^KAac_IM$DL z(v-adiy9B?cSK%B7ND%f_O<1$+)iACca&vnf5f7N_ylPVJG$p?Z-sLR^cpI(ssqZlzP2BHLCse3e)R+aZE_XZcs@&%HYOAty7q_TbcUbt zt{TzR$GcBGBLqoqc`ZYYhcMVyU_O$x(9Ulsb=Y4}4B!#LaP>`q9f51aU-5v2V}1ZKnE#@on{&%ezhh0-Mi%e_D?e_m2z zI(FfTp6JI{H80F`7jUu&E7v!V>m}WU_?dB@Y>emlu?b+CbN9M$JFpjY*}bfEvcTZF zJVmq>c8@MRz~_;27W%D=)_U}{^#`qKN+Yn&yJn>KxLw_vTsXXBO!_nT)3i`MejMTR zzk$-7%)~nS%r{?dF2)2edMZOVe|)y%P#6WpC{;2~=<=Z*+#Q0DDJ_O}-HKW;QX(nz zu?tNBLsEvOpHok6=>4c3BF(05W$K1Ue=P8Jc=!90x95)&?_W<^t^FoSLP`fm#*yh| zW+5;kDnsS3qN!boPe7J73lOJer@*Jf4R24cCN44-uP&}VV`h1>;nJRkf1z|g+r(vU zmz{!3pTb4i4((PoRdRBpx_JKmN{j*Bac%F48_LmfxMeA>8545zkyJ2-MOK;9WBD*F7em54qx-DX+sUDLbM|*^P(S* z@(v+qfn^G$D#f6>+9FyK{k%#4v3~s<>LedJLAaUc7_yW&T7EtO;gW zLd^>a9)x_^T_pz=@MT$0d;J0?FDGHj#<$?ByYGZ1xj?}%*uS=Xe?yIZK2M^5aEW~K z)n_(fsWs4F6dI04MT~%5!^nmpH{9it!(|yjaqzgZPPg|P9E$9g-y-H^T7T*3nn=Av zfL7MMcMVm8vJsXm`yNJX$cDn@+UJ5Va?Bt2h0%$K$l6$v3yc63B7CF>CJZc-n|fv# zfZ#gKD*K7P(s%+4f2lAiI%dI4O^%c^HZO}=bI8BF$r+M<$2u!c&L{{Z5XtRZ(>T7t z{~Tg*nHO8Xz~dl)#%Ab4R!D*l$v?Om2jBKVCZirNlj7&qx+&9+s8j2m&(K7w~i68}YiFK1*g*6C@xIe>-e-hhS zVDqE*!!y%tO-EDb=zcMlO2;QN_e|`S5gQG$CP3@&@ z1Zr)S+otgEe#j5sU~exJ?yHn$Lrxac>mv2`C(jxve<<5Do@Sm+Tljw{Tu0SC@e*CI zo7l8DENZ|gnv4CyuVyH^s;xipbqbGh4_T?bfYPrjg@8nZMzRvi<+%OZj!2>vhC?fX zGqHo=gC&p5azW7ZnqHTB0Asko^~0)%r5TcagglwKuHnF z1?r9N%|5MlzuSO|#5XG__|y$;wyz1bhNj$4kMww#=;|3AdaH#MQXXe_d(L1x`KH^Ioay0Q^Ud ze=`$>Y+*aJ=-49D&c2&VFLQQPo{_$+CuQ9SUb4ixwKCsd=AG1S8)!wrT(%=PHOL#t znxgMQMs1q;W*vhX-j72ff6w%QzR!Ap`fSZI|62d4B7QsyrgD3#Ci?Za7|Om9CRRFT zg-Y4)ZavhHKzsrw0&UbOXlwsVBW}xne^pe-kx7=}=X|jnK||8r(Vjt-K-oqb=5y}Z zJmzz4)dJn9FJsH!J(Dn+kD~CVTm%Daple42(HR{{G(z%PIj6q02~p%pv|7x#uu-q} zfzOj%&_CJ>bCl42;ys%yDDXJAEFJJQ9No+7W)5dX58a-7xojc9=s0$3o|6)~fAtzR zgBglqm`YN3CbxvbdF1b#$NXW5&3vUb!(-v5uAUQ*3DbewD=%qFJ|ZHFI*rQ9LFt;) zV|uB~O}se%L8W3#6yhapCuR6^s215boU_@$?APk@emCYxaczkd@4_F5#WLU9yt_sj z<6_U;JyNEXA`VDsJ&N6}@s6r5f7}MJm7o~=Qc7x%W2u~N>Z0fa@lVe|+wqQn{H{+^ZN_=K^tkmHeSpXGDdgZ*oEvD>yf~$bn%3TtA<&A zTynWG>RX|S1jmW*Wz(U(r+qAO43;>xM`v_1A#pS)B+djKem^4=*Yr+xe~6){ldC^e zA1%F*!1qHjOMJ*rFg!GPC?>U37#AR37MNV9o#Ebd6FvMIEsni3iU;dFPTfw-^%6JS z21){iT9mwFE#mD{KIytOMoDqL%Me!dTDiIwP4F`5F|P9M*G`6R#n$}M{7ja1cb%)o zgsazw_DljDCi;ZIl|x1!e*rHb>_E`5LfIigm7=elVp$|1^#Pbtln-XiALI3aabTJD zA{zRXgfikw2y>#49Z#bjv3X;XHNu52D`HXBXmg*Hz(_-^L`H=IJ-d3DMux^@&oj=C`$k{t<=j07lBvz1ryEl$T}z^Z{%qwRQ&1{+EcCHDe^DK9U++-!0{2Wf zX5=#AXd3(LjI=S`WV46&W@$ra)KUz3a9I1L_^V<|JoC?p{r+pHkk1pR%^}h?mIys3 zWwcFf5ek=FdF1kkL0o(6+T25fS`PNyTcHtb)zRQIVRa;5N3CDT9F zzbej9^Pf9bf7J`ze|BHx?)B-Wvlnm|DH`kQqHcF)7k`{cSc@-}7Wuph2}8(hO*fPg z@1<_LRC1YyGrAHjsoZ0eIEap}lDs)WNVR=1f z=_VU7ehk3GF96!Y7G*Z16Qi@Go;6Q`jBrZuce*E zw_ylLHu-155#dc_IGra$TM4&hu0hl8gJEQK6Miv~?#aMQdVOZfPpiNC?>HuZk5P`F zr$f9dO?F&hKzVC#_Sq0{ZFv7WXOcu*$x@6&BaqZOQTFiRPFgFZl(QGUsxj`6EADYn z92T=WfNfa+9QkoU@TVY^R=~FvXzez`U=a#sOiG9U0~|wIr0TY*}vjY{k!<_;f zCztp90~WXR!~#1Vmx>hx6}Lp<0-ZYoGBB5srU4ZYG%_*@FHB`_XLM*XAT}^Fmw*=m z6$CdhFgTYX9s?_XR8#BHHqt>lf^-7XYXAWO>0NpUkrF}zfsh~x9i&(3y(3630@Axu z1*A(?kS1NKfQb4Cb7$OR>TgmiO|;}rmS!qAQYLkJ4u<^iz>{AwAX3vz+{X-$Zj6JYEJL;dA2LPF7= zAU6mAV}QfJ5CjSn;*PL~xB)P`1B^7a0eY?w#9v_TzW@S&KZgSl5fb@Vx_7D9WW1ppv~{VyPY2#!Kx;z1rD7#w7W0sJl<1W;2n z0Dv$Z{^<_|c7wU1Q9>vf{8x{{ztUiiSruWgjC6551_Ddj*9d?4iHfuy=PAHbKB1yF)Zp{$MaB;(yy5AZUO%P)b5VTm%4l41jon9ff~w zVC?OG3i<8)ZN~KA@9TT4)2LtYf6ArlQFI zr{#Y+m6VWP0AE2-DS)7q1P~x1A|e5hloSVl`2RDHJ_z=wj{k_&L_m=MslUp_oYUVW zd;H-5&mV#C0{)px7l~mm1i0Zj{28D1R(5+85hzXBX!K-U=ID4=O0CY-QCx(H|*}=9+uv>!?kT zr9Smo$=1G_ZX{iQzC3(#){l|z^W~V=qt`h>%V`?oCb4v8@-MioSQDwjN6D0bBqj=M-#djObX!yska$ zrxt7+tLR~iM-*{XZk8GD#+oMM-?5*<;x3drV(7nmuUp1t4uAOYCTE~OUF@V#tG7m? zI-HvRmd^vWypg0qdYZ(X2hAvdEG{MSbLH~X1a|sjmvF9S99zldZ_|YX?TLe8?u`z* z%0V~vp1f^xuSbf{%I5VfpD@{MWE+1KCZ%ghigFaFP3KVJtg**BAI>(wsFJakky^renA#;t0v{nVDuPD8allYp-uN zu~}36{2iq!pQ;49PHPU?ZNnR%7e5_fn4gEM-`=Gz^H4!*eu6#TRE)g9m~zfodkZT= zm&igoOfhhpf{fbvb2;;Wi^VF5x6fpQTVzx31p=QeO&r}&G1!l%s9V2j(DN0~I>FBE zNLZB6S}VWnp`&f7F82fU-2_u=hzS0kq02}JECy(->vESmpY@Ib8 z=9??lM?Qo{rF2gPtlK<)%iQ^JAdV^H)x>^pCwJe!wCU_CiHPNe%-xM3SL^LY-9y)J6_1rv0954M^I=kA z>(x4eTvEQcB$1{8Dx_cTQIUcs8iPe=5kgpw&?e#yxV+XPZQ-6J$J3T*%K9sH*Q4`Z zrVrF@bxgt!27SPP7dXYiYWKc*=!?DoC~U4L@y1&b*FWZY@V@r1}zz-1eHHzcsYW-QD3%@7Inby*$4% z(`98g%u-D`DLKe&ji1Io`^J^Bo&jf7`$_vKK${ZV&{5=n1&dmq-Em3vxIcdcoK*SJ z3Q$tK)Wbs<%H#o^L5A={$LVr(_6}I<{V(A1Oklp{NcPXw)&Yi9pR6ie!Z#@1!Ae85 zD)fe?;@C8A#=M+<`E85tiy`F?8}zi9OlJ4n zoE#WZ$e&K*f69~vBfIgv91I$BMGP&iH%xz=@vR`$Ef2;zbmT;Rt=Kur17Nkzt?Cxh z25)RunJ#XO4Tf}s%CoG_w&iC8NU#r1?9c`9qixhk@^+PBP#KzA2P8Yu zABf~kNFN!7T2+0>w)0U}mS^V-_Je#V_GH_xOBWd#+do{w@F+^!fGB~GxQZ|lieGCe|5GH z3m!Rb97o<-z^;nU*48L~*QWLU?6fJ5H{%Pz<2?SkC9s8eYX4|^aenpnZ>&dbq8WkW^e_VOR<%xQ3`c|t5g!ul?pb z*zwT)yv43A;ZIVsPx_f4KhLUBq(Jd@!mF4Re!s0+o{d)1nd6mc^|C5|xMZ*vl+o;# z&$3&-&4KJUb#`Cwin}A><~o29o^HC{)VlCPdLQBU^-T*tQ`)@`L;YH#RBo^g+!ZAM zx(ZZ1aBYfacxZIha;iAE8c{_US^s90e!fLUBuz!J+i$O|>5Q^*{q zAH~=33<4>SFM*bHVR<@#FGkR@Txy8$N)ndE!`NdddJls+fXwqhf*LA&P32+TR8&zu zr(5?1`u)0#U@7+xU#;(*mSZjmd%5IklHlL7NbNkpTYaCBL0W?d;2A zl3vYhxQh0n!9yIepo=DbK?L%w$9ndE>PWOrqn@0-`FVZmLV61h8Y8vhytOaHUSgZjUT*Wkpc%##z_8)^ z>byUWWte~fm4q$sEo2@NkHa)I`hxfP6H}pa!2wpuxxI*1exY+^<=bed4*`{hgp3HF z&+Q8J7tE`ykE5F7_dw-l20NTSq0@8^UbfDg7cms}h@mxqy@7pQ&xLTO??m-mCf_My z4pF(I`Yt%h)wM>Aud?h*-ExMeXGd4 z$V-Iyd_I1Evwp_7BZaazGhs=4Y=!K>-r>oPwF<24yJg9dH0plt`xen2w&PpNCJ|SD z*;r|J@V|-n>j(K?Tu=GQ{*1}O{GaI&*Ynfw#otC{NgbE6#QAS*Ci4+9 z^EFV%l606>)0jSg&qNU*v?Hum#>hC-IszNE{jHyUFwepFuWeU0hE-KZrm!DAd-ir3L-8Ioeg63J@z@Goab&R$?(d zd%|%frCQiVo8Tl%{M1SwP`RD!>xoxmLoP0MQLOgaVY<8iZmv@1_D1%;Vp%2CYUksZ z<3}TZNmM8Bv5=65^6eUc27I~o$rF%zIbt*7x)SoYLw%&oq^vtcO)H3nIYY*Fx zBpr=)-(qi{bq9D|sB`?xXACXg9T)O1XdS!xHl?}j_WSWJwb9HJaBW>yVz4Y-^=l~G z?HjCoBb^mO_`+MB_cFP^1y8)WUG`D;Gfj4aq+Ho-y0A+PIu^fdaF^(2 zt2Z33;$_H@VfUAfzH+i^phBFAnae#W@R46oIS7>1y$rk2X@?+Xj`e+f+s=YVj(y=C z-}ck4p;6~DZ?Q|{TJ$B>dqCi6l*W304{5xL=UVHfRZ$>GCu0K5p8Ydl)g+qX;@+p8 zK@0S&nUq2tG^VRtjtuCWb0238XJ-zpyL&Y>xJO`UOTkqQMY}StS(?Jh$mut+-1Br- zR=7dUvt)x$nNhfQt7SC8uBSH|PoFUvCqM2|o4ki>^J7MlGN~J}M{V$q;Af$Ki&mU3 zmygW-neIINAeWPMOPJ)_aoUExoae{fe6-&mn+F=-K%AiOGtR^~p9mAmmy5d4^X83= zL(f`k4pLXw3NO9y@T}L^axVH-FjADVbr`VZ2m`rLD_*T<&@H7({;Ck>9mf5Cij4Scz3Iq>=5;FwJ0b^6B_%F!eHI?iAryi(tU#uxVN^5iF#jWN&$N!OI!9mxX>!2I9cQL=psv@%wxI4bDe&De6HzdL*4<=X) zcvKchxuz@X3@rqmBHbTIisc4S>^7WutnPN71!ygq`R3?MFN?{4&&9`<>zr79l{TZ7 zxkc&0nh-{jfoHxZgBPmAnnV;;YEB(5q`#^uBcIP^Toefqy4j4P-N!jMvD$bMk|aB6 z9{uCy_ayO#SJ8oPfjVe8Z`qn~zV#qGWt^@j)})>2env&Nx&khpyg+4pymIu@Xh*(yGnRYauk{WDOce4zI#$a-)BqPx9k`^ zl)(G}s@?qZBtzmQkz8=8GxJt`xe0{B8Ih*imb83-4?1N&0pG|(Zwx#@<|L}@Vp;sL zQcqGY$l2`5xwx>r6MMwGhCAftXXX;x9CDhT`zEC?=X96uX(R2OmQZtKViXZ_B$;;@ z8IIE?(cI>#_B2xbs*-g_x*Pa}nf5XFeEY3VVq98tg(K*14jfbDwa>-T6x%a+&_A`n z4#&5DNIU<*>WOrvKHJG;%T(>t&y`e@N79Y=Iq8#2t({b}XTNqxR*KGz8S7ur{~UKF zqhxImuUDQd_O+W&>84nHh&!SkhogB#bAW93XTFUdKIDh(J7U%hj#n$T!Ty3$GzP+b z#hW_ykib0o`PYL(yHmA|H&`h49XD{SqD$<5j=G7y@3ik$+U$znpS&DR8{o&K*he$< zRMc9I=hQ{gKPdQ7uBTAMsgtM~yu3q-E@_1ziJzJ__!cy0y4BwWOGEIrw%4u5Pm2reUYja(05mde(HhRbL!r&Xrq_Xx|;b~$E ztyhL8(Z{Y5<}kIE-22qv3u{GPbzn{UjdWI4@ZjYm6-qz_a*&R)@h5 z>}YoNbQ1=r*p*8BQ19p?w1?M>w7b1QBCY#FZ<|{$jqTZ!E1ui&Z@tzFx0;97czxuS z@H|%ICs__>ON+@VwfVVLuu+xh1i0z=qg=+r1snt!G}O z(DBY>3i>wd#kbb#&0dL87?$-kkbAw^-Xmm>>?bGMpXN8o{aZ zo%+uK3G@s;1RnHQ6w85YPdJ6BwR|4w-YSR=-MU`CpjF)^5LkzpicV3=>fAW59Bw>wt2ptn|DfxI?%UvT6i`{t&A!!RQ`WQX zK|Jbx%tXDKVavaNvtTBV#I=_RtbD=L#FdBjrcyCiv)9&{vhMN>;qB>_P5(KhzeBvc zFScY_@ZBVw8mHDf_eaJR$)yn$9{t0wJ4x@0Y~O#I>(gpq43xXS@iuE4CejXlK8hjje_=W#uM+?VH%hHBHdKDpXj=6!aGn z&C?;rEG`;~0XKx+`^8%jQV6pv&D1fD>2Web6|-ux9}c8&xUh{MztbSVmc7NPU63V7zk((QcuqG^Ua$4q5q=^GimX9qAi&jk9Tu+S5zzYBt54} zemFjHc%aFuVSxBxTfzVvYg=V*`6mj>PdA~iG~}BSSfpyhATzjQh{ts4{{a1`k2sT& z3={z~moef36cIBwG72wDWo~D5Xfhx*IWskvffoT31U5K0Fqa`711W!X2UL^Ywk^`c z2+~17CG;LbuhNk&y#~;b1PCR8B=p`v5D@7gN)Zt0MMRo(5Tr{HK@_Bj6zQEC%Q@%% z=e;rB8yO?{_FQwVz1H4ye&J#>FcwmVqwNrP&?uac2nZ|-RMj)Klm>#qVjwVB6u`x0 zg2cHX{=xt*GXw^UM5BLX{}(|OgMi}jm>Lv^=jowQKy42fpokbyL{e5nN)`+Tih{v1 z|01F>vOqPcClU_S0|B+sC>$qEa5d3k}Lu2_E%8snhACkXUH;v9iS z2rL5QiGTxt4Gg>sbw&J{3+c93lfGvVeuIrC^!NG#BUBX z*3t#)yCG12$hv|ceDsNcy@7!2*|21WTGQ4T4w9Cut=9*BMSd2 zgFj_;6kHYU>WV<&uz+9vsUa~482;FOg#X;EGYaj6^8356N21{NzlMN&xCxu0knSD` zEw#TCJOua;=77KfCBQP0lHxKzggX%74RaL!Ro=wM4e@_FDDn%&PY~eehIRwm5 zAng(OAAlbg>WKj2Fdm2izyBTh=L#Sq0)!)BIG`QE0f_?qr#c=+*#BAMFCT;S213Ai z?TG-vzdrwdvcby>jz+oo{D=PgeueMqT9}#}3;db*-!T;xv^UUCNDK@Vl97-Aiik){ z0Hvg4fB}F1EMovg{%r&NpIj}JJsK$Ur(66n{i|cozXIU>YYsl(KWp7Z<5i0Q^8QEU z)?f)R4F4ta|1I_3DgQTx|Elu;68V2ObjQQR<#(9(cl`edLtT+BK7R>#(R$$U2GB#} zZGif3syX71Y4s3rq=)N&N40QJyb+X94tOyOiHLuLz~X;!B=!!{8v!>!;$V({B=ZM1 z{be;5Bnn}G#v*^cTku(6@PEbd{(?E<-yc}KE`Ns*c>DZwUv(4=4gcjcQ3**P6oY~K z0Kj-TiQ@0uPXupBIKun4l7Ye?6dH$50pe#20NSH5fM3@tE)5iR!yxhF<6*!*O2a%b z7`%VQek%aK@4wc+{ft0(BVd5(2{cSD+^IUe>9A6n#Y^bhd(zKeT4E9{yP_p<+>_7z z9Ca^eYK*$8+=rK4?@u$BdJ#D?;m^XqaX9F0-Ig6Pm#X;`N1)!dpt2>D+jq3n=76{b zM>9JNNu|XsP;Wjmyh(WvN7>r-SORVpiG9@;R8e65Qu8R zU3oWm*Bg5jn7SJNcpKwev9{@c>7KAKY(}10f*jhFX^L8+cvVQV@8WzP5>`Jd+Art^j{tqYhUaOvJHF?VVCCNU z*&R|E^nfJPF;TQjL0)=8n6Q6LbZ_+C8_j1ss{K`;`|h#U9IUd`M1CvU0KGHq6CfT$ z6^%u3WZ|ger;irs6A0DUXkI`(wouP=QQKz2j@pDW;@K1dXOV;%L~cpkNgBLATpuh+ zWlxhpLS5NxZzsnotifs@0N6usvtRxA!L2*Ed}>+q*6EodMiFQmm>7SXat~6$)Z9v) z5vJyw)#eGvYBpXsWwogdMNyjx^3a(<`*OiyKOK__y2Nbc8XarA_RbSn;VaD#k6be) zVtk9Doec)5m_da-XA9)Ors8d z$4us?smSRQRTn9j)pHm9A0!L30A zWx7n6S9eQbId{kE;+83_LJE9`$weRsa^j02Zni6RcQ@TmO59b{fHagmQ!$4#^gIuv z=H6!oQClP(bv|^i^)Fb`ARsnO={BehUj2Ah*{RMV9^Go2K-s*~Fp?fSfBV9pYu0Lv z@BRY?SVw2%o0k6Ame|q|a_>^d2fj{Bv zH*%y~nXWnp&}pO?y6B$liEAF-dYF6_V|?u((`1JutZ|a2^r#uUm@>e8=1@?pXY-BA z@1_H7OL4m8Q>G7*B~Y=iL|L@v*{}P1K5wf%doh10$X)Ho);%5eA|`HXn0ej(!WLLX z0${1rIiXNqcuo>1W!67F-j%A7;(b6CI@(99rzR>na^qyNfZ3-Ko$*>WCt{E-Dvp|6 zZ2>4p>&mgcliAKg(3oMa3ShMM!E)amb{+_@DhX27*jb2WY;gK?6tehZaXvE5Xg`Ft zqI`erwd)plLUnbw&016;$~-LedJimr@wo(d(=|!=w$&IEyrzv#LwbU(qM&bb=)OsJF0>h7i)Uo{4&&ILsY||>#lq)pCo(OX+Jzil>9Z49YhE z`JBfuO5>@^^xH}6l$K!%qlxOG*JdWPvTR-%E%vku^d@%brrXP2$rHg|VbO1qK$?F8 zb!YpC&gksrttgX^Gw&o5BeFFknRxaMsjfT8Shst*Pdc+%+vCS=jCa#?G_$qql+&qm)^eit-Hg1W2TXv;W^KU znV8UbH>B}FtB_#E@VVg68k_J?mehaf_q+?l3L>5cx41=J3T`~uc4H9LVz{YumaD=u zV9+Rw63I`~Uh&#HTAKZ_aXM7n=p)j-uV zs_E<|uU26Ns}EpO$&o%&2F$cm2ZK3Ef~Kd9Wucoo0VJL}qMRWF}?pOD>rWFcKJ-n>coNcKy3}XT%^P z1*}>3^$?fUJO3j#sr5eHvL=8yVPCFd=>A1^S!tv?EP?GLjjHtXBS{15wdwu$^m-iS zxzfxTfkWnPnA+C2w1hO-C@(mN-VFmT{W02(Hn&ahohB>j>Qe89$gr|XS zq0R1L!tIqy#tJ2FQ=#e$1rKgfizj^?Z@S0950QKFb$Ltkz2xkvL)mGe$#KE0fW?vZ zD4&5Om-!p$*yl-!@?T@?n+de$^Ji{n7@`LUqh9#Ki`9?YfAD|AE$}Cm+Bn?r4^Vn$ z047NYE-?waOrBC!EbWkZMkov1iyvOBo2V92o0ZBt8huY#HLb&QjqUry{q5k^BfYdJ z>*e}XV*2w>z6A=W{jUbYHCvN13-%$X zP}0YZMCLU;#4~?o`GHtf&}fEIrRi}~m7X*0zz2b64m+Qt_MK{$91ICm3F_QXRx?r7 zpNoAfZPA27^%5iUrY&C?N6JRzZ&4W8=9%LE@Xq>?J7p9)8b@`>@BGrD*;gUM>U&wq zwvL2?>!(_X{5WnJHWVXg$k~pWf{oW!%Vk^kvIXvrJT-scya!V*B@<_y5pWo1Cl8|g zb5L+dDOAJ9Qu(%f^a~5J94Q@>XvHslw$m^D^$&O##YI^sQ5McJZa>wlZ|fuHh3kAI z1f-XqeviDitWLtu%e?Y7xw=KSZotW%KZSiB0t@ zp~W7srpA^}TUvCty%5k?3MR;RpmtPC8|131QNBZv^jMVrg8=wu9bNX-mZNZmjDpES zGNa{1c}lO*rlhdk@MQoc?;@VJ#|pRIfn+Kh!H4XD>V(*n()rjH??ce6$6H>NUqfGD|DrLtTcx9oXLC@5!tDjk@3iPok!ZlyoHNW~?R7Um$y5TogRT{MGHMD7|nOiv@QJa4h zI+vQ8D8?bts2h%^b2jBLj~{~3Cet^ED(OGsB*Z)={Z#d&qP0(m!)>#B;756yb_pGj zW?7w$tmZ^u>O$Ny{o@dikhrz2;-y*p)VNiO11B<$N6C#YUVbSr42EdU(RIGrxnV?4 z5Zrr8-GccP?Ctw!G2~PC#K`=^-j$>5`62=_v>m^3Jzh+Dlo zwX!MD>O9yu7!+a`@}r?@T?wEfIqoeTa=VWGG&d<}DtN$OMq1qLO~IVyvi7Re5I^ zqb1Z`$M165$(d*JBJLboGsK8<=J>fw#kC{hs-g#{8=Ou#PLL^;gz==At;z{ql#TbK z90?&A zI{YL%OjL-W-nd!&xZY#4@>r#8AWiO0%o&r)!hU7Tn|tOT9^{GJa<0u?f5Be0 zo>ivOq+-N22BTn1XM%+;PiwgM=N@?GhcRBZ84s-Ke5}boAOn9$ZMEqkRgLMI$P-HY zbZh*D(V!FL!*%Bn=Ro>Wwq#*;lGX8~!%HI3ZY<<+ac8?RPqzBZxGrr|zXTjjw%pSf zBVF8^1Z(oEJtF&BwEGSuN$JZ$ign^2o?+wd9Stap3vS}jY&!9b58d$%h_4`_8OyKK ze3D}Je)l|hnc#nj1lM)*-H0HFO~7R;+i0Zs6A*+JHjxfaTa7ZjI6)}*LfEVy-%nqV zb~aHhObY&C8~7a5*;JFe|Kp$t1FD2YajvAqENJC&^`1VND0Vti?ug4Y-AZZX%x6;) z3@~C3p)B`nou&5^bO4Y*Z@=!2(CrXytliY!H`6m0C84;ay{MdjVDEoZwot2+MumQW z|N0b(MhBK8mq~4OR*;C*IuNuSA~UJ>tOC+W%ajUx#rgIIi2(o64)+8w&})F7>>fzh z!|H9trBSUh!Q4@`9)=S7>>o|h;qr5Uu*s~tc9NU{$;*bSo{@I?sz*iXv*KFeJb=7X2%%MJ@9es=%FyPW_q7999BaX{ z@?ZcNL+|&NWSIil!#Roz_*_ZFG2S%oXJ*@zn@V1yuny4ZD>EHq7H?{cLDQ=29(D zva?K}B6~m+7fYoS;8MlDj51W5fNA8AD1Rz6z~}af`R&qq52lN6$E3INCaI4GI2@L< zXBfF#J)U5Hi!HUV(FyHA4<#_X#v2^MFq2!PstaW^uULorZtqFAU8>Z-7oBG59X964 zD3Q!rM82C2@KBBxK3!E9DDEnUVvr0_TirRUyt}(vRCNkPw%w({tLXyKROe)oRpfhu zB>n|275K=O+6L{++TYZE*V66u(D)(Sp5z0{6IT#_08E_Ic6|uQN+$5F+i23=x_wUe zV8bh!JlJ4%bM>;Fa??&-5h+2&Ri!YCW_Gk+Rc-a#lWs9%1M~T*JsC5n_E{>(y!!5q z^cu?YAgJ_P%j1s64@a&RUYDjLt`E|d|LNC$e7##N_tw108N0-fa2VCpmhyL6`)lTP zotLqH20nR7MQwJo)Wi8>Dh_;EV zt{V#C`DE~zJme_+&WNTiL%_*^wK6lM$IGomGI=@ch%KS4Q(r!KS+wtHC0UsU4WGC7 z$DBuTrjQOndY{;k;qY=69!T@aqH9-w!%QVnmH%f81NA6ByCSrqw^-QQq@G#Jebt+X zdCS}6+qWf6T)z#t*^Q;?X@=%{M^yTMZ)=x1H9Qu>z?$Dkb;Wd3hty zcC>(PnKI$CEX7^$?zxi{)t2zh-m74}^hs+sEH9D5Dis}Me%N5ZxcpAjexU|LIZ3~@ zP<-dYo6|fNsJD10^3dUHi6T|UB4;@TewmvsX3|HKsFZa|C02N$lwz!$-(W!0NZn+vh5VO*Y zWqZYyPu@(3pgzidH`;^>;f?&V7BOO#A=FPdvq>;%t}dJW`k5-vClWt0pIk*X%CJx$ zX)o|q{uDa6Q|orndemyxCc6caKxIXDV0Ol59obZ9alF*q_YHkT-U< z1loZ-ni|^zR2@vMfUaKuF+t65>FVmp%f#g2;lXHZ=fddVZ1IkU9^herR|5bVeAY9fCRQyra*fa&imiwDP5BR4x02W4;f6e`K`j;Uq`@aqwo0>Y<0Ap{!{T^guucAFtajs1(*OWtn3kfTL+1O=6_>Q z^PR0c0lLhf*<%4P|N8m&lRjv?%pB}(y?)dG>MxU;jE;n=7~S6)|Em)baqt9qGjIYJ zSlQSB9PF$BP9AQ5fbV~eC>dM*69n_`lhXF)4gj9NV+9rI|KfH3r~TCbtOgC>zqS+{ zKr;&jQ2!orJ!TGOQ_wG#|IdT|*OC8!^Zm=p|J#WFZ$J`mwzhw%ssGad|EP`atZcph zA%I5K%@s8M@(!RSu>W7GCh+f-l?R$xx!L`%R@&7Vvv{N z+AmfPPJpqqv#}QfGiZ!hIXD2`ETBa+1A6{7!2l*kdk0t05dbJVUx2xTGs3Tia&iEe zgnxID(B=H-u0GK3yBUS*D)NjNFV3Pig zK;C74BanBw-w5Pg{x<@7SNM%U-WC5v+#v5tzY)m0@^1w4uJRj!ysQ33?4X7DjX<%e z|3;u#G=3vcESkR&C>E{X2o#Ii{DN_dW&B# zGVo6dDE8l_Wd~Kv(#z2jX#WQTB(wShf`YgH1A;nj^9KYK=XVmEpeoq@+S}iHP$~b& zhy_IW?TQ0r%O14vzl#8JZSQ7h^6Q?p_#-5L(7VCp@H=RbO@}{Dv9N#=b^NUc`EUe1 z?e_m^Hap8d(*L%a4HN=sP(e@lA5_l2WL6G;%r2;~j<#-pBnJBS!{qck@n6Ud=9}pC<#~+IcGV1vU1bOxP1A^N3{&&nEOYecse@F12OW)MZ8Pq@5zg}g~i|~K= zuWwjDpeN82;p?JA{jaCxLN2M0jwJo7OR0RHe|)BU-Z}@EmdR)O)2IV~Xzhw~dS?>~ z*y->b$O|Bd)tiFFO+Sj$RzDj;N+KlOVvWL@F;;b|7tZlaJ>0DnlcnkJbCV#as`@e+ zravU7`T@FTxVSK!OSZ<&M5S=+no(&ZT=NFpgFEwV9;o(m%fQ<<4F z!C6R~u^7CDLmF|5^DLWx(~!43otGnLQ-VlaJ$p0z)vFVQBdh8S{bvW#X)daWgAQ7l zGx4GjeyDmK@Sk%>rKX*i6%!`hvCia15LM3*^kb5H)o$h*B|=y1Cn?}Zm%Kt zr1i-CQU&G{3Yv}srXqq{3*yqSzmC0m7|t60OtO2N($HJ4+|#6gN(*HuH|e#jHEKcI zMM5URCt>!+>yZc9U4pU0vyW19EdXcgVAeEJR(JNOyZX`krWzr5?Gm|RQ!R_Z(z-2e z9;zo1j(4%)c-+KvaIV0U;D_I|1(6Ld6tjPZL7`5H{$yDbWegjeMa(7J{;`K0>pfIY zoTErgmh^Z4G)g3YuV1`Vl?2MxQBb5C|GEJ#*oCyXz!dF_%rs-Qjz`$6={XczAo?OV z!KrrrA|nf$wXCp9EMI%^#Xx7=z0stK!Mqo-s4_d8S7$`r#xTkrQp*sfH=bMkg|dYN z!Zcp7yKRF~{`a=>x`OfE9)wZg!GM6Im#qhar@nhp2YM8LOd;jtXLJW1^VStBo&GR8fFlU(makTT z-6vydx->+UW3=(l^-3u}OS<{AK8XT2fn6trnLTvp){(%aQQhVqu1lOd1_SFv@Pco; z-`}j@A>dm?#?|peqeZe+BQ5ube!&qd@5N925fKT0Z%Tnw-?p5->QyTvDp39&`uO7+ z4*IOFE5JQH{o`o)yC9AILAElx^q)06IK4p^*#er5B@uKxwu|w-_DkW!Y!-QCWL#f( zN0kF{dxe^n{AL+W-Gt`q#lCCk5xA(9C-S{|@*xDv)KpC&*HAger-EN0ba)Alzs4Jg zj@)8@T>X$nZXy35C8?d~I%kBB90G@Wq_>JAmt{@yVqTRs3F$d>bgBxI3A+;Ge7e5Y zUG|3gl}{kYmalHNKOj$jM*5utK=i1Y6an7u%SK~-=S_ulvH|ZXmZHyRH%5bRGYaSj zZrAu(9wtVoGdvv}?;468HsH);WI~bZ1}>O?&u*@@K9pRH5IWxFLg`MrUaxOq54uqFJ;faSvBK;9Sn{SE^)|O7T+mjk=~Ft*Rq6qEykd=cQGuP7J$+OoQQFvMDzZ|4 z21J*Y)$8(zz7{1)@|nn!r#F5Y2jNha`CIYsh>eD^?*nD*Qhw|h=P@!|WgGq2q>hS^iwQkppJn-k3 z`d}KCG+Tt93MF z9AbUpJ`1OnOkzIGZI{B1(VWD;ScnflV3?|yrCNY>99;j%r8ks7%Pe&8!F1by)vfyW z=5AhDn!yx{+@&^U3rgjC>{B^f(%1y!k^9M2yFPz*#+~$(ziK(E216QyXq2Vekf#I+ zLh@Tz@{^#VBFw47^JH$7bNL+nC0J%ww*Ab&4cpi{gF>4cxkuj0YE(oyV(OK7Qn~(l zq@P4V0#Wxls?OF=Xvvp|FW!)UymmjmbHTrE;y5U2Z(C=f21Np_;<2y{IIIK8tEM{> z)5%^Wo0VGESAz}Mb>&m^&e{Se(M!Q^t0NK)yi7QQiuyhb?MxSYLR&7RAx;CVd0O6E z3^S$=_gyh{d}EiuA>Pd>iYh27Ufo3bD9rVQ1*Piyff{$|z^AXxqYIsX(o>xfAk^q? z*W3giXad`w*qR1TBhMuVCmM_ZtbN%TtczeFoD-gEob&nU)HY8Dm4*Al%RziO*d+np z>~a7KAS+#t$$mg7(8=rB~tv0o?fTK`c|fKYJEg z5h|l(4n&Au_5IpyFvld;+#0*U2lB%(EoG$K!2JpahM~$j&XP(##_rA*DCgyzZNt`4 z!B6?GWKB!vu|QW+!ZMR|FoGys;X~)u&;EI=0e5n(Z??pizh@XZ zfw#IxRA>&8%tNZ?ID+3-!{oNH10;}d0yd8sC&qds@+y!UA6OQ?vQ<>~zE65?D6>l6 zeknmP|F)gt+U5g)@%dDzf!c@mYCljbk(^vy9K3Ozz>|B|N~si%w`=l_|M?eH~%@LANnoT02Z&06< zJ!C0xcl>}S1=BAffIQOEmFOKJ`?4BuGD==!oPyM{xm>}2(+#KVgUKKGMz6!qK~sM> zZ7k1Mz>!Z$N|6fz77<;eIcONHOY75t6uD}#AlZS{%ev}~W$l*^#42Zq8V;5$MK)VX4XVBc9%udce%a}dKFi2g0qq8f` zz*D$57@Mb5>xYT=(JCYa5KnUi;3;&08e_~5c>O7 z?6ZOl2`PK=E~3^9Eg~_}A9E=Bd7^6E|0pQLeBz0*fn zxmE-&AwaK}}P}F~78Lc7Ego zhSe~Cv*>F~!VR*TmOT_@#Wfmby6JHKbztg8s8-F+c5`3|O;Y;7E3SUHj;!o?}%XnRc1fP`Vp60qY%@uZkO^Bn5 zr`TH9M_jK0^-!tZ5{?-*0&{wsqMD^TU%|1EV@vlAWg_kqSbdu%F@N_=q8S%IcNP8Y!DnGi%EB?AuWR0D%Lu=9s1v(iG%jrt zXMz1;!Np@sEtayfyhLZb?S)1xRH_;;%(ViD)H2Rl(1z^S$8o>ZBAA80T$9%{H3a>% z-P;GdX%n$a82Z+kk)|ctw&^Z^KY7^GumOiiFhaRnbB2vI6gGp}wruAFnJ{X9#wSp5 z$%H{7++#Vs-DwoHAozM4KcXkq~` z91xd`*h}BD7csgnZL=II}doe*4JwniDOx5Z=AN0Yh5z|lB)_P`7L*)GOJn6l9lRuLd z3zBO7u9HC9t0g6u+jS*>l;n*@*&&>;;e0RKfc*21Z`*!-2BDd*`w-0G4G<8Ll>9@( zPxDL3zO%R&50)Fv{n5LR%poI1reA04PU4f_p@x99+$1<~Ms(3^dMk^3tkTjY+YlX) zX0r}{1zsmcFewB;=60xSq0<$e;DId~g&!u6MnR(~>FPagfdzMe>sB;-Sv6!@+|Lu-ZqulBjqOoo2(Op z+P5ETQ?VG;2}eNF<@&8ocS|F3Mj^j@ z`PFYo(V!$e?I30znGnL=D5~<=-DoD<4i#ZALMzX*t?VU#^_??z{b$}_9v}gW>WzZv z=@z-^{_+C_QY7m5n_F_?z7l%1e0dnws3}p!^=FNIV6H&&!;mTj*S1?>V6tI+2#U97 z7IN|m`6(}%&XrX+%V>CoZ5E;za(|0~kMdJaex2M@gz0BWylE->M4B}?_^GndAHzPD zK-_-Zb>tp@-%FHC>4y&asT;V0p=8a43tCh<2A!&tO?tD93NQ2gGCTMAOnq1QS3W30 z0;3i5K!>JfJpGSRno?C5b!S`Jkn6rUR7wg)9jb03=Gf%)+20qE=j86@cduIo9z9U) z8ky|~G~m$Y_ux}(1Je;B)D-Pq@d`PYBmklBwz_xiTGQc_g4Trg2x!0Tt9vM!VokJ&&L zA1;i4n^X~sxt}eE=0U`TIGWY5q-H(aoN&sp(#Bo)v)N%NgW`pm)O7<3tRJos^h@(g`T9G!CuHso-wY#?=$FLM!)KjA+$@xn*e3PbZRAP#AtFC;T8c8B#>b?!MMu z-1oKIJ)pl+XXus$8ewl?{QPNCTj)V9D)NoD|G4{RM*>|SZ1ki8tu}Vj7@d=q{sY`O zlYtz~4pCH76k#HPo!2G{zQA=vxa@I%GiDredaa+gRkN%2to@20RaiJ{gBd=3^KMt> zB>J>-#JOw2X5+~H$2*2k5^JH=B^XgfFcA{Ac!+ZFUXhUIU-l&g;)35KBPSU@(=Vx5tTvCz*?d?2_E9oMj{ZLJ0`k+<}`-_2E`{7yaX zolCHP6=d;LFm13{h%@{GKTtG(pE%}oR^LH=YGyOMhyVGMDSvXUBUUP4{v)K*lnj+e zmB@LaYfTqHX+UbAe~yLXx{+diUh$^s{7rijQjK1gEbTQ@+64Mj6Ix9hT>2-A4-Gsz zcl^xmyCMm#H$(CHmt-h>`eren0N?_E( z+)IGRmoDrXNI{(%1-l?ob^oxY$7ST_gvIz|KHGpEQz$+IfzpcmPfTE=;(=r*TcJ+m zs*Vc;@C0f-uopN0Bqm0GCs|?f2}GiO&Xjo6%j%M`<9?$FWicG#sfuYrszv(}PAFK# zvKPtO9rA5Bv5CYRVqN9V18x_71u@Pv3*K6Vq~7?KZ6w(^r!G z6eQv+SDqiA(O2BMC`gt1JKPW=9HF^Ic5!9uFk{qjqCw zlR`Sf+ptQEVwq~pXkdf5MGY`It^%!UjYdWHmilVP<0p>~p7wHI#D6Xr+0kcY4Mu#+ zJjQN(Aw7A@#ynVmI?-NIJ5ziorzs4tp@N!~;w_p2&8X>d_+`=!nj>Gwq32wz zv!GAq1r3N%mk`QBEl_!RSiJbit_G&c8FT`KSMTfP`dO9DuVhSJFu?5}9wp{-55 z?Oz6^_SKiroa}kF=NdD0&=~g0U_6xgWGjohDjsK~r;{~*Z|H!RL9RQ>z1hYdQKZdFaK!s0Id(d~&oHmehVY`0A!77d;n5+E<*$#hPyfYgx{Z*ay`NI1W(c(O@@@o>wLAcRbWgSL z#Ji7GK^iCydp){yWZs1RCH-)6*H6g~X>e32kTptTqsz*nK@viitxuiT*@Ad2lMj1p%s4`BTta^U-CO58BiSSr|?qMSvLFeRNund6T{W%p6L5lf?44S6J zS?F0cI$%)jXF_+mETzpWfz)#wv&!y)k5+eqMlM>^loNW6>@#bd7|+T2`nV<|AypsE zJRXBlg7`*QrO8c&b14m3PgZsv+jdo6(rD0PUkC2F5lsy*=q9@;B0G+NFyt1u0pH!WtA!tLl#C_ijfo_?RG|C(5BxdL3Iw1??9CW&cEPtca8m&NH zHL8|NmO^qU=cbj}>PpUa>xwvka;2oY_`@H^qQp1}*iDP^FLioPLwb!tSZ$Bu^*jSk zpeOTtL{BC>R(;FaoaUvLC;!x7d){PdrIL?C3_&8{r_~&6p>+-seOsZ@>KVAN#E6I< z&$GZq$I#MpR3T|B{*y_jq>pk1>&|z{T>7MYUN!E<-+H(O3l&Fy!j0!#=WsPGkjeMG z!!Wa>fmdci3Mf*pt(jYYr-6!DS#)cFlcz0jkpXQS`$P z0<@oaTUZlUvw8}UIJiv|3fmq-4*)Z{S8G zIPHqyV4^LOZThNz{fljF(4|PdNnl6B%#*EvdXJ;a;GL41N07-K$_&(y!GK7W3s?UG zw(`=gLiLcyL{W!BgcT z-^go?FI;|YJ-mmwXYkBS=R))YG^OKfT%(X^=9M*ST;5!NP8Da2osg?F4x^;?bC9s5xN;hW~2r^`i8_xi4De zG*bqyd7oW>etHykY9VbNKayCnZ^kF&Kn6ddl7$?ixB2Ya8`_63Ng~ z!h5uWuC9?mbl_HGN3eUHAf?*O4$0Zu=KUuWyF&qg7^-xQORhuG8^O+>V<_^Lv)t2V z3`T+X$b_nk_tex~@4+D&wdmuOvV?Pdx9yNQNR1}?5UZjWiFJnIp1k-x za(Og=XgOsvwKB52&6G{87%-{NLXuC<+gf3#66I(98DX)F{5Xg{*MrKxY*8|!iQd3^ z2KCLYHD>Za%lo=w*(3!`7eZN3PT$lCICx+y(`rSf}>tg50ZXtf` z^6x;7$qVEsBoFi3YutRJvp9@V4AF8=I1BXwkcdyx)q*XbhSqvfmY#Y@=vBxmzhX?-Xi2=|RA`dirF{siM3~07TZdg`UC~;Ik|8#xiS_)Q0U|?g6$gZjq=b z8QQfQ`>{tI+Lsg61dV051nrtU)o9poZ>A%&e^9KqVLt%bc%7F9*XWdXN-3-`_C3Vg zU|l;zf1qehC&1JH(5W<&g&mP!C=@V%`{r49cT(4TaCS#rHP4{m$~+mq0QpHx5>;xZ zdOUJg4kg?tA6E<8hOCM|!S4C-hr0s~{+B>Lp&sojD`eVntMKkr*|zMP*HR|w6$Zr9 zfvT{mO*45`Y*FreL4*L8>w50k(90_n(M?fjXc7S}*&DN?oEdz7(&m--NIa5%=K=Z% zO*l+h=eyR#k+&YBZ^F!wVQ5)PItJbpMi$qm5E+_+7y0(;dLNY43JV*PDjo>NFJsUf zS}YGwYVf_?a49d`a8IY&Y$FI9O@q^z_i{I*b=XtDoBN0xDUwW_u|Ul1VBUjq{)x+X zfFM+dbyfgg^}dp@{rkJ&W>3+7*lXHGI)}LcbfS=)jp4>MDn!rfV?TyRhM~3*HD>{@ zcV~vd8Ky1|#VC)8Z>GS2A6gf7X+C@?23x?)K8yeGT26i(U8!3T_t7KzjAsNHF5i}VJ@`U1k3x5a;wV*_J;Tt zKWP33L$eS)@7HQeE3H<4Wz&Gk@$fS8sdB3tmI3QP4mHdqvZWUsfR{y|PfEw4B02S`HK~fr8 z^*Z%(wSxqjAh_W~$Z4y)&jgN#kQbt<_>Y!6dJ_P7TFgzV!D;<}!5lPUe=XI=w`)5M zNSQQ0X_w;Yda3DJ!nf5n%Sp)2oIbth`NrVZS2IHZSfRWqa59ZE#m8|vMRrw!n$&i> zKP$54D=0^8$<{L{)@2p$%IZHMVk3ciPZ@bH<$*#9PluM^Vgt3FpUo`Y2uxJY24bPA zSUF1M5VRR(l6pdaxy2?;#XtLz?}=*C=}n7{O{&MUM8n_{9oGSTzPz||0qDGwOTm6l zJ3nYAug1<>I@P5k6Ll|4XvBByy>b#OYcEI76|w?8#F6dy;sfT?sJ$TJ2o7jR@it4s zE#uj$H>fZ}c^9(_8I?x-#lCuYp-K+Q1Wn|VX}zGmE&p79X}M`;h>_6zAu1U-jB8sd z%a^XrZDP|>Q|Xo*eXdvaIAjz)&4pWmEgIEED!S95nrlD*B6{wgbQ?AbHtK!{!_?mG zXL-k=;hkf2Y#LxOUcF}7xyh3%XqJ^EM%mF#uSk893&FL}+JnIuosRm-FB>F2Nov%z zuC8$@g3G^uux=&e+YyDr&+4-yyS6%|uL;hrr0b_5moU;sOBv|1OHhBuV=|%Ir)KKL z<=8Jk^^7sO#{)Jr|K$Z+JxC@~hRg8Tp-X}n`=ou@2r79~Y}t6yzb?R_DO2~MUI#7^ z@$F&Wf}%qVM(#)aMh4IO)w7oUYIVueDLunc{DD+|Yv*2z?ayUcb>Yu+gB5(=)EIVC zlKHQW)MV=}2UJVHNE7*++9E54Ajf2`z}@mw<7kgRP`uhXkE(5(BpT&?ruf1xU5RJ}*GGHNZ|_p5-?7XY4MW4(D(Agefe^!i)!*x-UgRbpN=#cuvefAZ%T&LHGit!xyb%;$;SWXl0r?($6~;GlDfnleN^b8 zi%v~1O(zrM0_Q5CrSvd<0^HeQJtOBnS^khoj>8gaWH}z?1W9>?zU(W7aBoQ7ckz_N zlL3n9z~03JRHDI%ey&^(U5Cw_38@W^A?WjeY%#cW>(ZW`o(ScB#wtx%wTsm`U}WgN za!A)+!wYxGOiZzLD%r?@!36^w543$T(p@gaWEKfDHfNK>Cb0r$c8IMMMcHvyna}Y3h)zh7EyG$+XSDn3OBSj63*Zx)sT9@O@fnjtvZd z;mDIx*^()Ik#XGAZD+ThMq&)M9L-;@AxyZj`Pl%HK3Tky?c!njQ6wa=eqUfE+TZT; ze#q(#-S4xxnGth{$*ks6^6`nEoc^(vh11$?@mwa|9Kk8Ab-`8ApQyoD>dlVmGf<6g%h*r=!{E zsEYM}SgI7Nczr$=_xqr}`=DLp3~<>SUYdM|-ah>!5`HGRc~)?M`xyuG$i%9Dj|iRk zHMitU?LZ{kRNlO=laVn&aw>rtH${9yAguv8(m&=SI(NvXZ)r!m-fPM;L?n84SlWEW zx5L1&^Y`mFTP=^G*DW;U@{~z)xu1{S4Gtc7 zg=h|akYTOq*^$U3JWXOs67|l1CJ{X;ePy~GW{9mM3+{^ulY@Vf)YrV?ADlpva%40j z{V?@4@ZC^YlE)@FH^PJ(N|(`>>f3Ox&mSaXFB_>dAstaZy4)00U=d5M63q+BX^!aU z1|2Q{e-QWNk50{zHaN07c*J)T8CKD*t<0G;yFNz1^0!@%Xy6ML>g zJfR7q-5G6;R}97CmpjoZ?&~8y;u%KIGr*Iw5#M#g?5l>H4GB5LdmP~L73?lObYTWv z?tu*@YGkvUvv1+uOFUn%+qw+u5T!RbSahRKi@o*g=HUE<%D|WQld1NwJj*D15pbYySqJr-M7eg#~A0#y9&_c|BVYl_JqdOe>G+hf+@Y2G+}^6cBE`OaKRT}5?< zHSa4gOjMGLL~%a3i=EY>MVh%@*4n;>W~lewb@RgiYGmTvI&@)&`HhUL90s4msr`DS zl>3b}t!&kft?0Y?2ye#YvJGABB2>~QMeyzYVCYWEOAar~9B|El&WwnWuw^K-`WUZ( zc9qKjq43yxj-9%u8r$B721`yu#LK*E!l^X(ORE)IiALLHrj)C|MkUjE zRqWXqY;84qthX?K97Bxt+-#9LvBnM`3nE58P zljw%gv9#bB9pG@Ei!4@(B?N-|8E?au@ui7qh9I2YY8BZJf9i6GCS?mRNc|b)-y3Z~ zUb{SKj(5w<;#vO{T=pd-JIP+VVGB%93w|%+Ev)yLaxQV>ZLg_$bfB5s8uTai{P`z| zD{X~ThDq9gB8h=&jQ%$k;!STBv+{L30x*cXQCU8QOMlHslgaYZxz9G+&8ESQ&3xbQ zyY%u#vIjTNcsS;wMAV*wG~6N2$LYZLwOlp711jIn=p>!aPt`uzk!j-PA~6o#$IoJ( zd1NLFzIpH`LwQ{16L*_ygt6kB4Ik^Ydtx_rjyl|b=LEcdI)sZmoZ$ksud{Sb30%~Z z;1*NOTd7mG`!S)nFJf`<7^Mn18tYfEM-HQ*lwm9z%6@%fUhOH7ECo;1q@LgAP@>%; zQ6@g6*6v~^<_XBs7wn6@-)Zy};qZBBe7f2TL0C-_qddhqk$uGu5ikx%6G z4qyC#Az6m=v9v{DbyQtf2-k7UH>-R@-EY_o)shQW$n{Sb$`jIG$Bm{=+Ozh;7&Tg; zWjPlClOF6xzGzW%l-`A58?}4&dItb0y_@?odYc}T=k&=Z!*mxd=eeJpGa1cR)r%3* z4mUT7ieKU{GQe>9A9rGS#R95w8orscpPhSu5xaY`I>Jm!&5fEZM$s`I2d+v66TSbz zBj`hi`gM+0bUOIbU-B%g=+cX7@0J&StvuCx-*h1!V3mt*CtPbI?}5-8^%ayd7)T7TVN|knX?h(3zsoV*2?ZNp=6#&< z!sx?NBtNlkjTlp>EKbj#)PZg;xf4CEh9qePh`uXqY*R^C9}vo!=DX4m9)I3K%R5>` zgF`Vq$ngXg%8FeF44S;ZPtOaZ-G-un9m;&o9cFW7$Pg7HCFAhf(M0n`)DTkLBd(?k z+NA)-x9c{LFD-tag3j+NX8WjLN-_5~dZ~nqgUzVbz3868_40|wep;It>X?41A zTcd9~XBYOT(#>p(x&|LFF0aCy1s?B8xV+mChIM>HFDxLDVY?ihK#TFrWqlieKH(IL z}?6J+1Ux?;rA$`Y29CG!;f0_n0Z^V2%54HKS+4Rh# z-MsGOU|sYLML`6Ed|6G*2kR?btr$)FquW=ouHAK{XAJdZY9l*r1@R281XVH*2OSFM zmhLI7>|XOX*_sG7EJ7d3gLQ^~Y2M3x%+1cjI&{+_8b2)SS;Rvy65O)~P>#1i4%Ob`Lwh z@7(&(l^sSUFs?~n=jKiNOfJNE=$b7jMJc;Rk+m0nTj3GqkD6Ix?z4y{{mXmNbBgi( zEKzA4Jxf>h;vR?cSG`4X;_iAkvsxA&rz`32??-Sg;3Y)Dn4}O=*xZMjmrsZ_uJwdg zVtdAa@c5BJ9o2Z<0!ErvxlW5$VtPcR09s$#50+>0F{O0$w_?fK`+um2nmQUQ zbFF_awxSeju1+zC(s?&|VgPGtfYx;P-PTj5p_6|krrZ~fPFpuhvh{uF!qvm-x9yi9 z&eihP>sTmR26r^i14_8^VME}<@k2KIam?~{!o8cA2fuHdJ&E&w0lo5<7=KEf_#W6$%Ohu>1;HV!G*Rpf zf@cj|t?7@T(fQNl^&ZuZ-cf&8BBL#K)6$y)D`S{ot5+ZEHOFEM0^gS7;91fjiaTUL zu6c<;xgc)NO6*jB^LkQeVl~>$ZwX6`1%FH$A&dCH`VCKXzR*tyw81|3sV+6xEe6EM z34OycCpt?V-JTDf(5C0Z2)IVa20b@=V`v5QQ;}=4(B5SU8fU&UdKz7=0P8q&)TDVme}fzX`y8bcZpi5_E*+j51<8 z3PX|&;i*y=55~8dt7`UYX0vKsNipD*oVEm82@1DUNtiqXiz|J%cXQFtIAchB3%O=WF@UCpE{*g`_6Xe?s%k=0}nmuocEVw{z$v4te+RlhEI5sGXvs z&FY{y=(1pc1D1)#T47PXAag~oSz}>u7%qQAW`nkQi$!+#p$a9_Vh?>#L&jI=Ns*o> zQ48FRt}B_vV$?sM>Lzoxxyt+8`D?*6&wDon_naK_K}2<>dWcVV(Ua)1V+ON)%4{9b zu|b?eehVj$S5qpuP%r0Hk5Y(VoovAInvjChaK8wDXesD_KguW1Q%G`^FV;qt9Ah)F zE}1Ojd_semHRbIq-QpH&vyS_a7u=&Q9X5|)q%!lK+$3N}JJqd9$fq?Na$d^Mm?Pu( zq@Y6Ti$0tG0uS=bNqwRHiJm8JY7Mx|Y#f%{H|-KT7PbC-BsNFEeWsIz82bf$Vv8{t zFfN^c#HDC3qQ&v^wmNndcdvN-h{|+$uEx@Naw~Mq?>jxnUuss3_f!*@``;~hyjT&5 ze|`?SZ{VOvjU%#5tomRAO`XfaW{E+{2DY6zSXP&$jj#}q$s==Ifk6DlxOuuYFqVLd z&9_A|Mvb()H|m_+h4&pTrZ(e-|4{K0&L<&%pEPTR1>9F^`RfywPY)*Wb(gPxZQ8kg z5bb8MwD>j#@8xohv|3k+jB-6>j58C}l9Y~ z6g(f3#)&@u=)I4t{k$~)&Z161FMx;nts+IL+eiJuee4t5gKK7k83(3hh(Uyc{il%R2%1+}e-`Cc#k;uJ7qdF? zSTUYQCq9~Bq_+jp>@z1M6t!~6j~AMMX-!usmLqcAnG|(Iyrq&jTW+#4zTVpqV@;4m zU}<>-?!QAbAQ4jzT-i8pfj>?)=N$AUlo z{wQ}vETbIytpjIof|WEjN2PTzV|Fjzyaj2FiSg!u;HD=<#*^aur!6sf?7i22QN}f; z<|v^J9V~>>EJuZ1RZyP6lEqzv`;R6#{I~~qcXzko&W8mF?(QDk9fAgT4TRwC?ksof z*1qmMwN*_&P4!IooWs@Uu|)wrhQS*v&aZvHVwIeqa74TB+ap!ESKC-3>&xgHh$eBq zR!G8wTz`bc&+Q}qdch?9^#nRLDswrX9@X6g6+E&asQC3fh0J~)8#wYX(CVS|$s z*7u5!Be^AcjpF|%sEbNhRbcvWm;n>8wk#f8T1mr>J0e%&Wt^k3(IFE!+#LM2m7tUQ zV(&fhDR{))gJ+AtUKYvzZW%fUSMhg;Bl87EvWve&jVgT>tc9jt6&dGtQ+7%fhe1Z_{;}y zpQz=M5XBn9@%UvG_oQ>n33|uHo}!FuxEI}<&$i1vBHCb-qLav8SMyq{q?Z{nD{Qmb zGRW7^BLXVPxH=)xHiYXKz6Su9_S0XGuy%DA%jx((S8ds78@QkLvFyERX%g*Si4FJ) zHwCB2SfSd&N3OXrjk`PU6iR)kVxHog_VFRJfJcAi<(eJgUn`FN!JANJ**84xa8yF` zB<4z|S=wu^?|_rEM$l=VhQf|S4Z&9IFJr_ttCf=T8&fZ~&j`nXF|r)UyHsCo@#vH0 zr5!k&=hDgdkqR~vjVk)mU;Q0?VnA8VPgUR-Eo(xPlMGC^B@q8hLc)g_g}yZkRpRP7 zl+RKZx2Ouec&0~n_`3(=+k-1sGn;Sp92Xbx>9xA}Y9^d}T**nr$PxlkIN-057fgo0 z1q`RCGH6~Y9}=O5kgt{Hx3W$jCIRU>!#ds5%db$r@DAAtb5H{Za9fEjfftG4Z39~3f7`zVyQ;bY9*e#=LmgsNS zfzzV{EfZQdR<=XUCZ@UENn*R6)-%Rw(?{DMb3Om~lEm8w?y>|nM`8NckEa|^zi(n! zj-V?~&Od21DEbu4X(GD2gx0VM!t#c@HPN|l?u1;!N*4FGuAJrN>f95*HP=&K3ja3Q zkZkXX+V|+BWY){xA|rqg+YpN-K*bY0p6X;vw&97-F4iLr&+h!dRW$wdsTl1H=C6{C zpsYkbbRt5$TbTd=J6M0q47K*b^bFmOf(={YI^(o>vAah8imD(tvs$pVm3TlF3w?N9 zco{y>c4xr~9e3Hh@h;$n>6 zovOU$6K%C<$%7H&T0+OToXza{49w&gTy>(*tGcZzmdJqLw~XCFsKG9&MVxSw?^Jq< zZ*FVm4G1T^8+*_0$M&Xg&RIxySk0F_P!>|khb`fB7DTP|e{;`_e|n1x@SDxYFl9IATS$)X;1k1o01yZ~#s zXjO)vEvjBuvla^Y&)N(ajI{<_X72so00&b&IQ;;0hDGq;vqlGWIW6>D(0*;`s8rqT zAd~Ae^{^*AKVrBk5XPw6pC!~@*oijcLmD7_&zqFYx2Px*ugI`XkY^<=ZfqQ7=r!&d z#db(Ok!Y^H76}MwTDQioj2KpWO)_-X#AnwuN+iH>Pz-&BR6(D2@U-qmUv zTdVZ01|wIX`Su)#n`Zn6+@*CgYURhLCztk*zx;$TlcNJ$DrV`u-NR+7YU#Lzpp#NT z(U(K}@z1&LBK`VQq7A3tzUk}u2r^4Dz)EI4xm`CXTT>)6cahA+4%p7fJH?>1S8oEk za?I!$<&Zh%ri(%vNNH-zsh@*D?Ej4HC(5qeRtb7+x=>R@zFIXzAg^$H8{utAwk75F zVFnw0{z|0q{m50qF0)8*ba(A8-NjXILyd{9QX&+2@14c1CdXa1S^V@Prb&C%29&t=MXO=-Cywg7Kt=daUZiD>M*e zRS~O`yYx)1jC+aaEGEAWo49u@l0SVVlx7f)i7Pv6zV)IgMAt72{|Bh@&X+6btYURZ z#+5eZ4pPC0k(j^yRL#T^eXH;&ak;*Vt+){R7_3*A#vM(BTo522Rth`1csgN4*wH!P zgW9h;=19gb>rE`xD;`fbM`T>%OeZ%Va=L+7I?U{G!etjbtfUE~>*OnMWwXG|)J*t? zujOFkq8z8E6#M+GUK&sitq%7Zi+6}J;`V1CgrarN`oZuVe2Z@8u5>t9koz`!l)upQ zZc*uGmh5S;Pg^9344uf|d&s#EzJ0Bjo=!Xt6+Zi%YVZ?m8(?r(sW^*PTH3caQyOPE zU2YnRx7MzTMP@0?6V-N{os_}26sdR4ol>UEuE3;j>Oj~dFAh+mAxenmlFa%@{Zz~- zn2KUt@gByk?Vw!^jZ9BR3PYuLb}XtsBApQB_R0(NoR2YVv~g?2}%Q6w}PH3rrRrT5Z0oc-`Zsd5T%cGW{FkX(rJe!lDl5TX304XNU;Ms_KCXn=GH z*MoHS^y9)Y6a~z!bd#Y<3=2lJjh=S4iCbt*{SziIHWFDrLxy>|9YJ{TE?O~bKBbwY zYyWkY_x7OS)}h^ZLN~W|v7*PFH{&l;;v z^anm;hp^*oeERYFhIlhZ67KS`T*w!WSvBiD9mFokejUK>SxXjjum~y#r56odfylL+SAFrvy9)oAx!F(E?qCPcwiN@R!H@{|th^-w9L8A^jUBR*i5^8eRr);D*q++PezCs=Ga9FjgCAd= zsM7}~JGP;}LMhYTz#7u1`8~rFv~i4g$*ytl6lMTXKVc0oA-)R!q0Tm>6M* zm-8D?zdLCjqfG-3UCY6PPgKzP3PbB9S-&TmDH4@BFDw3@xdLnvuZ)r;uSRY}dmzp$ zGL5%%KEgi=zo(){){0Z^4&wa54>~FQh4O3QuKLTl1-If`^Ctb38Pf&zT={BtEcR+} z53o-rYM48nRd(1{$$~>vQlO_2*>8Q_%H4FbDq%brb9*8dr?u>br-zY&eS$+|6^XwR z=u?l_jrB&i&Wk~dw7z~P9Q!)XyaWjt+zCfMBlz+B>lftKo43bsPsQ4isxYI4eD2#+{ zFUzR&TufNfZiso?f3h0aSDAm~F4sHWr^QY)>s6M12RITIOJa7(Er=T3lY(qQKpubR zd=e+Ib}NuEuU;SVFo5-Y z&U-!~VIKoEb}Le58unt&Gu3#`@8&v96TLpYs@hV=X;il?jM5Bbi@vref+$DU)e#=r zCmtA;w&zF4a@&$%Imn06j==;S1V@o?P(Rod>Om$T>s4TX2zl;%1vf!r{`==%gN`nR zno`tX5w(P#MpWd44VIGwcHq+8JRmLsJ#LVphvk61hj}id7*YMj%Imn-NvcHg+Jk7b zgWnLJgXitHbs7G|-ZSB)()CWL{@3KPlD1J$yqQ_^w#!8m4HW9na*UJ7t**yBT8cYS zis~Kvg}*v^2o?`BoKi^Pb4qwmxiu=|qdl9NS_i!yxxiI0B#vQT=EIxZfY^gwKgZDyoQx2@^yv;hZ^Ms!t<>q6;e9bF5RN6m zv%V=6;Sc|JHa@ki1e`j8_m-LqQ?^7*?vq1PiJ`2%Si*2h|bT zgAV>|3d8J!m2hUlo3gkv2nW}j4L4X##C#w=lXKS)_RmCOh=cd9XmU0pJW3BW62IUG2hcx`qky)x|f)u3=hZA&J{$;Sp(KB;zMF+8+#5<$!P8Nz%jyJ|nV7Wsoa`X5}qb-=xLW_vZ4(iAi=>-@Y^xD{WV@ z2;p1Nk{-E$dZu+Ft!q{WCvJUyki%C^@B;RZe@E#V3bFEO-$UAq`8bj9XEeTr6pL&i9=7B8#O5 z5%qPv6%ps+Pi~A(mN8<#tMC#hR>KpZo3v><*0q%LyGP}2qfcVWnW^2YSI~H;P};Wp zuMFPx>ou)`xPcXv6UsSU?1K*4T&`gMm!RQI7u3=;UbUpkUS(J!!3;~kp})8es=QYU ztbmJ4XL?w8365Y9iWFylN5(w1xXo8Cu~GZl$DH5C6<&JlDL*At1|@6XPrvk3QDB10 zWf^SF%_?_peL!Cv_OkHo0UqcWT=tosgr9BOWJ3x@H9#xk&~fgG0Y=ZX8huD^Kw>~} zBYiB)P5G_OLt+|IIwf|sM8GNYb-`-uqU%bz7`g4QL0^*sW;gvIVRkL5lx|_mIi(D4 z8I;MFhLm=XJzj=Qy=I|NuFkrPA0JmfB`i@sB#D5RjGfTmyy+&{I>+X>rX9ie5u=Hp z*_YAzAptP1;+8OB`Sy1nRgcU=9BkY*^1+2*j{~!L&G)e#;_BgfG{qr%Y=-L}s*+r| zWMjEt&FQF(r6>BI%PEmv-Y*fLm1<{&2!rzB>26Gc`ChRr7+^`e^_YlGOR}2YsDn={ z*mhK9WX+3;JUfa-AhcpC;#yXEh8DgPLzYE8Djp z-J*5U5b{V{D#AM!fUiGJ&xwwu7 ze>t9NgeIFH$R9~~!6nGNnVjQ}V50ZmV)8>(C-p8n7cB>JLfqT%#)N9yomi6Q2II;4 z<>G2xalDszVc6K)YE!R?e}ZAKBgQ zcedYbDlAn;3{S-=hl8h+k#D42$5FKXkkMUN@7py0x|?psk<1;;TwI;ajqN|A#2gej zs1H!MMN=4ZC@@Rvqbba11~3adD+fC_D+ePB=Vum{&$LL)@{VR=#;)d|FJio47BD-@ z|AnN=nZalRU>499HFGVHoVB|-2+YFD!z^ZQVr}d|3$p!Y>}us=ZVYlacXqLMbO3QO zu`#jIA_)rqCl5yx8zfdPFo*^8ABmqIiCN9-n>mPC(Zoj8)gFmi0mQ+E#4KU$?BWVy zXXij-mNR#-bhQG3xmdxV|6Tv_+9mR&j%Ukq3?-ASZ!-_Ubl_1&VoJbA#1lu+ zK(tg4#iC0v9TXAY;D*P6{(h_EG<}NiuN}tsao{eih<%~WGYPMq-kQW5AsD`ok^;(& zQt-rVP{ExPKk~mih9|(4_lOIzPE_|QV)a$4cSca_F>unVvwv1P8O~SV-hEx%R_i-+YW$oN)TSf zETyU>`IDC_g>QKw809kVmh^d27WHG2V+uu!DO|D;M-MhCn2EUxE`NYtixGaVQ{q?K z=k*Pg!|)b3@}vR2D&8Ratu8pC8OSK7%6!u_24*o` zq-?DDiSQhQOKXW$iZFeYDa7{~D|{H&rBJ8Y3#PDPy+78Vc7Cqi*Lvo0#$wrEHmHqa zUy{uoIfnWErEl0>?2QJpAOxUK#*ylFz$d?DOSLXZxm`q4@;BzJ3yb&@h?$qFjR-aT zR*T7Gi;x1P@0G)FL_j8%TI(!`vx*7|XLK1llUVkwR+6G<(g~&;Mpfi6JqX8ZCmO*u z?T{dB7DksF8IO1?$g-+GuNkDPG|skiEw%~!+4kUE#BG!aNzLi9RO7-~Qh z@M%r|PUAj`CNL@CshFXF|1D{vBv|q)+Kpi8Yp16j)$K92jf)GEX~5UOWgh>$cXnnP zbk&{0`*TErbOmqAM-%{VCh=5X1YJT~=pWS*3_`>iTFIc@F;ga#rTc+#3Of^gOG5_* zv4oT%@(^;V%0X}bmo9|;xvcG?GpJa@n%~I*mwGX^MhPq%u$8p?nEOIslt*7|14Z)4 zpcIqMPwGBVYJ`3fjn%;^8%W#G=WmA+myW`T=)j0!$)bgF`Be?v8K-28MY74RKv9ZR ze77TpHRRXEMLpFY+_14<5n)A&SFq`OcJLM&NAM$To%!Cpy}LG8=BWs!YZ5UQeY@M$ zx~7FrJsmZJ#1&d+g&)F|Mo0WXEte2n4tMTd#7+Axs-F0+m63}s4k5w5HP){>OMg*V zC=T1Q)h#HL8=L}=vLDN!6CX(Zp=%}Ntn@0#xf2_Sd)?4UXs;z4VJA?XjD8JFHi>Pb z$ogvRK*tspUn^3SCPix_Sg!!F>NS&zc4nDqy*A?XOlD}HcY69_d2Dt4gRPZy{0Ub1 z&;WpsnC1(##N$FzWL&-^5@#lxfaJHS7&2c^@lH1SBIp;A<7e5oA?7QG+sl_zZ=BD1;wyFw_(XUR1vYUU3n??=~>8 zko~IO%|WJ)U_x`+4CtVM z{MR!I=3Q+Lv?fs}c6X+;{%UT{*>9}AwgPU>P!}X5?7i?)-<*Qkb`1~|AN4%D`~67B z8w)V|P{T)KZ$kWKwlFE{qRLIua6B-CV%0P4i82*AneLclf+x<>!x6KFR&>)(2<6wq zCh&kel?9rALnYCL{gK&zwTF!((LW~s4!`6sH!i~u32lo}rQ5edi#5RCkxZi_{>^jQ zPr6Pwn5BQBZslFUOonjWDf0D=oQZq)9S)UJdLWp-C|6$id;ZL~k#8|H3PMHsA-Jq4_p~O2}ZZ?r}@MuYOzt+)BLC=qS?b(xn zr5+W3q*b^xXkO`2)3k_)WfnXbUW{)a>KDjILD~U{9souDb(QRAXtT-9c2`wJmkT@4 z7`V2>Z)}>8xbCp6^VFSr<0z_K_bF}m)BRprSm~)vb0~7eK z)gC*>&I?Ij%vE^_qXM-GyS||03^=L+M6kBvLBGQ^@lq{&hf02hVNKgcJ31MK>AvIA zaE86Ty0VN`+%-~EzP@J9MXJ{Bck-~!U9*dqamlDg`Os{!uBS>qjx;EuUI)|=H!JcJ zj^_v1OgthNZ1!=W>+@LlCfZrQm)ABbsDsV)XApv62tuQVYYQ9!^mMV2QvH z(MxDHkd*gUwPPak#9VIL$xW#j9F%5ajsyqrM)1dccS%MrKaxX z+uO>_!jQp@ji`VBOvMkYK<4qAT%RVME*`k4!Encd+q6z9Wqpn=9H(61q1~sMM9z`> zT8`l331RmvmJt|?XpuWIlsN<%FvV2kqaBG%h|wUUPJJyxP+zn#6n<&_*q z`OskR8IjW&=rKa%$>e#3WYDB(2%u_c)*KzRRhB9GL$Z`~Jw53bv;*F%n#}422FJzj zr+;i~dd$jgJ={*)e+bCVKi?hMp7YuK5vZ_jIs9l|CdFAToi;74%gr~{43K@L{jEHALhqCM@(v-LXZ_b~~k4wv_vs{dt(Lc_^iZA8|3c1}6K;diXPu!s=an z#gvWu--pzgc85in4sAfx>(!~W+Mjxl?oYb3oMEu74LXI}?vZxE;E>28A-^tQQ)bJ> z4C8xr$I+}S09jLEh{$_LWbKbyU2ge<-7e?&mAj z@jfh-St7jLIq!6i2{;VEL2`a4UBlhcO_OT2UNoc@a%1+V_km$ z8?-g;ohh%Z=KcRTmoy;vg_Fo-vplfC@VV$HxDZd54QxDCO;2AjE7nLc*DyVo8>>sjMIcYg zB!v-Zwx^&d(-%kHl$a@z&*X%|gcZiX5fjH&Q;NimH}d~y=l{~<@^-)GgSMZMKEZ84 z8s5ub(~vBbJD&hiPIbKu?xRCgi!QH;FlBNw5|%Vo2h1RU2T?&F|Jw~orFM}bW%!f7 z2UAYtR+KXz2X}`P=c^@x{6JeDXG)6Lo3W+S78hcC`u9k80G}FD%Ta=Hun1u>S4Ec6 zl$JKo{Jgw4E2&q);LDH{?8$@AU>g-$W@{d720@#8%_nzvCC0TVP1Fwd$};GRKz+f| zVYXWvV_->$jz*f~WD!;Tw1t#2ec>vSz%871nX*ir&oM-RRC%5$(?~If_9(()dA@Ax z(=3z^sfM16jxqD+MqlJ@a6)KTdr8V}5$fGj`IbyQ)ZJc{3A}Y!*I4!f-7MnsHwhGpW+W$>4lyl(m0^BB9?%+p^UMEDeND{U82I!4;mR61WDZ3i2Kj^hz``nA_@P~YscQijHw{9T-XeJVM&1^Ap8ksqv?CtLW=b zx{dXD?MK$uTuZgVO$9^s!Ljpev`6c{%Q*_@C(Cr=DcGB4S#kL!xQDfWIH@4H*W`o9d(%3c|+kF4eS?{?z&&{k^b2WD} zpS|~V1NztwdID9lGAbQlry=XH&V|-}rg<&XWzh%Ki!As-EQ5ULuusD7qMnbKE7PdhI~&6@<@i z@K?UL=fckB_?bs)?TVE2x>rrm;Mz6)u90eZ@pSWj{S-329AgT|phpO##wj!|`HR^L z8s*Krr$?3-gn@^b5b~FAHV|_`<+!gYggq1g zwZuIc8O`$d{>`m~O#h5>>vM6zBd^>QwS409)$lWaZrvQ%wpu2pD-p1u4<8FLPQjWq zVm@7P-85eN>5!l0{G-^v*rB$oK_LRner+{UAS{~r*yroz_gC@ac)s+%x5aWuwu1#415RJ(=UFBBk5WEQ_(!NEsS(k`eV* z#6J44wd>=y7PfZz@~F5N@mNR<=F-gKG0grJ#_>M_v0AL4GC47Sohh4)8X@M|W0V|t zG6y2dm@!Anh(*`8rA8HSyLoa`%xDOy&3g?Zg2NK|+L4-I+t7ni0X=uZ>lFu|y~^rB zaas)E`eO;rD3U}EAV0-@h%HE5y|8}t8}8Fcy)MR()vkwN!h4CZqFjc$6+7_aQ4T$c8A+HW=?q&BpRYv<@6z{EMJEjDzOYo zcjfkP94!n%gwg&I#afK^Y~AF>;Yz^I{OiYEJMOxHYA3>~TgWM-(Z{Zo zp(#XM__8zKt~r4y-B;F_F$RKyu8Nm!>J}5kLFYnzM-O0xRNh~pl~#aSt3oT&CER$U z-ksx5TL=`{(GD$h#z1YLQ)4#23+0#`iHtGvU9AyVyu=`~Yrs6o|G;uU)K(-9I_>fbA=Hd18YUIj+VBYpE;_&9FrGU_4Bq#IwM+ zDwMyvXse}V31%Dl>TSW4FN=2Ih$JKaDi%bR0DUlC?fX)xzrF4E7M6&=8{s5t@ub8q zX`!kj@hf9fc*tfzRSrWk)`sZrxvZ>J6yAtFYrn%-Rq0oKC($=RA zv?J<2H{;<&aLF{7Zw)lqe~E{_-+bF{jlS&e>3RE@${AuWFODITdWo??ph}rY9on4k z*;}P}hc6;CzdtYPX#~<)2Qxy7d>=0_%Q}|3u}G1m@ua_dt6i5H%}BrfvcIiCBAvL< zB~x&Ha{U5(=gD_iM}xT;2IC5m&{kG z=-DljdtpmK!eO=CbwS#}Csr^T1o%U!()wmBBK`3LVb+vgZLCg3C7sNfXePmEkXye# z4wg)cf-xy4IcC92TX&6S%3N199>8QAnUbqvRZlF*XR`TzmU;zH;r$gVvpf3RGI#6F zP!Em=AIBS)7zD&s!xrHqQVa_1`eNW!h=q-ulvUi~`dC%AMH45yMGhqiFxU~W*R68> z4(*ngz4JJUd#n$QL}mA0P~WTH!9e+;CJ#}A$rFPV+*~$8JTYtJy3WUx#mV8xS3&UR zN#H!X$VnkHWoGg0ffST3@{*KH7Qs5F8!Bq!W?OwSw$U0?W;npop!P!a0{t)xVB5oq6J zKpw`m42~Tn8FR8?w26`^eu@%*EKUrK7yc*QNBc0V(6;c;C)TImdXr_MTqmskw|nHu z)UZtAx;e72cqihj->l4mi0QJ9&}wW;6J?z`+(25=r*v5^w#c*h&Sy|$`4aIA;j{o5 z80BnBRr0H@nMK>DRz31YDD}y3&bJ`hgUG7(*A*cH+NPW!*BntuFahDCo3Y7FJ|}lv z)ru@F@oU-9sd78h>W$%uKpbO?uJsHIaon|kuNxmeQZjbVrP$(E;%Q!x4a@E@f+3Qe#0`gMAYIJAYr}qn z!m^%H^Tbku9?CDhB6ox?dp|ccLE~;?+~Mh|7!xXHgv}hRWJYlwHC+kLHgHq}W~Y}< z2$?;Mz1;Fn*8qW^sE6T@v4czkT#w4;sX*qI$Z!5=TH-1j6|;N^1=Wl4pESKHKFxV+ ze0utPKVFY^Fu@4y`53)634E0(jLyU0qItN1x%xSr6o{w=%CQFap>|c>VlREBuPUCG zNyCANV)cJ{TO#5t6C6qoSe|l3LjKEvd3Ld%djo1yiH7q60*440-B&g~V=vlFm9q~6;>Ivx3HK9ltC1_ECtN!=o zv>BEk`#Z1IaP*hCU{_vkzX_+Yk=kxh?<)pc)B*bSBiCj%nta6k|U2HO6yB>53&n{Za8lQO>P) zNp6@H-*?Lc!xg}Box9y^<9y2+tvs;6EXAYdT9C{-?GV#FH)nP8TOLVgX+-K z4JMsSr#anHcj2D~IlR(v&NeRH2irB{f7)g#wkqt0RVqlkesJ;mHMz`w(E|9#1)E#Z z_Lw)Hk7oGIEME<_I<$q~wB9eRzr8nNnnVxU5pSLZ=d98HceI&3ciisA=tCXQAOd+*QjvQ!ecV_SrUqyE#VqN> zpKMm$**>hcEu^loxU;a9q#Ilx2N z2QoSPJh^A~9XH*br;6nG9!??tNRs-Mc28O+b77!I=eUTb-L<@YTD(A!)}of`gTKjE z5b5KRe`PXKrxfyr~NAQ(idVjIvUqr7MtR~;(7LQAyPKQ~k46|N( zzfrJ!wZVOU+|3wF+B_qoL*DUSKylZDz_rI`)}$^+PcQG&W%WYnz8DQ#C=^BE?r!ya zNrE5=O1<;^xhttJmH(J0b}9SH)8{8Xw9nNq_W5!cExQFZ2>O3C+$Jk&X-0^x()1@R zcSLMf*S^bluD*BvFwdTf^}*0fcP2P6vSQ-y8cTQvz)`i2{!t-=I15mPe_so9{OY&R9bLQGWsPQ zFiEJFyx)8w*wa5Rq|UF$uovE)bTV+1IZ>>T<=UPhbiNt9l`20r#n z;p&Ast(nCp2|^SNN(5}s-{oT{ZJVwhjZd8~G5TzhJSCbkr9kFx=)v0w^KWzs8XJng zZ>KUjZO2HZZ@Z_*M;c4dI1V|&9W5>oz@)=SMHWdl`Fe&bY{2+~GPrWY02^!JVm$Em zA`GV8ov5<(yrRX5|8=9~!DLZ4Vkhpcqwq`)q7uBj&XMIq+1`t5S6%eQKO|#Fxk-Uk zpRp+__zD)nix7VEVPjQ~(G2G2nttyz&oB8?$7w{n=z^+Tr-oL+f_^P_wE&KEfUPlr zY&zJ^A0?6VgM>EVUQiy>A{d|j2kM^8 zMiB92A$)1EnK<8Oua9!Ud&1V-mVKi;Ren?Rw5DQzRh=H7QZ+_VM6=H=h?<6#j!UE=#Wc90!%|XU|kP3|z=MfjVAP!s7W>i1Il4?MAiwK)r*eXNKa2a* z{w8pDdtJ8aCRk7pQvV}}8Zs*k_nLp(I({xqN>l}sbAR*0pLZH%-5&Wiu)QL^jeeB+ z$oLJ67u+6ki%U#Ee-IuH@uMrjVA1l}iCiHTlOnB}4+g7zCzOPYVHgxLtYUaZT!{{s zgP>WM;c48ofynuVCsNAknS{b+$!Bdy0XK}97)=>)?kB04sd|}1okWS1uhN?Y8qK)P z3lK_y)%?2F4Ppa=2|CmL$nTza{mq*Vi_^+g{l|CTs&B}C5P3|aip*GQHIRt zvtE=aheU=Xa>Sf(Fz9psEH=uOf?-6Iq&A8KsnChS_Z{CO>ERr)8Spqd6v4$bfZT(1 z;F|;nW$?{2nmdFg!$tV!I86B9z9YbX4_6(+nG6n}lq&&t1vto}#F$q0;gF{dYr=BI zK-0GaPKWqu`i)o#NdmRB%T~*LzkP$G$B1_$4D#X%s7ZW)G)3)ZJ9~;*I z0`D@?d*5B9U=ZUJ6Y;GmL)vC<&BC zItf5jul5Y2!b@S8y>qsrTFuNN9{*nR-r!n*0l&{tM@e<-p(BkifUloztitRBA0SfF z?3*Ux$Y?Vmk}4Y>I1tQ71se>q{OKJX2za$Drt;8ejUd5>1+CtNbl7*mo?gUkq!H`i zA7-{P?xIAZq}xK$L>SAm7P#%m?a{mylmnA&2LTWFcFRrYOdjP8!_?%>OU6tUM(TGn zeS@gOH_;0D1TFbblbcEC&J&}COJ4=FxLrkfzRx(3R3pRHFuHe=wdc5;7b2;+0xVqZ z=3XU_TO9uOtO!LnbSUA?@HewnnLp{?540+hkKW2^#4w8~lJt<~8L1l}-|KoT>VTG( zvz4rMH`gXAc03hg-f^CxV={lvspd$>>_sC(-4u>66;(Z!DwzFQ9>i`hBaATx)}?_% ztE|Z>YNFwBoE5Ndq;Ao~e_=2nXB}Db@ao2X><yZ9nODn{h1 z3P}>~WnAeuRP51C+`jj++;vby8UwZYm7RQ9QKq{hAG0>%`E8mP^W%Xm*zD6aPu+5< z<(jks)VfcIj{D^9KK6rDc3Z_L9D~A|$fFGS^8(021*~q*5r67T+CsU^s*L9}pG#uk zn-E{?rPQ@qGtmS!kZzAgNOv~M{gU-nDSSpM%B#G=#8Jk?=+NNI*<*2(;Q^!N>rzw8 zhyJWABSNukLtdZiB}%;2tvWiw>^`!;3Ldfwm=_f>MD-l$gxN{L1i9r45WDv!+Vq<& zZnQ;N_1fB13HW=H*V!8o#&1mpl;IscnW}uJ>TCfGyoMIl=QgE^v#&xlZuV%3Iwho8 zuR~#5hfdkHMb{jlRy(Y%UqDz~NZYT3A4+xy-5%@;o!QV1@>=@sH=fPYHpW~q4!yX} z7i2`tEgZIb*MeTFLI;~PN}XY&gscoSDOM|*Uy$8hUqt_fWJ zlZ&}i@(BNxS`4?b7`GetlfFXhfOl*Sv1=8UJ3jbE3jY3m_4w0H#0gNa``YY z*K=B@KMC%4sPIS9sT^RlLrQAaX2-OpLl-@tVZ1FR&E*9j?bodc~!3mcLBZKwE-GJ`)C-M4Qd<_3LvVWeaE z%yGmhJ0iGo*bB!4av8AtqkoU<>FMk~|3+(Kb4<>2I*w2^Ft1Ob22) zO!Q?72A(ek|CRu$!3qXihay@&Y$55FjON=PN*H#BjJm?{U;ZshGzH54HqHBect4+7 zzX6c;@1$}Rc%9;({1qvG8|3!MRt^>4#QGVzyOjNM4;5`ZFw7HqCZ|j02x@rYtT{ae zy#7oJv!q}>{`jDMf&Sa{F7uLD>q9b1qt!q$E#6)}^&|kqwXz6@zQG0|$WUdovjgq! zC8jjcD;-aAhOS3xy(4P=k$(pm1(#X8LJf}7Xw&{H#}PRyk=jqza%QL^3ibXRO{%|^ zX)p1HO`Bu$(<$?Q!AAOxM*2Yp)gtrEHNNYB&Cy{9KK(2uV*P>Rr1Q5^FZ~v}MzgYX ztSAZGs1VR;e^A9BqOY_j&x^v8)0I91$^%W58sa;t-$wvL+^#EgIw+*qdFGPyA53h} zI-{c=#RBSLewifFfx6~`v1IBv6D zhM2Ucb6}+!1>?1pa^#oT-T-M&&%m?0cVIt>a|LsF^GQX#^|#btOZo`g)`FyUIHee| zHvpE~bYm0RJjX&OH;ZR{>L%P#MR^A-`ew}0NowBJZra?olHkLHSqQQ>#g59B8cCZ^ zkW)l{{azs7yT!Hn_wv^Ic^9^pWrS@q^j zaMZcAtoLQX*m_DRQsu=Vn9~z1sb%??(ty%9r07ySWameVFLgH8o3zU}*@8t=ompIK zXNv%v=d6CwMlc-0XfqxnVZY@wYi^@0qoJRZ$UF^01cPa#^_lRZ^_V;>v3^lw4GwY z3&B{PFTxrwbz%rM4Tu=Ih0K`;K|u&PF1F=cxIO0xSH00oal;GEVyY5|0od@P2Bm&aE3=fCNuHQlzPM(9(yXx(@qJm;w@|+JG}kHB%({h<2#$c}CU!Ep+?;3Ks0ifzFsv z?5rTJ|6>}I;IF%{x87_T6wIe7|CYG(UlsIo{F7xz(6PESbrQS}8xdr?fK`EJO7!oH zpIbRe!6IuO*9nA&1QXmQR$Hs6xQ){Qx*pF*ve3-ZCYk&ra68bMt@qnvIoJ9~Wmj-2 z%?ZQv=c30E!@%$@F5EHyx%(Ye!fD(H13{B`!;urf;QFyCaL>_SAl(`M`%=EdI`>lD z|i z(pzO@$eGRBD6uaBy^2;5&od3}7D4U<+clE*sHxJOf?z*>qOK3$7Je!|piIuWn{(c0 zI{7ge6d;@k;kO8zKJc&@quTQ-$hDeL5Vl_d<*tLAYOws>K|GHno;`TA4Uk=rsnV`& z>6-5qN8>Z>pzR;QiO`kv0;5Okw+_-zP%8@S^(Tv!%QnLWVizLjE;R2We3K2{8O`uF{{||oD<+(+`eJY_;DU*2cnOES^>zou zBM#R~y2cAsDr_%j8mR+%EV1iB5>=H24Ka?G$E;BK=DqSe%pygu^c$z|`vo9((K2lk z5}Lz#fsG7=P*LJQ7rQ2MitlO`Bv4j!!V`oUuH+O`8cf!pCsU-BJ_$pLm;yp`DWpyz z;f{lfGf<}}1tR1X#zg;bk(b07IyK-S%osDjxxL4vshWm3>QHgx6W-CpEcT6D;wUha zP{d*CyCcMJsAb)~km%H6#a}p%MveoJO?r1p@wg6vv<0uYWVhG!-!s!b(-UMLcGfEi z@}CWa(^Pmg)z@Jb+jstS8*#b!Oik;HVMs_29Ix#DzmHLkq8w6&8z|AJ_)LIR4#Ox$ zxb75m*rFzLS2AS|U71|$t+P}{+)`~au$3|JR-!o9V6~j{F4d*TCB^SwSrwXp@R%6o z1fv>k!T_2aJT@C7%m;>X%%-jTaUI{UTw)&nKd=&%hN|!x>bgRS7!`fgAvwf@)*Vu* zHqizA@q!U46Q^B2o6Rv=nyrAhJaBqiH3-zk6x^6ZB!UK7OUr1BLV1r@ocC+8BAQUr z68P%UAFWL2#AY9~PXmnZ964LZQ*16#$5tZfSYdhnJYH&5m$~&0!*4{Fs5^?e=A80ukp+%72fztdhufU8?GB>Dlsk8RW*huL{h zKc#3GuT;j`Em+ZnsO5x|(Q2a)FYQ#qIM_+l1l?0{`%c@GND!D(f*`0ZpFw(>5$(S3 zhHLvxKS40EOXdOjDyIdtD^g3Ko%3G;-bdD*z=C=uO}BD`2y^JePqtPj%$f(gGR{cc zKeC`)R6L(${C2Ta>MbCvxgrKzBMD%XG0jLw!7aKaN_43vf@CtHM^F}_Y8eSeUW~^a zRvN{1bCcJs(T7Rji>+ML_?=?3Ago@?7g`ekL`oIj8VB@eBr<=_>)0!U8Z4?+>JLtSPBDDKV#kTjnY6+(J~8`S zp=_3ZWRID#)1zy>zB0TC=i8wcsD`h>h1D2fqv_EgE-s9V<%^O_pclNohx{3gU7-Hw z8ajhDBFs_zw*(+X(B`#743yK{;Q24d)aTv+O@<7&oD;tySKK#JLQ zhSk*_H>Qa3VRi<0A!BRibrQ9kGL7Z8mX4BRHqWVt*elolHesk2Ywe@9th%czg^LjN z&*?lpU>{kJ=0DLlF2!3}!X-9xCZ`J2+aB_MSUv`yO97w~7N1hG(ekI%Md7VY&sOK( zj&}Op$`t-(2!5xjt0ng^W7)wPp#$}MMJ*!>|Cm;D=T@p$F4zg)Z~hePLprX=moObd zEU}F&w@pk69pTS(&}`aTgEs&ZevEE(RF$I)<62_5Gx2kz^XO~u%EX0#l+pOHuRycG zFoNf@lbLKli4E-g_H7Wf-D;H=f*s%tg*Sk1_9>&UkqiS_V{Rj$V*_2_Do)PF1t32% zbbcdY{k!7{Qoh%Ptm6w>v~qR4P@&EZ2@o9-&7aSM72iaTD_<-~LX=h#YpL#a2IqT( zj^Fa-5$<@Fgz>T5IL2UBkrM*rRr2rRd-25x3g~0ZrUI38#6v` z75I%9$^&OjqL>oEnDLEHuZuB^Vb$foY(>XGWHhi}n@(LmwEgKY4V$W`F)Zc^oIcrC zwK`*1I0wg!%w#5cV6p4r!@L&_Vf1`4TRi<}at4ZAHUhFqM9l>}K4d8~cPiis?gT}V zCZmBW9?Fi9Wa^(1Nn%NGh{F$Bm=pD|?KuelMu2)gS-omSRex=N|bK7=wqME z1e{Eghmd{`XHPm{HWL4HCOc@!jrqyYI5(j7U7?^yqrK({A3X+5*U)ZBneivd9fO2& z9D?+L{;m)qzpw!W_9hnQg$c3Z{hmr{xUOHk5_QC`J1owl`B}b3h;<9UuSb@DX~0|L zcmH=vutG|Rf@CnH2b=+OZD;8yj^~L8N?^Y*_^U~LlfVg@H)!qfpQzFIq*IKG26me?pM>CE;(8$L#QLNBLb5dt z0uVZ)jYiXxbqJ!8bYhK8+F&U>{~C2xMt!!z!>D2$i*FzrRsD`3RdF!eou^VuYrSF{?(Lf*1{Qx6x6c;7G1tx}IRPN_DQB~LlY5_Lz zWlT8buQBCGum|84glaC~PoELHaEgHo@ocZDR8<%RUHBMH1jfEZ z!4j_ep7w0@#r*vJA76nQxB90BB-;01ibEj~VQ82U-(vF?a3c0pL&pe-NYdyd>etMq zn7L^G^b7qy!%UQ!sKv|MEp8<#A^#V!Xy66M$8*TwLtq6vtF^~>MES_o%9MeBol27+ z@j4cg#gNvC`MFQkSJO7D4ofyf0Z>jd>9~=!eLd&@vayNm+fN-Pxv7g+=-3aBli>49 z=lIZvfomM(+UPm>R$)3z>FnSg9oaa|D>0TQno;{-M4d@ADoc=;I zuuddfVG?2|E>sA{4V`((6aIu&gYVC|43GO#kb8-jf8WVVb+InWY2Wd!NFQFlifHl- z&FayqKIj=n+Bix7M1t3l_Kg-k=+No>&lctJNjy2dKZm6Xt$vkQ03lOLVoM5MZ~rLn zvA}KUNg_=Sns)oVkwo7y6cg_Jnuq-al^u6L4Irt>?p0I~ej?%|DRTWU1i|%xEl&Xi z7I`y!3s*}rc217}6P*05BkQukh4Wu<@}9}HP%0vJTzyh>YVb$K3MYHLu8X6tnmYGS z;|c0@U1NqG|1Ai|6Y7%Uq-eMx%bklWA5?EIpNESoQws6Ku!@Zh5-wSCRbsnBEqMI0 zto4s0zw7NnAJ6(lYIru^LD4s3hTy$Wq{=t8e=L%2ryaPY_Fqsh7YugE>-0>3>pJI0 z&HhbIjea@h@t;EaN}pWFF|!>@-;cPwaNFfY1qOXvg(RpJ)XO_?4Rd}|gA`}fjv710eQCOasDUoFK>R_B>6^}YF|~EXhv&>b4yEMCP%orG+ctIDGo`8 zTxo1xlKn*KY(lJ!1({h3f2+{~L)6>;S)G8b-%;~qRgZEZRXkW43`#3jp|{`EtL-om z*sY)E8#*}RhB0NiV4p$(>1_q1H_hx(y?3%h%Lr6H4VObhW$i-P!c$A-+B9E90_BI^ zXS6L!g!7d4`D`Kw^m* zu}tTD`k196>6r_&!Dmf5;nnI0b6LaQ6?+W>T>{{3sY-u=9@7!EjQM!Wy+QYPoB9zE z5!0J}cIqUg9zniRly`wY;pfo<6zPdbmx6|H(1rzVBL2P~mkjp_94N0`4$W`bp-$4* zSmxnqfnFmr$hWI0AGw&W1ZwXGW_p3-#c4tPR-4FG?d=m;)oX1EtJ#Li+;5%u8uc1z z`cixd_7UfRqoPAra0CBOBJvFLAK+Ee9DhYkS}lK=j72y`Xj~cebTC(ne;9?4iN>Oc z?@@DLK$It66I2(-Ak)rG^^^UbQm%JCVIkL>(!)!^{0>R52A!G;7y zk&R-j>)S_c6b$9?=y)8^sNYm_HSZsCt#v_;wl@(VbKA^p)Ow^=iwRGYY3Hq=*1eeM z6Pl(K50j{y>!pIxUHhNEZ#8j6E3 zUz@4>d!cMacry`xLXsuqL|qGaAz{b}R7Hcy)FdOA+K0Jsf-73AAt;9msUykN@wFWj zLyp*h6gi(qXLD;U!ab*M*pZIVA0TC@UgSj90*>b?W23@~e?~Q{BYw#6sXO_gU?0KVW^~6#U zB}fWxxtI`g73VoWor(Gct2rPs(PFHW$;PBZ7cY2(dfJXtAq!`3g?LdV(T2(-8p(jU z4hbQYanLF?S7GVku&4#jMH`ZvS9}B3;QsZOt2G!WZb$abEyi^x6d_qfRQHHa?d^$#e8mwF`9MwGXWeo>k4o0%s&BE;8g zbQ&&&s8Xujrh#n47+fv=xf|-nGU=v#$G$HVW5X`>*i(`!BK)wlfa-z~;$0?YI;iSalpd+|_dt%?to?%W(G6z4A2G`PVk{ zn)_F{gz>#%Y}fp&wxYpSl=9Vm@x^c#c?*V_5JX|W$vk~rTWdtBzYTdE?hQ;6h1On2 zws1(*)_GmN&sN^OtrXQ|d4*})qihJkAO|dbG$|ajn2B|tQR4XR292$84prFHZbDDF z#Fh3-9DCLsssT%au5MkH_b0y)FWGjzT*ia&Ej;5~Hxi{6!iq%WyWmNbyuW3~*R6W^ z*RLMgon>lL|LH?D-Q8X27iX-hY~N>{!&0jDlS;<73`(r(bH_iV&#u@!N|*i4&D|J; zSPB_xqn>aTeQEn98DD2QHn1tXn*>eUyYTP_|1oW8`qkZ z^Dya$m18Vuio}Xk60MXK75sVr7p%AVgYkeK{$G#H>Y4F)D>SU_3y5qZ2oeFCRZn?u zpWi<_^A+eGOp3r3d;^ilk>Oeh3IT(O#UPPIw!q{?62+2A5;N$j z=Zc>Lvu&}Tqb>1-Xi^sp-!37Au;ReD5HMug($93(3LDfsg-PjN7-9F-S#)kgQ+(i1 zu3GHX1`$W~V_aPEqVd(BCEMq4WzC>NHM_aduon1ReVHOZ$8*&8p1XddrG-){HEl>3 zeSuZFXY-WcCa~u7OT5I`HeK^o!sltElg|Ae{mQl;(0%k8A3~xD!o%ppCoo9HTTwQi zo3-#>SQaZoXVc@u#^XgW-e)slOtj@-np%D$rW}C@&VF_cvji<5`ng8_0Oy`8Ig=Z} zJOyH%5%A5h1(=U;u@yhSj2i$aX-#qkJm#m*MDA6i7~Ig)ff*T>TxGepzCYzv>Lbi z-oxxZ+U2nE>VHqvsq#JlPN(6Lk2M!M_6-p7hvhACN3Rcap}>9@%emKU!9Wx@QoFkc zXhj?&E|L!epvX_OFkN@k+P|@I9BF97Gzc#v{ z46me?BK1IFEY~k3(k{CKnpp{VXAxus)Z79ctlTz}TPHJsn#`r=_M^`cr+&Pe%9BC5 z6uKqjvkzA_CWxJx$jtGoayH5Uo&&&ZD&^0hKi!W{Wl41;QJ?nK<=p#5K`chYSW}i( z`aJoei4muW(v=+J_}^J{Zk@%CNaRcz6a~g+H2Wh%ATjLTc**&T-p2LBmUEU{(c$z_D>+p-OW-iX+(i| zgx>>JCpE5HyenePU9#Z}(W7j;9fxP>7a26*ph&!!GkuLf?+%^vwj|aJfm&=wPAdJ0 zT6GHn`d^@r_kV-F|KCLVt)uO-&xPUtR6A3Y9aA?rM6qhSNV%#`m7&`-mAs!>NHun( zMUI^`X8L~Cf(k~-nIJfNAPLorGjnY33T*DAY2tppN@a!0OC(}BJ2mMYw9Qm#7iVCw zG2m!s4L#hpNSLQ_Yi@)8&Y5#|NdzsQ-&-wC?} z769E!-_`#}ZG-}(wwN;6jv-=C_fuJrmXW=ssRBo8O_y9BjDe#H|u zTV>2TE{D6BhbHg<=^?P)8|SlW|8l~u`v!k{WLik3c3HE&>9pP1tB4>WP^3H8bN^f$ zsYO%O>0)!wi1Ay}XhN6LrnuALtx_}=zvI1qEp>#rrsm-`UM?$0B7V{0oef=@%5Vf}ZzwTo^t zF+qZQda`%Ehj*dhJ#F`xLdx|sjshGZ3jh{XYv3rI+xdQ4rpW?avtYB3=%?C;cAsi6 z+Ks%)uZ7o0dVQ%lR3d-p&?8~i1Sz}u5DB9kDz_-;nuh+pC5y^4`NxUQ1=nQDRc|H2 zPrY)(G7Tu){xrs1%il%rFQN-K33m@W0wuC_R<@`Nr=Y6}k9&SjJL|h+vp?+D*6R0h z9Uxx5Zdz{jE7b9)C*?4T+^sEF0>_Nv-zj>S^tk z#Ub>3*(67A|BLGo>Dn{Xe~hKmG4#dk-}aoO`vOGHs1{(#xtKXS%agw?`R;5Cw~Uy_ za!Hh}KF^=Wv*cN;Gib3zQTeAfNYFZZ0Q-zjXU>{KM3&5|Yk!3Qwu2lK7!vp`MXV$< zReE)Ub5UXcw(S1xh5}w_P#>QzoLY8oetMe9NlPF)I4-LiFGT7j;Ixe$Ro5_P?*Vrd zkpKvV{Lk>~R{%DhoPCRtf9BFns6I3`lm~N~#{@>Jp7+0a9=!GLH6G1uJjW86EpR4M z@(ffMn4*DQ9>;mPz%U>Gr0Tl9&pL98&j8_+EUWQ8bTP5zCOst;UVa)6u*0&dm4Hm>A`K1bd>Dc<@@m+$u-Xg_D`|41{JJ5$!_^=>Z)x~ zG%f~_?99dZ-^x%p#We?eHJ4)JWTqG}8E(x%CgvE>fH%lkRCz=&9_z^{2mVh)gBX}0KlpD-f!knU$>$(`u*za?0n^GkEub2bG3~@9X#J*Z^7&BDWQD=o?5>SA&IDO z_%tTy2WyV>6Q&O!Nvx zb5Z59r!%mNR~bC7JU#tc@R;ndk=6PoLZK9#2rOPcq5azrQmp6Y7D#^r&=2^+Ulczq z90P(Ba}NROFT-kw^~>EhisK~>O(Zr3riqsEj#^==mtC@ct4L>o<0;N;hHsKI$sMz(nU5I<{L_a!V@bU zPX7ukh28!!_IvV#l5R6FKS85#CnJJpWM~>FkYWC1$Vtyco1>|{SBH8V6N_o4(tpL8PU@i=C_b?s2Q^k#~$rG`J* z{rlu_vy%CItH1o4p->)t=(xNXiD2P^1$lofElu=py(cFL&}3B*>^OY5y8h8QMn~{^ znm$>?JQ2@~ww)N=(>}wug@|-ed1rFGb%m(?Rx(O<`hf{AFlA;`L&N_3lw?wb$mcpH zUA+X3b*rHDWb<+o;X8K~9pt)JFr+W3plX(x6qrAf|2>}8pOLPABYdDnKh0mCGXwWv z+2!m_v**tXP+N^{mD!`|5DJ+b6l*_&nO?dlR0|&aWbMJjbE7LO;x&VyD@M3<2t(64 zQ$8F6=bh|rnUqT;q`QRNPX$XRN&|O3@NltjAMCdE7;N?C! z;0Y)VOMO4%57#9UGY(kiuVx=cf)a}}UB7hC?!C_gc&GkIGDmT6PT zn9N6?G)PJCdo#WNP=50(_Jtm3b7@9xzt@Du3Nr;JepHTIJXC}+6JP;%O zZY-YKizxnmfJRc@@3S;{=lri0KZW!lKY~ulP?66FcoYXLSUoAEcj787Epe_`j*z^V z##{v==g**3sPM!i-arFi+?s-GVPE9Xf%t5ok-$!GE-LuoBmo6_v8~Uss=pR3d>8ck zjO6$JO=K^y2EG`+8}(%LY1a@Rc`1fcH2p(ayp@KQj+c~;1YRT<=l^5tofRS9n^N)m%XX{7Id{^BZs z*@7KU$kC4_ABaN#t6o2)pP(B|o4dwV7g;~_^T!&6yeWBc6S@a>z$6gaY_zi)fZr*n zdIKVe8;sPOE-BQb&TjwAP|Rv*;+nzNuGK`(weNo#wov|8hYn!ndi#c+FXbN7k@h`5 z{L)iv=Z1bFrD1X;;;#o;XXVs`G4)rKHiqe2Tu6Owf8RiqF14Y(@?vmX`7=&iu#+IzM~>flFpLGcf-I(9%j>Q#fUUF&rSO>bH)x;k^m@lmvcCoKk-*R7n~X(%c$TfLVCPQj!su zHpmsdfJPhb%b&_KmG`HC$Mtdw-spTD=(8uuU|=O$s@OE%#Tr`vE1B(X(TfUc>YSC) zGe_*5rcjfzcNGC`*e^U)t*p*aus9B(X-;zyWD`*r|0Mt~5?9Prrq-I(chk%w3DVsw zHq)jCj(9#>rl;=ktQJKQpsCPQzn4#^x7`qn1guOZ08#&7uk^u;+|I~Ih|~I6X4<@; zw@sfO#p|Hyka8kI}pQzVq@punS(Dg67luZUe;DoFV@Z1zYa`;1})fcimOUqu_;hy#nX zD2=?-ZZYF_N{#Dg>o!w)o6-)83o9<0!@YCtXo=HD{a;(&$j=yia$*xc$5K=7-hNc{ za)&hfqs63ieF%lF7FEo9fe%p93$2p#AW_JLq#mfRY%F(6IqxZ8u4(*-HDZ86I53aw z^ulQ_=@#?e&oS8eSofFxK)f5se|PKn-Dn9@$Y9S0PU?0PU?1(S0-d>r9g&F^2F?G$ z2D}+Z0cD%*kbuJKc^>*18*OzRVhH(T3nG#~(MTX9_VT3BukaUM#=a7mh5Q5Hj!ryY z;#Z}y{Wt@ai`%7dOGQCykVTddk#%AuHN7r>*@8CKt&gi?+f}eHZx(C$O7D)g&5EwN z%Sz?WX!w1y1I`CqTO@=}0~egXyFhjob>qw5ScxtH&Cu1FrYMkYp0$JgByMXqt@d2T z50L8^mcEYZIE-+cU{$bkoh?F_v6ZmeU}FY#Oz6I7uO^!A#R*vtaC8$#?S(UZfFH;L zbBO8x%lz0_|AYClaj+Bp@4zsMSte>D5&)`kw4E~5KKOfuV#}JLPGOu&5o_F7GdX0< zDQ~7`iqi4v_R~~A&=v4bS8v^T{Y=Jqn#cBo!*&D+M`l|-7g{<(OYOQyH=eW{%^2LSk# z?Kw5ef+wuA%v0uY1Uq;5y*?QKrxReKXz8s4i%gQgv{{rAcpE*TmD|7X}A|lx~*qR#AST4jk{P<=KihWdk zwNkzOU*L1PG%OE|Z%l}ytkNeicl?K*QrClIWva4Cb$0IdhXDIovU@4c zMyL$S2B@l|U8*FV0Y9$CIHLB-ORBBL`M8C~h(UzVUmd^uafBDl+i`HwGvT3HgxWE* zftzm;I}?sK?n%ki+J>z_{K}x!Rv}lUWW*`$%`hm%9@9_D=$Hl{lgsI>uoeMY%I8`DxNC-n}2tu_@cIwamFC|6}JB6ZUv>?s>hBc8c)GascZ~W5R_sDcys9@%$YVdoy>$`Q@HdumL13$yP z0FUQK#-FHQ-7tBYne4@}A*oU{V09dld=$w}4Mue-VE>~!3rf2iSAcY3AG+GzrnNsK z2q(}T#RpK;tOOKVS>oEUZ5%mDQhaAIvi)XLXUuO^#zUeo`Sh)BaF>44c~=o z6s1Xmnbfw$XsvfBhXA#@rEoWEDFiBV0W`eJwWgS}+e#EGdZjm%Y_A<6D>1dI!G-HS-VkA3Gb6MlMRUD0 z+P;#S5lYx&g!OTcsx1lYslUdGC`Lq7%)Yb@0!<{lXjHL1+sCbIRH!$#zzX4?aHXMi2a(C-b=A$ue z(HilBkH{wdCPEg{Qz28ayQmz8Q@|{-F=A|wN1AU~iRJ|%E7XzkwtW#@MTfCOKj5=P zM>erb0H){Z2!K#qQ_*oHmOgi2HEEdG@-wrK=}jqD#UImaqq=m9xCz1<)0zh6*5){G zv%Gs35kDXs#lCr6LC+b=z6j<98f-4a8;s8A0YpI4*|UM}L)}>`Z@+?-g)jvPiIq=w zRh9YSw9bLAuNt751i&fg%2J}3zy>v<8;MHJm4Fy52e8je!z=@xRm_s#R)T>j3Bqu5 z>_=ylkr`acAXHGV4ZtiAQwEga(?9?@)w|6qsp6ChKkLqlCUGqbXA3*<{`TaG1lo}W zcafk32Vv$@{}94(4n)uSS!ZTG^jv5CycCLa0*RNg%@6a>vnTs(2^ugBZ1B&BbnI`b zEi3yC1;7HvDWAc^)B@{_&!p5u;>>@zQ|kxlzK`Zttv2M^bwFLgG{7G|8`ZZ3SOxh+ zC?f~-MG4yGQiHd`|LQ5dF;q&IZS&ZEI(9p&Gm{Ye9&1&-dPV|UlSoCl2y5rc%R?9+ zO#=g&o>w0qas-`P)*bHyqA^Llo8P%74+^Rw1Eijt{`gfLL6%38D6F=IvKOiL^V#9? z$R6tOuXBA9mm&Ts+CNDfsX#k$0|&W*fN4K@5ok&8ysg!l3x9kJ1_NgxZ;N9_7V}^C zWQ>=Z4U(G8QuD0EUfnIbC6EAK<1!bnKs+;NvolKM&jC*G!X|>g2pTRbGXh#k$lfA* z0iakg0}&5#^+D+cZNu=QKtzFoXm;-qaNyOJmN92I1qDR(%1i9F%J@fcMvWZbzfTqwW&nB<$b^avqiogFDPc3LX9_`7LuE#tK&x0(fai zfyxgOd;59EyS{r^en&Kig9^mdc{~bH4{%ZX$|i794k_HnLRqmHUFBm)EBI|#GFJ~x zk2@j5S{`hgB|5CP6%|=4W0GZfS9%Voi?^(9SytN+Ct%ND{46+;k6zv$7Mx z2P=R7Ie<^!$6g^@Z=xe0Y~({BJQBz{BjnqD}!X*i!!)h@0-zpkCaf{MYi>4q<1pv4x!1B%{ zvrzzuB48iZnjJTP@1WPwJR}$f)|7J}b3@^%{hiem1I6w=*PAuOAG4xu~H4k7teWdA)_UHfnqIG+5RYSu70Pq3gL& z&{gh=-rAAaf93Ekwn_XsIF4@JvjOvF^1!8!exb3MPp7lXwyE2g4w!FuU=CC9q66O)GH>L{YUm6% z=f4_Mg70MFH?dGJ_^r&NroQx6ZRTL=07LMlq9RgN%8`|x&;f68yupTj!q5f-FFmh( z4)R%!CA9OyRrd!nX4MpP_ClNzTV?jH*0}VqzT(`wZwP+b2Y?bEY6b;GF~Rg!W#>Fyx*OKU+Pq6_LI@dUZ2}*{AXF&dip5GTJ{mP zm>G}Az{q@Kj17Jljo-w4V&t7`wC2}i<>T%9EwL(>H#8?ZUuBcZkNwIVEwcYwo~=n7 z;k&jBsd3V zmQ4d6$HtCVAoJynLD9L$G}%rolD7N(K0f0CR#16fQ|yTLZiO2ydnx#_^;I-)Lfns5Q{RPSiLGR5 zGQAh=w6e>LCh!m8gIZZsQ!}c0HZhj9(Nq&(3}h5vOsFU>L=qd{zs{+}MYAl3Wpg(C z9K}py|HKn#*No@oIh~oHz-zNxkHg5g>iP6&R6^SRWJUbbLIOO{iVY^sESf zC@0~~kws=6;p0*FzNZ3K#s?}?3SrcfG;x|t-e!K4k$@X7nAj7Keb=cou^FAom#^9b^a>)seVeN3jhR@n8n1Jcs) z9*7)Y1Lt7`!u27&+=8xb&LMgJ_uwiRI2S*lzHC0)|3U5kW0RAai#5?u?4Q+$hPK_3 z7@F^FZC#m)hb9007N2XS0N939z9lRP-#k>ht{s#6_0kK<-s)=>H>;kPv7^7rf#uDq zz^ONDtQ;Z&AeC<~%Tz0J&lw*JnM{nywqeg1y$g*!P#xjYQ~fa$&N(k+Dswj!`MOB5;DF~U+8b6h|4jzZ@W8Q)<}=SDWZ7q& zGE9Ux7w%4%7B7huo^~#S+`Y(Y+8U;k6>@3QeKlD!q8I|V<^5BVHv{N{S!KlFYuds< zMx+-fS!h~%KRg0=dGHjaOi_(*{bcJDxSgzFOvTq02@fAU%)#Jz7fQP$h1X*wi4VCM zYoS%+HOr$+qc}*gl*K_OR}iOeI~{DSqko7fsq$lLwC2E6z4xa`^)N@TSNg}qMZ9(x zol#DfSCB1Nns`g{*#UTPn+3Zq&FC;<#~Esm86%>bo+;6)#_d}z+p$cfjd7jeNpB5T zFa~ygoh#I&(@C(2{h}+KNU@}^H1;)20x}%1)O|`{GI)Y*e~w?_Q<9Ye&?{h;`+Bs2 zP&-BELh%9uLu8_KFDTEH?*_ zoeg?wo9K8eLZOIzt__@s5SxB#8|x)iUK@*Dg)gV=y7u4b?!JL62PLD0-&er$*O*p! zf9*A|r+(GP^is0S9p|W!nSf*q*NqEj6e2aDv@9VIhXsa)=5(Xcv5(^~i}zP_mb(rc zk>XcwT4B?U@d85CL|u5%UmvxHlryzS{ln!xRIPM1gJ zhpkIe=;W64N^CchyJ-w4GGWSv*(?O7DQ-6(26c93P)d}Wb6c*@!5j@#*U)FT z#)1}$atyfhNXwQoXG}U$U~G)p)6yZ|MA#lOJD{73yFVxBA(XnBT2lJbKw~t*@4AL$ zZJoWD8-TBSYT9g*T~wIhS1e98(^z)|1L;~XWs85!E-N*+f)3rbgkuypy9!grreu%l zwI#@1S(m7UaJ$uz?5#9uuVN&Y%TB6SvrnL;XCOCGiNPMX>P8-_cn->6e?o%GSdj=U z4X~nxCrtKD%9iToH>zf;3S?*+G$Z>-wPH`Sxy*>MM1(h&Z8zEAC?FTkXc`8D14w59 zk++JxNC|1dD`hXG$kh$P(G6ZbHFOh$l`Ce{N_tclVT;Tm&}Yb|RhVmFX6ajPVV$GH z0$|hPseb^T+o+wwGWa?bLRo9(Nsj(cxUXQ(7xJ@Cc4jJ)B@YC!9)C-O%K1*0wSoN&XvD z-;-0RU$5s^5Nk{C3xdsm-%Z?q8T^rQ0t1ML1f188$(8;_UQHLK)`4{pPhtULc5+*! zyvUK&-yVKD#{?ai&FKBGf~5NX)i3gx%%lhfEr;<6j2f?EbcCMPHp=C{L_GAx#No%) zkAXUKdi+_C(@3N-O!gWh*M2kwWEW71kcPjh4#Vl?Z?{B#Wsn$-*ozW=U1(= zcvfhA{M{SE8S?egU>9Wvd@9#oUg|p{&xcE4>xaGzgyJo#dV^tqRK9wHnuaBMZ+0TuojaH`F{eB!9>uYW?#YIiBYE)k($RM0!xG5VDNR z|4V0G(vYGz^S%(fceQko!ipWLfGgp96Vw~SH?g$%TZz*XY+K#b*G9%S5(iXosSr&i z1r8Y2f{zHJE{JKO89QOf%%-6`B~-)#nnT;&etw5>)C+J6P;|%jBuZDj2Es}Y>$Yxp zbHwpveSoZtrg zju2HwW>|2Q(3HX54VN#&=@?Nvp;^%4vuSxf3rXkr z1*F#(8`;z`X8y5^7iW1j4D#wUr@PCBPL>vW-mtKO-XW)6GbW{ zd|xF2K$8SnhbSOA7qXnkW#Cemg2vc?2oLQP-LS+ovv+X8h@Q!|WY*&^^f_erdZmkp zD>uYg0qRltKIOX%=|ld`7kC`Zz1_vl>*tTx7X}-g`&R~6s>RCgJj)g*2evwOQ&vAY z?XWek=aC9bew2`p_+59PDYR9jfxuybQpwx^eAQJn*JmAle)od3#{c^pQ`1z$G&atp z!0_j&)SjPfuwQjPpT{I{RDM1#;JLYXuNxItP1Cy8X(OaGm7*_6?T(l&hF+I?z4BFo zWx}JzYoo7iB^vK{Yuh8%P7h@?6y7Q2Ck(0RwX1r##QT)VU4~jT`v$4$gh#8zT*O8I z9K;SJ_yvHH-%`Q%7P+^T1M0lfndtO+kSG}djzlSp1mS2{=P?pn)57V;`Qxk}RHq3F zc`}TB!uto5&|x?THkS`9ZVPj9A{Q92!^09HPSb+Q{7It8rO`R9oHnV9y2Y#*LBkmS4Wp3W~1Lp`pE<~M& zYkxtml+x916;U&ogYruU9duGnDimCf=&z^nm%}L&$l-aXYHSgnb%Z|_{^qgeViDEX zNVy$Yw;|pyy?qP@%pyg1XG4{7!TREK#zkc7u3!lG%swKRdMwz$GQ-TqE`Rrf`et_- zI&0a5btI!VTQ$1J3jC^3yXP&yI*mb_4MS})d&c=`fg>;p>6zFtnQb1U0^HK!q6#;)9zXyfh?&)~z`xM~ z*=GnX(nn&KwGNI?w28;l=0f%RSNg)~#Sb}91GnMgL_OC-z4@>}0Qs7DorVn!uJ6t@ zObyWQca)mG50_E&GCx_Cr7HqXLHNky5%?4v!{OF8V`4YM+&-7uHT9Ye!Lc|fiV}hD zpS;zXLW?p9GO^kHlJ*-wQ;|(P{dzz41&d6Csi&d}wY%V}tK}j*_7JhdgKIJGebwR* z>cayBI~LC1(2w!ilNNm_j)N0_i%-h24e#wF=Z7elFX6#j1#kVkTq0En1#?HQBp&r# zqqd01YF*?0O??v_q=v;eimwNeV(X4@IV9EW!gC?K?ymQzT}!kTMijkL759!rm|eYI z;UF&M9!9P%T>6AKl3S?fWvYUGx9}iY_)x1I#Sh{#Ce-qSHsl|wgj4W8@6&~5yoYr+pT3o&^RHAR8Zr1wSI>j*gQgO^7!z0uiTDj4Miz) zKXj_qgx2cHv7LvBElJSa5c7`HYwDttsAWW@Jh=4ZqLZOYMzHv*iK-W6@ZzpN@G5`yy3ifDSU68-3ZHTU-KFR@G5J%axNffK&%D)Q5K#Nzq!v zkzE+{%^|Sj(kvy6NGENVeCgN8nTAmF7mbi)!8H*YH-BnEacbqx%949|UQoFIT0xEP z`xZJN=qSk19(*{g-m#Zf;#S>QJuQb4J$@rmNcz4s2G5WL!W}*_Fco8Yx&(Gbqp2Uo z(!D#Um$N!7?tp8As`tD5-?KxpS%B4CUKZY2YNO>&6^!Jz*Q=8yCsmIv^9TO9Nk93M zYu@wnC$m=O2Rgs3oqhvvnZzVYMyO~t(`p`o?t;G4W!mRlKSc{?qFX;U!L+>W^n$n} z--hg^>>r0jf-c=uhXlRk|AGk9G_qK501fGfR@7=4A@U8c6TGPPK{Z4FMizAI1aUrb zUiW|~+DyeMJr{RC^92z^Qfb$9te_#$8lt0;y+_zlSEGY**~nCtp^7U8fJfB8f_Mg$ zet*KXn|8O;9G2S+9^xzc1V8PFZ`ctYzyX@GGfAyNY2W8|YHKeVG=fZP87OKStM+QF z8fP*M7v&FI#b4#}nzL+aNUvtX~_$w9P#)j6bM!dj>PYDO# z1%u(;`mw+co}Mf3^2g`fx}9rt$9DmPid^1dpi`KHeBJzfuoT;UEN8DJQ@5_|AqsZU z?_VpG$3NAtVJq6cmY*&&cxFAv>dpG$d`|GFURQ3IJ;qcmTZYyYQe*i@hN0*r2~tMo zTvEgVO-M^`%9($8w4FiS)5b`Mb6LBUBUCg(!Pq~Ktd;}|-N(FHa>_ZeT>JokHR!mE zPQ1X99f7j;etRtk=r|@q(L$HL)Y?XIMgd6}DEsHC%5pe?w-eL*}RaxIcFhJRa^L~N+$C-94yXOMEW z6MWuuOv+2?pfO|Uv=YZ-4?sDsq!c61`VP)l3d_5{y1QwIcNi%E1AxJb0Tb5 zu(3 z{Szz*WeVZf#d4+(xgBbN#Jw+o#$mapi~;8_gwVWt4bz2fq6>};i7C1tfxs{UbwgT^ zi@-C|o|#v`V^w9F;(-cq6LqoO@IHTyd;*zMCa~-K{gtQE=8t9HnY=p)M}?s}m=o5RU`Kce34#zu1BD1IxoUw3aTVv8R7Mxp&$mI!^k-` z*G8F*-z!VeVc z5#X*A(BHRWG#X5O9CxgVHIBEoxd%%ZOK$QGS@am06xv&%oONrnYHS{z)SU$%SbCIa z5d6{WXXQOzenUHe8Q0Y)GNZ~nPEJ-OR;WbRFl0@;{9IkU-JSc)14*7gw*xkqTwpbh*sW0zJR8T?!8E=MXZGA){CO_x#VO7vu{iw*Apm#t-KstfL z_!tT8q!4!;3kQA&IZ)$k*En^`W5QIhQrk`Urja>IhX&CA7$)0Sx~7w|>^$~p3wY9= zpue8y!YnyUzr@2>yq{k~^osu3MC|8$HU(7IURGT*{d&t;rKvPC+#Omxxo1zS8Nd?Z zCgX9y>fs3CilP>rWO`qMmqZ*9w^4`#`x=N`J?gbZ%3|}depYqSsPC$6V5gw-?q3=Q zBH(y+@X~|;JnD%c=2#XpOZ-|mOKn|n^@8)cHQY1`1VZY7T+Y?pRRl7R*(KQd)yR8) zV%u3<+Hfs>Rr=Vw9EX*6qj1yPj{UTPcynN2M`_TLSt3?lj_I8^=+J-KlWD4KQ?oQxuT+w3M?XgK`qd<)ge zXI4WoYmN|npafiRj8~EV%f|a`4`lXwfp{!r0MF{@^G)9$cvJ?V5e;U;@NqcD7>z{$ zm_^H-h;{Ym5Mlsj={V7K_w^f62NlrQ40?b;P<1k$yTODw{xwp1*j675s*zU<$6FMU(2glIt2%FlisngsaUPFfT@^-;Wae1CEWJ;@f zz=KI@WJ30x1!vN0@kpBi={lScnjdxB(TjI`77`F^~{{+hXfzm&>1%`I)6&xJaeM&E~A>pF#-DCTHbINTf? z<+-%O)ca5x?lsUSwGah(R1OR_eNNZdHrql+k-IX>h*<$bDr zKYEhAVwOV5V6yYQ7Ttm+mD5Oae++)z>8-gqmx0>Xmo?{msWh|H|C5Zt1@pH_XRW+S zs~XnjP*16vE!{Wm$KgXvL{BDx2~Ghx5+FH+YB$0ysbP@(Hz`$fo?+>qko+mvhe4~s zJ7m{$DKp<;K@*hr=WKIXRrM%+`|rW_-gD|_56GdKswL-F3oC&ylHISin&ghcOFNqL zN4eebY%km3ew0hF84Wb)i`<^R@IK;TX()05ue>PG(roa6M6L(~!6GiC#Dn-UIDh~* zL@HCsZa6F$;v*I)DcR^*`tyDw(o7J$3<|~8iHTcdSQu1) z9M5t`W=?jrHK~^PN?6wFCu*M?_RqP)>~aE?Oy;g}z>D+!&jSpqd0BM-`@JBJCh%Cp zIjBW+Su%1w(Y54KNYq^#;&RHh6kyq&j}!_bKw(TIbV3>kcg7^&Sy^4V|F5>huEfW* zQZzA+GRgwMLL|RdUq8_WhnfPP&#*$QJ|_EhB+jo$}jb|{T;%}K1XX%m}ZzPQ}!$@XGj(_}M zJ^nYG+Df_WpK>1^ot)fQApnFzA7pF*-2uPJ&C>%4VzJ^gmWN>4P>^t$52er5(lZ0Q zb$t7p4{rir0`C#?oQYM@VoRxrzF#yO*$PlC7cK7qA4BCxkKb)bmqXQJ zGA{iBg^QEywwbJUXRt~vB(AHePg8a@7ll9ArxREGK#i7p5MV~#BYs6g%&)8%N>(Ma z*rp+`z9doeR8tGBb-TlKfz8bqqusXY54O8Vnu)NC%mDEGW{X82Bg&laQTjp+H`R3` zJ+sF&FqHK!=0poJvPNoWH*Y_F|+1vb(;8wH;p&sA_Se4?MB5seIc|VI5Y#gzB93yUpiof3ByfKu=5; zxj3c1O&GDsxxqOepp#MNPt~vviU6z%2SOeSSLvDz0SKo(;Igk-N>j5;Z`Xul@V|_@JTFh<|RA=mhr*si=}z{=I*)$DPUh@)B7j z+^ziCoW~e)cra$ri~V&o_`~*>u*QWn4^tlYL)fjm-WULaD)Q6^Zm(hKheCoOL*fH&QNyueVFP;$-|vuKcFped2oZYFG8jQb@1ZTv!YyF_dC= zdwY~2zAz&>jVv(8$UP>Npz`tge%d_g5N8q!5*R8JADWdAv)kLi?pZH5PfH+~b_ywg zr$@V+yGS57Tn`KtayY^ay(Kmj3b~mUa@Y2!-EH~uMB)e-r4EgLb7FyBO_uEr z4j8#Z?PlV*iXsj}1IM327u(Y&E*)d@l_IgU!=2~sCE0ZPy4$~WP90ATlT9`cu-?CN`=XX`5UAx zF4i6j1{PgSI)iS|E<F#U|(9G5X!dijI(#d^ zt?6|ejMTREaHy1Jyy?0g=GXq>zy%=k3~5nxx_)~WfLDi~KxYAxP&B1MRzq?@|y9zS^ppkU!RGjZw>k(z-EZ9=iJi4n2=-s{npJ{o=(0Y11`S&%^s z#6IaIP*+qMtMVBD%T0iWon#2L#~7;XM0=#6L`xV*ikE0R{BejPMFxV05E&tyu9aaF zYa8ep&FhQ%bAv$hA)}PHW z>a5V#M&-i>_07suhh20}jq23knj$@!dOaU(GuV}gg$zHQ_M$kN>Y{)BWydmxMmXEK zJxt+oRcSAx-sy*^i)}6i=nRO;)Fl`mEa5u`J-!UR zRVWv?CC;(g;R-f9e>=f87@AMxu5t|9H(pVX+N#9D_l6vHVf4ct!+u>L#jNKG_T-+X(rN}ua%?v&rlu(``W z&n~Tmo9)7Gz{I;$jjT4_Lbdi=&Fp6lv!f`=Xs0bB+$uAc8zi|l6TYI)I`Uj1f+h$0 z?Y1u^3JePoK&~+R$h&+WL6gY?$7p=Gorp%sBU)f z0-4wG7%l71s+&twp|j4?<>5d%bLX1Od7Dl%*5QZK)ewmR-^Aa`m%u((a?nL~AyCLT_3l;5!48$8$7zCe}r3mfF^B^U=6FW#UM$ zCg6bAmrn}FaA#H)sqP@76QrRAW4)sLUUUwk_Q0*cDxUWWLH2XnLRT(Gv@qaM93Kk^ z+9TZJCG%Bi;Q)0kr?OhRTH6u8&CSl6viNAA3dXc61MqFvqcp5J#!QbCD`b2-9x0fdbK8+Zt z<6eMGBrBJ#egPKvf9>#k8-n(04xl3A<$^n)rEwXN$ORm#-ZAjaY;tIGMuLtX-eogU zT07(wA;dDW;7nFlx~wwD#pvVr#CZayq@X6<(IB(9@O6>nvlp0(UE~`O=|s^=maSs+ z(OAom`)v8nd;K=d+(Wb65+rsj4(-zTu9L76dZs%;&ing z9$o%Q_wgb;1b5A9Br;e zrbOup5Iqrl(>sJ-v-8F+Er%i4>0EkZ3nk{~4V9VL(-UdrxYI9Wxf6Cvw(rK%)^r5o z-&}@ym*Ib9T~DFWuIQ{8@k0QCN& z-$7HQ>hd`djQAtHT^6~0#8_NNTLFq7Mogb}W`E0czUV%8bDfWyrBwqio-OxZgZiHT z*vh|r%~cad4FXdNel^sIgT6-?5=;~`Q~E&>+|>D2Lkpv z+4^x@96k6ztjOh9vGnicBOugzWU|^2vdi#9W@Z&;b!AsHDucpi7?q+l7Ed>Smhd$i zg~V+zFu9_pLv-vzS~M%08={0p_qc0FE|yb2o+2p52DAZ@5eq>Dl9f}g#VAGFsea$mkj=Xsp&Zpa+DLi){zY5hVd9|RS-?f{(6Vj0>)Zl z$5{yq$SgU77|4@dLVh1Y4MDzSu=+MU~A)0m@ij^-TqSukeUa? zcbG}m2fkr^0b9VhO3^fTSkO0xin~udYE>rehaVgZ(tLjl6-1`LKSiC*dfQZK z)p_%|mp#$y!pI$P3Wz?!BduSI1(U%w9EUI-FDytlCyAUYLUamMd}zTmKCVBUtS@V+ zoF!MJ2;1HpoxK2Q2qUjmwrk#(UxCStqkW!sq2zq zaMFK%Uo={}Hame|KEz>qF!ii`BcvCfz6vf@pOC-QSJiDs_tiW*c$A^#jjLjWyJCvD z{_d%17-AcFvo+27;};3v)6@C1`T4J9gCgU({G7e^JwfbYAXK@g`-dn&(^XPAyLRY< zAnDp0w1kvV{PgeZFuNim-3KCO|HRuQ zQ0coB#1A5p!9yF=okO$luclW6Y@^I z5JK91BQ`O&keBq3Z7P=uQs$nFS29O6C87FXd@Q+W=B%V~s6ol$&x5PeGOB+2!^$RH zn|d+7EN%h6Y*b+W+BefMF?*)s8-;oMF?<*Zek1$7%ZA+=iUN*F3!>Mkhnd$+=tD$U z_zD2kL$bcu#u-26L=0pV8PEWXEq+`)PE!Vtcm4ovY|+d`Nm0429~nEm&dKt>9bY#N zEURpg8T^RzWezH^lSaIxRd-*x=(@E-IUM@MN19t5m_hDWns8WUCHUvAgV)j0i+the zy;yOACkH=hAo%UDz(AcB)_Jqq6pApS4J3dGf>uCA7zs|e|C1h^LjJts+vR1eNYHG$ zO)t8T>Mr&+tRKzoMim#REVZCZ<n2R{e^IAVGOnm{V*|2sUwx!Z6iRi(Wr4 zF?<=w78!jb!=E{K8nM=pH;{YCJJ!y^Xzbl16vDE!65oQ5Sz^m+GQvE~^y1`4gEm0S zvU5j&^a*EF;(5sINnc6AlofMhIHG=VO#Lmg2MKno_Uw!s{~W9theF0n?8%F|OxpGJ zA;H2wu5q@dtF=N7k>CHi+*H`!B}%Iy`Hct)^{R^an%|3i16pw6*@pYQE=Plg=M}Ua z+p`J0297B+e%6S%P8w*2 z(=95rkIRX%u+ovq<4szrzCME_9z(8yarI@I?4U=Uy(l1Z+KN93c};(T~s8YEY899zxa)1>_2vg91mW;!SkRn9*iduh}|`-Af2HQ zXUnZ^+p=?rn|TV>9@SzgI+C_{KOdRjf`DRL1Q-6GYhy#f!Qt1>?a}_4e>5%+i@qN4p2$2C8 z%&?{w_v_9jNe?@!HXPZKZ3=jOlezSg62(%+d5f?6audGt-9Q%qTu1Hcuz(xKlT{L)ZnC*RF3k)oYS0uYY3 zM9EAHv0OwRP{S<#X{IpQk?XM-MiT&=onzo|#DM`)4#-L}RP*!PeA4Es%R?HS9Iq{9 z9GfJYi&rEz4gMpgBoD69?JEr|eel~f@H@KGrzc`)2K$so1t{RFaBq+vXeFwr$(CZQFKkoxbB@jP7sy7py%O<}Z{qKY)nX6!Gzzh5H8i zLfd4j70x=GbY0E^x@F>F!?_+=Z*qlq8tLflF#i!)+sO_Qw#3J-_Wl(Y@qkXPedY$x zcat-aD1CV1IJby1xNL{I0LU&uB;DqRrCSOUo-oLp;KrX_A575fUf<6<_^HhlGzvS> zzFvmiy}YJjqpDFmQ$V3G<@#T}d2au1d9)byOo>{9F^~fC7i}P+P5x5FYY@Qk4`>CvTd?Cxz_O=1X+K0u!!fD37W4Zs`*KXSPw6#amQ(3=W1 zgv&4LfZm?m&G|Rs<6G_Q=CR6q(G&h0iHRg8m5~PqGZf!?DQb1-^Ul44{ADth`iyGJ zP;^z#eCO+Fx*7_}Gjem_0?j-TH+gG&(GB|}Fb<^;qubG2+zmw^(^Y2E>AhZwPd)QW za$!K2aZ?8+9H3_RJI36XyoB44C_XBiHj z@fHq!iMn9H7yS8O#A;7l*>3jK?Uqf#($=Zveu#hMoEw_>xaU{+uyZm7SeM6D{7m2V zUJx9<&bS?BMD`w?Z?tych+%w1*(X%Na8qZ^# zyDQ5{Rw;=DbtT964t={!r0)+KPomdT1E>>9sD!@0$`SE>!*}@D*@(o5IT!kb+ zM?+}47cPsD(IC6>Z3G>WOHW2f+`3Sj0Zqcjm5PxNV|p{QZNSOQ7d0S^LItF;dzqw9 zyV2s@4lvWs7Z`mQplkVrH0HtpkQMX}(gQhVf$X5uC_DQ|Y~Wbk=|={BBuT%Q;^lyc zjUmvjU{;GHx>abm&1yc4W*RR)>JvRb>0`S)rDl&)BB-$ZIa@HI1zrk=qFGp`YkIPo zyFQ=HoV&bdTas15_vNGp*=RJszh{QGQTSaP2f#39TX%xod*in)u6v|AvE4Q(gfwiM z*kBdXSM{3foHo>VkvE?PjNro^$Nu(}d*v&v^&2<2I5|D}07o!lqh1Ob9G7Hk_CIV9=4fOV?R<-tsrZ^VqVj$8n z)x$3$jj7io19xXCsl+#pp+Rnu2f@Izo|yn1d9pI&I;OP>8`^m&+C~l1(O4;?+sm+J zu#A+X(xR}gLJSy}_AmY2K~D_iIP2I^4$y=JvR-KSu1)YYG}rqh1*%)F1{0eTh0_l&F+3VepuH5uBF_tj(!qAgjjE}+ul8q z5n0ZHR}V(x<|^20)Q- z`8k^E3f1-AjP5mYUx?d*X;(7Z+dgZ{w^Ib)dWb$&CgKh&`}il$l$~1u{!pJ9DQjmH zQ(0qiG30(g!rDIvqcD_&jBoH(cixiH=yu9QF{4vKv@kM#L?kRyx<88GOAKxG{fa4N zj((NMikG^l(Bdth?lsL5&N|A|094_W4DuZ?;x|hfTWu6+Y2-k}K38wD1-;f1LpGpk zUO;4O7?Ru|QKE~|SkMyG$-HyYFT8Iz9vWOG;+$b-QFx%GVQMOT_wF6A)Cca6fof@2 z6aUqaZ41%i1*wU~KuIkGXXw}s07V1ZWH2VFjhlzkQs0mW4&d8jDDnGQ22>+7J8|^} z*`K(c(u$X*#v35T+8dcRp^E2D`)nMshKCUw;q}NU$EKU7&XQ8t&*=@6_*AclTY|ooJi6Z)wl(H|H2qH-ZJ{em$!qbW%sOT-?#&xc%}51@S7(`m$Z2oJAe?+ z8*NO8hjT0#y0vh}8qQPkvsWgT_T0g>ak@nmnIf~V&0WUd>!*)LMR9+v`1BLu?e{R= zvWnmKs{H(b^2f9w{tq(fzcv@h{|Qe2e<=b?94!CkJzK(_a5xygtFF-_Ri+$8Hf5xT zi%mrAs4m?XaWS?&YusM}05jvM99b#x^nf5J%)?Ac6#i?)V&dWPz6I~o%H!@z zH%0W%$W%IXWD++-gT6+@=x?7uOScjsE3f_%_CB9O*EBmf6z#*m1USx_!Krp?E%$kB zt>|s12K3mZE@#cGcz1t}_?IMykjAJN<078;SbnWqvH3jo@XQnQ@ri!25JA0G@al7N z6BQ9JPuXdsUyHrW*gD-|wjO;w{MP1$uyMyX`1xcE{3?4`Rm7WGjXq&|(}344r{5ZQ zZZ8{0r~N!WSv!FJIM>%~JZQ#$$z8_|$>IJ=ik#$nkOa9oPYnUuO z-C}>-#Be_Xd!y6S3mLk5?MWILIAmueLJueAw?}HaMhdqtDz^{QQo@q3sZ!! z8?cK*R|FoMSHwaCJfamI2~BsFk1f!`v7rlRX$;bQGKIF1`FVAJxPpqX>IR%BI^L)P zTZOhz>(a#g_Q_Eza?J?gK$WR}w?m!13}6T$(Prz`D+Q9kN!6VZvJHgng*FRF*WxgD8$}w##4_ zj8-0Mz+f~^3Yj^JGXHTVqGF*aJi+WVJUTbir#)Z1S7a&}$HB~&>5QxHz3JTnUAw<}^&78ri-ftwG>mqxN) zlO+idQyijcK5x8OJ!6tIdffA??xJIRlY6=@{BAxCZ|hV@Oo=K|a3Es=;~i^s5VVcY zJG5^E!GHo00_*&_JGp^=M*z4z0yfG>*OFweT=If9v!}1t;hxGz(0i-m$=*E!I<7BO z2zjiMr}LU{`W_0Mgg`07qcF zcsjIHtMbDMglenOZP(j2Yx}9hxnz}mtzFmVd2o{a18>Nd`H>1g(fsD?)3`_w-#kZO zWp4;Fpqfm$;ZomQOmtrf+15E0E&myTWu^>G(&8H%wLHnqe!9Mb&H`NnU|;<0oMNi> zPPZRI3hPMiHHz!2FGR>JfK)?b3H>`S7*dz`InU*rEGU#6C87skAPOZ}JU{NEcdbO# zWA+U-x_HX;oB$j%eG6tRJqL_CTqu?vd3#NX(I^jzhn!x{*mLJ)dj0PXz`O*J!jFS`;y zTMfN?;fN}#3m<`ZY<2qzak4%EO$-(|3gXU?ipwGeLJ0E6K0l{^w_@F+NF2R9uv!1g z4AK!M`Eey4Z1J#lW_u;4tRz^;?!YO;NB?U$ffQR>qbyQPKQxi9IU&~uqIG*_jG1a& z`y>-pK8#X^AB>zj087)+*~4$UfxfbM;xROpE=+_Z!Ll*-IbS9@6hVBxh2A_g1hV}3 zf%}uW`6AfTU{w9=*D%$nWHv+fE1=6pP&qYjN~L9{tr|MH*$z;YU=NxELusmO)uC!v z)9qvL(C%OmW^M(&V#Y%l21U|cc6aS>N%RQ$T>&XdN9kQLz|E52*X%kCV$0jz`926C z^43S+?9T47R57{CbAyAg9w!7j6rk{|xzdRlv zaO@xJr0_R-0D6KkwrSe)rGsz}os*>a62?o#rU`At_M!0-cmbrWALT>*F_THL(5!B{ z)r1CkY>3dHhLX+>n&q*D(Ie{ZK$>h$PVsKDF>52=56e^gr8XnXOdDVhqg&zWL?9R@ zrJN_us$8yA$yht*MYxoYIh?X8TVwxw&>s4Wm_-E}z)dT$Q{DG&s9sa9e>H3m0Gcpr z0YFWqG8BHS8C?Y4easDh3aWG4xju?es##3__-$9LSaf@UZuJO!RyF3}@$FYV z{aD=sPRKKnlG~6Ec4cvJKeb;n1_JmIjQ?28vtxbUE&6tubYl*khElH6)d&$&;F(I3Zbs#5)prk)kPvWswepbbrEGNGJ}FtAt0J9! zmKBtIFQ-HKuUgR55sqD{B8te+R(p#)VYJl%bdVfXpIh=W3G#U3ETr>|x1{ch5LWfp-@}SB`xV-YrX9Qq!iyZU!BOWl#05LlN zUsPz$;{8-*oi)2mM;2>3OLxEdGRDVg-pddyjXf%@xWVepd|g(RS>hqh)cpAd%AdHr z{)?u-epE@|ykT@1_CnXw?&3d}x%}j_koKirif`=-_+M#K=H{gHfuHU+HgXM-S5+ze zFv6l7DitfGlS&5!nD!OL*v;2nDSH@zqT?dm@~X&f`~e?0JHfrVnGP%SaPrMWmTb6Z zGtAK9_^U5=!uDM!0n7uW)l8Zd^p#3p^f680>vzY@yjb%5UeduNXqZ>9Oq(%sWC9K z%HsDlslt#8F=CalA^~7|9KuD+Ij$Wo-I(~$QrlFJ(sZjEl`uAJQO)}SxvL)kuIxb* zB!`HC^ioa4513jbYcEW(*I;MmT372}LEgf#Jp~WMREe&Fx4Vk*C$BiqLXoDCIDDot zut+3Zy6^5MJ#`Jo6gj> zU_#l4=hwW*%7()nhH{uJn}!i-+{NctbE#uKz~&}&Rb}Lc4)A*2mMDCuMQIY4HAM1; zeiz9K1hK^UiG8s;F(*tm6c~@I=&q2Q6Z-)7ed{Yxq~4$4Cw=Wq!=_`InFUa*Y?;XK zyrb7&X{^V(B8W~qY)5SdqMIs!bG4o~OK6Hv763(MCUs{&vq@roqnw;2Yu81OFpLuc zQ1@84c+yxUvQrqbr9h8LELlyHE{x}htEl8^;nvse(=;D5KAe}Ns$Nch)Y=yr%#YUD zCrM=4uib6_LGEfrpv@;exVu(jTMPLp@8-?6%qsxQ$>P)(8k4P^1$T!=pdW2DgGW%& zZuN2Q^J>hGInls>RY%Co9ZS_1txCZIOoJC*o9CR(YAGg#RUGuWju|%Z;=v-5r zjNAxQ(YROM!M%59=ldCoT%^^tP5+rv58A+1gl*%5@(@W+g{QQeN6(TFU8M|Kv85d{ z{)IK!s-mkAg(XkDNYu;Eu?;o?<%kX(Jsy;)UzPX|-Rl}wkJ|t{*_R-}dDDrD5S@QFA z6zsG}eEbHi#6?7ZmJxrQ`sbARS4MwNTr^=! zJim;{UKxto8PKbX{}kp_JioKY&gHYCg4@n4X1jLqz*l`w>0P?;u2PBudgDwKYQgdy zOzjK40W{s;%vK1|Gp3mV4jQ>9Gp^M+Ons!3m1(iroVZL6EZ5^hpgv$EQ~vZq0!ydKhF2MlLsM?95}*;S0+RIWct6*@TFDkJRPV4+|J+M^ZinO*lM4#UIBD)A*Hw z_E@8ahB(r3G$2tQ6J0x}h1a6^lLJdB zMNou?Qx!Xp>-2~3<$G;foX_f8l(0o5!QZ_$1z^g6vD!zt|CB#LB-}PnZMuMj^hX)k zBRb81HUr08p%N3{rBF-Ub4Kl9tPF+3+Qnu)&)(Aza2r!?F(QSVX`px>!KE&cWxQxg zxYoA*;Xwa2T2E6C$S4=_^5a=@b_-yPF#IqgWms2omWu}uSs&wUgW3a)wBi0G4isQv zf){PxrvSA)zRk!j}G1z$=zV&YH~|PXa*SsdvL4&fN?C!O zheTsdj?^@3_kBmlq7^u`!0c2H@OZd476?r}iR>E-$6mCIy7Fh=5Mj-2S^+g=}rzLfC-u&Z5HmJ?BniO<0#4qW9k2naM>ploJxD8QS!30~L**o6E;Vp??mqJmN?{ z38L;lc>(oS`^pvPN7XT$>!FeAF|6KU!lZD)0K(TZWb{RLYtf!-|NaSZhs}4_0a%zB zH$mYc*>PYlbKQ^A5KH{&NT0&TJZu>tx_HU^pr#n11`c%`qpROGktiI!JBPK8$Pf>y zF|9b)s3yAlUUma5X|he2>6HAQ5Glu6zapVlQimnzjt%vzsLL$^-zh?=Xe__dbqygYwq6R%0*Hpss8q9_%qR{SlZn@ zo-XHijP0kh6xAW+d3IVI%=s85!i`)dfPl&6=vTL)+Wb8|jT9E- zU{b2_v)4cS4!Am7Pw{@U>bPM+E4hN)9ohFTz@r43!hDF2J{kUzyj!o{NA3CZgja@e zkb-tKgv+Ooc^;Vih3i?-u06fpF`jNtjD$mvS%;ZU4_CXmDkM~SLWCa{$Q(jT0HSR= zt51}5_;c`~_$%r~`D0GR0C8WBdRKAPMSm*R)Y|@mPQ-sChlAFTkeDk#zSA%1XXE8H zL!r_ix{_PoMBrE&1!kd8MT#8+`R+jJ`5bW^*;3d(mBIbGe7O69Gsja(=*)YfiQL5t zHvm5Fa>K+)h@^-Bl>*XjThKp*=xaU+QJ_(o+}~sn^}iwP{Jem-eVo2gaE^(=7YZpC zJTAD)xeuFBJC|4GqnF*129~B6E~!d zjCzD%O+Iv%E=D%{G-LXk*|UGkS#Qvm!52KpvP+Oy-xLAmyBC~934ID zzPQDQM7;7p_#$*m7fw0^{GjzG-g!7~fQS45Wkza-{U4P|pl|)3r|rM_FFWghm#K`L z3HD`FfG$kSm<_i3k8c=4QAC%9{czhdYXrOatB85G!5NHrE7c2ei?~c)#CDDJ#QkXb4 zmf_Sv{a`-Yl-b#1_h&IE!sv7Gyn7~tVN&}f^DQDl;8UBo?hV_8$z^hLysL>gS=I)1mv%q_ zX#QnNra(<1n?UXeB4Lc`a!ApOe$;7LPBGqbky$^QhTj^->XFzm2y5+@S((;+f)Tf4 z5s_1r(Pq-p3%*+OZEPUCwSb?S^4)#c;N<+{ggohM>kj4Yb|eR>oZRfup^A#TU$RC zSk<3$TZ#p~!=_{ejj`p$aYrg!Bi|XNB^RNCj0Q38;_cZSNIr09Ob%PuHQO+&)y`D4 zXs@FOM{T4X-4Ibx%{XZLA)wO?S@2&EZvs2k#};zb$?jOy(%{=|wPZawOQwt@a#^_8Y0!-vy)DPjzAJYfOCSeOmO zCf`at8~d7W1wv-qXDH^Ni9$wdcCfJaQ*!>juvHzXtu3!Q+$NOkD0m&Cn9ynCkf~M+ ziwog4f;S@<*hkYm!^tkw}q z))7p5LoEN~tbXk`)=LX|wX8p2`iCPlfemm#Y}#E+mI~Ba?D!~Fv*pU{jxcHr z)CkZ)M*}ZeoE?B1*4aqHs;cs{P zyxrWks~sz6gy@>OFQHfb<6K-`^mKJ2>|MM%Z6^KXgn9?JXOe1rWP6geJWIX?Y1T|^ z@5@N}xj|2)dC$x3#9t!u2g2n{aBMC~b>Rlr&qZt#KY8<36~kDVbr^cqkzO zd*-qrPrgGEQ66fM90hCi_Odk7$6ZD!?z8~8QqJ}d5{9SqsNkfzdqgDgiqc0cv zl;eIA#Hoxvr$xPnit`rthMmW)yUPO4-Q&h5^0y)6&%3}T({DdvqgInQsw*koqA2=r z|4GCoJ*D2+S*Zq)34!&%Zv*F=!2wzgpTQpd(Oc)MOG5;haXT)V zcDnm=@GIGTyrFBXv4s_&3*_Aj-s$kN-z68Wi4o^v3oGJ)m0uD2$L#-%f7Q0p2%b)V z@S}0Bb;WJ=l;XfV24ks-(8Sw0wLZkJAMKRUt#&f{#VrDVlM03R6@4d05dAshP1r}4 zzBNEt$!E-B3Cmk~xx5};l{6p_k7tvy&@9KWy^Oj6l6GAb9v28 zKo;ri;tL!G@PzSi-}-7tUTfx?N(csktpgY1_!Tnk#@9*^qHl=nqK;|j1Q2!|*c*92&Reh-dd8dG;W&^+~u!b4_G-xb*dXP!hnBU+miQ;@jVgB^4N%1!?S1AoNf-^tL*m4ey!L`h4YikFLF&~q+hTvTg6^U`jmAQ-DM7Bs zIbQb69dFokC(Z6AcL5mQM^|W;M{=k-2az60^dER4+m873uUlpz4}!)$A__&8*kSJ=9>=&zk@)~DfV z<=N=tOXHQY9&38EX?hW%8xz>*$$HhGEf=&-gV=bC z$#gd>fAN#EzZ?xIK*ep^TttwzjGcpgcMhYF6%z z++e6vIdr($X}ZG3{mJFiwEAV6^L2X(UeDeYqZxP1mBXaQeo;?&PS%gab0h|~?#sMi z+)<-p;G+uk@r%Y?R#5|EO#6wON$cAD4I>a>5|0uH83RcV&e&~c&bm2>AvH8VNzs0z z`%8-K{_s2m%6PL_s7zo@wK0I!VK>T>Ts4`h7(=LtXQ46TfX>Z$3@%i0J|7{1YAWh$ zl=T7mgQav_mxdS)$U8kEXi|Yp>@bUh&y=$C&$trhTk5)ggGAEgh)2#i^-5V2&U8JX z%tYs(`-I691g{X8Q{FpSL+uXan{=Wc3Y9IXSrvr4L{}oqLjRivk{r#?+RUVc#tTlL zh)AtKKg2FD50_U+jc!32p3b=#2PqK(_Jd{|nQ3Vkd>g0Jp%{O>)cMX2NH%Lt$R3mL1qy{0nZ>FuRkUsLz&?DeKrBLDfzz5qMC}#Uv4MRq=&8 z)qmc7Z5K<*-Oq7xo)S6cAk*UkbTEwDN0_Xo-4mI0y6{!b(R?)a+dvYM7JLfV#|{5L z2{QqEdE}P5hNgpopm`EDz>k?WjTt38jVIe2+zQkB!}C%IQ^R!R;Ddv^193M2rj*VGL4pu0u-Hu(MmkvvcWYQc{mP@`8;2kJA$qA zL`|~zXkhM^{JGHMNReJm)$AkmT6vv0ZD%axrwN_nKG?y<_MJ~`hE0&;DNkMlC_Iv> zJGTe{|M8VbM$=Y4sHWdj1zos$H34OB>Cy!b*iMarm>Ntiq-{AWcWefj(sXKZFZkn+ z#_H8phj)0yeC}3m&ra9djecgUl$hZj0xLjf0Xx44s7uzk!8*}b`WmgSqoczB1Fr18 zca4rHLBp&ks<&Ha^#9o#26*o~g^E9$cz;P;hDxplT%A`F%_j*&Myj$YuMJnuk1ih4 zs2L+OawK6}kHUH#A~6AMob0v?8n37ce2qhyW1~U-B#nNd7|0CgwCl=Vr|c_Un^H&^ z;{r#=d+5&Vq0s2@{fnq3oCv03Xbt19c`SHY3j-vbL zoL0L+=$>)dwmv-Jwe{jpKlcE6rckZ+s@KZLnmeE#dPI(*!w><=$Q+KC9fC-BlP`Kh z3dY|cmdjr9xH2I0bqBj3*Xmem5yIFfN-BHWYwgqm>b7!O?*2h4m)jh(wtzqTXAoq( zSJ1dK&01Se&9LqTr3!9ze_k`itks9d4G;ttPrGS?zf$NYw7uVKJhcXxwTDE2&0`qZ zC{=OmK33tO((?e}w;2`Q|QbHRZb??MbYb1s>vKvuVfMCxpl0d>RT z<_E35Hmy5oRi*{HYf}?xB-+?k`w&#u%A?-ddhtw4tP`AYw(1aXYgG(Or~(Zsi?G&< z^8p7<6m-pYS5>9#>Mequ6i$H15C9tiZbu!>>u!|wip0bPj&S&UuAF=NEF^2g6^OkNLdj3 zc~Ex97lsge=bCns0xE$`(>K82j#jp>Eo2>8)`k|nCBn)auO4mvxGkFeH55sS@P%wW zhecZmw!?vhg4n`}j!o3tNp;Ueprc#DUQp;8`|g z#wCFJ8G{{HO+gT`LM)|vR89U~%heLmhWS20${6abPo=BA4CL3QM!7fgw2PG2c$sfk zuwS;wG6q|PXa=GQUL10Fs59ovM~|1tA*j9|SP6395)52-DLjAmOcdFrGXZ69gJC^-EU7BE2=95 z!zo}qsV-eFVdd2fNl;mfkV;N$(IS?q`cUqZ$TD7)Rn7987mo&!f)5yXJOlm`eG~5u-6}nG0>V z;R9bFr*RSd^KHC}YA-2DE))#b!*o9XYQj;1%x^m(bZ{u$is9?P*t8NXz0)wbmj6Av>HpSzi^YP%y>2tw8M609S0iVB$#pc+4t(C9_nH zb8hrjbLE$9u;)&M-A%;y`m6r@h(ocN;$N`YNjZC`YH|UWl#^{TZ=WEXkNkk?h3M{Z z%4goPe^VRIBnG;Sr~vg}e9$2Myg1x2rgt1bF1$(}jxMFz@O$jMN?YEq^D6UmvGy?= z)5LhHb}wff}&kU3u|w?AVZoC{hhy}yj41^Xi;$FB}}waEA@>UoRx* zXVT&A3k1U7iCuyd$W)Fh_Z$GBtO~TKZHhH>M=oMK++tk;O3MPp24NKhguBQHDSqb0(6ey_8@R?*|}q z+~#vFL0D8O4D+=fu4!wI5)U|tLW5hUu%Q4n@|PQ_l#4qG=>|AD^_q}|fq#Zm$H=9UC(# z-CjLNZoDJUVW)Zh6=w1^bh;dy(eGB5l^CyoZD-X$~;E{@~O$ zKZUEFz9r)OhO#{qxSQJ_$!59P>pYuB8R`%So~a8i1j;*nyUOf{n+MUQL|?@XG6L}7 z6M$nT261npC`ZfVMqP)tr=zz_(c9hEk#k-D^3`HGeT=mu7WUx~25!91t!vKBZTam} zM#)EI33NO|-cl3SwO7U3%I<3hb<*D2fu5AvUp4Ob`Bv%y&Q*m;mVTR;uGuce>MQ%A zlEs!zyQw@@oJS$Yifcvbx*qD4*SoN>HUP$hXX97mOAXh+w)dhM#B#w_{OpHB2@YPG+8^#~B-lsGUL2SB8Xu$8> zC|m`|zgob;S$WYarHW>#KS}HF!TIpHBM@rV@!D_O-ru*hsy$o$b&RCihUe~wI!p?f zjW^{3V{czmPbROVL<*mnlZjsW!M!&!l+ol0ek830#eU6u3rL4?)}?-xEMuCNmin&3 z86_QRaOEIn_u?IDT6ao7`=%hVUI3f#b$%ME&wh$6b#fk_&HKy1b-WiUb=-8R@9Dxm3cMaqw#btJQ1UyXEE zAB`Jf`l_E9xKJnj+~DUQZ!WYr(3u&~cKr9O+vU<7tarQNuLdwMMu_)^Oy*i1iua#U z;tcfv-f(gJ54(IuCQjCby1aixX-&lgHZ-3TRioV@;7he=#{yXz8trwbaUqvt<_>AG zx+IY(+M;?mlCKBeW)gCjNPU;)3Aoev0>`)M5=S&X>1Zx??M0#Pg{Kc4OD0?RP8Gl| zrx}BVO#iZ~Wj;cSeAHK-Y7xWj%1i*VDv$a6#XAd_#i`w_^wNpz8S#B=Rz88Id=jp(ke$h7 z-DPHibKZTo49e-9ZjnuyQaOS%YBDlnU#)BTXUZLslbD6W?pq5mRsHHgd}=_sbf2-| z2>KeZIPa*v^Q<+qGOvs2J&r=pZUG-QGm;Ssi){eO0S;3+L80*Rl6EXIBPle9+A1zo z0=+t+MAs(4l8uV(*tU2~hs&ySKwjQ-oHNHMdq~Qi|>nepZXQbN{tNM>Kp4}eYOF4g<~8X%Fe{USt8 zq>a?;{QKaNQe~2X>%5mOotGdrKd9FgKM@cBYh%%?b<6QG?+S69 zdub%klFe<08zoHWK8LOYud5n!6rpgLlPCTg_f;50(om}~z36T-(BvKVz)A|Nri;GB zSP$k;lrs-UY-j#oHbMPZyasDzS!>ie=~`B~BEAYh);`Vp;#`^vZrkU9Mh=BG$bnSt zA+-K4nM6c)E@o}QwL!)>p^R^EpqoC!We(-| zw{;CUFzrK30M27gyJ?_ArZ=4gN6oON!vidZFRNjr%$}zj_gYVf5LAQLx2?6Rdv_aL% z<(7(tj`H)aOO`jM_cu?(ZFU?U;Tq=sZ(l^fjh--;7+((cR|k%A4QS|U@P#L7Zrt-a zuH4nYOJLS{`ukUNJ!a3L&`Hg9`VF;G@PTsI5m(0mgJtJ6c%oqzvXlMOiCfDf-EIdp z3pcFHC_&*f9^w4Mk&;$nSzadZh4vL)-Ox3*)homO0Ip`&BG(Bh3U6kCs((e8d+Cm{J&i(?Bd zQ;7hdVE~Cee$L5q_=1m)lOx;ova@9KNo_(1eXcsy!~`RjDdF@I0-Yit+t(5NYp02) zO_Q`o}*uvs+RL4)OFf+i|(^xorWeNII`o8dX=I7`etBtdET;321} zjb>?SvjwquB*fllkb1fas5N=K5$j7Bhb2H`yYbrarX%ZCb7UK-)9a);n|=3qw4{Im z+MfZKGAdSH8$w0ZB(>~=U zSAtq-h)BR=+qbokt4iNl{7F&oi+leiL2lfxEk*yWN{V|hr2vOzkusRjpZUrP9qJk~xx5-?9BB`klfCXp|>`rYGUIE$hB!Qs)q6zn=4BFd+oHd zD$bqmf=#sgn)(_^{O(5DuYG{MGPDmGq;Zo*%;*7t6wWvLb0{I+`9=D(WcX*?kN3*` zU)7z}*h?Z4;pmtrg0>&5a06=>OzFif4@ z%+QkCZKSe3yB$6BYq*d;*S+9Mt<$s_-O~Y09z+-;GQ=33N7W$BG01=`(BjmYnh28( zFVn_uC+P|_7{N^*$8bI*5MXYkiJPyXd~fwiccrX`qLIo2oBKMxXpUxg%01E}R1X_% zz(%d6yKdI|ED|x=6Q&-9s#iPt8QF$EQgf<<~?XvLe9uosUW61W~^6s_JY<^I*YY(<*w) z+>HqKXTHC5QQzv2dFGirX68|lRE6}|9q(M^OuHf568R#L4iFGcej z-$bKtCsT8%Am4fhZpEI}+W-sIvL9w`xn+LUG{k+ZSb2^=kTu5AMFhtR@7cudl>NGY7Q&Y z#L7nZ`;$e}1T;raOfpdh@a%g(Z`|2wytXeO528n5G8!`@|E=6r2D{@~zws|40i6LA z`VJ@`Y*@zY0p64+Fb^S={U^h14y5=;YWLZ zp5E?Ao#DmHiD3`g^4BCPPQ9&!;vIuPW!eT;2=w6~Ra&p|NbK)N^czN4 zA`heDrQXaF($%sYpb)Te!wvp{<{$dvL@RlkVnx$j8zl|9)yhI48c2AHWghK@4BH=S zPmQ+?Q=Wba*|`WORTqOrI}j@@9OdIR;fDqJm!pp`;9z06_H9 ztqm3_2i?(gusAAi;ZQHhO+i%Q@ zZQDu3wyg>(wr$+3z0SQK?%97}ej0tu*86C^J@<+y!<*NnAgUPlv-I_I;%K$dGy=(j zYFvsn`Q?EoWhbw14;!2)S@Pz24yKoOM4OW{lP+e{el1>e8*%YusA;nQFt#O3A1PF+ zGFrvisa`=UM7vNa+Ai(QI8~NWfUm93TELiXY@-2=e@!M`_3;1Y+C5$9hpjk;91KtI z?Ge~Ui;pEKji96v!-60uxsNaaHthF**hsS)m?zOFlCfr^t#Sq(!{C-2Cm^BsOX%Qq zN=&QBr-#FlDi7N-T3yu1wxAnFVvVc^*;u(;EEA)L%a?G=H8PAEk#*8^r zK8tIX@l)vCW-ISS02e%pq_yI_0=@~uF8(2h_{4Kh=FA5f$8rbBOlWPuc8@J#?X|M< z6_~_J``7Esu_N;bqTL}G)|lL3-Ip`yd0KBIvT}0ezZC$vv0bqJ!jI6ZfMN}drA>%m(Bi(Tum|;= zt|Y~b5L6VdbI1;6tskF&(?y78GK$W(t1Q9O7Ea6fW&KC_X-{WpH2fZ>(?Z<9Le3$o z{@*GI&XF}FyMgykc;|$fwM@Hmun`i}Qb8QkFpy91OYppHBcMwIe3W3O(0DCW8cLNa z;amfZO`9Utp*@)ok}`x*)B|U$)0aq6*;5er^Mx33iT%V%7Jw>%JmnWXAh%ciU>#*Y zfMi5zVy5BC!Lc1nFkQz`IIyEP_Sj>vAn^9}*6Q)FX~JFKpx0Mj^rfK(_H#8}dAiIo zVuYzw5uaHq=6uc5SnoSuv!F$-g*iO&<*RD+4Wzzuq0I0v%f274cE(&4G%_kG4fM?l z5S9X&8e4pU!8<2F{v!bHUAm9T`?11`&yromG3TMA4m!)+T#%c3p$zg&7f&qyR0DUR zks3-Z9^&#lWs)(SCQz=vwB9D6RV{QIV!77Fz8D9N216U(c8=S$%dSp8W(c8FnIb^Q z$@3hfaJTa7#_2U5HAGmLrGm91(#itWKPgCM)K8j(w-OVudzazN;aqtLtW-LcB4%Ig z7Q7G>zU*FKcIMdX7Ob{HUM4E3PVsqys>eNU*Pzbc-481$TjrEVkmZWErcJs3B za|$Fx35=^{%HxAESuHZ@pi#56fmcoy->hKmsTbN08}$nEuo^Tu+uyQj?dXZ~(&%zd zfB#nDG$;xHGfSK@JzLYf^JG=z`i1L^RltU!PDKTqb2z+!WsvVeF5O+j1>3xiDA%ZE zB?FPeqlIb3TjLS{E0v7RKeJP{&G;Ly-~`KvPQ_kVz)Gf%M>7donrH(ln~A^-G1C3} z;G*U?BZOpYv&UOJ(Tyyu^cwO>fz1i8&fT{}qfsK@SPipfko>Yne|^M%YP8T~KI7I+ zjt>jzTzJ(($es4LBskTddv4qdasNZd}R5Eg9?~3j(Mi7UV7c&{| zZUrlKn;6(n5A^yZkG2R@EPrZ72#J4X^$?l^dcI}cAbwL)e6p<#T7y8R-EZqF*ev48 zM~#uz?G;O5?cI$-Cue+`b}ucOti88vpVGwPXdOY8Q%j(^$opC$+aMUHsOLc z0QBWfSna#8K>KNlUY9jdZi*;K{%!acmG_C{^@|hEToZ4Aw~7jia+0sXD69J9`Q{)! z<@ly@erLQ^LxRVUdW>6|x8zUXl=E%`MHm@x182h4NY%(o)%XT+J*&k1&t;3o`hWW^ zIXIKzw`l<~DjST5J@+)eG;@C&a>DV}Vdk7I7r@O2BAKy_X!840c^hHjdV3PdUK1cC zVM;QrToT-C{4AgETcu*ndHyBo8-~tUa$e{(g`&NzFy7!XU}`n}?f83nb-e}(sQ1Z2 zy~m^%OsM}5taKi8ZdXAlMnsyTlq!w~hE^UURHFbqclx9?F{Ik8<(~frrxChXeZBA+ zShN=0b`jSn1SOtYsWY3n=;U#f>BitL5U>_N9YK;(2~w*zp^CU~84vKeKbS|TsTLMd zm&(zoK*^BoCOTk=-7fAa4T}l^1|PozcAoS6fbI+#LBj@$eJtfIT6UHKE;<=i-xY_* zj*!Rh3gI`Ae+ley|9xQThnErR%k|Dj(*L@bq1iHNm(mAgCRF8If(4+1SN z(MN9pQ)~{G=7S}K;&loryck6E@#@A0{@rC|empgi*-P{l)xkluXgSBb2L-(UDgG4j zf&EX&x1Pug-Rm(o)!o^rW1!#S8+p-Lm}OyCJB2#aCsUVzs&qsn#arsAy~uo*L_J^t zdM@4^mARA)ww&Gte+0Inq(UPT8N>P0oj-$<;lM1i_4}f0`C>E5tph!(u9ix*4FC4} zE~Ol+*s5QUZ%wRIrC!xAjBUXBY%?E#Xu%*=yBwr3d3`Cd(bdn~%e8|oJySl5z+cpD zgl)fu3%h!}10woc@iR+U8V9Z~Dl%)Eo9x6$|9kyyL!~~DShv_0gpG)_js}gJjGq)b zO6_TX{MDD+J}&T7^YOh%ck{_avclb}r<45cO3D(do9Axm`&SPEckow$$e;_7x4uH| z&e5D} zrpTsB=B;78Ni&F7$XGbQFSOY(+EA89-h91+K~nN!vB$4UFHa#>9HZ6&Oq~-y4?C$H zXawo5tCz-)*i8Gz2BU7Uf;$S4SWCx7}M`4+P9}P2pY7P-`uX!%Gp|QALr;)%f*pZ)yOF}-70?IW zA$WIk^hk|V&=mhV-Tr`+C9hN4Fn`BS+M2^JH7%^qXrkgg9kph(hs zEGKp@RkXmZP?gn6@hJaSuXj5hqsshzY9DlIKXJOE4YrA#_?b)r1H;04;@;@z64<|` z>Mvq@UDIDZbuKKtQ`bXObZ%BvAi5MVMb9sEq*h!rRUu!DDn-N;SjG98Kq9Nyz)Ik0 zJFA!J^=k;Y(Ot7b`b+nASQB#`0Nra^=uD6x5wuW&_9EA2(AnT_v;cC_6p05=fD4)m zE}5I?A@>YB)M&na?sF{@mcfA>nAcydqYg3oD|F+wcx9|3QZIeYb^7QL4nxL`J%SU9 zyA{tJQApTm1W{URIgG+5h5FJCn^_p5%SXGVnLIU~+2@T)JuIN61Is)@9ry*~S2}8g z$GO)@R)KG~FNQPR<}U&v^VWsnG^r6r62qx^?b>Wl))!OHgE<1XW} z{_{^b)_7S7G2Vx0Idt_V%sH4leVCh5$u#;+7o@y4A?Ymn@|cqF5f7a9XB;+%3gcnZ z!Q=6A5MwcEJ_Q52FDl5;Ru)721Y2lFv(`pdW&a5E@MG#h@B4v*-rR=Q1WZ7<{ciB- z(pim`-@+wGiFg%a@CZEjPz>A(U~}&Nw&ob{YjcbdZzIZA5%kwSmWIcpmUI+XSZ6T> z>7-<>dx&r>uK(Y@bhOxGZ9-VG8B4;r^tyW<7ilT!z5lJrv-`w;6`h`^MDl+0f^wk}RTyQ&L zrcPV0(~hSL_UMo5)e4d+YRL_188%X6)@;~Ps)~R;h3cCLPRaVi09A%Q)3K!9@3E$U zCrQiLYaAgv?@?ZU3buAzTNSoZnYdz}&%qlONQ zXbh~|YsS-FeJnJ|Y`AnyCq5vEhlD2JAw(fSYtit@swR$5$>Q;}p~)3=6m$1C{1mB? zhBV~~Omr{$K>;gFma`lezOfJa=LkNYR=!%{cddT^PM|RlTkyCJ%j(ZTCJEk&)3{QP zJ@2A$k|`AE%P4w*#sW_Md;BpN|2KKW#Pm}PR7sF4umI?h)LRXg!W_pFQ)kM9WOGcD zNtEUhW7Br2pBk87SB-U)q_E0xZs1>ef2!H89V#<(VD|7OVHBCo!k%2ZN!ayjiHvWM z{k_3I{%UwZ-1<#IqtS^rXoc!B@noY8U{210y-z%J?)va{p^_j?nJxTnqKj&k5pyu$ z>)s561DLpG@*(_HTe|q=$lRvm&qQltt7Cow&K%*8YIC`oVA2r_kyWr+Z9@3ka`21r z0Ciw%E~FTY!gw&;_I6PcRQ%sa8Ain-2A+k$N_~ zq&)a0Fn$pN+i^(5lDiSvA6<(b!>1QmXfNX%TmUp2PJP#=q4*wU(qf*Hx;u%wG*vFU zO=be-1v(?%=|u_xWWG{vS46G9HuP&58HT-n6vAfET61H)TJ=J-~tqlXsq~|$Jm7f$^dg|(tGt;p`gj;nksIy9)CH|&e(jy#)PC3tm zK_+bE26OxNe8xk82Tr}icGw2bx94421Gtyck7fmjk+8qt+UxwpZ|BN>N@&Sp}O^kJwI=s>G9gUc%n_PwgyMo(N2?O~XhQ5xEE$})1-f&i){jq8@93$!mOajXpc(zfPWB;@yF4St zMp>~YAq}^ew)|MLyrVo-?0=H!9%rYTx?nD{n|Sj6BjrBd}%T3Q;}>igEGX6Z_~|MkJ_0MQ_NAI`DbFd zsmXifThNw5sqI`dJ@Ea}`JP^(EkXM07kK45roZ7db0*#Obtq8BGQjhkXX@}4?>5x< z`_RyriYMmOHUg+WmQHTl3bqIs5a#gACH~FjuOF*2-k^D{MOVXEE+KHqFqdGXf;|O{ z>6iSbM1wosH*eGy8~G9H@7{FmHR8U1I=5Q|hf^*!5p`E{F)B)_DDDCh^d#P+339ib zK4DIj9Ca)E&j>ofIs}rc3bS_@?J|Nh;;4LA!1LWyk%G4HXF>5Dm5Z|w5RuC}-mfGj z&QMqwpIgUJ#FyiVh4-i+DDlc>0jP|@1>!^78BQVO+4jvA{j)&d4}Kc=LdEpBN2En z@k1}W?lTK^>Jb(Xo`=3Ts+)AuMQN8bZL{lWp>g6VZ@}$Fknqq1t%*ANALW6;#Q1-A zrktGY|J5Nn4q1$-{?~Ooc2ek)gcyd)vA6lf?+xzR+TI;aDRkbvlaC^5Qu=s1b%>Rq8=qI#VuZVtzJ zzYC1kMJDr3%AsKA!gc~^j_$zi8Xj7RUnq21!6Zx&#eOknf-5`06slIzG9jVVQvH}% z7B~}1dvx^REtxNLjlkJLa>L?lfU6{0bTf%SXtF8)YMCP@rvfKqf+_IBe@Dxyu{8t7SMC_MR)!cxpNy?|>LO;=f@S+ycSU-6~X_$0XLUV#Qu$ zn_x=oWKjz2Fo6svvdi3no4&$F9sUlO2(EI_wU}0Z%4Nx9yn2Tg)e|F zx4PKL#P} z=LnH4OFyYPEDe;>IESYcM*Kkut_MI_-dCNA)k}?i^NXMlI#B~z7j_MsW(91C7=9jk z`SlFqk2Yu|FzMYct`fA0GCSKZrs~WUx-wNQzOg2-NhQoI=^7>A*4pb za$%J}8mte^|LTwpy)2FG;gQ$tkQDg(r~mo9h|eS3LC1ExN6oTxjNA2ECSL&lX+U_- z?CB)1nQ(hr9Xba}E`nr#T~TsVBS6seFXpzD$jC{N9F2C^bqPthlih+Xuo_#>C?~4E z>2#XlWWCICDXC=nFbqV-o=cRKaow1cp@;zK$d)=}fkWKS^pj ze#qV*e105Y03Jvb|NHEimNo(mhr#r}AS>88Ie!Y21F#1sDO@IHOO1eXCW7-PyjGZq zsY(o)Br77;pqI0yi4=~CP>}_X;{wX- z`jPR~TowavV9R{0P!S^fbxso|Wxxw{@ek=6I*hzTiz~L45(N`_DhX~rS)!f+0fu>z zuHCcmNV3*S2JKQ~irJM>6}7D`+p{&)IVh= z6ZbRT`RR8ZHx-2$r9A&Am$YcZtNl4M7vi(kKq4v?1Lhgf?94JSh=4#Q9_yg~8DALe zXE^j=#Z6lPSRc(>_D*WerqKk{bwxa6H5zPHBwDIobPjLLWnRgL_s0ixH>=Yv3B>M; zWAZ-gq6%c=3p!!`GO7)qu}pi|0tm!4QA~tk=GXQ(i9Bh*lOx!PeBjSn!&5P)v$^du zoI@%?P+45yh_@LU)N1DYjK+bx2!SY}`=7wkuYwL67jZpXWL~)owbV`2dn1I%xP@jC zI#xQRK0_w<+tO%%Yb}D zwh38loJ&U%_k)hXsH1zK?THwfvUTvq(i_st5OJ>;?|@A$Z()vSp$1nuE0wD`$gB}Z z?*_Me-QJ*P9dktq-6_Pi0eP%G)9kEvLj;E9%@K_of}-;#J2djt2x0=VD%hc77Q0L9 zDJ-v2mRpcd39k5M>mSQ+tJJM$&IZ~!S>hIve&Jt&N(*(6l)1jL* zW%beVf?IKhl)@lb!k!33@(@IUutd7ChzeT>4wS;YSi)n0BMq*x08i#**UAgxLmb?` zZ2ssO{9`PJ0b(n9L?{j#I+soq zVD7UMsCZn+zIv+3BlwQwB)fEq^l=EY$4Gnl%A)zpKuo^70Ig+w) zu~r@tUhdg#%FEHe^r!Orf1hqV?tFK6yw13!$*kMT-wc@GG+GnXxFa60G9xcpRHb6= zKj$5g=IP@8E1Q`A7um%A!x#AJSOJF`N=ccFi2lzSH!F+OAW?m;r3jbF;VY*PwQo!A zxI>=iv83_=XSe5B=^>y|(0tuiW&H7So4#xR9FlCernyA`2bQ&0a^xm zoT>KQx$HVt+xGZ{u7N6Gl(3zk8;uU$d17_jpG@!NSnGYPuCw%(qj8o}g#g{ps*9ty z)C!+cl811<0W zd#_6?wTctOq46NZ4{S9dHaf!jy}HMP#Sh z*m)@wMLJv+AdJWnH~jBbv)sq)2Au#sa#?;~iZa}kf1EwOJffTibCnFhH0;UO=Zt>% z(T#yu%gy*tq+N;m8|p?*&okX)&j22mu8+UqcLqi0uw%RaDTak=6pB*v64rov=I?vX zN;`E9P2wIvNYXco3}C1$8AvVYo|dvyF7oK&`rvh)>1*}2E`fwZ#v^CqlC5p3&c?Y| z#jHU4W>Gb@0FqFcpagek2cIw>Ijs=`Zm2Bo4C6N6)BB55F%^;z-_6yNOO2WwIx*SU z>N%BhB7j<0vIMi=5aaO5rCg(Go4&?-_7(kTUu1jvrENFk1LxC9tJXfwZltLqZYp68 zPfNGy-e~3Zm(OtC*8e%Y|BIyH_{pgI&*5Fx&{No8MD;t?5Pb+OJnFPVE|puyl-xj+ z)LDbcr)0gVcf6RAGL&5hmPNNvfvUzi9m3e#Z6g^!q; zi^igPCosYDPQnqJBw}OuJo#_qdKK{{;TeND>8C^|y}N%~-_1M1F1l4)l44-oPyixI z=Oc1%H0mESlvf5pjJF zMYU^)A4t=dL?w-&n&aZs@Mwu@fw$E45eg6uR*yRp z{!3%H0=MEWjbG`agW<5a(@)Zm7O1YGMxSa_n+LVQo_BiE+35S{mw7ADH4q(PKg2(K zs*ybT88Q~5!skD1eQ(gGg7#=ZZam6Yx-S|E#hnlqRPjD+v1MG9&|iy4pCwrrz}W*C zwUuXdA8%gpskmR?5PU^UI?8}+hns3NfKNzD4KZksnB=ZjIbE9+=#YwPNn=eiM}EAB zIuPPuV%?u3r!e&$FzR;h}W4$kK$pK-C4jl-4ScJqPCs z*hB5y0}=ymM4!Y(&>WEWH>pLBwJbNd&};P6#Fz8=V+Mj5`Qd}C7E{0(&h75ndy#u2 z&&`Xvb!(EDmVyan%7vW0wK5d7Y3&tMcS@3#7|v6**%2aeQwWx3o{dA`1v%;C)iD7T z*Pxa=@kPtfSyN$?{(#IX!JeKRV1XGVB87&fK29VUhcjWa*NktrRak&E{U<-SNAuu) z)A`u4@gB!vrjGJQcK@K1fDtj6{}-{s`r~2#Pk{`p>HViG_M5G{NlYsS86^l1x|CT! zq|)0^4ZSd{A?`?@R+iwV$Y8Ay@CO$OOf8ih|3hK0@tp1BdnNXJaK=#@%dy~?6CKi| z4|fa^6rKc;1tEmyrWwG@XlGpXm4rIZKEwXWV_IbYB4Yc{qFE$b$D0@jaDB;|jM1d< z0HkY6Y4q3g^W$xXV*ml8kesZUkwvMM;47#T*P69?jWF`C)yS4gF+Mo@FYDZDlIku3 zdUR6EZZ&IgdJJ4cIx}zIs~tMcpDmLQ905W)?=n|1|gj-wzOfh zCg~79_i%>O&K{!(T+Yo(l8%@^E3V_y0?Z2tHhg1HS*F<5U2*HE znRu%hv5w&c{wf=zxKAQCNO5_~WT;W)zWd0ws05ylXn@h%Th9B&j|t1YT%Cp;6}0Nd zxHMOZ!B2ChyAM>WJ%|ZMMaGl{;V>aW8NfkU*HVX_k*bl%2`{Hs?(D_r zn1KZOEAank0Zq#v0R{v4d6%ryK})JHpay8^`~ZLdvj}uxmxRpIki;tQ;ps?awq{lE zXAR3-I$X(?OsT=lWX*1{&R~2Y;W}();7)N8Bj-M6(ql%6Q?EBYd$u}|jl<&J#HW4> zKJ{tG(<*DlnN9OOc%y)YnRZeicGZWM*?e;N#?_A=Ln^r>#F)K9=bMkq1AJvk7a*sR zipY$I$&S%pUjo~{+7O;sw!+)zJZP)5#nd`=ID ze}QHT1u4_Ouxu+Hb_wf*81r(d#DC9pk4(Hp8;rmx%@AK84+NN+4@G zECTwb>D5u97?M2iol}g|@J^3DN#Nio8!8RAxdOKXm-FcC#j}>!kn3p5xj1)x=tb;1 z#N$9%lWgfGo>o2I+?4i0jK!bgjw@mIU^*47J_@~>-UL3hCqCGDztS!cD#B|C>;?eo2#nZHwOpu`k^gp zZXJUqkI%__k>!``*5pb+Hj!h4EPkqQ_hpIV5y>D#eGY)|zC8Xhkh# z`|b5hcuA3X9Udri9pn2|OTNY?jr}Fp?0$k;cZxs~6M}cNr!SkVixlf z-&LZJ@q`e`qwKi>bytGKu%x(XNLQC-$=(--3buxm!Eq|Rn%3SK(1?U&^R1LRo&VA@exFd>K zky9v?2spmCUonG{1l4ZS z3=hdxj`*-^0C))ag&2Vk4Kmlb@%9%ka9SWha6z*B@#*h7bnPK=Ie4?KEGLV9=PW;nQCYHJ0nc8c2VBdZ`&XdJLe$L`zA*G zRo}ooMNA0I7R%G&r;Aso^yF(NhlZtsietiPWVs;9TYwXY<5v_uQ(haIqq66x;=Ynr z(2={%FF~P!e}I!fEo(_XKMP#~-#^@m3Y+mJG5F9KnLDg9mZMHPDxcT2Rihk^LTN~9wR9i zi=OdCzRnpt=+tl^4H`dzeW*C~k|b4}tZn1rlh5v}A<9g{Mg9B#|Gx_iLBe5|@&l_;1Q~OWeu(yjRyGgeWsh!=$v?TQLo5p`9j**(QyS zpuML+YStDw+Brg*ZuJ&|wsf(xkA6jEDZ0wFNUp-KjGbcmwPE=e*-m7KkL7#sk8R5x zmIw*aE6_egF`Rnp%ss-BsnrJ8EPdcSlcoIVW>qT;hYGM1bl-VK8!U?%T%d#c8L>r_ zygCsK23=acFBnHkh4TN?E`YEwClNlPCLvx?C+R=J0E#i=TM~%ZoNUX^fhct5;OV#t zzgEzI?UdMYB2}rVW19qelg5igrIfmD-{VhGx{h-@eXb5BhocwI=S>+OEsl>Zg2i~# zv)_{pnK|=dKOLEIXbbz(_E+nA==}-6Kp9{^*8Xlii0^W8etk{gAdHS)KM;{2NF(Q- zR|y0=0T{yp1wFntsUO7*97A2=?TNoLVMZR6?8^BAFISFO+jiiStze`%VaZKc1s{ya z5{cP5%~eZ7iKC$Og;06du=X4HkFYemn{Kwd_kDiM>}{@==^9xE*(dkc@Cc6eyq2=8 z!r+0w!@tpW^^2Fo$PIfjrS&wEqPnw-!`y!_0uov_BQBL%5A8V*Cx*i^;L==0t}-Z# zdwy%;s#xU?D`U=Oh}b2k`nnxql+KjB?(Kgp-1PjbUmh_vN%lQJ5)KJnH$kUlWZKC030q%VHrtW~VUssu53q-@4Pj^yhBE!9(KH=}I zlxjpztdKh+-%mUk`(Xi!hzBr}Fy~DVa@hw55l-P4S3tfPMK8MJr=nXS4EULJKm-zv zCj^@A-2@s2eQ6IhKwW>FCEZr*9^+UM0RpfxYH~dN5i&OY7M*1+%pu_~``6(Zlj2R;h|+^NvwDMO}G8wogJq z#KttJ&k+-*7UzT|)+B|MQ6!laatJ-? ziANbb31Y#hr>QACaI+UQZ+%E>09s&8Ddtw5H16dza2;E5oiTYaufvzLpL>WSsqVDX+$me3PE<&T7S$k5yzdunu@Jus03`?D`t06 zd(r1M0X-uoDb|I8U6BK(f#ELa)`Gt)k47C!$3*Kn2y^h(99> zFO0-$_3rb6=s76eVO1FI^0K5R`epp+HIbMtb_?p_G!YD*Y2*Z~`6lvq)lFMmTWT$1 zE?Ny9(a51*@l&wYACzCI7#aek6Uk2c6C3cIe)drQ*d|)Q`P7W8p6=VY*2HC(F9qx6 zS76QfYI9gE*=%<2j*25{0O|J{K_a=odV1(*Z?1#NsfdUdN#Mz7?&;igj|+h-(7WJk z7oWOTPD)iF)Do(TpK#;MVS)1mlHtC*?>P&e9lhr{mjL0LumS;?>7q2+Fn2TLlP6~< zzxSTWoV0hO6!-3e?h2L9jk{AZ&WZ%KEZ-x0AAElO1nf)3F&w)hQ+ER7^Jv@K$~ z`XP2}Eb;tFjQ9R(w!pf>d}}&Yc_Y=59h4*XOaD#vI|rf(;MQW_e8=->cf$MMp9NKp zKJ#4b7;E2&E0(wXp_-QE`&a{p3r{qXP3kT&+qstXV6Q4&qlY|TYekI zwbRa`!xg+|)d4=+p5rD{&H|h3`Iu=+dpi7L;F6W+n8T<=^Zt_0z}&5e-P)Jz7NO4r zv4{dt=S!P=JI&MMyD!sqa1LU32ZsGE{nrTbHXQagWda?7!F;hdr|0^0x@8}{hvVdd z%MtjbYWo%nF@1n*J?awKh{zd^)U|DbgUJ0fhVzRaC=^T)2^dhx=Dyl~*JHi|2jZ0X zC*Zup_deu?L~8ICB6*OcCKJdcrgTjF9D5kRivEisp@3KAI$0ICA7cWZR{u?yfj!4n zDB-PVSSkm*n4BX8=B<;E@c@JTMNi*hF=ybUg$(u$NL}!x@mKng@@gO}ei_5dpl7>M*bQs%PyN+Do1Ke* z4?Qs11tuCBjJxUg)8)ak(}Sz0I)Q6@@!r^@vf8h2*XGa?IkC(jq&15GSdzANUK#oz zL|W#Ia+u^|NRaeM6-h<)u{1RJ#pVc5*v9O_!Fc8gc#VzoSH49|wtZGFd1OH?i+%!? zfFxcRmQ1E(VNmSnV-+Z6i?RaG6qF1AyK)lX9&yqVzCe)(eNN?fi&HUE{IFItGTm@J zBN%u{z}WI>CbG40fv)*`)~>+f_|21wo{3Q^9@)PiTs;w{eR3!QsEYg|qPFZ{y(B;0 z%7}S0RE3 zC3uq4k_OhhCM=stxi)RB8gfB_8esJ8*lPl@&+lM{9@@wypa4uRqp@X@%Y>s;53puv z3c46s8vu(pB6?w-LtU*vY*aeZgmRmA{+3WT^J-15tRgCdNo3ZzaV@v8NhLW|HW4ur zVn8b)^9eBfM7cT`E0YSqwMPhM9^}A^+J;dsHolcpY(za`TPWql%*cmRTqYLt zCsN7Cco}(34X?ZTd;*OZR z{M1$4e;Zdt>r#Bn6@H}wk5?`zLPzDMXG{tx7hrVQit|l^ zHp-ncvz1mA7&Z^ewQWJ{uBPnrRx$iDQ9XU2!MsL1X|~Z%}Tu#qgOZ^bu{|F76 zt#*p5G{GsuPTIjS!O8&WjKcF0sWB52U#|C=M$g_)j1u>>=3bGhiNC5re(%X|(%+>1 zwyfD{QZn;1?Z&I1_O-Rl4+D;>r8NOl(;;YT<{mlu!z=jrIsjp@`1ww=ufDIi@fW?? ztWq~){3pncS8fdmuE)33D0*3r`k&ndDY4##;sIvUx!3QL^!{`Ph%Wne!=#rpD3Sfj zYeuLqLc_tXQh^(9q1A$^>*gTzwDq$FhFN~u*)P!fUl;-Z9fz}U{ofWCCT6z(_d;{n z_=zl-tz(Q&``chD6YFc$8IEcbfIgTBhW`|g6-GPHZWH<7Iu7?2Kwxz@M=aJpv4Rab zr5OI>g1Oe4_sh?l863-S*z{LQsj0sv zh5-dH6W{cMu#s-q=ve;fHnPyv>W8^_sFP~KMLC+x_LAIyfn=U8LOs3+LDp6_e zKHtjWrISJ<2}3pR7@h~LIP2ajbGhAM4V%v;LtqEqqcGkR(-aj>4Ui^en`ktFTH4?m zi9%zAWS2@lOZ-IDV})@l8}r6EwH1)co`q)xj^oChfAQ{$T5C&v)=?HALhnaqAVrcJ z(;rEoGmlcOIf9=&_utC~vn?A^)`^CY0n#3U+ZmEf_fjov+ILk}K zwgtcC28Ze%ETPxI~P#!rQCJYi_9g4Sb=lGbZMYiLq{`AK+Lu;J^X!H$4azEYl z)rMU+cPRFS`2&nse_wwYHP78AU+Q|pjM`92w%i#pS3|2V_rSe$%#>eL=i0xz{v$T) z2%-X36siGIXG8rh-RoRKCOO3!n@v_343DEM{?*8t%8>~e#vQigg<3*QCK5+Ip<>St zKd&6%WSerrCwS_v;CZxolA3kGZM!y+;&Erf-e(iP}aT9zE`b} zTj&xa!7btyOZ%9hU{@1kFqwNx*n_^n5Rka9ak84G?^DuNv!GGKOwDNOG@&j#sa9AT zY{B1yg>DQOzgGMwuWxzBC#?TkV?ZF|U5WrdL{K}+`x z#R;Z%bEVwbQUbm9AtqHP15{h5)2FIAtiPza|9u4j&cJ6me5oU6--5d8X2)0ZYYv|a zc2Ar*2XqwjdU!<9HZPQh0laM66pesu?amLgpp_ZBqjN00Rbxv)ZDR0~6|GXR*J*Tx zGPdNP`{+qj3*SKPT^l3^PMnHrUW4IW;&rQH+WJVlC0$d+;Rj3KYo95kl(2}&Uw5DpP8sg#Lmv12Jd zj^61c{^eH2n5ROej0RhHKae!`y8YNc`}|>SW1Z)eQyZb}{atT5%R08?k_SB?w#p0T zQo_c;W3-;G)9r;Dz{4nE9N+1~Bhalfy##9sva0VkW*^&y;*J8ye+dlnxFE`Gv`MTf z=8sxipEn7M(Kg!l{+6;W=kK{-|8TGR_ z>B{w;P59*|P}77L;trc(J0WWomJ~W6KNGuYSU{`VbC-@|$MSpiIUAguu#f){d%YvM zQ>ngZop#cFFjmr4R{b0UQ!bVHEzHpY;N{LYeI zaTPp)V1z9S3!K!7cPSONhj-d?`^~L^u}2d+US!X~F;s{=!@JjWcc`EmHu0Lh(YUEr zVXGoXq1CZMKQd-o* zNto=EBYTRp0#rku0ewG!ia5$x1XTlwPPoB*(57+na!58`9NpNkV~aaNU2muR*AGv{ zjJ_5!n_mH8E+t-sUQO1J6ucVIl>R%>Nv!lm1QLM$?3cg!qfPfabK9P(!Og_^!NPMHkF$ns;VYvED*C990h zaqsvFUH;S&LP;a=M( z^mPEm0Lj1d3mepzMO6hHn0gNk62ZQ$-pAymWbV}4>Yaf6&9E-Xe!4IHL`Ub^5uq z=qErktRub3$R_m7O45}0(@NPpSx%_(Pz0A%j*(?ZCX%YB6%}AwQ^sY36Zyw| zb<(1$HiS5o)Z=Alu{R{IoNC^v!{QP^ro9(N+)SDhISTOa3=9+H!#!q9T91}=aCiq!xJbLy@(rD_!`{MU|KWoOSC!IsTM%u1;59h3(?Iwkd*?rqNv1@U3Z3U_ zxf;#y$;>Bisk=BhiiIT^w!P9B;escgo^;(wcj|Lop%_G`Tskx8qNz1tmvXOHcNyj~ zWM(J3vCL)_YR`Q*E5$k1ftK#cngt{I3PU?fsJKq5UFh|zZ38fLhm<3Q_Abdajyb-* zw>pN;PDb42Zd2U3W&a-lg+O}0WmMUcROjn;8J}=3#N$^z6(gW;xa>fmNr=tJZm92^y`u_6}#uj3Jq%zfq6wQr6NEH*&_|1pwn-2i%AyBlDcC#MB z7NfkWYWFgSW!e&6wTarbZQ9(wkC%0sx1S$yq@#N~>)?Zb+ODW8Z{XI9I{L>s#LKI> z3!XnJ9Gp(i#DI6ze=*RBJ_b5bTcAPxEYKnrVh6MXQwRW2sQp;w^0!1L9DW$Z1Hhk! z)Fq$op)Ux1myh7(b9!z|q=PNp%QR3Mo?@nP8U1|o+GYJY+K=CP^)FDbaRJQu`~%UZ zY9Cgs97@z|w6 zW$F=1<1W$C;AzR@Sz5N;_XK{T1jxUJg#Vajt{ye_KTOGy9FcKPZQzk$8P zB9q~>m}~$e_IBFrN9-;|Y3F&lUKTb;v6G(f{GqlLp2a+22a%`yk(W{AWpbYeC8;A4 zD8D7UpNjI1N@_9uW&(Eh+1=rP|H(Ad{ef3Us`e@L_5FAx%w^s5T$4OduI zFs43S`xcI3>t|6$JW>9S`@80Q{T&2i*Ua@^Glx-V=BK$=Dr9UjeO%mOT}MF=OAbK~ z>Su#q$51ExL2rB;*BaV*LggNWaSDj;rC&c2P8E04&jgeCOvsWw;6=hcg9Q04*&P5c z5)n;YfBAJ*S7e3Quj(cz3(wd1hL$HIsUAaeB-fo|*a%g_ZA zV#}y(!pp2^W}Bk(gO>0viHM;LV&kra!g(6UEQ!J6M>q4L{n+R5Z!gP||V5AyX(%!2=pAa4%BR1U^BCr?E)I0pKhl#NWF5 ze=j|ehUY~NJ-oy(LV=o)a7@q3qRp$evmNQfT4}TMZO4~c2f(>zV zIufD5U5SNCM>DJ|pGnyiwpu{XX+}o@PTSkw3^<-~PYlBkSFXOC#4&?LXw2Uh_J@Zg zaRxl{k%?X8YZEY&GM1blf+l+Pi3>&7bvm>SjcvnA=qgUpot^Te!ZCm%e|OcU^|xOm z0sLSRDmobMDmo4d7y3}qU7o-n7nRp^#VSl_YTs7s2Av+Jx^96hLF$1R=N*( zjh^m4_*bWk6Zlf>YRF*&0W4+(@m?HYEVdnu#`S8w=}xu~I4iJ>A0U*S8I?X7Ew%`m zEkZyDlk})Ig$sjEbdLQ*f9F_ty+$X+ab3-eU3}(k=ScKZj7i7exIdmaPWP8>SV9>A z&cxJi!-4m5EIS!L+;BL!zsE18nO_)y`=(edvAdzn2O|hylhL$j+kE5v!KFK5fY9f< ziRgaO&)mDMMTxHw@UjX#0j$}msv9yOcY62Y?H^93WzcgCf444+f2X5w)+--@^=!X^ zL7cUNSFMQRd40@a5_3ok61CUFx7Wl59@deVKb%gUTWT#^KO zZCqa_VvkB8ih)W$5|ua^QuW5!7^Rx6X+xd|k71g@dSj*^OtaFB zr@`r}G7y8R%QF%Pi#WwDLkZ}Q;#jE)w^+RkA$@qNJN+Mn z^pJDCbA(U3L3rkKoFmR)%oc>o!we(dX#2%qrYrsAucqa9tMMp+FCF2dI}gy~F`;)2 z8+cL#f8cPdwz~2rvFv^46!MP7yWwWQxEln^C7^nDIh*6^r#Owf15tmYe`njRRW(k& z8dsua2zOX>nl5}U5}$_lEY!QwD-jE(gDcpNE8++j9+CU+T%hAd*R6#|_BCR9+Y)y3 z`|IgVBKe4UV;+YW+YWL9;XLiL1>~s8Y+BnGMH`TuoX8PKjsQyXj!^aoZ_JTz=P6kOLX8PwS|mo1+qqOM-9!}m1(rHxUYNaoUSRR zt>~S&w(%8D_A?_x;32y|;sFT%tI~Bh6kc+i7C|MFV~Gr&+2w-t52c~3tEn{i=!h_K zWZXHl7Rbe9^lTY}C(O zyy(P{Nl-cdGa6d)KUSWmyyN+69P6iml0?I6t@T_ z0S7{tX&V744l)WaOl59obZ8(lIW#hpf#@lJTU&2ixeJ`FwrLk_ zwu{|t8z9Jo>(wSk6DzQtY_`9?-^`pNQ9iPxNO7P7dC-U=hr@3!oFR{oy>W(21Bu4F zW+<58$WSw(Rzuaq>WmL2m1ev*xe&%pb;I(W@gL4XGCC*08d1)S)mybm@~XX zKn07#!V?9<=hE{y%*2vP8XNhZ_@E(@yprC!{rC_+!+pF1Yz?pW|)3~d00uk@$A42w*jKMf=%x6% zw$2WoJ3QVdsVnW4y7K;hxhW-gDPhB3eKI^W)#XVXW;#gU9rW6NYLR{MPvR}d|112H zc*_UI+n)JtPyEGS$6ws%vVVUh>3z|c%DeJQnOsXs_-uLL(~e`^;d%Rkd0!RlM8&+5 zilu$h*7>+9{heSV(;a#ct&`}i?jRLE#f$r5o^hhgsGYQ(%Rwn@m;d@R`7_13{h5k_pZ=A>9gkJR zmOp~*_*anOS@GS%n>u~R2fAMbUYt5Nx+8)&b#6S=x!bpY%<5viH`F?Xnh%5e>F}N> zigW%e^;Zh|0`~Cor~0p-FZY4fgUfSdfmG)F)(5u}(VPyVgUpVWd|k5klo;m06c^^r z6iSGOl9I`#qBkcGOr-?w6~0iJgRz%fF(dmj_qhLdl0>S`A6D>f9!<&~oWlyrDYP|~ z)AwYOl?F?HM9l52((9x>F+2IJf9dGDub;!cJ~4_)Y;nca+ePGgVqVACLJ*EH&d!-J z#mp9qVh`biCu?DQfrqhG2QF9!`ulm7*EhIBRIGr)uO+czYe-{Q%|Rk!LaRuhQk>`50mD}n+YhuP`DBfy+bA&Te5FNba;|Ho z;5fqgRh(2|g@TxZ!4bLW1wuA^;Qdh9_*L|ap>dpx)oN_49sHS1D~|DDx9|>NZ|BGb z%E`WeX+!kF#+9v}D|4uITI8PU89@?RJev7Et$Ev^aJEwtNuu0yIIu_H=i+Y6L0=_M z3eq#b#->S6fX2d;WE-*o!1GBUaCo(vMrUtuzpC>VRZdr0k^|DW|-o-YQYjvhEqQNwxe! zDm1J};{3X3l9Zi`)GcPH>%dT{Fe%e@<3Z%nmEy(05gygD8et5^6T2`(ZRgj7yZiI zbp>n9spHY1&Li!|(N(JvRY2Q9Ie`Q{*AAz=uA0>#$5^3y76@8Qx)Qr8?KpX@(|=$0 z_;+(&DzC;&cewB?7F}lD>bd%VN|L(jEMpzKZNP5&_z4P?8Vf^LIuvd`R64DY(kqt& zJt_{DCp|)eZ#YAZmQhRzu6o=14X<$rhF`W~t&?z9P`ju9`K6D~^*I zQHF(y^dzV#gcgZ&MV`C%b*)kw?@f9e9onAjOGq@#(B9Dwg4pF%PfK-mA6s)PN0duv zOhO}PlzvogrEQ_B+h6s6d{gM#yU^hx+Fu=apS+Xk;p^s+e(lYXjj5Y`S?_#8Z<*xb zW-nJzBxda?e!P+$Kv~N8DaafA?>CaZg=$aXe_ufb9?vKxO8&_51R>}FBnVeXawT;^ zW_n2%{J%ajD~$4V<{(=xjw!BWGnf3cl*_9hN$!bOq&9+T{5`-;*-uC?CbuiSPB(cHg6tqm#YY zwQ>FA4BGJwbG2W8QjzwQ;-&1!++L>egcK#OXda0p=Zo&qJwIXpc5!)narX9Vd7)3- zzdw0{k?;TY^RvJF`A?6YJbXqD1FuhBUYe*J59JB|y_C&8&jpMB3kjv_#mqjqJeAki z8aN-Fy#4Fq?B%N~{%@<9|z#$}zLghDoR( zkn!r|f}ijI!9K7L?IZixerNw?|8Aeyf7qw?XM1A*ZBOm#^7ZoE{$dwarrKZ6-Y@L0 z%Xb&{rF~`3?0@WQ`^KKz^Rx4XUD_q+TYF(I?d9VA;@n=IeXv*d>ea@w+BJ2VG9|1R)v6=%Fw>Jy|4q*W|mjUDh6)QM2 zH3~0GWo~D5Xfhx%F*i9l3NK7$ZfA68GaxVuFHB`_XLM*FF)}$dHJ34?0w{m91ymc_ z7A=ZX+}#2ccXxMp+ESnd2oNMda4l}dwYayqyHlJ(p}4!#7I%9bxu@se|HpW5WQ-(p zt+{OPxi%fOrVg8wxxFb!-X7x2#>LJl43JUN=Hdo$a`Lcqa&n{6(dmMnZ9#vVQR(zS zP$#fGMEG9>87K(o{A`m2IzNB&)a)SuWfxlj7Y~4oUzkfkn3EI0&B-bBAEG@}7$6ID z1)BrZ*a6D+5Relpos7MM2NY~+<@{XcKYsy?W=sGsAt3?QKf?i1b|5I&3``2AY}K+c^Ls9$<(izyfRw0%*vqvOBvw zvjTt+^FN3{TPOSHc%XkP5Nr!HeJ1?bIS?Q(r3C;!5BT?ZPG(TBgR>L66WI2T5jp-y z^L)y35OW!OJ3A1>*$MTJ{$#;WklFLGdvN@9vo;WWH;C8Yzyb_0xA#7;{xCmJ;N#_B?*OoP z9s=Y8wg5f)($5MyOm|0CTXJGr$yN35KBl&i-r$S^R~cFCPka z2fXEc)*cst^N-Iz|BRmHWo{3#_4rNy^L{y$RAkg%DX{!C@jpIkX?u5o7aI>RfQ_4v z3m_yY2oT`o1o(gacNR?``0p+_e}^hTEbIY7e>MAjO8;rt_3!&<{ChW;0RNp!-Tqm$ zAOPcUjT>_Eahg4Uas59l{m+p9KY{;|<^QJf|7}R##n$#uH{+lF|BoAJ2e$S2oA9hz z7w2dFtJyzq0px$FuRwq8tQyE1>|*!7UL|MX^Bzb+ENy@PIYzLPJlGv%t_gNFv-(Rc zf7$i^STb8M1f*&21peby0kCm#a{iC+d9%!Ho?i~9XGQ+$0zEIzf0vYlnAw~Ev0>bN z`~V;n3iLqbd=?TnA0NPr>v~DW01mKYS2MO>z3+y-I1#l?;M$d8TztMA?#y?1q6TqSQ8*u|Tw11=LoI1bJ zb57mgh#$bA{|^!p0B`{RLA=k*=f}nFx8;ws<1qgR@;#Tauy=v}%l{l=^)L85H~3%h zxtR68;Bz&bf5GSRZ2twH=d=3_xt=RS{sp-J9QJ>|JAF><@GNtC^M5g(TlrUKT+gjI z{R=)vIR75xIh(T;6a@Nhc`oPdX8*5%=k8p8L+AwqJc@V)L4Zw!7S7A}29b zW(0q%LNBF~hQ44gZOSoTNG?!4cpWy^A&0gkXtmyX-@l8~{=VIcIyX+(KUQ!kRoh2_ zLe8cux#Rud=&kQ>1K$kWsZ5vS=pu-znTL1n)~n!N+gGwU5;C)`wNuHjf_7gr!4{<# zY3ToXiZ0hQbDEe2$(fDf1vBokJJ!_2S4tRW}50R@ait%=zspFA&Gmn>)SKXCP1)5ErST*9oPa3uYwS3xWLfhT9*|mS3 zd&rCgHLsaNwXFz}YN;SSe4!Mu*|qeTVfovZ1NTuxD~1DR%frj~^-V&UCUO+b?S31U z88vSH`^&o2Lrd<1N>eAwo)clN`Gu7dJEKnKb|l8INp$t~0b+YqElJt3 zXe?wO2x~JbTrP#0$q-4SXp=J1a+-g6>NU{@-WkDm*|x| zNmZ8T2xj0EpeQ28MBg;Rg|3gf5GstX3(KzHhOR4zML#lzs&&Dar zUSg>ujfJjmn}}zSr4g%oG?^RCM`kQk*Mt8k{8^=i8PWTfJZeDDlUGkTU?G3huVhA! zb(JLR&an-SNW9&e(>TTbFu6vn?~&nk&;HN%`@!LDU=s8p5fTrBAbWI{T}m#09sMd;pO^vRPhBe|z%z4BtKM0!_wPmRkfyoaevV`(--ZwbTk`e$!UrS| z9>JjA1d@{pDFj&gMf#5YJez-F66MkPPK*(3-dPH#+ygU1q)O??{NbXLjx2an)Qy2F z$I1W9SY6gNzacUUJA+-Jw@wGr=5BEGt011xb29yoJyYjHg4#J1Q^=y|P-EmT*9Xl> zD?eIME+txxciT?O1+Be<@>iBFRXv+O2~F3m7g?N8E!XY z=(+j5OdKp`tgym~uEy@Mk)yx}50)nsYNca_t?I~SXP76H)e`z?MH58s6X~x(zs$%S zz@LUy(7RKy_EQ9wzDQ_&q$f=0h3hrwonlIPEMOrGx6|rnz!TzMpHmV*$^!~+GstGZ zeW#&%&6$5P+?001axi~pzHB7DpNv0&Au$kd`5EZZa3uAq=DYD$V~Gh;%!LqP8Xx;U zIEf`NvO^isy%JrxJAY?s?C6b;_U@SFz_yTY<@mnyzOCLZfhTo|5kn|c;!c9uf@<~J zJ9hf=J7b>Qxk7h;rzB!4Iu67p-Pdyu^m8GiFJI$Qyk})oIV*p%Rw|n*>)XfD(6_xP zNUde~X%u?lJz@`t9!F8cd=~@`iN{Ua*?Lz^r+D-OoNX;dc(DNt$!u%s#WjL>N#C87 zo}}EFNAh2;Q!iOkX~PpM`su)smx^e2>%;uiTl4!NL2dgfN^QREJGUjC#@-@3ez0z@ zKmze?gWFibdnSL0X81yx7ppnR`lk2-#v3;2S;ZI1B4uV6sOnvb%x4($Q3~W;p92TdMLy63ZBeHD^~ONFo%k4r{1q8@K0E!@gu%P;htZuAJ2}Zq%v4@)jLnyux-=y zreo3{Xu`BRZka93q`<`$qi+ME?v@drD@XS@eGGa>kw1S@6Q7Fc5&eFi)Z0rtATNr) zw=QcqMLH!$z*^~w6xp9B)Nk-3cM9o4Ef7Ea{xco=(?>}GUNp%k7=i;{#(45Jb}`sr zfKe)wtO+Xyhq8%H7WX9A(bqm9H4-02a1>^EaAYZjQv!?|V(N1zvtya*n|V(h=Aawy zQTOY7Ab5YuoET#(taKa66P(c4rqw#LRtBR&faY>q;bE#Fr`Pb(;r)vb@8kaHTn zBiz&?pb2L9LaUktj9XcvHiE6ll_E(c0t1R13Hgn@DcTE)#I1ZC<&%C$GuwLg1hcI2 z$Z>CRIR_* zhq?q;y^&OdL^Qg5du2i=L5ig%NOA6_z+*|__bAeaW?qQYv}8MMk1|Ty%>96#ptpW@ z;nKyw@lj^x108AK8{G>A?eoY1QtJtrZ2K853bhi5kLqI#3(RqXu*PFO$B4<5WZ>>( z_GEwbHUSL55N}g-U8yoEW{@=chmpaTrEh@KRf+^CQgQDsISG}t5=qWPS45Cf?p(b^ zfAS+wDa>z4I!8Ia4v7?BABu5MA}Xh=Vx)Y1?wT~bBjCeTCj@I-DpjenP~itl#b1c? zB01S8p&Oee?RKr&Htzf#KfxJ8GRfgM&ys(M4YMwK17k(8QC1HYKcDs-+uLqNx$+-U z%G5kg!iXSdsl0=w{1J3SgU6CVIj1`H?~!(OX5%F%?Cgs-;^?7Y!X{5M#I-s@>6^)t z2iz;R4@a6kAs;b2!$NFiimEIeU$M<6Jp}SQhT9`Ee{^7BzqGWrHOPTdS~-)&e3O6R z5#}y*o%iJ3wvsoF3}ndvoe`Z8X@#^!H(D^~@(ZNdBE$LOVG`Iu(7g=6HWLb3LT- zrZ1~*^-l&uN{pS8d3~(-KyfRI>S54c#d4)WR*gnveulL|lJzkh+q_z;kaX0brx10G z1L6f*cOVSPu!e5d3;k`jR>nqZ<@!d04v*KXDD6emMwOnkOOmtf4SvNp1n7J}!(qnQ zViIIk>-gS5=M}g2%N;EPK39KoP(pV<2Vn16j#g^YC46uPl$jrNCU?2#Oi4YM9rk@3 zZW+tXyMJT8%oxNhoONvFYb*d5R7nl{dMSEcNCy;>Knx`XBiFaXIA-`kh$^ zAMo)=n99JH@Syhq4XS_I^2uyI2+k)mu%I;GBlAvwP>TB+q+OD#TkZ}{R`W@`B?t5p zU+H4;hj9~Rz6*%3Mpb1< z+Fu^Kv^Ac`r7B%jI)+QDyj25Rf82HU*mKfE;Xp*hNiYh)hxzt8SQ!^5PDQ{#Rh9;r zpLA}qqr_E2E-_{8+`}*=D9phasg$LVo4tUH1T$REA2EPH68aHCG>|2?rWkq&xXy6T znzQ!*Di&7vzOsK+sB_!1N2!Av;ZuJD6bGcB-uYVHK`K0%7fH{_$W+8K4wf>CO;va| z@`{6?Y@uSr0S`Er`~pjObDYclW+3r&aLXhPNxv)UgkDY#F56$C!3>)ibLJW!U1l+5 zAXPx1hRtMP{v|?Xxti-L@&UyGp?7UCy;E=GH}ner*VKQ#mb4J_vCy{(Za7;({t(6> z^ZDo$`zd>>tIzL(eXSzHj9s5e8?2+QPvf>chAWu4$LBA?URxYB zMK*(eq-uXYU5tB0%7yt}ie?q^I&b8Js~)zMHy9G*lPCPZY(C-(D| zvHR!KH<{F~$JhEeF(dwkyeqkWKY%J+<#>)A8`+TIP2OdH z^tpdQKtwiP6h(O0jQ0+%5Iu56dmrYC1ylfQy}?hb%@@+h22kY-*TUWY$?-MKeY6q_ux$2t_w~da3ss!y>*ui$z#XIM?RlK@o$b zFNQHkl5a4mEL%E|5n*lh?(JO*A0o0@aB69^=sd-GUl!@Xz`BSw5-9U)E2LZw*DZ~N zy4tO5)e_NN-1M|&*G}LYm5FJ}_ypZAz2jaQn6i1ez{jIM?1w|!7Xei(2+YPK7Ak)w zUq`lcYFTu1w8UMaMBGu4tRAIjfv9yhyt$(j!*h@LKFV7t@ZqQ6*T$bg ze$}Cad3-j$)54GKnX+yUG^HZeCsk4ix8*3`Omwsj8{QybRkCkuZ)z0-9^>NfS2)HW+Em{;?I_`eV!kC^RNEEtQXWN7n^ zy0W=dFmJ12&BcV>oF#Jw=;wVx2Zu^*du=Jw*6~`QF$Tlt zkXiQmwxJ4ku+2oz9t5|K;!9pL`us>Iz7O9a)XhNBMN>=32+}OC4lsW?a+nIsHSvt} zdSpn?2y;gdKO$gBi%0!RB>GF#c{W~1J#D^wWYtzlks@c=DYHlH$O(j1HL@{+Ky>-O zfJ^yXNilQOY*lBm>f6-D-Y6$#Gs_FfIbS;)3)dnU!R6rryr2*a3?W?y1IZX;oWPNO z_|HK(U;&55QtpPN04;yj(prI<0*5Y)MnZGRT_$a#?k6jWg|~LW4idCK-1Ad7SrOcJ zBo(|=V$5J~--e+rcLy7i3Xy^qti$7p8SPsT+b zA+GSB?VMd(PV*nbdXcVN5W{!QiFT`;2J#g!Ji-hMh-6NcVRC<%{OMP_?9{^P$PhMj zMmmwx3=yO{yT?aP1sr6`a`II_;}$AQH*;QG;#{O_``+Z+J@JbKMwg?wYHl#$DOBEX zZfg?LVbxd|(Zy&u`@fHA-rgj(wP=&FLEgy46(5?(4qmUP@@bF^dpFitv-yNreD(^T zez%ATk@n`>tY3dsTI9?fOD@sNp;+!6@VnGv=}b>ogd-DjBbogHBQusgKmYHMEkSjN z%z?u<^%dJ{WSq@yAy>JxhNFXzNcR0yi)Ybib}jm-#jJ(8Z`;n0^5@a`(G6#)Z&x?XBvZ3gEfOI(7 z86Z0{gw$~%Cp8ZhXreLV?YJ3k{t+>EW&In^J}LZUPs_{o1CBHA2{rB8MmCd3vb9R| zViEowwOjAL>>f+sQ@^V>0GE=t)wZXM_HFY|NK^inq^Y)YSU=nn8k@Rjf>`__-#eU} zFVw!a#gBiHeeFVppO>Y8)=X*2tp*1w$Jh>M2F=c1uY$D~U%Lx7OYNn|L3D7F47CYz zk#amzbdqxEkb8ktSUAE z{tQ9}yG$B5VUvE7{@5G!0yGuHx);?ueN82mKO=viIcHPHVQP4>xmV+=w0yNQ1lNcL zpR0wtf_s(;D_cEvaCT>N?UbBnCEk!`5*(Kej4IZwV)V79)2s+-8XOYGLakSLWt*hx z|6KwuH8XUp{`lt8CBkxCF@1N0mCFSTeLJNTY{*OO$bhIRy4z?WGeb>u8U;q074*K1 zlAC{ri~5lDABaO;-S|lp*f5^K2;`C3DJ(PzTYh9s_zO*eCHfnR5vlPP3ncYXTnY=> zSBmZt8*i}M_H}DUCrXE4onqN~9CRX)O1ouhYjPZgQ3K$Ggxo=9NJiR|UY;`5@S!ad z9vUq=GweGoYr3>1_a-!R0DqKzo45=cZmEBC@ojqYK;xR_JrZrt?_w4>;rq!<*Ot~& z%Lxqbp{CNB=AxCGg~k)ntdrDOJ-M#a+jetk%G7by%%T<596B{{gJ0mp)JBASUQ@hX z)aF^gmEvYm4>Uid*>HuC=SPvdh<|&;j+Ogu(m-83K$eVR^UE%k6){0%zBd)_vC4n0 zIN!tvc0NXx^;?2TaTer|Ko;Isk7>ywf)&Kf=yB=kUvJ+~HMJ#Ppp;RtncU+@vz zcUcz$;o7zWU_m^;FM_l)*ZgQ9H+Fwp_$wM!aF6pL#BN{QG+da~2d*(~VBF0jGE<-Q z^QXFn$`rpi3RZCs6^!BVoaB8wJ)M0&oqnDd$nLL`hQu;RBuS6e9ua5Q``xH3)AZG9 zE_I&zN}?%g7F%~)nAgHu~@!#GUS zDN02AAacjOe(VRn1i1FQuLZp#%#cyjm!~=vu0O5rzq0uWdW?RJtzK(*{6#5t40c-V zill-vW^!O0fv{i%8T7-NZwv9<@; zWuWf;>K8p{x@3`0d;seNRE8!k(BUp-V0jG{s{MZ~V!Isqq$j7>WnrM}@a>xmeDF?0J5L zs?~MWrb)_OvP^vmVHZ%c6gb$4F&H`bF}rN+I=WtN-h|~hDUpACJkGGpw@n|*YJYWN zR9jy}e?XIDqO*cz&hNTkqeJXyGfmu+zh{-w4~AQym>;Sm@$4?I3)@97Iumk1Z0}ja z;zSeX3fuqroxr6-KFB66EloCrPD&weumpLhLu&396%UMo%&v@6dlh0fy-;>sFSKoe zhcF+>&IwKH7U_S`$i>@|*P?Htyc(TsgexFPx#z?07kw~Be9&F6pWR16xUuzCN>q(}w#>uPPg zrd2^n!t@0_h(=B+%wKnXQIGpr~2U9VC#3`bEZWV%TdMxPioR7Oe1yT_`JAzT}A8$f5 zPbY&^CvY7UhgV}Xe=&YA~M=0#5@Y9=~&rN??H4PssQo>LP0KX7?A-)xpP)TpN z|ImF#-8sa-j=PXXXNdelKGY_(8%Y#p)bB2{QyrM>?a8;~M958uNp`Cu6h(!BlVN_NESDV|hs zYwCZ2*ky-8M zxg;c$+zQUub!)V@4Gm7HE0XP3 z%}jy}XQ+t76MNJAsVJc5LMTgvjl$0%&N_bxn%8%p7gUa-PbX>qLA)YADXqo0qeoPs zTlVGKhB?>_1(0|T`f*96;GOrN+>6gs87_|Y35J&u$BJi+v2ksNDt&Qcq_pdkNs`gu zO3MjJ()x!*=28eC(2s`d!)tbF$ODG51azZW@njmEg`39jVO3=9>%L*xmgI4Frg?u+ zO*%^*z5MFeHw%BJ!G<YBmJi2Ovn%0018zBA`XBZs8^YMkY$y{N6AR_>0O@bzk} zFi`_ZcpQt!X=EUai-i?!uk?A>Q%8Rugfrd?IWK{O^G93|mAu+Pi@4;vD>>WtaBui$ zN8y%`SO6J#Z_8u$J>L;DZk|rwpk6`fpKI*hk-%Yr(kr{yH|yi@miR!YfwJqk|v?8eW5ME+mE7+UkFIiBIOW za32__OUI_+R~#_kG#hEz-OJu>#KjN%+KEk zPBALqjwB5Uc-p5gtssETgUij;J{^67vIgT7yhh}4H1JRVGz1~jSD-lg38o!U7g8Cj zm$?|YDa-~Qq*swvgvqJmN{)XEGHi^TFEGZ9P*(7jc?oaFSSp8ClNxl-lUrKAR=WgM9SAQ%=W0=@_Dv#V_ zH6nwe`Uo3D=4HPjn_zQ(Jna&T`~=4CafEIyK2T=9nR&D5BsnYHpDKT+L$>Tyoa$ZD zoA*`US=~<@ROZNSiqZ1%LkpTB$d+$msVS6kJ7GqPZ8VU@M^^cR@tDgKj3Pcl=T2SC zFb}Y;F#gj0@np71`zzIbA;64IwJK|gG+$ceO=@upUcU`OO5eQA1o;<_wt_Kqv#PF6 zRci!KS`685riE9Xz6pOX-C1WM$nZwLsEmckBZB?FTKPjePOpu7sb=Rs)ci_pnIHRB zo{2DF2SB+J^cU{kVJzq1|K&JdBc=KI7wCkc>-u(~3Mt4%)-O~QMsh#mfwtb2j%4oL zzPN=P>?C{Hm4srgo9wu@UHM(=X{+4{=Io_cR+3VpdKD{wH~D`e?XkL!ObWBm6aJS@ z`6>0mKpQ}OVeuA~6jyLPkR_{vH{55cX@dW2@RWweyQn;?c>cNckc1M}djgG|aCpUgjBA%SA<$_KC^1 zm%>Mt<-_gnFy?3`rdspVy6*Ot9O2MS8nN5a{kf28NE5LeqOsY-q z$HyRH&^@fF?@{!ZxG{UBp#Eg5H_tEau>YvhBrve*BZ*Hv(UE;3;PzCPk@;9Cr?{;w z?a&&g|EBsSw36l~YDkA{!H>@B8y&Br*VTsZujbmL-TQy0=}r9V3p?cO(PdRP9L}km zhZ)HN!cW3xHK|k0FQV9ng=i!={7*}c36=yWs1IIT%I$v51rUY%mf4?KOI~N~iFj9S zx*FeGO6Cz~H#2z`@pOGQOm(0}Kj-F_nT;C)r&&?$!Yc_oAEhVWB+9zaRv3CD#@wls ztZ%%1b)SDi5~O0MMTg^`Nxo7soT8Rcbt{UW<8md#u1Jk#@yNu$gJ(p?#oV+rC5Nj(b*=amF5cjtp%%`}mOhOm8)@M}dJ9xf`_zb? zHE11HajL0o=}25nerB+MKpgGZZt`wo0(3bsV#pFpq+LB&W!K4*)6|vJW zbB~4n4607Cf5B`z%od{OX+=SDU$eL&Kk{me& zmc;Hf&MdtWhn(bTblb=XzJ?TWeKV!o#rl65SWa*`f3xq_ia*LAV}j^KcOz2PXQ`;p zMC}Bixr-%d~z;9Ud64z?VML&LEH1WQAkH4)BVEqj5yq z)!OX<&4f-Xqq5{iRrcE9ABQKNj-G#m`9-jH6@69d!+Tt>s*hgGD8_J;Xo<_u6n= z{kzw@m{`cn_eRR>)3LjG9=D>!#-<%#kR+4CurichNfDIx#E9r3pD&yj8F7vyrY74( z2lhT)BS;|=Mp^lXM;xK>;5Rr9rnVRCcEz8;;WVW?jRvF#8)DC4sqBbi8pFQV`4pAO zIjJ9UXoc4N$$Lq+25|s2ydQE;DT-C#G<(!3 z)2tILY-1={DL?s*TsTmHjH94`4kD978G3~b^@7)z8?YaSU6BL!VySc;;&eyNmPBJ3 zt4Wj{mj3F1Sbu}BSnadOxqQR^Ln87+TaW09VZQ_zM`kxO{+-1`j9!0S`ms!lCD)4| z3sjwBaF|h>hGW~d?W8dqG`4Nq$(y8UY&(tZ#G4RdyBb({pb0cIoR zeFqqkUm-_&Pv3H_mXcaNm%Gt-_CVN>@pk;Xyid>{W|5To7ZJWM=l%G%qv7JPNsYgX zIY4aPmsz5Rqdfg(1JFKQ`+1oYwQunSO&cSZ-Xp#!wf`_k6-l} zPk1BApNi-(A^s^SPo26hx5@-wB2%UKA+M6e8E?a9l&0;Osx%3qAqkn#s^O@9FH(&l z;lffe4MJ|DnIyt*rex*3DyW?itQ^eZw}9=bDBVl@(L-af3~+e4jrcSZQT@o8N+<}e zx-KR^vL=|pC2?Ot6WM=kJ&h+>9)5w!lQ+Aa+*w)_*9^3uaL!ulwcNEe{29LyZgvty zUpCUO)um4>)gACaAfw7I=N1uEWm&!|dCcc^vofs;2h~Q5hFYmE-yst5I-2~f5G_KX zdHnp8mbeI!!k1;S0j+df5UAb}?ta2Oxw9(czD+z1j zk`6eB@YRWP{$90zb66zv}3 zbDd2EXOf(3={;sLD`x+^=w&oj*IgHC8wNZ45u8slU05oruSs=2H<{MDgzAtP$mBDN z7h@N>F9J_-z+Un_o7f?)3LzbrQX!=@PDo0gu^D5yRlrx&#{^Mx;Ze-k$HQZ>?Y-}Y z_LwaSD4T2FBMmGWvIVthF?|2A$ASooMk)hskU#)}Ih`G79Zqm4@xdF(B2TBRljO8lGJte9Yuk zCmvQqfH3~sX8y3xtAxF-mG%MsBS2SHHA77nNL&1_Z#K*aYnl!*YQCirEM$_gnkP2N zlI2m8ug}0*M^YPut4w={e7IOr(DMReGr9_IE6!dWUQXT7>*RyRU3iJ#)kZ@MD!uZo5^HNN%A9GkNb3LXSKf_ z-g=qid%v5Sj=FEaTJr0mY7g&pLvBc4o1Nt0UfJIqZ9js}EdJP^;X#^EqN^ya=9ZC)eIGb^Bq;;&>6+R|QTqos+mPtqprs7V6`#+{6 z?CB>msDxExxTt@_I+p(UlvutAS3$ScFP#vHYgiKOD8HYdE~fm327lN?WCcmW0BW0_ zIa9_QW30@cr)y4~uAuoGKQr(#(Khmvog{EYvsy3(faw0fL?3s1+R|3p!vQ=3E#l2k z%O16yqd;n1w59RUt=T>Qtk-N_6BOu|BlUIkt0;+OO`

    $MzQ1&D_WSZ2)C)XdN)msevnA5bh3#?w&0@eL5NKlQgz&-ig{{_j?nFw`oQ8T6 zatr%QKrsrh;!G$pvczq9MgWkK2?rz|a6r1`Gy;jM*Fb8T{y#v9jHH|`f%M>UPQfa< z1aH6p)2Y}w<;ZzdpFk@5HlkE$A~{_`nks-4;0UPh1cOM~DjJB3Cvtxm4*slb2;lbu zue9a?s-QVwpit%l#RpfAvrzjgGBS*ee2k1paDj1+51}#4*6xOzwal09=23Tl0!1$v z3fQ{r7{!DIKPrLBc(ygV8W$g@%n}Z{tbxazUY9ZB;a-126mZkl;m`>~E|!oP*CeNt zcW(#Vo7+p#c4q&fEiQkjcmH~OyT2c7b%anD))W+S%tagDOCDs;QID z@DVQJ1ae@g3J{|PNi7pXUJx7J0(kQP@7oFxtDz)#=Rs-^P6l~-`C~04nCCUjZ zlwKNC!PlX-G9H8$!dun;yv z@ZcuGQkj{c(LN_9ER%nelr+l-l=np!3b{&YNb~_)dDTW<#fN+L`o+|eIZlSI;MtVMCN}}r!z((Sm6eka;Sta^Tf*&EWbJ)T^%yelhP;?tM-3<4b* zaCvQD%s8otW_p3O9)X01%3$?mItTb`Q~5<~QE!`S=v{vm!Ik$Y77u(*N?nhYF6g8;*e(l>(d&JV-8@~w2B9@XJtZ@hqZa~BbZWLfIO0Zo zdm%|SNA`b|F&qutV7ZC`h?fE;JJY^I5g3@q+dd9eZ^03z={n4ml8P{vcJQF;*anx6F>T^lbc}V*7&liUz zzPk0!SAO@^!8PQt*4bliG0t&30*SpFT5ux}7C(PG;Q!&`U-j4v9%jcPMDREx18)HG zWxxF3v&FZ|(kfwO(S&h}F@+&A^B~5yjBq|h$h(&+!Lmf1{fs_%Vp&&JQAW{^ZPQ3T z7s{}Lb}iVr?84N{-;fHT4HkuYTrG8V%z@+sh7K=LQ~A_0IoQE3aBO9KJ+`9Pg=R^2 zY6gG2UTE+hbpI~Vz_4K8qg7$CTUvjdfZD|vcDWjIw+ho0Rf|*a?_T{6j;XcD3T19&b98cLVQmU!Ze*8# zjS2^s;@<%j0x&R_p-%}Zf3;Xklbc2mzWZ0Gk_$?O5%Yqd5%1vEndE-RY2azyP-iM;f>ZLH= zT}u;}`?kw(aNC8?t=cT(pBshEwcUe;CD)FlaemsEKVyVqjA(1r!Vpvf5r+kJt}E&&i} z=hQi4EpSX^{+${|G809k!FIa`G~r;W(CDXV@?lGkCp|0ze?TtH)B`fwZ)u_>wP&>D z3PN#ofWtK?tGxv9gr3LoWuEp;(d}mgi39#k^jIH8V5%^BistVtjMN!jB*0e2|Di4q zT2IC-FsIg=*;j@v=Hjs?QUSO`KE*_@mqvI^4cZHC2q1z(imZ{+f=eYwS)?}7`90)9#Q4kHg|iZtnRH#_E( zqNV@gun%Sd>#`@fc|GqZAy^cOshe7t!J2xPH(im>f13`90Kz~$zmk;U=Z+)zwA;Eb zGlGcCHJD?PhCbdE-S&R;K=zIfei@xRa}Hm`iW#M*-s+O8<9N)o@0_L2!YPI&)7nMTVnn%Vm5^F|KLo?!thIVkO2CF4ikUI!pn+wR}$)5 zoROZOM+^2WYJXcjL>zl{mDBvDp3S>H*CCTu`y+R~Z-*>>k{kji4k`9_sg*}MU>-t# z6+t*v@RHFOU}X~&j%yeKypX3w`rL820-#0m;WVWL(+BGuog@b_a1st)_l@DM;#iqy z!0ijc0RVhzf+6(gWE-YJ{h4eKjN*Nz#o&c+iHx=>(0`DUzF2|^Ps_}d=J(b2STi9< zW4r@iI(HnQSQwb2y65T2oABUM{_j+yS33HFQ4NPF;%rV*w;Ni9)HoPFoxtX5Z)c6qxn7p$dVbe3+z1W z`LRqFEorewrR%;SEsi@+hg1W7<4LOR;rvx{lY`N?!(;7O%e>=a&iH|kJ}xOd1WSOr zeo{yC!{&spV!cOWI4Tx-ZXT&sOaEpyJu6!oXnbca*!<<#rZXrlO`)>bpNa~0NisJJ zynmRu-#z?A00NX6uNtlq>{n&dvTx=ojQf4!C@_e^T5aWQkf6_X(FWMFenLzp0|lZRV`F98|I3^Y)< zczR7@W^antXYW6-pAymMcSJu_Y1wD_YJZ$zvnS-x-77vClza%Ki^tv#s^7OAy9l<=z~eZHEf zg^+gDQ9J5~!1C6%bwQcKGbtMgkv+X+mIW$4(k|jW(P=^+!wun4oL*79xxh-i{(tG> z#p-R^CC8EN{ztIp%_d3R6p+-kZ`(XO-Z2_>481D<)D3NcsuQTI84g~hBNjHP<6&bcX7G4T_h4E#DXPn;o)-b z%{!W){s{lUeF3Z2^j25&oh}<;0DniZ{0kUOv!^LcR#4~c$#6~4(Y(zd<7$ct$jXZb z0|N&?+eB@qR}m1FV;0+X-L8F3?sQ)!-dwG2l9V+*GBt09g{Z0j1UoaEl$-0-c-3^X zTiu`PH3!~5rh{Dr76a02H$#@Kycdq-w|(PAmgmAVMZw!VMVWsMT>-Y-IDgtD*Y0-& z<}pdf#)O1UbegzE0s$oiHf>Q?G(npq0lG;#D|MT<^yyHZ-AXfANrVYFEd+8-!(UTJ zLv!T2QrS9(9|ovR{;}r{rc4yO@@ZLz8O6A}o&wBGubK}ofZ`efZ3(#bK*(YV(F##3 z9C_*+yxEl8^WV~w@Gy9NhhfeJsG`5EudSQu;d2RJ7?2!4OB$fzg8Qy2u@3u~hF$+X zXal7%bV1klShG=9hgSzU*xY{ln?~c-NBhE7ldbK(bm*7#d;oaRplD5Xa4}wS07fFag7QT0Wz0S>H`#)zm*C;0iu`wl?omK@|PW!3LSsRR-Cgk%aYY* zx8jLpf~TuI6D$$MYE!TN9o(&D67*&rrb!X}tLoPwd~1!r^MH%L)52&yXE=Cb*SBrI zhNY*b+Y_tl?4VW6*1v9kKHD*UqdS?d3RV^|M_a;}#%dCs!DBvY! z8raZP?O5vwb_{>)a49bSKzuI!M~8<)-?x_b{D};C=qjHe&*-jxq#u~E7|G$#*w;Xc zn0$-8_ePx#Z$8|9BGI=;(62tboFR@q^kZ9-FnWE;5j>2zRewVHXX5ue;y#=lGU)F9 z9~5j}uq-R*vEC7o=FNHl7o`O>eXhaD$l|y@M*phg2^;-=9X#d{W?3w zmBvCq!f9)gFrMeM^{2lb;f6&PJfV+z^O;f@7**R_-9G!(W;hV_bARZFdZ&iolV~87 z1N=Cd=BR&+-&kuZ@V58rQQ3)Rc?h)7T99 z)5*c1)i)Qpf~&CKef`Zq=(A_gWq@*yBh@m{uTgL63mgwPtX-?Pl$G90;uZ9POk1$j z=>Lq3(a=8tNJ@l9kdDisRfDzz($itaHqMi<==^^I3m2A=Hdw=i#gP@! zn~Hxn0Pq@@*90|Lyx4YPK=VXiw4FU3xowqYwqGpE6uOL%#S-#}EcgHy1{aQBUN5PG z$*0VUMQz_~bsY4_mrZ9)_o~9A5@oR5QFG3un08(0foxgOA|Xf1|5ftOrt`UIvC@5` zO?k$OjL##dEJeE3wlZ)P2Ol-{*C`9mJ@|iw7|={}-{1y0*JFrb$F0@X0BLH!ohlD- zXi|ElM#6g}PQRHWAoQ3s&IHoZPbk2=1`FgBB;!Y+vN%I7{klDc3ysK|cEYR`1rI(! zN2##bL=k(~Ro!Pxi&$C6fB#FIq-!Ce%E@i$7q|N>t(0+~Oh;W2{wNm;uT*RoQ9D2h$B%hXL$|Xt<0wEna1Wl)c?3;P{z>@X44$|;qZLh*1G#aJvKHv z2PSH)9kq?hcs74sr)Ua|un^~zMjw3d^HIjENUvg0_vf6mdY*b8Jo5~KV7cTF%)Trv()zL)w4DF zX&Pe9(E&}X{;#PuiJ9bnYJJ-4VgArD>WS@fX2ie&;2X%@L3e|T;g9_hpFe0rbO0KO zuJln`2h5GPq)`f2gDt`}8hOuRfszN;IHGf!CemHloJYfE=)FF*84 zXX2wzoS#F=?CsJ?;J-wa7ZnjZNR0)|U3N5X5P`|;pa$Yzj2&5Un9oPRQ6x2=ErBuU zFB8~7r3;zQn_tuI5Xk_){5YZzxjjaIl`vYn7&(D^NU6~@_Oql(_Cu^pD| z5fVan4l4{F-C3WXK-@c<<}uZD&b`9Dc+UUz5dMYii0h#Yd5@sPUlpHVi@B3QKsiZ~ zOqM`Ma0Fkn7%J)I&5ag57IeHXf)rA_IEOnw|Kq^pXx-1TXT`IeB?-bz$)uDdpC)r$ zf46z{UkpRCzn5{13KRh|ml4AX6aqFjlYy5hmuZ~}4}V2c&z!oO*R+$&cCtH@&Llm^ z5^b~5!=>ciY<_(Kf|4zdoNP}59|Az&!$&Y!Y!|`e-HYJD_vZe^>TMJ+c)+qC89)Rs-l7K?^Irr%vNpD=MRdR_44ogKSmR) zw{fuGoPT9eBv8LELzc*F;fIn5$w~j0fG1~viRkn%5K{>&cK6LeSEX*YOJ7Ez*YA`Q zRM&STehH!g^?~thq9zDf7$t+E?YhptD%v=;Cu5dzG3*0%oWU`9>b*1h`poX_e(8(E zQ_Y7zX=1IL+-T)|$=$b9U19W^_LgXL;d7ZV34bp7JY-=Qk+r;cp@6t848{Y6k2aL) z-&B8aWBhA)d_ay()t$+NDOQQc*Q9)#LbU%{9g9RAU+V&UP|Jyrr zv)UW|koRi!Bd0OMaVV!DzHJJOR>-|uU=@V!14hivCG^Rgl7zd1?$zBsH=TM31-jqe zyuZG4dyM<1XzM*VsVh~U{p~1Cl~=AP6Bb27O~$S!n{qBMLb4cx{bT40Ue$!~Q~r0(rvU!Ktrj zk@qFUB@OW!lq?M#P~~iXuJPIrV=t%AzXx5Q=U-`vy$S{*f}6}dxj75z5bLalL)RD1 z#52ic!jHMZ3Jtg|(@UMqxPRN(eB6;YJF;9D1&AFSCSF8V0xw_^m>q=5M*pcJ#(-;v zNiZ}eNy-ZM*LJJVX?)7aFkk1r(cc&m6QS58Jf{s++iaDa8sY?E=>RiNG0!V#Ay9mN zL8JNELLL^LS;(%<4KGt#B)m_=PH>(Mj~oY1rbo+yKWg(L3=q>TB~m)5avnNlxRqA2L1A+Kh+J@VHA0Jr4cNd^ju$CI0y&K!UJ^2vmo5o>$OYk` zZjFz!mFu+Utfz3ti;;++cuQsQQ3aH9zr%(|#-Uf_&gL%P4}T98TCueN3nzC3j81BX zw%t8-zH8%n1`pXYit1Gjuma4`)q#@j#o%kPfkLO8052HlgQ=eIF1kXd;FhoKpBwsq z8rzEQf=Z)`cH8LhwhVFNLP*abd?ccuMwf>n+;r(Qyx@E+Z1dMCMT0wK+kgu%OkgD3 z#8VcXF_lMcAb+mjnk$S-G^B!NYrWlJ40;;k(J2kiu?dCjrdN4}R}2NZ)?J7G!K9!b z0T$`5g6D?Ye1ZWOO)&t!0S0WItzO78pe%+LiRD?C>IrSIvA{=6r>^GcqkP7*OcrB^&;X_)fW<8H-u#6pp*w31B7c=fnl z{Sjo_^+pL5+}GxGxO;#5aP!pV#rEbmTYp&7*!7=}{{em*9xPQsA=u#4T32kE#U?^XjtS=wW(id zaL$W@pr`dl#DQB92SsJJc1sg^xrT|hqS1%jbs~bt_qTU!IEZ9YY7**qoUJ zm=GK^B|$tV)<3JPJKC~sZa&^Dto>b5(v;}vz&YC4)X(x;Hi!h&)oh|$0qWEg_z zrUk{MPTemAnc5Pttx6ABlcBr^Pk)*pJs!2moi=Ig#A?`j0}eIn5@)=jkbME0FQ}dr z9O;m3r8(^H$K)OW8Rs(#`r_c!Q5^UB%D_{>w-i^f9Voe2Qjta}#^p5@1T2vULsW zbEr>n1d0b3G$#tmEJx>a@dMPSx^n2uZoAr3W~MAF&vl4oB;HkBxn+M_a+pWw7BX_H z3Gj?F2r4(ucl4!b>u7K=QzjiEraSFx18(BDF2IqtBGR!O0kXEe4Sz3-j?c^=Ys|`!C|c)L5*@Ly zZC>taG^lE(+)y)-Mn7n74z-x8Aw~7>L>r+uB2af_35SDFU)ng0Sjyv>QI|X`g1s;u zUV7HvH zs0t-Un{b`5IFu8+iYUEm*O;lX7o0MO4Hx4sj3JC>t;DvX&XejaNO^WeuKr9TFuSkT zb@4)!mG4zC&em95F^gh%hix2HU!0d5sR}56D!EiwFW}*7o0m+Z(%13@_K;N6m~VSo z58u~40^4bLLJf8$acB<|zbr~bFcu{&++iF%Sh}{s2|3h^S&1Z87u_L^Tidh^b(Bw- zXJ1aHY5E?sx7{q&YR$qp8H)q*i1qSC1&X~CLvq`>P6@W%+ScTS%jvWa3A5~15ICHF zsk!a?o9hUn9E*{tV7W|3A&RZ78Bu~y0NY4v+KDINC*Z36!ZjmM z8jA{5+E!vc3+l%m^G4+NLy);B{G^d(_4ND=4;G@|xM2M--2 zhrG29kg^;5)AYIyv(FKO-LH9V=i8O>=GWRR!{FP};LcI=?~`-Hrj1 zA5SK02}aG}>l~R-tpVg?4TFn^&$c+eT|pUHz@d`CRr%-{CV?C{xVA|H1u{6@n{!( z(wo>t=QgT0}ZzGK?4NV(~RtUnVkWE|+1bgVuCS_5D)D zfk8nS^qaDyQQ38S^A5&w7-Y1%GkH@NH2ty7cAM*)t6O@l%DXmepK0CpQYOK^>*?+8 zayk7!Z??O#GR3>gU)MjcK1AtU-KB_`)+szg7KRb23zs0S3i$#Mxwjjy3XlVTM#=wX z2AjU$bw8|Dhr@wEq1ZS?L4NeuF^GQTCmU1kR@)5y(!*m& z6KIFRg^G}gr;B`h@%2}}C}8sE1!pQv76-d@yHHFEELqj!_TpdEQXgxrA_-?5*?%cT zI-4izCdp&K(3ao}Xj^K0ieO)VmrqXO7+wnnWLQPW&^b;cp|V9vp88~4Ij2&q|KdP^ z9)S+_!>tfOaPy1Xr2?JdUT zmUG`4OVQ5+#^S48ED{zUS!tP`CH^057ucSMx~z8j5IU@yngWvG6Eg&Vxiv}#jqJ-L zZp}URT6S$SOnS3QLL4Yh89JXeY0PAJk~9N4r7Ys=C6OGF?5I_Ukd6)55}$)Hu9=uH z=|sQPXH%K1GhQ@jk60?ASKKpy-FZN7H1sM7kgC)BlQmsQNxX*JS3R|MS_Jp|dTeQ7mhu_o zuNKY-(kC7Z=U+ay*Iw-tsDmRXZy;TD82o1NCJMK5Jrj)T1~dKO#CGHMk<|FjUhSbA z*-~x(j7c8i7X)DfA}>7QO%0@xLnUIZS#9}`JAh&`2D-rw87&We**_P|Uz!=%R7mCtx}1%u#c^_hKT7kI)j? zP0@IJJPk)MLIUt7e*ggv@N}Z2Q~%)kC6q`x1>4z#QNWs_F<*+Zg%fSYyAzeBL|pAY zWj8b`_OMZSk7Z(iXe*3)RU;9lEKK#=Z8z&96CFq923EUE?q$H$WvjBh4w*10Rf`r7{{Lg zIRSn0jmaNIX?WO_`Nl~{9q+;pMz7+ z51akmz7)Y1N;n{`^9-E>*Ixwt)F($!Ph zZ<<|Chi+HbW&KD8Qvi@vp|%ay2_){cB4y%qqzso}BAO$Z5HYD^bA(6ps(e`Rd6#vc zrYw=yYE;yDnF!H-8swGYP~n z@L3{*u^oT-TvQ5T6ND)^2>=#wBT%D?T+Xvj5pAo$1dKD$o4Wc$7i$QqA?1K+gF~Vh z)1Fee6_Y1s+*nwW<(`Pk$JP)aD#=`^}JV(l%V&Tw%UVdD=H+gU7bZpRaq>O~;Q3 z`4y1I!f}Xso?0a^QZDNxWgXn@F>GHDd0%M`zlW4J`JQk}P#+?MC~QqACt(*z7-5pJ z;--8Q80Bp<4L)!!m+=^UsG1N7)-&8#wUAbO_+%I_-FiG@dOS{@Yt zoB$+CqN8qxIEF%B>}L%^vjTP>Tk2TUr%ZKqdcdCghoZZU}>)rZ73`T(9p}*Jl*Ht9x8Il8Dgm9;#Arh-y1-onwvIY_smY4LbUeu!4n4 z9|8typ$PcgqJNK@{|&q}od*e!@$a2OzZ|Ku$E>V1_PWFtHEiQ1K8EC~t~r!;GNATq ziP+3&m$hw$HHLl!87dYcCQO4)(tX#}_I>Aui)O2E8quSAW;N7RgVLU`=;KFdXeeX) zI+XIT-5a_lvM#r+X(B)afbDeOWp>QL>!!wPIJ6VsOn`FYF~7~yhV9_hcrZ8}27^{f); z!g|P?QW@O_UD8f)gg1EHb`S(>>Mlo?!w-yRqpmmO2^7>6sz3k@CrOBH7>LoU>(z_D z0WztEnwKHH3Kf@8>H`!3G?x*c0xFkvy$TWtA|-XhfTY{9myf*)G*0-DXEU0RI1y~N zT+b+tNXC?u)8Y_3b>2Qy#n7s3SS&ml3`SB!4{W=PV5#TD5|`5B{XRO62=jQIV01rEsOWYBA_; zQ8jRE0XnB_%QBL(%%%_^Oy*( z!G3tt@X=27gYM;4!&~VYO48uAu`9j*qH}PeZ`!buyE)4OSy|De_s!OIQ-77x-GeW( z$MC>I3(kXcFVW%=4E_s<5HmnQ9_7?Lo8b^%!r>vgeSjWHFo**jw#A*aBOgTLg+ow< zUPla0*uxZam;yK4jet^G4^rE4vF^IF1P2+v}F<_!0M%Q8+_&JF=|zfmg$&c-H((l#5WbJ1+sQ9=nL;LAJ@&aGR`(Y<U z?LE-!dDTqbM>H92&{O_9LguFgy%=+XY$lzV0XFzp1|V6Im}5$UA#Si`{#$>&X+$;W+j-Kj;Vqr2=%waBzof*e3v|{3Ii zWDvQ}JnP@)&nK74!3rCHa4{BSXT^ldBqD;3J+USC7;4T~{$j`i!=E55?5FS4P8F41 zgRDX5QnBCD;DSfGJByrv-yKC{MNXkXI~G`|E8U5p0V2+T1`mk%tFhFe8^7JF6W>jR zN7cRWe$g%*VZQDfRhr&$;>f>7==QyU{pR(5#r2z4zg)e(wB0B! zelw*Qcdu1lRO%o3sAC)*91ZvH_X_?y5h|}te6q9iL6_;Q{11o=} zSW9!;HW0q&SLjI1STOM*3A!gc4^J{l(}|V#&~!311zVg@gi2D0J^l0D#e$T`P;#1H z1P}zV-@ZR6oZZjD+4Zx~k5|iQ=dU6?CUYoynMQv7$G!h|1QOJiHbul1>a!v&c z*LSww(2CPZ2pO1%)>KVFF7SWvT$H)Dpk}{)N?)y50s=k!C44xgq(~0qhCBmtClmx_ zwHg6x+N?DjQz4+1-sRvti_e6zUU;>^+L2C%YG?O&PAq#ZVtK?_QOaT|d+fRWI*DDe zIMm%PM4iOWLBcx-1$+SO>kQ{$@|xC4P{U6Pk7Mt)g@UxXF&)%3C^&yKbGE+f12*0rfo&lwDm4; z3tRbD)}OVubOIf0X}ilJl4Se@{oyo^ARiAGduZs@(4&tC{gJ>EA>%?n8F!HANivK( zOdu7Y!Lxlt(c&#-iE)4VFMTD1Vrf>ifV$znL+|6W^&h+~T+r?w&iuYCe}CiWF3xe& zA4TQES80f>Xy~jJ*%Iv(ql{_oW6q*DdNOjM7Nvb|dP^&)^&rHJuAHb)d+*m@Xc^VP z5s*&6ajy<7fX}2j#QR;A8`3W2ER07b2{BM3`xHjuq+b)3?lphAzip3rR>myleMN!O zIGx*Rf&~-u6dO!MQ>x~$WebUkb+Gvbv4=rp%)ZM`)wo158GYY^&QCTYE;y5k8pR&< zA1pkf9Gb@E8P@oXtqm3Vm1(o0Y#1Fs$(FZ(dRWxmmsHdRn z6iQlO0E>z~@r(#~i}eITBY|*B&M#eyh&9t%4{hyy=8WBugx%V=zPiD(rzF$aL}EnEcR~|JzDq7I-y^Ry=i~XacoTcGzs*st;{zcq`RtXy9oHMwwnv=k3{4K}cC52IqaOvikA;_Slg_GyT|+ud9`Lc;Z|x zBnzcJuz#XM=#IWzhnhvuM+dZ|wAH=i63{(2SzdozR|UE7X^2^vPZz;3W?T;-9tjE+ zvn1*bn7hCQX}A7<<{oy9tHpSKv$TST(ZbsAsj`jBN$l)*wB$P-s1ym7s!^A=-EARj zZQb}Q3AFykN882#d!%&l?KpSrt6z{G5}{z~gM19!!i$lVP~Ad~4n??!LeJOi6fGLtxRH}+9h zA93EI+dj~PoERfxEFWn`{)!#@a0ZT5?=iPAHvlHSpa}K>?`62bT`UB?|ttu*uvdQ71t+qGzYv3a@T=Elt+lZOYXq_lgqARQ|R@atBp( zW%3dXh&EI4fkO~gs)&|CCpYwdTiezSSY|^n%tPVs6^ib+IQB5v8p}<@JNu1euXnHD z2@=tK*AR0MTvKh}iRZ-KWpPD|)Q3xP8x+AV7ZQj20ECg$ECgt76XfDx+soy%e*s|&FPoQfjS3V2 zHkSdS2o(V~m$5$qDSx$C-*ekG5`Onzp~<~aod^L4f*>{1n{gT^aVECsY~9^M+tDx- zB=JlVEJ>xx-9!KN?gA7=S+IQeG*1MH#bU8PzWqQtT8-%F!x`R}O zN3-RKg@Q!VAB7?yejrD)#pq`*DHr2O;74A&Ryc^gLbYo>o`3k#TQvRDH#?UmdHx!P zg6|fBd{T}%waumfv5z1c#QZPtGKtM#_3F0wMoU#fS)L*ED;Ipj_iS)G-ud9qlzw8s$% zI6J9a5;jQDq0VBHw^^0D-QmZC#l2>zgMf?2>R{sYfPY9CKCmCk;cj+wd;Z~KesgbB~Y_!Q%a? zK%~c+H}6Gs7!``X!>Gh0@H>?G--9&|YR@M^_Q765jnwmX(ySk|#ovie;e;`uk}jLJ z-lVO9B7gTq;OP?LV@BB$pTeRWegLeJ-ljmr`eGnL)mB0;I{{rzR8h4k*D3jmW0j7X z2j$hERilZu;|P?{_lfoU+G=241zIB5r>T;0hXz_VnTb zN>L)B{``M;Cn5N~PY6c+;I&oyr8^Ri7iyV6B7eg^?1^}?SiqLzbUcqN7{n8b96-tJ zx~VKGC#~wv-0IG@O_ne0u=&=ss&Ioe^a9?)3FXw)kT%7 zt=kcXJjnkOp7E5}FJ4~G0B?Ya|FJbKy%eEzos=u}WJR02-lLH8u9EtG)79pcfrdZE zf&o6a|5f?v^5YUviFX+uy`=hXFa>aD`E>EYK=;Mxf9K*u@DE~yW^6w`cyfgUZhx?B z>jcIyG+r1`>S9~CawP}}jryW#l5J(e5!js!OU6MzA?*7)Sy&UYGSzjh($+RuoGBMM z@S?7Uu=&XNu!yj;qMvO`wJkuUNz>voAcaKI#u&}Q#Nk43^qr-B|Atvf)vDwKKD!*bfzWR7`b@6JKU#D-0Phd0LOC$|m z4$Wzi+}nn2@@&Airij^rhky4WGxh3Pm+BRcX%E!!`Jh4(6=Pu=lo32P+_}|drmgs` zwyhv(cCyxmV9$ZG&TH##TbG|R%fYwL0QeWttAC9nA8B_sgl^iA;X74z@E;A}|GVP) zFgy>)uoKiH$npJY2DLSvI#Z34Xulc$wtx#qs*bt;zU#{4u1lU^y?=lUGWe^*LW$pn z<Iz;lorszNPX0f75?$a;@X-hH~9U0z?#e$+O}CI)wk`WUKyJLdu8MtIh7vWa zU55{c-2#6QfPwR$=6^rkT+eQAKD(K1OyWKJH9TgjOY;j3E;-X&CkyieL7hS~>n7N= zO29|m8=Y#%CqAA?>h;%Cv^<1rcyQyMnS(RxEug#F8?AjeS88|yui-Q{mSA&0MrEd# z_ItZq4@a|Kb_-RRe90AB%Nh3!*M(W%PNF(6zte}SmhRh3Kv?$4FnM29chq-Nt?C2|;(&$ah*BM3cI0?hz@fQp;nNa5d0fQdaS=n+ zQlN^^?SK|UyT8$}`alW@#Gl1IfclqljS3V2HCI=~hy;w_g+c*-w=U3=9 z)QkxeAi#(BWIGv`r{XwOmNQeev*n^BNaBVfReab^=CFT#yU`#;DwLg6?asj#&}^cC z?ytXY(3`9$-sI|yckp{Ldvp40;7vGZu~K3(TTQr#n26#@pd=GAoXnP!e>#79Je>Y( z_FMPj>90Z!-r_8O^5Kcm{xpq*qsuBS@~P{K(21DG_z8{!=O&qg*d(0GGr=$;H~EU^@mv?A8yY77+W+@ zOnFiN2tTDcZa7bCxn9(?3LVTaiaA1>7T`81v2|!Gm^#+e+&Ce}h(fqqI{fz5@H)X&i z0F=C`Xp!Fy^0NiLv9Zwp@ag*P^*MVH+O9>a%VQ=*_~Y14mdkOh`LMg7!_U?8#lvNh z*ZR4B&}BIubnZn=MygvnA6-}o7VbgZU-&73z`cBb+7LJ<=JvQpQh8`@c-+fhei_|4 zY+Q9Icn1EDxI@86atQ2NBZ_$BEQ;+e)6Y1;Fk^goFbN&K)T@egR;_mqHljinhWwSC z2+q7canzfnCR=H~$eN`l3s+^b+g!XqzhfIlpyDy)OeBY(x~HuzlUfs^R&bQE*wW-C zDL*%VmE~5W_@Albfz#BW^;Ktwz#Fo?>jM`7a}P-Mf57%0Z3y{lK=?eeWk3Mi8|HeI z@s-`&_h&^1_eZqcZO!wX=nS*mcV?TkBFTXYciIODO}Fr?r1Nh>tuVj4J@#I{D0Ncl z6XLE4=Gs1~>9^FbiLy6j;BA3R(Rvl3B(Vs8)K4_ura9V2SySoKeN3x#o@six(g{$a zZc%H1f%3a1t@Yh5DJy-}A?<8z2lYmeW;ka`1pVUoR#%HM-5n_wF^4G0RzEMm)zWja zB46tg$K0u!9bvgB>xxA62D}DHU8eb(Bn$8;l5bgL;7b|AEd#-(A-u5|W=BTr#8f zgt&)t<>J#OrTBq*;5&;1y%Pu%x)f6$rM*Q+faL{$waO-U z>vXFbl9qDLk97q?DkjvREqEz<0#F%uUEq#r%=I}ocn4^$fe>x_VcHt>YXkDfv@G&1 zjw91qfd)alOp`fyGi%efF4`hZxE{41xXiVxf0`H3>i5zkg5CRg*7jQx8yXi7q8FgGvEp1|7JQu1K2> z1Bz8$LXKGzL@V%kR~Dny;xUDg+8Sz^A#LZz;W)6c3tL16RMikPx%Kt(dm7T{<%}BX z&<2p2ec9<_J`a5s3BT8>Ngi9D#C~_f@a>&L?jH@hH4;%=U|@-mChL@cIMO~#D*FAZ z%i@G;cxoT*bI#z}Zf)T91yuF}-_joU&JBPMAkILTdPy3OX<`FIKQG$I> z`tka@O|ZjIp4WqZ1xX*m)uGhT&f@;?v8kLmxV(RhTRjJ2fHsML2p{D)1u`U#fP|aU z+=)=5z0vh4Q+3xFRY2R5uiYUj)9G!o#xGL~^4RSi30hB{?{=9@`a5Wypf3HN)AlVi zl&4Q=wycpsm)Ks8Q7)mH3SA% zAhAt1nK@`myX%jCB|i*6Q-4E}$<~UX-)pk^Z{WKlO^gJ>2xPzDv=yCpN1v5&&)X!+ zsPHdN7rim$(SEWjwSM_5O0htSAO6NM_N`|0(_F}c{bz_X$^vs71++G&TPs{ip&- z3L?7jEwLN&!?x)MJzIcrwfr-QRtbKVG>W#FL@C~@mSwW4?RQTQwNO21mC}PAXTp7t zNvJgtWfp}NUcQJ1TJL6W{tMocxk;CCjS3V2Hw5K?6+@y8VCQc7so*zxY78{CG0Ln}H=Q{&Hl*rOboGup$1O~vY-^_r{ zu4Z(0@`#T9kIo)Fd7-iyVCW(}ZXR2EoT`Vk6CN#PUjMg8=g-=v z)3@D}@>2%J5?kUHbfjeThb}uZvhmO@Vn!tqjKLr$l;>aJ7r@s$UBgXafhooW$+#SO z#fd4_%cCEjz6-_;=C9j-=E~bOjqGOaE!vvS`sIz)CSHJknQTC(Qz{dJ&`eJ8W+$1; zNuH`LIq{Aoz;m)p3~lt@YBVYM?$o^kC`G;>DleObzJ1>m=5AUoj0z%m(NZ`;`~da_4EaQ8A&MLUU0c-%C2e~ zFqjZY1o7erdnk}P6u?RCW4&@g1x|r6lSn7LTff*;br)C7B+J{22S$3Jy&q4VoDoIy zeI1_`ovCimtvh#G2a>3aKkU?>;jq>`>VUa7 zXqMJ|0DFi$kG^w%mb-D5^C)hB84k?cgIkPqB6nIwE{=aXKl|?e>+kOc2ysw*ieyTR z&im!~?VCxlQj(u*7P#Q!Zm;&^K%|J61gyI97EP$S7kxEV{OBATlcZ<3(b)^kBOvZWi403Fz1IZxYsY!k&^p_}-vgBcS%3<8w9SaJPVnMN5 zZ;%=M0I_Ts?rAx|6--u59JH7KxFn-!asUmA5@&G*Uwb8B|UO!VnTS%Lggw zK(nEqh2Yp%9)40wdk?t}Yq-`nG7{%U->ac^et#M6?9OK z!=i`)&sJ4wJ*CkfH<0)zYdGLf=DiZE{&-&6$4_EV{&A!>wWpb^}vlh%KuvAVDvXuo0|xfGE&z*quX^#pY^>8$&=|gcb|OC%=Jj z%w?8C_Z8}DzwqwUZpFBg><+gT*7q?7JzS)Jkh;Xb?BQZ3(5s>e9!~#14`1ku%~ik$ zP;j$Fhb@oO6)A%XEKzD7^h4!{sCliAYrWFVbg2h=R><`*2hG7J%)!$C&m60&*}AF^iUNwDAzovr5R7E+AWyG?^)7oK-&CD`w=Rr- z%m0Y*DWL>_i+(N}c~*Qf%D%>z)<&1E$iU7w!(>^N8u(KxcSRLW?zO}Cd7S}s=EYk%E=>4(eEhsH`E(*Fbx$Yw4_O)?YKn!c16dvlJ6I_Z4jiIvnh$=; zR-g1^-wL~$kkWv-boh3H-#4zOz)`q=*nb!uPw_cy5q&=>c=QsbV`|%>;IIf!15kHb zKjSpXTzPtnuF23T!p56^U(W@8nEq`B+TUH!;qm_OS?e^neQ_DHyZ6S@88K5)Y#VY@gWA&MLM;~E0grNWemF6qY>v#E}IFZHw7MEK*u8|tboCVi@ZjG(@QE!+n~Uqf!dVY|nE z#;0f)RGp`XWNLLF@7k>hxZ*--1iq$cxQ~mv={9Sx@Wvs=Epz6cziYPSo$d`M|yunsao#oMc%*G{N%$)$!S*zW~`b zgaVgwjS3W(AmR!Y0yQ+3VT=SRf5lkaZrnByea}}c&=+kG(ITm9&;+oZ#ApFK25jV| zDHgOudj+o~SESZ!^yfRn(P}T19Xk!0m(_^38P1%UGumKsGYKXquY$ej(dDayPfnkRm*%jY2r!wo~p|?Zy)C4#pBsx3H*Eb*|a| zorCSG_%dNpDkrdq$tGi+1s`201#nMfB!F2uwS=^E(y957P5d0{2D~T2c6T4 zkZ)*#2!wzczNcd^fRgbf?hSh+etTB!#7`9vixAY-P3=<@cf%dVEa5{GmujZko6%?s z76ik(O51tkTwIv9W5)vCI0WjO$I6&xT&&mmR|>&1avlUIP6qWSf2*U}jkX5{fhroEj;u&-^px&Y*eFz{;J zeGf8EcW>uL=4uM3e=c#erjaX323_N8f|$Sz#Th$SmIjN4M(W0r&{6K~2SQ{C6LIp= z$TIT0lz@vQ+x7hA9PA8b?CBL&h5BYpZ=A6#&7Kc{G#!n<)8j%N%7`wDBRP6&uId|I zK)?VzYolO|z9-u`q(B<)*}i+YOcFXA1$Q_KWlc{zcQekle=QB&bY-Ej9;BIPN~lx) z8H)w2Y_2z3$AS?@ERCL<7XEtq6E_e^=G~X5UZlYqI5ccJ!mDm`fS)D|!J_-p&c}@7 z5HcyFZ6;cmE~D@48{!dy7YK#EYjv)yE_z~dbqi-&T{XCAi3P!tGQ3>3O-0j$M-X~EiXM+h zN-yEd$H2>ckILM^Gr$kE_{f8e68ZU0NI=astEv#Ke&g*Kx_9a@eg z+RFAMhA5OZIyuZZx!zq2-)uuqbbCRfd4NQ!fGpu!k(3^Op)~8MIwxsOpA)~=w-cy~ zuC)4szJ#1>mXPo8UGX$x@t!Fn7Y-872JDa^lyFX6bLT$WMv^a)EDeT+%>Quq`TXPA zf9d%<{s_BA$p8v;m1C~bsH=r0V0`XB+3M4CnuSXPHS0xbs&B9nPmzA3AC6PL!RhC` z=TyO8%tz7gcjZeW@$XLn{F>vG=qM<9Ty-}jVB>^O$L%PbmU-Kl=GxNhm(p}G`!J-EMAA zm2Jz_Xxjkj-|reWUmT|I#u~DB=*s#oRkt+;%;k%+iX>y(F1KB)pDqNz>p}J(3PE4& z#;w`9!RTKAT!g@zLxni>-`7jEFyH3q;g22q2k5|2=fnCRoz34u!zCur$GiIC6Gwu{ zAf#iY+%1zIFJJuwdA7GdmvM~>6ahGwVORka0yQ|7aefLZf5lj7Z_`K^{@!1aj}D3_ zp3`bX)wa0QrlGz z-klx6)>)|t-m^F?enxkEu#+JXokkBKH(vX zsMt4df4w$%5QA{~rDpu&teg*NM#I_3*O!^BE+CvTd5Nmxe*t%e1OYsLUWXPMkX|4YSZl}FyOI@{ ze^BOtp(yCEee!(vY|!D9p*Zf?+^iL35Xza?RB67_L+(ktq8Bn{m+Ez?WMbFvi7hNR zqG8lh9%K%oM5DMpl2$E06EPHQ#Rb2cAEis8!a;Fa+l(u`o3vhA5ATwto++Ev%Tz(u ze*_-by9+oG?0JiZh({D+Rv-o@G>oA>gopiwA--Ex-fP4`;!Slz)-r?$aBju?6!2iy ztn4J3*nJWZ0vq@sj4(ww6#H^L21KrY5lX!e=ZhD1BrE+T+RJ*nEH>LxRaSDnP;BdN zY>Jy6RH{s6mVQ&yM0I163Zqtcf3Un6e^Lybj1j;?4~2JWlAm4vXAH>{yobHqZk`lb zrs~N(RR~DhKqO@QI-V3;qfnWyOb<}&JQEtXFO7@MlmuA#+R_f4fCDDDcdCu|orrGpe^tKJ zWm|;aEXynz%LMLMZm!*Nt=Xys4S4`)WQ}cO0-`fGe5rTdq_sMS*lHt0hsyDpPIL1& zvvYgsI+gC0=B5Yp^A|q#mziu#Ou`wL?e|%8%X-mPyF^{dCaYbnDu`NaRE<2BhD|1b zZ(eBKZtTGia0*cC0wz;7{4;wJe?LLn@m9A^UoXJKYq?d=hPw`E4t5#M1l&WCQHrP# zPBi*I%Nq+#RStJmd9XG_D8OB9a0(6S!zc=Nm2WacEJSP<7bhC!#~S6&XM@#7pcs<} z=+T(>%2r2lP(El4cz0Twj-Clu7Ll%z!keqw)kw&kpimU!eO#)tY)i-ne=?t3>F)UH z3j{`FS0G+D+3n9(2>$2_5e;G~W_PjVa}h&`=Sr6CexknGMj@u%`zUUoL9o_G#Ki9P zojUjk(j5gnNr-DX{GzG1O>LK6J=ZU_Jkb;&A!za#*{xGkJ4{1l=9fU{CWS*uz1A6& z>BIsd-1H||HyJEgnubaye{EVyQn^C5Z#0U%n!I*kH$Ku2$h(P4c&oBM>w12ZXVY(E zY};wb^H;7p{ypf!ee~r{NcxoM+oX9Lh>dM{6IrXuO3*$X5?d6P&Bj$uSvxg^1&$tc zAsu!h{R8zOdUSst-S@`m1r9jay^cg*!%|(RRVR7tdw7q}ckd4n-7njrVhn{wt>_e=$(4SqF54HUx{IekZNYK`fQL%oK!N zJ=pdL;K9kG|8041H(qZ;9PS4_;n3nkPx2F}#|K~^Al7@HZC#KOeklKqFc*jrXe&vK zqA0S&DcwKya&hz@zzYwqmvM~>6ahGwL2U^X0Wz0ytOP25#aB&l<2Dez@2~JtLL;t7 ziTYTehitmZqCn6BG1^17SkN|OD{DzEDJ4$(=R3opKcOad5M(bFITXp!n|W`>@n}AZ zM_2FSqvyx*yZ4u}7;(-@DaB}fJK{27qLiadrc9*yXgnMJ5&RSWIsSRO>;0vW2U`S_ zc@9hN-7m3!jMEH$c^D)eU3J@YT6%I(pxfYA#8Z~08TmJH*L2!4bVUXis-G{= z*1!P(90<5ewlUKfK~7vWN(%2w7Fnl)%A;61fz?J*F1q zbQ|)2z|b<}v{7B_XIl!mBTV}(6h(lDp4n4^v+!%wZ_+jJ9@C1lEf3<&u>z>NpM6>rX|)R&ng4ZIlXDNTW5 zAMiB5quf6vFBnhL%^_Fj$a$9aX(r>KYh`WN^Vn zV?)n-$pl-|ST!?8y@=<)Jf0mfFvIr*GQ8>*G;%Q)MHW1m7O9LjTg@BQ^+qER1rNr5 zi^|eVC?k*yYnmDTS6>-z4^EOnt-?sk;0}q7bEB79fpiaO0%cwnP_g#K7J zbCebwb9&$x`ww+<7g{G~)Cq%$n;zP-o0T%wmvX2MurvNX;G_fK6fef6I2{|O zDTVQlI10J%Ril_pm2K(T+kUwuQ;p5Q)crTi z^5me`b&l=}xq!c9TP=`u-)G&JN0k0JIIr>LUfGJ~RYOl#ka6(qBZ@v-54?SDCQH}d z)4NDRP)aq$+MA{c?%SMTpjW|u11Fo_;;4kfw=Gq-X+MX0^c;J1angU<^d8j z%~;!R8#fSr_gCm~l}7ZET<#@6f!aZBG$_!ZcKebP1|`wbwyUMUrD8k%`Oa{t%PJc? z3DTxd;tnq}oXeR*rK80t9bKNJN5ALSC#M&x9C6MnrNrp^cEpurqEe$=WlUtn=z2bS zll(pY zE)0EdP0}q+Jm7hwiI4?LGdY^@jAdC)2hGUnxjAx1o*pWnz*belR#7lnm9+JLZOV(s zUC0^ii5CApE=6KoM=k-CITK9aFo%;=dJ*QQG$+dEG$T?WV3r^0If|}i9K1-zeL--Y zc~^I44lWfcu^YeMcpT@69rNUNC~#HA@?7lVc7J~J?54BM4+SpIS)OLwwHO&xDJnH=5&d<|3F0o z@eaZm&0E_v7N_s(c0nS)G_|8)SX%qAozh@tL;iYa8xnNJd)V5sZ<4Kl{3F@Qv;Q(% zQGLdP8o+=unQj(1sPKl_{fnV=EizV#>M&h@^2TXz-Oa)bCM{1TtN6|x8!V53gGI?? zS{_>V&eo75if73)GEs4rd`CZB{oV{Is|r@+e0z#^wO>vs=Vc0(bKcMSmGSlLGZLWq zY6+13FA_k{=ZFyCc&wg(p|C)ggVr(>?;-aW;H-29W)|)Qo#jt6^Q1$!QCaOf926LU zWo#Qzi2zkqa%BuHx`KV^GrA5$W#sTqIQaGQWb`H+z_Z?UK`VRIV-SAm+X#IM(m)Km z?5MT&T=oOB)}gCI{^sTG>NT}(<8JlLV28~!z-fTi*dAoYBgjpEe7!Q=gs>IGZquLx zvJ^1RkqBcG1_8y2>i04OT4^kc&5zhYB8Aqeb zO+63w$BSf1e1RrtDNhzqlhC(lJ5~lxPAM*(r%wzM)SH8UdRzs1G#id>$SV;zP4Jv< z78X0u3ifm)nrbS4TonUw>F~_;^8DwstEaGweD=B6we#|9y}7vsR=9D*1V4ap$x0y) z9|mAwco?Kr(pY#CII2>7T6hxcShzaYxPe@z_YCf-r%tlr6|ju`O+oR(>Gg8j=#F)EkSb)X+~;3AOiG|O_H?3ms2)1A zglZDIR>2Srs^l!@Hb)k^TGx$<*A*%c_w3yl@dtS_f(uuAfi$|H)JCCQ6XFM!5Au24 z>1h*pgak(Eri&6g_~sCzVp4r_R#f1GU1x(U>=;#l$x43IZ`O_R28;ug`3lMW7-al1 z^LpP5sg?@NS$Ibiu;ME!h&>dTrQz9n9oj1t;8oq!Gu!U54?0!*S1i=<>;?Jd+f>ML z1}LDX0S2}Re)WDo<63%YV9j?!F#eUVzN*{P6|`-zM*g+G3gyhMHSB4S2!HZW3yH5?VjLphsvNq1CZI|FC_@5pQeqEIj|a6-Ov*1$(eS9z z@X&Wdwn}&cDgJas6jS+*^#wYdrDBLjqBtaWmdfC*3D$g%%7qy_XioS$t9p{+2gIv* z(GO=YF+YXBWnaSI_@e|)4iUJ=_*=*p0Y!l($#@efWpB}s*C+n~k5MJw3T19&b98c- z`349K0XLUG69*LnHZqrSehMjLM-^^?Ww>c<45~h3eNDzO{%(9Nn<}Q+itLl z>p0IWp3K(_LfEML=XIz#0J&QRjVl zO>jQ|7=bgL58ls04iDAV!=R2&7~xh&)Z$l_*bl*u>;_IbL)GrwaR--zf3U#s6bt_o zSc;IjwYti*N+%&mLlQ-PFF;?%n~S>5)f5P2Kq5HZZOzI_d7KF8KLpW&P~Yn}f|0n0 zz`a?5;8?>a3*A&D8Td6-+J1xgo3*MtD08?flpTPim4krc@ZzK@HZ2@&)RdAwC4M-> z)9EkA&rYUP6dqx0P;pNPe+v@$>{gV4;Ni35L-h6GlvJM)$)eqdgT8T@;($VoNY9Py zEG{uv8jb4_b!`x5<;rdc+ne1OC-@D|Ha1}aB{byYpb{86p7#|va8|gh7=___AEUU( zu3aIjnO)sSVWCfC#2@1D0I)p-5ZbA_)T*`@ra!|il7rvcJhc~Ie_C}rXA88m96xNG zt=2|Wh_kGV!>Spkl2|MKrumKOBk`4OA02dnu7}V=&^?1f;BU#T9ioqKxZo7u}Y%bUB&FR3f7=SXr{j->E(_|~@or&9p; z9}VzFRAF(NPG>b>ZqFYG{^j=MVx^irbyWnk(o_5f@vRX`e?q#}ygi$gaiRJ!N$pg} zm1q`ne^5joq3r&c`1U(Nsn8-PK;%e7&ht(Rc-*N`6b}A0AQ)+2SbBKpx@k80`C_rk znss|g;Gv6EWk6T0aA$D092#GNs5CHpQw|QY7s zM(5Eu77>=;>%50B+IJRZl0!m`b)%+pDirDB_LZkU?JH0`Mj%u6`wTry1p|cYZH0F_ zO=mz6gP;t9JYep!&GVy4i9QMFK$yo5mw1^qMZ8&{e_%*8NEJXV7*7+IK+cC=B@$x? zp6t1d25fX0u&aiiMXSXcnfAsMO5g-+RG`p2Lq^;00M1Ad?b`ovj{|@{LiSAuP(#4q zFc%FT^nfF~w#R6U1|$py=9^R+NsNf#j$!Sk{;rGu=eWSc;Zc($=G^0u=~i|C$;sPd z>kQ)_N0M&h`HLH zHf?XLr~1&W?7QF}kXdQpNDhex>J!q{XlS%IU4>&Nkne2jeTs~W*Ne#dOmJp>hJ(&$ zQ_WULJQ?mb2(QsA+Y7bbRCO~Q4c>0Vn0zc;f721Q1;8PRbG(&fw*+Z0Z<9{dXR z>n2e@>hpRHbv3sWfN#GuEq8I_^I?kr6xQK8j zPj9P&DHQIu@+j+7xvU;33)@q`0w4eNfI{D$zJ9w`sJ~OT^d6sjcSNFF1+aF_%6pzY zNFB4a10do+&Jx@OIn@3UAiU8YsPFy-46PIKmvJBq6ag@oVORkamjzk{D}TLMU2o$y z7JZ*z;ip|WYja47q@)4%A<51RQp`+?O}Z%176BvCv9_{gNb)4X{`tM+r4-8}D@oJ# z#iS_e@_wFsXga%{(b>m0^k6)@dh_;!jAx9IL`pupTFsaY2~XrqNkO=XW>?wl=iqLa?@(kt)993qxc#h9jxP8oux)YPPy=44E$#mo9`^ z)e3Y82UjG54_&e`?YeT`W;WF1AVG#Xwe%UX1Z@RKdT~y5TCS>kqs!EcXOSQ@?mzih zpItYmFljsH6QzhsRDYjHdAo*ag<-I3OufvEP1Vwj1}+gKWNiPGi!w9!KbE?F_PG0g(Q}}pvG+SIxlaV1ApZe9oQRENjOiyl@SS( zs8fPP(>5~__b2^l9&?-Lc~zpL6`_Qp@2&b@Dq9aJNZsKzmP|iAQjz)xqghk5h z7r#6p?b^XdM1vY~RyPJ8QcxDOXmwut*Hu|O;7sGNGIxHj-MQA~t?^siwQl_@z3U{p zuUK#cD8K^!8-G5z{I|7EeU3`h>P9=Ezunni4Ik7Qx+SePTixb2d6Bns9tRKem<0rr z=)xzoGstE*pl5xTI|b}=X3(ZQ)deoK6^>sa$Pknlq<;8vPk;4s=TYQTw4;UV2b@~V zid>i0suq_J9qi2Y0XzB1I}ztNoc?fulS^M(X>Ktj1%D@1rF9I8gR6CI%$S>pk&{WV zs;dpou=BtKPqedh9NdX^(w~Tri0_I9Wd#9iaqa>ccY$+<~b4^PYL+t)Xk$4Er`9`W)1 z>^d)x7=H@Y&-xC#)(z&fE}F{Mi}k*Xa7Lz)jst=SZkw$lN!TMD4G%v{jv}2k-GyW+ znQ&pOZvG2>aA6lDa2VU)j-az(L?pdyd|SY*X~ujMQkbgaC;ttPK6)N-lPK)Zd&)Nn z^iigUZSUp2nM^TtVEbcjW*AgNFH15VWX+|3IDhZV6Aer;LdB~!pG@d|&8=#++4z=b z(INZO_3P@RkG)N_F6VSnROtfWrH>C1wA_ES0)+H0^5(h)z|`4wqgO{0HjE)*`J?5I zu=>Rj3J)k;0LQVjC;-L_^dAV%Vw~|Xpd5Ws57ik{C02y-J+y-}5^RESY6e}swZ#uf z#ebm_cx9Yl9DJt>fB%SqK}b1NKHcBugX@>#ehKd*FtJYbTyj@J4@hkf^38bTlDF|K z8Y!r6%xK=yn)gH<%7ln0{6oo@>-^JX3@GxmnV1|Z_Y8i}2l_P2Y^mFZy~2BA+}#&r z--Ye$90%8h?PRR)Lm?`7g_O++G`ii@wtvf`RLjro%=YY&4!lRdV(i)+Ht%(9c<$+m z)nS*n=F(l{-hHg~c768g^b$7#wYtYmYi*?=DBz0E0syuV9W=V*k)}nSroEfY5x{k- zd=pc@8}1Ks0w|Imce`8v0 z;XdcsvtK~=fW&Fa3JM`&ueD?1#($79)&Sh?K?s_8u19&L1Vo9ayftB#fapUPd8Ju; zy9Eq6MzP~VzUHrU-;g!APg7rL2!G`y?73I?dkv{gwoA=(LrN~JrioB zyN`4!w$^F;zAzh8wi7Bc1=Nd%`}{Xy!L4b>Y=7s9gu`l{ zuw6iP^+1oeavsL^PZT?B^wOiaR3sJ$q^(O=<hH|j!{neZQ1HE7s#g}m)3lsq`myweK6aq3bmvMdy zDSy3LS##Ss5`NFG&?DuwAmZXNv)L-!(RefEs~lyfCc9fIT7)fbC{jaGK4$;?bQ2Io zGLV(nlYOuSfPr%GHt?h%O!$Lo zJouOMZ`b9+|4e^wHo~s3vx|~|!<%~bX@7A%97!sjWVy;}|#GS(t^BvfPdpG0ZNQA<rxe?Rgn*2#eD*Y#VW>g2BQt- z5fwxTPt%WzBEqFlWuKpp6h@k%5tXo&y-*0V$@$gvx7p?K&y$m>jrTAhg44~8Lw~)b zOH-0Sc4%H)PG|4Wug)gtlZ)x(omHgNBSGM|M9OI3sGu% z2jiT$E`6;;4rZmQCaGGgteSn8M`=`8IS`bHP_{S_!gt`d)KO?p!x87)i8B4GvLOqc zs(8|mNj=S+NIx#4sz@I76bb<6?tjq))O=(N#hlhLlqxR{VKMV+bHkAj6m1#`iFCa- zlUu%a%hRWXbMLj{Jg<41#YuE$wJ%1PAGV~(1L~B~QfV`YN*g~SAfelc{`9eX3i!2v zi%R$8@c!`g;l;p zJLiQi@nmCzx3+V9;)-SkD$qs;0_HZ_JpKs&=0T{m3OFDx=Ph~^?-)35@yB;4_zn}U zQ!R|GZLBWXVRdM#tYdXoM}P0HcZ-ZRW=(pUkU>X*+;@q~Kz|v|t(hpi! zIjHkkbzl{%3oh2kAJ!KabZL{v13nH|7fx`aPfhM!|u$35aiSxvJ$!LV zJnFxWvE$@~3vjcan-}T^>VJqpzEU^SrUB z1{+q4PHsCqegk7*3kX~~Ag#|>-@)6AH3d+ge-5e_ZT1hU=lBO4h5|P0djVKNjRF$L z_3-z#7KPl10)OU=C}64<1y&&Z z%Jm#&yD+4!*mT4~L42=QAhs%_T}OpbJ9t|o!)z#gNPm-R4)r1WFFq}>X;GK9wRLQ8 zos<;nl{D3hZZ@jNhtGBOx9IgGkoZgz+*j}tt&*`BWWr`gR=8g1rGqiwBMQi z9Vx@H^M4{)K}z}lPS-HKqp{Y_kJjdrPpIrfw_m{F^5QE=n($sPZYSKP;esK((7&eP zvNzW<$hGX1xIz7zl%GUL=T_aUwCd{z5P=k-TSaM}OwNZciWqZQ`4iT0lJB=-nEq_mb+NdiD_4c5i{or84xbK{O z5@Y!L=Lt4yc(;vIFG!P{0x@R5w8y~_Adf+T=iuPFHsG!lT^~S0<5i2QTKzB{KRi5; z^nVXQYFjDpp1m%_`(TUfF|Z$hc&DQjcM%$YV&S%3cRZWtSykjISy(d-6m#2->DFFqBVH&=>)1@0k3gN8f`BB#&^d|L8`n2q zMgT1H9`L=XH)@l*&J#U2OIFJ$Gk<~PTETV5|G}s{V^ppWA_ei@>9MgZyM*0s>-gmF z=l^*7$tGM-y!4wit{n#mV;KU+6d9CNRzO9GPn)!PV#QF9owuo_)O3>)t3tQ-UE3!a z2DffDeX=*K2;WvUhMvExA+0yLdIX|uq3i1sX9Emzv2FgzU)4Gml7 zq`OHi%b65_xoT_q6?dpq*I_299Ayz0e;jp<2w({m*w~Z?P{w_#Pv+d~teQ;U{0Y=b zgV2|8jS3V3Fff-fa{(up{}BrflQZfnmydG+2$wz*3kQGx7;?zMDBv_mu0Rhc;v8_j zASh&cW9uSo4QX{r`q%dxS`I8}6-DKvA!UhV zV3o^821$|6GH@!Sgn>1RLy?IpyCTCX$D*E*E{86@!nbxx5|4X8iYskq9LvZFJH-H#PP&J@6J_dh>?F~KEixlVk!n@gvm#Qj;v#O7qBTo z)F>;WEHQu|6nxReW` zMQDHIqQO>0Q@lh-fGvg}FarpXSvV-{j?98>#GVul$WhTqM#1MI#~770;2>r%a#6)p z!VXsvAdy2L7*NC-fF4_xJp$g@6(k}T*r)Q26$^&&j*tjW_B>m~5^Rj1%Oy#mVRBWUR6k+0deN?g1cK1>|hZ*TPzyP_V$jv#GXQ4n}OR5?446P78Tu->Up!gte0gW^RD_w^>g(T z9suZfV%rp6ks~c!6b#}B9+3Y%a1ehiX-*z;=j)3Wb5_6179Xm!)6=p-bvA8h&7wN5 z{`LB2`S;y*+up8zsH*ABfoz8mW>|j<8q>(G zuVtm=rJS`pc?lLVqzxE#D=!a7lW?(4Acua^I8t@M`Pft1WB*KFOK_^_03Plq?Kr{i z+*2ASyAEKa16=ixfgWcr>?@waJ&#ElkZ2rp*|g7GHuht#==>gY*|6cMjYIE7W*=%H zop2J}XCEpeU?3ci>zm0`FQ0$iE}Q>i{z47SZN0d;9g}+ow#jLdgga5K1=fW6$mXQk z)7P=Fpv*oz5sMY{Naop&^E1Y%opC*-y$SHh_LO#ny+Wlr;B4N`g`Jan3;jtd<_+2g zqu=p9`dt`~en+D~ZzCgs9z{I16day`brkZ+>*Uh$aJrhc*XxTy-7kNZZ)P`5d;R%r zepxSGOu+KhtL5bO`uQ(s=hbYrTGy*8n_ZmU$G#uK?@P;R3F%$r9KyoGJ^epb+ZGm{ zq=xf;9}C`&z(U?Ip&wVV+2A!=tsr2KdK(9ov(ipP9lZYrM7Wt>l?A#jw&mg8V$X&D zq*c>W-J&JX(%4yo$u56G?yT(oxvE|@ZyE*ke79O(tmNY)eaK9JBIPLr09B zT25Mdv--Sh>zkFnZg1w}3pP)3z9zZd(Wcy|px8`*cmIy&VFHH*xm5ICTNG-h{cc2z!(a}VQ&PJ|#P;|==r_sx;vF)tVrn9!zuaUy;(|Q6Q=(y;={6W zIG8%pC-HG$+VX#F`W#M}?Pv`4ICuP}nf>te$@jl$W;ZTP@>GP`P;t9e~bZ`Z%SuP5z#S+92KEa#_9 z=dVm>Z1&GaHf}JTvGIR93L{)f_~d1G(|;M0k+$o~ZdJL|@Jh4DYk-n$>Y)unqj z^@%fnd@k~V%`_!xl6OYWp3T2MMY*BxBqmaHQYYxE-YHw_WAJz7Jlu3E!mo|l>e>xu zv@p$9?T*)NQ5-qrlNptq&^(6$xK9O|Rpn|rOPGk>n_9V%-$Di!YjuS0rhi-(?aGv! z(Y?STIb;1^rZY}?^z@l~rqL%h24SGI2le_2&>AuAEDN!>JYtB(B<5)+Vrtxq+cPFP zaN?C-nfe|MCX#TV(;(1afr9xM1I42=FhvG>+#Ca)_rO38t|@1`Lb(*`L>gU(r9!sB zP@u}XW8ncSVoHR_dRjbvHveus*QA2v`z+GdE{}OftEx%wguy2XMkx@515wx)0+HMU z1Q10nih#q~>M(M&&3~fGlea1YHfwyo#E-hX_!TES+ucB64dQ8}OraJ~CcyINv+(OB z!fb?v{Lx9s0`{p4*r&I!mok)IKkcg!jIwBs6TX_j6Dux`v08%6=}^Yh)j*&tzdi%N ziUz6X(`iLS7s|dvkWLE)(SySfKs&qm?c3xNxsT+$4QGcXkAEIY8Y&ue6(_8H5)`AECLRyEdqz;WFu+tdJ` zKw!V2-C`M`;-K9st8(Vaa?1n<2KXj!S^4hG&45f;$wuwlN>ppEGzwkYstia3n>@0* zZi@yAn8@=1(>!p0rB3 z<;K6WsHw&%mrIgL{@|wGIasT@aV@+vUf*n;yG2O+W{D!IRK-p0^9=}vWaZ{@0(aUZ3p?-S{#nfSk~M zFX!~l(aGoezvbxFea(GB;ZE}PdCB*@e9;ymW7CIMH9oAipFzyN(W%?T*3@BH&^$C1 zKIcXetsAF*?MS4o##t5g)MyQ>3U@`& z;qo{yHkCEa)i!^Ge~pm%Oy$4h^1e+vNyow_zBp>~;Zf_)x9i=O%^;&=&+C)4wreOa z;qq}yE{no}doTOr<=+eF5LB=%`x9#QKdrHPMegoy!xA6b+-8HS9EYkbLxYt{(KlEU zsu!ItRP9*eBz87z)c4?S25)Jgqf6HV2RVP#y#m(7a@9;LG%Z~J>Ib(~f0&{`kbXAX zEuf~Ywt)fHSElQ}uboO|-}QF{q><=|4A;K4Flsbtw}JEjilj0HN~a`|6c?BzLni-p z`Q(3_B5~!HaUcs6lkv0^mx@XOEPu^dOLN;c5WeSE=tyNOm;eDj(o5yU@uU;Cnb=Ja zZN~$Pki;=XDt!1c{qx<$g0!U2mXju)p11%Oi^V=a&>t;E{^;a|zwoa&~^ZZERBB>ru&iO*En^Xpe z?qy|LW3b{BnaHY#oA1c(JPeprk+ZuZ@v|~-R|N)l5~1k_^bdXJgPXq8|K;n!@Q_TY zFSQRK(=Za^pw}L0r=VS~N*vrcWo~d#w$|CO2=-Oknl?2{raT5RV2` z-23FJDhre`Jvi!W)9!)b#Guddo2*&V0hr=M6zjG@GW1puP3WPSsfSMHB4nZL<8wN6 z8jzf;{dFf6vST{hFUMNLq>OwY_=?5xj_)6H^=U@FH93tx;D5;ExoI*}IftKAdc8D@ zvUm=UN96H92ITQT%Fg2x87AH}b|aq{mO3Q{P2(GIx!Xd8vTI^6QO=1+-;2!6PcTrz zgABs7svDEKlRFCmy~=8;(f&?x)>qb6PspeLWaRDs4qbyO=+)Flzh8eBoBh2ouD|=w z+2C#31(7R-n15(6lGOKYLrt*8)rOdKWoUhqJFsbGiEC?P?37N<&9dzFLSK}&FVCH52z*QOYGG+NnhCK z&T;JkP8b)H-A+-YuXAeW4Y${+lDGw3;;y+ z&N!($7&TZpC5wHzuapVKrP>ro5Nb#uXeI#v>=Z64$ry>`&C2Cdo;6KwC^To7=wvH9 zwry27@7Z?s;oVc}R{YgEI~kW$#Iwmp|Ao z*~-=RsyQ^bJ&jcz`nhSAHjlg%HIxuYx}c?k5El&|6++iVY4fmP zoiN@=Nv5mCDk~20qX$!+`!SPopT=E!oleIw_kYgcPmd0Nn?cEeB&7Sf*GGXfP}Amm zX7*fGDW(Gc<8KT3@zO%{!?wWB6K=Z`CBhbKd%<;%7o)e?+%4HqiSfa}y)IgC*s%YP z1wMRy_v`ruKboE$zZo`w08AY0y4zLL$Xn#)rFJl;HcgWii@nh-6Bb0tGdXx=R%Lbf zdw;DLd*V(;_67INT5Z$<5liaI@TF{sTs90oQ)0nF(f@#0T(0z$8S(|xki;K+P;`8^GJ3DZi1je`FsbTpay-^45%yxOX9vQ{tRVk zNMR8(#dn^}uAY$aasxOYy`P>jiqJ31QGe)xtL>X%A$u0KQf$A3-$rVw4>^sH>j@)8kL`zeZnO~AZf(%c;XbAKV> zfIpHtUzEU70XAIW&kPP(>>X3clCCWP@jJ9RSW-ckvbY?#Vx`7sgw<>^g#Affyw^m) zEAb|?kRGT@o9%`Msez}PNe>XMgVbW?=G_%gJB?SsxvZGwZE8U{K2$q-1m1zb7Bl$1 z-0VA%6$5hH)IL%1mP=Ear@R&A_acv7^+4?M=&{%xaTPKlA}GB9^cWYdKx}axpTGDQ z#mt*9mvJBq6_*ji3KW-~C<7~h#aL}`+cpsX-e2L5%23lHCF*6xfH^^vb?6(Cw8O9s z0WHyvP`wy>NmA_3?~X^wk)b#Z(qbPHQz!CxcYN;dq1@SK=FZMuxO>0HmoFBlGMaJD zVkyP!ay{eHVAGh;p{S<{pI|7^v~t*!>YxpkfSAn$uNXhX71mAu5?8J|M}5e zgn_fgA4k{gsxDNSXp*kF4Guz>&i%WekLEsiom!_|qUUWjzc~_-qm#C(Y1ZwvKH~5m z?O2=!@%`c(s^n~Oj&Hwb5Q?la#H zXxYidIhZMY=QeAvapXCFiUe(~%7*k*jZR6J>L#hPt#JY8Vq9qKgQ}B#Rb@4$3&Z%* z*yN6lQ6+36eBWuRLenTwjYiLW&w*G^MJkpIw&=rfRv%v#cg3Q(yII`a6_a6;jK{+Q zIE2z}RTbN=&C1QxE>XbzQ1pvVep&u>Jf++7SP<@XV<1fIJ?^r9F!0CjE+IHxh$j}& ziAB2;gExVVC``e?Oc=#I!2}Qb?ItaPp|>-9m9>T1F4kS1lV)>(h{8#yAzNf{5Q7KR z2M-w@MU2bvpxtv%grM3Rhinqv5Zw@gOt^xl$Z4;w__nU#K#eRbadE5bQswlr(Cu|) zbfq-q7H6o2-mYkWm#kmk=p2$)r&Gwi$rPSnNE_oob&&D2B&$l2HIN6b-h4fZgad{` zMS|>ay4--y%*gCatF6g4WroEhQ6-|Jwc@-&LvK_1DMuDbTMs~!Cjy&F5KKxXwpa85 zcO3MP$p~VOv5%v^_VMs=spKpgD%EFn4vxk+joV7*GM{XJL9o43<_Jl^y_Yl)uHdG+ zj`!KC;vVB+V2yjAi0>uHsEGdx#bF9+B4)0X{j7IO^x*RC@_6wfX^piv_z$BPiXDp9 z3eqOgP~{~C7p2##++d~jLhj^QqRYlEYAgCZd;iG}bUC+GnKmDxN!N%_5d_Z1Zk59} zSwfF*d!_h)aN{u-N76A31tdA3t7h1Cr1PewcLSu&1fvU8q$KFdRM#{Ssu732#vMhz z=sC2DDXbfe#_{;1QGh4y(U2;63FQ4Aiz&2M52QaZg^n zh&yT4s8#+zPvl^Q^rN9ay#Mp+oj|)1#?%h zC>narMb*`bUYs3YB~{thRnD#_`-li4;C#Ut!zL@LE>9`uiRzjjCp~U9YXy~=gxQ*Y zpIGws*B3*t!ir_k}nkG&;c>Y zalGm>^2tO!BJhDTnwgAmx^p!X3-MBtaQQRlRPefioyrxS_AEA zTGdjY@SSyC71Snfd@N$Gkcdd9QHH03IM0f#rHUM z;F@I8%7goiO{)p)2J!xt$pS@fxB1rrC%kDVp%Mnn8*2Fj3||Nq2Lq=P{iHqO1&#!K zxGn99Cb-cx13`i-2H&S3=A!KaZXn8kn#Pvu<1j^Oe^YHp_Q3U#`w_rnlr?YOe{?6C zm|(saKkm4@Yf@GnpR6+R{mYx7ZNQLJw=tI-L*L@QH&P@*!91~-Sg-5s3jyzsBWTz< zC-wvZusB?n3L0dpzNG_2Pp<9*3=8N$wM_w=z2-(+<+d%QY2PdjokPI04cedtB z2uW3*)1@p?*Z>ymy613}ZNp|sfmAimZ8Pha7)IGV-_?oA8a;ZC03`8yU8BDzBzhE< zy6po&Wi7mS<)G(tbz-d~4C! z#cz}819%_uY?D_jWuZ}R@thlfd-~uuLgg{I1}<|=S$Kx;w(6ys+Dv{Z5@7I<@Ax^- zlhB`_G1gtuj_4w)sLI}8*$?$m|el{CD%|qZtwL0iu z@6+(wI{ah(fyhHeSTx%_o9s)W$0FhFIdkt5Pc!Bcq)wOcXMHJqGH-St*g2N$e>R!P zfCZ51z*t#muZEr%kLJ9-eDNQoYl{k(aUcs7mr?2i6qiT22rHMCFAEZX_(*CGp6q%O z*Sd1p*}ZI1Du{$6u0>J{lJm&^`E;W}jwo}+iS2TwrfLWQAkmMnyT3-b*e$}v&8zV2 zd42op>WxYloU=?RvAEqXxQdv_)FM`r37ITzi^YF}|1W>JeLKE&^(M|HuL!1+1eV<1 zvN|@lyD|^>!1u1+2z9!DJ;_*>sA2oJ%T*k!pe=tj%axQoXtwwifwp$Z1HBYU@YvE+ z-7G~K+|!S;ru`eYqciO#{7ypH)X{>eaiz1RY1wj>Bw28~FI$vovGOvkxMWhsBuS3j z_qyJJAW<3yuos>@u;zb#X-z@DwvDC1X1Rj>rt6HK0D(X{_*v_J1I<*XYV4yQ>ss$j zwH)OFaidHHx-OhZ;Z&Fsln|+MLg3SBg@cWDa=yRE|JoKbn>W=_cje|_==Xiu?P=8Q z4LRY=XIaKlIeOvd;rimEj^km%vP=x`Z2LN2kvSt+Nuy+{LRU65nov2@z%vZ)Bn!b8 zDolgdG*g><+H%x?R#yhBcR4F=5;76V5o7JTuS;-6H794xnHr@;Gb{9KO9y(lnVOE( zMd3UPD_uj%h={X9$*D5>06rBmLU_9`cvB5yS_B35jhiYEjv@|&`+Z5k@~_uLnQK5R z{p|L-8%D-|Ljz+1zWPSpq<9~%17;rEBKvds&>ej5=expIaUA+$DV%?eQc+jABXIMUWq6i}v@@V)B!;sH{?{&Z1yBt6U zpbSR(zcpaHh~|IjAsJnIP=cGz1MGI0ioiTLWJ9FC{^s2!jVSt~R0jLfFSgCL!(;9- zM-gyf_UMy|gW1kc`V1!nt8=r;8$c{M3l|FrQ6Kex;fLY=1t9lQX}Pi2>vt|Z*3SE8 zeO=btKK^u^O;-w%yy7Q?27C^%sazEyFc#nv39xD5?(^IVz&0>=61WQadR z>K$U%*sh&}g;Xqi$}%_ewVQ=%MB>&q71`i_E+X|CsEbMl|Aq8S3s4Q+!kv5>DqJGQ z(=QGcF$b0CYeGeD%0t=t-27ycI5;%Am~%rCvoOtu*Dn}U@;O&T5)3Au$|#oyqytp8 zy{|Df(Ui~Sr^Ow7HkTVXaIn){^N|pbV=#~W;(p^Zev@C*ZCIU4v}&$vUu2^w4UnmS zVFWqS2zkEFUB=Il(Ann6?3E!J-(tN0{^po9v47a?y#b@Uh`}E!2CYVaoUMpR1!WQ_ z$L8WO_uw2dVtj5al$LJ4LV<1Dty-gPjsomy9qrgZ%ZS1h+%b~)f4si2`nX?jw(S~a zt~)WC3V6)YG(O>R+}E~9D3*w`+J+5(ilZjtfoRF72F#V7!(E$!T{v!Co3>qj?=5Nd zQy39Bd`YE9F`n@cRLa*I-Q{~VpW7r;Pq0LVK0-tyh4hYp9uv9OWrw=lLD6_Fm!}Y9 zB023vCLvw>j8fLeo)8xe4CN^eyr@Z*vLuvWMv-rt4d(ynbU8D#m)3Vchev3Cb&uHV zIK{Tu4AglyrUvS>UaqW=zAbSrn+1G5c(0oGUz9e+zZ z+ zklnZ%l|;eK^^Y_UAaMRRz4Q@vC>^hoYJj^6+*QZp0EUwtm7c#yu+A!{S^y~wnRIM5 z10$!j5kNNC_4nIXzX956s#=%PHVYM(@mU2F0y#LBaefLZm!Izf1(zx}3l4u#-Fk78 zpxM$bYtVQdhV3F?WZKpyOM)af$sP9JcMeHevd1)zcX;s@lBEt5Si8T(F?BtGZEE7A~k26gOMF0U`4yFIVjg=-7Y!Oc!{d_~xPZizf}VdI^c413p*p>= zW~}P=Gwj4Z-%h`6H|U_-0y*+zaN~>VEQ#Wvt(p!ulAzFFo~4^OLzWA$*3on(C=ZJK zcjIb%;QtlSl@KKu5V&A`q9JGxNpnV|;A4N%*H znQ)VBV18A*dDXc12}2_2z5y{Mfhrvm(I<35i}~fr)y?%!7xS}k{h`c>7^0s% z;-Hw5G=7?czWw>?)mxt^LXaqyBln=5x8Eo9NFMw z`bokWeUgID^Gyxeb*%64=M!vh0#O7fR~J^VO=Tixk^dS}{wSc*gwQ8?)zBp zSrbG$K8WhII7!4#o3g3yS|6oI5DAbt!b}e>7Ljx~RAyE23A7pwCbKn31_tmT&z229 z6^s}pPMKl3ur0*k8Is4~+&;ar(-x^|c9CjWoR%Y~)ek}qFMPJeuR`u!_!B@rYUpvsnzStNwD zkpOtM({@|$ROyc_wX!ib6A+y9b>7x2P`?$hIzK9qT=FZ7fRe+6%|R z^%_fS!@9|hpJB;{R?|XKv|l*ZZ?`MU6T$4>iys^yCfynH1S{tsMRl~!|HN|lvdvVX zoZx1&s9vn|@s`Iy3?Md+cU54pEf9J0-C-Prdnz*-6AHaEn4Lsv(${mEd|Yix27gF@ zHqR^_U{+4K-|yUh#NV6+cy zr#GLWm3(@vP-(QHI82;YrFI)3#!8fq)r!*8#R?oSv0}gUH%AOEE=fGxb(+%~)nY~T zf*dE5Jyx$N;V~V9X1l%pFiFU*ltla>sP5LfbWSjJ!sIHFFt{dz&aUOoQ-3WqScM+k z?#+!DK!v8gU}rB+yp0%idmBzJKCjQ#JKE&%BNjpwj4?1rd3t@(vmNtGfLS`cmT-Zx<~I z3wJJdbyBzGznxI3cHM@l9A1*QAs zV(udc$j_)4=LG~8$L3R&7VVAT+fp@dSoMva0{8ciAaEHKGC63ktENS8jzhToy6*)) zc*1c9HdR^Wi+*NH51bvp=wKHGXxE!tM0lk(4PxHvL(<+pxaY^xzPP2B1-bFI>}A+H zAW?)Je`t$#{1L1ygny;bZ|Q|bL@xWSo|dm0Hr;EUUo z5ti&~!I6(BU|Pz?B;SDyRrARtp}GpF9@)`e`3Ch9K?FY5aX}*Yq#bd(ck0#r*Cc?N%IbS&FJs zyD1d}3`ImBzzjf3%CArN^Z+ENp{3ONLE>EK>GSLEi5Itvc=72~?0?@~zIyvn=mqC2 z*IFztR|~FU#(BO-v|>V~i_2>9d$iiM4jXR7%~-DFTyseN&UURS?~DzRPIH#0`n!}<7IS{c?`vo0pnW;h;E@wGG-uS8MN?QD zi|D3qtGd0#36JjUVND}gF6<+XyDfNV78zTBQhHijbv7t7R~gf>ekyaZ-G4TZAr7@> zGReNLNq^=E(aHLo?wk407zmD_7B~b(qS8Y(h$Jf7pxX*C0M|ixc+oY<_$k9P6JEeI z@!UNm*inL10;GyF`sRji5TV9 zF${#m1BhRhiwF(@wDf}sT7Q&h;Kb>nHZ~8Nknl>fI8o2|t&-WC)VG(Aa$KLVmW%;p zX8e77F@InKov;`_pLrJEv{Xt&E7A&#B?Uq1g201096+_>W@Xym(9#B7vNZi$f_QYC z9??9L(O2*vT%;X;N7-$*b>qP{o-;Dk8>9+0+yVN-og8uok1VZqV1HMwqJP63J*}Y0 zgEovgOT?t32Lz1Dtm-z1ZK-709=6d@zyeytQD3*E=Vw?OCop)^h2U0h7=YRiaNM<1z zPbZi>1q=c(e^ShE=YPL^4U)>3loL81uJa86^Mn86=G%gK#Eb2yTFI z^0O%se>2P)Jb(9DLnq2xv!|12Bm6CzW|9P^7rS~e7u&-2=BH1#*skCG?fhZ}bl&&f z_kd--6vl}jk+GsJ4;3(?=zziJy0l&2tp+-ORrfn^O}BM1?5f%m^>i#U&U2`#oz`h1 z2)phyZ~{jvGCsT?1jaiam!f-#NsF$i#7CaVZR|f&!5n2TnGr(#SU` zK&Ggh0s!3A2|D^m?@y8eU|{~UtLb1fb|s!vyL`$R?(CbPfZppCpua#-RUAk6YwU<* zHaY?osedrtdy<=a$AHmizcM)jjL8u|f&_BNFP>mg1?^td$l4on4v-5D+8PzG1o3X& zEed?xTBo7Mew;gPWTOJ}nRA%R(?iSQsa5?J{TOm?dWO&*60#wwwihaF;&sT zg$?|2km+xWuo!=8A=pBoy>3{OBp>a*ZW+;ASYT<9w=9(4rgTo8QE1!!^Ar2GPb? zbQjzz!jKU|sXfV2Lc$-g`hv9D)fJ9(^!mi(7vFcPK8sFZf|Ws;`s+-)tr^3=YG zhHAq=5$uU=iq@wN&&AwNZ_Q?3N{hpSnUbih195u|u;||eVA>Zea~gV;#sXwhfIhH@ z#_6p1!v#8KN429ec)DC95? zqR_XFAev;{^9yU6f?l^eOQ-h?(>?`PM!HwzCpEz&ZiBnJ)mg5>4VSBy^W@6`G6cQ? zO2M+!YfdULJN4o6)&BsCfRb64aUcs6m$3>76q8GXEPuUOS##S)5`Oou;3JeWN0HYQTo*sYzHI%%y*?o{O_jLF4@pUttEob5E z@}0OvB)DA_?a5rm zI>;7_;(vq(T~Svwu*&R=3aXmE=J$|GlXujkWh&@ah8ky|u3ox@yWDKLemZllrruVI zd5wph{PXrFpn1*}Qz{~|Ow-g2+^D1s@~py!3KoT3&S91Yz82kz*4TToQJsi5*p~SJ z{$vjSX{`+E2inuE8k4~pi=;=XO3)JDmAO z>rBgV$?3Z&9ZMbrA8OcV*I(|=?^@H*y6Fq4gsG%oM{H}Le1p%Bt=HeEzd+He%21Cu z*Ov3-G3VNGZdU^5mTm0R^ab`UQ}ZNYT249pJ=7r`uOhhhA=|Dy>VTSf*i1mb#K31= zZh!8Urn@V%-CcjRhiA?smLze%3-08gjd7|#8|~Hc5zc@N%Ncz4oWbfGU$-Krcp9^i ziz!>#x<%$gHAr$n-Q~Kzw_;92fGQzWkX4IQs}(R^RP;rWc(~^v!H5sfciEiZU6?j+ zicJS6csNfY5ZAysFdapSW!iJNjF^yvXn(ISu0H!t6e&|O?N#9UDL9J;jXsUgYmhN<5qw=0IlkEHV9iM8cHAk2p3o?S zU{NglOCNl6!OH^id$kFD2PuXPw`lj{$(%=EtX@4#SSaOK4T-?lUiu{C;UE*ROMe*! zuXo-jkxWL9pF}_PB>EYyyU|b#5E~bI3-VWzCSMXlE*`M+&z6hx*`_s zIRK3k34{#OqVgqy$!%!*g6d_^Tsc~g;&E^WVT+t4vZ0*oY^h^aP{fkdl*YgfdQ3#f zgz-J6=&_eaJho(Er1mxpONJ19D1RGJl9(krp3PBxxax((huRuRResAja8UnUu9cItg%esL8T2dE%DSoZPxAS=$-$=HMFO5E zvnn?9sF2=IC{TbQsXOLmQ58K_o+ORPN5WB5%=k!$KL}k$P z;bexkW}P4QP~bPlu69NP1~zNZaO+72B! zw#k9p7K*JmAslf2f(O>6+P&IdN&Eb$IfdLP=Fi$!%px`5--mj=FpW3Wk|4n_8b|J; zD!idvgJJ6-7W6K~(n773-;!!Q=@;7$gfd31J%1O5mdTMuXtLvSlCrM#hQV zJ$^gD9~>f4I)6Bw67R`Q^ONjQM*A6Ti5sHWa0U4Ka5+9Cp_gUve2E!)Ij_(S+})F8|E4`XTnJU+ZVKgJVF|L0esjyH!dkY;`mT$z{P#A z#0iTAI)7>xUieu#bM!wZMBy>p=l{67{`jjm``~P!eINji5iYkjsz>|uLH8-eQCag) z!TZXIus2Onc^y)uSi*;EOVh0!jA-c&3+0diJi)>(`0!v!jtcx1iw`R}1WC03d!QYL zJ}r$}ND5z*4GILkeQ=;fXk^-jVI24_*nkVEw14M|Wf0y!S%K@xJOR z+hgsCH#07ka4$0UcgG$C)Idja9B#Z-DTw7!Bs}rviF72!Dxdz#5)!Gv88S`{l=(+n zY*iB%3B4h5VJD+cnUP~ejluqw9R4EfjN4=@r`Vc;HXM2AcUf#k$IZP!!CI!2v9rvU zI)6y(y~}T~kEv2(W2D4e=$qH;ZCRmf?olv~uEw?0rrl%>Iy0QHejq16jk{#J-vwup zDn51xlt{v|FgzMNbM;oGLKBSUVx+cc(a zZ8iX1S4`J@kTv$gpoN^IU(-J;wkZStiWwBeMuWSeQ+VV`totgWRgr{-?VCwDl$@$N`F#F z903Q7HI0UPBeq*wXmK^n+@oQ9qc#}?qq6e{v^-pCcHpu{JJG%2YU`uDM(G@P?2vaH z(R0|5$phe&djNmpn=p~6|F{PB(sx({-ZcK6A3*RZIjQ?a$LiRi_le-+L(kyv{oC8W zeY`k|osuWX1n3yC5CGOhqImT6*?))2x85v5GZ`h%GC%qC=jQhM>f-G&;K9>J{A1F7 zL>6>*yZk6~4E2=~|ntkZjK+&Hes+JVB=GKXs97|ucW4J|wSbmj9NHc(&Ti{^@-Q!g&6#)u;aAyALcH-3tAL z!->WIZJsbsf0VR@26)LS;2^E4>c) z!3jcAM{m#KTejbQh>}?-d@dw$%Tk}oXtv>V;jlFUS)_p zatKOYe_KDO3Ighykh0Cj+5kXJ<^HYbz}b@aSAV^u#iMhjT!TjlP*?w{lWz7ukYy2v ze$2tEz;q}SiDX_8DfW}F_ogyCDDVQ71jHAUiC3!A)K_8&A4z+S{fImpk|(0|zG{mN ztw~kxptVklD_z!&$~KN2y(K6qrK)SaE+DuTe$>Eg=a?1kpzU0PlCtHXX%C99|!TsS!(?kuDQrVh>cKOSSKdS ze7)VN+Qed3%6QK?q{5RPHN#WgM0+34*3U{(~{+ zkF9Rh<1sU}`svnW$Nlx^t4I8b@SbXAaK*jbR&U68BX8X{bPNQa>6n;D*xBD;bG8fa zfR71>;J{1F&aMs&tdRqMKbd|UI!O@Ge9y6P$q0t&r0nR&)~0CACGTnr437=t{EH@iH0q3nwUhDMECHKCa0Q3Msl z)j`u zUm0DsuI}Yk3E4B!c|#S?rA~&*XjzG6r(j6uHEgK_6IS9U{A^ z!=%?CLY%ju4pG7v{)WI>L*GRTVqs#L8O0*Gl87ODp#z9G^=ypg)!_(LmJ%)i$yX4M zVhk1q*r;x3J=89wohYQ{4=ijhZY}B0R(2$OS=kp;Zj6Bn_Ku?7-j|Aoe?C|S>7Y)1 zeS|JAZ+lW){(JXB8L5!|3&mbk%1RIB_y>@o5 ziLFuJHTBS(+lire2G8|&f6|7SdJCJ8fpsCnuD-pnr1aU?k~e?*y88I^@bi?iW9}!c z?@!)NMzk-uxS;osn_qvKA}3>Co~zrRBlmFg=h<7pUC7j-H|=fEp@}%YApRP!kgWqh z>5FTZ@-A%)DZQ*H;bVt|0ohMPP*I0Nki?GDEH(;5vFyh=bhu|{E!`St!NEWj`z(wE zvIFMkDGVo^_+Wt>gsyTNQoaEX@OLWIW_JJ|;>>F%2NsvnSPK__^ngfEAj@wA`UKsS z?b@Dc|Fb%lwh{muI_v%2iVi+Qeyoa;PCjR@&|BrXtB-A`QOt>LGws}1`?v_aW!Kgj zR1^lO5H3iCnBXxwm1a}Kn#%j$r=p>7(be!?)}-qrKwOTdDX5U$&z{SxqCE+F`G zf}ud4ZFM*q)usD?3kI*1aeal&_bK-t>=0$!A=q7r?wF5w&2m zK5Lp99S4EP!<`e|kz7{h*wfV5dqm-6Lz`DkLrLX6zlY8=b14RCK33bt4Ky*8C_K3- zce=zjAKDwMdEoO7MkL*|*u*P>WRB`GGo{*L4s-|i3VIfQ_mQVkQ${so!#e+~wf%gj z5C$FDr>aH}7=_P;WaNd3cVF4TLz|5DRwLK|!4c90@pl z!trN`pxAp)XUN>t1<(IQlX$(7Q80>gj16F1ewKorxY_tN1REx~HbBtWVTrI1Zpwbxvv5SvlDK zr-ja>8|A=x_PTJ^huz)8laM|f3w3ax>_4EJ*Bf9=OldqyOsVv`?wt;8V#0ryn6O>d z2ZHs{gByAcg2hKw+Pnjpx7m7)76`c42Ufq&eYw$A;}ek5Z7J8cLs?& zgUIviUELl#pLGL+?JVG==jVs&!OSf~rG;v+#}gvIRF4buP90A8*jqlm$Ej(HjB0kNTe+uQ=~2*cHGVV>-`1;Qlz6O&5ARF5rCQb<^g%mgX1~ZXP*6D z-JMgth2zmmRQNVjADLtm6-Ua{VN-LQ09v@F@wWvSPoaY&=PqOMp$SK0I@ z<_vpi+wb@G2i@Y&yLZk~#v%+;e3eit;_KJ zn^BEU^tHBvye&4Qu+2;6O{8-Kw=437 zMQk<*HXFoIvmrO}4I*Vd-qR=>)c%k>-ADLchhKOeNN;hlduWmGyB+HCvh^Tu@?D$77UpF`_+D+fK@L9{KW|%AY znm~H>{&IEB{0MuSDT+@aBFi^A%iCpHR}U-!Yz|r7v}5*6wn5OAGw|69eHnjAL}Nf) zyVp%?Bec_9Q+#H6Q}6bDXMS+3QifxMLVt`9yhlMI$)SJ{M?o@Q4ib?ois2ugA1qXa z>{{y6IM>W(=I*_(V_XfCcKdXuvs%6f0ZdrntGTk{<0G}POO_;`)(7A4c} z76hRPBOlA={@bqG|8Q}^!3=-GKuBNCo!1Um6HoS5qSCwE9>-nuix!FvVsAXe!pXD! ziwM-seLbU~p0QK#`K3OV~vF%vhsn+dj7|K%{gtrr|V+-5U!} zdy$z%o7(s+qf_C_!%pK3ARV#F3lsx`Gg{MBMMz3*l?1E4=7gj5?lprD)R-o` zu=TibP&v@gFvxQgTr(H@>VyG zgj-s^HSYQUB9sVU_m>$Mf?+zqI`OJ z@DvLrBrkFGBwtt%kJS)bp78h=!$zNqDyzx%=WmRU!1vT?U?+c017|j*uXP&8k9EPs z`(lqSW158Te#|rDAjl~R|6!T)Wg^mfnQKw!8rlr)pcN?Zr%RZJ$`MX0n7t3j4Y#3Q z#V}M-`0=ZetlNKd8fHSX+;+@ZGXs;?^k_7e z+DZ9j{DRm?3GV=YK!LxJ!M+!ZIFYXd_`U@C_JW9FEm?)!(;lh z_u=gf5MP>v&?19>0ff0XkArayv|UvBGw>LC?g4eoOa6HL(VK0NKjkfR6g8$ePE7CF zKh1q@P>odH4)xRmKEcj zW2y=*+Q5c?Tkz}9V-r6TeqzhgD$oCE^YVoX)TW~Cnh^sAYy&W7k6rV&w395pxy9q!jtEBo=on6O+1JK!F>`_=lTfG>^(4aN zlJY$R70#4U=Kluj#B0}=aUcs60XUaYJq8p4HZqr?PYEfP55WZpmlR|RFn>G!?u5dMyKBo z-+w*I`+fg&9v*{0;@^iJ^Z1JcGoU90q z$!2|rMk-QNE}mFKdAbU{(^-F>6?OiJ3q3nb*zW4QSoEMz8qN}_o9*FIq_%!*FMT@( zI7-d}Ao)NHN<<|#-UBp8%>tdRdn?xUwmKV+A08f9m8WaADHr3}rf6JjJX?=v{s09W z0HyeXZ7uOYuAE7t zi;}QB!!v&dr6mdXPUVb?E_SQkC$9KVYaPw7(;r$I>?^fWJh?VD= z{tb7J>?NJC-Xsa^4^09fJ6MIpUeDOL3gh17E25OFtU&~ULq@+B)K{a5u>r>~GbCj^ zN6=trwKewaR&~Bz$V6{ny?PZ|MZF?ejhfkA7X7x~!Z)qpo{X#j zT2IR%_yVE<9-ch0+aDhrmw5$yz1!6p4x5Kbe$HkH3Y}pqtEv;^#1m%YxH$s=4Bnz` zx_|&ZvfM@DhY){W3g+FG`HG}?wkHTHEZXszHet=bviT!wa5Ir+9<1p zdL}r9JPl5j9P!Iiw1O6j zubROWtAc-&fDEH2q5D5W50?eJYRIK7vnpQ{)P*dFLy>8Hpwpnoqhzxc-=sAZ*rc`5 zJ)}fl;=cnys-GZ*Wll9901L-3DQWmn`h2d=0Dp*V1R-|z@EwX%%*~MA@a35Eh*0Tk z9f4&=l*GZ-3oPZUSR?X>BV)BcPr#&=%v&Ix~E~8ZZYc9T{zVT)KHn%84ddHE}vm_ z{5h;r?h5L-PpkUuWW=0?AgpB)%`?=lh7T3luJln2q(xTa_8x{_?Vm}Q7xaYk$4^*O z*$s?RQ3tXktx11}TWz*Ygr$xeA}+PQ0njGYQh_&)MEvUQPxmi# zA6t9`n$;MWz%R0T>4VL@A_2uoXiR;mA*kZ}yS&Iq68gVYb+)d0Y%Ah~#fKQfLRLVx z2e|2*Wxh)1*=oDYf%zz1Q-*1K91GFk&iAYXNzhZQqy948g7DxVEVvjd87H0HbV{)iw`g(xHF)rXlHSu>mewf(re+_eq@Nee&4-&S((i5D*Pk8NJOmz&L=n zdh|qkzCiUgc@|RJs4jO^x-mN89LjxxH649V-wujg)ato zR=~Cgcc$@0u_11T;wK#iA2-&YrgN%Ln&8F711cab=itbUeEWYn-b7x(>=83)isVY;W`cneh3q;!*iO?NAJ?l%XwOYB$mKP z)KTq9$}GRpJ0+Ypnm=)gS!S4NXi)ardsB^RSV*lA99&bzfg|=thxXp+FrcDLqc_8W zRKtk)V053__~ceb|K6>$GWS(<+847-`z{oUml*0~m0y&fgYUi@jvZD5$Kn3 zAPW=$IhPT`3KIe{H*rHF@w%e}B zc1nLm@j8r>AWQWldwKpjVKr$m@sn&a^`TF*r>0I+?+L_z9Zjo-skd1N(3_JcHE z`WE(267AhSfY1uxebEonD(Y?9*`eC?ZlvwdNG215xGRRvmZrZTb?4f}K_@Qa{X+quxn>tir^W3DY$# zon}FnXQ|2po&Hxg$(&8znY~J%+9ZEYmG_p;my>OXr7<0Kw8|5YBlq+7mmg$sHvzgA zj+DHBg0U&#V^u@GSqo=poNsjlX+Q-DVjCItdn%ao=YrWV>n&OAQy>`6b|o&tDL2R;1D#S=;MqpT z$ehx6FL7*pD7KCQ58@Hq7#{2d>`LQw`rK5sN9@()W?OS7yU!RP)V|jFi9bbAIQml< zM&3azz0=px2j{Ggq@j5Tu5IHb$WET96Tq)4YEw1I2JAlFJ;e z+qWwQPPRGctVpqzc0v(lP@|+3#j}~A73!`Pw=i8JgxcO4Uw9^+61kF+fc;HI?__V& z%qpvD!TP|OP`n$yZjN+ZXkk8Hx4S>oM}Caez4W=TK!e3iN!*&NN|2!C+I)3ub}f~j zyZ&suS#y@ffh!a$*EoO6#Oy}46H-s$pc=)Bd4(npO?+EJPF~a&#RwwiH(=YBF;^rr z|7mrEerM(cX&Z=1*+88+q$MY3Y}ycJqg}~pO}JzZAd*k)(03n(=*P<(*ZO@ zbeRcQf}uY+>WnZOD<*q!}1?><01 zk~s6pNRvJ>fzHu(th;A(qOiI(^x)NSklJH1PTL@q5jRSV4FG5a{%24>(9`PVi+TwApF6lRgQ}i2JSh0q4hfsVD6+t z#p`FXo14u}LUVt1hKeAGOawupHD;Lnr0qV#^daSEUUx=!p8^#%7C|A@l-J24%oyQ7 z*qOfKU`1`-Rfk?rplTrhzQs-8g@WnlE#pO6Y}8%m^gWBuq$j zQwkS%ofu(w8i9QodjtHATAXGaH$9tAa@Mn|I0@@{?gC0cPF7;s%9<~-GL3Cr1QeJF z?PNFfT#p*HbJFsty5ntxqL=Tk`3y5^|^7`fzu|t-$xp!=khW;DpsmByEzggWTpFjQ^VJDzI9B6?>XI^>L3)yCPJYjK^#1b;d_ zgI_1nS-^^LRz?xsxnMxBOAH$!N<4!R2W#xV4yG3-$&whH_a!PIcze_zeDW68XbJQ} zX5gdb;nDlCsF6(Axw%whbj9=t2U;#wDUW~h!Fr)$ffh@3GUmbqnslI90FS5arB>jK zlxx)IXNe0)!NMG@>>1tpjXrsi1o<>zswq4Z+h2rdj`_*~A)HFx#vrfapcrM(4iUtx zqrhic7t0-`Gt%hj$~)El8<{xe81lI}w>~eKsBCbL5V*~vrJV@jxu%Ngy+S*^2*-bE z8gSGpg}`RrSPhM0`g2mf{O!%f_a8v8XvNqX_G6H|pvD@F^@dtMd=bfWm3`-0m_>e^ zMrZfJkJm5X$^A54B(zAF@q16|6ATxjpC~8t-)1hcboo`Z+6kA+pIq&grt12Zzz|0n zUIB-m6`KTlqF%c1OSvA|p2wAU?dX5+4!fdrb4K3hhZ!z!b{=f#;)0tt=|F6rkh{IW<87RJ{{VK1W{bCcT;<+h@>>SH;R263 z@CTVekmJ(+&`c>7WWYY8Te2(%_rzCHoy&b79N+REC(e^XJ)zz14z?boiO_$BFW2}? zxOW8j9vahY4#ba@_TDrzZznp^ejI1Vx0B18_dlx~=TkcHey5swP9&CT}B5EGtyj$R&e3W15lYhPy3(wlaT*dzl+$!(eTGrE#w@jjK@~zgprg zGD%NfSz<*+=&M(+o=NlC<;H*G%O!E2ok<5O|G`_Oib*f0kCl}~gVNtOwZD~Mv4&0S zH5C$HYSv04Yof& zf3>2(_7dCY+Sm8^o)eU;5|mt>pf}_B>?FUWMN+}4AVo4;CKw}Fa+VaFLBd2bTO<$Q zVRAh>$K_M{H2ZQmn>=Kg5C-nkl7XQcHYq8AN;Aqan8<&X?Bpip1(2r>V&GQxZMUx7 z0)cDUcSCFA{16|RdO0*9Jo+sc5te!pv6saoB1nhTd75D`q!={ABcdo}jDa~!GgeXX zxn8X^S8BpbSQ4CM7{iJefy*woY8ddEbA9U9AqGv35_;t0pYJPQHbB;9!xhiw{j-&s(DcBuyw4#VUEIa_)An>t4y8x#WCGg+{@~Q4_WfJ;nY)jQ9|9J&Ub%v~0PWI^w$!x>02BQ> z%*MJ`M$5i#wQK@((dwo0X_bySLlzyzsq{g&-41_^rSAx3v92Rp@2cxMTa_cn>^0k+ z&!g?#f#;DjE8EP9?s-~yFuQqtF`e2O5dfDFny6m^vBIRFHJd$te;V-bx1%^C2$wKS zN1gAx>#YFu+CMkm|$?{ik4Ov+9HIP7~Ck?)SZ=V+^Xu8@;d+N-P;T*27Y*3w1ZxB5%I6& z(|VzK>`FGuY-;`9pYdt8(szQ2GP)0bpm~3c2*h0M#W21exg)p?L@2JnWY{XRUyM>x z0IO&CfvhlL5b^Sru5dvsAkG-8{xB}~0Io{$&u(Uf6p&zkOy#J%&+v7FQAP9G{(t-r zVVeucpuO+^J82`hhEOK%%F62ALa@Hjb$O%}-_xiAKBCY#v+Ge9QJ zVjo7ZkmXJ+j4cV0oX2H;`+mjl_QIf*rJnHnD4l+}KT{0Yp@L{1O7=n)~haxk=A_t#EDgu>@ zmY`r%nZ-&1M63aq=9-PGT)<6!C=iah~;ix*j zIbWCSU#7F)kE-YMO&DPiMAVh&&T$V%ce%1WmBEr3@Mk*nrZ<+5`{2 zlVY_~RsB4FJ6Ev!538H=6$Ve|GmXK|#58wY5_S&4|G9q?{FX%XeG|>+hfZiV(*oxj z!kdn;9YG!8I>H~)b%+ja5Dnf3xC}KrJDm`1K4fiT`kL$D?>oM`Bh0qd;Rj`JR|lrh z0U*IUqZt9@W6*+sz4sbu_1&#PMW5>A__(Z4os`w9)9UYUUdi7Nm+SRn^_QypFkN5X zoa@Q_y83^4IbK{o|K;Sg`sJk1&mIwTXPc36+5zl(%bMUjBA7v>h88x(ui4B-{kY9` zcVLRzK?rA93k>&0914&|M!Woo13O9F;pCu1T3Q?%oGw5V$(key;bNff9)aW!XcX)i z0#7?x$m!B~Jta$L6LUZ@g4G=8PdPYfY5V$!@o;}j^t^MGdTL7y<;rc@AaPZikT7h! z4D@ij3}(0Oa#R0cdzOSpxY6I?zw|==xSg}u3hj4-YuP`vCe!}KC-}CWFt&sF~rW#I$LS(W!v%!{T-Z;cdGy>0IT|ZyjoA|nf^Gv zx~hM#=W9J1U)Rs}E>TUUB_)D-*h)70fY26!y>;JSK<8PbKbE5x?EptSHXBRj6h>3t zqlPXKO{=T%`AW*@0K-|Y&Mc4HT=n8X>ytu~IvtQ`K9G*AQTdbFE@c`zvx@%fXxlJ`E=AoOVU9^Q-Yn&zB$em&$)f zK)f6~sk+^2FR32ItGCqX^?WK3z8W4V7SO}Wp_)g)Kyp#QF#SIyE(MldPw?`PyDi6r z5SRMX59(|HnESv-4%uCzEv0(z;+(b|NW{E>S9oJrcw@&CyB0BaEn@6y zd+bVj>`HnZR<12$pMho}S%gz6Ef9ZNM-`9&Chk#eK7IP6SJUyeq-8ak&)(Ot3Jh3H zt~V~L$!bDoKo)djyR5Uk_CPjxN-6-L=Ut1@{oSM*E|*WNlf1z|6NSDqBhvRV=EY}y zF`pKhkTgh~T)lez;`ON}W0F*1c4+zbFNuUr4{0Q41uRG-qePON72yAHX=`Dyl#V+4-zAv};+9lhQI{?E`PJOvuLi&cD+&+1o0d#wEd#6+HxgC0Y?md6E^tHaPk`8sw zVGHfYO)#K!eVs!tYQ#%VZkt)l`}CgN0VNfET(7rHjs?KBCsr?`Byop(6U$2%yX8=7 zZ)}^lyim<{e{35&NSiv8nmUx4I+U8agQs-MoDYIq0atW_P{2W&w6n zX~2#Q5JhlU02CxSUqXLMnGk`jvEP|EytIjs0b7RE>=3WaN69^`H%_e=PX+s#+}TkJI_hssjAZ2gDav3Lfo;FFJI#xL7pcyHNK8ESrC(UCu%7 zaCaDiA+Vvo+=Rknd{6F>q#xnF+<~>@-g9G@kS}riaoa3apB^iScT3>is(1Ir%$@Rh zn1YzL6hz*?Am)GWL??$qHI9&L8NCr3^g>QvsTfU;AcfZ{AEL$)<%o;&{~*UPEZv)Y zHHuyxE)7v?-taaK9bq-S9?x#BtEkcT`-f>5cLDYfxt~nKZQRB{jI>WU_m9~#dA|&# za28-sLNZ646k1pv75uM#`9>g?H!^sN&e=Ztn^5AN0;YdK+aO~iiVnBGEk`2Eo`K!a zsps~$nQ`-}3&P*c_LQW3e%m=Wew(#6d73-X z%Rx*u4pOx`2l*NpU4`Nx8b`z^w|p)Ydyv>b^k8gp1Y2*+RAz0)w<{2;xoSMruF!Cn z-<)Nh%{zZ=%Ssz|-L%T4PR$)(zN9uASFOEo?`@8eyN%}>54DlAVV5!=*;|jb(c`+& z%p#L#v6vToApQt>O{)FPS*(V5^5wH0+x`j?7mIlvN|A~sN0Qh|_64lqb?&(2`!dK0 ztd7wncY+bi8@ZFLtkCdq79Rzy$t}(DT?~9gTH07^8O749wkxMpR&J$`-w?e-vz!_> zJLp|{Lo*K3E;B@E{umxYQ86t@;d48Jv($kq!Mx9fTg#6Xt?B@7m~#k&l(AeR9}3>LSL+zf0X zm)3d=6}J)o3_oO-u)7Qtw`5`s*j<-;+zb}CQos!!D3|;F3>CM9=nd{4mrr616}N~8 z4#qNlnr4FYcmrXkk6}P*_4mBH>|8Nc! z5-~YAGYT(EWo~D5Xfhx`y_cyEx#9wHMeHpvetTgSvn` zFqjmeuDJE0G?gLzxKg8*;<0tSLyJm4yxF18?d0Ngu3UsVI3?Fw@FU0CCH0Zzal z#R2ef^ZjM+5A9!uz%IWjTLXbmXIE<%U$Bckzzz%n0koAgxM4mpPJp$G?Jq%VhzAs| zZ|!A&4Tf0Tzy*E_-5Q`Irwg!#XZS~c9zb`nE6ju20}T0j9*eXDsok1=z z4~$>&JpsFefbhEe^8C?UCl{!dL+4ElX_ zH9@vuPv`%#sxWK#Hpscy!zY@HPmr5`SMYZn?4bnq0om$+VL*r9r{;Iu@YlXUz%C#i zs0aAh4FlKW<^2x_UoxN*{1)+mkLGU_2);xA_N(XugxdaEHhv*tfVI23wJ!#|*YJ}N zz@HDkm9`+C--a2$!|eiv!Bqh890LJ%PA5MVXfe?@_^q=y7qRyTW7}ynF!apg|KN(ku zr^jEY7#y~PK%wscaw{hG2l{V+pZxG(?0>xkK<*$nPxw6lNeIH_!7lKd2n_q%p&0)! z5H9NhzrKET|1UG}AR+LM|J#Nbyh{+M{jWXwb&dWB3yJ;(yZj?jF`>U;=-;J<8+Hb} z{3AVh2>+uHLU2beAp76mdH-n@fX5ZySEw!g%Kw$)-%-F@_^WLHF%CC>Z;T_kta+Ka&J0DTkHo9UGO$VZd zV9fKc{T(#WvX!UZ_`hpIndoSoG$Gtfs5v!w?h)w&YK_3Wjga zd+k9qwonTD36YGLE&Q*4NxIay&&-j{SyGJW?juC{1a{wkDf-dnv1=xF2yh0JT;kEC zQ^Mlq^12QYUzpM{Zoo!NE%06vxSMBs8mJmh{6KsGet9L|5l4RGyJh||Yh-2RL+;=} zhQL{&dVh^@btEA4Z9xGyZ%pnFb(#q+lY{QAN_CbKLM8W#Hug{$>DNX+oRgak>J-X&LQOm! zl4#PIefa($>7A<3A!3=+o}nh#oQbX>HcyZ4RRHDBCd@tI#q2yTbCTJ1GyeRaL7aFc%m zAi!l=h!7Lls@4o<7V}5OiZ%**g8f~T0NZ-9DU^TCg&V=at{Gz+BBTD9r0~$3@kL84 ze#5P@>*-}b)e2!-9Tkt-kRR|0sW?;^T-zbLeqrVu|g9a#Z!$R{98}?TQRF!%b_Z1{uq3uKGWnx!v`$g9iHR? z?NIFN%UfeDT57#)#niKsC^iS+3^cF>OQO6-0&#$i5m)e^PA~q*wLDvcfrX z8}AdiG+ezxdwBXKohoKr{Y?GcF4=cI{D-Ho8Doj8?y+x~L!Pp%3>7f;u~NbrOvBf? z{sCLxzv~8C3+yPBL6FkA&P9EYt0>WmreVo{D#mhUebt*14RoK4Rwo~@71~CK!i=B| z8B1Pmc}K}IeGRF!5~;a$Qlrb#oZ*98rIlS4^p!WwY1yPxddDbUdJ1U^#mKq3PaH7F zab{$na^?+@jOOBYIuVe>+t@*NG_k{f zAxHWnhB~SZcK+()ae_2do#KeNTp6qAHd)W_4dMB@-M)X+ zq!s=Xhvf^&?Lz;otWEi}(Sy0b+n&M2JP&?57KL-))y>+cLvLr^%31_BrB4)yd*y z!v;x6r#^jwM8aO$y{8p|ehh}3&{>wSycGUYp_j{2mcbT!byh;%L$Cn9*jnYG2wxqTJZ>uXPxAl> zt@9gNMI@oyJ5@%Xx5tOVx~bh@rrk9!j-uUg%OuR3}qiW|(*_qqqSy%uQ1oUnZHUy?L`sU-WlN>Dr* zp5FqbIFcXpV;cYt>oDFDJ#g(Gld3#R*Jpp_Uh6<3dfHY>*?$SgMTUjFVq2D~{+(`0uGVI(5Bvx`lmh^!Z!ZI*7P~3q7M4k|oJS*S%$ zPV`(X#sf#snLmoLtn^Vl-Kqq*gA%r5~=ebWX$wioB;Ji;J+ zsyP<-;~AH10~#-Z5$X?0mW$kpy2;COn10!C5w5MwN}UNYG9hc2X;{SjD<>`ECexl{ zr3J}7`M`$seW!+{ezY~cW7f~J6IT2SOnAJAa`!)uoWt7@;>K}*_aOn!VbGZmN9BU# zx;t&e)!_xcuLuKD5-Jm^FCFv3Hb6;{UTDb=HTHxPxU1=$sueZ0_k1_ zlpVRKqtLkTrFF7PuPhvhRdR%Vf|j3W*~C{MN1E6Zm&y^aTg$rLYBc+8Empa#3L+A! zZbxZMQ0&7pQS=@G}1&9P{P_x)}K}v`IX#{XStzy(QjI#-z+?!HRj19 znn6J>+?x$v#bejzSPC=!+m>^=p^d02^yr2U8{`Wua@(n`y`3;fSKYYEj{VKjuXJc+FwM zS36h#4Xa;&H3#xULSJ-%_DMn(+Zi>9LFqOeZ@rs~W4zUvJ)@(e@F zfO!gkLlJe@69&akp~!<|E+;S>W(_)0@%yt9mo&zI*KpJhzn<+|Jpq^fFfTb3_mF(G+``{S z_l;=PFzPlS2O*sS^+w1j{LpU7F!sPrCnWIdemX$vXIwV?^Gu(Rc7RSl>Yhio*tb%e zmx0?mDeM^39QLkq!JM_6y;1>=mHa~Z3d5lyIp1folE0?cG-WJM;RSK;^C*>3QVzF& zj`9|!!}M}D+F}v8>8ZRySPm5A-8eeIuR+^$&aP)CYEjTe+1k3z^pKxVPY>j#g9J)9 zb&2=8|`DHgVoBsxlAys(r3RPMd<_eQCCiYp{=RjhPkKhxbH_)0!&Z#(Bm zuB?(^qtmT^;&c?3cCBZ1O0WqnmL{ryC~@+H@2!p<*{8=<=bUr;1Np)iTOBA=uicAE z&68Goy`HUObu`u8#gkri2l-qnGycq{3@<*I;0`Qk9mgC?eOE@hJkh1}F)I~VTbG>_ zDn(Y^Yez@=h?ae{vw|CyXV)9`eT<%H8>{T%;)`rQY+y^LY`+$>s&hu(${T5a6S@!1 zX`pW-vf~gE9OIw#(?$v^d)Kc-KRJ=kCZS0BUgv6gVq2%89Tb;!4se$Yeno_7H5R{* zhVa+pwK&PCT1K&vYF^_8HR~6C`DvQI=+Z`|yGeG> z{BAfva&3H|DC4S&W{Tptmf+`q!D0nRDiEhSxLLB`xi5?Jk%wfK;eLpiE8WvB#8Tak z&)>IMO0;s68^3O#WJ=>84wQZDakOkCa5)z+kyb14lUaOn94w`E9r38s#s!-?-rtSX z#*|f>eo>Tt??u<}N2fAhfotey>@~tNAox5+WvdT6;feQV>$PQ3FjgmjWg_vR?Q4I< zWa5$H{ukaMi{u+w_}q-dMjN{h6tLV&KPN^fCq_%b!y01bQ=nZ-!EFs*y8^Oty6oBL z`JKS4%M4dqh;Gg66x}abF~~L>WyCzL=Z~7sUsD;RxOFK_i6TFJn3cm%?shpO)cu6^ zv(Q=nr9ZQugyd{@9%_hx^Vya;SY&L1r13EK%{LZyk{@m+!3K|9&R~+1vvE#mJm@mz z{LbWTd7~3{7p*nNX&ak`*S-v_TQ$#^KKoZt;+4{M=+fl!@G^U>`Ltfx?aEhjRL#1- z_^P<})f_hU*BYCd#n8YbSXvACcpad?kDeyzXdVgaupYP6Q-tS8%9$@IJVoM7jtvX$d$s{j(`?Ivxb>RgSUZ>r+*TO zM@QR4?X^zc3l6S-SJmYOhA%Sel)f8Y>(IBWk4HvwRCY|8c7a3)Wq2!D(=O4$wv?3F z8jTY6PH1Ai1gxg2T#0dzXK%lsNIaV*-u)ssiLN5v`1bXNsS33XUrN(vyULJ%i+9+N zo|WlTHaQL_#%o5UvQOzMPZrONC}dpE(0r#dT8VU4nUth|+C%$>2IZqrFBdNhl+_n> z92%Z$HJY~|tByQ9hz?djKQ$onTb;Ihy!%*kCOtLoKIG9eLHJu)k#A0orQ^rO3gfdt zy~n7yp=h6jEXsoMH?{bk>Vp`L0Y0ujh>$mG)*6h#BLG2eNR93fpA zT5i7$OO~24iG9HQku22M6C3OvtO=9$m8ywk-wLr&KK|BmA&`Dtyfx&PQFFlq0B-HJH1wWrp#nVW<^JJsnZ;-fM)=x|C z^XeQuz5lN8yg{a0Ev%gT#G4 zRLyc@zJhMd`(9Xkg*)&?UNG!%G)M^lw9sgCw7h|%3cvVWRdvrjwMcA(p+{);+qv>V z-`$;mk@qQR2KjLcLift<_M3*N@9~7j7!#s0;+O+!6PmhX(VwTSC|7JRh~{M+U>DS& zYI^Ogu{x5%O2f9+0NCFq3SGV(=U9$g4(K9|8Iwh5FC9`H<8J#fA7!`7MSlgQkZ7@WX!=HMUiMa8&( z%$2t9+E94O137{eyE$aAhJ{L^nIU2qCapTslP>lbk5!d+#bx?nsSAmy`i9!$z(E{; zM}7ro^WybNZ4v1ZC*xbE;==My#8HzPmazI0>JpM%T;e`S!_xYBttC+nsIB9Y$2^Vz zUX(Oe76T>4xAZ9(i%FU-u^5Mb+Yl1;pK)WH?oJgcV9>9tRhk9`$4 zKCq~B^72AL-byz?yF5kUrkh+-xW-qCCT1?R~u^bQRlOxHF&qQN_I*haF9EwMT6e*9y<{h;#c0l(yb)b+>o zK@McRBN$a*MXmWnZe29FTERoPwrmlTW|C^?>OMBCq-ntmH7s)0f})kjW^1bdOw&k- zc!XEz=QxLx>JGoLn6zDbVEH=$-sJWB<_iH>RCDFewgShB$ddj5`qIWP7bl5x82LlP z=EO4^u@3o&FHH%E8`u`0LLyFo#A^>J3`{|2D#;cIoK-&K0T&)M9zMs#DtVGh>iApR zQ41&^j~z-eTg`+g$s!P(Iaj9~^tp`92oi9R#?{DJ-ql`>NR@3bdu#2yYOsb>h{rHq zYYVOEY=?XIKb?$G5o#z0@^1)4ye{OjVdvAzl540uqmR?JH*@w94fX{ZEW6-R)je+?w za1Pb-YbXdYmR>o-kis#4eytKU+&A_V=H)Xh?rE!=MB-`Y`;@5Oz?MFx;*AZ*Zm)Kv z1~OLw0}Z%f}M)$IDpei``LYPfNW{@cG4`c))`fd1*HlD_gb zBIOV|W}k$%Qxw_qs83(h(79|2ke50=w+}23`aU9lq0bDuV(~l~2_UAEUJ|(DZHy=F z?|5T1`!RL;`XRhzsMC;a5 zT%6YGLkRL62QC4LUJk@z%);UfQ3i}WyG^!$eudfaYZy>JyG%CSKC?OY! zTGbZaGFE~tC%Jnz<-_e0v^^~1>eJ7>U4at@gy{)?bjwRme_~y#WKz~%$F|0=#6~8a zKT!Lp50HEgd{F6jHiJP^*ArI{L`EvR){^pd^M>AaE!u#kmvhaui%Mx;hsUPaw%IDp zb_0PJjP#Y6m;tAR4m4`IUg+{H6c(?L8a@&+jS2T{*9+{`sIj5Rg*=^OaAv{QwqrYa zV%xTD+qN+=p4d(%HYc{tNhX@un%K79eCO2p{_MJ|tE=~_>e^MSd$0RiYbp9=ij)lw zq^ix8!~meoXX;<&&LWaET5Cwm9vuZ4eZ#!PW?w{0IB|v%7tHgga+wr?^67?h4zN8V zosFOEl8DcE$?3k)(_A2Z_e(g@cVY>3@hD;}GV^pxNMg6=OXAEZGK7DLO47&_Wljlc zeP>Dg3)(`)TA9|i*&#Ep0A`;0F9jZtV=yz1OJ=|t8v**MqCW;OeZ+oAUL5GxaQQTF z-fBe072LG5yMGi~2>4wNk@N|S70**IA$GvyRK*fh~quA_1IrxgWxZgi2 zh>dR6Pg?V-m?bj_aLZ3KZXjJ0LGW2o>upuv$Pu#B3U-9a;dV?Yj#^+;SoPqK&^@))yc@Zu5phJ_IKsU4qK#I{ z-`-YX`%9EKpMR;nneRl`(Ijjx9w*O@+0u)oWs4qrvhE@5tl)ke6+Ygo@`aUL(>@1K zHvJ%A@!fo@5Pal|7UY?}$YuDM&S{y$`f@^_?;?*i&pT<~? zyvd2!x?s=!E~S3m*j!~i;LkEVfc4z}HD%;zA9lh0omE5*gBdu`2~yZ`4n(x&rA3{%Kbi>0)0X5fnUEV@?zq>Q70= z@;<7Cg+F-f658Ly7TvJq=5Y@BjrmXw*&Ib!Jp^L7hO%PIFip#l z&BtPyzK$Oq;MLu1^`O(!bbu?KI^Zr=BD}&!lk?=Nn_GJIV4#`jp8=wd3G)vsb zm1J{V$#mGr#Ne!`jJp0g9O)HJ4-)FFZ^?N-4siDAhLwS4gu9`eHgUP(RtCNpzO1Hb z=zugiK`uhqyVdHl3?(j1qD@=`y5r257)?tG3P1uLl&Hqno~56J68kM zK@Us@G|7hyJ^s6qDzt7db}#(mBZ7$qQ6o&g0aR*dt8rZ8SP~<-Tbw^ojsQ$Pxf`S- zOvTuLXZ6;EZbkoUi;U$W)aINpL*%=c^2mF{0hfA+9nttD8A&1`d|O<3E>1Lo_|_v! zXLn1j+^mV^_Kq>RgoEGaC5yGk3akSS%yCA@h75fQnVf!pJamn~6@3*L5u4O#kMJeH z&~mcw`#?z18YJ-QClLZP2Blodm0~>~ky$$_|E7}@pmpo+u4}2BY!C;q;4I#bCk8$$ zKxcl!M2L#+3ChYY*Tq*jRV%_$zA>(5DSy7w3bBsS&m`m=IUIII(+q(y^ z<ALpKvQ{4$o353Nl-D;IOBGR*RvM~F$T)=44%?l0wVa5DY!)KO{dFah?GevFiTvpSaKfi=I@y1iAJ z=dW*jkA|op`}hv**h`!75(z49@gpmq9i!t&KQ*GP}NqyLly81+o~kc zLHNDs{9x4+U!S$8%&LJw_Dd+f!Qv+oTCr);DlfHnz*Cl%5N{;}Xn2km+DSSom8j>B z&IrX)!#FI%9;ss^B6Ehfsz4!T6x9$s@JTKh4I&XkHwVIgfEddD| zLe%J*IE5E*K)M5b_U7b7I&41ozJTqoK%!Jp=Xl=ISNq+~ify>?=^+(FDi-u`J?~71 zdDVzkN~aUwEJi=#huZs%QHDL%6jn}druM?WX@OEk+_J-1YdxJzHmzs=n&gWK%D<+2 zO*7A6)t{;h#iXG^z)%8i;8 z$>W$dBTxQvekFQhHq-^h)tu$}aD&;wbfKH`*=>$cuiMH}H*oMs717G;$S?z%q z6%E9o>eoL=Q@l)3W^SAu8>CWr81YOJKQQ#9pJ%6C==oXxBkKqbdPXfhpn>{Nmv@KtG=&eF3Ur zqL4wwu%8;y1VxNjGn1)D(CY}n9V1esrHOOG)QK7gZrjzZwTVg+Crl9rQ0G|d;!F8f zhuxDeI+FM}#>(k+ZK*gma&w7bhNrn{l3Pr;4z-VCNmopvlCAkf>hqvy#lO-!6Q;kL z<^(a(d`Kx6dh0a2A-)EvvJG#QJ+ArT@tDKw&lDxL|M1}#(e<^^l#JZts-L`cYeZV? zBj#T->Bw3`7@eSB$IQjX=&^-U_3w4ec#9O~6&nldU&_&DzpiR~WfdDh(i_y-o++po z0SlhyQS*Sv>flrO=f}m`cXYTJf-yYU-M~;U2kHc3KE~c z=1Pf_R4R$rc~bju?ei(5rtYGXzxCLQt}nDc7s{dO*OhN+MuMA(yQ+;b$tSCHNZxu_ zu{>d$oi$7$7vR(Ru{oiyR$4&1XOVYqFQKP`*n{sB*V7NP$LUlyyB|7QcWx66j1|I~ zF7AX)ucC?HVptdO z#xx)8nR!i2tCek4CrC2np-lTqaysh@v1=x8rI6IrxlGedP6Fnr%q;u=|d~Ctsr0vJV$a2v1gE#eeH4=F?ssi)}(Tl=2|WpIgwm>bz{8{ zEc8r=(Hm9!TZT(=jM$%Z_Siaapn|M}+j2#Y&(<@`zi^(5i<8n$Q*bDD8e3VWil2{V zQ7B|sVy>|(v;Us8>8PHSeA@x|agDL;JP4sMgu_8~W4UZQN4ecxC;-0*JlRt|5|)0RNiOA`c~F(pTEY2+eVwn$)|wRZ?TH93*uL^gHVfYTL4`o{(~q z2h;&V@HCE`+opXyLYjntxRiw91%(Rq{28%pa*cEQIQZP^C(DaO`XC3)K~eQkGcih6_Rqowov5r4ww#QZnTvtI32j`4WELAKZJ|;W&(1ScOju}*UA(iA+x+F|DFaRY84GQUbX=9- zcfpMU&g0446)Ru4g`m9Cr9VIXIh+rMm32Gm7_|->u=Ha5<#0<#VH#ZRDDtPITbzib zEZckWz#w}moW6^q1hU*CXj;j6ToU1+fqzw9-(9I${y5(PVOtFJQJzdYr%N=m zNyA|?5)`c2XBm@{bO!q-g(xpHs2;oAHNa2#5Tw`}51bEp|5Rnef|)|S*Bxd!v=>fz z`ODUHp$);{1hx1@UgTCy2A)&pjz|}}s{5e#*rFCBtFy6$H6nOT!s(ZKeH!l*qo2v; zO?X6XOb+tEW9>J@jFuSdta>xV3}F;oq(a;ms1MFxCALuLp@Jr*KCKGzYj&(Seof&y z1ep;5U1-#){`9%@A@D;bpWN5G+v7UHaxex0~V!yG#jsb zVioo;Gny&fl67yh$^6f{Zb^NkxNcIDrU8!C`Zxgs?|IpMgR8EpZz`C!tOe$CA?NW@ zy7luHNHDrT>3=Ff(@#pj3oM!8kOlD4%SXRu2n8}JUi$U!x9k!|PQXjYg+m6k8R;WG zNT=IVAY-=KmLmV*O)nEh#%Pn?L8jA5m(%~A5Xpn$B9N|L`Yn+>QF6)C*>=8Ve>MsY zUJA+t4H75!|4KE9IaxSTX18g87X~_RdR&bG%XK?@JsbdnbGgL@_0{;N&0Ea!TVc88 zDZT}?WZ8c&5A#M`!od+m$Vh(?@8h9rR!Yu=5$#n260ZSJno=MO*vQ0) zuACsZ!c{vkbG8Nk!}K-Kyz2;KDErK6>p?dp7pVJClwE;>gZmuy$IQ;aHI_7P=K&WZ zT(2SaAB4~L^(e(q_p0D?A-{4U&7m6ZS4HH<(Gd5b#_2BaLaNCU;6rlwtx;%e5YSuU zCbW)Qnl)>@8kSIx`7Kw4jZ+P?EY0iU%WzWglZskw_W&89cz-p$V@p45@c5tR*t1!E z1QguXik9cuk4V#`?dFhx?64&^h7;OZhq<8nVBC1}l(s=-kfgzeS(w$3dSD9hd005s zx{;v1WID&caGXkPhRNk)*yD!bPsFp*f`8+ZDojKV%gMDs;O0KE|4Jc-ty3WfmquHc z%@e*x@Pdg=TT5jQT!vmf&S@Idj_b(MDS%;*r(Dl~ZPr#lG^|?y5+cGtKn;;21kHjo zxh(w(jhD7#))ndMrxqhsEs(5hhW#r~o!N@RW?d)g+pU(iQ~>Ug1m2H*LAXo7QNndCJWCpYIBHG$U@i!gJc$RL|`U-kMj;Oh9;vOIbM)PfZ9q6 z$^_f5otsh7EG;(*6fO{}Q!~aIAJkUDl;kUUSP%S}$cu*U-K34)Ky9W1(ljF5FC#_S zAjM{#I#0O5=7V@b?*3QXO2#1;oJjjEHiCy2Ico*bLwYmk6&q*nPe~m}qlQOsNOMhX zoNZ{=_2l-~$LOo^i4A8(P=5XDEU16$)ZZ7>FE_1v?);4v=&(M%ENalp*=J)@*Q=A+ zxrU`*wmWCYI$qN3)Zc9X$mY*S@Hl=agE!UNQSdNsDzMS|vEI@({i)yS`(;F8yadV2p)#iw-zaZIe6K+7ztt_7a>Ho3YfoWjh4VU<4bjzJC0I z4#w^3osBjRY?ss<#oBgvt7_nf{;_m8R2>uo@E$SCEN9k~s^U`&D?fL-Di{6fl zt?r&efkD?8+Y1&WVp0~d*#Ic;>_cHMM}%!?>UIKv9*(s2DJ&uKY-|+1X^ZON)YMc5 zLS7=B2*Ef@gcu5OvO_#lQoMv@FNWbJM6)cPAWtYPFm(hJg;0*IHZ&`so-eM!;vu10 zP?#dVqz*Gk0!RU5gR4ID6n`7%0*l;Ogjrd_0-`VQsn|KuY<$_{RzNv}BB|7h9rQ*( z+09si4eWnK1$?YKI9yeHh63`rMGz83ucZ8%oKTQSm?f?_j(Hj0P>lqa^F0ttHuN|2 zP8fW%1}2V{fJWS@tWB)0VhhUmMp5}2e_*yMgWBjFnxqRc-GVh=`ajv~Z-puU$rXp= zijhRdKbt#-?2yc+{Gp&mA)v#6!m(DKgqb4&x@GK#5+^y^;6}(76hI~iHo%BED2h&E z3N+dCXhBY;*~Evu`slqlWy;KDh21_wo(cSpnqU*UVk<|`_Ea@iHJ^}9Qj3Do471iQ zB=bUT;F21R!2pL!bTt;~w?_2jjxV(5AQ@Ce>wq=IVoCAAe@a0BlOtuB^chkoos3ll z+Fi#Z!T+ES@#eU&T|1;VCA=GTV@4$YM?hu&ZgrkynDuHHBv0 z72g-GC`=tae!PLHs2T5>t=)2U$mFMZ%puw`IS0jv80isDR0%#|){WvChTiPBozpQ-odlx{y}bU1&fD)RQy2EDlYq)BqjGue96SFJymGaeStq4mfg)urhS~G`Au7lTfA5=zYc=pcIQ;p zW&iT=D*E8}>~qT}O2o1RplYls&7I@0L`aHo6_(SQmsMy7X(ZDMiWPZV$#?RWkcfCFA_(l9Z0 zH6S+Xn6~H2C#6}K=G)ZM0uH5>Yc#0IkblOl#SJg`YFWpxPhZ$ z%pL!0gLVlrrrnZlPFw0G?_D~W$dxe7gdm*;Y?OFh;sl%!!b}w>K|HRQ0jNi$!W!UR zeE>t7gOIwKQmz^~FimD9}F#^kZ+PdY^8JI&ZwKD3{RbP$go2?<|;BNu%JEdBZ zL&m#LLvFVcowgCrAJUQ&?Mg}3yCCY@J+JC$ye(4YIo4o0SV7x4Tu!B^Pgc#wD;Pt= z2qP_s5t)xl$c6X2J;~`M5NJ;(?p3}-C%1k(ZZqifj~iiBW#(?9s%gb5c^LeN4yH4YAPMhpU!)a>8-W~!&N0@R>-oR%=4uW5_S8*~ zOH8*r@8g(+O1cxB_5^1+``UQAH@o)GNlI0nuPjDrl5uK5OVgTPnm}hZrW8gDi{}0b zmH2!EwxWUhKt`io_qE^#9h|EIhPKhp*s9R9@PQvy298(| zx?lE8jt28j(R96y#b^^5w2H*#%tnNw*cg}T&M|Z4C zR&M+uF*%t1)}L^QL(KTm+d`)6Bm=j=l#rHN{Lhs!Ht5>GQ$P-OrXoTNuh0hTX!|Kb z5m=e(g9wqTgkjh<0tXRXuUAYU{AAF!?9WK#*!E$>oU+Ewhf0c#j55ppHu=~|zyqav zqics+Aavwf1CUe_$wOb+%@1EDXea}M6DiW~Skbj38G{Z#9R*NTc0R5mJf(ke$FE5K zv;Qe^@?R@i6L~-COlerZ(~xYY*cye_z9p25-wwC{txIf@9B2H2KA2yuM7(C@rMV(& z{Ged@WxGA1ez9}ZgR;x%9=E=C54U2WpD=3-y&NG<3($&Twi>7UC`j&%;^X!0EOVhrm0lobc$O*FT8m!WyOs=cSS<1Pj$}TC}+dvg4=DJ zM=a#vGQrA{u^&>gdB^XBE*)LNa&I0ojZL>_SPlQojHJ3nUD*P#Avq!?YUpjf^I6+n z#}(pg0n{``=RrAT74xAZ@*1I~_i0p$!TWt+jkDX1d(6#(vD)kurUfQ*m4|^lx`Gti%Ls(jaJz?^*?)+clGJDq^s%uPFAnBEopUqi{pW4!)C%=y` zaP!qxC(PKv36_Z(Pp`v>B_`WqCON%Lg<)Br8HlmDc(A1*IVSL9fTI2`MsHHtkCjR* zR*V19=Vgtadro+&R~*xjsdRo&6Yg{e`l(gbL-jljaCk6zU~R*2Rju9mY**OtoY>_P zE+_XpeN4*K=z#tS*1JQDhK!vH$c6DS*%fbKk!QQ^&CxnSXGm!Dvk`wGnPIQiBEP$h$%|I9 z#N5cS3Vwp*lH5IteO}b`rv~hggliQZp#M#My#dp$Amm$)#EfUUVbh*r!z|u600Km{ z7n0JhqF^Ox@?N4`SmJk!V_@(w$om;4+yqXBsH085pe~*s0Bgs zYLRcG?MTb-I*o-@(XN~3ZhMUnRv{JN;X!JHV8cXH)+ePhTA?493^e1`%-ca6eIc6E z3g6cX1}S}N<>`N?cFfHX)?HKL0w2Bk+eXICltYBUD8H|0$bhSFM?z1XZQC=FA(sOu zbltY@N*|oKOZ}Nhnl2{Z zKxQI>KB+i|x;Jggq&HIh?eO`KS-)$c&D={z&$_N{fn!3Cgf6Phrc3XqBHz`X)2$!S zo9mbUPZf9``CUVo*FRi+L@#b`>iJG335w5pe;AGS#dR{3AI)FdJ=MHDew?o#m*9DR zEq`=n|M;oWKEn) zS}=YwcD#JKd^i6h{VHz!+e~K^Q9Qj3b+haD)0U98SW#EsY-lXmti`+Fs<-*MB@JJ> z?repmvq%MEuvF|>V*jlCMJh}CkP5*k-b1d_`e155;IUqWnDkI4i4^-6xF-?VdPw!al#( z`&okIKX<>gOH379?EjR~A^b74R2J&bk1{V>rN+^o2X7_QR&F8Eo_2P9M0~vSW+!Sy z9q=0y@2s1jP5jZNJ8I2owwJ+xkp*b~P0@vzZV2@GxRlwQg95gR*)!?0?xwY4yh}1} zuJ)HFWb?Q;4^}zB3pMU&xd7x^IhMA~^0vdhi3IVxf%jRNSWJfo7P;}SY1--clHZM~ zrY+K&ySBDkqowNdy8UhrDXtg{{>^*2>29Vyl*DDDt4u(V%zqxX-mcVbf8F1rC+Bfx z>xZamoM`lp9|AEM`S#`1dl6fZBUX+NK%dNDJBEhtUVh;brUcJ~Q%P+)Bdu$9-T;^o zd~pcks8URr8P(_6yT&WJHs;J-{EF&RRS3XW7<)0uN$=q&^am0oH+J{tbx!tgt@e2?X5U!z zX2n@yQKQ&RA14frUq2t;KcxssMfFc`Sl~`23cWAtwrEWDd>!7*dwS|rafTw=jl7vh z82Rqo+5Oxu(Aa9#Eq&E}NW4D^{80+04Mq!gLeoGbUzE7Iexn(5yVvELFSs=n&t;!6 zElZJx?FOXtz~JgyKX^%8gpUT#WU}xN@@s?3_1yY=KHZ}__Ym7}eh{uH>df5?m+Ki7 zdqlp5u98vXVPSf{anL(5sBw5G=(gqBX8L!eIr~~}g^auvKpsGdZx6RzNUqC6rfX!% z?A47VHa`u$x7<^F<9uS7PG#P}>>5t@d1ZRFyZ|Kia8?MY3Vb?TR7%L(2534(dJUvT zVxiv5P3aIgRzSJ%6t`8wamd#p^kpsTNdz4^U3PmvNNe{D(7mcRXPpTwTebA1WoyHN z8{ZENHla2ghia3=edwu4DoMy)%@z@eur2?N)=If|INvIfhU{&aMPMY}$^HFjkFVJOO zgG5?MTH!R&c%tN412_cV$n3wDlOlXU>|u&ua-}Cu zm+kG%o(2qRetsq*|JId->S4%Szc+x^6_{@Bp>$2&G&;T_T2FLbs(*hAv$0(HGtdWoyq|sR8gz5h`4^9eZQ&Gi^cW5P z<=+bf-e>d^gRr}oJ4oM>ZEChJ$ay`U~ ziD(;3gDv~)^jRWwK#BEzN@MD)#Ln(aFpA`eX-iwi4bAy1V#~ ziv9UUs<$E9K(#0+ILcMv2)-^sx!~oM;6djV9&t1KzApcX^lg+s{?ab#`$o3F2c~ht*H3}{ zSPKCC$mg$S=)cD@)_v`?2wW2Z`dv;|URIKy z)>EzwNNSRd<^}UL&z-^oR`Nbi!=`ax+`p{wZns*N`a+&`dW=uho=)Mex{7?feQ!VB zB3mGHqZ-oMB+vAV0Ev6P_B_K8 zr#P?n*yqzF&%f^hCXR7_orCwfN5vk>Jpn%}`vQNpHhd5~Zv&YiY8Z?aUaAdrgspqF zk?@bxp_edsTD1eWNFJZ2hun3Ml0 z>H$De#4Vk?EQzJ{W2?N53seSCqZxCmdr2tS4o!WRMg;;5x>XZ%Faw!{f0-5a!d7VC zl**EHz%3X66me@d5T$Kg+~1$J>6EFD{|UiR%P(=67I*;it1$d7D*Wb0_G9DqykknV zWJ;qcwT3(Hu{C_;Szyd^IzVaES_Yn@SC;ck6(KMvv#p&(D>G6WTCb;gH9(DmMF04B zf~ziRu>%J*3Sg!%t*q^<&E^z5!oFYw3o39O+(gb(tAt4|?-k4sDxH26&T{KLA6B|| z{gF9pn-^}9t?Y!*`q{6c@k0aPuOU%4h$!uCFsnZC;O@JnuG$*kz(uOjv2TEyRY!SV zHTqo15+FykLIyaSt2(<|e0Z^^Q`T&-z?~-psPmBkXsN_xQemjO;6^oxw?frhHk5mm zei^c;OQG3n!|G+#8&Cjfvy^3io{xm8+h_{m+^VjA!E^kyx&AM_f}1^^#SN4y{Ry5lzv7y1A^ikBm^`B^zwgkKNtS0KJ!cW7;2PgFRZ-HM#=4`m2zu zrK}qVwYjQ|?PU%CJf!!D0eM%E(BFq@2h|#a`2H&KVLp z9S{*eG0kC-tX9cT+MZ=-xVydN#GK7-_d$sn%vF%$znh)F#;g8AO<$w8P1v`D^kcD0 zvq$r`Ndr3UUN}hY|8(_-qiaLh_DEGI-SSvaU}z!W2-9%FbXbFcj~QB9HlLqE!&G$A zou7*CTZ&93ZJ$bhL2pULmT|PBsU|LxR)LXKfOD9$M5ep7vc2GmBA~qJP@c%ab%inJ zX(7Ppa}AXhZ6LEH<1TWnu54~;_Krpf``gP?dI*%`zQhngkJun&WtZc^Vwj31zy(nu zZWzicSMkaA-47J4sE-y51AMQ5t9eencFpgxpy`aCX;|Fzv}e;;MwMn8zZ}JB_l;fU30r>D$(q(QJ1Af1o8wk z?q76>>)9xab3|x}A;VF{sQPkXq$B! zibq@Pt*ge@;!)~Um&&jDfUo!IU!P~*Z})pjUtXWD_a|*%?+@weQ~Cd%(vRvLEi%7R zoc^yLM}5G}&p%0>k9>x)*FAXJz^K!0#L?&t&aaD;2%_E~+K7I>Sk~A%M09LzmtIjo zSmThnxJEr%gbJ6i29wHSUTHFfWI_|l05kRjm_}77L3r1hL?`P-=?bD8^Szilry5S6 zfr&B2P)sa0yg?zYv|`v9AcuN7dPDOcygC42kTf1WR~rmaw^{THg98`d=Snd!0BGhbPqD&7DsS)0o54Q>Om?@$|G`3LojI6 zzqm}Qne%pC!{B(Og^o>+$*^}82=g)w3WJIN^-t`GL&9wdRQLqRs{Ni9>=9Qc&~~w; zF_Sok11R!K&{WdK8lFf0Q-9NLNY8|WRfl$la=zrKg*3$I5!L7i21aZCKo@gla91q; z5%fnIbiRf4l7=HE`U0&H&xeBcY+f1Ld9&ePfvAgauXxzdqO&wM60DeP%_H3XkFY-~ zYw?c%yebGdPNJ>O&Cu0yD-yY+Xncsw29I}nUSp12!zw|bN{{`KF!WW)&FaTb;50_r zG17+}nKcvVVqvLbfCh!CJ330n9>alLZAQXbF1$J8V=c&&JES?KF5sIouw3ECcg(Mm zVj3rK%l?rHJ!USd)%RRM73Dm&e>{R>D*B`+;lSH?PKHR}8IgSgMtp|D$kJV88y;%M z!d*69#5_7M()k>FP69}JxAktQ^n>8u0JXv50DWJ&-A9vlAV33Q<$Zv+Wav2FSGq5A zL-6wg3JFnC?IbIJ4r`kVPTw8kqr;!>oNb`zCY??{I;}8r!Wj+E(u0nh>g8S!_UujH zk=uZ!XwPl(LT?|3Rl(#M!hm@i6JHoo5i8aLGQx$YFDv;PoVDGE`M40oMO{!`Y=TZT ztZky}Pkw+u@a5%>$>Hou5cu-icyc*P6!7}m2&C@$I6v8a+nQk#5^C#v(i?Tk+HC6$ zUl1C4e?EBGek)&kyo)3T7xjrX?#chUc@YY6gBGr;3p}I>w1Lw1vHt$63*jZj?O3?X zpiB7L@BRqNa%sCED47tvbHq62`NMpPpLr&@TlL`>=#Ep16m0DiOWZ{4`^FFUhdA;X zwqQC?4%q@l{29V|+R^hFhI?$}fQ9%C;TN4Sq52LwAj7KPLga=REwv=Sb9pzNfl5WQcgu6uzF*~i-(;aCv7b_@4W1QMtO zNnAoPSTHCParDC6olY$aLwH32k)$jd05m6*1Z^$W=cgJ%)Pw4qV9IQ@Yc)+0q zU%JIsw(?&hL_*BpW`8H!$=N(O9~ApK;`;ak;eG-dJ^~3}g(jll+`f)1zK#mNnsOpp z|2KRWMg6~FwmvF2lr&ld#Qc{VIWa|aVnf+(cK$wgZ00vPHDJQzka_>_@g2p*lm`1| z{#YFG2#UQBw;~P+AMUe8- zh#{$dky?EsE$~BraK>*`xzCGu4?P<(11Pl0Z4|X&OmceBz6gd8>WG!ft!nCSt}eA#UW?9TPE!`zV)y33E9LwtArzqrNcMfKt$}x_vi32~-}ZfJ*OH8NQi9BDm&k`P z-L+t3#yQMgYMllcSLtdd`Z;=SDw>U+ ziJWbpY85^FAMydr!|OpfREiO(Fos}1s$UBmnvu#jJlLo|^^ln3F!UhCMibWs|HdWh z#*cCZn1ks58VqNsL&S*^+T=2%Im`Gyba3S%SH4q#V2OguAc$wYhUIf4yF;FMs(73C6FzAaD16KJkwe^?lx*eXW&K_kFz1D`6%=8K*%Dw+4=b z57Q6^o`5oA_gC!zn34L`p8{p*iG2f=%|UL#fyRx21CTl5GRQ^Zbh54zGAYzIBB|CA zGPTq$XcU5xXf@Qc01CyTP-vB407Yj}s7&g$Vru+OB?=`VSOfIXM3%HQ@L=upX}j;^ z#lP~IsPBU(H-`!Mw#O9sfihUWkYd<;?0(eQDZ=QV1yOV#XbefJMT`rkQlr;@*bDU+ zSe00*82Aoiy)HKZIf-t(0$$0((X#_^{v}L{9B2>Pqb8I&NKHMSWY?j(cDmKe5bi1Uv?#ES2O5wp884oRzC8n z1!5Pr-zlVUsZ{m04TDu+SH`|7P~-6hJ5af|CZOPlyfzY}9^tOGUYOj3pdD+yUynOt`#>Gdjx91tV-4@vK6!T}K$0(HX z@HVT0;0a}3A^c@qFoj*POmM-WH>FAAlR@%HdB0)(>6P+{x27rkd^tOz7ch#h7MW9 zb=4F{Wd$#RzcY6ab0R1H+?_AMv7BqOx2Wg067Hs=cR61s(gSdyOR~mEKH|%-5}h<6+lzTdw2#Y*CA_I5SgvnIf-sgiJGA$S~h$!KIO>rU0~Ud1k}&T0EmJOFGQ(znb$j@p_f*sAFk5E|`T zymS1P-c@Ngjt|{>5uSDdZfd;60&PpXOP%cxuVG@1Ovv`V&h79QSH%-gh!bKO5mRTT zcXGPprrch|>!iK4gMaY4>FLpa4RDe{zd(v-P>~=J#;v*+>cCXDc{`x^ExzqQ}$?VQcPrr(P zW(KpxYtcQVkD+ImA&{O&bPo$&*Qv>?x9UiVP3Lf;oJQT6?V2(!F|^ik~b_1hPpO39DE; z4F(yr6xw2zFIYRL{@+UtDfnL});}9B>RyQ2yCxIJ{!XwjPkezp`K+gtU_hWluyONn zq@YevrYG*8@BlM5qw%>=!mf^JULk`i7V{wnjKMnKNJ6^+CiDjGlfChH+O#-ka@8|TAX3<1kexnhs9cn6GQ z4uHVYRsb}xZGvh-{oDl`(T8GGp3G3i7@1Rv1+`Wr4*tjIB+`IL9fIp#k18(*z6aM9 z0#Au@3cbuaWugzVUowhl4-uKkT+5EZMwu9G3gtfVP7ihv{cqfIdS+gJAke-(l7-k) z*$QC{oEQgO78I{L4*q!@TbVY}1hN$rb2N~fY7aPyjWSgT1rCQiW+t3D#PS(49l%ns zVh;))jB3kFd_5JQ!hh)eTnDMiirJ6cyD5;Jcgrt!je+Gr_($eDX38jU7@ti0LlKc1 z?{G@a_Q+!RL}#D8P48(y#FHdJ+RVJ1f1YE`77vJRIY~QJrJ~rO!T_`R7C>F4n$;=) z1V|XIqk=G@;4ChqTwSvf@P6}nnJ}~c`5yX&ciFq`bR}5ek(1u%|9*Q?=k%m^`}w-8 z^tB71&#Bw$0~$cyIp5fxU;cwUcU4(Z*a){>R|rOAXe#VP{Mo8I5T3QF zycy2wp-Zu%%!U`eu54Zfkgv$38Bw6&Q?n%Ou@>mmZ_Yb+uRi}>wIp3OSJ<1?3am1+ znSoGj&TDQ-$kl8s`1!EdWjC%F6RbJaywY;2IALgGWWcDaxZc{V5UlAsx0uu8u&QV5 zgyZY>*lAH0)MIhJxO$e>1NE5Jpk-C(R4=4uC;5$B=)TeS-oUwkz4qbs0D2ijJm82} ztV(P^7dl*yP<;U^5)|sZr>QJsfJ*XuPe1z7N&*~R9mjF7lxz)>eGCZjlP5`#jSaxO zW{Y;Tw$k5PhHokXm+|!Ri+kGX-0_^&nEj`q)p8(pdEpQNgjEscTKPvJor0_TG`|QJ z)>`xPYoQN{za{|*4hE)gx_%x;x~(e?+I#Jxi#mTRpzCWvyQ`5n%|WXPf&HCO&I@p$ zIZp?m)mj0yx(SOof6ri9w9?yxriGdfOLYBeQpds)10uyo#S>~Azu zQEBqNoHpt?e7HZ>My2t10_STmp=+v{+_0(-bdPK&^qDwjR(Sh4?E@Z zxMQ(*_PcmYm1%g2OgOecV6nT2Y(UP|XgZTz$ZbH{=+%IzvMLP=?Do!^BI>RR{87wq zYwm!oNw(qf-D)iF&trSsKew641M{6;Nogu)@P#|4F;klEby#id2j;OpPOY{vykV}W zjrQ`qwOSZ~zoj+QP4_ykF8B9ZoL4o~={<7P*WtXKo=>Ft!=BrX_Hw^9S`fLuoVw1s zK3e?FlQK3!dpwVt5Np#7@_)pM765uT*DTTbPS0fs#C2S)xGfj_thbucx$IuF6{#}U z-PhH7Bys1FGk9FE0IoM8S4`-fHkLE4Ff`+;MQWJPIdA;USl7^H4T(3`%kSYGw<$rFkvziadwz@Cr9wB%Xw@)5 z*fpuQM&iK}^Sy*cK*&c2FTCz!!2yN!kP2C&v+bTr7qGLNh{G^GtA?+WN)BI$%RA@N zUKiQe5X?)504$>k#PUCS5stCM-y7r(tv^N+#&{YmLm@;&9-GDwHltf9}m9v z6;%@wXD?we?(4QPe`R~qi)w2n^lG#owbEnKn%WqAn+ksV35Xt^J4|d*TU(q@t*-y~ zW8<>=-WS{zy-~y59>-NX<2oE)_s2#Hrl20n^O4nwv>u4ZtOhJACcQ`em5G#(ujS3` z_x~I+L3vVKFxkLZ*-}V~Xo3DZ6Y=RGxYZ2#-Kw=5A{l zf~uO#lY(*zh|gF2M#A)Tx9k{^rtvrai2ajF7eOUUS3!B2e?y9#fA{sX#(exb$5jkJ z8%L}%{N$gT)vmRhY@#vkmK0bb_^fVI(az;FERp%l%H{bp1c9683UKIC-i@5v z2!rNPiH?%CR>s+AP_U!0qk^G)(acClqo|{^{oI4xrdeRI^XDvqH|Kle$Gi z=$lJ$l330TVay=hR|lXDd_r`qV^Z37rg#TIyy>S>sM>XJQ#_w7lUBMA%$oPXLE11! zNnZKvjPVJs*_ah6kb++!YL!d!gXq`paE6PzjFri<;FqS+eSq+o9@024cgGamR#$(u zuluq5A&~_eFyK;-;c#wXyOLo9!XT)cF)Z!re_*(-2G&okkRDUvUS0kbrk5_r)_!4r z9ySzVngtxn(b`LAcrSoeF`H#iuK-y{sU@|u6zGd%1@Ibd*gEAg*D=Uq<_2&j*(r9^ zB^_l!L5%ksx`1NTWcca!RZ`-26+R%C_LZz)#E?3%%CfhImsNF_h97r7{JDb-L+&2$ zHmjWA4koUNA|`H5bd@%5KV0AS6U;vz=Wl?^jdZ7Nb$yOzCVf{88_a1AW{YHBq?i{C z`b%atTOv23oEtqM*V79asz{6xx7o|vis?smS}%LM9YFfmgLR{se3V1ETYuRZni}a2 zE1fK=8iU{L%D6u8xH*#GEQtHz4G@U72E*(t{LvPWG$l!n%JXgD|l5SxA=CU z{wf;rEkKRck+p_$9z-)pRJj4dx!>R6YsP$NT42RAD2bh`p*66dqnqW2uTW8$+N@BG z3L-WnfW4KN(O^!SgSQyCftmu)zZa*Tvl}IKeIG;_fm?kU(&^;1GhtBEbnxkVS$!!2$$=Yq*&n3&5l~@Qw018vJ?Jog-K&s} z=~|lwdayZ%WjbVmKFzrB#XQGq7Muu|ZDI216EG~V>HTB3sdl zhv!(!D}BwK>w1&6a?jtF($03cd~z|{0%>IZS-T8rCUd2;QH@NtRQ4APW5TspQQ?ew z^Lxg6^A$#Vdcv!ECxLR-G@h(7lm1h!Dx*@T(#L7xr!$p(=Ab09{^(Hj#_A!~zE6XI zK?g60w&969tIx}<)6nqw`dZI`nD8OicX8ot!%5uG6%1>d>w;!88aq}rYnluVRt`P& zgVWK__+Gux0%RSn70} zP5y!y`Za}*<4{%h%^h@k(XWl2`Lt(a_~v!(h$mXxMHi>TqrAo6FaWL`yU z**Kv-+y|V`m6f@*UU!VJ7N<6!1-ZHowesd}NTHV3K zTV*kM1kv?tin0&==C?Flg*W}R2GD8fUE8n5+A=uls4v%75#}P6@GI(gwxj$0rQBj{ z`%(A>zL$TDLs$N}a!g5+)}nqpFWkiRMC;g5{-ue7ZG7_#0Vf+=|8f(?5^0zVug4rRlpknsu>z%$i@eC*KsiDQ8tEY=g{o6HZIn z=5K_EzyI{Ie(PD(f|AnAM!`N??iJRiU1soZ#i&e%37t{Rv5Yb9ly(r{h{3&TOEt;i z=QZ<}3G87~k4Y{Q`o8%CSGDK8Qa~f18F0GILg%T;9)=PbEmiRSG!= z+PHq7BpQQyv|m1Gr_8ivni$u9@7iX4UR+4c*dp{@hXhA+vT-y*y=>8)-0m!9r;D-X z$Lg3C(rc&BSgQ|M6-LB_)BH z^LYB!zT5TH#{QMt`z2rDci*?#dUvNA-aAk1##@bb=rx=z)ti|Z0cTrHtyn^g-`uKy zYvr}bNY-8Uw^v-ci$9L#sYOl<5{lO`1lBQ-1+$2Z=e4e z>>VULCQPUGg|6|>)^H4NX}y=C@ol{82-?r*zq_42yEq~1E0(hV;Q0AitqTwkNsH-i z7Pxo0Kc4V|f%Z5+~2IYtlbbPGJtPvwy^Fz`lBw z&P9p&3{{Ye3$bp%NWjDOU+)@1c({`%nV5iB!*A7e&G>)QC~kgSc_Mlx96UfWLAEJ` zB#w&<<2}VIi$`Ec%f0PZ`~7!R)G+RHOkV|!;(1+bRl`Ngo%(H>KW`sr_NhGW^&g5H zg`$ByJ};d$H}1~BShih)#pQZ!D$}VnLw2e|7H9n)w$1>@KlFx*3+XJLEMEv8?Eu5X z+zLZm!8_fx=wHiqsT#&j=E@~MAY7U5&P|c?W>4V`lW76Obv=uL#9TCk9ad7atl)4zZ)5m}ssO2CaiKBL8*?o!q-qm@M$ zF6*Q0(p+J_v7cCEQOxU2Fx%WtdEi_2=Ucxj($(s9hx+}TPLm45iJwHUCQqjP{n>-Q z51pQGMoA5+guR^t2?ke5U+S(&pIPI!p*78X`bjh|E*&$`I3^$22y?VRA$jIq`kpM1 zNBG7`h)){Leb?GwI0<9^Fv)@NZcXs*niHRzt$?@<_+P+cn}y=howq zv?;q7*z5p!&2k4A1X)SVtfkYX4*wJUN>4d!{%YPTo0O+J*1Q<2VH4<}_^e@@N@CzjS8 zPqxa|#DdOl=HkUWZ&K_gH=LIwS@WB6Z+~}nJ)SI;J>H+j1|_c@t^`>CVawT~UpsL_cR4ZUfh8k!hofEZaJ5i8h5B*dx~|?KVlAS*+xNPFboFYzOjo z^1JQMy9pQpIR1qyV86|}OVh)}N#t&hZ7|z&7^Wzpiamz+gF!JfWSOpt=bl=TdON@$ zOsbH{lD2L|(URutA0Cs$<&GIEF@Xv(nMka4=>kpD3t(WFZ>|@gw%aM{rFt<7C^)Rv zQxz&gkmeLlQRrBQI7(QZ)wXD9Lb9i57`v+)WDtKpx*dTNqjf%PcUNjJ9@cjb&Vwxy z3dj!0_bNzBbWwe8r)5H8g5^SEdP@&krz8&SnT$g%%;-wDO6jNTDIlQ0;DJJ6CuYl) zpDoyIy3ZoUB$NXG_EeujpsM{@a0Qwsx=ZYRGfImbs0K;ZmplP3@j88-l=MCJI))(P zT$n5-;1VX|OkhO64i3(yvvQ~N!%>aLb-}|cc0gBF_i!LEnrIJ1k1g?77g}m&g8pEy z3Ihc%#A!L9zT~248RtVZbw;a25#X+2zt0olCiFlr9#Vc#}Dr+K>uh{`BA@-Idzq(^(x-am+x%a=i@d@ONC2&I% zDbpwSK4418Lp5P_A;a8d)NF#u& zQ4&qk^xN$B+IeJlay zZ0xv@#EjBtpNH#q2h7+fr>zo1=s@nKZxfwcXsG!IrQ*%^o%q=yDVS-3XwwHM745zY zn-C_MXK*aKiD0@nlyeeWt`f9S(h2`@A(#VqJw+15L}o*(EF;;pS08q-8osk;$~2jGb=%OgR|A;_a^xw83tL*8t{tG^v4Cs9bje zXTC?ZPa#{{5YbpjgGe$oPR5BT;q>YEKr`wRU5q9)j)QJ1v0Ie&`5!3j*R@!|7UEB+ zxn}n<=maq2%uxiCTyUAgo?&-uJQyP^N$E=c);7h-Ue*dMLLW4u+>ao{D?T5Qz$tm! z&w^T%7}&wh36A;I4G@d%eEg|wE8-p66nFS{WKr)&%%(n@kVSphmO*uKIK^1MR^Ue( z*M1#zZyqIZ<7JqT zMAcIH8k<3IxDccZ>j`8D%9_y2a47L{FGj(|@4SVMx1A2?V6UZT6!J4Rt4Qi6ZuyPa zLO8bGk1#GXxoj##1{bCD?`_C2Ot3zWDI9#zE*xAW1M@%{)PSK1bUqVG$mqG4j#sXa zu-mL6Z^_ah#RfZyBatVQw~UmBytx+=zihJnBMLjMMO-3?$^`0U4z%m<~ z&hH5)LT3CVDF-QzCk}gEKuiURU!M+X@b|D*pluG!?=uG*y4mD|iZ&z=}muJ1?F^6ZlFQ>|<-D>|rol;PBN@FeMfY4mIj} zLy5`wB8Gr5j72k!GWeY+lB6wsPjup0?dU~jK4d-8Lb7^|(GuJ3VHPo~kRomqB%S~w zPzuKVB`YKT;*TR_@|%3>x!p2^T+RDAcRGkd%#S@}1-%siw5(Sv%%M{fOi%xc-vTT{ z7pY&9spoW=qtU-~ViYJ)CMqEMl+O(xAQE&^N>orM`&7@@9jg+jZOSBg`I;XnUnY?f zJH^MwkNXTet3ru6ztaektw2I=|N zEe0rLoaaID*d+9ISNi$~Dp4c=+aD?PYrYmTJ0qTuaUz18F3O{xK8_VZ%?v7w$furu zJXP{1K0|bV9`(s{j6iN`q&PxngtvrG4debOtbD4VS5WeE>5j*c(96MQw}}>Ts+D7M z>2H)?jikgAU&%*LW^9(iWI$KE)kqDOC2Qrq9}2TpDU1|5w_p=TIVJx4kbXTKER+?+b~A*vo55{QI(Nv83G@G}e$i z$bteS?HMN7-svb8UWchF(_*?@&E#VTX`4>=NT@MPTZN~+E`^X&WWKh=6JpIQBmlE! zh7#Pe2oCkce`aBA1>iBmKUkpsmUa>a&yty{io8Vy^ zyW}u4?$pb@?vn~!A?Ew9p%F@@I!|ty=sAxxtiokMejMT5(g!6^eD>O(3o%iCyJnYp zS)yJnM@8=^CHT3bwnb{9ME#TOw-R-X;5g+1G$ghZsZn| z3^hSBUBctz6t&l>-e~K|6tros@f1!_0q0as4^PEQ{hlL!p$(KB*>HcfTe6CMXw;do zZ12VpH({$BjX8-SF9{Q zon_7@?cf03RFCVA+m4g5#AUi_2pjjezxFRMxbpODEb{H!YUUoz9M>N*T^=nONwTp1 z*lKNMbK$>oyJWst<%F)veP{IRy;+Lq@L592h~B9PXGyD$Nsr;UyLVMH^RG>l(hl{> zz>e+jalh)Tssu{E`T(%EaZH@EK4kY6>{nd;nfu{@^{H3xg%sCW-C(@bN5Rnhm%PUH zA{b>?YqL2%8T@l+_xkK*upihy7bd;#+KK5JvYkeOwv}F)S=O%cmJI>M3ti>={kx1|?i@ABFp&9v|}txN)v!rfqt) z9rb2QYy#;*-JumeQR3TmB5hTAoHB@fa_bEsqf?2a)1`atAeQG<@e$=v^UO|p2FJ4; zwf?bn2AN*M@F!=F!E$!spz>0#-`_szbaaMQxi`{x|Ef1fKJ0w{+$Xl(9J!{h+y3yU zF_7hx_)n%z9#vm(dcG*6vfcJ@Qlgl{H`I-d!x5o zt7eLci-p4+r+&*#_KEE-EtPC3gS#YuCQ0fOH(0B|n(~$KS&BPS;FX9N0ejFq^1ddrQ-XSe1Cw<)dr;C_0g>+dX7pr(N$}#sqj@KAlO?vBm4TzyVRx~ zQf|jl!&KG%qE2R{=Nk$niIN&tc1*YgQ>m#@SUfBdn3>@uhu*tYndeF82e|3IRfd|z zhY{>@2An6aj94&&9K2Q327b+Y_PBJVxmF~08t*JKy-T>h9z*9^_VEPhKQ1}_o(cE4 zzScnJy2ocqMeilFY-KTIr&-!vW`ek8oGFQjk9}b${d1n8>vp#^*^qwPJO5{gU#iKz z%A3O=!Bf<|eA6~1tPJcxXfN`|+P>!!Gh17#sjID+vi{-s_DzJas1c3Bg%zxe`6=rO z4hmi`s$R^G;P*QT8OLXUeEbc=YL4KJ?(W**T8_Bs`bo87?N?nSjZ6MGk0Pd3=BX&m z^?urPXm`4I`R)^M%3%K7U6PRLimlGjlsT6adGa>)-^4D5#~?)r2tEEauO>!e9G`Sk z9%U?i;6mJwU_q>{d5&|YQ5RN&^~7p|LT>NA#ZG?j?$eFj-XbFqIgmrMM5wwK*Rp9n z&hZp3PwSca2u4~?=V?~QO6QtLII?N$W4@kb7q#>^RH7x3@c4Kt#QC8SbF>BpNis+W zJKP1yj&OlMBIb0`_lgN;uj!&ZSwZXlI~l6KsogxFFi@N37Jp z6@9cv+UryvO26HOS%;_m}kNS*xg8w&c6CjNV)^cQvn)km$w%7Z*8oYIMm&oEj=x)+!$Rft+lQ6*tpmsoa|fz z>BT5dUm`Z-;pF1t}eZtfn`5JAX)t=w?&^Khrr#G^6+`om5X{7>2sSbRo> zWoZ33P)IRCNwGpJhum-i5{@vXgW1St-GlD~=X02R$(nZPg9)n2Y1%%wt|jCoW@tu9 znr}*EvL)n0s-cV}dI{3euR*B^pBQ576h^k1K$=Wd@`2A~KZ8mnv=?RL857)^>_sKZ zQB%7U2eI&9JLU@lwV${1iCW|uhn!|ZF0*}&8d5%+Ym{jST#?IF$!&c#mT=_b@h0Y4 z45*aU0z>(%P}vHSsWkAJm1jbKM$uu6O(rSh7?>Xkz6+h*24gx-20X3abywTtWFlsnCXxl9QjyWqtq|BD~P{og0%oa3)HYHEIox7T)UeVZOzIkM_} zy`My|GBvfd(aagXRgnEXK*Y0M%iERvKJn(umf%ebX?28nSIh11oujc~lFipA_nZ6E zqA!H-%f;}y06k+p{7aP)3a3u_ezUd0MT)3>Jk0C$58{Kt*7_ph9=2BOhhKH9nq!7C z$`9Bx+kUowdwFHP7KePa{$Y(jI1;TH$DGb>lzmzLsw@Pzp=a}}xl3+u@14xut?%u# zeD@#mC=AS$VXES;r|MiYOlzM^h%VK?vGhx`)%B+XQ4T)tx?vuXd%WoFQ#ea@m9DPm69MS6QUzUh?IPZI#(2S6YVUwn-hM9k2sp60- zu7+8E0$x@TC^xh~*WS7;zY*J;h&)z0_NG_fbf*rh!1bOMOvH`p>AW{FSZeik;nTZ3 z=K$|)O>pJwflS}la5PlF7scAbs*YlWXBRtLcJ!9!d?K#hG6=<`+b#kI`Q>MGqQXLo%0vy7@E*MW z5V>6}{Z=0O?p((4R=2A$vgPRQN`aHNo;!3^SIy&Zr`kpJ8K3ldZ~xK-iV6lc(wJWn>q@TB4Kpf-jv-d?Py6MUm0AaGFT2KCOPRm|D z7s4&oyJwWzXx|!QmgmJ~u0OTfduXXqO=Cx!wL%N`&3iAw9DdR;PqlWd~iy$4)VgV?f)% zT*r?FBkcBPJ~hW+KO`_3c!}6HGlNnSx>!n`@ak`wm(QbCx~b3_ZzDX$x7u6;WZNZrV2E z&klCUZrr9o_|f3!yo_IIXKJw;XDJm0{B=_|eQa-JXM?~7G8fb|)My_ho*V`clPNaU z#1O?6?elpLw4+PP!e^;NOcw>4KhW6(Bubv5d1C)e<8{6v`hu~Z`t$LgG|A@UtEiVz zFEi9Q^8g9wN71o+{FU9oH^mH4y1&IoEr0O$XwjziRk%mapR+Xk0I2aQ5epxTT=Epq!_~umO#)B29MZb3G))fe`dhv# zr1AhVPOi@l{uY>+PW0G^iMXqW(%`&CvUAOn(l5@mRf{(s6+jf`n=9j$x z5r%pG3x;txw0&Kys5$gBt*mi46rC)s(&KTTVgh^+V;l}GTR$sm1ZpEtQkUA0i<*a; z3&GWNc1A!aCm$C=iRRxn*3N$q|3drULm6sA5dj`PIYCY?XQw1AwT0Iw`WQkEaW z%`G6s%O@wxDMtN&5Ftd!AWZ#dvu$cY!F1P3G-iN4$JfKq-uKsq9i_;S;$ffk=Dey% zU-Z#@-4B|$qu0W&7_Y{E2-I1;s$J)te#w(!%ZBD5SwQ?8Myg=KK=%C%Dx?YJYC5x+a?0jvqQEnj1?*mMG%~&xC6Rw=OaU zwM-v?R~e?~em@7D3dl|hSESn%_fdmjR68U`{am z6fX5JFSH|OE4EM4FXXbzDluJQPhl)6_+})FtczA7D`td?Ofcn?*nI3G$fE2>hZ)tP zFHCU68XoF}e1u}f0+nuyMr85g0>NHXV+DW%Cg!Bh66JSUYFe$OW=X)Xn3X zKsdl+Y_;>aK@hT*V@^UA{26(l=0dX^D6$xSKgnWGYh&D(DtO_DuTmz9 ziQ54sgm0#Jbg4JWw(Lnyr>y5lp^U}r$iF|pL52Q|EPXZzih!F#c~e?CI6uq=m+I7N z;tWp0TnbYv>j5buNB*qEAsn_31xK>DTJ^2C&!DZO!ziqmU$G%6cT4zh~bpMVbqqQApZ@7w`P=w%{gl4W3t2-()vw4v0n})+#eQL){*SMPu!I{ zZR$wa3(zMKp8%i7)rCtzD>G3L8j0CHG$|q4u>$$u3+q;K5Z3S^>{I2$N(iMOusuz` z!QYD>1I>kAG3pK>ZpM?VxGC&XkVd5+gi9OPk|@0 zTNHervD_GTaB^5hN@G4jtoO={h?Qtmk+D>p)B=)Mf$O%Kap^MtW&Ur1>{gittSmUE z^iSGt6ZH#Ax)?G|_mr`GbQS9si3OZRxMjpy%3TjKB(taBZ)DlQ|3;Q7!r5Gw-SLRzA#Nr~DE zHS*EaN_m;zig*)!tOt8UBS9v4@)eVo8D1=|gk7i``RjaFWQFpX@mFxYzViQs7NIceo*a^k*uK=pSi zrg$U8bhx3a9ChOA9i|FHJ5s&{_nU06GtyTqW3paG&q^U8&8$w>r&nRv`g{K`<7)Ox z;5zoFd3?3&QnJuHgttm}JT-2EsbVXFMy&w} z{4B6%a6M?Iz?SGrYc@Aog)zEB2;Q@_?&ihqw7EE{^q z$O{i0II>b|+ml^_`@B-*)%Y3wSsnnd>{uu(anvLWMwP~VrBqUpd6mVEBLq>|q(R*N z#(#a4wMye*fS3lW2-s8?Fyr#S7uhP^N}|NZBb5vNbyd|RUq;&;cyUq23;mD7D*xLCI?eZC!IdXx?snKCkIIQ zk{L-FN*WgBV7|HQlWW0Z&}FI#L5KK#Y*+K8Se7VCA0{5jUI&4_)rYM{mdu{UQqmu5 ztRgEzmyzj?0Zp7MxSsqly;4Uv4%oXy@gXDVh8cW(I4r9~ag7R@)zR##_nYec_0!zh zuPzdKH8;5#j^{I(QTszhiRz^2cXeXBBpH$<>>G5BNt*h@z>%|C$X`dX=KSCtA^l{) z(KIaVaQY9fEV$@*nGPh$V{w&Eaja11!y~wofpjMCFi~jx3px&szaGO&YFGF|awx4_ zIHtiD27-tg(sQUch4R73VE+OO)_`~-A}kO!(9h@_SC8sZ=$febvE&dX65itXYT_Sg zwI493XMTo*|FmAAn`~=XQ=FycQGW7NsfI8ai-= z0w}8FzSeWJ7;D|}2-d_fk=T+-n}L11=Z9YpWxQ6m+gO&G_Wfkl+(Vl+zJ;|-QTwj+ zOug+m)F0YjK=03#-h-1huA=jWP-pT-qtgiDqaa7%EQbMe4#aj+hPjc*x#u(xkpDu= zfUq%9UYh=)l{mN=cUToM%L+y@SZx0024XtM<+f%8eG?GahKR?kB!&+c8rF5`_HYkR z5edW;Jy-DihI@FCxncgBD`d4N$q@lwr|b}83jK5|kiRb>_*iEcgi!beJJxWR&c1cj zoa0zJS^rAIE+0MCyQ26Xq78SeqzL7sLR<6q{vq1T57CsYC{+jsShDDtipcYbYa-G34|?5fPRI8N^&~YKr7UJ1RLU{o9vm=QjO66`!`GZeqSBJykbN} zLEq6|g2bmWG*uJP@#{~iA2jPnMp!SCMoakWrM@8u_LH|tI^LQ6CP|T&$RK|NG1bqg zfEb)E09YM;SbeahLJS2%CGao0eJg`|aHU`99d7eLe`cp6u8UaYK(3T#lT}?h;`OqA z=P7AK%ZY;DztR(q^$)j|p`(GD$OxPaK#%>RR%?y0eEJ5m!%_Da;5hQ@%$`*?b0f~8 z#@;AbB4F@aGrXlpp;iacu~S+A>`d_9|L-LwS|o0e1>}|vKftA?Pq+zP{>o6T&KGP94RCsG z^dGDnPigswb=O3ku8D3O^N|B>Z_MNB$zb`v^|@U`>WN_mt{18~Wy^#F`ERS=NiPr( z6uN%P6p&v)7Mk>FR?7JomDe9~1*CmRJ&NjFh{~A!B{;yk+kO8D%eIm}Rx1FJPP+b9 z8U2?}w)4=JGGX>S0mrbrA~MQPe(mhPB(n?2kq0MRf*DlR|IVejTwIEoC>GGHbnFpV z&X9pBAE^>Av5?Ym9=UQ;52Dx@9jX7sWnrp<=1(-W0^2|TK|KSHK_=e1U3d$W-UG)@ z$us(Z`v}?#q}c6|gPZ%X{}Y+GZsv%{obsEl90s^c$yr#wZE<($gr|LTthM|&9!A*& zlJumRJ>sMn-U`NE%0w9qM$I^+u!hPHx)HL55xY=Th9Y86TbR@*9h39~h3X^>2`lso zRv1=PDCs9;L~=0`CICfh>!E~WWp$g>5|RT*j^qQzXXm2jy-?(;oUfdQZ4wQ>JI8h~ z3UV}x{Ac7S2msnc?pViC2re>vf)`>T!6A+k7p9Sb#>9y+(1VtN_Nx220Cs5)UIuzu zx2+3C4mwFN>SeY~VZN3CW~&6%9ww?8fe~7Ix0MU}XjsKMSPyBg2jAt{G74f+X#r5v zx)E9NfA@VIHGRwdcSsDOQNa2pDhXA~b$34|yO_&=vC;?HPJ4XMa&AgYYGy@huxxSV zTOc$2AoeDgy6_k_BZm!h+-9$OBSWi(Yp>3OmT9F8G^A>;JB6XQ3aDJz4o^ z6N^N?<#pTt(~`unW&Z1bD+^dhC|ea#9us1#+}y+`ac=SH?SH|(>he1xhTo`t;~xv5 z^~EpW;5X?k;HOmS{NSh00EEHs?yT#o8N2!uv%}hsPk(6np7di}Kc11?AwAmv+58{f z((P1>2?=GWB{@Vzq;#-QzFI1Bq@#7}J*3=xTym5Si50-?BT1m%u4{(5j(}GTd;)b@OME<|30K}c< z^HS~V%tQSDwmKIk-Puj2i-|Fg!TpU!KCa;@M8mx#RgyArLj`GoGCVgPDoV zbP=6li`4&AO+yx`_bAm|2M zk8L-;ob}UDlwbMW_cC%d9|BLmFQuqGO4S6Urz;_QtxhIxR)}-QHVl@D9`2$>Z!qRr?A(;S1fL)RGbF*c^NJpyF|Q~;mPmki=SDFe z!>-3ky~E{k(7%}1C83z__C-$+;-=u5a5gD2&YIuGF;tp`g$7#x*@eQ$7?q|8p6AnW zO|Mylg3eJWg8NAqI3I-M z3xC6PFvcJm+gYs)QCV>rIYvxQhur!Vsu z214jr%wk`*C^=v__6E2Ah9A~-rS9-L--$Y+BLyvBA>-9=@cUns@kVF!arR6MO;uFuyqiFL#-}CF>8J%Q zs`S$HWb@Zd4IB?rSxKtVT$2y6iVc8I2gdpDw;@&2W&?*WP{A4KEtXp!7OpxuVq?CJ zW5LHskU{g^pckx3_^n+9avSORgNLv3;1h0v3mPZbfV0DB=EEEZZ$5VKix>Q(L3i;} zoMQu`wb0e>gW~<(_#iK0)@=S;8*n%E3&Nf(-xq6aN65k~%(8ThKe?Q*jOD1fC^esG{<&)2d4yajUaCQZlZ1 zjkg1*ln?JvQ`Dztj5&|*I>0RhlFUI2%gFp=cN^aJ=X`n?$~zCm@{7hURE!!;7%4CP z7378oXQO@d)F-AX&-!1%O0+Z9+JVOwrO|}ayM4R1u1gVHoc9}HFj~_LnyP$VRP}aT z9-x@`XW@#i?3WWs0~*$n2D{O_D(8cXOIN2HDTB$1haI*KMN~cNs=ZXVH^w`G44*=J zgFlwpy0uQUTM2T-qEA5tRg{=TQJ~&_&*5+n9QgjZKz_l#qD0xWR&YdV8FH@b1j=o8 zDPpDMwXIMtLr+SnmF;3iClb^<%d5=R8~9iMtsHNKKHVOZ6bbFvBR!Vv+ucU^0`4-X z9zrTIoE?^8Yu}3ZS3`&18aTE)ch0**B$8t=p!#)-@IdFc`Fp%;#%!17SnzgQmM^3b z)4^%5SuV-GRiX)K->_~rpo1)SYLS)&HV^IWu_>N}(;hK3WjNoznDPL&cb`X71e<{L zTV;jximhZpu63AjIIVK?Cm-@a7Ut)JQ*6vQ^7b(}-IMS_b7u(bQ|$|UHs(z^=@^_Q z1Z&d)!FuwSl_Yl-jZ-+;UbtxksZltK{+}w33I!9G!iyNzY1%QCsj9+Lzy))Rf8{fi zh9!XwiLJgyvNRuT$bfA;>v&ZEXwZPIUMHp!z8QVP{wEnDh0vl3M3r@XOT~n&<9IY7 zR$PU3l6|bN_8BjjR9%S0u5+-nFa#`AlwpASiQiPH2ARGI+{1p>ahX2l71j}4`CUEv zW))tHys0N`Sru^^<^{I{I>oEMGlo@{M97U@mDku)qnGv+-+UCIkJX-jqETEx zb{4qLKV{v6?lK!-`oM47dZ%mROlgGSzQa;&drsSe@%%+Q!E;bMfc^YwJN|RLcGPoC z-O=W=y$s%?Xd33nGMBabo1hb-*wt67+ZGjzYk4mCF_xk`zCF_w+T@DxBP;oT+c-+7|B(}nUTu+mMG7Tzf@Zk4C~Xc z%5~@87+Myy#!kecoZ2sJ?Hp&!BE?QjT^~LtyNMf{RA zJ;%x!vC7Xk-`zB)W>%RcjM#EI{&B8Ge8DMW64_?-aU}tQr&(~9dbab}b5`=t5~GRF z@crX41-RwwQ^w9ggoUwtao~I;ntbXZIy9tt^s%DGPQq8p&qTi|cvodAxjaN2nVaH|I|%%nOc= zwNOQYF0(OkijB8U-M)V6vZ`s;JHl)(47A7cir~R?)M%>_$#0z^f=wf9%Z4 zAu+WyYT#C?KuP{YI@)AaF#!_ejwft6n>;blu`IvJQy1iL)m#-)s zLFfJxDCTzdyKD(T<&cN;hB{Atqo(c(({kiOd;7T_B0V%*kWXNl-1n*_GqUBnZmJ-8 zRPUZZYMx5Hb>l6t9z9N36(-0BXl|l3I3bS_XpOaP3Z%xM&HtIB2INdLPQ0Ll;pVQ! z8LYn_gap5Avc11Fsr`nM_n3o$@C<*$@= z8i&K9s>gYIJVGB6L^ce z%BB#5L=^Or3zwZ=`6ZfwRF-q`YUsqR_!QQCY{K%31;-weONFi9QSYWAWG>_`4Nk0_ z=a6hW6Cd)wht~KTfrmR1+2P0pdM6jha0y`nJR!F09r>Eqtj@)lPugGXqxK!i-S$xL zHLX(tlETSffEQ#K(x8CjG>E1ccJ3cnPMm@6DD=ll!!{SDq1Rz#BZ{0(J@Jn^Mb9Kq zU$I^<0BL;as$rkqJ6*IEnOs0Qs00Fp?7@OA=-Oz&9i-}du~ zg8bAB3_Vaijoxe8RTo<^YhtD4oQ8qiZ#z0BURVd&YTd!mCb`gMb-III31-p z@>_PDaF4`FjZ?53(Zpq6WTP=%db72KgPBD)mxllUgPR zn7>|(4qu%tuHwaQ=4#{R`Wneag@xPz$JF7KK;e=z=alr~1R>MmTJ&L9yv23wFuLoP zV51f$wMU}EuxLXT>>;J;*6Rot<0{I7qP;`1xRY!M|9CBp4-54|{B%&Kv3u8_SK=qY zF^fEO(Ek~+TSf<%dWYoY9LY-zQX${+7Ts3flFO3_2gz?*wM z^yjq{n9<*vd9q>fE5pV!I(2KEka=5N(T3s>eHXA1k`3E=UN2Z(L8n}=-*A`pydoci zJ@i}f2m3=X^#b^16F9pW?wmInG?EY4E)G`@{6d;4uUi5U{84CoVivoCZg*85ejrwb zOjJ=9nZI~8;H;=6^rl=ZKAe!3G1(6E=djCGIZ-n&-2ab3Nz$k2kLC%UthK5WbD7f@ zQQ?t5*@J?>tDg%*oV`NUdV_ce8E+|gDwBzfYZ^{wrf=)ysy+K+=dzLUjR#)<2mWjU zzc3fk?<$`?F&^YN=#!dr9TsZR8w4F(TRm_>8#&|gwVVI0jx?QAy_oXr)^O?j`mHM^ zLV0%Bq?%Cg+Sg(V135?^(UjCO5N$ol^P`i(9$MXq5WBvbzQ6+#U%T0B zW@`B4+lgOoc&&B}m2ibt)^{QTsQrclpYb4oY6z1B^ykdm4rw>#LscZ`4_;ohof2hC z&SQO3i(E>r#IXIwM3)A5mC@CTk;#<2$z{U=yskL=&aD@R%srsQ0Kf$rOp8d1-@R0d z#yhS*X*MlGE{P^4+tF12Y>+=wj@+(MxLd-9`=~d-`Zgk|z6+D>emYO77mwb`uZ{Ko zU@f`yPW6Eg-Rq8Z(^m;~#|MVIUEgMX*v<@}vB}`*ST)}5 zGtGMA(0#iSl{zOcQdH5n43gwjX05E#(PYpMH5+pYl3=+e;GJI#E7df6-)kE%(#BNg zO0dHIYZhqzP_O*m5xS*j+Gn*Kk5ja9qA22}vX&ZBYQ^wmp9gUrvuQ@}|f;DdNBiVV1JzA6HF<_V$&`R(k zTSl8>J-vZJ`U{SO4MD?%if#Ba`}8pZ+g-(okU0&E2{_7~@;Tuv$f!2BgVU~kdTaL0 zVsb9P)DYs!VwQL;u3O?Zg!5dU?KD}%7Ur+Kv0)Gc+#AW)mITy=e#Hls2PkFL_uV?i zf-WW$w+hnH9##qq497rKzFip4pF3ejKQO2JcNgN@&FEn6q2Sz6VnknGA}zLjcb*K4 z^U?`Q=X1i>gFWz0LGNd=@>dKY9`^HvkuSmYI7wfye`!rER;9>dCV}6)(;4K)FYSIO z8wr#GlZu?UsstXcvE{)*?7*a?g|xt*<- zH9f_#4ZtVkZ<=Mjt*?h+g6!96jY+PMI}L&8IpiAIwUc8oRtV<_YNuf|rsVTJq{rPS zHR!J0%~8MoVmciqIJ%o-e|J?DqSJxsRi@&iP+S`n>pLjQc} zt?j$lo9R8WETD1Y2y2}c1KL=S(GPXe_BGqsjG0S@0XD+|Sf&bFV#kh39yy(`E zY&oSzg)C6t*txD;5kG-<$gCKzIf<-2Z2{Ls3**kx0Eyt+VblB4(nwo;hxQJ$p{7;ot`A1-{cP&J}YW#mc|R)qqxD%yq(+@r$MBul?~=v={2wO z|20$N*EQ|a-d;E+d+i_J-CGNrt$(d|liKS1x$H}P;FcWsN`YV74sW`@Fxq<8$NWt< zX8#M?U$p+{zJJBJZ#U2Cb8o+xW4bx(lwbGNJ$JTT%`)|`agWXo`@EJvJA41tKfB!P zquJM#Jq^8;wf&a*{MBol!+sy;%`J_X8~=IJ<;>ER;aRIszlvMIeeay&>fZ^AxA8^a z72m&ZZQknN&&_hbM%2DoxUFjKzTn9_E~kGDUbn3;;_qDhi(&h()_HnW`ugd+C7c6S8vLVoZnSIsb{Y8i4H6<>~r(cRsz7(Hw zasJkaFJBq{HC6ljQu}YD*k4)cdAWtF^uNCUf6&{~rtiszKNAl#yYt0sTHB<*_+Z)y z;`mEg{#mQoUf<8a=Pzz`N5aac{n-bOy&$Q639Fc&vi}NtL7e-BRyJyn3noAKaA4wL zdGmq_uGX2gs;hOcas@6aTUgCjOIob{>s*xX`q{ zJy&MdqYq~n9d^#<5`R6v}@ZmFj^>GIuehhA3K0{`oR8d97SrEsaNmeek=*Nl&1sBVA z@D}`Fy7=&>YI{D1jGT9Ih2DjSi9zkhtWEAM{0Lk(lCj76v8>el3l+e%`f#zDbIH7N zc1y24%MkhiJ#iqWG^-=uFYE-rh6F+%5$3;8W?h^s=E5SaRC4t C!yv=} diff --git a/GraphBLAS/Doc/GraphBLAS_UserGuide.tex b/GraphBLAS/Doc/GraphBLAS_UserGuide.tex index 7b20941446..07f87969a8 100644 --- a/GraphBLAS/Doc/GraphBLAS_UserGuide.tex +++ b/GraphBLAS/Doc/GraphBLAS_UserGuide.tex @@ -14768,6 +14768,20 @@ \section{Release Notes} \begin{itemize} +\item Feb XX, 2024: version 9.1.0 % FIXME for SuiteSparse 7.7.0 + + \begin{itemize} + \item minor updates to build system + \item C11 complex type detection: this is now detected and configured by + cmake, instead of using an \verb'#if' ... in the GraphBLAS.h header. + This change was required to port GraphBLAS to the clang-cl compiler + on Windows when it simulates the MSVC compiler. Also added a new + feature (thus the minor version update to 9.1.0): + \verb'GxB_HAVE_COMPLEX*' to + GraphBLAS.h to indicate which kind of complex data types are available + in C11 or MSVC. Contributed by Markus M\"{u}tzel. + \end{itemize} + \item Jan 20, 2024: version 9.0.1 \begin{itemize} diff --git a/GraphBLAS/Doc/GraphBLAS_version.tex b/GraphBLAS/Doc/GraphBLAS_version.tex index dbec813bb8..e970a35c25 100644 --- a/GraphBLAS/Doc/GraphBLAS_version.tex +++ b/GraphBLAS/Doc/GraphBLAS_version.tex @@ -1,5 +1,5 @@ % version of SuiteSparse:GraphBLAS \date{VERSION -9.0.1, -Jan 20, 2024} +9.1.0, +Feb XX, 2024} diff --git a/GraphBLAS/Include/GraphBLAS.h b/GraphBLAS/Include/GraphBLAS.h index a42ee32da6..39778ad673 100644 --- a/GraphBLAS/Include/GraphBLAS.h +++ b/GraphBLAS/Include/GraphBLAS.h @@ -1,4 +1,4 @@ -// SuiteSparse:GraphBLAS 9.0.1 +// SuiteSparse:GraphBLAS 9.1.0 //------------------------------------------------------------------------------ // GraphBLAS.h: definitions for the GraphBLAS package //------------------------------------------------------------------------------ @@ -140,19 +140,16 @@ // definitions for complex types //------------------------------------------------------------------------------ -// This is a copy of GraphBLAS/Source/Shared/GxB_complex.h. It is included -// here as a full copy so that the GraphBLAS.h file can be self contained. - #ifndef GXB_COMPLEX_H #define GXB_COMPLEX_H // Compiler has support for C99 floating point number arithmetic -#define GXB_HAVE_COMPLEX_C99 +#define GxB_HAVE_COMPLEX_C99 // Compiler has support for MSVC-style complex numbers -/* #undef GXB_HAVE_COMPLEX_MSVC */ +/* #undef GxB_HAVE_COMPLEX_MSVC */ - #if defined (GXB_HAVE_COMPLEX_MSVC) + #if defined (GxB_HAVE_COMPLEX_MSVC) // Microsoft Windows complex types for C #include @@ -162,7 +159,7 @@ #define GxB_CMPLX(r,i) ( _Cbuild (r,i)) #define GB_HAS_CMPLX_MACROS 1 - #elif defined (GXB_HAVE_COMPLEX_C99) + #elif defined (GxB_HAVE_COMPLEX_C99) // C11 complex types #include @@ -237,10 +234,10 @@ // The version of this implementation, and the GraphBLAS API version: #define GxB_IMPLEMENTATION_NAME "SuiteSparse:GraphBLAS" -#define GxB_IMPLEMENTATION_DATE "Jan 20, 2024" +#define GxB_IMPLEMENTATION_DATE "Feb XX, 2024" #define GxB_IMPLEMENTATION_MAJOR 9 -#define GxB_IMPLEMENTATION_MINOR 0 -#define GxB_IMPLEMENTATION_SUB 1 +#define GxB_IMPLEMENTATION_MINOR 1 +#define GxB_IMPLEMENTATION_SUB 0 #define GxB_SPEC_DATE "Dec 22, 2023" #define GxB_SPEC_MAJOR 2 #define GxB_SPEC_MINOR 1 diff --git a/GraphBLAS/README.md b/GraphBLAS/README.md index 44fcd6fabe..cbb8760b20 100644 --- a/GraphBLAS/README.md +++ b/GraphBLAS/README.md @@ -4,7 +4,7 @@ SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2024, All Rights Reserved. SPDX-License-Identifier: Apache-2.0 -VERSION 9.0.1, Jan 20, 2024 +VERSION 9.1.0, Feb XX, 2024 SuiteSparse:GraphBLAS is a complete implementation of the GraphBLAS standard, which defines a set of sparse matrix operations on an extended algebra of diff --git a/GraphBLAS/Source/Factories/GB_ops_template.h b/GraphBLAS/Source/Factories/GB_ops_template.h index 7a728717f4..e6ab7004b0 100644 --- a/GraphBLAS/Source/Factories/GB_ops_template.h +++ b/GraphBLAS/Source/Factories/GB_ops_template.h @@ -858,7 +858,7 @@ inline void GB_FUNC (POW) (GB_Z_X_Y_ARGS) } inline void GB_FUNC (CMPLX) (GxB_FC32_t *z, const float *x, const float *y) { - #if defined ( __cplusplus ) || defined (GXB_HAVE_COMPLEX_MSVC) || defined (CMPLX) + #if defined ( __cplusplus ) || defined (GxB_HAVE_COMPLEX_MSVC) || defined (CMPLX) (*z) = GxB_CMPLXF ((*x),(*y)) ; #else ((float *) z) [0] = (*x) ; @@ -887,7 +887,7 @@ inline void GB_FUNC (POW) (GB_Z_X_Y_ARGS) inline void GB_FUNC (CMPLX) (GxB_FC64_t *z, const double *x, const double *y) { - #if defined ( __cplusplus ) || GB_COMPILER_MSC || defined (CMPLX) + #if defined ( __cplusplus ) || defined (GxB_HAVE_COMPLEX_MSVC) || defined (CMPLX) (*z) = GxB_CMPLX ((*x),(*y)) ; #else ((double *) z) [0] = (*x) ; diff --git a/GraphBLAS/Source/GB_ops.c b/GraphBLAS/Source/GB_ops.c index 7cc6f4c05d..ccd8749bb5 100644 --- a/GraphBLAS/Source/GB_ops.c +++ b/GraphBLAS/Source/GB_ops.c @@ -568,7 +568,7 @@ const GxB_Format_Value GxB_FORMAT_DEFAULT = GxB_BY_ROW ; // predefined built-in monoids //------------------------------------------------------------------------------ -#if defined (GXB_HAVE_COMPLEX_MSVC) +#if defined (GxB_HAVE_COMPLEX_MSVC) #define GB_FC32_ONE {1.0f, 0.0f} #define GB_FC64_ONE {1.0 , 0.0 } #define GB_FC32_ZERO {0.0f, 0.0f} diff --git a/GraphBLAS/Source/Shared/GB_complex.h b/GraphBLAS/Source/Shared/GB_complex.h index 18a313f9db..331b4acc53 100644 --- a/GraphBLAS/Source/Shared/GB_complex.h +++ b/GraphBLAS/Source/Shared/GB_complex.h @@ -205,7 +205,7 @@ // macros for basic complex operations: mult, add, minus, ainv //------------------------------------------------------------------------------ -#if defined (GXB_HAVE_COMPLEX_MSVC) +#if defined (GxB_HAVE_COMPLEX_MSVC) //-------------------------------------------------------------------------- // Microsoft Visual Studio compiler with its own complex type diff --git a/GraphBLAS/Source/Shared/GxB_complex.h b/GraphBLAS/Source/Shared/GxB_complex.h index d9fcc1587c..5da5f60532 100644 --- a/GraphBLAS/Source/Shared/GxB_complex.h +++ b/GraphBLAS/Source/Shared/GxB_complex.h @@ -7,52 +7,8 @@ //------------------------------------------------------------------------------ -// If a user-defined operator needs access to the GraphBLAS complex types, -// GxB_FC32_t and GxB_FC64_t types, then this file can be #include'd in the -// defining string. See Demo/Include/usercomplex.h for an example. - -// See: -// https://www.drdobbs.com/complex-arithmetic-in-the-intersection-o/184401628# - -#ifndef GXB_COMPLEX_H -#define GXB_COMPLEX_H - -#include "GxB_config.h" - - #if defined (GXB_HAVE_COMPLEX_MSVC) - - // Microsoft Windows complex types for C - #include - typedef _Fcomplex GxB_FC32_t ; - typedef _Dcomplex GxB_FC64_t ; - #define GxB_CMPLXF(r,i) (_FCbuild (r,i)) - #define GxB_CMPLX(r,i) ( _Cbuild (r,i)) - #define GB_HAS_CMPLX_MACROS 1 - - #elif defined (GXB_HAVE_COMPLEX_C99) - - // C11 complex types - #include - typedef float _Complex GxB_FC32_t ; - typedef double _Complex GxB_FC64_t ; - #if (defined (CMPLX) && defined (CMPLXF)) - // use the C11 CMPLX and CMPLXF macros - #define GxB_CMPLX(r,i) CMPLX (r,i) - #define GxB_CMPLXF(r,i) CMPLXF (r,i) - #define GB_HAS_CMPLX_MACROS 1 - #else - // gcc 6.2 on the the Mac doesn't #define CMPLX - #define GB_HAS_CMPLX_MACROS 0 - #define GxB_CMPLX(r,i) \ - ((GxB_FC64_t)((double)(r)) + (GxB_FC64_t)((double)(i) * _Complex_I)) - #define GxB_CMPLXF(r,i) \ - ((GxB_FC32_t)((float)(r)) + (GxB_FC32_t)((float)(i) * _Complex_I)) - #endif - - #else - - #error "Unknown or unsupported complex number arithmetic" - - #endif -#endif +// This file is no longer needed, but remains in case it is referenced by a +// user-defined type or operator from earlier versions of GraphBLAS. Its +// contents have been moved to GraphBLAS.h, which is #include'd when compiling +// any JIT kernel with a user-defined type or operator. diff --git a/GraphBLAS/Source/Shared/GxB_config.h b/GraphBLAS/Source/Shared/GxB_config.h deleted file mode 100644 index b584fe8be0..0000000000 --- a/GraphBLAS/Source/Shared/GxB_config.h +++ /dev/null @@ -1,20 +0,0 @@ -//------------------------------------------------------------------------------ -// GxB_config.h: configuration header -//------------------------------------------------------------------------------ - -// SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2024, All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -//------------------------------------------------------------------------------ - - -#ifndef GXB_COMPLEX_H -#define GXB_COMPLEX_H - -// Compiler has support for C99 floating point number arithmetic -#define GXB_HAVE_COMPLEX_C99 - -// Compiler has support for MSVC-style complex numbers -/* #undef GXB_HAVE_COMPLEX_MSVC */ - -#endif diff --git a/GraphBLAS/Source/Template/GB_add_sparse_noM.c b/GraphBLAS/Source/Template/GB_add_sparse_noM.c index bd5c3f60e5..52de20f79c 100644 --- a/GraphBLAS/Source/Template/GB_add_sparse_noM.c +++ b/GraphBLAS/Source/Template/GB_add_sparse_noM.c @@ -151,7 +151,8 @@ { // C (i,j) = alpha + B(i,j) GB_LOAD_B (bij, Bx, pB+p, B_iso) ; - // GB_COMPILER_MSC_2019 workaround: the following line of code + // GB_COMPILER_MSC_2019_OR_NEWER workaround: + // the following line of code // triggers a bug in the MSC 19.2x compiler in Visual Studio // 2019, only for the FIRST_FC32 and SECOND_FC32 operators. As // a workaround, this template is not used for those operators diff --git a/GraphBLAS/Test/test128.m b/GraphBLAS/Test/test128.m index 732229d27d..701a43a848 100644 --- a/GraphBLAS/Test/test128.m +++ b/GraphBLAS/Test/test128.m @@ -43,7 +43,7 @@ S = sparse (m,n) ; X = sparse (rand (m,n)) ; -% test the workaround for the GB_COMPILER_MSC_2019 bug in the +% test the workaround for the GB_COMPILER_MSC_2019_OR_NEWER bug in the % Microsoft C compiler A.class = 'single complex' ; B.class = 'single complex' ; diff --git a/GraphBLAS/cmake_modules/GraphBLAS_complex.cmake b/GraphBLAS/cmake_modules/GraphBLAS_complex.cmake index a0d32cc3b2..0678e7928e 100644 --- a/GraphBLAS/cmake_modules/GraphBLAS_complex.cmake +++ b/GraphBLAS/cmake_modules/GraphBLAS_complex.cmake @@ -21,9 +21,9 @@ check_source_compiles ( C double _Complex z3 = z1 * z2; return 0; }" - GXB_HAVE_COMPLEX_C99 ) + GxB_HAVE_COMPLEX_C99 ) -if ( NOT GXB_HAVE_COMPLEX_C99 ) +if ( NOT GxB_HAVE_COMPLEX_C99 ) # Check for complex number arithmetic as implemented by MSVC check_source_compiles ( C @@ -34,9 +34,9 @@ if ( NOT GXB_HAVE_COMPLEX_C99 ) _Dcomplex z3 = _Cmulcc(z1, z2); return 0; }" - GXB_HAVE_COMPLEX_MSVC ) + GxB_HAVE_COMPLEX_MSVC ) endif ( ) -if ( NOT GXB_HAVE_COMPLEX_C99 AND NOT GXB_HAVE_COMPLEX_MSVC ) +if ( NOT GxB_HAVE_COMPLEX_C99 AND NOT GxB_HAVE_COMPLEX_MSVC ) message ( FATAL_ERROR "Complex floating point numbers are not supported by the used compiler." ) endif ( ) diff --git a/GraphBLAS/cmake_modules/GraphBLAS_version.cmake b/GraphBLAS/cmake_modules/GraphBLAS_version.cmake index 99eabfac4d..f5df5d16ae 100644 --- a/GraphBLAS/cmake_modules/GraphBLAS_version.cmake +++ b/GraphBLAS/cmake_modules/GraphBLAS_version.cmake @@ -8,10 +8,10 @@ #------------------------------------------------------------------------------- # version of SuiteSparse:GraphBLAS -set ( GraphBLAS_DATE "Jan 20, 2024" ) +set ( GraphBLAS_DATE "Feb XX, 2024" ) # FIXME for SuiteSparse 7.7.0 set ( GraphBLAS_VERSION_MAJOR 9 CACHE STRING "" FORCE ) -set ( GraphBLAS_VERSION_MINOR 0 CACHE STRING "" FORCE ) -set ( GraphBLAS_VERSION_SUB 1 CACHE STRING "" FORCE ) +set ( GraphBLAS_VERSION_MINOR 1 CACHE STRING "" FORCE ) +set ( GraphBLAS_VERSION_SUB 0 CACHE STRING "" FORCE ) # GraphBLAS C API Specification version, at graphblas.org set ( GraphBLAS_API_DATE "Dec 22, 2023" ) From 42d8ca3b30875fc214b6b07845d6c9305dec88d2 Mon Sep 17 00:00:00 2001 From: Tim Davis Date: Sun, 4 Feb 2024 16:05:28 -0600 Subject: [PATCH 22/98] revise all version numbers for SuiteSparse 7.7.0 --- AMD/CMakeLists.txt | 8 +-- AMD/Config/amd.h.in | 4 +- AMD/Doc/AMD_UserGuide.pdf | Bin 238549 -> 238936 bytes AMD/Doc/ChangeLog | 4 ++ AMD/Doc/amd_version.tex | 2 +- AMD/Include/amd.h | 10 +-- BTF/CMakeLists.txt | 8 +-- BTF/Config/btf.h.in | 4 +- BTF/Doc/ChangeLog | 4 ++ BTF/Include/btf.h | 10 +-- CAMD/CMakeLists.txt | 8 +-- CAMD/Config/camd.h.in | 4 +- CAMD/Doc/CAMD_UserGuide.pdf | Bin 231806 -> 232215 bytes CAMD/Doc/ChangeLog | 4 ++ CAMD/Doc/camd_version.tex | 2 +- CAMD/Include/camd.h | 10 +-- CCOLAMD/CMakeLists.txt | 8 +-- CCOLAMD/Config/ccolamd.h.in | 4 +- CCOLAMD/Doc/ChangeLog | 4 ++ CCOLAMD/Include/ccolamd.h | 10 +-- CHOLMOD/CMakeLists.txt | 24 +++---- CHOLMOD/Config/cholmod.h.in | 4 +- CHOLMOD/Doc/CHOLMOD_UserGuide.pdf | Bin 508971 -> 510613 bytes CHOLMOD/Doc/ChangeLog | 4 ++ CHOLMOD/Doc/cholmod_version.tex | 2 +- CHOLMOD/Include/cholmod.h | 10 +-- COLAMD/CMakeLists.txt | 8 +-- COLAMD/Config/colamd.h.in | 4 +- COLAMD/Doc/ChangeLog | 4 ++ COLAMD/Include/colamd.h | 10 +-- CSparse/CMakeLists.txt | 4 +- CSparse/Doc/ChangeLog | 4 ++ CSparse/Include/cs.h | 4 +- CXSparse/CMakeLists.txt | 8 +-- CXSparse/Config/cs.h.in | 4 +- CXSparse/Doc/ChangeLog | 4 ++ CXSparse/Include/cs.h | 10 +-- ChangeLog | 39 +++++----- Example/CMakeLists.txt | 40 +++++------ Example/Include/my.h | 4 +- Example/Include/my_internal.h | 68 +++++++++--------- GraphBLAS/Doc/ChangeLog | 1 + KLU/CMakeLists.txt | 24 +++---- KLU/Config/klu.h.in | 16 ++--- KLU/Doc/KLU_UserGuide.pdf | Bin 290890 -> 285135 bytes KLU/Doc/klu_version.tex | 2 +- KLU/Include/klu.h | 22 +++--- KLU/User/klu_cholmod.c | 4 +- LAGraph/CMakeLists.txt | 4 +- LAGraph/ChangeLog | 4 ++ LAGraph/include/LAGraph.h | 4 +- LDL/CMakeLists.txt | 12 ++-- LDL/Config/ldl.h.in | 4 +- LDL/Doc/ChangeLog | 4 ++ LDL/Doc/ldl_userguide.pdf | Bin 221635 -> 221993 bytes LDL/Doc/ldl_version.tex | 2 +- LDL/Include/ldl.h | 10 +-- Mongoose/CMakeLists.txt | 10 +-- Mongoose/Doc/ChangeLog | 4 ++ Mongoose/Doc/title-info.tex | 4 +- Mongoose/Include/Mongoose.hpp | 10 +-- Mongoose/Version/Mongoose.hpp.in | 4 +- Mongoose/codemeta.json | 8 +-- ParU/CMakeLists.txt | 16 ++--- ParU/Config/ParU_definitions.h.in | 12 ++-- ParU/Doc/ChangeLog | 4 ++ ParU/Doc/paru_user_guide.pdf | Bin 210546 -> 184266 bytes ParU/Doc/paru_version.tex | 2 +- ParU/Include/ParU_definitions.h | 18 ++--- RBio/CMakeLists.txt | 8 +-- RBio/Config/RBio.h.in | 4 +- RBio/Doc/ChangeLog | 4 ++ RBio/Include/RBio.h | 10 +-- SPEX/CMakeLists.txt | 8 +-- .../Source/spex_util_internal.h | 13 ++-- SPQR/CMakeLists.txt | 12 ++-- SPQR/Config/SuiteSparseQR_definitions.h.in | 8 +-- SPQR/Doc/ChangeLog | 4 ++ SPQR/Doc/spqr_user_guide.pdf | Bin 194363 -> 165719 bytes SPQR/Doc/spqr_version.tex | 2 +- SPQR/GPUQREngine/Include/GPUQREngine.hpp | 4 +- .../Include/SuiteSparse_GPURuntime.hpp | 4 +- SPQR/Include/SuiteSparseQR_definitions.h | 14 ++-- UMFPACK/CMakeLists.txt | 16 ++--- UMFPACK/Config/umfpack.h.in | 8 +-- UMFPACK/Doc/ChangeLog | 4 ++ UMFPACK/Doc/UMFPACK_QuickStart.pdf | Bin 218233 -> 219302 bytes UMFPACK/Doc/UMFPACK_UserGuide.pdf | Bin 485625 -> 487039 bytes UMFPACK/Doc/umfpack_version.tex | 2 +- UMFPACK/Include/umfpack.h | 14 ++-- 90 files changed, 386 insertions(+), 325 deletions(-) diff --git a/AMD/CMakeLists.txt b/AMD/CMakeLists.txt index 3255eca23d..5bf1c2c9e8 100644 --- a/AMD/CMakeLists.txt +++ b/AMD/CMakeLists.txt @@ -12,10 +12,10 @@ cmake_minimum_required ( VERSION 3.22 ) -set ( AMD_DATE "Jan 10, 2024" ) +set ( AMD_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 set ( AMD_VERSION_MAJOR 3 CACHE STRING "" FORCE ) set ( AMD_VERSION_MINOR 3 CACHE STRING "" FORCE ) -set ( AMD_VERSION_SUB 1 CACHE STRING "" FORCE ) +set ( AMD_VERSION_SUB 2 CACHE STRING "" FORCE ) message ( STATUS "Building AMD version: v" ${AMD_VERSION_MAJOR}. @@ -49,10 +49,10 @@ endif ( ) #------------------------------------------------------------------------------- if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) - find_package ( SuiteSparse_config 7.5.0 + 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.5.0 REQUIRED ) + find_package ( SuiteSparse_config 7.7.0 REQUIRED ) endif ( ) endif ( ) diff --git a/AMD/Config/amd.h.in b/AMD/Config/amd.h.in index 3192e11391..956af0102c 100644 --- a/AMD/Config/amd.h.in +++ b/AMD/Config/amd.h.in @@ -392,8 +392,8 @@ void amd_version (int version [3]) ; #define AMD__VERSION SUITESPARSE__VERCODE(@AMD_VERSION_MAJOR@,@AMD_VERSION_MINOR@,@AMD_VERSION_SUB@) #if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,5,0)) -#error "AMD @AMD_VERSION_MAJOR@.@AMD_VERSION_MINOR@.@AMD_VERSION_SUB@ requires SuiteSparse_config 7.5.0 or later" + (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/Doc/AMD_UserGuide.pdf b/AMD/Doc/AMD_UserGuide.pdf index 189cfbc6ff0d584dbe91c5c739973bcff74ead95..84e47700453f0f5312aff2d1f780cf9a09862849 100644 GIT binary patch delta 21528 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∾K2-AjLa$j!jutY4$^5Vw$fFU{;@A6T48Yy5lIBD(al zq(1V2#o>$Q40-0?SGXDcq0Rz-sdJ54Rr}*wQ+>JV=jq8peB@u#@THYt8yBo_!5N=m z_)ptxZuu9TmVa4n`8p>@jt3q8cE{biyIZ%rV=_H&C!GBHFoIYUE3Ff&9pG&V9d zFf=knLNhfsL^(bnJU2KnG($l$F+?>vLqkI_GekBtHZnCZG%`g(Gc`6uIX+zqFHB`_ zXLM*FGdVDmQGzLdCDJ)8WnmZw;P3qpuEDj<*w?XN`@YVd84RwS;o4`2L_$OqLLn-l zAwdW;F&c?hqY|Ohsq}h zU=jpz&+4p;I7tYk*>`P>gpp8)_e5tABpfn%qxB<+giIf4jUt~Q^9x#INHk<|LTem} zg{%Z<{Y4T;JY=;>XGtUxvc9V|g(O2Zmb88*sgNz-+tNrn$sm~|i)51=;v%^ukK{x4 z!|l(re{XYtaH>x!Bt@hc@@L*&{2kFnDJdi6q=HmJ4p;0W|0ZpYTzamW)R01YUwQ{eVgE{R~YoGbNguVb+#4 zwZI&^HF;nz&os5dJUwV?gH=DLsh#{L3pY71GYTao HMNdWw*BCYG diff --git a/AMD/Doc/ChangeLog b/AMD/Doc/ChangeLog index 3828f5ab22..ec5e745ea4 100644 --- a/AMD/Doc/ChangeLog +++ b/AMD/Doc/ChangeLog @@ -1,3 +1,7 @@ +Feb XX, 2024: version 3.3.2 + + * minor updates to build system + Jan 10, 2024: version 3.3.1 * minor updates to build system diff --git a/AMD/Doc/amd_version.tex b/AMD/Doc/amd_version.tex index 31528c9f32..86e5a5c5a6 100644 --- a/AMD/Doc/amd_version.tex +++ b/AMD/Doc/amd_version.tex @@ -1,2 +1,2 @@ % version of SuiteSparse/AMD -\date{VERSION 3.3.1, Jan 10, 2024} +\date{VERSION 3.3.2, Feb XX, 2024} diff --git a/AMD/Include/amd.h b/AMD/Include/amd.h index 188ee5a67f..b448db967b 100644 --- a/AMD/Include/amd.h +++ b/AMD/Include/amd.h @@ -382,18 +382,18 @@ void amd_version (int version [3]) ; * Versions 1.1 and earlier of AMD do not include a #define'd version number. */ -#define AMD_DATE "Jan 10, 2024" +#define AMD_DATE "Feb XX, 2024" #define AMD_MAIN_VERSION 3 #define AMD_SUB_VERSION 3 -#define AMD_SUBSUB_VERSION 1 +#define AMD_SUBSUB_VERSION 2 #define AMD_VERSION_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) #define AMD_VERSION AMD_VERSION_CODE(3,3) -#define AMD__VERSION SUITESPARSE__VERCODE(3,3,1) +#define AMD__VERSION SUITESPARSE__VERCODE(3,3,2) #if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,5,0)) -#error "AMD 3.3.1 requires SuiteSparse_config 7.5.0 or later" + (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/BTF/CMakeLists.txt b/BTF/CMakeLists.txt index 19afabefd9..f7554a3efb 100644 --- a/BTF/CMakeLists.txt +++ b/BTF/CMakeLists.txt @@ -12,10 +12,10 @@ cmake_minimum_required ( VERSION 3.22 ) -set ( BTF_DATE "Jan 10, 2024" ) +set ( BTF_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 set ( BTF_VERSION_MAJOR 2 CACHE STRING "" FORCE ) set ( BTF_VERSION_MINOR 3 CACHE STRING "" FORCE ) -set ( BTF_VERSION_SUB 1 CACHE STRING "" FORCE ) +set ( BTF_VERSION_SUB 2 CACHE STRING "" FORCE ) message ( STATUS "Building BTF version: v" ${BTF_VERSION_MAJOR}. @@ -44,10 +44,10 @@ include ( SuiteSparsePolicy ) #------------------------------------------------------------------------------- if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) - find_package ( SuiteSparse_config 7.5.0 + 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.5.0 REQUIRED ) + find_package ( SuiteSparse_config 7.7.0 REQUIRED ) endif ( ) endif ( ) diff --git a/BTF/Config/btf.h.in b/BTF/Config/btf.h.in index a5985db8af..668eac0af2 100644 --- a/BTF/Config/btf.h.in +++ b/BTF/Config/btf.h.in @@ -274,8 +274,8 @@ void btf_version (int version [3]) ; #define BTF__VERSION SUITESPARSE__VERCODE(@BTF_VERSION_MAJOR@,@BTF_VERSION_MINOR@,@BTF_VERSION_SUB@) #if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,5,0)) -#error "BTF @BTF_VERSION_MAJOR@.@BTF_VERSION_MINOR@.@BTF_VERSION_SUB@ requires SuiteSparse_config 7.5.0 or later" + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "BTF @BTF_VERSION_MAJOR@.@BTF_VERSION_MINOR@.@BTF_VERSION_SUB@ requires SuiteSparse_config 7.7.0 or later" #endif #endif diff --git a/BTF/Doc/ChangeLog b/BTF/Doc/ChangeLog index d857cbc6ed..249147abc1 100644 --- a/BTF/Doc/ChangeLog +++ b/BTF/Doc/ChangeLog @@ -1,3 +1,7 @@ +Feb XX, 2024: version 2.3.2 + + * minor updates to build system + Jan 10, 2024: version 2.3.1 * minor updates to build system diff --git a/BTF/Include/btf.h b/BTF/Include/btf.h index c152e879aa..be3222ad1b 100644 --- a/BTF/Include/btf.h +++ b/BTF/Include/btf.h @@ -264,18 +264,18 @@ void btf_version (int version [3]) ; * #endif */ -#define BTF_DATE "Jan 10, 2024" +#define BTF_DATE "Feb XX, 2024" #define BTF_MAIN_VERSION 2 #define BTF_SUB_VERSION 3 -#define BTF_SUBSUB_VERSION 1 +#define BTF_SUBSUB_VERSION 2 #define BTF_VERSION_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) #define BTF_VERSION BTF_VERSION_CODE(2,3) -#define BTF__VERSION SUITESPARSE__VERCODE(2,3,1) +#define BTF__VERSION SUITESPARSE__VERCODE(2,3,2) #if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,5,0)) -#error "BTF 2.3.1 requires SuiteSparse_config 7.5.0 or later" + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "BTF 2.3.2 requires SuiteSparse_config 7.7.0 or later" #endif #endif diff --git a/CAMD/CMakeLists.txt b/CAMD/CMakeLists.txt index 70e620eec5..00fb54c14c 100644 --- a/CAMD/CMakeLists.txt +++ b/CAMD/CMakeLists.txt @@ -11,10 +11,10 @@ cmake_minimum_required ( VERSION 3.22 ) -set ( CAMD_DATE "Jan 10, 2024" ) +set ( CAMD_DATE "Feb XX, 2024" ) # FIXME for 7.7.0 set ( CAMD_VERSION_MAJOR 3 CACHE STRING "" FORCE ) set ( CAMD_VERSION_MINOR 3 CACHE STRING "" FORCE ) -set ( CAMD_VERSION_SUB 1 CACHE STRING "" FORCE ) +set ( CAMD_VERSION_SUB 2 CACHE STRING "" FORCE ) message ( STATUS "Building CAMD version: v" ${CAMD_VERSION_MAJOR}. @@ -43,10 +43,10 @@ include ( SuiteSparsePolicy ) #------------------------------------------------------------------------------- if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) - find_package ( SuiteSparse_config 7.5.0 + 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.5.0 REQUIRED ) + find_package ( SuiteSparse_config 7.7.0 REQUIRED ) endif ( ) endif ( ) diff --git a/CAMD/Config/camd.h.in b/CAMD/Config/camd.h.in index 88da242065..72855cf799 100644 --- a/CAMD/Config/camd.h.in +++ b/CAMD/Config/camd.h.in @@ -402,8 +402,8 @@ void camd_version (int version [3]) ; #define CAMD__VERSION SUITESPARSE__VERCODE(@CAMD_VERSION_MAJOR@,@CAMD_VERSION_MINOR@,@CAMD_VERSION_SUB@) #if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,5,0)) -#error "CAMD @CAMD_VERSION_MAJOR@.@CAMD_VERSION_MINOR@.@CAMD_VERSION_SUB@ requires SuiteSparse_config 7.5.0 or later" + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "CAMD @CAMD_VERSION_MAJOR@.@CAMD_VERSION_MINOR@.@CAMD_VERSION_SUB@ requires SuiteSparse_config 7.7.0 or later" #endif #endif diff --git a/CAMD/Doc/CAMD_UserGuide.pdf b/CAMD/Doc/CAMD_UserGuide.pdf index 8d389f5d2b3a0ada3592e89ac5ce79083abed52d..4a42392bbb3c913b81d29ef5a00a850b05ac49b5 100644 GIT binary patch delta 22388 zcmV($K;ysuk`9-a4v-}QHIt!9D3MMKAJqwA;zAP0Q)J2M@tMRiy0B(pS3N#7L5|fbh|87_7 zyN7$yCYfa79clcCVagwA;p2O$`%BB_*Z*fL@HIZkrmfsTg8} z&V}c0ZBtA}*!f8I)1=wsv1wUiRY>K#V15S#$WW6~{+uK~&u3ctn@{r_l0?I5jB%g0 zPwCd3hnH^0dRrds87^;l$V_NBB@Up6Odx{=)J%NJn|J71=r5W*+VI*I&pYdnOI0y{ zJwzLpa1BnnYJrmfQ4<#|RHKjx!vw%UNYoRl5fU^)0xCvGP{N!b!3q9`o)1`q0*EVa z?F))J^h*%^aDBzxfe!sp103PDq;=-94+^56;5Yv2|L z zvA7v=fANk+Y6L)}Syotxv@_derptL*Kvzgl5bNUPN1h%lv@)h7 zOwchLyY%sKX8VQhD9FN2isQOZ>nCu3l4ifw#Te{d z+zF3aeZe6}3s)m4bh1}Waz<#f*$w??Y-2ck+r})SO~L{qaLsu}3#USp?xly^A?6l2 zhj3ZwxVqh3{dvW~%FyFp0`0^oXd=qnR#(6O5qcT$!3TKZYVT;JDv#@gad>5agwua|YY@gqX@rc9ojp@*Z=k|Vmdwchv zO>nom+d#^3$&D{?6rtZ9az`!F3Y&`oASoS7!oxXn8#Xf?0d|1XWdqoZ=R^R#ACV0e zxXo=B(GbE4;26+cD30$7NW-yzIeowc&Wjyt>Dg1uMlgxAw*A^fdW2{*f#`9gwi~aV z<7VQxfe4O$I+Wps*nmWw3^J*+%V5)t`~mf+F$eHt3f==j0-i7ODM-TDH4g=k?IViY<}uEHQn%!q2QEYB zu-S_2A)l3q2yu{kp9U8$V*takp{Qv?k#zg#4JA4?6y>nlj5RiCC{B3NG%P1}umHl) zHNfb=H4Qd-2Z2AJ&OHGU9Z|feT33^ZoR#$e9236?`;^iH_92P*h9lzJ0B$%(aKrHg zZa5=wGXuC88(8If9}?$(;D#ImH{-w!Ij5FQJ09Jw5u8~jHoPNtLr5aactV`Va)f?q z-;2n@-gm*ziOD*AYck~m@X2H#C@Fw|yI!K?9RDqd2QPQH)yj2N4bXi0M8Ne4w$i=Z zqX|usJQmgipr+|b9O~UxvwH?0eUBjW2K^__y+!{(Drv*D%=f*2&67La?rt)AGx zw|kLoo8B!w{55QUz;J%$oMz!K_=yc4$l%d)39({`(xDkahlfzy1?yO5e+u}}mMq<} z!wdW8B7cKBXCI7{`UgQCUR|$LtQ5cWbtoif@P!XwhX#0V2Os+P{{aUC*r$_$?h~_X z2wr9ZHj|-AD1W_JYj5H>6#d>`!O{;?x+Ell5ZITL7P?{vO4Wp_vpXwfh-s}!Y}QFS zWi&s29c<^-z<}Bvgvi73z2}~L?zO{(d(yfx&00_Gce|aMyQ*0R`x>g&?blqd_V?MT z2UiHghGH7#*`+-h%pKQuXAZxiHI#POGS6D){F=fjrhk~9KLI}$^T>)Hmmu)wgnE$j zYkr$1Obfbrs#MLq6kXL zKQRjQVt?RlmfB2{l^=<5GS<+OS^BZe3`X{!{6?oFfzu*Bh$D)ia7hGC4}k}QfnVvh zx7+L7p5KgT&fIqSZIfp`%gomj|3BOBj*M(Dymp5CMz<7MRo?3!#38H;^^-4QYf1b# zz^@a+WH^~h8CWG0ARsZ0iYNjY5Gjl}grcYxn}5vYkt|$JZUp3BL+Kc~x~d}K0ni0_ z5C&NMK3qnKlsPya##mNhe|yM4fc2V^XSF)%V^idxXU^sdkfNfG#h7%E^QMxu zgnu<%XOy}-rVZpX?o7l3D}Gqor*fH$e+S;-fnOBEu# zltJW$m#5Cq)xK_VXws|lHXqjA+0Py-b}rmuF`Vxe?~lN} z-`V4l;9oIH0!4Toi`rnO!9=QTyxO*q|T6S7J&945+^;z&sKP_88MuPl!e)YH9!8U|_p~`T7-H@U#1SQB{U! zbn1t_fllnvb(ZMu64*ZQ)qZx7O*C}&_Hg*b!d(7`#6dfvyzY`T1pwh@7%wvJo!Q78 zIyd&MGfbYYe)1rg1$>p>+kee=-rRoZMSFRe$w@J2xe}%JK@v8}dcjZ^qeZ4Ft*rpHH9ID&I72logAPBfZy7onx+nhu z@eT+wgY$E@^K$_xG!rr~Ff-y?#aIQ|Eu1suIgUj zkZ;HwW3HwmQ&DFWwQw*4N;!aC8CjWF_yFRHYOHJk78Z6U78W)HDk=?-s~zw^VgxEJ zptB3e0nGO=194}dsq33e!qoMD%}&t)43KlP1F*6KSh@IEx%pUF0BkHQy#Hh9;LHb* zFm(r602G-3at>gi3j&q6gQJ%-$jaLFEzJKs0%*)>0j#{d+zfxa14QkC&LDGBFhJ4N z)f#C37SY_)4xsK}4g$J*{Vxg{0c%%RM?Pj|4-XF}Q+pRC2WKlGS_XiB2gubLpaygS zI=cfc0Dlz>P%^a#{!o2zV3Nfy{wmmp2bLum#W=@D?1P zE~@}gb_9a|F;@7;fC2EI-T+vcSpQ4+AMd}2K;XZfP0h_6>>W+PULdd)z!GE!1Sm@> zFu8iVG5}1$7JnI<+POG?y!o5Dn}Y02&E5?D&fF9rC8`QAeJk)k<++$UgB)F5m|Q@1 zf0fAm7tLFjCBYWr4)*pyu&WEgU-?OZoPp+VZTDjS=VWcc4jy2i{{Tx6*uwI!A}rh- znKi*6CpVz1#D7fQLN3Sjx`^WP`KxAC%Y0NZ)}G5`B~ndSAAv@|8?|Ec)DIx#T^Pk;|2 zI|qP~jgu9?%fkbI;O1lj`2BAd6;sfEvS9h+DhsxB0Py~k>|2-qCt>&hoIlNfc7qo1 zzqyng-i8(kp!qZ71}vN`=5JrD|DPxQZpZ{stx>SXBB}KAUFH}tCe+sHGSIyQLvTWf7=Lhkpg)F zEmT0R=GOlV%Rh3>zn07n1O}=&xPbn;RRD~vEG+*=_qJK)wr@9w%iBc$tpdI+&i@W6 z2{w1I_-n)1IJp3(&d#P@2rO@d#Ky@9@L_#hMGK(k-!lwgW&%67zPSM2%JTzQIyfWz zb)sCH0A|sDzeN8aZUD3RAH)M-miU8s0nC#BMcga^W~o1j9l$L62feW<{y}dnN`KHB zi}HUF&l`)%AH)V=R{MkAIMx3k4gj;pAH)S<*7}3qBIx`5bbPzC!FE7P*FRF$|49GYxc`dZTIKk*XATzs zqI*l!>0j_I(SMb}`j)86zu+6eAG)^af5Eq&yZ?b~ zZvO48hltdRcpIc;x(5AR4; z?fm8YY@Dbzz2Awj^c`np>eH!c<1q1iB1R2=kpth~PQF@!w$Sa6y>e6qPHsFXDn*zN z9z)Wejl-3z6JZPcst0vk@`%rsGmNpCF$RHUb5w<9x$}7BaITER@8~ctJyGXw?`ARb zr(Q|r66q2A&SKe1eDt>1;vVO{*Q+(yT>9`S@%8YCp>HuJrm20zj?(0C7k$c0Hk~Jb z(&uryC%5fWSnZBzy!VyV9-NPV8c|bC@zLPpF+*d?M#pS+$Ryd9ktM-#vwuiubKX zpJQ=13`Wh@zpP_5xACHwND{Yq2kcmX8VqE(KFBPdP#1Vzw}jlhBB_X%Op$ zuS~v!4%YWv3Lz-u)n_mguo50nxgg1~iJ$k&sS65MsN06cDBbfktwDA8<%7=P@sE$k zp^;r6e57%Hd@sFmm0Q;~nB5|OC>){J&r55Lha{|l>RR=Xe(|GxrF|Qfrq>oM)*RXZP=>7cx%kL`)`$5>i`M?R#^&V<9(O)Pn|;U|ARyh)HFG%4omUXm$s}&`jaV(bwjb^G^`n9;n5_k zGE=XX3(?YsX`{W?N)x#FTV9+jPNri}Dt&NFj~uLL9TH!E@xj`E)P=5}+ToPd=svH1 z-S=bHV>`_!Y;Uqk!w=!k!oP&+EJ-&Xd=uvHrfG^KZ>0N2dPQJ6kyP|;yGj-Zk_EprAZlaiSn{3UBR1F$WCO{p6sES{$Ukl=g z=2pO&FqvIxtm1O@G@BKs^3f_2R;b1hcQW2ni^o**M_S=_=o0aFn+0iFW?0-tJGR+* z6}NKy)#k_uN_{DG*T~DU(nNiwpSG5Lvykh;qh;jkL#MlNp9 zB_qU`xOk!=DHGN!?&C6nua8<#Q7qR`Q{IoS+eNu5dBO|y8 zzm*n7Cti_`=}qA4#(R;^oiC;E1+BhO9*R-U$>vypyqhZ6G<$ghwmhBib^NK7+@mtg z$;GW4>1r!7c%7U*HM0S53;UYQ*ozEOM81=BYr!!g(3sUxrlk9hktlenty>@0PKNkGG!?A zV#P|ZpTbK#J;Y@)pYlsH^MuL0Nbuoo{%qVnHU#!KM_XJ|l^g;}h!|4z#296juIYTe z4EB4`#E(`iII^lK_}2m({BY^N+b_|^|bZbF7d{g3;X&*8vf~b_B9h* zIt`>2n%WA(yg^hhPPHXQ{eBwBnln*3GIkd}SRkEf(aBoz1QM*?OXZlPOOw)cjD3@T z`S;2zCZ^R#A*Aquh}oYxLaM#t)a`_6qn@?58IJT!cUCrbdIioT)~>238ga0JOu8XNH0)+)OSiTDbAw! z;8kq%XNj_apUjeKh24iRb(Ox+%cYNh?ABopb5R#io@M_^5J2?8IH7Pvy`QRw1``C| z*wiy=?4=??+=k;FQCFdd^X$*%dw(9zm3D~W?VFe*H^QxX3{XS+gy|XXt4C%ujN0QN zX}W0ndFFh)6=eUK6U)It$ZS@t^m_JzAoC7deszF-zZ?DP=ke#jDrM^_InmL7%&f*P zA)_)3UibXj1TQ*5_z$x7u5Gimd=^R+7wJL8DGIZM2c~MC1%qUv&lY6eYKV|2*&ida zn(3|z-~xO1cn=D2)oX_(EHG`C1__ePDC?iJu13Quja<_>{H!^Fi5oIX5za$0HL@iP z%B}ERAGS*Hx2MqUiW*77vJpamUc;1>Pw-YKJWV0qe^J)Rd#AO}*h$k$CfD4m*W;zL z`M$fH%&^XTaZO~AsU@J|5gUo~M2SuEj;X?;XI+bRnh-j^ya$I^3zLX{q9RenCl#}h zm@r20r^N8%I#-w^LyG2-$Pqg$>hW1%d3p`%QJNX21?DuJvgCWt1mw?}8rDzv>vrzF zyq$!`w2+T;_!E?l;@Mdvr^IOV6Etm#aqs85R#bjzMJFjc7JeCZH5WJOm@n92$&MRp z2&m=ZtkxB!8UApb6u~NgmxV}+L{NvBGAsB6EG+357q@NdgkBV7Q1^K9f%dC0$1-t` zpS*5i9euOKf{>B8MT3z`%DpaD}}Is9}0_XDYj}og!>%_ zx0_xklLvoqyEfT?KMC)U-n(U3|_Sn zJL2N9U{3}tm6A91RxDI|8=iy_fiIL5dF3ewn zhlBXi%oQ~XgCCxOED%gz*ihko2YATw%v-Vv{3;mH^s%m!w|C!rP_~B*rgWsm867CC z)T^W9C>oi@0jKF=XvS}q2uTvlsK9p^bI*)jy;3{jh-tcil=cplZ}&T^=i_L~&#^s| zL^!R!)GKO9NvQll;TCf=Jd}k8EF|&O^wCUi?gmDa(Pc`Qx*A3IP52Yy6CB^hP->T< zm~Tk6TsmY!Ruo{1sc`*d5A?l|Krl^+#d2J_!<+-@eVK9SS&9Q2%C5kAXXSgSh|ff$ z$o;5LB;lTaiV3p4MhM+EHTskm5*jCZ3uuo>GlMomty@9KAYWysLrGo_Gj*sAmtiq@ z?}Y7ztg$At<}5a=OQ=r^&sbdLXj`k3X7J|D8Kmt$R}-}fSW!NTl5c`_iYBgDn;|~q19qvn9mejyx8?#pf3A`^IaAr5f zVHrIgCL^)jNg6$Z?Tk{-q1MLs(IQ-csD)cKenqZC*%~TqW=_x4Hb)3V-e*l-;>`C- z-WJc;(fYa*Ott-1(E^8nB85op{MrS1DM?gv;jHE(%5Z4yK2={#9pGIIm=x=kG zl9TjK%AH7S1V9=of4Rhj25;~|x9Dyp?nW;tDjzeJI5J|v_W*;J8a}6c7-hrKnHzPx zB|x>yAKc0aP~ePI#n}JBtRDr{O@ybP92B5`tmXzR!+jRommZozEb)eTsjdVh>&;x@!X*1$&k z=WKu9VqsFBjzA$E^8-Iib1x>rmdK_(#B{T$TJ|${B;LJ``bCPrd6At5Bvaq<^sc7W)WEf_lAm-La5o zObwWqmZL+xnCnrGW%0#2689W&=q&*$#RSNUD2ZgmoML6%Th*}y-%EF{goh(}6~E0@y(r9oQ_cHt zChBSiExIr$pP6Pnl(ukxi+@hE-S@(*^51Zip*W`DL77tGZUnfaZZgZ_k|0{~A0@LW zS`zpyCH<0OCw`wC8?5dj19tS2_{{PH{^|6_>vqr7@>6g?d5$Q%u;g7FlNwsS7z*Sj z?0#T6tof9tukz1w`gToX$|mQ3X~E_2$b?!#aKi7VLr#;4)MAFMZRWX4BWHe2VFKPS zOP8oZsyRxF(t05H;Ofo$oJ6biFh@b3uvuf&u}qdZnMomW4GP#>+U|VJ+=S z>=-f~t~p?qPUkiAM?aSbugTo3A2h3eysVKwx>@@6T$VE;hT!hqU?UH1a1ZNUMvJA9 zy&?=g;fnv1gD9X4q~7eaSB#`0gxM{a=!MTRfD!HO|32}P+flr_pje>{qeM=uo#plp z{We?8|FPKqm5V=rIIiZsyUGqNrgYu&?!F2h6>5W}AyvGxYv9ND_WfNvJIgLnTlk$q z459Ib{Lt-YQok0F2;-^NhTT`#ife5w>cetcSc=DQivjgnF$=%w3vnsO6W9(w#+emj zx!&$D7bZl8;>V+g=JZDafzvS^Ax*G!!CxMmYxfliS=zgQ!tM(f4JOB4;2cIsSFhu) z?K`v(Di}&M^t-O%ikBBmLoPlHJIAf`EVq6Wq%UAPb~SFEVfYYGI-o+ka{aw5&zWu( zeVao&)Nzrr0Fg-3hnO*@rF=R_ERygVkRKC9;IvYZS%hF}qCDa2v>R!W0b97S{f+&Y z0D5+?gL3&8H#-eoQq{RiXEDNAQdfM zkjh=MZDKYvxZOQ!aF<=bKNyEY+MKxp;=nnE>$6LS{N!bH+--8^0D*|W<9ZjxX?Umd@%L?W*!CIhcwawO>I@o$cPI=|Ony2&dGcNW zVH?&;TX3b;j!aZ$((MX5Hv5ZC(s8tsFXjp%yv2hVUbF%=7ey4@0^nK*`7GStCB_xXMMB}6%Y zvc%7H0=1u+)f=G32A~8LCwTpIi1k<1*tefV+31ymEl$aI+##g6-b>yl>0dCR7Ji%6 zQ&I|&ASB)$I3%^k!;UHTCB?XuKNRAeiDu%Yk>7s8o)w~p4-2N}==7QwDaYP`&5ipm zHh-?KOWM|za{IoTn9<}JJtj3WCGl#1GLfvLjM2B^R!vLMnd`j;CAv-QeU(QokRZRK zCiVvn6_W|m-A`oKzGMUwysNQ~5qU>p@KAQ6QyP6hv4!w7kIKz_)heFr=dG3*aN?b;RIj+Or{*y$gYmi!wF3;@gcG+vA+HSoTv2^ei zp)p=0KFfsD?m2;3=`AjzJ7L`PA)ZV$ZXrIO=Cp_9L4Y%)#14-#-2nzl_hOQJ*!V++ z?+z=W9CtBa1QOx(of@>Qp2R0h36L=-5fzdwUo{4Js~ zvBYyw$%BxgO{mQu4wWw-F*J3!P_C!MHi0EVD=AFM|l;SIzmQ zOB+AUSIsK5i+kFCc#m={zG?u-X2P+1Yk*&O3m!=&5Fx)HMCO`&S4pEVsd8^km9yj= z2;@ay--7GYMTTpd&OrGBExJJk>*VL6(L#B2B(_F2R5CHC@Enc}Us2T+UL^|7Mvs=K zlC!}nA_>~$(yyXY`rPnJ(;l98Q#`G_X!AJWozta2&P&G zAG_G;M>?W^vx4lsIu9OrNnf?9g7Z|?6PB|-jaQB63F=Q4-NF-_uO90*AQ89?LrR>`oFob6g^7cUz6j1zi9r_yVZ|i8X|UYVUbpjoi?@S zHi`L4FiGB@O7pB(QCfRa>gbte_wqfy#E0`q3S3ay5dZO-^BFk^Hk~TGYyTvD`Cepe zyx!2h8U=8~Y4&hve2DdWJ+HXMIcAoQ?|gf#IXbZ9R&=fy^41eu{@G%vV^Q4wzF?>yHD!T6vu}-hl&3W-V)f(jI;5jG)u}HI|5kCsR=ch0?_AJaEg| zA_8hMC_AFK3zXvVI5CKYp{IzpBc!OzDbCuX8TwUQzL#|FB=yoaUGqW<)%A*xqcRXJ zPfeW9()7iU64((|keh|tTg}7#L~9OGV>{vTvMq8hCotT|dxcUpzqXho6LJ%`u$s1i zJCG55rBEw;bZ`9>2w63=;V7|&Q(E-yjOT;K`xZ5BwTEs&ytd3&n_4!r6b60r{?}!G zb*`&dN9{Bt@QIFg0y~D&E!3Pk-eWD(amxjn_36&DKNL~Qck&HKEzvQ9CCT8#QQ6IiQgugvCrC#~Btwt7l#y#Uf5x{9wip=nX>9jGRI~Qn zMUeLwb?BDBvFqdc8Wx;21-BmYE<&y;rHol27+-G%*I&y_Z9M_bL%SYBev$aupjp^< zuO|yee%TqD{CM^Lm3u<{qMbw5C~Fv%ZhUc6T!i2%jfled*KlZqxf_oB5m--degvVheRTqFSL8{g0gJFOEmNae^Yzti4FVh4?p0SVwjPAk50^O-#Lbeb-CrJOArEBQnjBUDiK83ATABmpUa;G6ve=z7r@YE&JPmL@YqT?1iTX81T7J0NB(v^b@%HkE7P9By$;9GLWAWb4 znH4|Emw&V7%yd&3U~QyV2fj0s@hEosdhOdYa~H=RtQLDiWfBd4O=}Z&*5_g5MrHc5 z&c4+Ydz%^%G-}+bjrkIaD3I%9EZ-qD{7eYxWpcKO)P#ys!|8a#Us>6Sv7_WKxi#JE5M1WqkG&K#QpKz$gh2(}qE4SuSv!{qAmFnMk%q*(lf(WQpUME%0HiYq((v{AyD=vabHy*ehYR(|`oa8E*d3ul_^-0Dcco z0B#xxH{}T4Px)PhQnN8rVRlSL-&*I#s!6&YWD(%M0eB~lx4afRD8J&1Lw2&wVX%Za6%fN5eF}6o4x=Sh?T(q?bM@sjViA(WQxMvJr+x!aM}Emdkq?qf&XJAji{|c;om2BU9x4W_RItt%9uZG#=)ZcyfLIbq~F~ zz|pZKR#I^oCi|7OmJO2Tg0Q8z#Ub@MzOkO!f=a5f(Rw%p7k$E;z8A2-0z1nT)ji99 zIhsmjEDw)HC}y!s<-Ar9k?}{kVXRF!f_v!2?0~rUQJ${&l=uQvfUzUk$r9R+)cT({ z46Wy*vsHayF?Q0DnP1#APOg@(H`QYfC3-P6t_(;h zD7FRN?;;^4F1E8|oE!^Pci0oVzH{m!sy&(Py<4^3WjXr+A7QdHhi)Gin+1MNqZPr4F6{#t7jF>T)df^w7JPw4HSHRAW#ueO^zk~Ztfk67f z-VS!AVkn#*ImciZYw8X&N@1a3U&~`Y!DHt2m04Cl`CW9_aroP zr2JJF4y0C0?4_(GVq+`vR(o52xY@IQs)8MI^4t4AYwSl!aeP zjI`3c7CyW38bmxoyh*D#8Qt`oBquVH7KGI1-b%9+`~aU8=dxH7<+19236F&`BEZ&7 zvRJv~+`?fP4;>7>WUhJau-z|E6$z%c?b;J_Yhbvb2o&{5cdmm|MFtjK(q%ScMM%WR z&`uYP5K*?1b{$sDn$QE=0O3t9oqYz(AZqTJJp=%hUu39N>kfUG80be`z+omoV@2+F z(i}Ud+JZp#8=Pbbu_MrbZt0o_L3`Aks66dzeAjH{6Y3AmkboMVuT0~QF)C6r!)6aX z<|vUxS|=VP`~5%yBlE|P>(3%kF_#>h8gw~FDnV0Uno#w#r=0@N^j$#kg=hULt`a(} zn?*-=;-=FGnlJefq7sLV_z&MRWDVm~*4Hh=3*McEIs;m2sjGf}Nt5*r>?tXBsTRDf zw5$p~D$iX~aPe8}?%oJDC&Vx4e&0DQPsjf?qc&~EARQmS!f}Rp8ob+;6!t4cx6eL= z%D|Gsr?Js6q$ zJvl4`+b1VOEYrWH1HJk(hqXo7Nj5r0Y$oR?LRM9*)vZ^|c&3^w@|c^>FbU=mR1^5z zbD6goZE6G^xEe0JrIV%Nf`n9x#9Mc2u zqEr~SVaj!Xs~wYL?C67KoqG-W6UsyBZ)Wr_c3cD-BH|#Ff{pMfZVYoz40lFC|HR-% z<)D}aPJ^$#BIIKt+3&q6P}qtZ;I|If?uPgg+*jpuDeOGpF`DTy>rwUZWaQp;_1JYv zh7O!SbZJO`^x>DyOG0ist0r2fl+fm9PDxJItyx`vl@AJyFFe(Bq~TH~aBE?n8Nu)` zLcfiybvD)#mV;PYc_)korH+nK59^ZrxK@9w7>W1On1xzunY7sCQkEpgkW2wgc+Tv2 ziM&RDj{_X2ZZdjwn)9{`P3}dz*lcxumJRf1Oi!)Ge_ZI|*j|F;YN}CBkiO?g9~b+H zyiMz>m0X_~}$qN~hFuU?duu&#;GwDL@UdxF(+cAidqD6q4%m_MR7&Uoi5%-X25 zI<~Y;skI5$c;)jAu<_83FiAyfa*vT+c z`wlJRRx9Y;*_sul9Pt$9j-*9(IZC(_U8u<57RDcq-^q7F>Q|_Vq)F3AR#{yWuPt|f zUB(MHI7TH6PLh;ZDGzHkyUq2p65Z`s9nFl_e0UkWKBwye^Z;VNdq(=fXJw)2l1a0c+BE#|yFUFRZJZFBYQOy1ssq7+ICZXxD;52PbpV5!2l|C} zZ$D8U+{vGp;?>`06nq;2XPVJ3To*a)jf?x!{)@a}j$NzeK5-L^=>TGbn)KB(Ld5d+a68CD zqqAlx3XfW+HWCh`ltg^fS4!f4R&h2KmR3m-``&+&P&m&%N+($%PXFM1m@Xy*rGqAB z3o7l~MC65sw!=ih(`I&eM74OLbtq=d47C?3Ol8JGro@-epr0M}7fosJ3|MZH*eFkB ze=PP#x~{&!=XLL-9>!MAVN+k5i%fqprMwCL+{zowFQJs7)UZl}*>1vrok3}qH6c`I z(L78@2<*MG;OZEg`)R))m z3(<2|d!gpM@qLxm^XGfm^K)&n%z&X#_r@=s`vbF3kb6S|Wg>aS8W34LDjtfyNNk4* zHx{FVa7Y}aT(Z!A1bPClRJlpNAU@_3=V5YdjVA1Dy%hOA?ya*n^i9}Sbd4rMd#@3H zQ>q^|Wgm04*hF3&&N*V#L}HG^FzV_@qlqHMpGt1CCaK#Al&WwzdFNjo=TEJ=qJ2BA zz=+5V_sClG6J&RTEU}wJ`NQyx%LZ}ZU=L= z`5at-49RC_RYItd;`o6QdUlK3bHBfe(3G!cFFAaaon{bgRl4XMlB7GNg@X^-yhrpe zhRDS15rXQ=DSmLZjfgYk9gA_MEybih5@?-(k~b0!IihE_zXHQU5n z7B|n$jm493z8f4(fKD22o^-X6=$HzA#m#Vk2&a5oylSweGQa%#Hx}@i$F!4)#@c!a zr{w8g3`hlEi}_Ug^2iW~UJv3*(33+FSu|bUH3=VGlo;JQV1atn2KAl}YpN?f0xc#i zZoHG(qOKS)8+2KUo2&D|vnUBQ=|a1w+etj*&<6{d{;hE<54)(EVY`4HW0vpUHeeU0x2bUtxtHJN6um^nYx?ocaEP-#=+H>d ztN9AF7GxFOU17Toa}FY)3m0%2`~V14E$Mn_k(C6ihAWXX`LCR8;aVTIqC0pS0o^KO=(W4)x4XGW90I-o-VgePoYhwp479~Xq#G%T zp}TuvXprvimX?%`0i?S@It3(#?vQ5a?i`SYkxudYJ>2_xpY}R?{r-Tn&sl3{pmx|I z?(dRvqGN5Q7xYpN;Y@t2(Atu=T@IuHhLs?e-Fsfva_Ks1LWZxGBT(cQaviY>{e~#H zqH0)?22BMKXw;3cSavOFMRVnvQL2IRfHhw*iP5wN$b(MlzGS`ZnhbOoj@@H|_3P7Z zwsJZILjD<>#x#AMAj7`U{eIuS=u9yHj9uJ0MrrJy;=S=y`(0XoH~2jZ4^EU=#2K2k zdNh8XU(~KPzWyLAC&~MbwOwIVrYhH$jR?3#LO3FF40pAoYH)ySRDnZ3^`BB+v6o@+ zJ{hqYe1WSxu$;e2XQR;dolDOW0{3$PBTDa(5!E2pFLJh*<<@5OK?I z7SqnZc25^!q2PM6{WL0W<82ec7yY&FQu~Iq=Uq4C{@j{+!o42;8TiS{CFN9;wZ;`6 zPO(v<%Y}=Qms{U0MlaK+RoRpMy-!|62;iz1zO-S{Kx5~`1DYAR3%lrsS@>BhrsI{{VAmcp4r?g&TI7)>XVvo-g{MCdd%;#aIl zH7fd~E?)!#+#&}RY6B+()Nd4VriEu6QjF4qtPqoG!_To|!Hzn46;apLll>AHW$BB$ zMpB=2$f*+!6wE#pDOY8BMo-qj(mE*`DrWgVLrVbxkJ;OeUi)IrVL0GqyjMN*bPz|Tf>mpoE_E9IysHRHuQ{l=)9y8t(?;N9(>VEPr}S?N3N($I&`H(X_E;NU zh0gN_r26u(dRum_Kfl4bn|JEd^MbQ*5U2gqn7bOl`<4F*&Gm3RxkBD%jE|>zcR!It zg+9xCD65LRibG)4#A-O#g_#8442Lg2$! zvbnuTuECM-9HiZv2nHeDLn1CkU&A&TGF2DH88@O-%k*T=^uXmyQ-e8ULH&U`KlmgJ zP@(+7e)nEv%&T?~P8+cW>(w#!FcG8?D+d~CVyeaJ!1)yjQj+1Pe*OF(1Og`lT|fD9 zYmJtnVV=nq=q>UPG(ue_aM8!?rdc|(T*m~H9&+x+QnGW*e2+FfjH~g#$7cPG9jntI zATG6$3Jgo~3f%aLcCkL;5>pUROMgz|+JBVptte!s5IzNb`iVipgpz5T5+EpgYc&E( z&mVkI#|*0r=`&;s(B#9c^0eIM&|Zv3N^?AZNO2mQaOF9TUNL`Ex^P6;Zm<{Ek`PR= zQ>y_hSF5X8di<5}ejG|DIUE8N$OSeMFd&M@v>&Yg0JAB3NPBf&XoqUa#wR(zngmrP z-wZ3IzJYRHz0S^QrDBDS=dn{ukRy53idgmCE%(G-isZuUFAWL+gcokr)&(23yfK83RB$IBVXIz07D%&DP3}^O5S^`sA@}RY`x< zQeL(8mp#-6?_;2W@p7`*q0Sspdj1|}8Qu7Nm~*%#bJw$?SQ1HX)%~h}>>iXpGwEI^ zO=6`! zm^pCz8-0>G>}F;|Rc0HZp&%}U5bQ>^W+H6N`J`kcuW^S}q%76^FMYQZ@gK1WUpTm+ zU*|~R_qF)K{2Ni*4JBVZx^8DI&gMeQI}FhhJ00~|((H+ylCt0wc88*9H1h`}#qOn3 zobw|cc{y!29PS$V{3iYrS@1&L-jZUl_GV1UojJs^Cx%Hs%;K?4gh3-AXSd$Be{spfVhSi3$W!)y%bQ75pdqi*2P?!hOVelBKJ;&WcF6AYa-MGXUlcXONoVr^ z$_ygWVF<10u(y|~Y&=|i+!IWC@%4Xys?ptkg#f6w- z0z+_z;oT8ax(s??Stz&Nm4m8o@7L0`d-}z@XN9$f^?KTfR##%?IC6PBxOB{f>^E+A z|4(l{oxBVBu~ZA%GxsvDv!dN9%?@DR`x6tGk0UD}G-06UfvKvAV@P_>isBD03mj|Oq~S&GUHc$ z%59ZW8BQ=VGb)V3s`|`**XQ75p_;@(lVP2l(CoTAd-MT^9G~*Ngv5JhJQ*dKBoXw~ zr1**`4KmkMy1O?Bb>$TGg%)8px$@t*zYK`=lQeZtDN>{x{Iuu%;CN1^iIKZJ7KI>VX4mc9#F9|H?F zMf$#$W+i?}M_k)E&z_J-o-n_`!d@bexGv-hlAWO!yNi>U{L1iCYPQ5H{%xRsDwBaZ zFj1f=zc?(NfKEcTj&kkY`L7~bOobGBtunP8ahhc@ny}bX-Wry%8X&4jx5sBZH z%7t{4C*jP!HThDzeTAe*_Zd4$b(%?OzGEec;G$j90k?TrrartAdA+Y(m0#T&^6lMe(CZBp+H8 z6@ZoI(ZoH2eBERioGS?UMihaq72nlgjDn5G#usESc^@F*9h<@`7RFm)4UCHMvKpQF zQsEgNdCzSFFkq~M^iR3+u^hkXduNDHPcL%idZ)dMV(py8R8zHq7rIl{b!d1ytvFCW z_N3#Q6{0scS7w9Q-b~xSBsB}IM8^$I4UN#7z=}Ua6Q|DqTkpm_s;&YWa@FelJ}5Co zAQJAcz934A7Bf`T4I!5O_HDYH$+E_Je+T+=_v@Is$sjQXXJK6=e~Nf~aynHgY&_XV zppqjEA>poEZhRW!#WE(l_PlXmb@t|rq_?OTDNJS` zV`~s}^AmKGLw1Fg?pff@(-jQzABfj*hHaQzb3eMhi?A`Ld z)EB5FScmHxuXy(}$S!{WJ=@d58Va>#^=BA0X?cVNxK{c~AnU2!VgCv0N}PRraEo$U z-r_PrX49prsg+QXqG*)Vj76VnZ!4s2`r1}qQ||x4Ka;!Vqy)v7OP4Ik6Ht{vsU!`p z;jhuGha#Ejq{*>;z{6HjTclI-(+mbEgp=;>@~;_L2(J8Y>}P#RSgb5{9_{Q{cSbs& z<{`udH;j?4iZlXhyqta*k*6~o6K7K^Yo=ABQIgShj=%k#J2K2zm#>}m@B@!7CTvK< zbCMP!lZdNfF&vAmLs(KwnwK6%p`Jp-L|+|h5Yoh}@X=mZ1HVi>ItWAJE(&$@dh}C9 zk*x%(B$0K$;$;c-LFll=>v-<7(?x}pbD28_SVz9yzw&?-Lvv5N`Kz9zDDKFdAS+a( zbp%9a7g4wH$3U)RC^vumlgVZ7FxjC+obMm`(^419&-|1J76jzrYInFVa44uw<&Sx6 z@0A@sw-~`6G6u^t1{3}*4;obtr9r4|G_V;7lfcc#yrxV|`(_5OKRBW#iB!>^-o;=B@~al zt)cLcJ2uyNB!Rtq?8`6uF{CY8oax#plPVtj#z|^ci#VZt2Q};TNUV0q!J9uZMVLIm za)5v(n~%W{kO~1N8hkY3X&X4C8}RMv&#Jju*lh8j_#N$!t#$s(QxVXGANu_*IQZ@W zh&KEtG7AlOwNBbVS>8G}v>V{plRGK2&J)>7Qohfzb%hw6&9AZcagOj-^FkKvCZjZ>oleAlw7^^_G8#gJmWE8e*V6KuO^8& zJp_R@ui$lBLgtVhc2gfRLJn6(HGj3o)63F(pf`T~kqpLCOTN$>mba0pzvw@BXff<}8)PSBpMQoytT{xE$ zikC$5^T$x@t#rGZhnDt7Yb*F0x-}D%sl};C_{oM^^WGl6q|*?`mm; zCrgF%L~QF;tBYfX7H)@=Rp*DGiuBENo%c*gQoXzg3p>1dOpCK zoV|d2WmW%fZ$j?K1XoQCqR($dJAr>tyHpb)_t@I7nBvD4`m3Lw95os79kY5B<}Grm z9~H#k0z?E(9!R@!6x1TtZLc^EruUm23ZUz^mG_hzHs~Ioufz$!F43~N zJ@cn(6uUIdTw%O`P;Uu~^oVr{+?s+H%f(!Uwr4>X_7$hMmEP+G05^6QHova${q7&V zY5_a$vo_$t%VMuKpB$#;n)&BJ6hJvBrHXB8L+Z4frQ;vrCY)*9nj+_mvDWR^`fqk! zg4FrCo@&9D(?w5gcH9_hV&JW#9NkwH|G^JP9ME=R`ZLW?~jhP^h= z<2QC1U5Bl9zzTwmN&@3OLS;(ucVw{Gh6Hl^uU19&UUtVv9omuDgzZ(gWy{v8I*`pg zFU>T~!xsv%Uykp7z+!*x3nux21R2#oO(n?174N<=e?U}{JZGnjr>R87l` z1nKwT3k1C-L$E5{;p3K(5qm{csAf!;J|R=fZH=d!1y#s9c|Kj#qu{S@8YulJGlSnA z5HK%-5KuNg7?bbj4_u84O5@oc)Ib=e@i;x*EV1|7lmY{eIBPz z17_764ztpJP(t@~m;2xhNeA;Ic7c zAwY%8Fu5+(>`5NH9=Z*7;KXHkZP{6K6m6EK_5{urTK1S1(jV=~FHT*`(AqYG=S+N} p#TA7#si$|l$+>*s;;TpqIg_9dnL5#kl<53|-01Z5AJt^h{|8{coj(8o delta 21986 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 diff --git a/CAMD/Doc/ChangeLog b/CAMD/Doc/ChangeLog index 10ef3f405d..abee2a7ee1 100644 --- a/CAMD/Doc/ChangeLog +++ b/CAMD/Doc/ChangeLog @@ -1,3 +1,7 @@ +Feb XX, 2024: version 3.3.2 + + * minor updates to build system + Jan 10, 2024: version 3.3.1 * minor updates to build system diff --git a/CAMD/Doc/camd_version.tex b/CAMD/Doc/camd_version.tex index 4f64f7398e..90ac86c8e8 100644 --- a/CAMD/Doc/camd_version.tex +++ b/CAMD/Doc/camd_version.tex @@ -1,2 +1,2 @@ % version of SuiteSparse/CAMD -\date{VERSION 3.3.1, Jan 10, 2024} +\date{VERSION 3.3.2, Feb XX, 2024} diff --git a/CAMD/Include/camd.h b/CAMD/Include/camd.h index dcec4130a8..3fca91e676 100644 --- a/CAMD/Include/camd.h +++ b/CAMD/Include/camd.h @@ -392,18 +392,18 @@ void camd_version (int version [3]) ; * #endif */ -#define CAMD_DATE "Jan 10, 2024" +#define CAMD_DATE "Feb XX, 2024" #define CAMD_MAIN_VERSION 3 #define CAMD_SUB_VERSION 3 -#define CAMD_SUBSUB_VERSION 1 +#define CAMD_SUBSUB_VERSION 2 #define CAMD_VERSION_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) #define CAMD_VERSION CAMD_VERSION_CODE(3,3) -#define CAMD__VERSION SUITESPARSE__VERCODE(3,3,1) +#define CAMD__VERSION SUITESPARSE__VERCODE(3,3,2) #if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,5,0)) -#error "CAMD 3.3.1 requires SuiteSparse_config 7.5.0 or later" + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "CAMD 3.3.2 requires SuiteSparse_config 7.7.0 or later" #endif #endif diff --git a/CCOLAMD/CMakeLists.txt b/CCOLAMD/CMakeLists.txt index f6e7be6f7c..52c2ac3086 100644 --- a/CCOLAMD/CMakeLists.txt +++ b/CCOLAMD/CMakeLists.txt @@ -11,10 +11,10 @@ cmake_minimum_required ( VERSION 3.22 ) -set ( CCOLAMD_DATE "Jan 20, 2024" ) +set ( CCOLAMD_DATE "Feb XX, 2024" ) set ( CCOLAMD_VERSION_MAJOR 3 CACHE STRING "" FORCE ) set ( CCOLAMD_VERSION_MINOR 3 CACHE STRING "" FORCE ) -set ( CCOLAMD_VERSION_SUB 2 CACHE STRING "" FORCE ) +set ( CCOLAMD_VERSION_SUB 3 CACHE STRING "" FORCE ) message ( STATUS "Building CCOLAMD version: v" ${CCOLAMD_VERSION_MAJOR}. @@ -43,10 +43,10 @@ include ( SuiteSparsePolicy ) #------------------------------------------------------------------------------- if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) - find_package ( SuiteSparse_config 7.6.0 + 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.6.0 REQUIRED ) + find_package ( SuiteSparse_config 7.7.0 REQUIRED ) endif ( ) endif ( ) diff --git a/CCOLAMD/Config/ccolamd.h.in b/CCOLAMD/Config/ccolamd.h.in index 013d8e87c8..895dcaa097 100644 --- a/CCOLAMD/Config/ccolamd.h.in +++ b/CCOLAMD/Config/ccolamd.h.in @@ -46,8 +46,8 @@ #define CCOLAMD__VERSION SUITESPARSE__VERCODE(@CCOLAMD_VERSION_MAJOR@,@CCOLAMD_VERSION_MINOR@,@CCOLAMD_VERSION_SUB@) #if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,6,0)) -#error "CCOLAMD @CCOLAMD_VERSION_MAJOR@.@CCOLAMD_VERSION_MINOR@.@CCOLAMD_VERSION_SUB@ requires SuiteSparse_config 7.6.0 or later" + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "CCOLAMD @CCOLAMD_VERSION_MAJOR@.@CCOLAMD_VERSION_MINOR@.@CCOLAMD_VERSION_SUB@ requires SuiteSparse_config 7.7.0 or later" #endif /* ========================================================================== */ diff --git a/CCOLAMD/Doc/ChangeLog b/CCOLAMD/Doc/ChangeLog index 809c4825d6..fb0ec795dd 100644 --- a/CCOLAMD/Doc/ChangeLog +++ b/CCOLAMD/Doc/ChangeLog @@ -1,3 +1,7 @@ +Feb XX, 2024: version 3.3.3 + + * minor updates to build system + Jan 20, 2024: version 3.3.2 * minor updates to build system diff --git a/CCOLAMD/Include/ccolamd.h b/CCOLAMD/Include/ccolamd.h index 847f4aef56..85e8e6e389 100644 --- a/CCOLAMD/Include/ccolamd.h +++ b/CCOLAMD/Include/ccolamd.h @@ -36,18 +36,18 @@ * #endif */ -#define CCOLAMD_DATE "Jan 20, 2024" +#define CCOLAMD_DATE "Feb XX, 2024" #define CCOLAMD_MAIN_VERSION 3 #define CCOLAMD_SUB_VERSION 3 -#define CCOLAMD_SUBSUB_VERSION 2 +#define CCOLAMD_SUBSUB_VERSION 3 #define CCOLAMD_VERSION_CODE(main,sub) SUITESPARSE_VER_CODE(main,sub) #define CCOLAMD_VERSION CCOLAMD_VERSION_CODE(3,3) -#define CCOLAMD__VERSION SUITESPARSE__VERCODE(3,3,2) +#define CCOLAMD__VERSION SUITESPARSE__VERCODE(3,3,3) #if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,6,0)) -#error "CCOLAMD 3.3.2 requires SuiteSparse_config 7.6.0 or later" + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "CCOLAMD 3.3.3 requires SuiteSparse_config 7.7.0 or later" #endif /* ========================================================================== */ diff --git a/CHOLMOD/CMakeLists.txt b/CHOLMOD/CMakeLists.txt index a04fc2e0c6..7fcb7e4162 100644 --- a/CHOLMOD/CMakeLists.txt +++ b/CHOLMOD/CMakeLists.txt @@ -12,10 +12,10 @@ # cmake 3.22 is required to find the BLAS/LAPACK cmake_minimum_required ( VERSION 3.22 ) -set ( CHOLMOD_DATE "Jan 20, 2024" ) +set ( CHOLMOD_DATE "Feb XX, 2024" ) set ( CHOLMOD_VERSION_MAJOR 5 CACHE STRING "" FORCE ) set ( CHOLMOD_VERSION_MINOR 2 CACHE STRING "" FORCE ) -set ( CHOLMOD_VERSION_SUB 0 CACHE STRING "" FORCE ) +set ( CHOLMOD_VERSION_SUB 1 CACHE STRING "" FORCE ) message ( STATUS "Building CHOLMOD version: v" ${CHOLMOD_VERSION_MAJOR}. @@ -112,22 +112,22 @@ endif ( ) #------------------------------------------------------------------------------- if ( NOT SUITESPARSE_ROOT_CMAKELISTS ) - find_package ( SuiteSparse_config 7.6.0 + 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.6.0 REQUIRED ) + find_package ( SuiteSparse_config 7.7.0 REQUIRED ) endif ( ) - find_package ( AMD 3.3.1 + 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.1 REQUIRED ) + find_package ( AMD 3.3.2 REQUIRED ) endif ( ) - find_package ( COLAMD 3.3.2 + 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.2 REQUIRED ) + find_package ( COLAMD 3.3.3 REQUIRED ) endif ( ) endif ( ) @@ -231,16 +231,16 @@ endif ( ) if ( CHOLMOD_CAMD AND NOT SUITESPARSE_ROOT_CMAKELISTS ) # find CAMD and CCOLAMD - find_package ( CAMD 3.3.1 + find_package ( CAMD 3.3.2 PATHS ${CMAKE_SOURCE_DIR}/../CAMD/build NO_DEFAULT_PATH ) if ( NOT TARGET SuiteSparse::CAMD ) - find_package ( CAMD 3.3.1 ) + find_package ( CAMD 3.3.2 ) endif ( ) - find_package ( CCOLAMD 3.3.2 + find_package ( CCOLAMD 3.3.3 PATHS ${CMAKE_SOURCE_DIR}/../CCOLAMD/build NO_DEFAULT_PATH ) if ( NOT TARGET SuiteSparse::CCOLAMD ) - find_package ( CCOLAMD 3.3.2 ) + find_package ( CCOLAMD 3.3.3 ) endif ( ) if ( NOT CAMD_FOUND OR NOT CCOLAMD_FOUND ) diff --git a/CHOLMOD/Config/cholmod.h.in b/CHOLMOD/Config/cholmod.h.in index 37df0da5e1..cf6691c8f2 100644 --- a/CHOLMOD/Config/cholmod.h.in +++ b/CHOLMOD/Config/cholmod.h.in @@ -309,8 +309,8 @@ int cholmod_l_version (int version [3]) ; #define CHOLMOD__VERSION SUITESPARSE__VERCODE(@CHOLMOD_VERSION_MAJOR@,@CHOLMOD_VERSION_MINOR@,@CHOLMOD_VERSION_SUB@) #if !defined (SUITESPARSE__VERSION) || \ - (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,6,0)) -#error "CHOLMOD @CHOLMOD_VERSION_MAJOR@.@CHOLMOD_VERSION_MINOR@.@CHOLMOD_VERSION_SUB@ requires SuiteSparse_config 7.6.0 or later" + (SUITESPARSE__VERSION < SUITESPARSE__VERCODE(7,7,0)) +#error "CHOLMOD @CHOLMOD_VERSION_MAJOR@.@CHOLMOD_VERSION_MINOR@.@CHOLMOD_VERSION_SUB@ requires SuiteSparse_config 7.7.0 or later" #endif //------------------------------------------------------------------------------ diff --git a/CHOLMOD/Doc/CHOLMOD_UserGuide.pdf b/CHOLMOD/Doc/CHOLMOD_UserGuide.pdf index 9f1c7fda4b949662b31848ec79ea09aa550a7acf..01c2339e340f1e7d9f32af68ec8278a9c42b53a1 100644 GIT binary patch delta 287525 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

    )>b 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%0AQBC5puLBW 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

    S6LooP`62IL?A~B8GUA)+R0a1Q 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