From 7889e084ea6995fb6783aa357c02057fa03076fa Mon Sep 17 00:00:00 2001 From: vfisikop Date: Wed, 28 Feb 2024 14:19:46 +0200 Subject: [PATCH] Update submodules to use volesti's develop and make use of git sparse-checkout --- .github/workflows/R-CMD-check-macOS.yml | 3 + .github/workflows/R-CMD-check-ubuntu.yml | 3 + .github/workflows/R-CMD-check-windows.yml | 3 + .gitmodules | 5 +- R/RcppExports.R | 4 +- man/ode_solve.Rd | 4 +- src/Makevars | 14 +- src/Makevars.win | 14 +- src/external/ChebTools/ChebTools.cpp | 892 ------ src/external/ChebTools/ChebTools.h | 565 ---- src/external/ChebTools/speed_tests.h | 14 - src/external/PackedCSparse/FloatArray.h | 307 -- src/external/PackedCSparse/FloatArrayAVX2.h | 222 -- src/external/PackedCSparse/PackedChol.h | 308 -- src/external/PackedCSparse/SparseMatrix.h | 230 -- src/external/PackedCSparse/add.h | 102 - src/external/PackedCSparse/chol.h | 247 -- src/external/PackedCSparse/leverage.h | 65 - src/external/PackedCSparse/leverageJL.h | 148 - src/external/PackedCSparse/multiply.h | 142 - src/external/PackedCSparse/outerprod.h | 86 - src/external/PackedCSparse/projinv.h | 90 - src/external/PackedCSparse/qd/COPYING | 16 - src/external/PackedCSparse/qd/Makefile | 15 - src/external/PackedCSparse/qd/NEWS | 181 -- src/external/PackedCSparse/qd/README | 437 --- src/external/PackedCSparse/qd/bits.cc | 85 - src/external/PackedCSparse/qd/bits.h | 32 - src/external/PackedCSparse/qd/c_dd.cc | 314 -- src/external/PackedCSparse/qd/c_dd.h | 98 - src/external/PackedCSparse/qd/c_qd.cc | 450 --- src/external/PackedCSparse/qd/c_qd.h | 119 - src/external/PackedCSparse/qd/dd_const.cc | 40 - src/external/PackedCSparse/qd/dd_inline.h | 621 ---- src/external/PackedCSparse/qd/dd_real.cc | 1303 -------- src/external/PackedCSparse/qd/dd_real.h | 293 -- src/external/PackedCSparse/qd/fpu.cc | 124 - src/external/PackedCSparse/qd/fpu.h | 39 - src/external/PackedCSparse/qd/inline.h | 143 - src/external/PackedCSparse/qd/qd.pdf | Bin 194502 -> 0 bytes src/external/PackedCSparse/qd/qd_config.h | 92 - src/external/PackedCSparse/qd/qd_const.cc | 62 - src/external/PackedCSparse/qd/qd_inline.h | 1047 ------- src/external/PackedCSparse/qd/qd_real.cc | 2624 ----------------- src/external/PackedCSparse/qd/qd_real.h | 296 -- src/external/PackedCSparse/qd/util.cc | 22 - src/external/PackedCSparse/qd/util.h | 4 - src/external/PackedCSparse/transpose.h | 90 - src/external/Padua/padua.cpp | 1868 ------------ src/external/Padua/padua.h | 36 - .../Spectra/include/Spectra/GenEigsBase.h | 479 --- .../Spectra/GenEigsComplexShiftSolver.h | 156 - .../include/Spectra/GenEigsRealShiftSolver.h | 90 - .../Spectra/include/Spectra/GenEigsSolver.h | 160 - .../Spectra/include/Spectra/LinAlg/Arnoldi.h | 283 -- .../Spectra/include/Spectra/LinAlg/BKLDLT.h | 522 ---- .../include/Spectra/LinAlg/DoubleShiftQR.h | 378 --- .../Spectra/include/Spectra/LinAlg/Lanczos.h | 170 -- .../include/Spectra/LinAlg/TridiagEigen.h | 219 -- .../Spectra/LinAlg/UpperHessenbergEigen.h | 317 -- .../Spectra/LinAlg/UpperHessenbergQR.h | 670 ----- .../include/Spectra/MatOp/DenseCholesky.h | 110 - .../Spectra/MatOp/DenseGenComplexShiftSolve.h | 104 - .../include/Spectra/MatOp/DenseGenMatProd.h | 82 - .../Spectra/MatOp/DenseGenRealShiftSolve.h | 90 - .../include/Spectra/MatOp/DenseSymMatProd.h | 75 - .../Spectra/MatOp/DenseSymShiftSolve.h | 94 - .../include/Spectra/MatOp/SparseCholesky.h | 111 - .../include/Spectra/MatOp/SparseGenMatProd.h | 76 - .../Spectra/MatOp/SparseGenRealShiftSolve.h | 95 - .../Spectra/MatOp/SparseRegularInverse.h | 102 - .../include/Spectra/MatOp/SparseSymMatProd.h | 75 - .../Spectra/MatOp/SparseSymShiftSolve.h | 97 - .../Spectra/MatOp/internal/ArnoldiOp.h | 155 - .../MatOp/internal/SymGEigsCholeskyOp.h | 77 - .../Spectra/MatOp/internal/SymGEigsRegInvOp.h | 74 - .../Spectra/include/Spectra/SymEigsBase.h | 447 --- .../include/Spectra/SymEigsShiftSolver.h | 205 -- .../Spectra/include/Spectra/SymEigsSolver.h | 174 -- .../Spectra/include/Spectra/SymGEigsSolver.h | 334 --- .../Spectra/include/Spectra/Util/CompInfo.h | 37 - .../Spectra/include/Spectra/Util/GEigsMode.h | 34 - .../include/Spectra/Util/SelectionRule.h | 277 -- .../include/Spectra/Util/SimpleRandom.h | 93 - .../Spectra/include/Spectra/Util/TypeTraits.h | 73 - .../include/Spectra/contrib/LOBPCGSolver.h | 501 ---- .../Spectra/contrib/PartialSVDSolver.h | 203 -- src/external/arpack++/include/README | 232 -- src/external/arpack++/include/arbgcomp.h | 204 -- src/external/arpack++/include/arbgnsym.h | 243 -- src/external/arpack++/include/arbgsym.h | 233 -- src/external/arpack++/include/arbnsmat.h | 431 --- src/external/arpack++/include/arbnspen.h | 470 --- src/external/arpack++/include/arbscomp.h | 165 -- src/external/arpack++/include/arbsmat.h | 378 --- src/external/arpack++/include/arbsnsym.h | 163 - src/external/arpack++/include/arbspen.h | 303 -- src/external/arpack++/include/arbssym.h | 159 - src/external/arpack++/include/arcgsym.h | 242 -- src/external/arpack++/include/arch.h | 95 - src/external/arpack++/include/arcomp.h | 46 - src/external/arpack++/include/arcsmat.h | 473 --- src/external/arpack++/include/arcspen.h | 434 --- src/external/arpack++/include/arcssym.h | 166 -- src/external/arpack++/include/ardfmat.h | 453 --- src/external/arpack++/include/ardgcomp.h | 204 -- src/external/arpack++/include/ardgnsym.h | 244 -- src/external/arpack++/include/ardgsym.h | 233 -- src/external/arpack++/include/ardnsmat.h | 622 ---- src/external/arpack++/include/ardnspen.h | 324 -- src/external/arpack++/include/ardscomp.h | 166 -- src/external/arpack++/include/ardsmat.h | 357 --- src/external/arpack++/include/ardsnsym.h | 163 - src/external/arpack++/include/ardspen.h | 237 -- src/external/arpack++/include/ardssym.h | 159 - src/external/arpack++/include/arerror.h | 348 --- src/external/arpack++/include/argcomp.h | 126 - src/external/arpack++/include/argeig.h | 233 -- src/external/arpack++/include/argnsym.h | 362 --- src/external/arpack++/include/argsym.h | 326 -- src/external/arpack++/include/arhbmat.h | 407 --- src/external/arpack++/include/arlcomp.h | 153 - src/external/arpack++/include/arlgcomp.h | 204 -- src/external/arpack++/include/arlgnsym.h | 252 -- src/external/arpack++/include/arlgsym.h | 235 -- src/external/arpack++/include/arlnames.h | 464 --- src/external/arpack++/include/arlnsmat.h | 753 ----- src/external/arpack++/include/arlnspen.h | 774 ----- src/external/arpack++/include/arlscomp.h | 188 -- src/external/arpack++/include/arlsmat.h | 765 ----- src/external/arpack++/include/arlsnsym.h | 182 -- src/external/arpack++/include/arlspdef.h | 610 ---- src/external/arpack++/include/arlspen.h | 679 ----- src/external/arpack++/include/arlssym.h | 179 -- src/external/arpack++/include/arlsupm.h | 185 -- src/external/arpack++/include/arlutil.h | 432 --- src/external/arpack++/include/armat.h | 56 - src/external/arpack++/include/arpackf.h | 150 - src/external/arpack++/include/arrgcomp.h | 110 - src/external/arpack++/include/arrgeig.h | 103 - src/external/arpack++/include/arrgnsym.h | 244 -- src/external/arpack++/include/arrgsym.h | 236 -- src/external/arpack++/include/arrscomp.h | 375 --- src/external/arpack++/include/arrseig.h | 1515 ---------- src/external/arpack++/include/arrsnsym.h | 861 ------ src/external/arpack++/include/arrssym.h | 424 --- src/external/arpack++/include/arscomp.h | 118 - src/external/arpack++/include/arseig.h | 237 -- src/external/arpack++/include/arsnsym.h | 117 - src/external/arpack++/include/arssym.h | 118 - src/external/arpack++/include/arugcomp.h | 204 -- src/external/arpack++/include/arugnsym.h | 245 -- src/external/arpack++/include/arugsym.h | 234 -- src/external/arpack++/include/arunsmat.h | 646 ---- src/external/arpack++/include/arunspen.h | 527 ---- src/external/arpack++/include/aruscomp.h | 166 -- src/external/arpack++/include/arusmat.h | 743 ----- src/external/arpack++/include/arusnsym.h | 162 - src/external/arpack++/include/aruspen.h | 543 ---- src/external/arpack++/include/arussym.h | 158 - src/external/arpack++/include/blas1c.h | 367 --- src/external/arpack++/include/blas1f.h | 221 -- src/external/arpack++/include/caupp.h | 320 -- src/external/arpack++/include/ceupp.h | 224 -- src/external/arpack++/include/cholmodc.h | 161 - src/external/arpack++/include/debug.h | 135 - src/external/arpack++/include/lapackc.h | 306 -- src/external/arpack++/include/lapackf.h | 207 -- src/external/arpack++/include/naupp.h | 333 --- src/external/arpack++/include/neupp.h | 270 -- src/external/arpack++/include/saupp.h | 321 -- src/external/arpack++/include/seupp.h | 190 -- src/external/arpack++/include/superluc.h | 165 -- src/external/arpack++/include/umfpackc.h | 216 -- src/external/cmake-files/Boost.cmake | 36 - src/external/cmake-files/Eigen.cmake | 32 - src/external/cmake-files/LPSolve.cmake | 32 - src/external/cmake-files/QD.cmake | 54 - src/external/minimum_ellipsoid/bnmin_main.h | 87 - src/external/minimum_ellipsoid/khach.h | 220 -- src/external/minimum_ellipsoid/mcpoint.h | 477 --- src/include | 1 - .../lpsolve/build/lp_solve/Makefile | 0 .../lpsolve/build/lp_solve/colamd.c | 0 .../lpsolve/build/lp_solve/commonlib.c | 0 .../lpsolve/build/lp_solve/ini.c | 0 src/lpsolve/build/lp_solve/liblp_solve.a | Bin 0 -> 3553452 bytes .../lpsolve/build/lp_solve/lp_BFP1.c | 0 .../lpsolve/build/lp_solve/lp_BFP2.c | 0 .../lpsolve/build/lp_solve/lp_Hash.c | 0 .../lpsolve/build/lp_solve/lp_LUSOL.c | 0 .../lpsolve/build/lp_solve/lp_MDO.c | 0 .../lpsolve/build/lp_solve/lp_MPS.c | 0 .../lpsolve/build/lp_solve/lp_SOS.c | 0 .../lpsolve/build/lp_solve/lp_crash.c | 0 .../lpsolve/build/lp_solve/lp_lib.c | 0 .../lpsolve/build/lp_solve/lp_matrix.c | 0 .../lpsolve/build/lp_solve/lp_mipbb.c | 0 .../lpsolve/build/lp_solve/lp_params.c | 0 .../lpsolve/build/lp_solve/lp_presolve.c | 0 .../lpsolve/build/lp_solve/lp_price.c | 0 .../lpsolve/build/lp_solve/lp_pricePSE.c | 0 .../lpsolve/build/lp_solve/lp_report.c | 0 .../lpsolve/build/lp_solve/lp_rlp.c | 0 .../lpsolve/build/lp_solve/lp_scale.c | 0 .../lpsolve/build/lp_solve/lp_simplex.c | 0 .../lpsolve/build/lp_solve/lp_utils.c | 0 .../lpsolve/build/lp_solve/lp_wlp.c | 0 .../lpsolve/build/lp_solve/lusol.c | 0 .../lpsolve/build/lp_solve/lusol1.c | 0 .../lpsolve/build/lp_solve/lusol2.c | 0 .../lpsolve/build/lp_solve/lusol6a.c | 0 .../lpsolve/build/lp_solve/lusol6l0.c | 0 .../lpsolve/build/lp_solve/lusol6u.c | 0 .../lpsolve/build/lp_solve/lusol7a.c | 0 .../lpsolve/build/lp_solve/lusol8a.c | 0 .../lpsolve/build/lp_solve/mmio.c | 0 .../lpsolve/build/lp_solve/myblas.c | 0 .../lpsolve/build/lp_solve/yacc_read.c | 0 .../lpsolve/headers/include/RlpSolve.h | 0 .../lpsolve/headers/include/RlpSolveLink.h | 0 .../lpsolve/headers/include/colamd.h | 0 .../lpsolve/headers/include/commonlib.h | 0 .../lpsolve/headers/include/ini.h | 0 .../lpsolve/headers/include/lp_BFP.h | 0 .../lpsolve/headers/include/lp_Hash.h | 0 .../lpsolve/headers/include/lp_LUSOL.h | 0 .../lpsolve/headers/include/lp_MDO.h | 0 .../lpsolve/headers/include/lp_MPS.h | 0 .../lpsolve/headers/include/lp_SOS.h | 0 .../lpsolve/headers/include/lp_bit.h | 0 .../lpsolve/headers/include/lp_crash.h | 0 .../lpsolve/headers/include/lp_lib.h | 0 .../lpsolve/headers/include/lp_matrix.h | 0 .../lpsolve/headers/include/lp_mipbb.h | 0 .../lpsolve/headers/include/lp_presolve.h | 0 .../lpsolve/headers/include/lp_price.h | 0 .../lpsolve/headers/include/lp_pricePSE.h | 0 .../lpsolve/headers/include/lp_report.h | 0 .../lpsolve/headers/include/lp_rlp.h | 0 .../lpsolve/headers/include/lp_scale.h | 0 .../lpsolve/headers/include/lp_simplex.h | 0 .../lpsolve/headers/include/lp_types.h | 0 .../lpsolve/headers/include/lp_utils.h | 0 .../lpsolve/headers/include/lp_wlp.h | 0 .../lpsolve/headers/include/lpkit.h | 0 .../lpsolve/headers/include/lusol.h | 0 .../lpsolve/headers/include/mmio.h | 0 .../lpsolve/headers/include/myblas.h | 0 .../lpsolve/headers/include/yacc_read.h | 0 .../lpsolve/headers/run_headers/colamd.h | 0 .../lpsolve/headers/run_headers/commonlib.h | 0 .../lpsolve/headers/run_headers/declare.h | 0 .../lpsolve/headers/run_headers/fortify.h | 0 .../lpsolve/headers/run_headers/hbio.h | 0 .../lpsolve/headers/run_headers/ini.h | 0 .../lpsolve/headers/run_headers/lp_BFP.h | 0 .../lpsolve/headers/run_headers/lp_BFP1.h | 0 .../lpsolve/headers/run_headers/lp_BFP2.h | 0 .../lpsolve/headers/run_headers/lp_Hash.c | 0 .../lpsolve/headers/run_headers/lp_Hash.h | 0 .../lpsolve/headers/run_headers/lp_LUSOL.h | 0 .../lpsolve/headers/run_headers/lp_MDO.h | 0 .../lpsolve/headers/run_headers/lp_MPS.h | 0 .../lpsolve/headers/run_headers/lp_SOS.h | 0 .../lpsolve/headers/run_headers/lp_crash.c | 0 .../lpsolve/headers/run_headers/lp_crash.h | 0 .../lpsolve/headers/run_headers/lp_explicit.h | 0 .../lpsolve/headers/run_headers/lp_fortify.h | 0 .../lpsolve/headers/run_headers/lp_lib.h | 0 .../lpsolve/headers/run_headers/lp_matrix.h | 0 .../lpsolve/headers/run_headers/lp_mipbb.h | 0 .../lpsolve/headers/run_headers/lp_presolve.h | 0 .../lpsolve/headers/run_headers/lp_price.h | 0 .../lpsolve/headers/run_headers/lp_pricePSE.h | 0 .../lpsolve/headers/run_headers/lp_report.h | 0 .../lpsolve/headers/run_headers/lp_rlp.h | 0 .../lpsolve/headers/run_headers/lp_scale.h | 0 .../lpsolve/headers/run_headers/lp_simplex.h | 0 .../lpsolve/headers/run_headers/lp_types.h | 0 .../lpsolve/headers/run_headers/lp_utils.h | 0 .../lpsolve/headers/run_headers/lp_wlp.h | 0 .../lpsolve/headers/run_headers/lpkit.h | 0 .../lpsolve/headers/run_headers/lpsolve.h | 0 .../lpsolve/headers/run_headers/lusol.h | 0 .../lpsolve/headers/run_headers/lusol1.h | 0 .../lpsolve/headers/run_headers/lusol2.h | 0 .../lpsolve/headers/run_headers/lusol6a.h | 0 .../lpsolve/headers/run_headers/lusol6l0.h | 0 .../lpsolve/headers/run_headers/lusol6u.h | 0 .../lpsolve/headers/run_headers/lusol7a.h | 0 .../lpsolve/headers/run_headers/lusol8a.h | 0 .../lpsolve/headers/run_headers/lusolio.h | 0 .../lpsolve/headers/run_headers/mmio.h | 0 .../lpsolve/headers/run_headers/myblas.h | 0 .../lpsolve/headers/run_headers/sparselib.h | 0 .../lpsolve/headers/run_headers/ufortify.h | 0 .../lpsolve/headers/run_headers/yacc_read.h | 0 src/volesti | 1 + 299 files changed, 32 insertions(+), 49250 deletions(-) delete mode 100644 src/external/ChebTools/ChebTools.cpp delete mode 100644 src/external/ChebTools/ChebTools.h delete mode 100644 src/external/ChebTools/speed_tests.h delete mode 100644 src/external/PackedCSparse/FloatArray.h delete mode 100644 src/external/PackedCSparse/FloatArrayAVX2.h delete mode 100644 src/external/PackedCSparse/PackedChol.h delete mode 100644 src/external/PackedCSparse/SparseMatrix.h delete mode 100644 src/external/PackedCSparse/add.h delete mode 100644 src/external/PackedCSparse/chol.h delete mode 100644 src/external/PackedCSparse/leverage.h delete mode 100644 src/external/PackedCSparse/leverageJL.h delete mode 100644 src/external/PackedCSparse/multiply.h delete mode 100644 src/external/PackedCSparse/outerprod.h delete mode 100644 src/external/PackedCSparse/projinv.h delete mode 100644 src/external/PackedCSparse/qd/COPYING delete mode 100644 src/external/PackedCSparse/qd/Makefile delete mode 100644 src/external/PackedCSparse/qd/NEWS delete mode 100644 src/external/PackedCSparse/qd/README delete mode 100644 src/external/PackedCSparse/qd/bits.cc delete mode 100644 src/external/PackedCSparse/qd/bits.h delete mode 100644 src/external/PackedCSparse/qd/c_dd.cc delete mode 100644 src/external/PackedCSparse/qd/c_dd.h delete mode 100644 src/external/PackedCSparse/qd/c_qd.cc delete mode 100644 src/external/PackedCSparse/qd/c_qd.h delete mode 100644 src/external/PackedCSparse/qd/dd_const.cc delete mode 100644 src/external/PackedCSparse/qd/dd_inline.h delete mode 100644 src/external/PackedCSparse/qd/dd_real.cc delete mode 100644 src/external/PackedCSparse/qd/dd_real.h delete mode 100644 src/external/PackedCSparse/qd/fpu.cc delete mode 100644 src/external/PackedCSparse/qd/fpu.h delete mode 100644 src/external/PackedCSparse/qd/inline.h delete mode 100644 src/external/PackedCSparse/qd/qd.pdf delete mode 100644 src/external/PackedCSparse/qd/qd_config.h delete mode 100644 src/external/PackedCSparse/qd/qd_const.cc delete mode 100644 src/external/PackedCSparse/qd/qd_inline.h delete mode 100644 src/external/PackedCSparse/qd/qd_real.cc delete mode 100644 src/external/PackedCSparse/qd/qd_real.h delete mode 100644 src/external/PackedCSparse/qd/util.cc delete mode 100644 src/external/PackedCSparse/qd/util.h delete mode 100644 src/external/PackedCSparse/transpose.h delete mode 100644 src/external/Padua/padua.cpp delete mode 100644 src/external/Padua/padua.h delete mode 100644 src/external/Spectra/include/Spectra/GenEigsBase.h delete mode 100644 src/external/Spectra/include/Spectra/GenEigsComplexShiftSolver.h delete mode 100644 src/external/Spectra/include/Spectra/GenEigsRealShiftSolver.h delete mode 100644 src/external/Spectra/include/Spectra/GenEigsSolver.h delete mode 100644 src/external/Spectra/include/Spectra/LinAlg/Arnoldi.h delete mode 100644 src/external/Spectra/include/Spectra/LinAlg/BKLDLT.h delete mode 100644 src/external/Spectra/include/Spectra/LinAlg/DoubleShiftQR.h delete mode 100644 src/external/Spectra/include/Spectra/LinAlg/Lanczos.h delete mode 100644 src/external/Spectra/include/Spectra/LinAlg/TridiagEigen.h delete mode 100644 src/external/Spectra/include/Spectra/LinAlg/UpperHessenbergEigen.h delete mode 100644 src/external/Spectra/include/Spectra/LinAlg/UpperHessenbergQR.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/DenseCholesky.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/DenseGenComplexShiftSolve.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/DenseGenMatProd.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/DenseGenRealShiftSolve.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/DenseSymMatProd.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/DenseSymShiftSolve.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/SparseCholesky.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/SparseGenMatProd.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/SparseGenRealShiftSolve.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/SparseRegularInverse.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/SparseSymMatProd.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/SparseSymShiftSolve.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/internal/ArnoldiOp.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/internal/SymGEigsCholeskyOp.h delete mode 100644 src/external/Spectra/include/Spectra/MatOp/internal/SymGEigsRegInvOp.h delete mode 100644 src/external/Spectra/include/Spectra/SymEigsBase.h delete mode 100644 src/external/Spectra/include/Spectra/SymEigsShiftSolver.h delete mode 100644 src/external/Spectra/include/Spectra/SymEigsSolver.h delete mode 100644 src/external/Spectra/include/Spectra/SymGEigsSolver.h delete mode 100644 src/external/Spectra/include/Spectra/Util/CompInfo.h delete mode 100644 src/external/Spectra/include/Spectra/Util/GEigsMode.h delete mode 100644 src/external/Spectra/include/Spectra/Util/SelectionRule.h delete mode 100644 src/external/Spectra/include/Spectra/Util/SimpleRandom.h delete mode 100644 src/external/Spectra/include/Spectra/Util/TypeTraits.h delete mode 100644 src/external/Spectra/include/Spectra/contrib/LOBPCGSolver.h delete mode 100644 src/external/Spectra/include/Spectra/contrib/PartialSVDSolver.h delete mode 100644 src/external/arpack++/include/README delete mode 100644 src/external/arpack++/include/arbgcomp.h delete mode 100644 src/external/arpack++/include/arbgnsym.h delete mode 100644 src/external/arpack++/include/arbgsym.h delete mode 100644 src/external/arpack++/include/arbnsmat.h delete mode 100644 src/external/arpack++/include/arbnspen.h delete mode 100644 src/external/arpack++/include/arbscomp.h delete mode 100644 src/external/arpack++/include/arbsmat.h delete mode 100644 src/external/arpack++/include/arbsnsym.h delete mode 100644 src/external/arpack++/include/arbspen.h delete mode 100644 src/external/arpack++/include/arbssym.h delete mode 100644 src/external/arpack++/include/arcgsym.h delete mode 100644 src/external/arpack++/include/arch.h delete mode 100644 src/external/arpack++/include/arcomp.h delete mode 100644 src/external/arpack++/include/arcsmat.h delete mode 100644 src/external/arpack++/include/arcspen.h delete mode 100644 src/external/arpack++/include/arcssym.h delete mode 100644 src/external/arpack++/include/ardfmat.h delete mode 100644 src/external/arpack++/include/ardgcomp.h delete mode 100644 src/external/arpack++/include/ardgnsym.h delete mode 100644 src/external/arpack++/include/ardgsym.h delete mode 100644 src/external/arpack++/include/ardnsmat.h delete mode 100644 src/external/arpack++/include/ardnspen.h delete mode 100644 src/external/arpack++/include/ardscomp.h delete mode 100644 src/external/arpack++/include/ardsmat.h delete mode 100644 src/external/arpack++/include/ardsnsym.h delete mode 100644 src/external/arpack++/include/ardspen.h delete mode 100644 src/external/arpack++/include/ardssym.h delete mode 100644 src/external/arpack++/include/arerror.h delete mode 100644 src/external/arpack++/include/argcomp.h delete mode 100644 src/external/arpack++/include/argeig.h delete mode 100644 src/external/arpack++/include/argnsym.h delete mode 100644 src/external/arpack++/include/argsym.h delete mode 100644 src/external/arpack++/include/arhbmat.h delete mode 100644 src/external/arpack++/include/arlcomp.h delete mode 100644 src/external/arpack++/include/arlgcomp.h delete mode 100644 src/external/arpack++/include/arlgnsym.h delete mode 100644 src/external/arpack++/include/arlgsym.h delete mode 100644 src/external/arpack++/include/arlnames.h delete mode 100644 src/external/arpack++/include/arlnsmat.h delete mode 100644 src/external/arpack++/include/arlnspen.h delete mode 100644 src/external/arpack++/include/arlscomp.h delete mode 100644 src/external/arpack++/include/arlsmat.h delete mode 100644 src/external/arpack++/include/arlsnsym.h delete mode 100644 src/external/arpack++/include/arlspdef.h delete mode 100644 src/external/arpack++/include/arlspen.h delete mode 100644 src/external/arpack++/include/arlssym.h delete mode 100644 src/external/arpack++/include/arlsupm.h delete mode 100644 src/external/arpack++/include/arlutil.h delete mode 100644 src/external/arpack++/include/armat.h delete mode 100644 src/external/arpack++/include/arpackf.h delete mode 100644 src/external/arpack++/include/arrgcomp.h delete mode 100644 src/external/arpack++/include/arrgeig.h delete mode 100644 src/external/arpack++/include/arrgnsym.h delete mode 100644 src/external/arpack++/include/arrgsym.h delete mode 100644 src/external/arpack++/include/arrscomp.h delete mode 100644 src/external/arpack++/include/arrseig.h delete mode 100644 src/external/arpack++/include/arrsnsym.h delete mode 100644 src/external/arpack++/include/arrssym.h delete mode 100644 src/external/arpack++/include/arscomp.h delete mode 100644 src/external/arpack++/include/arseig.h delete mode 100644 src/external/arpack++/include/arsnsym.h delete mode 100644 src/external/arpack++/include/arssym.h delete mode 100644 src/external/arpack++/include/arugcomp.h delete mode 100644 src/external/arpack++/include/arugnsym.h delete mode 100644 src/external/arpack++/include/arugsym.h delete mode 100644 src/external/arpack++/include/arunsmat.h delete mode 100644 src/external/arpack++/include/arunspen.h delete mode 100644 src/external/arpack++/include/aruscomp.h delete mode 100644 src/external/arpack++/include/arusmat.h delete mode 100644 src/external/arpack++/include/arusnsym.h delete mode 100644 src/external/arpack++/include/aruspen.h delete mode 100644 src/external/arpack++/include/arussym.h delete mode 100644 src/external/arpack++/include/blas1c.h delete mode 100644 src/external/arpack++/include/blas1f.h delete mode 100644 src/external/arpack++/include/caupp.h delete mode 100644 src/external/arpack++/include/ceupp.h delete mode 100644 src/external/arpack++/include/cholmodc.h delete mode 100644 src/external/arpack++/include/debug.h delete mode 100644 src/external/arpack++/include/lapackc.h delete mode 100644 src/external/arpack++/include/lapackf.h delete mode 100644 src/external/arpack++/include/naupp.h delete mode 100644 src/external/arpack++/include/neupp.h delete mode 100644 src/external/arpack++/include/saupp.h delete mode 100644 src/external/arpack++/include/seupp.h delete mode 100644 src/external/arpack++/include/superluc.h delete mode 100644 src/external/arpack++/include/umfpackc.h delete mode 100644 src/external/cmake-files/Boost.cmake delete mode 100644 src/external/cmake-files/Eigen.cmake delete mode 100644 src/external/cmake-files/LPSolve.cmake delete mode 100644 src/external/cmake-files/QD.cmake delete mode 100644 src/external/minimum_ellipsoid/bnmin_main.h delete mode 100644 src/external/minimum_ellipsoid/khach.h delete mode 100644 src/external/minimum_ellipsoid/mcpoint.h delete mode 160000 src/include rename src/{external => }/lpsolve/build/lp_solve/Makefile (100%) rename src/{external => }/lpsolve/build/lp_solve/colamd.c (100%) rename src/{external => }/lpsolve/build/lp_solve/commonlib.c (100%) rename src/{external => }/lpsolve/build/lp_solve/ini.c (100%) create mode 100644 src/lpsolve/build/lp_solve/liblp_solve.a rename src/{external => }/lpsolve/build/lp_solve/lp_BFP1.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_BFP2.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_Hash.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_LUSOL.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_MDO.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_MPS.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_SOS.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_crash.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_lib.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_matrix.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_mipbb.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_params.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_presolve.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_price.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_pricePSE.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_report.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_rlp.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_scale.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_simplex.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_utils.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lp_wlp.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lusol.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lusol1.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lusol2.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lusol6a.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lusol6l0.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lusol6u.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lusol7a.c (100%) rename src/{external => }/lpsolve/build/lp_solve/lusol8a.c (100%) rename src/{external => }/lpsolve/build/lp_solve/mmio.c (100%) rename src/{external => }/lpsolve/build/lp_solve/myblas.c (100%) rename src/{external => }/lpsolve/build/lp_solve/yacc_read.c (100%) rename src/{external => }/lpsolve/headers/include/RlpSolve.h (100%) rename src/{external => }/lpsolve/headers/include/RlpSolveLink.h (100%) rename src/{external => }/lpsolve/headers/include/colamd.h (100%) rename src/{external => }/lpsolve/headers/include/commonlib.h (100%) rename src/{external => }/lpsolve/headers/include/ini.h (100%) rename src/{external => }/lpsolve/headers/include/lp_BFP.h (100%) rename src/{external => }/lpsolve/headers/include/lp_Hash.h (100%) rename src/{external => }/lpsolve/headers/include/lp_LUSOL.h (100%) rename src/{external => }/lpsolve/headers/include/lp_MDO.h (100%) rename src/{external => }/lpsolve/headers/include/lp_MPS.h (100%) rename src/{external => }/lpsolve/headers/include/lp_SOS.h (100%) rename src/{external => }/lpsolve/headers/include/lp_bit.h (100%) rename src/{external => }/lpsolve/headers/include/lp_crash.h (100%) rename src/{external => }/lpsolve/headers/include/lp_lib.h (100%) rename src/{external => }/lpsolve/headers/include/lp_matrix.h (100%) rename src/{external => }/lpsolve/headers/include/lp_mipbb.h (100%) rename src/{external => }/lpsolve/headers/include/lp_presolve.h (100%) rename src/{external => }/lpsolve/headers/include/lp_price.h (100%) rename src/{external => }/lpsolve/headers/include/lp_pricePSE.h (100%) rename src/{external => }/lpsolve/headers/include/lp_report.h (100%) rename src/{external => }/lpsolve/headers/include/lp_rlp.h (100%) rename src/{external => }/lpsolve/headers/include/lp_scale.h (100%) rename src/{external => }/lpsolve/headers/include/lp_simplex.h (100%) rename src/{external => }/lpsolve/headers/include/lp_types.h (100%) rename src/{external => }/lpsolve/headers/include/lp_utils.h (100%) rename src/{external => }/lpsolve/headers/include/lp_wlp.h (100%) rename src/{external => }/lpsolve/headers/include/lpkit.h (100%) rename src/{external => }/lpsolve/headers/include/lusol.h (100%) rename src/{external => }/lpsolve/headers/include/mmio.h (100%) rename src/{external => }/lpsolve/headers/include/myblas.h (100%) rename src/{external => }/lpsolve/headers/include/yacc_read.h (100%) rename src/{external => }/lpsolve/headers/run_headers/colamd.h (100%) rename src/{external => }/lpsolve/headers/run_headers/commonlib.h (100%) rename src/{external => }/lpsolve/headers/run_headers/declare.h (100%) rename src/{external => }/lpsolve/headers/run_headers/fortify.h (100%) rename src/{external => }/lpsolve/headers/run_headers/hbio.h (100%) rename src/{external => }/lpsolve/headers/run_headers/ini.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_BFP.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_BFP1.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_BFP2.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_Hash.c (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_Hash.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_LUSOL.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_MDO.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_MPS.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_SOS.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_crash.c (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_crash.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_explicit.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_fortify.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_lib.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_matrix.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_mipbb.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_presolve.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_price.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_pricePSE.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_report.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_rlp.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_scale.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_simplex.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_types.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_utils.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lp_wlp.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lpkit.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lpsolve.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lusol.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lusol1.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lusol2.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lusol6a.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lusol6l0.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lusol6u.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lusol7a.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lusol8a.h (100%) rename src/{external => }/lpsolve/headers/run_headers/lusolio.h (100%) rename src/{external => }/lpsolve/headers/run_headers/mmio.h (100%) rename src/{external => }/lpsolve/headers/run_headers/myblas.h (100%) rename src/{external => }/lpsolve/headers/run_headers/sparselib.h (100%) rename src/{external => }/lpsolve/headers/run_headers/ufortify.h (100%) rename src/{external => }/lpsolve/headers/run_headers/yacc_read.h (100%) create mode 160000 src/volesti diff --git a/.github/workflows/R-CMD-check-macOS.yml b/.github/workflows/R-CMD-check-macOS.yml index 4ab68f87..4a013944 100644 --- a/.github/workflows/R-CMD-check-macOS.yml +++ b/.github/workflows/R-CMD-check-macOS.yml @@ -39,6 +39,9 @@ jobs: - name: Fetch and update submodule run: git submodule update --init --recursive + cd src/volesti + git sparse-checkout set include external + git checkout - name: Install dependencies run: Rscript -e "install.packages(c('devtools', dependencies=TRUE))" -e "install.packages(c('rcmdcheck', 'devtools', 'Rcpp', 'RcppEigen', 'BH', 'testthat', 'downloader', 'xfun'))"; diff --git a/.github/workflows/R-CMD-check-ubuntu.yml b/.github/workflows/R-CMD-check-ubuntu.yml index 445c5446..8055dcd1 100644 --- a/.github/workflows/R-CMD-check-ubuntu.yml +++ b/.github/workflows/R-CMD-check-ubuntu.yml @@ -41,6 +41,9 @@ jobs: - name: Fetch and update submodule run: git submodule update --init --recursive + cd src/volesti + git sparse-checkout set include external + git checkout - name: Install dependencies run: Rscript -e "install.packages(c('testthat', 'pkgload', 'rcmdcheck', 'devtools', 'Rcpp', 'RcppEigen', 'BH', 'downloader', 'xfun', dependencies=TRUE))"; diff --git a/.github/workflows/R-CMD-check-windows.yml b/.github/workflows/R-CMD-check-windows.yml index 099f7458..a6d8167d 100644 --- a/.github/workflows/R-CMD-check-windows.yml +++ b/.github/workflows/R-CMD-check-windows.yml @@ -38,6 +38,9 @@ jobs: - name: Fetch and update submodule run: git submodule update --init --recursive + cd src/volesti + git sparse-checkout set include external + git checkout - name: Install dependencies run: Rscript -e "install.packages(c('devtools', dependencies=TRUE))" -e "install.packages(c('rcmdcheck', 'devtools', 'Rcpp', 'RcppEigen', 'BH', 'testthat', 'downloader', 'xfun'))" diff --git a/.gitmodules b/.gitmodules index 05748818..42627744 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,3 @@ -[submodule "volesti_cran_include"] - path = src/include +[submodule "src/volesti"] + path = src/volesti url = https://github.com/GeomScale/volesti.git - branch = cran_include diff --git a/R/RcppExports.R b/R/RcppExports.R index d77ee54f..f16e5f11 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -202,7 +202,9 @@ load_sdpa_format_file <- function(input_file = NULL) { #' @return A list which contains elements "x_1", ..., "x_n" representing each derivative results. Each "x_i" corresponds to a d x n matrix where each column represents a certain timestep of the solver. #' #' @examples -#' # Please visit the examples directory on examples demonstrating usage of the ODE solvers. +#' F <- function (x) (-x) +#' initial_conditions <- list("x_1" = c(0), "x_2" = c(1)) +#' states <- ode_solve(dimension=1, n=1000, F=F, initial_time=0, step_size=0.01, order=2, method="leapfrog", initial_conditions=initial_conditions, domains = list()) #' #' @export ode_solve <- function(n, step_size, order, dimension, initial_time, F, method, domains = NULL, initial_conditions = NULL) { diff --git a/man/ode_solve.Rd b/man/ode_solve.Rd index b4e8e4b9..2836f342 100644 --- a/man/ode_solve.Rd +++ b/man/ode_solve.Rd @@ -42,6 +42,8 @@ A list which contains elements "x_1", ..., "x_n" representing each derivative re Solve an ODE of the form dx^n / dt^n = F(x, t) } \examples{ -# Please visit the examples directory on examples demonstrating usage of the ODE solvers. +F <- function (x) (-x) +initial_conditions <- list("x_1" = c(0), "x_2" = c(1)) +states <- ode_solve(dimension=1, n=1000, F=F, initial_time=0, step_size=0.01, order=2, method="leapfrog", initial_conditions=initial_conditions, domains = list()) } diff --git a/src/Makevars b/src/Makevars index 4d2b7288..9fd194e7 100644 --- a/src/Makevars +++ b/src/Makevars @@ -1,16 +1,16 @@ -PKG_CPPFLAGS=-Iexternal -Iexternal/lpsolve/headers/run_headers -Iexternal/minimum_ellipsoid -Iinclude -Iinclude/convex_bodies/spectrahedra +PKG_CPPFLAGS=-Ivolesti/external -Ilpsolve/headers/run_headers -Ivolesti/external/minimum_ellipsoid -Ivolesti/include -Ivolesti/include/convex_bodies/spectrahedra PKG_CXXFLAGS= -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES -PKG_LIBS=-Lexternal/lpsolve/build/lp_solve -llp_solve -Lexternal/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) +PKG_LIBS=-Llpsolve/build/lp_solve -llp_solve -Lvolesti/external/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) -$(SHLIB): external/lpsolve/build/lp_solve/liblp_solve.a external/PackedCSparse/qd/libqd.a +$(SHLIB): lpsolve/build/lp_solve/liblp_solve.a volesti/external/PackedCSparse/qd/libqd.a -external/lpsolve/build/lp_solve/liblp_solve.a: - @(cd external/lpsolve/build/lp_solve && $(MAKE) liblp_solve.a \ +lpsolve/build/lp_solve/liblp_solve.a: + @(cd lpsolve/build/lp_solve && $(MAKE) liblp_solve.a \ CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ CPICFLAGS="$(CPICFLAGS)" AR="$(AR)" RANLIB="$(RANLIB)") -external/PackedCSparse/qd/libqd.a: - @(cd external/PackedCSparse/qd && $(MAKE) libqd.a \ +volesti/external/PackedCSparse/qd/libqd.a: + @(cd volesti/external/PackedCSparse/qd && $(MAKE) libqd.a \ CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ CPICFLAGS="$(CPICFLAGS)" AR="$(AR)") diff --git a/src/Makevars.win b/src/Makevars.win index dbd3bac5..093db7e9 100644 --- a/src/Makevars.win +++ b/src/Makevars.win @@ -1,17 +1,17 @@ -PKG_CPPFLAGS=-Iexternal -Iexternal/lpsolve/headers/run_headers -Iexternal/minimum_ellipsoid -Iinclude -Iinclude/convex_bodies/spectrahedra +PKG_CPPFLAGS=-Ivolesti/external -Ilpsolve/headers/run_headers -Ivolesti/external/minimum_ellipsoid -Ivolesti/include -Ivolesti/include/convex_bodies/spectrahedra PKG_CXXFLAGS= -lm -ldl -DBOOST_NO_AUTO_PTR -DDISABLE_NLP_ORACLES -PKG_LIBS=-Lexternal/lpsolve/build/lp_solve -llp_solve -Lexternal/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) +PKG_LIBS=-Llpsolve/build/lp_solve -llp_solve -Lvolesti/external/PackedCSparse/qd -lqd $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) -$(SHLIB): external/lpsolve/build/lp_solve/liblp_solve.a external/PackedCSparse/qd/libqd.a +$(SHLIB): lpsolve/build/lp_solve/liblp_solve.a volesti/external/PackedCSparse/qd/libqd.a -external/lpsolve/build/lp_solve/liblp_solve.a: - @(cd external/lpsolve/build/lp_solve && $(MAKE) liblp_solve.a \ +lpsolve/build/lp_solve/liblp_solve.a: + @(cd lpsolve/build/lp_solve && $(MAKE) liblp_solve.a \ CC="$(CC)" CPPFLAGS="$(CPPFLAGS) -DUSRDLL -DINLINE=static" \ CFLAGS="$(CFLAGS)" CPICFLAGS="$(CPICFLAGS)" AR="$(AR)" \ RANLIB="$(RANLIB)") -external/PackedCSparse/qd/libqd.a: - @(cd external/PackedCSparse/qd && $(MAKE) libqd.a \ +volesti/external/PackedCSparse/qd/libqd.a: + @(cd volesti/external/PackedCSparse/qd && $(MAKE) libqd.a \ CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" \ CPICFLAGS="$(CPICFLAGS)" AR="$(AR)") \ No newline at end of file diff --git a/src/external/ChebTools/ChebTools.cpp b/src/external/ChebTools/ChebTools.cpp deleted file mode 100644 index 2813822f..00000000 --- a/src/external/ChebTools/ChebTools.cpp +++ /dev/null @@ -1,892 +0,0 @@ -//Copyright 2018* United States Secretary of Commerce, NIST. -// -//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -//The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -// Credit to https://github.com/usnistgov/ChebTools - -#include "ChebTools/ChebTools.h" -#include "Eigen/Dense" -#include - -#include -#include - -#include -#include -#include -#include - -#ifndef DBL_EPSILON -#define DBL_EPSILON std::numeric_limits::epsilon() -#endif - -#ifndef DBL_MAX -#define DBL_MAX std::numeric_limits::max() -#endif - -template T POW2(T x){ return x*x; } -template bool inbetween(T bound1, T bound2, T val){ return val > std::min(bound1,bound2) && val < std::max(bound1,bound2); } - -/// See python code in https://en.wikipedia.org/wiki/Binomial_coefficient#Binomial_coefficient_in_programming_languages -/// This is a direct translation of that code to C++ -double binomialCoefficient(const double n, const double k) { - if (k < 0 || k > n) { - return 0; - } - if (k == 0 || k == n) { - return 1; - } - double _k = std::min(k, n - k); //# take advantage of symmetry - double c = 1; - for (double i = 0; i < _k; ++i) { - c *= (n - i) / (i + 1); - } - return c; -} - -namespace ChebTools { - - inline bool ValidNumber(double x){ - // Idea from http://www.johndcook.com/IEEE_exceptions_in_cpp.html - return (x <= DBL_MAX && x >= -DBL_MAX); - }; - - void balance_matrix(const Eigen::MatrixXd &A, Eigen::MatrixXd &Aprime, Eigen::MatrixXd &D) { - // https://arxiv.org/pdf/1401.5766.pdf (Algorithm #3) - const int p = 2; - double beta = 2; // Radix base (2?) - int iter = 0; - Aprime = A; - D = Eigen::MatrixXd::Identity(A.rows(), A.cols()); - bool converged = false; - do { - converged = true; - for (Eigen::Index i = 0; i < A.rows(); ++i) { - double c = Aprime.col(i).lpNorm

(); - double r = Aprime.row(i).lpNorm

(); - double s = pow(c, p) + pow(r, p); - double f = 1; - //if (!ValidNumber(c)){ - // std::cout << A << std::endl; - // throw std::range_error("c is not a valid number in balance_matrix"); } - //if (!ValidNumber(r)) { throw std::range_error("r is not a valid number in balance_matrix"); } - while (c < r/beta) { - c *= beta; - r /= beta; - f *= beta; - } - while (c >= r*beta) { - c /= beta; - r *= beta; - f /= beta; - } - if (pow(c, p) + pow(r, p) < 0.95*s) { - converged = false; - D(i, i) *= f; - Aprime.col(i) *= f; - Aprime.row(i) /= f; - } - } - iter++; - if (iter > 50) { - break; - } - } while (!converged); - } - - /** - * @brief A library that stores the Chebyshev-Lobatto nodes in the domain [-1,1] - * @note The Chebyshev-Lobatto nodes are a function of degree, but not of the coefficients - */ - class ChebyshevLobattoNodesLibrary { - private: - std::map vectors; - void build(std::size_t N) { - double NN = static_cast(N); // just a cast - vectors[N] = (Eigen::VectorXd::LinSpaced(N + 1, 0, NN).array()*EIGEN_PI / N).cos(); - } - public: - /// Get the Chebyshev-Lobatto nodes for expansion of degree \f$N\f$ - const Eigen::VectorXd & get(std::size_t N) { - auto it = vectors.find(N); - if (it != vectors.end()) { - return it->second; - } - else { - build(N); - return vectors.find(N)->second; - } - } - }; - static ChebyshevLobattoNodesLibrary CLnodes_library; - const Eigen::VectorXd &get_CLnodes(std::size_t N){ - return CLnodes_library.get(N); - } - - // DEPRECATED: but held around for future reference - //class ChebyshevRootsLibrary { - //private: - // std::map vectors; - // void build(std::size_t N) { - // double NN = static_cast(N); // just a cast - // vectors[N] = ((Eigen::VectorXd::LinSpaced(N, 0, NN - 1).array() + 0.5)*EIGEN_PI / NN).cos(); - // } - //public: - // const Eigen::VectorXd & get(std::size_t N) { - // auto it = vectors.find(N); - // if (it != vectors.end()) { - // return it->second; - // } - // else { - // build(N); - // return vectors.find(N)->second; - // } - // } - //}; - //static ChebyshevRootsLibrary roots_library; - - // From CoolProp - template bool is_in_closed_range(T x1, T x2, T x) { return (x >= std::min(x1, x2) && x <= std::max(x1, x2)); }; - - ChebyshevExpansion ChebyshevExpansion::operator+(const ChebyshevExpansion &ce2) const { - if (m_c.size() == ce2.coef().size()) { - // Both are the same size, nothing creative to do, just add the coefficients - return ChebyshevExpansion(std::move(ce2.coef() + m_c), m_xmin, m_xmax); - } - else{ - if (m_c.size() > ce2.coef().size()) { - Eigen::VectorXd c(m_c.size()); c.setZero(); c.head(ce2.coef().size()) = ce2.coef(); - return ChebyshevExpansion(c+m_c, m_xmin, m_xmax); - } - else { - std::size_t n = ce2.coef().size(); - Eigen::VectorXd c(n); c.setZero(); c.head(m_c.size()) = m_c; - return ChebyshevExpansion(c + ce2.coef(), m_xmin, m_xmax); - } - } - }; - ChebyshevExpansion& ChebyshevExpansion::operator+=(const ChebyshevExpansion &donor) { - std::size_t Ndonor = donor.coef().size(), N1 = m_c.size(); - std::size_t Nmin = std::min(N1, Ndonor), Nmax = std::max(N1, Ndonor); - // The first Nmin terms overlap between the two vectors - m_c.head(Nmin) += donor.coef().head(Nmin); - // If the donor vector is longer than the current vector, resizing is needed - if (Ndonor > N1) { - // Resize but leave values as they were - m_c.conservativeResize(Ndonor); - // Copy the last Nmax-Nmin values from the donor - m_c.tail(Nmax - Nmin) = donor.coef().tail(Nmax - Nmin); - } - return *this; - } - ChebyshevExpansion& ChebyshevExpansion::operator-=(const ChebyshevExpansion& donor) { - std::size_t Ndonor = donor.coef().size(), N1 = m_c.size(); - std::size_t Nmin = std::min(N1, Ndonor), Nmax = std::max(N1, Ndonor); - // The first Nmin terms overlap between the two vectors - m_c.head(Nmin) -= donor.coef().head(Nmin); - // If the donor vector is longer than the current vector, resizing is needed - if (Ndonor > N1) { - // Resize but leave values as they were - m_c.conservativeResize(Ndonor); - // Copy the last Nmax-Nmin values from the donor - m_c.tail(Nmax - Nmin) = -donor.coef().tail(Nmax - Nmin); - } - return *this; - } - ChebyshevExpansion ChebyshevExpansion::operator-(const ChebyshevExpansion& ce2) const { - if (m_c.size() == ce2.coef().size()) { - // Both are the same size, nothing creative to do, just subtract the coefficients - return ChebyshevExpansion(std::move(ce2.coef() - m_c), m_xmin, m_xmax); - } - else { - if (m_c.size() > ce2.coef().size()) { - Eigen::VectorXd c(m_c.size()); c.setZero(); c.head(ce2.coef().size()) = ce2.coef(); - return ChebyshevExpansion(m_c - c, m_xmin, m_xmax); - } - else { - std::size_t n = ce2.coef().size(); - Eigen::VectorXd c(n); c.setZero(); c.head(m_c.size()) = m_c; - return ChebyshevExpansion(c - ce2.coef(), m_xmin, m_xmax); - } - } - }; - ChebyshevExpansion ChebyshevExpansion::operator*(double value) const { - return ChebyshevExpansion(m_c*value, m_xmin, m_xmax); - } - ChebyshevExpansion ChebyshevExpansion::operator+(double value) const { - Eigen::VectorXd c = m_c; - c(0) += value; - return ChebyshevExpansion(c, m_xmin, m_xmax); - } - ChebyshevExpansion ChebyshevExpansion::operator-(double value) const { - Eigen::VectorXd c = m_c; - c(0) -= value; - return ChebyshevExpansion(c, m_xmin, m_xmax); - } - ChebyshevExpansion ChebyshevExpansion::operator-() const{ - Eigen::VectorXd c = m_c; - return ChebyshevExpansion(-c, m_xmin, m_xmax); - } - ChebyshevExpansion& ChebyshevExpansion::operator*=(double value) { - m_c *= value; - return *this; - } - ChebyshevExpansion& ChebyshevExpansion::operator+=(double value) { - m_c(0) += value; - return *this; - } - ChebyshevExpansion& ChebyshevExpansion::operator-=(double value) { - m_c(0) -= value; - return *this; - } - ChebyshevExpansion ChebyshevExpansion::operator*(const ChebyshevExpansion &ce2) const { - - std::size_t order1 = this->m_c.size()-1, - order2 = ce2.coef().size()-1; - // The order of the product is the sum of the orders of the two expansions - std::size_t Norder_product = order1 + order2; - - // Create padded vectors, and copy into them the coefficients from this instance - // and that of the donor - Eigen::VectorXd a = Eigen::VectorXd::Zero(Norder_product+1), - b = Eigen::VectorXd::Zero(Norder_product+1); - a.head(order1+1) = this->m_c; b.head(order2+1) = ce2.coef(); - - // Get the matrices U and V from the libraries - const Eigen::MatrixXd &U = u_matrix_library.get(Norder_product); - const Eigen::MatrixXd &V = l_matrix_library.get(Norder_product); - - // Carry out the calculation of the final coefficients - // U*a is the functional values at the Chebyshev-Lobatto nodes for the first expansion - // U*b is the functional values at the Chebyshev-Lobatto nodes for the second expansion - // The functional values are multiplied together in an element-wise sense - this is why both products are turned into arrays - // The pre-multiplication by V takes us back to coefficients - return ChebyshevExpansion(V*((U*a).array() * (U*b).array()).matrix(), m_xmin, m_xmax); - }; - ChebyshevExpansion ChebyshevExpansion::times_x() const { - // First we treat the of chi*A multiplication in the domain [-1,1] - Eigen::Index N = m_c.size()-1; // N is the order of A - Eigen::VectorXd cc(N+2); // Order of x*A is one higher than that of A - if (N > 1) { - cc(0) = m_c(1)/2.0; - } - if (N > 2) { - cc(1) = m_c(0) + m_c(2)/2.0; - } - for (Eigen::Index i = 2; i < cc.size(); ++i) { - cc(i) = (i+1 <= N) ? 0.5*(m_c(i-1) + m_c(i+1)) : 0.5*(m_c(i - 1)); - } - // Scale the values into the real world, which is given by - // C_scaled = (b-a)/2*(chi*A) + ((b+a)/2)*A - // where the coefficients in the second term need to be padded with a zero to have - // the same order as the product of x*A - Eigen::VectorXd c_padded(N+2); c_padded << m_c, 0; - Eigen::VectorXd coefs = (((m_xmax - m_xmin)/2.0)*cc).array() + (m_xmax + m_xmin)/2.0*c_padded.array(); - return ChebyshevExpansion(coefs, m_xmin, m_xmax); - }; - ChebyshevExpansion& ChebyshevExpansion::times_x_inplace() { - Eigen::Index N = m_c.size() - 1; // N is the order of A - double diff = ((m_xmax - m_xmin) / 2.0), plus = (m_xmax + m_xmin) / 2.0; - double cim1old = 0, ciold = 0; - m_c.conservativeResize(N+2); - m_c(N+1) = 0.0; // Fill the last entry with a zero - if (N > 1) { - // 0-th element - cim1old = m_c(0); // store the current 0-th element in temporary variable - m_c(0) = diff*(0.5*m_c(1)) + plus*m_c(0); - } - if (N > 2) { - // 1-th element - ciold = m_c(1); // store the current 1-th element in temporary variable - m_c(1) = diff*(cim1old + 0.5*m_c(2)) + plus*m_c(1); - cim1old = ciold; - } - for (Eigen::Index i = 2; i <= N-1; ++i) { - ciold = m_c(i); // store the current i-th element in temporary variable - m_c(i) = diff*(0.5*(cim1old + m_c(i + 1)))+plus*m_c(i); - cim1old = ciold; - } - for (Eigen::Index i = N; i <= N + 1; ++i) { - ciold = m_c(i); // store the current i-th element in temporary variable - m_c(i) = diff*(0.5*cim1old) + plus*m_c(i); - cim1old = ciold; - } - return *this; - }; - ChebyshevExpansion ChebyshevExpansion::reciprocal() const{ - // 1. Transform Chebyshev-Lobatto node function values by the function f(y) -> 1/y - // 2. Go backwards to coefficients from node values c2 = V/y - const auto Ndegree = m_c.size() - 1; - const Eigen::MatrixXd& V = l_matrix_library.get(Ndegree); - // Values at the nodes in the x range of [-1, 1] - Eigen::VectorXd c = V*(1.0/get_node_function_values().array()).matrix(); - - return ChebyshevExpansion(c, xmin(), xmax()); - } - ChebyshevExpansion ChebyshevExpansion::apply(std::function &f) const{ - // 1. Transform Chebyshev-Lobatto node function values by the function f(y) -> y2 - // 2. Go backwards to coefficients from node values c2 = V*y2 - const auto Ndegree = m_c.size()-1; - const Eigen::MatrixXd &V = l_matrix_library.get(Ndegree); - return ChebyshevExpansion(V*f(get_node_function_values()).matrix(), xmin(), xmax()); - } - bool ChebyshevExpansion::is_monotonic() const { - auto yvals = get_node_function_values(); - auto N = yvals.size(); - Eigen::ArrayXd diff = yvals.tail(N - 1) - yvals.head(N - 1); - return (diff < 0.0).all() || (diff > 0.0).all(); - } - - const vectype &ChebyshevExpansion::coef() const { - return m_c; - }; - /** - * @brief Do a single input/single output evaluation of the Chebyshev expansion with the inputs scaled in [xmin, xmax] - * @param x A value scaled in the domain [xmin,xmax] - */ - double ChebyshevExpansion::y_recurrence(const double x) { - // Use the recurrence relationships to evaluate the Chebyshev expansion - std::size_t Norder = m_c.size() - 1; - // Scale x linearly into the domain [-1, 1] - double xscaled = (2 * x - (m_xmax + m_xmin)) / (m_xmax - m_xmin); - // Short circuit if not using recursive solution - if (Norder == 0){ return m_c[0]; } - if (Norder == 1) { return m_c[0] + m_c[1]*xscaled; } - - vectype &o = m_recurrence_buffer; - o(0) = 1; - o(1) = xscaled; - for (int n = 1; n < Norder; ++n) { - o(n + 1) = 2 * xscaled*o(n) - o(n - 1); - } - return m_c.dot(o); - } - double ChebyshevExpansion::y_Clenshaw_xscaled(const double xscaled) const { - // See https://en.wikipedia.org/wiki/Clenshaw_algorithm#Special_case_for_Chebyshev_series - std::size_t Norder = m_c.size() - 1; - double u_k = 0, u_kp1 = m_c[Norder], u_kp2 = 0; - int k = 0; - for (k = static_cast(Norder) - 1; k >= 1; --k) { - // Do the recurrent calculation - u_k = 2.0 * xscaled * u_kp1 - u_kp2 + m_c(k); - // Update the values - u_kp2 = u_kp1; u_kp1 = u_k; - } - return m_c(0) + xscaled * u_kp1 - u_kp2; - } - /** - * @brief Do a vectorized evaluation of the Chebyshev expansion with the inputs scaled in [xmin, xmax] - * @param x A vectype of values in the domain [xmin,xmax] - */ - vectype ChebyshevExpansion::y(const vectype &x) const { - // Scale x linearly into the domain [-1, 1] - const vectype xscaled = (2 * x.array() - (m_xmax + m_xmin)) / (m_xmax - m_xmin); - // Then call the function that takes the scaled x values - return y_recurrence_xscaled(xscaled); - } - /** - * @brief Do a vectorized evaluation of the Chebyshev expansion with the input scaled in the domain [-1,1] - * @param xscaled A vectype of values scaled to the domain [-1,1] (the domain of the Chebyshev basis functions) - * @returns y A vectype of values evaluated from the expansion - * - * By using vectorizable types like Eigen::MatrixXd, without - * any additional work, "magical" vectorization is happening - * under the hood, giving a significant speed improvement. From naive - * testing, the increase was a factor of about 10x. - */ - vectype ChebyshevExpansion::y_recurrence_xscaled(const vectype &xscaled) const { - const std::size_t Norder = m_c.size() - 1; - - Eigen::MatrixXd A(xscaled.size(), Norder + 1); - - if (Norder == 0) { return m_c[0]*Eigen::MatrixXd::Ones(A.rows(), A.cols()); } - if (Norder == 1) { return m_c[0] + m_c[1]*xscaled.array(); } - - // Use the recurrence relationships to evaluate the Chebyshev expansion - // In this case we do column-wise evaluations of the recurrence rule - A.col(0).fill(1); - A.col(1) = xscaled; - for (int n = 1; n < Norder; ++n) { - A.col(n + 1).array() = 2 * xscaled.array()*A.col(n).array() - A.col(n - 1).array(); - } - // In this form, the matrix-vector product will yield the y values - return A*m_c; - } - vectype ChebyshevExpansion::y_Clenshaw_xscaled(const vectype &xscaled) const { - const std::size_t Norder = m_c.size() - 1; - vectype u_k, u_kp1(xscaled.size()), u_kp2(xscaled.size()); - u_kp1.fill(m_c[Norder]); u_kp2.fill(0); - for (int k = static_cast(Norder) - 1; k >= 1; --k) { - u_k = 2 * xscaled.array()*u_kp1.array() - u_kp2.array() + m_c(k); - // Update summation values for all but the last step - if (k > 1) { - u_kp2 = u_kp1; u_kp1 = u_k; - } - } - return xscaled.array()*u_k.array() - u_kp1.array() + m_c(0); - } - - Eigen::MatrixXd ChebyshevExpansion::companion_matrix(const Eigen::VectorXd &coeffs) const { - Eigen::VectorXd new_mc = reduce_zeros(coeffs); - std::size_t Norder = new_mc.size() - 1; - Eigen::MatrixXd A = Eigen::MatrixXd::Zero(Norder, Norder); - // c_wrap wraps the first 0...Norder elements of the coefficient vector - Eigen::Map c_wrap(&(new_mc[0]), Norder); - // First row - A(0, 1) = 1; - // Last row - A.row(Norder - 1) = -c_wrap / (2.0*new_mc(Norder)); - A(Norder - 1, Norder - 2) += 0.5; - // All the other rows - for (int j = 1; j < Norder - 1; ++j) { - A(j, j - 1) = 0.5; - A(j, j + 1) = 0.5; - } - return A; - } - std::vector ChebyshevExpansion::real_roots2(bool only_in_domain) const { - //vector of roots to be returned - std::vector roots; - - auto N = m_c.size()-1; - auto Ndegree_scaled = N*2; - Eigen::VectorXd xscaled = get_CLnodes(Ndegree_scaled), yy = y_Clenshaw_xscaled(xscaled); - - // a,b,c can also be obtained by solving the matrix system: - // [x_k^2, x_k, 1] = [b_k] for k in 1,2,3 - for (auto i = 0; i+2 < Ndegree_scaled+1; i += 2){ - const double &x_1 = xscaled[i + 0], &y_1 = yy[i + 0], - &x_2 = xscaled[i + 1], &y_2 = yy[i + 1], - &x_3 = xscaled[i + 2], &y_3 = yy[i + 2]; - double d = (x_3 - x_2)*(x_2 - x_1)*(x_3 - x_1); - double a = ((x_3 - x_2)*y_1 - (x_3 - x_1)*y_2 + (x_2 - x_1)*y_3) / d; - double b = (-(POW2(x_3) - POW2(x_2))*y_1 + (POW2(x_3) - POW2(x_1))*y_2 - (POW2(x_2) - POW2(x_1))*y_3) / d; - double c = ((x_3 - x_2)*x_2*x_3*y_1 - (x_3 - x_1)*x_1*x_3*y_2 + (x_2 - x_1)*x_2*x_1*y_3) / d; - - // Discriminant of quadratic - double D = b*b - 4*a*c; - if (D >= 0) { - double root1, root2; - if (a == 0){ - // Linear - root1 = -c/b; - root2 = -1000; // Something outside the domain; we are in scaled coordinates so this will definitely get rejected - } - else if (D == 0) { // Unlikely due to numerical precision - // Two equal real roots - root1 = -b/(2*a); - root2 = -1000; // Something outside the domain; we are in scaled coordinates so this will definitely get rejected - } - else { - // Numerically stable method for solving quadratic - // From https://people.csail.mit.edu/bkph/articles/Quadratics.pdf - double sqrtD = sqrt(D); - if (b >= 0){ - root1 = (-b - sqrtD)/(2*a); - root2 = 2*c/(-b-sqrtD); - } - else { - root1 = 2*c/(-b+sqrtD); - root2 = (-b+sqrtD)/(2*a); - } - } - bool in1 = inbetween(x_1, x_3, root1), in2 = inbetween(x_1, x_3, root2); - const ChebyshevExpansion &e = *this; - auto secant = [e](double a, double ya, double b, double yb, double yeps = 1e-14, double xeps = 1e-14) { - auto c = b - yb*(b - a) / (yb - ya); - auto yc = e.y_Clenshaw_xscaled(c); - for (auto i = 0; i < 50; ++i){ - if (yc*ya > 0) { - a=c; ya=yc; - } - else { - b=c; yb=yc; - } - if (std::abs(b - a) < xeps) { break; } - if (std::abs(yc) < yeps){ break; } - c = b - yb*(b - a) / (yb - ya); - yc = e.y_Clenshaw_xscaled(c); - } - return c; - }; - int Nroots_inside = static_cast(in1) + static_cast(in2); - if (Nroots_inside == 2) { - // Split the domain at the midline of the quadratic, polish each root against the underlying expansion - double x_m = -b/(2*a), y_m = e.y_Clenshaw_xscaled(x_m); - root1 = secant(x_1, y_1, x_m, y_m); - root2 = secant(x_m, y_m, x_3, y_3); - // Rescale back into real-world values in [xmin,xmax] from [-1,1] - roots.push_back(((m_xmax - m_xmin)*root1 + (m_xmax + m_xmin)) / 2.0); - roots.push_back(((m_xmax - m_xmin)*root2 + (m_xmax + m_xmin)) / 2.0); - } - else if(Nroots_inside == 1) { - root1 = secant(x_1, y_1, x_3, y_3); - roots.push_back(((m_xmax - m_xmin)*root1 + (m_xmax + m_xmin)) / 2.0); - } - else {} - } - } - return roots; - } - std::vector ChebyshevExpansion::real_roots(bool only_in_domain) const { - //vector of roots to be returned - std::vector roots; - Eigen::VectorXd new_mc = reduce_zeros(m_c); - //if the Chebyshev polynomial is just a constant, then there are no roots - //if a_0=0 then there are infinite roots, but for our purposes, infinite roots doesnt make sense - if (new_mc.size()<=1){ //we choose <=1 to account for the case of no coefficients - return roots; //roots is empty - } - - //if the Chebyshev polynomial is linear, then the only possible root is -a_0/a_1 - //we have this else if block because eigen is not a fan of 1x1 matrices - else if (new_mc.size()==2){ - double val_n11 = -new_mc(0)/new_mc(1); - const bool is_in_domain = (val_n11 >= -1.0 && val_n11 <= 1.0); - // Keep it if it is in domain, or if you just want all real roots - if (!only_in_domain || is_in_domain) { - // Rescale back into real-world values in [xmin,xmax] from [-1,1] - double x = ((m_xmax - m_xmin)*val_n11 + (m_xmax + m_xmin)) / 2.0; - roots.push_back(x); - } - } - - //this for all cases of higher order polynomials - else{ - // The companion matrix is definitely lower Hessenberg, so we can skip the Hessenberg - // decomposition, and get the real eigenvalues directly. These eigenvalues are defined - // in the domain [-1, 1], but it might also include values outside [-1, 1] - Eigen::VectorXcd eigs = eigenvalues(companion_matrix(new_mc), /* balance = */ true); - - - for (Eigen::Index i = 0; i < eigs.size(); ++i) { - if (std::abs(eigs(i).imag() / eigs(i).real()) < 1e-15) { - double val_n11 = eigs(i).real(); - const bool is_in_domain = (val_n11 >= -1.0 && val_n11 <= 1.0); - // Keep it if it is in domain, or if you just want all real roots - if (!only_in_domain || is_in_domain) { - // Rescale back into real-world values in [xmin,xmax] from [-1,1] - double x = ((m_xmax - m_xmin)*val_n11 + (m_xmax + m_xmin)) / 2.0; - roots.push_back(x); - } - } - } - } - return roots; - - //// The companion matrix is definitely lower Hessenberg, so we can skip the Hessenberg - //// decomposition, and get the real eigenvalues directly. These eigenvalues are defined - //// in the domain [-1, 1], but it might also include values outside [-1, 1] - //Eigen::VectorXd real_eigs = eigenvalues_upperHessenberg(companion_matrix().transpose(), /* balance = */ true); - // - //std::vector roots; - //for (Eigen::Index i = 0; i < real_eigs.size(); ++i){ - // double val_n11 = real_eigs(i); - // const bool is_in_domain = (val_n11 >= -1.0 && val_n11 <= 1.0); - // // Keep it if it is in domain, or if you just want all real roots - // if (!only_in_domain || is_in_domain){ - // // Rescale back into real-world values in [xmin,xmax] from [-1,1] - // double x = ((m_xmax - m_xmin)*val_n11 + (m_xmax + m_xmin)) / 2.0; - // roots.push_back(x); - // } - //} - //return roots; - } - double ChebyshevExpansion::monotonic_solvex(double y) { - /* - Function is known to be monotonic, so we can shortcut some of the solving steps used - We don't use the eigenvalue method because it is too slow - */ - auto& e = *this; - auto secant = [e,y](double a, double ya, double b, double yb, double yeps = 1e-14, double xeps = 1e-14) { - double c, yc; - for (auto i = 0; i < 50; ++i) { - c = b - yb * (b - a) / (yb - ya); - yc = e.y_Clenshaw_xscaled(c)-y; - if (yc * ya > 0) { - a = c; ya = yc; - } - else { - b = c; yb = yc; - } - if (std::abs(b - a) < xeps) { break; } - if (std::abs(yc) < yeps) { break; } - } - return c; - }; - // Determine if the function is monotonically increasing or decreasing - auto ynodes = get_node_function_values(); - auto nodes = get_nodes_n11(); - bool increasing = ynodes[ynodes.size() - 1] > ynodes[0]; // Nodes go from 1 to -1 (stuck with this), but increasing says whether the value at the last *index* (x=-1) is greater than that of the first index (x=1). - if (increasing) { - if (y > ynodes[ynodes.size() - 1]) { - throw std::invalid_argument("Argument is outside the range of the expansion"); - } - if (y < ynodes[0]) { - throw std::invalid_argument("Argument is outside the range of the expansion"); - } - } - else { - if (y < ynodes[ynodes.size() - 1]) { - throw std::invalid_argument("Argument is outside the range of the expansion"); - } - if (y > ynodes[0]) { - throw std::invalid_argument("Argument is outside the range of the expansion"); - } - } - - // Interval bisection to find the Chebyshev-Lobatto nodes that bound the solution by bisection - int N = static_cast(ynodes.size()); - Eigen::Index i = (increasing) ? get_increasingleftofval(ynodes, y, N) : get_decreasingleftofval(ynodes, y, N); - auto xscaled = secant(nodes(i), ynodes(i)-y, nodes(i + 1), ynodes(i + 1)-y); - return unscale_x(xscaled); - } - - std::vector ChebyshevExpansion::subdivide(std::size_t Nintervals, const std::size_t Norder) const { - - if (Nintervals == 1) { - return std::vector(1, *this); - } - - std::vector segments; - double deltax = (m_xmax - m_xmin) / (Nintervals - 1); - - // Vector of values in the range [-1,1] as roots of a high-order Chebyshev - double NN = static_cast(Norder); - Eigen::VectorXd xpts_n11 = (Eigen::VectorXd::LinSpaced(Norder + 1, 0, NN)*EIGEN_PI/NN).array().cos(); - - for (std::size_t i = 0; i < Nintervals - 1; ++i) { - double xmin = m_xmin + i*deltax, xmax = m_xmin + (i + 1)*deltax; - Eigen::VectorXd xrealworld = ((xmax - xmin)*xpts_n11.array() + (xmax + xmin)) / 2.0; - segments.push_back(factoryf(Norder, y(xrealworld), xmin, xmax)); - } - return segments; - } - std::vector ChebyshevExpansion::real_roots_intervals(const std::vector &segments, bool only_in_domain) { - std::vector roots; - for (auto &seg : segments) { - const auto segroots = seg.real_roots(only_in_domain); - roots.insert(roots.end(), segroots.cbegin(), segroots.cend()); - } - return roots; - } - std::vector ChebyshevExpansion::real_roots_approx(long Npoints) - { - std::vector roots; - // Vector of values in the range [-1,1] as roots of a high-order Chebyshev - Eigen::VectorXd xpts_n11 = (Eigen::VectorXd::LinSpaced(Npoints + 1, 0, Npoints)*EIGEN_PI / Npoints).array().cos(); - // Scale values into real-world values - Eigen::VectorXd ypts = y_recurrence_xscaled(xpts_n11); - // Eigen::MatrixXd buf(Npoints+1, 2); buf.col(0) = xpts; buf.col(1) = ypts; std::cout << buf << std::endl; - for (size_t i = 0; i < Npoints - 1; ++i) { - // The change of sign guarantees at least one root between indices i and i+1 - double y1 = ypts(i), y2 = ypts(i + 1); - bool signchange = (std::signbit(y1) != std::signbit(y2)); - if (signchange) { - double xscaled = xpts_n11(i); - - // Fit a quadratic given three points; i and i+1 bracket the root, so need one more constraint - // i0 is the leftmost of the three indices that will be used; when i == 0, use - // indices i,i+1,i+2, otherwise i-1,i,i+1 - size_t i0 = (i >= 1) ? i - 1 : i; - Eigen::Vector3d r; - r << ypts(i0), ypts(i0 + 1), ypts(i0 + 2); - Eigen::Matrix3d A; - for (std::size_t irow = 0; irow < 3; ++irow) { - double _x = xpts_n11(i0 + irow); - A.row(irow) << _x*_x, _x, 1; - } - // abc holds the coefficients a,b,c for y = a*x^2 + b*x + c - Eigen::VectorXd abc = A.colPivHouseholderQr().solve(r); - double a = abc[0], b = abc[1], c = abc[2]; - - // Solve the quadratic and find the root you want - double x1 = (-b + sqrt(b*b - 4 * a*c)) / (2 * a); - double x2 = (-b - sqrt(b*b - 4 * a*c)) / (2 * a); - bool x1_in_range = is_in_closed_range(xpts_n11(i), xpts_n11(i + 1), x1); - bool x2_in_range = is_in_closed_range(xpts_n11(i), xpts_n11(i + 1), x2); - - // Double check that only one root is within the range - if (x1_in_range && !x2_in_range) { - xscaled = x1; - } - else if (x2_in_range && !x1_in_range) { - xscaled = x2; - } - else { - xscaled = 1e99; - } - - // Rescale back into real-world values - double x = ((m_xmax - m_xmin)*xscaled + (m_xmax + m_xmin)) / 2.0; - roots.push_back(x); - } - else { - // TODO: locate other roots based on derivative considerations - } - } - return roots; - } - - /// Chebyshev-Lobatto nodes \f$ \cos(\pi j/N), j = 0,..., N \f$ in the range [-1,1] - Eigen::VectorXd ChebyshevExpansion::get_nodes_n11() { - std::size_t N = m_c.size()-1; - return CLnodes_library.get(N); - } - /// Chebyshev-Lobatto nodes \f$\cos(\pi j/N), j = 0,..., N \f$ mapped to the range [xmin, xmax] - Eigen::VectorXd ChebyshevExpansion::get_nodes_realworld() { - return ((m_xmax - m_xmin)*get_nodes_n11().array() + (m_xmax + m_xmin))*0.5; - } - /// Values of the function at the Chebyshev-Lobatto nodes - Eigen::VectorXd ChebyshevExpansion::get_node_function_values() const{ - if (m_nodal_value_cache.size() > 0) { - return m_nodal_value_cache; - } - else { - std::size_t N = m_c.size() - 1; - return u_matrix_library.get(N) * m_c; - } - } - ChebyshevExpansion ChebyshevExpansion::factoryf(const std::size_t N, const Eigen::VectorXd &f, const double xmin, const double xmax) { - // Step 3: Get coefficients for the L matrix from the library of coefficients - const Eigen::MatrixXd &L = l_matrix_library.get(N); - // Step 4: Obtain coefficients from vector - matrix product - return ChebyshevExpansion(L*f, xmin, xmax); - } - ChebyshevExpansion ChebyshevExpansion::factoryfFFT(const std::size_t N, const Eigen::VectorXd& f, const double xmin, const double xmax) { - - Eigen::VectorXd valsUnitDisc(2 * f.size() - 2); - // Starting at x = 1, going to -1, then the same nodes, not including x=-1 and x=1, in the opposite order - valsUnitDisc.head(f.size()) = f; - valsUnitDisc.tail(f.size() - 2) = f.reverse().segment(1, f.size() - 2); - - Eigen::FFT fft; - Eigen::VectorXcd FourierCoeffs(2 * f.size() - 2); - fft.fwd(FourierCoeffs, valsUnitDisc); - auto n = f.size() - 1; - Eigen::ArrayXd ChebCoeffs = FourierCoeffs.real().head(n+1)/n; - ChebCoeffs[0] /= 2; - ChebCoeffs[ChebCoeffs.size()-1] /= 2; - - return ChebyshevExpansion(ChebCoeffs, xmin, xmax); - } - ChebyshevExpansion ChebyshevExpansion::from_powxn(const std::size_t n, const double xmin, const double xmax) { - if (xmin != -1) { - throw std::invalid_argument("xmin must be -1"); - } - if (xmax != 1) { - throw std::invalid_argument("xmax must be 1"); - } - Eigen::VectorXd c = Eigen::VectorXd::Zero(n + 1); - for (std::size_t k = 0; k <= n / 2; ++k) { - std::size_t index = n - 2 * k; - double coeff = binomialCoefficient(static_cast(n), static_cast(k)); - if (index == 0) { - coeff /= 2.0; - } - c(index) = coeff; - } - return pow(2, 1-static_cast(n))*ChebyshevExpansion(c, xmin, xmax); - } - ChebyshevExpansion ChebyshevExpansion::deriv(std::size_t Nderiv) const { - // See Mason and Handscomb, p. 34, Eq. 2.52 - // and example in https ://github.com/numpy/numpy/blob/master/numpy/polynomial/chebyshev.py#L868-L964 - vectype c = m_c; - for (std::size_t deriv_counter = 0; deriv_counter < Nderiv; ++deriv_counter) { - std::size_t N = c.size() - 1, ///< Order of the expansion - Nd = N - 1; ///< Order of the derivative expansion - vectype cd(N); - for (std::size_t r = 0; r <= Nd; ++r) { - cd(r) = 0; - for (std::size_t k = r + 1; k <= N; ++k) { - // Terms where k-r is odd have values, otherwise, they are zero - if ((k - r) % 2 == 1) { - cd(r) += 2*k*c(k); - } - } - // The first term with r = 0 is divided by 2 (the single prime in Mason and Handscomb, p. 34, Eq. 2.52) - if (r == 0) { - cd(r) /= 2; - } - // Rescale the values if the range is not [-1,1]. Arrives from the derivative of d(xreal)/d(x_{-1,1}) - cd(r) /= (m_xmax-m_xmin)/2.0; - } - if (Nderiv == 1) { - return ChebyshevExpansion(std::move(cd), m_xmin, m_xmax); - } - else{ - c = cd; - } - } - return ChebyshevExpansion(std::move(c), m_xmin, m_xmax); - }; - ChebyshevExpansion ChebyshevExpansion::integrate(std::size_t Nintegral) const { - // See Mason and Handscomb, p. 33, Eq. 2.44 & 2.45 - // and example in https ://github.com/numpy/numpy/blob/master/numpy/polynomial/chebyshev.py#L868-L964 - if (Nintegral != 1) { throw std::invalid_argument("Only support one integral for now"); } - vectype c(m_c.size() + 1); - double width = m_xmax - m_xmin; - for (auto i = 1; i < m_c.size()+1; ++i) { - if (i == 1) { - // This special case is needed because the prime on the summation in Mason indicates the first coefficient - // is to be divided by two - c[i] = (2*m_c[i - 1] - m_c[i + 1]) / (2 * i); - } - else if (i + 1 > m_c.size()-1) { - c[i] = (m_c[i - 1]) / (2 * i); - } - else { - c[i] = (m_c[i - 1] - m_c[i + 1]) / (2 * i); - } - } - c(0) = 0; // This is the arbitrary constant; - c *= width / 2; - return ChebyshevExpansion(std::move(c), m_xmin, m_xmax); - } - - Eigen::VectorXd eigenvalues_upperHessenberg(const Eigen::MatrixXd &A, bool balance){ - Eigen::VectorXd roots(A.cols()); - Eigen::RealSchur schur; - - if (balance) { - Eigen::MatrixXd Abalanced, D; - balance_matrix(A, Abalanced, D); - schur.computeFromHessenberg(Abalanced, Eigen::MatrixXd::Zero(Abalanced.rows(), Abalanced.cols()), false); - } - else { - schur.computeFromHessenberg(A, Eigen::MatrixXd::Zero(A.rows(), A.cols()), false); - } - - const Eigen::MatrixXd &T = schur.matrixT(); - Eigen::Index j = 0; - for (int i = 0; i < T.cols(); ++i) { - if (i+1 < T.cols()-1 && std::abs(T(i+1,i)) > DBL_EPSILON){ - // Nope, this is a 2x2 block, keep moving - i += 1; - } - else{ - // This is a 1x1 block, keep this (real) eigenvalue - roots(j) = T(i, i); - j++; - } - } - roots.conservativeResize(j-1); - return roots; - } - - Eigen::VectorXcd eigenvalues(const Eigen::MatrixXd &A, bool balance) { - if (balance) { - Eigen::MatrixXd Abalanced, D; - balance_matrix(A, Abalanced, D); - return Abalanced.eigenvalues(); - } - else { - return A.eigenvalues(); - } - } - -}; /* namespace ChebTools */ diff --git a/src/external/ChebTools/ChebTools.h b/src/external/ChebTools/ChebTools.h deleted file mode 100644 index 816e273f..00000000 --- a/src/external/ChebTools/ChebTools.h +++ /dev/null @@ -1,565 +0,0 @@ -//Copyright 2018* United States Secretary of Commerce, NIST. -// -//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -// -//The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -// -//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -// Credit to https://github.com/usnistgov/ChebTools - -#ifndef CHEBTOOLS_H -#define CHEBTOOLS_H - -#include "Eigen/Dense" -#include -#include - -#include - - -namespace ChebTools{ - - // https://proquest.safaribooksonline.com/9780321637413 - // https://web.stanford.edu/class/archive/cs/cs107/cs107.1202/lab1/ - static int midpoint_Knuth(int x, int y) { - return (x & y) + ((x ^ y) >> 1); - }; - - - /** - * @brief This class stores sets of L matrices (because they are a function only of the degree of the expansion) - * - * The L matrix is used to convert from functional values to coefficients, as in \f[ \vec{c} = \mathbf{L}\vec{f} \f] - */ - class LMatrixLibrary { - private: - std::map matrices; - void build(std::size_t N) { - Eigen::MatrixXd L(N + 1, N + 1); ///< Matrix of coefficients - for (int j = 0; j <= N; ++j) { - for (int k = j; k <= N; ++k) { - double p_j = (j == 0 || j == N) ? 2 : 1; - double p_k = (k == 0 || k == N) ? 2 : 1; - L(j, k) = 2.0 / (p_j*p_k*N)*cos((j*EIGEN_PI*k) / N); - // Exploit symmetry to fill in the symmetric elements in the matrix - L(k, j) = L(j, k); - } - } - matrices[N] = L; - } - public: - /// Get the \f$\mathbf{L}\f$ matrix of degree N - const Eigen::MatrixXd & get(std::size_t N) { - auto it = matrices.find(N); - if (it != matrices.end()) { - return it->second; - } - else { - build(N); - return matrices.find(N)->second; - } - } - }; - static LMatrixLibrary l_matrix_library; - - /** - * @brief This class stores sets of U matrices (because they are a function only of the degree of the expansion) - * - * The U matrix is used to convert from coefficients to functional values, as in \f[ \vec{f} = \mathbf{U}\vec{c} \f] - */ - class UMatrixLibrary { - private: - std::map matrices; - void build(std::size_t N) { - Eigen::MatrixXd U(N + 1, N + 1); ///< Matrix of coefficients - for (int j = 0; j <= N; ++j) { - for (int k = j; k <= N; ++k) { - U(j, k) = cos((j*EIGEN_PI*k) / N); - // Exploit symmetry to fill in the symmetric elements in the matrix - U(k, j) = U(j, k); - } - } - matrices[N] = U; - } - public: - /// Get the \f$\mathbf{U}\f$ matrix of degree N - const Eigen::MatrixXd & get(std::size_t N) { - auto it = matrices.find(N); - if (it != matrices.end()) { - return it->second; - } - else { - build(N); - return matrices.find(N)->second; - } - } - }; - static UMatrixLibrary u_matrix_library; - - /** - For a monotonically increasing vector, find the left index of the interval bracketing the given value - */ - template - int get_increasingleftofval(const VecType& breakpoints, double x, int N) { - int iL = 0, iR = N - 1, iM; - while (iR - iL > 1) { - iM = midpoint_Knuth(iL, iR); - if (x >= breakpoints[iM]) { - iL = iM; - } - else { - iR = iM; - } - } - return iL; - }; - - /** - For a monotonically decreasing vector, find the left index of the interval bracketing the given value - */ - template - int get_decreasingleftofval(const VecType& breakpoints, double x, int N) { - int iL = 0, iR = N - 1, iM; - while (iR - iL > 1) { - iM = midpoint_Knuth(iL, iR); - if (x <= breakpoints[iM]) { - iL = iM; - } - else { - iR = iM; - } - } - return iL; - }; - - typedef Eigen::VectorXd vectype; - - /// Get the Chebyshev-Lobatto nodes for an expansion of degree \f$N\f$ - const Eigen::VectorXd &get_CLnodes(std::size_t N); - - Eigen::VectorXcd eigenvalues(const Eigen::MatrixXd &A, bool balance); - Eigen::VectorXd eigenvalues_upperHessenberg(const Eigen::MatrixXd &A, bool balance); - - /** - * @brief This is the main underlying object that makes all of the code of ChebTools work. - * - * This class has accessor methods for getting things from the object, and static factory - * functions for generating new expansions. It also has methods for calculating derivatives, - * roots, etc. - */ - class ChebyshevExpansion { - private: - vectype m_c; - double m_xmin, m_xmax; - - vectype m_recurrence_buffer; - vectype m_nodal_value_cache; - void resize() { - m_recurrence_buffer.resize(m_c.size()); - } - - //reduce_zeros changes the m_c field so that our companion matrix doesnt have nan values in it - //all this does is truncate m_c such that there are no trailing zero values - static Eigen::VectorXd reduce_zeros(const Eigen:: VectorXd &chebCoeffs){ - //these give us a threshold for what coefficients are large enough - double largeTerm = 1e-15; - if (chebCoeffs.size()>=1 && std::abs(chebCoeffs(0))>largeTerm){ - largeTerm = chebCoeffs(0); - } - //if the second coefficient is larger than the first, then make our tolerance - //based on the second coefficient, this is useful for functions whose mean value - //is zero on the interval - if (chebCoeffs.size()>=2 && std::abs(chebCoeffs(1))>largeTerm){ - largeTerm = chebCoeffs(1); - } - double tol = largeTerm*(1e-15); - int neededSize = static_cast(chebCoeffs.size()); - //loop over m_c backwards, if we run into large enough coefficient, then record the size and break - for (int i=static_cast(chebCoeffs.size())-1; i>=0; i--){ - if (std::abs(chebCoeffs(i))>tol){ - neededSize = i+1; - break; - } - neededSize--; - } - //neededSize gives us the number of coefficients that are nonzero - //we will resize m_c such that there are essentially no trailing zeros - return chebCoeffs.head(neededSize); - } - - public: - /// Initializer with coefficients, and optionally a range provided - ChebyshevExpansion(const vectype &c, double xmin = -1, double xmax = 1) : m_c(c), m_xmin(xmin), m_xmax(xmax) { resize(); }; - /// Initializer with coefficients, and optionally a range provided - ChebyshevExpansion(const std::vector &c, double xmin = -1, double xmax = 1) : m_xmin(xmin), m_xmax(xmax) { - m_c = Eigen::Map(&(c[0]), c.size()); - resize(); - }; - /// Move constructor (C++11 only) - ChebyshevExpansion(const vectype &&c, double xmin = -1, double xmax = 1) : m_c(c), m_xmin(xmin), m_xmax(xmax) { resize(); }; - - /// Cache nodal function values - void cache_nodal_function_values(vectype values) { - m_nodal_value_cache = values; - } - /// Get the minimum value of \f$x\f$ for the expansion - double xmin() const{ return m_xmin; } - /// Get the maximum value of \f$x\f$ for the expansion - double xmax() const{ return m_xmax; } - /// Go from a value in [xmin,xmax] to a value in [-1,1] - double scale_x(const double x) const { - return (2 * x - (m_xmax + m_xmin)) / (m_xmax - m_xmin); - } - /// Map from a value in [-1,1] to a value in [xmin,xmax] - double unscale_x(const double xscaled) const { - return ((m_xmax - m_xmin)*xscaled + (m_xmax + m_xmin))/2; - } - - /// Get the vector of coefficients in increasing order - const vectype &coef() const; - - /// Return the N-th derivative of this expansion, where N must be >= 1 - ChebyshevExpansion deriv(std::size_t Nderiv) const; - /// Return the indefinite integral of this function - ChebyshevExpansion integrate(std::size_t Nintegral = 1) const; - /// Get the Chebyshev-Lobatto nodes in the domain [-1,1] - Eigen::VectorXd get_nodes_n11(); - /// Get the Chebyshev-Lobatto nodes in the domain [-1,1]; thread-safe const variant - Eigen::VectorXd get_nodes_n11() const { - Eigen::Index N = m_c.size() - 1; - double NN = static_cast(N); - return (Eigen::VectorXd::LinSpaced(N + 1, 0, NN).array() * EIGEN_PI / N).cos(); - } - /// Get the Chebyshev-Lobatto nodes in the domain [xmin, xmax] - Eigen::VectorXd get_nodes_realworld(); - /// Get the Chebyshev-Lobatto nodes in the domain [xmin, xmax]; thread-safe const variant - Eigen::VectorXd get_nodes_realworld() const { - return ((m_xmax - m_xmin) * get_nodes_n11().array() + (m_xmax + m_xmin)) * 0.5; - } - - /// Values of the function at the Chebyshev-Lobatto nodes - Eigen::VectorXd get_node_function_values() const; - /// Return true if the function values at the Chebyshev-Lobatto nodes are monotonic with the independent variable - bool is_monotonic() const; - - // ****************************************************************** - // *********************** OPERATORS *********************** - // ****************************************************************** - - /// A ChebyshevExpansion plus another ChebyshevExpansion yields a new ChebyheveExpansion - ChebyshevExpansion operator+(const ChebyshevExpansion &ce2) const ; - /** - * @brief An inplace addition of two expansions - * @note The lower degree one is right-padded with zeros to have the same degree as the higher degree one - * @param donor The other expansion in the summation - */ - ChebyshevExpansion& operator+=(const ChebyshevExpansion &donor); - /// Multiplication of an expansion by a constant - ChebyshevExpansion operator*(double value) const; - /// Addition of a constant to an expansion - ChebyshevExpansion operator+(double value) const; - /// Subtraction of a constant from an expansion - ChebyshevExpansion operator-(double value) const; - /// An inplace multiplication of an expansion by a constant - ChebyshevExpansion& operator*=(double value); - /// An inplace addition of a constant to an expansion - ChebyshevExpansion& operator+=(double value); - /// An inplace subtraction of a constant from an expansion - ChebyshevExpansion& operator-=(double value); - /// Unary negation operator - ChebyshevExpansion operator-() const; - /// An inplace subtraction of an expansion by another expansion - ChebyshevExpansion& operator-=(const ChebyshevExpansion &ce2); - /// An inplace subtraction of an expansion by another expansion - ChebyshevExpansion operator-(const ChebyshevExpansion& ce2) const; - /** - * @brief Multiply two Chebyshev expansions together; thanks to Julia code from Bradley Alpert, NIST - * - * Converts padded expansions to nodal functional values, functional values are multiplied together, - * and then inverse transformation is used to return to coefficients of the product - * @param ce2 The other expansion - */ - ChebyshevExpansion operator*(const ChebyshevExpansion &ce2) const; - - /** - * @brief Divide two expansions by each other. Right's reciprocal is taken, multiplied by this expansion - * - * @param ce2 The other expansion - */ - ChebyshevExpansion operator/(const ChebyshevExpansion& ce2) const { - return (*this) * ce2.reciprocal(); - } - /** - * @brief Multiply a Chebyshev expansion by its independent variable \f$x\f$ - */ - ChebyshevExpansion times_x() const; - - /** - * @brief Multiply a Chebyshev expansion by its independent variable \f$x\f$ in-place - * - * This operation is carried out in-place to minimize the amount of memory re-allocation - * which proved during profiling to be a major source of inefficiency - */ - ChebyshevExpansion& times_x_inplace(); - - ChebyshevExpansion reciprocal() const; - - /// Friend function that allows for pre-multiplication by a constant value - friend ChebyshevExpansion operator*(double value, const ChebyshevExpansion &ce){ - return ChebyshevExpansion(std::move(ce.coef()*value),ce.m_xmin, ce.m_xmax); - }; - /// Friend function that allows expansion to be the denominator in division with double - friend ChebyshevExpansion operator/(double value, const ChebyshevExpansion& ce) { - return value * ce.reciprocal(); - }; - /// Friend function that allows pre-subtraction of expansion (value-expansion) - friend ChebyshevExpansion operator-(double value, const ChebyshevExpansion& ce) { - return -ce+value; - }; - /// Friend function that allows pre-addition of expansion (value+expansion) - friend ChebyshevExpansion operator+(double value, const ChebyshevExpansion& ce) { - return ce + value; - }; - - /** - * @brief Apply a function to the expansion - * - * This function first converts the expansion to functional values at the - * Chebyshev-Lobatto nodes, applies the function to the nodal values, and then - * does the inverse transformation to arrive at the coefficients of the expansion - * after applying the transformation - */ - ChebyshevExpansion apply(std::function &f) const; - - // ****************************************************************** - // ********************** EVALUATORS *********************** - // ****************************************************************** - - /** - * @brief Do a single input/single output evaluation of the Chebyshev expansion with the inputs scaled in [xmin, xmax] - * @param x A value scaled in the domain [xmin,xmax] - */ - double y_recurrence(const double x); - /** - * @brief Do a single input/single output evaluation of the Chebyshev expansion with the inputs scaled in [xmin, xmax] - * @param x A value scaled in the domain [xmin,xmax] - */ - double y_Clenshaw(const double x) const { return y_Clenshaw_xscaled(scale_x(x)); } - /** - * @brief Do a single input/single output evaluation of the Chebyshev expansion with the inputs scaled in [-1,1] - * @param x A value scaled in the domain [-1,1] - */ - double y_Clenshaw_xscaled(const double x) const; - /** - * @brief Do a vectorized evaluation of the Chebyshev expansion with the inputs scaled in [xmin, xmax] - * @param x A vectype of values in the domain [xmin,xmax] - */ - vectype y(const vectype &x) const; - /** - * @brief Do a vectorized evaluation of the Chebyshev expansion with the inputs scaled in [xmin, xmax] - * @param x A value scaled in the domain [xmin,xmax] - */ - double y(const double x) const{ return y_Clenshaw(x); } - /** - * @brief Do a vectorized evaluation of the Chebyshev expansion with the input scaled in the domain [-1,1] - * @param xscaled A vectype of values scaled to the domain [-1,1] (the domain of the Chebyshev basis functions) - * @returns y A vectype of values evaluated from the expansion - * - * By using vectorizable types like Eigen::MatrixXd, without - * any additional work, "magical" vectorization is happening - * under the hood, giving a significant speed improvement. From naive - * testing, the increase was a factor of about 10x. - */ - vectype y_recurrence_xscaled(const vectype &xscaled) const ; - /** - * @brief Do a vectorized evaluation of the Chebyshev expansion with the input scaled in the domain [-1,1] with Clenshaw's method - * @param xscaled A vectype of values scaled to the domain [-1,1] (the domain of the Chebyshev basis functions) - * @returns y A vectype of values evaluated from the expansion - */ - vectype y_Clenshaw_xscaled(const vectype &xscaled) const ; - - /** - * @brief Construct and return the companion matrix of the Chebyshev expansion - * @returns A The companion matrix of the expansion - * - * See Boyd, SIAM review, 2013, http://dx.doi.org/10.1137/110838297, Appendix A.2 - */ - Eigen::MatrixXd companion_matrix(const Eigen::VectorXd &coeffs) const ; - /** - * @brief Return the real roots of the Chebyshev expansion - * @param only_in_domain If true, only real roots that are within the domain - * of the expansion will be returned, otherwise all real roots - * - * The roots are obtained based on the fact that the eigenvalues of the - * companion matrix are the roots of the Chebyshev expansion. Thus - * this function is relatively slow, because an eigenvalue solve is required, - * which takes O(n^3) FLOPs. But it is numerically rather reliable. - * - * As the order of the expansion increases, the eigenvalue solver in Eigen becomes - * progressively less and less able to obtain the roots properly. The eigenvalue - * solver in numpy tends to be more reliable. - */ - std::vector real_roots(bool only_in_domain = true) const ; - /** - * @brief The second-generation rootfinder of ChebyshevExpansions - * @param only_in_domain True: only keep roots that are in the domain of the expansion. False: all real roots - */ - std::vector real_roots2(bool only_in_domain = true) const; - - /** - * @brief Calculate the value (only one) of x in [xmin, xmax] for which the expansion value is equal to given value - * - * Functionally the use is similar to real_roots except that: - * 1) nodal values are cached - * 2) only one solution is possible - * - Warning: the monotonicity of the expansion is assumed, but not checked - * - * @param yval Given value for which value of x is to be obtained - */ - double monotonic_solvex(double yval); - - /** - * @brief Subdivide the original interval into a set of subintervals that are linearly spaced - * @note A vector of ChebyshevExpansions are returned - * @param Nintervals The number of intervals - * @param Ndegree The degree of the Chebyshev expansion in each interval - */ - std::vector subdivide(std::size_t Nintervals, std::size_t Ndegree) const ; - - /** - * @brief For a vector of ChebyshevExpansions, find all roots in each interval - * @param segments The vector of ChebyshevExpansions - * @param only_in_domain True: only keep roots that are in the domain of the expansion. False: all real roots - */ - static std::vector real_roots_intervals(const std::vector &segments, bool only_in_domain = true); - - /** - * @brief Time how long (in seconds) it takes to evaluate the roots - * @param N How many repeats to do (maybe a million? It's pretty fast for small degrees) - */ - double real_roots_time(long N); - - /// A DEPRECATED function for approximating the roots (do not use) - std::vector real_roots_approx(long Npoints); - - // ****************************************************************** - // *********************** BUILDERS *********************** - // ****************************************************************** - - /** - * @brief Given a set of values at the Chebyshev-Lobatto nodes, perhaps obtained from the ChebyshevExpansion::factory function, - * get the expansion, using the discrete cosine transform (DCT) approach - * - * @param N The degree of the expansion - * @param f The set of values at the Chebyshev-Lobatto nodes - * @param xmin The minimum value of x for the expansion - * @param xmax The maximum value of x for the expansion - */ - static ChebyshevExpansion factoryf(const std::size_t N, const Eigen::VectorXd &f, const double xmin, const double xmax) ; - - /** - * @brief Given a set of values at the Chebyshev-Lobatto nodes, build the expansion, using the FFT approach - * - * See this clear example: https://www.mathworks.com/matlabcentral/mlc-downloads/downloads/submissions/23972/versions/22/previews/chebfun/examples/approx/html/ChebfunFFT.html - * - * @param N The degree of the expansion - * @param f The set of values at the Chebyshev-Lobatto nodes - * @param xmin The minimum value of x for the expansion - * @param xmax The maximum value of x for the expansion - */ - static ChebyshevExpansion factoryfFFT(const std::size_t N, const Eigen::VectorXd& f, const double xmin, const double xmax); - - /** - * @brief Given a callable function, construct the N-th order Chebyshev expansion in [xmin, xmax] - * @param N The order of the expansion; there will be N+1 coefficients - * @param func A callable object, taking the x value (in [xmin,xmax]) and returning the y value - * @param xmin The minimum x value for the fit - * @param xmax The maximum x value for the fit - * - * See Boyd, SIAM review, 2013, http://dx.doi.org/10.1137/110838297, Appendix A. - */ - template - static ChebyshevExpansion factory(const std::size_t N, double_function func, const double xmin, const double xmax) - { - // Get the precalculated Chebyshev-Lobatto nodes - const Eigen::VectorXd & x_nodes_n11 = get_CLnodes(N); - - // Step 1&2: Grid points functional values (function evaluated at the - // extrema of the Chebyshev polynomial of order N - there are N+1 of them) - Eigen::VectorXd f(N + 1); - for (int k = 0; k <= N; ++k) { - // The extrema in [-1,1] scaled to real-world coordinates - double x_k = ((xmax - xmin)*x_nodes_n11(k) + (xmax + xmin)) / 2.0; - f(k) = func(x_k); - } - return factoryf(N, f, xmin, xmax); - }; - - /// Convert a monomial term in the form \f$x^n\f$ to a Chebyshev expansion - static ChebyshevExpansion from_powxn(const std::size_t n, const double xmin, const double xmax); - - /** - * @brief Convert a polynomial expansion in monomial form to a Chebyshev expansion - * - * The monomial expansion is of the form \f$ y = \displaystyle\sum_{i=0}^N c_ix_i\f$ - * - * This transformation can be carried out analytically. For convenience we repetitively use - * calls to ChebyshevExpansion::from_powxn to build up the expansion. This is probably not - * the most efficient option, but it works. - * - * @param c The vector of coefficients of the monomial expansion in *increasing* degree: - * @param xmin The minimum value of \f$x\f$ for the expansion - * @param xmax The maximum value of \f$x\f$ for the expansion - */ - template - static ChebyshevExpansion from_polynomial(vector_type c, const double xmin, const double xmax) { - vectype c0(1); c0 << 0; - ChebyshevExpansion s(c0, xmin, xmax); - for (std::size_t i = 0; i < static_cast(c.size()); ++i) { - s += c(i)*from_powxn(i, xmin, xmax); - } - return s; - } - - static auto dyadic_splitting(const std::size_t N, const std::function& func, const double xmin, const double xmax, - const int M, const double tol, const int max_refine_passes = 8, - const std::function&)>&callback = {}) - { - - // Convenience function to get the M-element norm - auto get_err = [M](const ChebyshevExpansion& ce) { return ce.coef().tail(M).norm() / ce.coef().head(M).norm(); }; - - // Start off with the full domain from xmin to xmax - std::deque expansions; - expansions.emplace_back(ChebyshevExpansion::factory(N, func, xmin, xmax)); - - // Now enter into refinement passes - for (int refine_pass = 0; refine_pass < max_refine_passes; ++refine_pass) { - bool all_converged = true; - // Start at the right and move left because insertions will make the length increase - for (int iexpansion = static_cast(expansions.size())-1; iexpansion >= 0; --iexpansion) { - auto& expan = expansions[iexpansion]; - auto err = get_err(expan); - if (err > tol) { - // Splitting is required, do a dyadic split - auto xmid = (expan.xmin() + expan.xmax()) / 2; - auto newleft = ChebyshevExpansion::factory(N, func, expan.xmin(), xmid); - auto newright = ChebyshevExpansion::factory(N, func, xmid, expan.xmax()); - std::swap(expan, newleft); - expansions.insert(expansions.begin() + iexpansion+1, newright); - all_converged = false; - } - } - if (all_converged) { break; } - if (callback != nullptr) { - callback(refine_pass, expansions); - } - } - return expansions; - } - }; - -}; /* namespace ChebTools */ -#endif diff --git a/src/external/ChebTools/speed_tests.h b/src/external/ChebTools/speed_tests.h deleted file mode 100644 index cc5944d5..00000000 --- a/src/external/ChebTools/speed_tests.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef SPEED_TESTS_H -#define SPEED_TESTS_H - -#include "ChebTools/ChebTools.h" -#include - -double real_roots_time(ChebTools::ChebyshevExpansion &ce, long N); -double plus_by_inplace(ChebTools::ChebyshevExpansion &ce, const ChebTools::ChebyshevExpansion &ce2, int N); -double mult_by_inplace(ChebTools::ChebyshevExpansion &ce, double val, int N); -void mult_by(ChebTools::ChebyshevExpansion &ce, double val, int N); -std::map evaluation_speed_test(ChebTools::ChebyshevExpansion &cee, const Eigen::VectorXd &xpts, long N) ; -Eigen::MatrixXd eigs_speed_test(std::vector &Nvec, std::size_t Nrepeats); - -#endif \ No newline at end of file diff --git a/src/external/PackedCSparse/FloatArray.h b/src/external/PackedCSparse/FloatArray.h deleted file mode 100644 index 28d1c5da..00000000 --- a/src/external/PackedCSparse/FloatArray.h +++ /dev/null @@ -1,307 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from PolytopeSamplerMatlab -//(https://github.com/ConstrainedSampler/PolytopeSamplerMatlab/blob/master/code/solver/PackedCSparse/PackedChol.h) by Ioannis Iakovidis - -#pragma once -#include -#include -#include -namespace PackedCSparse { - template - struct BaseImpl - { - T x[k]; - - BaseImpl() {}; - - BaseImpl(const T& rhs) - { - for (size_t i = 0; i < k; i++) - x[i] = rhs; - } - - BaseImpl operator+(const BaseImpl& rhs) const - { - BaseImpl lhs; - for (size_t i = 0; i < k; i++) - lhs.x[i] = x[i] + rhs.x[i]; - return lhs; - } - - BaseImpl operator-(const BaseImpl& rhs) const - { - BaseImpl lhs; - for (size_t i = 0; i < k; i++) - lhs.x[i] = x[i] - rhs.x[i]; - return lhs; - } - - BaseImpl operator*(const BaseImpl& rhs) const - { - BaseImpl lhs; - for (size_t i = 0; i < k; i++) - lhs.x[i] = x[i] * rhs.x[i]; - return lhs; - } - - BaseImpl operator/(const BaseImpl& rhs) const - { - BaseImpl lhs; - for (size_t i = 0; i < k; i++) - lhs.x[i] = x[i] / rhs.x[i]; - return lhs; - } - - BaseImpl& operator+=(const BaseImpl& rhs) - { - for (size_t i = 0; i < k; i++) - x[i] += rhs.x[i]; - return *this; - } - - BaseImpl& operator-=(const BaseImpl& rhs) - { - for (size_t i = 0; i < k; i++) - x[i] -= rhs.x[i]; - return *this; - } - - BaseImpl& operator*=(const BaseImpl& rhs) - { - for (size_t i = 0; i < k; i++) - x[i] *= rhs.x[i]; - return *this; - } - - BaseImpl& operator/=(const BaseImpl& rhs) - { - for (size_t i = 0; i < k; i++) - x[i] /= rhs.x[i]; - return *this; - } - - explicit operator bool() const - { - bool ret = false; - for (size_t i = 0; i < k; i++) - ret = ret || bool(x[i]); - return ret; - } - - static T get(const BaseImpl& a, size_t index) - { - return a.x[index]; - } - - static void set(BaseImpl& a, size_t index, const T& value) - { - a.x[index] = value; - } - - static BaseImpl abs(const BaseImpl& a) - { - BaseImpl out; - for (size_t i = 0; i < k; i++) - out.x[i] = std::abs(a.x[i]); - return out; - } - - static BaseImpl log(const BaseImpl& a) - { - BaseImpl out; - for (size_t i = 0; i < k; i++) - out.x[i] = std::log(a.x[i]); - return out; - } - - static void fmadd(BaseImpl& a, const BaseImpl& b, const BaseImpl& c) - { - for (size_t i = 0; i < k; i++) - a.x[i] += b.x[i] * c.x[i]; - } - - static void fnmadd(BaseImpl& a, const BaseImpl& b, const BaseImpl& c) - { - for (size_t i = 0; i < k; i++) - a.x[i] -= b.x[i] * c.x[i]; - } - - static void fmadd(BaseImpl& a, const BaseImpl& b, const T& c) - { - for (size_t i = 0; i < k; i++) - a.x[i] += b.x[i] * c; - } - - static void fnmadd(BaseImpl& a, const BaseImpl& b, const T& c) - { - for (size_t i = 0; i < k; i++) - a.x[i] -= b.x[i] * c; - } - - static BaseImpl clipped_sqrt(const BaseImpl& a, const T nonpos_output) - { - BaseImpl out; - for (size_t i = 0; i < k; i++) - { - T r = a.x[i]; - if (r > 0) - out.x[i] = sqrt(r); - else - out.x[i] = nonpos_output; - } - return out; - } - - static BaseImpl sign(std::mt19937_64& gen) - { - BaseImpl out; - unsigned long long seed = gen(); - for (size_t i = 0; i < k; i++) - { - out.x[i] = T((2 * ((seed >> i) & 1)) - 1.0); - if ((i & 63) == 63) seed = gen(); - } - return out; - } - - }; - - template - struct BaseScalarImpl - { - static T get(const T& x, size_t index) - { - return x; - } - - static void set(T& x, size_t index, T& value) - { - x = value; - } - - static T abs(const T &x) - { - return ::abs(x); - } - - static T log(const T &x) - { - return ::log(x); - } - - static void fmadd(T& a, const T& b, const T& c) - { - a += b * c; - } - - static void fnmadd(T& a, const T& b, const T& c) - { - a -= b * c; - } - - static T clipped_sqrt(const T& x, const T& nonpos_output) - { - if (x > 0.0) - return sqrt(x); - else - return nonpos_output; - } - - static T sign(std::mt19937_64& gen) - { - unsigned long long seed = gen(); - return T((2 * (seed & 1)) - 1.0); - } - }; - - template - struct FloatTypeSelector - { - using type = typename std::conditional>::type; - using funcImpl = typename std::conditional, BaseImpl>::type; - }; - - #ifdef __AVX2__ - #include "FloatArrayAVX2.h" - #else - template - struct FloatTypeSelector - { - using type = typename std::conditional< k == 1, double, BaseImpl>::type; - using funcImpl = typename std::conditional< k == 1, BaseScalarImpl, BaseImpl>::type; - }; - - template - struct FloatTypeSelector, l> - { - using type = BaseImpl; - using funcImpl = BaseImpl; - }; - #endif - - template - struct FloatTypeSelector, l> - { - using type = BaseImpl; - using funcImpl = BaseImpl; - }; - - template - using FloatArray = typename FloatTypeSelector::type; - - template - using FloatArrayFunc = typename FloatTypeSelector::funcImpl; - - template - auto get(const T& a, size_t index) -> decltype(FloatArrayFunc::get(a, index)) - { - return FloatArrayFunc::get(a, index); - } - - template - void set(T1& a, size_t index, T2 value) - { - FloatArrayFunc::set(a, index, value); - } - - template - void fmadd(T1& a, const T2& b, const T3& c) - { - FloatArrayFunc::fmadd(a, b, c); - } - - template - void fnmadd(T1& a, const T2& b, const T3& c) - { - FloatArrayFunc::fnmadd(a, b, c); - } - - template - T1 clipped_sqrt(const T1& a, const T2 b) - { - return FloatArrayFunc::clipped_sqrt(a, b); - } - - template - T abs(const T& a) - { - return FloatArrayFunc::abs(a); - } - - template - T log(const T& a) - { - return FloatArrayFunc::log(a); - } - - template - T sign(std::mt19937_64& gen) - { - return FloatArrayFunc::sign(gen); - } -} diff --git a/src/external/PackedCSparse/FloatArrayAVX2.h b/src/external/PackedCSparse/FloatArrayAVX2.h deleted file mode 100644 index 3ae7592a..00000000 --- a/src/external/PackedCSparse/FloatArrayAVX2.h +++ /dev/null @@ -1,222 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from PolytopeSamplerMatlab -//(https://github.com/ConstrainedSampler/PolytopeSamplerMatlab/blob/master/code/solver/PackedCSparse/PackedChol.h) by Ioannis Iakovidis - -template - struct m256dArray -{ - __m256d x[k]; - - m256dArray() {}; - - m256dArray(const double rhs) - { - for (size_t i = 0; i < k; i++) - x[i] = _mm256_set1_pd(rhs); - } - - template - m256dArray(const m256dArray& rhs) - { - for (size_t i = 0; i < k; i++) - x[i] = rhs.x[i % k2]; - } - - m256dArray operator+(const m256dArray& rhs) const - { - m256dArray out; - for (size_t i = 0; i < k; i++) - out.x[i] = _mm256_add_pd(x[i], rhs.x[i]); - return out; - } - - m256dArray operator-(const m256dArray& rhs) const - { - m256dArray out; - for (size_t i = 0; i < k; i++) - out.x[i] = _mm256_sub_pd(x[i], rhs.x[i]); - return out; - } - - m256dArray operator*(const m256dArray& rhs) const - { - m256dArray out; - for (size_t i = 0; i < k; i++) - out.x[i] = _mm256_mul_pd(x[i], rhs.x[i]); - return out; - } - - m256dArray operator/(const m256dArray& rhs) const - { - m256dArray out; - for (size_t i = 0; i < k; i++) - out.x[i] = _mm256_div_pd(x[i], rhs.x[i]); - return out; - } - - m256dArray& operator+=(const m256dArray& rhs) - { - for (size_t i = 0; i < k; i++) - x[i] = _mm256_add_pd(x[i], rhs.x[i]); - return *this; - } - - m256dArray& operator-=(const m256dArray& rhs) - { - for (size_t i = 0; i < k; i++) - x[i] = _mm256_sub_pd(x[i], rhs.x[i]); - return *this; - } - - m256dArray& operator*=(const m256dArray& rhs) - { - for (size_t i = 0; i < k; i++) - x[i] = _mm256_mul_pd(x[i], rhs.x[i]); - return *this; - } - - m256dArray& operator/=(const m256dArray& rhs) - { - for (size_t i = 0; i < k; i++) - x[i] = _mm256_div_pd(x[i], rhs.x[i]); - return *this; - } - - explicit operator bool() const - { - bool ret = false; - __m256d z = _mm256_set1_pd(0.0); - for (size_t i = 0; i < k; i++) - { - __m256d c = _mm256_cmp_pd(x[i], z, _CMP_EQ_OQ); - ret = ret || (_mm256_movemask_pd(c) != 0xf); - } - return ret; - } - - static double get(const m256dArray& x, size_t index) - { - double y[4]; - _mm256_store_pd(y, x.x[index / 4]); - return y[index & 3]; - } - - static void set(m256dArray& x, size_t index, double value) - { - __m256d v = _mm256_broadcast_sd(&value); - switch (index & 3) - { - case 0: x.x[index / 4] = _mm256_blend_pd(x.x[index / 4], v, 1); break; - case 1: x.x[index / 4] = _mm256_blend_pd(x.x[index / 4], v, 2); break; - case 2: x.x[index / 4] = _mm256_blend_pd(x.x[index / 4], v, 4); break; - default: x.x[index / 4] = _mm256_blend_pd(x.x[index / 4], v, 8); break; - } - } - - static m256dArray abs(const m256dArray& x) - { - const __m256d mask = _mm256_castsi256_pd(_mm256_set1_epi64x(0x7FFFFFFFFFFFFFFF)); - - m256dArray out; - for (size_t i = 0; i < k; i++) - out.x[i] = _mm256_and_pd(x.x[i], mask); - return out; - } - - static m256dArray log(const m256dArray& x) - { - // gcc does not support _mm256_log_pd - // Do it sequentially instead - - //m256dArray out; - //for (size_t i = 0; i < k; i++) - // out.x[i] = _mm256_log_pd(x.x[i]); - - m256dArray out; - for (size_t i = 0; i < 4*k; i++) - set(out, i, std::log(get(x,i))); - return out; - } - - static void fmadd(m256dArray& a, const m256dArray& b, const double& c) - { - auto cx = _mm256_set1_pd(c); - for (size_t i = 0; i < k; i++) - a.x[i] = _mm256_fmadd_pd(b.x[i], cx, a.x[i]); - } - - static void fnmadd(m256dArray& a, const m256dArray& b, const double& c) - { - auto cx = _mm256_set1_pd(c); - for (size_t i = 0; i < k; i++) - a.x[i] = _mm256_fnmadd_pd(b.x[i], cx, a.x[i]); - } - - static void fmadd(m256dArray& a, const m256dArray& b, const m256dArray& c) - { - for (size_t i = 0; i < k; i++) - a.x[i] = _mm256_fmadd_pd(b.x[i], c.x[i], a.x[i]); - } - - static void fnmadd(m256dArray& a, const m256dArray& b, const m256dArray& c) - { - for (size_t i = 0; i < k; i++) - a.x[i] = _mm256_fnmadd_pd(b.x[i], c.x[i], a.x[i]); - } - - static m256dArray clipped_sqrt(const m256dArray& x, const double nonpos_output) - { - m256dArray out; - - const __m256d large = { nonpos_output, nonpos_output, nonpos_output, nonpos_output }; - const __m256d zero = _mm256_setzero_pd(); - for (size_t i = 0; i < k; i++) - { - __m256d xi = x.x[i]; - __m256d mask = _mm256_cmp_pd(xi, zero, _CMP_LE_OS); // mask = (rhs.x[i]<= 0) ? -1 : 0 - out.x[i] = _mm256_blendv_pd(_mm256_sqrt_pd(xi), large, mask); - } - return out; - } - - static m256dArray sign(std::mt19937_64& gen) - { - m256dArray out; - const __m256i bits = _mm256_set_epi64x(1, 2, 4, 8); - const __m256d zero = _mm256_setzero_pd(); - const __m256d pos = _mm256_set_pd(1.0, 1.0, 1.0, 1.0); - const __m256d neg = _mm256_set_pd(-1.0, -1.0, -1.0, -1.0); - - unsigned long long seed = gen(); - for (size_t i = 0; i < k; i++) - { - __m256i s = _mm256_set1_epi64x((seed >> (4 * i)) & 15); - __m256i xi = _mm256_and_si256(s, bits); - __m256d x = _mm256_castsi256_pd(xi); - __m256d mask = _mm256_cmp_pd(x, zero, _CMP_EQ_OQ); // mask = (rhs.x[i] == 0) ? -1 : 0 - out.x[i] = _mm256_blendv_pd(pos, neg, mask); - if ((i & 63) == 63) seed = gen(); - } - return out; - } -}; - -template - struct FloatTypeSelector -{ - static_assert(k == 1 || k % 4 == 0, "Array assumes k = 1 or a multiple of 4"); - using type = typename std::conditional< k == 1, double, m256dArray>::type; - using funcImpl = typename std::conditional< k == 1, BaseScalarImpl, m256dArray>::type; -}; - -template - struct FloatTypeSelector, l> -{ - using type = m256dArray; - using funcImpl = m256dArray; -}; diff --git a/src/external/PackedCSparse/PackedChol.h b/src/external/PackedCSparse/PackedChol.h deleted file mode 100644 index 97d10220..00000000 --- a/src/external/PackedCSparse/PackedChol.h +++ /dev/null @@ -1,308 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from PolytopeSamplerMatlab -//(https://github.com/ConstrainedSampler/PolytopeSamplerMatlab/blob/master/code/solver/PackedCSparse/PackedChol.h) by Ioannis Iakovidis - -#pragma once -#include "Eigen/Eigen" -#include "SparseMatrix.h" -#include "chol.h" -#include "leverage.h" -#include "leverageJL.h" -#include "multiply.h" -#include "qd/dd_real.h" -#include -#include -using namespace PackedCSparse; - -template -void get_slice(Tout *out, Tin *in, size_t n, size_t idx) { - for (size_t j = 0; j < n; j++) - out[j] = to_double(get(in[j], idx)); -} - -template -void set_slice(Tout *out, Tin *in, size_t n, size_t idx) { - for (size_t j = 0; j < n; j++) - set(out[j], idx, to_double(in[j])); -} - -template struct PackedChol { - using Tx = double; - using Tx2 = FloatArray; - using Te = dd_real; - - // parameters - SparseMatrix A; - SparseMatrix At; - UniqueAlignedPtr w; - Tx accuracyThreshold = 1e-6; - std::vector - exactIdx; // k size array. Indices we perform high precision calculation - std::vector - numExact; // number of times we perform high precision decompose (length - // k+1, the last one records how many times we do decompose) - bool decomposed = false; - - // preprocess info for different CSparse operations (PackedDouble) - MultiplyOutput H; // cache for H = A W A' - CholOutput L; // cache for L = chol(H) - LeverageOutput diagP; // cache for L = chol(H) - LeverageJLOutput diagPJL; // cache for L = chol(H) - - // preprocess info for different CSparse operations (dd_real) - MultiplyOutput H_exact; // cache for H = A W A' - CholOutput L_exact; // cache for L = chol(H) - LeverageOutput diagP_exact; // cache for L = chol(H) - LeverageJLOutput diagPJL_exact; // cache for L = chol(H) - SparseMatrix Le[k]; // store output of L_exact - - PackedChol(const SparseMatrix &A_) { - A = std::move(A_.clone()); - At = transpose(A); - w.reset(pcs_aligned_new(A.n)); - numExact.resize(k + 1); - } - - void setSeed(unsigned long long seed) { - diagPJL.gen.seed(seed); - diagPJL_exact.gen.seed(seed); - } - - bool allExact() { return exactIdx.size() == k; } - - bool hasExact() { return exactIdx.size() > 0; } - - template Tx2 decompose(const Tv2_ *w_in) { - - Tx2 acc = Tx2(0.0); - - // record w - Ti n = A.n; - - for (Ti j = 0; j < n; j++) { - w[j] = w_in[j]; - } - // compute chol - ++numExact[k]; - if (accuracyThreshold > 0.0 || - !decomposed) // the first time we call, always run the double chol. - { - multiply(H, A, w.get(), At); - chol(L, H); - decomposed = true; - - exactIdx.clear(); - acc = estimateAccuracy(); - for (size_t i = 0; i < k; i++) { - if (get(acc, i) >= - accuracyThreshold) // >= is important for the case accuracyThreshold - // = 0.0, we need to compute everything exactly - exactIdx.push_back(i); - } - } else if (!allExact()) { - exactIdx.clear(); - for (size_t i = 0; i < k; i++) - exactIdx.push_back(i); - } - - if (hasExact()) { - Te *w_exact = new Te[n]; - - for (size_t i : exactIdx) { - ++numExact[i]; - get_slice(w_exact, w.get(), n, i); - multiply(H_exact, A, w_exact, At); - chol(L_exact, H_exact); - - // copy result to Le[i] - if (!Le[i].initialized()) - Le[i] = std::move(L_exact.template clone()); - else { - Ti nz = L_exact.nnz(); - for (Ti s = 0; s < nz; ++s) - Le[i].x[s] = (L_exact.x[s]); - } - } - - delete[] w_exact; - } - return acc; - } - - Tx2 logdet() { - pcs_assert(decomposed, "logdet: Need to call decompose first."); - - Ti m = A.m; - Tx2 ret = Tx2(0); - - if (!allExact()) { - Ti *Lp = L.p.get(); - Tx2 *Lx = L.x.get(); - for (Ti j = 0; j < m; j++) - ret += log(Lx[Lp[j]]); - } - - if (hasExact()) { - for (size_t i : exactIdx) { - Te ret_e = 0.0; - Ti *Lp = Le[i].p.get(); - Te *Lx = Le[i].x.get(); - - for (Ti j = 0; j < m; j++) - ret_e += log(Lx[Lp[j]]); - - set(ret, i, to_double(ret_e)); - } - } - - return ret * Tx2(2.0); - } - - void diagL(Tx2 *out) { - pcs_assert(decomposed, "diagL: Need to call decompose first."); - - Ti m = A.m; - - if (!allExact()) { - Ti *Li = L.i.get(), *Lp = L.p.get(); - Tx2 *Lx = L.x.get(); - for (Ti j = 0; j < m; j++) - out[j] = Lx[Lp[j]]; - } - - if (hasExact()) { - for (size_t i : exactIdx) { - Ti *Lp = Le[i].p.get(); - Te *Lx = Le[i].x.get(); - - for (Ti j = 0; j < m; j++) - set(out[j], i, to_double(Lx[Lp[j]])); - } - } - } - - SparseMatrix getL(Ti i) { - pcs_assert(decomposed, "getL: Need to call decompose first."); - - Ti m = L.m, n = L.n, nz = L.nnz(); - SparseMatrix out(m, n, nz); - - Ti *outp = out.p.get(), *Lp = L.p.get(); - Ti *outi = out.i.get(), *Li = L.i.get(); - - for (Ti s = 0; s <= n; s++) - outp[s] = Lp[s]; - - for (Ti s = 0; s < nz; s++) - outi[s] = Li[s]; - - bool isExact = false; - for (size_t i_ : exactIdx) { - if (i_ == i) - isExact = true; - } - - double *outx = out.x.get(); - if (isExact) { - Te *Lx = Le[i].x.get(); - for (Ti s = 0; s < nz; s++) - outx[s] = to_double(Lx[s]); - } else { - Tx2 *Lx = L.x.get(); - for (Ti s = 0; s < nz; s++) - outx[s] = get(Lx[s], i); - } - - return std::move(out); - } - - void solve(Tx2 *b, Tx2 *out) { - pcs_assert(decomposed, "solve: Need to call decompose first."); - - if (!allExact()) { - lsolve(L, b, out); - ltsolve(L, out, out); - } - - if (hasExact()) { - Ti m = A.m; - Te *b_exact = new Te[m]; - Te *out_exact = new Te[m]; - - for (size_t i : exactIdx) { - get_slice(b_exact, b, m, i); - lsolve(Le[i], b_exact, out_exact); - ltsolve(Le[i], out_exact, out_exact); - set_slice(out, out_exact, m, i); - } - - delete[] b_exact; - delete[] out_exact; - } - }; - - void leverageScoreComplement(Tx2 *out) { - pcs_assert(decomposed, - "leverageScoreComplement: Need to call decompose first."); - - Ti n = A.n, m = A.m; - - if (!allExact()) { - Tx2 T1 = Tx2(1.0), T2 = Tx2(2.0); - leverage(diagP, L, A, At); - - Tx2 *tau = diagP.x.get(); - for (Ti j = 0; j < n; j++) - out[j] = T1 - tau[j] * w[j]; - } - - if (hasExact()) { - Te T1 = Te(1.0), T2 = Te(2.0); - for (size_t i : exactIdx) { - leverage(diagP_exact, Le[i], A, At); - - Te *tau = diagP_exact.x.get(); - for (Ti j = 0; j < n; j++) - set(out[j], i, to_double(T1 - tau[j] * get(w[j], i))); - } - } - } - - void leverageScoreComplementJL(Tx2 *out, size_t JL_k) { - pcs_assert(decomposed, - "leverageScoreComplementJL: Need to call decompose first."); - - Ti m = A.m, n = A.n; - - if (!allExact()) { - Tx2 T1 = Tx2(1.0), T2 = Tx2(2.0); - leverageJL(diagPJL, L, A, At, JL_k); - - Tx2 *tau = diagPJL.x.get(); - for (Ti j = 0; j < n; j++) - out[j] = T1 - tau[j] * w[j]; - } - - if (hasExact()) { - Te T1 = Te(1.0), T2 = Te(2.0); - for (size_t i : exactIdx) { - leverageJL(diagPJL_exact, Le[i], A, At, JL_k); - - Te *tau = diagPJL_exact.x.get(); - for (Ti j = 0; j < n; j++) - set(out[j], i, to_double(T1 - tau[j] * get(w[j], i))); - } - } - } - - Tx2 estimateAccuracy() { - pcs_assert(decomposed, "estimateAccuracy: Need to call decompose first."); - - return cholAccuracy(diagPJL, L, A, At, w.get()); - } -}; diff --git a/src/external/PackedCSparse/SparseMatrix.h b/src/external/PackedCSparse/SparseMatrix.h deleted file mode 100644 index 5dca4286..00000000 --- a/src/external/PackedCSparse/SparseMatrix.h +++ /dev/null @@ -1,230 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from PolytopeSamplerMatlab -//(https://github.com/ConstrainedSampler/PolytopeSamplerMatlab/blob/master/code/solver/PackedCSparse/PackedChol.h) by Ioannis Iakovidis -#pragma once -#include -#include -#include "FloatArray.h" - -namespace PackedCSparse { - static void pcs_assert(bool value, const char* message) - { - if (value == false) - throw std::logic_error(message); - } - - template - T* pcs_aligned_new(size_t size) - { - int alignment = 64; // size of memory cache line - int offset = alignment - 1 + sizeof(void*); - void* p1 = (void*)new char[size * sizeof(T) + offset]; - void** p2 = (void**)(((size_t)(p1)+offset) & ~(alignment - 1)); - p2[-1] = p1; - return (T*)p2; - } - - template - struct AlignedDeleter - { - void operator()(T* p) const - { - delete[](char*)(((void**)p)[-1]); - } - }; - - template - using UniqueAlignedPtr = std::unique_ptr>; - - template - using UniquePtr = std::unique_ptr; - - // Tx = Type for entries, Ti = Type for indices. - // if Tx == bool, the matrix stores only sparsity information - template - struct SparseMatrix - { - Ti m = 0; /* number of rows */ - Ti n = 0; /* number of columns */ - UniquePtr p; /* column pointers (size n+1) */ - UniquePtr i; /* row indices, size nnz */ - UniqueAlignedPtr x; /* numerical values, size nnz */ - - SparseMatrix() = default; - - SparseMatrix(Ti m_, Ti n_, Ti nzmax_) - { - initialize(m_, n_, nzmax_); - } - - bool initialized() const - { - return p && i; - } - - void initialize(Ti m_, Ti n_, Ti nzmax) - { - if (nzmax < 1) nzmax = 1; - m = m_; n = n_; - p.reset(new Ti[n + 1]); - i.reset(new Ti[nzmax]); - if (!std::is_same::value) - x.reset(pcs_aligned_new(nzmax)); - } - - Ti nnz() const - { - return p[n]; - } - - template - SparseMatrix clone() const - { - SparseMatrix C(m, n, nnz()); - Ti* Ap = p.get(), * Ai = i.get(); Tx* Ax = x.get(); - Ti2* Cp = C.p.get(), * Ci = C.i.get(); Tx2* Cx = C.x.get(); - - for (Ti s = 0; s <= n; s++) - Cp[s] = Ti2(Ap[s]); - - Ti nz = nnz(); - for (Ti s = 0; s < nz; s++) - Ci[s] = Ti2(Ai[s]); - - if (Cx) - { - for (Ti s = 0; s < nz; s++) - Cx[s] = Ax? Tx2(Ax[s]): Tx2(1.0); - } - - return C; - } - }; - - template - struct DenseVector - { - Ti n = 0; /* number of columns */ - UniqueAlignedPtr x; /* numerical values, size nnz */ - - DenseVector() = default; - - DenseVector(Ti n_) - { - initialize(n_); - } - - bool initialized() const - { - return bool(x); - } - - void initialize(Ti n_) - { - n = n_; - x.reset(pcs_aligned_new(n_)); - } - }; - - - // basic functions - template - SparseMatrix speye(Ti n, Tx* d = nullptr) - { - SparseMatrix D(n, n, n); - - for (Ti k = 0; k < n; k++) - { - D.i[k] = k; - D.p[k] = k; - } - D.p[n] = n; - - Tx Tx1 = Tx(1.0); - for (Ti k = 0; k < n; k++) - D.x[k] = (d ? d[k] : Tx1); - return D; - } - - // Solve L out = x - // Input: L in Tx^{n by n}, x in Tx2^{n} - // Output: out in Tx2^{n}. - // If out is provided, we will output to out. Else, output to x. - template - void lsolve(const SparseMatrix& L, Tx2* x, Tx2* out = nullptr) - { - pcs_assert(L.initialized(), "lsolve: bad inputs."); - pcs_assert(L.n == L.m, "lsolve: dimensions mismatch."); - - Ti n = L.n, * Lp = L.p.get(), * Li = L.i.get(); Tx* Lx = L.x.get(); - - if (!out) out = x; - if (x != out) std::copy(x, x + n, out); - - for (Ti j = 0; j < n; j++) - { - Tx2 out_j = out[j] / Lx[Lp[j]]; - out[j] = out_j; - - Ti p_start = Lp[j] + 1, p_end = Lp[j + 1]; - for (Ti p = p_start; p < p_end; p++) - { //out[Li[p]] -= Lx[p] * out[j]; - fnmadd(out[Li[p]], out_j, Lx[p]); - } - } - } - - // Solve L' out = x - // Input: L in Tx^{n by n}, x in Tx2^{n} - // Output: out in Tx2^{n}. - // If out is provided, we will output to out. Else, output to x. - template - void ltsolve(const SparseMatrix& L, Tx2* x, Tx2* out = nullptr) - { - pcs_assert(L.initialized(), "ltsolve: bad inputs."); - pcs_assert(L.n == L.m, "ltsolve: dimensions mismatch."); - - Ti n = L.n, * Lp = L.p.get(), * Li = L.i.get(); Tx* Lx = L.x.get(); - - if (!out) out = x; - if (x != out) std::copy(x, x + n, out); - - for (Ti j = n - 1; j != -1; j--) - { - Tx2 out_j = out[j]; - - Ti p_start = Lp[j] + 1, p_end = Lp[j + 1]; - for (Ti p = p_start; p < p_end; p++) - { //out[j] -= Lx[p] * out[Li[p]]; - fnmadd(out_j, out[Li[p]], Lx[p]); - } - - out[j] = out_j / Tx2(Lx[Lp[j]]); - } - } - - // Update y <-- y + A x - // Input: A in Tx^{n by n}, x, y in Tx2^{n} - template - void gaxpy(const SparseMatrix& A, const Tx2* x, Tx2* y) - { - pcs_assert(A.initialized(), "gaxpy: bad inputs."); - Ti m = A.m, n = A.n, * Ap = A.p.get(), * Ai = A.i.get(); Tx* Ax = A.x.get(); - - for (Ti j = 0; j < n; j++) - { - Tx2 x_j = x[j]; - - Ti p_start = Ap[j], p_end = Ap[j + 1]; - for (Ti p = p_start; p < p_end; p++) - { //y[Ai[p]] += Ax[p] * x[j]; - fmadd(y[Ai[p]], x_j, Ax[p]); - } - } - } -}; diff --git a/src/external/PackedCSparse/add.h b/src/external/PackedCSparse/add.h deleted file mode 100644 index 16195722..00000000 --- a/src/external/PackedCSparse/add.h +++ /dev/null @@ -1,102 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from PolytopeSamplerMatlab -//(https://github.com/ConstrainedSampler/PolytopeSamplerMatlab/blob/master/code/solver/PackedCSparse/PackedChol.h) by Ioannis Iakovidis - -#pragma once -#include -#include "SparseMatrix.h" - -// Problem: -// Compute M = A + B - -// Algorithm: -// M = 0 -// M(A != 0) += A(A != 0) -// M(B != 0) += B(A != 0) - -namespace PackedCSparse { - template - struct AddOutput : SparseMatrix - { - UniquePtr forwardA; - UniquePtr forwardB; - - template - void initialize(const SparseMatrix& A, const SparseMatrix& B) - { - pcs_assert(A.initialized() && B.initialized(), "add: bad inputs."); - pcs_assert(A.n == B.n && A.m == B.m, "add: dimensions mismatch."); - - Ti m = A.m, n = A.n; - Ti Anz = A.nnz(); Ti* Ap = A.p.get(), * Ai = A.i.get(); - Ti Bnz = B.nnz(); Ti* Bp = B.p.get(), * Bi = B.i.get(); - this->m = A.m; this->n = A.n; - - std::vector Ci; - Ti* Cp = new Ti[n + 1]; - forwardA.reset(new Ti[Anz]); - forwardB.reset(new Ti[Bnz]); - - Cp[0] = 0; - for (Ti i = 0; i < n; i++) - { - Ti s1 = Ap[i], s2 = Bp[i], end1 = Ap[i + 1], end2 = Bp[i + 1]; - while ((s1 < end1) || (s2 < end2)) - { - Ti q = Ti(Ci.size()); - Ti i1 = (s1 < end1) ? Ai[s1] : m; - Ti i2 = (s2 < end2) ? Bi[s2] : m; - Ti min_i = std::min(i1, i2); - Ci.push_back(min_i); - - if (i1 == min_i) - forwardA[s1++] = q; - - if (i2 == min_i) - forwardB[s2++] = q; - } - Cp[i + 1] = Ti(Ci.size()); - } - - this->p.reset(Cp); - this->i.reset(new Ti[Ci.size()]); - this->x.reset(pcs_aligned_new(Ci.size())); - std::copy(Ci.begin(), Ci.end(), this->i.get()); - } - }; - - template - void add(AddOutput& o, const SparseMatrix& A, const SparseMatrix& B) - { - if (!o.initialized()) - o.initialize(A, B); - - Ti m = o.m, n = o.n; - Ti Anz = A.nnz(); Ti* Ap = A.p.get(), * Ai = A.i.get(); Tx* Ax = A.x.get(); - Ti Bnz = B.nnz(); Ti* Bp = B.p.get(), * Bi = B.i.get(); Tx* Bx = B.x.get(); - Ti Cnz = o.nnz(); Ti* Cp = o.p.get(), * Ci = o.i.get(); Tx2* Cx = o.x.get(); - Ti* forwardA = o.forwardA.get(), *forwardB = o.forwardB.get(); - - for (Ti s = 0; s < Cnz; s++) - Cx[s] = 0; - - for (Ti s = 0; s < Anz; s++) - Cx[forwardA[s]] = Ax[s]; - - for (Ti s = 0; s < Bnz; s++) - Cx[forwardB[s]] += Bx[s]; - } - - template - AddOutput add(const SparseMatrix& A, const SparseMatrix& B) - { - AddOutput o; - add(o, A, B); - return o; - } -} diff --git a/src/external/PackedCSparse/chol.h b/src/external/PackedCSparse/chol.h deleted file mode 100644 index d6001ae2..00000000 --- a/src/external/PackedCSparse/chol.h +++ /dev/null @@ -1,247 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from PolytopeSamplerMatlab -//(https://github.com/ConstrainedSampler/PolytopeSamplerMatlab/blob/master/code/solver/PackedCSparse/PackedChol.h) by Ioannis Iakovidis - -#pragma once -#include -#include -#include "SparseMatrix.h" -#include "transpose.h" - -// Problem: -// Compute chol(A) - -// Algorithm: -// We need to study this later as this is the bottleneck. -// Document it as a lyx. -// chol_up_looking: -// Compute L row by row -// This is faster when it is compute bound. -// -// chol_left_looking: -// Compute L col by col -// This is faster when it is memory bound. - - -namespace PackedCSparse { - template - struct CholOutput : SparseMatrix - { - TransposeOutput Lt; // sparsity pattern of the Lt - UniquePtr diag; // the index for diagonal element. Ax[diag[k]] is A_kk - UniquePtr c; // c[i] = index the last nonzero on column i in the current L - UniqueAlignedPtr w; // the row of L we are computing - - // The cost of this is roughly 3 times larger than chol - // One can optimize it by using other data structure - void initialize(const SparseMatrix& A) - { - pcs_assert(A.initialized(), "chol: bad inputs."); - pcs_assert(A.n == A.m, "chol: dimensions mismatch."); - - Ti n = A.n, * Ap = A.p.get(), * Ai = A.i.get(); - - // initialize - this->diag.reset(new Ti[n]); - this->c.reset(new Ti[n]); - this->w.reset(pcs_aligned_new(n)); - - // compute the sparsity pattern of L and diag - using queue = std::priority_queue, std::greater>; - queue q; // sol'n of the current row of L - Ti* mark = new Ti[n]; // used to prevent same indices push to q twice - std::vector* cols = new std::vector[n]; // stores the non-zeros of each col of L - Ti nz = 0, Anz = Ap[n]; - - for (Ti i = 0; i < n; i++) - mark[i] = -1; - - // for each row of A - for (Ti i = 0; i < n; i++) - { // push i-th row of A, called a_12, into mark - Ti s; - for (s = Ap[i]; s < Ap[i + 1]; s++) - { - Ti j = Ai[s]; - if (j >= i) break; - - q.push(j); - mark[j] = i; - } - if (s >= Anz) // this case happens only if the diagonal is 0. No cholesky in this case. - this->diag[i] = 0; - else - this->diag[i] = s; - - // Solve L_11 l_12 = a_12 - while (!q.empty()) - { - Ti j = q.top(); - - for (Ti k : cols[j]) - { - if (mark[k] != i) - { - q.push(k); - mark[k] = i; - } - } - q.pop(); - - // update j col - cols[j].push_back(i); - ++nz; - } - - // diag - cols[i].push_back(i); - ++nz; - } - delete[] mark; - - // write it as the compress form - SparseMatrix::initialize(n, n, nz); - - Ti s_start = 0; Ti s = 0; - for (Ti i = 0; i < n; i++) - { - this->p[i] = s_start; - for (Ti k : cols[i]) - this->i[s++] = k; - s_start += Ti(cols[i].size()); - } - this->p[n] = s_start; - delete[] cols; - - this->Lt = transpose(*this); - - // initialize w to 0 - Tx Tv0 = Tx(0); - for (Ti k = 0; k < n; k++) - w[k] = Tv0; - } - }; - - template - void chol(CholOutput& o, const SparseMatrix& A) - { - if (!o.initialized()) - o.initialize(A); - - //chol_up_looking(o, A); - chol_left_looking(o, A); - } - - template - void chol_up_looking(CholOutput& o, const SparseMatrix& A) - { - Ti *Ap = A.p.get(), * Ai = A.i.get(); Tx* Ax = A.x.get(); - Ti nzmax = o.nzmax; Ti n = A.n; - Ti *Lp = o.p.get(); Ti* Li = o.i.get(); - Ti *Ltp = o.Lt.p.get(); Ti* Lti = o.Lt.i.get(); - - Tx T0 = Tx(0); - Tx* Lx = o.x.get(); Tx* w = o.w.get(); Ti* c = o.c.get(); - Ti* diag = o.diag.get(); - - Ti* Lti_ptr = Lti; - for (Ti k = 0; k < n; ++k) - { - c[k] = Lp[k]; - - Ti s_end = diag[k]; - for (Ti s = Ap[k]; s < s_end; ++s) - w[Ai[s]] = Ax[s]; - - // Solve L_11 l_12 = a_12 - Tx d = Ax[s_end]; Ti i; - for (; (i = *(Lti_ptr++)) < k;) - { - Ti dLi = Lp[i], ci = c[i]++; - Tx Lki = w[i] / Lx[dLi]; - w[i] = T0; // maintain x = 0 for the (k+1) iteration - - for (Ti q = dLi + 1; q < ci; ++q) - fnmadd(w[Li[q]], Lx[q], Lki); - - d -= Lki * Lki; - Lx[ci] = Lki; - } - - // l_22 = sqrt(a22 - ) - Lx[c[k]++] = clipped_sqrt(d); - } - } - - template - void chol_left_looking(CholOutput& o, const SparseMatrix& A) - { - Ti* Ap = A.p.get(), * Ai = A.i.get(); Tx* Ax = A.x.get(); - Ti nzmax = o.nnz(); Ti n = A.n; - Ti* Lp = o.p.get(); Ti* Li = o.i.get(); - Ti* Ltp = o.Lt.p.get(); Ti* Lti = o.Lt.i.get(); - - Tx T0 = Tx(0), T1 = Tx(1); - Tx* Lx = o.x.get(); - Tx* w = o.w.get(); Ti* c = o.c.get(); - Ti* diag = o.diag.get(); - - for (Ti j = 0; j < n; ++j) - { - c[j] = Lp[j]; - - // x = A_{j:n, j} - { - Ti is_start = diag[j], is_end = Ap[j + 1]; - for (Ti is = is_start; is < is_end; ++is) - w[Ai[is]] = Ax[is]; - } - - // for each p in L_{j, 1:j-1} - Ti ps_start = Ltp[j], ps_end = Ltp[j + 1] - 1; - for (Ti ps = ps_start; ps < ps_end; ++ps) - { - Ti p = Lti[ps]; - Ti cp = c[p]++; - Tx Ljp = Lx[cp]; - - // for each i in L_{j:n,p} - Ti is_start = cp, is_end = Lp[p + 1]; - for (Ti is = is_start; is < is_end; ++is) - { - Ti i = Li[is]; - fnmadd(w[i], Lx[is], Ljp); - } - } - - Tx Ljj = clipped_sqrt(w[j], 1e128); - Lx[c[j]++] = Ljj; - Tx inv_Ljj = T1 / Ljj; - w[j] = T0; - - // for each i in L_{:,j} - { - Ti is_start = Lp[j] + 1, is_end = Lp[j + 1]; - for (Ti is = is_start; is < is_end; ++is) - { - Ti i = Li[is]; - Lx[is] = w[i] * inv_Ljj; - w[i] = T0; - } - } - } - } - - template - CholOutput chol(const SparseMatrix& A) - { - CholOutput o; - chol(o, A); - return o; - } -} diff --git a/src/external/PackedCSparse/leverage.h b/src/external/PackedCSparse/leverage.h deleted file mode 100644 index 69549308..00000000 --- a/src/external/PackedCSparse/leverage.h +++ /dev/null @@ -1,65 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from PolytopeSamplerMatlab -//(https://github.com/ConstrainedSampler/PolytopeSamplerMatlab/blob/master/code/solver/PackedCSparse/PackedChol.h) by Ioannis Iakovidis - -#pragma once -#include "SparseMatrix.h" -#include "projinv.h" -#include "outerprod.h" - -// Problem: -// Compute M = diag(A' inv(LL') A) - -namespace PackedCSparse { - template - struct LeverageOutput : DenseVector - { - ProjinvOutput Hinv; // Hinv = inv(H)|_L - OuterprodOutput tau; // tau = diag(A' Hinv A) - - template - void initialize(const SparseMatrix& L, const SparseMatrix& A, const SparseMatrix& At) - { - pcs_assert(L.initialized() && A.initialized() && At.initialized(), "leverage: bad inputs."); - pcs_assert(L.m == L.n && L.n == A.m && L.n == At.n && A.n == At.m, "leverage: dimensions mismatch."); - DenseVector::initialize(A.n); - Hinv.initialize(L); - tau.initialize(A, Hinv, At); - } - }; - - template - void leverage(LeverageOutput& o, const SparseMatrix& L, const SparseMatrix& A, const SparseMatrix& At) - { - if (!o.initialized()) - o.initialize(L, A, At); - - Tx T1 = Tx(1.0), T2 = Tx(2.0); - projinv(o.Hinv, L); - - Ti m = A.m, n = A.n; - Ti* Sp = o.Hinv.p.get(); Tx* Sv = o.Hinv.x.get(); - for (Ti k = 0; k < m; ++k) - Sv[Sp[k]] /= T2; - - outerprod(o.tau, A, o.Hinv, At); - - Tx* x = o.x.get(), * tau = o.tau.x.get(); - for (Ti j = 0; j < n; j++) - x[j] = T2 * tau[j]; - } - - - template - LeverageOutput leverage(const SparseMatrix& L, const SparseMatrix& A, const SparseMatrix& At) - { - LeverageOutput o; - leverage(o, L, A, At); - return o; - } -} diff --git a/src/external/PackedCSparse/leverageJL.h b/src/external/PackedCSparse/leverageJL.h deleted file mode 100644 index a5001bcd..00000000 --- a/src/external/PackedCSparse/leverageJL.h +++ /dev/null @@ -1,148 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from PolytopeSamplerMatlab -//(https://github.com/ConstrainedSampler/PolytopeSamplerMatlab/blob/master/code/solver/PackedCSparse/PackedChol.h) by Ioannis Iakovidis - -#pragma once -#include -#include "SparseMatrix.h" - -// Problem: -// Approximate M = diag(A' inv(LL') A) -namespace PackedCSparse { - const size_t JLPackedSize = 4; - - template - struct LeverageJLOutput : DenseVector - { - UniqueAlignedPtr d; // random direction d - UniqueAlignedPtr L_d; // random direction d - UniqueAlignedPtr AtL_d; // A' L^{-1} d - Ti m = 0; - std::mt19937_64 gen; - - template - void initialize(const SparseMatrix& L, const SparseMatrix& A, const SparseMatrix& At) - { - pcs_assert(L.initialized() && A.initialized() && At.initialized(), "leverageJL: bad inputs."); - pcs_assert(L.m == L.n && L.n == A.m && L.n == At.n && A.n == At.m, "leverageJL: dimensions mismatch."); - this->n = A.n; this->m = A.m; - this->x.reset(pcs_aligned_new(this->n)); - this->d.reset(pcs_aligned_new(this->m * 2 * JLPackedSize)); - this->L_d.reset(pcs_aligned_new(this->m * 2 * JLPackedSize)); - this->AtL_d.reset(pcs_aligned_new(this->n * 2 * JLPackedSize)); - } - }; - - // compute sum_{j=1}^{k} (A' L^{-T} u_j) .* (A' L^{-T} u_j) - template - void projectionJL(LeverageJLOutput& o, const SparseMatrix& L, const SparseMatrix& A, const SparseMatrix& At) - { - Ti m = A.m, n = A.n; - Tx T0 = Tx(0.0), T1 = Tx(1.0); - Tx* d = o.d.get(), * L_d = o.L_d.get(), * AtL_d = o.AtL_d.get(), * x = o.x.get(); - - for (Ti i = 0; i < m * k; i++) - d[i] = sign(o.gen); - - for (Ti i = 0; i < n * k; i++) - AtL_d[i] = T0; - - ltsolve(L, (BaseImpl*)d, (BaseImpl*)L_d); - gaxpy(At, (BaseImpl*)L_d, (BaseImpl*)AtL_d); - - for (Ti i = 0; i < n; i++) - { - Tx ret_i = T0; - for (Ti j = 0; j < k; j++) - ret_i += AtL_d[i * k + j] * AtL_d[i * k + j]; - - x[i] += ret_i; - } - } - - template - void leverageJL(LeverageJLOutput& o, const SparseMatrix& L, const SparseMatrix& A, const SparseMatrix& At, size_t k) - { - if (!o.initialized()) - o.initialize(L, A, At); - - Ti n = A.n; Tx* x = o.x.get(); - for (Ti i = 0; i < n; i++) - x[i] = Tx(0.0); - - constexpr size_t k_step = JLPackedSize; - for(size_t i = 1; i <= k / k_step; i++) - projectionJL(o, L, A, At); - - for (size_t i = 1; i <= k % k_step; i++) - projectionJL<1>(o, L, A, At); - - Tx ratio = Tx(1 / double(k)); - for (Ti i = 0; i < n; i++) - x[i] *= ratio; - } - - template - LeverageJLOutput leverageJL(const SparseMatrix& L, const SparseMatrix& A, const SparseMatrix& At, size_t k) - { - LeverageJLOutput o; - leverageJL(o, L, A, At, k); - return o; - } - - - // compute (A' L^{-T} u_j) .* (A' L^{-T} v_j) for j = 1, 2, ... k - template - Tx cholAccuracy(LeverageJLOutput& o, const SparseMatrix& L, const SparseMatrix& A, const SparseMatrix& At, const Tx* w) - { - if (!o.initialized()) - o.initialize(L, A, At); - - constexpr Ti k = JLPackedSize; - constexpr Ti k_ = 2 * k; - - - Ti m = A.m, n = A.n; - Tx T0 = Tx(0.0), T1 = Tx(1.0); - Tx* d = o.d.get(), * L_d = o.L_d.get(), * AtL_d = o.AtL_d.get(), * x = o.x.get(); - - std::uniform_real_distribution distribution(-sqrt(3.0),sqrt(3.0)); - for (Ti i = 0; i < m * k_; i++) - d[i] = Tx(distribution(o.gen)); // roughly uniform distribution with variance 1 - - for (Ti i = 0; i < n * k_; i++) - AtL_d[i] = T0; - - ltsolve(L, (BaseImpl*)d, (BaseImpl*)L_d); - gaxpy(At, (BaseImpl*)L_d, (BaseImpl*)AtL_d); - - Tx result[k]; - for (Ti j = 0; j < k; j++) - result[j] = Tx(0.0); - - for (Ti i = 0; i < m; i++) - { - Tx* d = o.d.get() + i * (2 * k); - for (Ti j = 0; j < k; j++) - result[j] -= d[j] * d[j + k]; - } - - for (Ti i = 0; i < n; i++) - { - Tx w_i = w[i]; - for (Ti j = 0; j < k; j++) - result[j] += AtL_d[i * k_ + j] * AtL_d[i * k_ + j + k] * w_i; - } - - Tx est = Tx(0.0); - for (Ti j = 0; j < k; j++) - est += result[j] * result[j]; - - return clipped_sqrt(est/Tx(double(k)), 0.0); - } -} diff --git a/src/external/PackedCSparse/multiply.h b/src/external/PackedCSparse/multiply.h deleted file mode 100644 index cfd53375..00000000 --- a/src/external/PackedCSparse/multiply.h +++ /dev/null @@ -1,142 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from PolytopeSamplerMatlab -//(https://github.com/ConstrainedSampler/PolytopeSamplerMatlab/blob/master/code/solver/PackedCSparse/PackedChol.h) by Ioannis Iakovidis - -#pragma once -#include -#include -#include "SparseMatrix.h" - -// Problem: -// Compute M = A diag(w) B - -// Algorithm: -// Compute M col by col - -namespace PackedCSparse { - template - struct MultiplyOutput : SparseMatrix - { - UniqueAlignedPtr c; - - template - void initialize(const SparseMatrix& A, const SparseMatrix& B) - { - pcs_assert(A.initialized() && B.initialized(), "multiply: bad inputs."); - pcs_assert(A.n == B.m, "multiply: dimensions mismatch."); - - Ti m = A.m, n = B.n; - Ti* Ap = A.p.get(), * Ai = A.i.get(); - Ti* Bp = B.p.get(), * Bi = B.i.get(); - - this->c.reset(pcs_aligned_new(m)); - - Ti* last_j = new Ti[m]; - for (Ti i = 0; i < m; i++) - { - last_j[i] = -1; - this->c[i] = Tx(0.0); - } - - Ti* Cp = new Ti[size_t(n)+1]; - std::vector Ci; - - Cp[0] = 0; - for (Ti j1 = 0; j1 < n; j1++) - { - for (Ti p1 = Bp[j1]; p1 < Bp[j1 + 1]; p1++) - { - Ti j2 = Bi[p1]; - for (Ti p2 = Ap[j2]; p2 < Ap[j2 + 1]; p2++) - { - Ti i = Ai[p2]; - if (last_j[i] != j1) - { - last_j[i] = j1; - Ci.push_back(i); - } - } - } - Cp[j1 + 1] = Ti(Ci.size()); - } - delete[] last_j; - - for (Ti j = 0; j < n; j++) - std::sort(Ci.begin() + Cp[j], Ci.begin() + Cp[j + 1]); - - this->m = m; this->n = n; - this->x.reset(pcs_aligned_new(Ci.size())); - this->p.reset(Cp); - this->i.reset(new Ti[Ci.size()]); - std::copy(Ci.begin(), Ci.end(), this->i.get()); - } - }; - - template - void multiply_general(MultiplyOutput& o, const SparseMatrix& A, const Tx2* w, const SparseMatrix& B) - { - if (!o.initialized()) - o.initialize(A, B); - - Ti m = o.m, n = o.n; - Ti* Ap = A.p.get(), * Ai = A.i.get(); Tx* Ax = A.x.get(); - Ti* Bp = B.p.get(), * Bi = B.i.get(); Tx* Bx = B.x.get(); - Ti* Cp = o.p.get(), * Ci = o.i.get(); Tx2* Cx = o.x.get(); - Tx2* c = o.c.get(); // initialized to 0 - - const Tx2 T0 = Tx2(0); - for (Ti j1 = 0; j1 < n; j1++) - { - for (Ti p1 = Bp[j1]; p1 < Bp[j1 + 1]; p1++) - { - Ti j2 = Bi[p1]; - Tx2 beta = has_weight? (Tx2(Bx[p1]) * w[j2]) : Tx2(Bx[p1]); - - for (Ti p2 = Ap[j2]; p2 < Ap[j2 + 1]; p2++) - { - //x[Ai[p2]] += beta * Ax[p2]; - fmadd(c[Ai[p2]], beta, Ax[p2]); - } - } - - for (Ti p1 = Cp[j1]; p1 < Cp[j1 + 1]; p1++) - { - Cx[p1] = c[Ci[p1]]; - c[Ci[p1]] = T0; // ensure c is 0 after the call - } - } - } - - template - void multiply(MultiplyOutput& o, const SparseMatrix& A, const SparseMatrix& B) - { - multiply_general(o, A, nullptr, B); - } - - template - void multiply(MultiplyOutput& o, const SparseMatrix& A, const Tx2* w, const SparseMatrix& B) - { - multiply_general(o, A, w, B); - } - - template - MultiplyOutput multiply(const SparseMatrix& A, const Tx2* w, const SparseMatrix& B) - { - MultiplyOutput o; - multiply(o, A, w, B); - return o; - } - - template - MultiplyOutput multiply(const SparseMatrix& A, const SparseMatrix& B) - { - MultiplyOutput o; - multiply(o, A, B); - return o; - } -} diff --git a/src/external/PackedCSparse/outerprod.h b/src/external/PackedCSparse/outerprod.h deleted file mode 100644 index 6f0e98e3..00000000 --- a/src/external/PackedCSparse/outerprod.h +++ /dev/null @@ -1,86 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from PolytopeSamplerMatlab -//(https://github.com/ConstrainedSampler/PolytopeSamplerMatlab/blob/master/code/solver/PackedCSparse/PackedChol.h) by Ioannis Iakovidis -#pragma once -#include "SparseMatrix.h" - -// Problem: -// Compute x = diag(At S Bt) - -// Algorithm: -// Note that x = diag(B St A) = grad_H Tr(St A H B) -// We run autodiff on the function Tr(St A H B). -// Hence, the algorithm is essentially same as multiply(A, B) with the same runtime. - -namespace PackedCSparse { - template - struct OuterprodOutput : DenseVector - { - UniqueAlignedPtr s_col; - UniquePtr s_mark; - - template - void initialize(const SparseMatrix& A, const SparseMatrix& S, const SparseMatrix& B) - { - pcs_assert(A.initialized() && B.initialized() && S.initialized(), "outerprod: bad inputs."); - pcs_assert(A.m == S.m && S.n == B.n, "outerprod: dimensions mismatch."); - - DenseVector::initialize(A.n); - s_col.reset(pcs_aligned_new(S.m)); - s_mark.reset(new Ti[S.m]); - } - }; - - template - void outerprod(OuterprodOutput& o, const SparseMatrix& A, const SparseMatrix& S, const SparseMatrix& B) - { - if (!o.initialized()) - o.initialize(A, S, B); - - Ti Sn = S.n, Sm = S.m, An = A.n; - Ti* Ap = A.p.get(), * Ai = A.i.get(); Tx2* Ax = A.x.get(); - Ti* Bp = B.p.get(), * Bi = B.i.get(); Tx2* Bx = B.x.get(); - Ti* Sp = S.p.get(), * Si = S.i.get(); Tx* Sx = S.x.get(); - Tx* s_col = o.s_col.get(); - Ti* s_mark = o.s_mark.get(); - Tx* x = o.x.get(); - - std::fill(s_mark, s_mark + Sm, Ti(-1)); - std::fill(x, x + An, Tx(0.0)); - - for (Ti j = 0; j < Sn; j++) - { - for (Ti p = Sp[j]; p < Sp[j + 1]; p++) - { - s_col[Si[p]] = Sx[p]; - s_mark[Si[p]] = j; - } - - for (Ti p = Bp[j]; p < Bp[j + 1]; p++) - { - Ti i = Bi[p]; Tx b = Bx[p]; - for (Ti q = Ap[i]; q < Ap[i + 1]; q++) - { - Tx a = Ax[q]; Ti a_i = Ai[q]; - if (s_mark[a_i] == j) - { //x[i] += s_col[a_i] * a * b; - fmadd(x[i], s_col[a_i], a * b); - } - } - } - } - } - - template - OuterprodOutput outerprod(const SparseMatrix& A, const SparseMatrix& S, const SparseMatrix& B) - { - OuterprodOutput o; - outerprod(o, A, S, B); - return o; - } -} diff --git a/src/external/PackedCSparse/projinv.h b/src/external/PackedCSparse/projinv.h deleted file mode 100644 index a319a47e..00000000 --- a/src/external/PackedCSparse/projinv.h +++ /dev/null @@ -1,90 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from PolytopeSamplerMatlab -//(https://github.com/ConstrainedSampler/PolytopeSamplerMatlab/blob/master/code/solver/PackedCSparse/PackedChol.h) by Ioannis Iakovidis - -#pragma once -#include "SparseMatrix.h" - -// Problem: -// Compute inv(L L') restricted on L - -// Algorithm: -// We need to study this later as this is the bottleneck. -// Document it as a lyx. - -namespace PackedCSparse { - template - struct ProjinvOutput : SparseMatrix - { - TransposeOutput Lt; // sparsity pattern of the Lt - UniqueAlignedPtr w; // the row of L we are computing - UniquePtr c; // c[i] = index the last nonzero on column i in the current L - - void initialize(const SparseMatrix& L) - { - pcs_assert(L.initialized(), "chol: bad inputs."); - pcs_assert(L.n == L.m, "chol: dimensions mismatch."); - - // Copy the sparsity of L - SparseMatrix::operator=(std::move(L.clone())); - - // allocate workspaces - Ti n = L.n; - w.reset(pcs_aligned_new(n)); - c.reset(new Ti[n]); - Lt = transpose(L); - } - }; - - template - void projinv(ProjinvOutput& o, const SparseMatrix& L) - { - if (!o.initialized()) - o.initialize(L); - - Tx* Sx = o.x.get(); Ti n = o.n; - Ti* Li = L.i.get(), * Lp = L.p.get(); Tx* Lv = L.x.get(); - Ti* Lti = o.Lt.i.get(), * Ltp = o.Lt.p.get(); - Tx* w = o.w.get(); - Ti* c = o.c.get(); - Tx T0 = Tx(0), T1 = Tx(1); - - for (Ti k = 0; k < n; k++) - c[k] = Lp[k + 1] - 1; - - for (Ti k = n - 1; k != -1; k--) - { - for (Ti p = Lp[k] + 1; p < Lp[k + 1]; p++) - w[Li[p]] = Sx[p]; - - Tx sum = T1 / Lv[Lp[k]]; - for (Ti p = Ltp[k + 1] - 1; p != Ltp[k] - 1; p--) - { - Ti i = Lti[p], Lpi = Lp[i]; - - for (Ti q = Lp[i + 1] - 1; q != Lpi; q--) - fnmadd(sum, Lv[q], w[Li[q]]); - //sum -= Lv[q] * w[Li[q]]; - - sum = sum / Lv[Lpi]; - w[i] = sum; - Sx[c[i]] = sum; - c[i]--; - sum = T0; - } - } - } - - template - ProjinvOutput projinv(const SparseMatrix& L) - { - ProjinvOutput o; - projinv(o, L); - return o; - } -} diff --git a/src/external/PackedCSparse/qd/COPYING b/src/external/PackedCSparse/qd/COPYING deleted file mode 100644 index a20ad70e..00000000 --- a/src/external/PackedCSparse/qd/COPYING +++ /dev/null @@ -1,16 +0,0 @@ -This work was supported by the Director, Office of Science, Division -of Mathematical, Information, and Computational Sciences of the -U.S. Department of Energy under contract numbers DE-AC03-76SF00098 and -DE-AC02-05CH11231. - -Copyright (c) 2003-2009, The Regents of the University of California, -through Lawrence Berkeley National Laboratory (subject to receipt of -any required approvals from U.S. Dept. of Energy) All rights reserved. - -By downloading or using this software you are agreeing to the modified -BSD license that is in file "BSD-LBNL-License.doc" in the main ARPREC -directory. If you wish to use the software for commercial purposes -please contact the Technology Transfer Department at TTD@lbl.gov or -call 510-286-6457." - - diff --git a/src/external/PackedCSparse/qd/Makefile b/src/external/PackedCSparse/qd/Makefile deleted file mode 100644 index 791e92b9..00000000 --- a/src/external/PackedCSparse/qd/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -QD_CPPFLAGS=$(CPPFLAGS) -I$(R_INCLUDE_DIR) -march=native - -QD_SOURCES= bits.cc c_dd.cc c_qd.cc dd_const.cc dd_real.cc fpu.cc \ - qd_const.cc qd_real.cc util.cc - -QD_OBJECTS=$(QD_SOURCES:.cc=.o) - -libqd.a: $(QD_OBJECTS) - $(AR) rc libqd.a $(QD_OBJECTS) - -.cc.o: - $(CC) $(CFLAGS) $(CPICFLAGS) $(QD_CPPFLAGS) -c $< -o $@ - -clean: - rm -rf $(QD_OBJECTS) libqd.a diff --git a/src/external/PackedCSparse/qd/NEWS b/src/external/PackedCSparse/qd/NEWS deleted file mode 100644 index f32a7575..00000000 --- a/src/external/PackedCSparse/qd/NEWS +++ /dev/null @@ -1,181 +0,0 @@ -Changes for 2.3.22 - Made changes suggested by Vasiliy Sotnikov - -Changes for 2.3.21 - Changed renorm in include/qd/qd_inline.h - -Changes for 2.3.20 - added #include to quadt_test.cpp - changed references to 2.3.20 from 2.3.18 - -Changes for 2.3.19 - - Updated qd_real.cpp and dd_real.cpp to fix a buffer overflow problem. - -Changes for 2.3.18 - - Updated qd_real.cpp and dd_real.cpp to fix a problem in output. - -Changes for 2.3.17 - - updated qd_real.cpp, to fix a problem with improper treatment of - negative arguments in nroot. - -Changes for 2.3.16 - - Updated dd_real.cpp, to fix a problem with inaccurate values of - tanh for small arguments. - -Changes for 2.3.15 - - Updated qd_real.cpp, to fix a problem with static definitions. - -Changes for 2.3.14 - - Updated autoconfig (replaced config.sub and config.guess) - -Changes for 2.3.7 - - Fixed bug in to_digits where digits larger than 10 - where output occasionally. - -Changes for 2.3.6 - - Added fmod (C++) and mod (Fortran) functions. - -Changes for 2.3.5 - - Fixed bug in division of qd_real by dd_real. - - Fixed bug in ddoutc (Fortran ddmod.f). - - Now compiles with g++ 4.3. - - Distribute tests/coeff.dat. - -Changes for 2.3.4 - - Fixed bug in Makefile for cygwin / mingw systems. - -Changes for 2.3.3 - - Fixed bug in atan2. - -Changes for 2.3.2 - - Fixed bug in sin / cos / sincos where too much accuracy was - lost for (moderately) large angles. - - Use fused-multiply add intrinsics on IA-64 platforms if - compiled by Intel compiler. - - Fixed bug in c_dd_write and c_qd_write. - - Fixed bug were qdext.mod was not being installed. - -Changes for 2.3.1 - - Fixed bug in sincos and cos_taylor. This affected the result - of trigonometric functions in some cases. - -Changes for 2.3.0 - This is a fairly significant change, breaking API compatibility. - - Moved C++ main entry in libqdmod.a to libqd_f_main.a. - This allows to link Fortran code using QD with custom - C++ main function. Pure Fortran code will need to be linked - with qd_f_main library in addition to qdmod and qd library. - - Constructors accepting pointers made explicit. - - Fortran routines labeled as elemental or pure, where appropriate. - - Write() is now to_string(), and now takes a single fmtflag. - - dd_real addition and multiplication made commutative. - - dd_real now represented as array of two doubles, instead of - two discrete scalars. - - New Fortran generic routines to read / write, operations with - complex and integers. - - Improved exp, sin, and cos functions. - - Removed unused constants and obscure constants only used internally - from public interface. - -Changes for 2.2.6 - - Fixed bug in mixed precision multiplication: qd_real * dd_real. - -Changes for 2.2.5 - - Bug fix in qd_real addition when --enable-ieee-add is specified. - - Debugging routines dump and dump_bits updated; - dump_components removed (just use dump). - - Fortran support for Fortran strings. Use character arrays instead. - - Return NaN under error conditions. - - Added _inf constant; exp now returns Inf when argument is too large. - - Output formatting fixes for Inf and NaNs. - - Added more real-complex mixed arithmetic routines in Fortran - interface. - -Changes for 2.2.4 - - Added random_number interface for Fortran modules. - - Use slightly more conservative values for eps. - - Avoid unnecessary overflow near overflow threshold. - - Added radix, digits, min/maxexponent, range, and precision - intrinsics to Fortran interface. - - Added safe_max (C++) and safe_huge (Fortran). - -Changes for 2.2.3 - - Fix sign function bug in Fortran modules. - -Changes for 2.2.2 - - Do not bother setting uninitialized dd_real and qd_reals to zero. - - Use clock_gettime if available for timing. - - Fortran I/O should be more consistent with C++ version. - - fpu.h is now included with dd_real.h. - -Changes for 2.2.1 - - Minor fixes when printing in scientific format. - - Change search order of C++ compilers in Apple systems to avoid - case insensitive filesystems. - -Changes for 2.2.0 - - Added F95 interface for complex types. - - Renamed dd.h and qd.h to dd_real.h and qd_real.h, respectively. - This will break older C++ code using 2.1.x library, but it was - conflicting with QuickDraw libraries on Macs. (Hence the version - bump to 2.2). - - Removed overloaded typecast operators for int and double. These - permitted *automatic* conversion of dd_real/qd_real to double or - int, which is somewhat dangerous. Instead to_int and to_double - routines are added. - -Changes for 2.1.214 - - Updated pslq_test. - - Implmented numeric_limits<>. - - Better polyroot. - - Added isnan, isfinite, isinf functions. - - Fix / improve input output functions. - - Drop Microsoft Visual C++ 6.0 support. - - More efficient dd_real::sin. - -Changes for 2.1.213 - - Support for x86_64 platforms. - - Drop libtool support for now. - -Changes for 2.1.212 - - Support for pathCC compiler. - - Added accurate and sloppy versions of add / sub / mul / div avaialble. - - Added autodetection of fma functions. - -Changes for 2.1 (2003-12-30) - - added automake scripts. - - use libtool to compile / link and build libraries. - - supports standard installation targets (make install). - - support for Intel C++ compilers (icc / ecc). - - Fortran programs are now linked by C++ compiler. - - support for building shared library. - - minor bug fixes. - -Changes for 2.0 (2003-12-08) - - all header files are in "include/qd" directory. - - added autoconf scripts. - - added config.h and qd_config.h to store configuration information. - - renamed x86_* routines to fpu_* routines. - - added separate Fortran interface (f_* routines). - - options for sloppy multiply and sloppy divison separated. - - fixed C interface to be actually in C syntax. - - updated / added README, AUTHORS, NEWS, and LICENSE files. - - minor bug fixes. - -Changes for 1.2 (2003-12-04) - - added "dist-clean" target in Makefile - - initialize dd and qd variables to zero - - increases tolerance for qd / dd tests - - changed .cc extension to .cpp - - updated README, COPYING, and NEWS files - - added ChangeLog file - - fixed bug in '-all' flag in qd_test - - minor bug fixes - -Changes for 1.1 (2002-10-22) - - added "Changes" file (this file) - - fixed to - - fixed constant (3/4) * pi - - fixed exp(x) to return zero if x is a large negative number - - removed "docs" target in Makefile - diff --git a/src/external/PackedCSparse/qd/README b/src/external/PackedCSparse/qd/README deleted file mode 100644 index 8a085d72..00000000 --- a/src/external/PackedCSparse/qd/README +++ /dev/null @@ -1,437 +0,0 @@ -Quad Double computation package -Copyright (C) 2003-2019 -================================================ - -Revision date: 26 February 2019 - -Authors: -Yozo Hida U.C. Berkeley yozo@cs.berkeley.edu -Xiaoye S. Li Lawrence Berkeley Natl Lab xiaoye@nersc.gov -David H. Bailey Lawrence Berkeley Natl Lab dhbailey@lbl.gov - -C++ usage guide: -Alex Kaiser Lawrence Berkeley Natl Lab adkaiser@lbl.gov - -This work was supported by the Director, Office of Science, Division of Mathematical, -Information, and Computational Sciences of the U.S. Department of Energy under contract -number DE-AC02-05CH11231. - -This work was supported by the Director, Office of Science, Division of Mathematical, -Information, and Computational Sciences of the U.S. Department of Energy under contract -numbers DE-AC03-76SF00098 and DE-AC02-05CH11231. - -*** IMPORTANT NOTES: - -See the file COPYING for modified BSD license information. -See the file INSTALL for installation instructions. -See the file NEWS for recent revisions. -See the file docs/qd.pdf for additional information. - -Outline: - -I. Introduction -II. Installation of package, and linking and executing user files -III. C++ Usage -IV. Fortran Usage -V. Note on x86-Based Processors (MOST systems in use today) - - -I. Introduction - -This package provides numeric types of twice the precision of IEEE double (106 mantissa -bits, or approximately 32 decimal digits) and four times the precision of IEEE double (212 -mantissa bits, or approximately 64 decimal digits). Due to features such as operator and -function overloading, these facilities can be utilized with only minor modifications to -conventional C++ and Fortran-90 programs. - -In addition to the basic arithmetic operations (add, subtract, multiply, divide, square root), -common transcendental functions such as the exponential, logarithm, trigonometric and -hyperbolic functions are also included. A detailed description of the algorithms used is -available in the docs subdirectory (see docs/qd.pdf). An abridged version of this paper, -which was presented at the ARITH-15 conference, is also available at: - -Yozo Hida, Xiaoye S. Li and David H. Bailey, "Algorithms for quad-double precision - floating point arithmetic," 15th IEEE Symposium on Computer Arithmetic, IEEE Computer - Society, 2001, pg. 155-162, available at - https://www.davidhbailey.com/dhbpapers/arith15.pdf. - - -II. Installation of package, and linking and executing user files - -A. Directories - -There are six directories and several files in the main directory of this distribution, -described below - -src This contains the source code of the quad-double and double-double - library. This source code does not include inline functions, - which are found in the header files in the include directory. - -include This directory contains the header files. - -fortran This directory contains Fortran-90 files. - -tests This directory contains some simple (not comprehensive) tests. - -docs This directory contains a technical paper describing the algorithms. - -config This directory contains various scripts used by the configure - script and the Makefile. - -Please note that all commands refer to a Unix-type environment such as Mac OSX or Ubuntu -Linux using the bash shell. - -B. Installing and building - -To build the library, first run the included configure script by typing - - ./configure - -This script automatically generates makefiles for building the library and selects compilers -and necessary flags and libraries to include. If the user wishes to specify compilers or flags -they may use the following options. - - CXX C++ compiler to use - CXXFLAGS C++ compiler flags to use - CC C compiler to use (for C demo program) - CFLAGS C compiler flags to use (for C demo program) - FC Fortran 90 compiler - FCFLAGS Fortran 90 compiler flags to use - FCLIBS Fortran 90 libraries needed to link with C++ code. - -For example, if one is using GNU compilers, configure with: - - ./configure CXX=g++ FC=gfortran - -The Fortran and C++ compilers must produce compatible binaries. On some systems -additional flags must be included to ensure that portions of the -library are not built with 32 and 64 bit object files. For example, on -64-Bit Mac OSX 10.6 (Snow Leopard) and 10.7 (Lion) the correct -configure line using GNU compilers is: - - ./configure CXX=g++ FC=gfortran FCFLAGS=-m64 - -To build the library, simply type - - make - -and the automatically generated makefiles will build the library including archive files. - -To allow for easy linking to the library, the user may also wish to -install the archive files to a standard place. To do this type: - - make install - -This will also build the library if it has not already been built. Many systems, including Mac -and Ubuntu Linux systems, require administrator privileges to install the library at such -standard places. On such systems, one may type: - - sudo make install - -instead if one has sufficient access. - -The directory "tests" contains programs for high precision quadrature and integer-relation -detection. To build such programs, type: - - make demo - -in the "tests" directory. - -C. Linking and executing user programs - -C++ source files: - -The simplest way to link to the library is to install it to a standard place as described above, and use the -l option. For example - - g++ compileExample.cpp -o compileExample -l qd - -One can also use this method to build with make. A file called "compileExample.cpp" and the -associated makefile "makeCompileExample" illustrate the process. - -A third alternative is to use a link script. If one types "make demo" in the test -directory, the output produced gives guidance as to how to build the files. By -following the structure of the compiling commands one may copy the appropriate portions, -perhaps replacing the filename with an argument that the user can include at link time. -An example of such a script is as follows: - -g++ -DHAVE_CONFIG_H -I.. -I../include -I../include -O2 -MT $1.o -MD -MP -MF -.deps/qd_test.Tpo -c -o $1.o $1.cpp -mv -f .deps/$1.Tpo .deps/$1.Po -g++ -O2 -o $1 $1.o ../src/libqd.a -lm - -To use the link script, make it executable (by typing "chmod +x link.scr) and then type: - -./link.scr compileExample - -Note that the file extension is not included because the script handles all extensions, -expecting the source file to have the extension ".cpp". - -Fortran-90 source files: - -Similarly, a script for compiling fortran programs may be constructed as follows. -In the fortran directory, type "make quadtsq". This compiles the Fortran program -tquadts.f, links with all necessary library files, and produces the executable -"quadts". As this is being done, all flags and linked libraries are displayed. -For instance, on a 2019-era Apple Macintosh system, where the library was installed -as above with g++ for C++ and gfortran for Fortran-90, the following is output: - -gfortran -m64 -ffree-form -c -o tquadtsq.o tquadtsq.f -/bin/sh ../libtool --tag=CXX --mode=link g++ -O2 -o quadtsq tquadtsq.o second.o -libqdmod.la libqd_f_main.la ../src/libqd.la --L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin16/6.3.0 --L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin16/6.3.0/../../.. --lgfortran -lquadmath -lm -lm - -Thus a general compile-link script is the following: - -gfortran -m64 -ffree-form -c -o $1.o $1.f90 -/bin/sh ../libtool --tag=CXX --mode=link g++ -O2 -o $1 $1.o second.o \ - libqdmod.la libqd_f_main.la ../src/libqd.la \ - -L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin16/6.3.0 \ - -L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin16/6.3.0/../../.. \ - -lgfortran -lquadmath -lm -lm - -Note that if the .f90 suffix is used for Fortran-90 source files, the --ffree-form flag may be omitted, but the first line above should end with -"$1.f90" (as shown above). After forming the script, name file, "complink.scr", -and then type "chmod +x complink.scr". To use this script compile and link a -program named "prog.f90", type "./complink.scr prog". - - -III. C++ usage - -As much as possible, operator overloading is included to make basic programming as much -like using standard typed floating-point arithmetic. Changing many codes should be as -simple as changing type statements and a few other lines. - -i. Constructors - -To create dd_real and qd_real variables calculated to the proper precision, one must use -care to use the included constructors properly. Many computations in which variables are -not explicitly typed to multiple-precision may be evaluated with double-precision -arithmetic. The user must take care to ensure that this does not cause errors. In particular, -an expression such as 1.0/3.0 will be evaluated to double precision before assignment or -further arithmetic. Upon assignment to a multi-precision variable, the value will be zero -padded. This problem is serious and potentially difficult to debug. To avoid this, use the -included constructors to force arithmetic to be performed in the full precision requested. - -For a table with descriptions, please see the documentation file qd.pdf in the docs directory. - -ii. Included functions and Constants - -Supported functions include assignment operators, comparisons, arithmetic and -assignment operators, and increments for integer types. Standard C math functions such as -exponentiation, trigonometric, logarithmic, hyperbolic, exponential and rounding functions -are included. As in assignment statements, one must be careful with implied typing of -constants when using these functions. Many codes need particular conversion for the power -function, which is frequently used with constants that must be explicitly typed for multi- -precision codes. - -Many constants are included, which are global and calculated upon initialization. The -following list of constants is calculated for both the dd_real and qd_real classes separately. -Use care to select the correct value. - -For a table with descriptions, please see the included file README.pdf - -ii. Conversion of types - -Static casts may be used to convert constants between types. One may also use constructors -to return temporary multi-precision types within expressions, but should be careful, as this -will waste memory if done repeatedly. For example: - - qd_real y ; - y = sin( qd_real(4.0) / 3.0 ) ; - -C-style casts may be used, but are not recommended. Dynamic and reinterpret casts are -not supported and should be considered unreliable. Casting between multi-precision and -standard precision types can be dangerous, and care must be taken to ensure that programs -are working properly and accuracy has not degraded by use of a misplaced type-conversion. - -D. Available precision, Control of Precision Levels, - -The library provides greatly extended accuracy when compared to standard double -precision. The type dd_real provides for 106 mantissa bits, or about 32 decimal digits. The -type qd_real provides for 212 mantissa bits, or about 64 decimal digits. - -Both the dd_real and qd_real values use the exponent from the highest double-precision -word for arithmetic, and as such do not extend the total range of values available. That -means that the maximum absolute value for either data type is the same as that of double- -precision, or approximately 10^308. The precision near this range, however, is greatly -increased. - -E. I/O - -The standard I/O stream routines have been overloaded to be fully compatible with all -included data types. One may need to manually reset the precision of the stream to obtain -full output. For example, if 60 digits are desired, use: - -cout.precision(60) ; - -When reading values using cin, each input numerical value must start on a separate -line. Two formats are acceptable: - - 1. Write the full constant - 3. Mantissa e exponent - -Here are three valid examples: - - 1.1 - 3.14159 26535 89793 - 123.123123e50 - -When read using cin, these constants will be converted using full multi-precision accuracy. - - -IV. Fortran-90 Usage - -NEW (2007-01-10): The Fortran translation modules now support the complex datatypes -"dd_complex" and "qd_complex". - -Since the quad-double library is written in C++, it must be linked in with a C++ compiler (so -that C++ specific things such as static initializations are correctly handled). Thus the main -program must be written in C/C++ and call the Fortran 90 subroutine. The Fortran 90 -subroutine should be called f_main. - -Here is a sample Fortran-90 program, equivalent to the above C++ program: - - subroutine f_main - use qdmodule - implicit none - type (qd_real) a, b - a = 1.d0 - b = cos(a)**2 + sin(a)**2 - 1.d0 - call qdwrite(6, b) - stop - end subroutine - -This verifies that cos^2(1) + sin^2(1) = 1 to 64 digit accuracy. - -Most operators and generic function references, including many mixed-mode type -combinations with double-precision (ie real*8), have been overloaded (extended) to work -with double-double and quad-double data. It is important, however, that users keep in -mind the fact that expressions are evaluated strictly according to conventional Fortran -operator precedence rules. Thus some subexpressions may be evaluated only to 15-digit -accuracy. For example, with the code - - real*8 d1 - type (dd_real) t1, t2 - ... - t1 = cos (t2) + d1/3.d0 - -the expression d1/3.d0 is computed to real*8 accuracy only (about 15 digits), since both d1 -and 3.d0 have type real*8. This result is then converted to dd_real by zero extension before -being added to cos(t2). So, for example, if d1 held the value 1.d0, then the quotient d1/3.d0 -would only be accurate to 15 digits. If a fully accurate double-double quotient is required, -this should be written: - - real*8 d1 - type (dd_real) t1, t2 - ... - t1 = cos (t2) + ddreal (d1) / 3.d0 - -which forces all operations to be performed with double-double arithmetic. - -Along this line, a constant such as 1.1 appearing in an expression is evaluated only to real*4 -accuracy, and a constant such as 1.1d0 is evaluated only to real*8 accuracy (this is -according to standard Fortran conventions). If full quad-double accuracy is required, for -instance, one should write - - type (qd_real) t1 - ... - t1 = '1.1' - -The quotes enclosing 1.1 specify to the compiler that the constant is to be converted to -binary using quad-double arithmetic, before assignment to t1. Quoted constants may only -appear in assignment statements such as this. - -To link a Fortran-90 program with the C++ qd library, it is recommended to link with the -C++ compiler used to generate the library. The Fortran 90 interface (along with a C-style -main function calling f_main) is found in qdmod library. The qd-config script installed -during "make install" can be used to determine which flags to pass to compile and link your -programs: - - "qd-config --fcflags" displays compiler flags needed to compile your Fortran files. - "qd-config --fclibs" displays linker flags needed by the C++ linker to link in all the -necessary libraries. - -A sample Makefile that can be used as a template for compiling Fortran programs using -quad-double library is found in fortran/Makefile.sample. - -F90 functions defined with dd_real arguments: - Arithmetic: + - * / ** - Comparison tests: == < > <= >= /= - Others: abs, acos, aint, anint, asin, atan, atan2, cos, cosh, dble, erf, - erfc, exp, int, log, log10, max, min, mod, ddcsshf (cosh and sinh), - ddcssnf (cos and sin), ddranf (random number generator in (0,1)), - ddnrtf (n-th root), sign, sin, sinh, sqr, sqrt, tan, tanh - -Similar functions are provided for qd_real arguments with function names qdcsshf, -qdcssnf, qdranf and qdnrtf instead of the names in the list above. - -Input and output of double-double and quad-double data is done using the special -subroutines ddread, ddwrite, qdread and qdwrite. The first argument of these subroutines -is the Fortran I/O unit number, while additional arguments (as many as needed, up to 9 -arguments) are scalar variables or array elements of the appropriate type. Example: - - integer n - type (qd_real) qda, qdb, qdc(n) - ... - call qdwrite (6, qda, qdb) - do j = 1, n - call qdwrite (6, qdc(j)) - enddo - -Each input values must be on a separate line, and may include D or E exponents. Double- -double and quad-double constants may also be specified in assignment statements by -enclosing them in quotes, as in - - ... - type (qd_real) pi - ... - pi = -"3.14159265358979323846264338327950288419716939937510582097494459230" - ... - -Sample Fortran-90 programs illustrating some of these features are provided in the f90 -subdirectory. - - -V. Note on x86-Based Processors (MOST systems in use today) - -The algorithms in this library assume IEEE double precision floating point arithmetic. Since -Intel x86 processors have extended (80-bit) floating point registers, some compilers, -albeit a declining number, may generate commands for the 80-bit instructions. The QD -library does NOT work correctly with 80-bit instructions, so if one's code does not operate -correctly, this may be the reason. To avoid such problems, the round-to-double flag must be -enabled in the control word of the FPU for this library to function properly. The following -functions contains appropriate code to facilitate manipulation of this flag. For non-x86 -systems these functions do nothing (but still exist). - -fpu_fix_start This turns on the round-to-double bit in the control word. -fpu_fix_end This restores the control flag. - -These functions must be called by the main program, as follows: - - int main() { - unsigned int old_cw; - fpu_fix_start(&old_cw); - - ... user code using quad-double library ... - - fpu_fix_end(&old_cw); - } - -A Fortran-90 example is the following: - - subroutine f_main - use qdmodule - implicit none - integer*4 old_cw - - call f_fpu_fix_start(old_cw) - - ... user code using quad-double library ... - - call f_fpu_fix_end(old_cw) - end subroutine - diff --git a/src/external/PackedCSparse/qd/bits.cc b/src/external/PackedCSparse/qd/bits.cc deleted file mode 100644 index 4eaf9a26..00000000 --- a/src/external/PackedCSparse/qd/bits.cc +++ /dev/null @@ -1,85 +0,0 @@ -/* - * src/bits.cc - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2001 - * - * Defines various routines to get / set bits of a IEEE floating point - * number. This used by the library for debugging purposes. - */ - -#include -#include -#include -#include - -#include "qd_config.h" -#include "inline.h" -#include "bits.h" - -#ifdef HAVE_IEEEFP_H -#include -#endif - -using std::setw; - -int get_double_expn(double x) { - if (x == 0.0) - return INT_MIN; - if (QD_ISINF(x) || QD_ISNAN(x)) - return INT_MAX; - - double y = std::abs(x); - int i = 0; - if (y < 1.0) { - while (y < 1.0) { - y *= 2.0; - i++; - } - return -i; - } else if (y >= 2.0) { - while (y >= 2.0) { - y *= 0.5; - i++; - } - return i; - } - return 0; -} - -void print_double_info(std::ostream &os, double x) { - std::streamsize old_prec = os.precision(19); - std::ios_base::fmtflags old_flags = os.flags(); - os << std::scientific; - - os << setw(27) << x << ' '; - if (QD_ISNAN(x) || QD_ISINF(x) || (x == 0.0)) { - os << " "; - } else { - - x = std::abs(x); - int expn = get_double_expn(x); - double d = std::ldexp(1.0, expn); - os << setw(5) << expn << " "; - for (int i = 0; i < 53; i++) { - if (x >= d) { - x -= d; - os << '1'; - } else - os << '0'; - d *= 0.5; - } - - if (x != 0.0) { - // should not happen - os << " +trailing stuff"; - } - } - - os.precision(old_prec); - os.flags(old_flags); -} - diff --git a/src/external/PackedCSparse/qd/bits.h b/src/external/PackedCSparse/qd/bits.h deleted file mode 100644 index 58570aac..00000000 --- a/src/external/PackedCSparse/qd/bits.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * include/bits.h - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2001 - * - * This file defines various routines to get / set bits of a IEEE floating - * point number. This is used by the library for debugging purposes. - */ - -#ifndef _QD_BITS_H -#define _QD_BITS_H - -#include -#include "qd_config.h" - -/* Returns the exponent of the double precision number. - Returns INT_MIN is x is zero, and INT_MAX if x is INF or NaN. */ -int get_double_expn(double x); - -/* Prints - SIGN EXPN MANTISSA - of the given double. If x is NaN, INF, or Zero, this - prints out the strings NaN, +/- INF, and 0. */ -void print_double_info(std::ostream &os, double x); - - -#endif /* _QD_BITS_H */ - diff --git a/src/external/PackedCSparse/qd/c_dd.cc b/src/external/PackedCSparse/qd/c_dd.cc deleted file mode 100644 index 0a7c12ac..00000000 --- a/src/external/PackedCSparse/qd/c_dd.cc +++ /dev/null @@ -1,314 +0,0 @@ -/* - * src/c_dd.cc - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2001 - * - * Contains the C wrapper functions for double-double precision arithmetic. - * This can be used from Fortran code. - */ -#include - -#include "qd_config.h" -#include "dd_real.h" -#include "c_dd.h" - -#define TO_DOUBLE_PTR(a, ptr) ptr[0] = a.x[0]; ptr[1] = a.x[1]; - -extern "C" { - -/* add */ -void c_dd_add(const double *a, const double *b, double *c) { - dd_real cc; - cc = dd_real(a) + dd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_dd_add_dd_d(const double *a, double b, double *c) { - dd_real cc; - cc = dd_real(a) + b; - TO_DOUBLE_PTR(cc, c); -} -void c_dd_add_d_dd(double a, const double *b, double *c) { - dd_real cc; - cc = a + dd_real(b); - TO_DOUBLE_PTR(cc, c); -} - - -/* sub */ -void c_dd_sub(const double *a, const double *b, double *c) { - dd_real cc; - cc = dd_real(a) - dd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_dd_sub_dd_d(const double *a, double b, double *c) { - dd_real cc; - cc = dd_real(a) - b; - TO_DOUBLE_PTR(cc, c); -} -void c_dd_sub_d_dd(double a, const double *b, double *c) { - dd_real cc; - cc = a - dd_real(b); - TO_DOUBLE_PTR(cc, c); -} - - -/* mul */ -void c_dd_mul(const double *a, const double *b, double *c) { - dd_real cc; - cc = dd_real(a) * dd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_dd_mul_dd_d(const double *a, double b, double *c) { - dd_real cc; - cc = dd_real(a) * b; - TO_DOUBLE_PTR(cc, c); -} -void c_dd_mul_d_dd(double a, const double *b, double *c) { - dd_real cc; - cc = a * dd_real(b); - TO_DOUBLE_PTR(cc, c); -} - - -/* div */ -void c_dd_div(const double *a, const double *b, double *c) { - dd_real cc; - cc = dd_real(a) / dd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_dd_div_dd_d(const double *a, double b, double *c) { - dd_real cc; - cc = dd_real(a) / b; - TO_DOUBLE_PTR(cc, c); -} -void c_dd_div_d_dd(double a, const double *b, double *c) { - dd_real cc; - cc = a / dd_real(b); - TO_DOUBLE_PTR(cc, c); -} - - -/* copy */ -void c_dd_copy(const double *a, double *b) { - b[0] = a[0]; - b[1] = a[1]; -} -void c_dd_copy_d(double a, double *b) { - b[0] = a; - b[1] = 0.0; -} - - -void c_dd_sqrt(const double *a, double *b) { - dd_real bb; - bb = sqrt(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_sqr(const double *a, double *b) { - dd_real bb; - bb = sqr(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_dd_abs(const double *a, double *b) { - dd_real bb; - bb = abs(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_dd_npwr(const double *a, int n, double *b) { - dd_real bb; - bb = npwr(dd_real(a), n); - TO_DOUBLE_PTR(bb, b); -} - -void c_dd_nroot(const double *a, int n, double *b) { - dd_real bb; - bb = nroot(dd_real(a), n); - TO_DOUBLE_PTR(bb, b); -} - -void c_dd_nint(const double *a, double *b) { - dd_real bb; - bb = nint(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_aint(const double *a, double *b) { - dd_real bb; - bb = aint(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_floor(const double *a, double *b) { - dd_real bb; - bb = floor(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_ceil(const double *a, double *b) { - dd_real bb; - bb = ceil(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_dd_log(const double *a, double *b) { - dd_real bb; - bb = log(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_log10(const double *a, double *b) { - dd_real bb; - bb = log10(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_exp(const double *a, double *b) { - dd_real bb; - bb = exp(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_dd_sin(const double *a, double *b) { - dd_real bb; - bb = sin(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_cos(const double *a, double *b) { - dd_real bb; - bb = cos(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_tan(const double *a, double *b) { - dd_real bb; - bb = tan(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_dd_asin(const double *a, double *b) { - dd_real bb; - bb = asin(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_acos(const double *a, double *b) { - dd_real bb; - bb = acos(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_atan(const double *a, double *b) { - dd_real bb; - bb = atan(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_dd_atan2(const double *a, const double *b, double *c) { - dd_real cc; - cc = atan2(dd_real(a), dd_real(b)); - TO_DOUBLE_PTR(cc, c); -} - -void c_dd_sinh(const double *a, double *b) { - dd_real bb; - bb = sinh(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_cosh(const double *a, double *b) { - dd_real bb; - bb = cosh(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_tanh(const double *a, double *b) { - dd_real bb; - bb = tanh(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_dd_asinh(const double *a, double *b) { - dd_real bb; - bb = asinh(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_acosh(const double *a, double *b) { - dd_real bb; - bb = acosh(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_dd_atanh(const double *a, double *b) { - dd_real bb; - bb = atanh(dd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_dd_sincos(const double *a, double *s, double *c) { - dd_real ss, cc; - sincos(dd_real(a), ss, cc); - TO_DOUBLE_PTR(ss, s); - TO_DOUBLE_PTR(cc, c); -} - -void c_dd_sincosh(const double *a, double *s, double *c) { - dd_real ss, cc; - sincosh(dd_real(a), ss, cc); - TO_DOUBLE_PTR(ss, s); - TO_DOUBLE_PTR(cc, c); -} - -void c_dd_read(const char *s, double *a) { - dd_real aa(s); - TO_DOUBLE_PTR(aa, a); -} - -void c_dd_swrite(const double *a, int precision, char *s, int len) { - dd_real(a).write(s, len, precision); -} - -void c_dd_write(const double *a) { - std::cout << dd_real(a).to_string(dd_real::_ndigits) << std::endl; -} - -void c_dd_neg(const double *a, double *b) { - b[0] = -a[0]; - b[1] = -a[1]; -} - -void c_dd_rand(double *a) { - dd_real aa; - aa = ddrand(); - TO_DOUBLE_PTR(aa, a); -} - -void c_dd_comp(const double *a, const double *b, int *result) { - dd_real aa(a), bb(b); - if (aa < bb) - *result = -1; - else if (aa > bb) - *result = 1; - else - *result = 0; -} - -void c_dd_comp_dd_d(const double *a, double b, int *result) { - dd_real aa(a), bb(b); - if (aa < bb) - *result = -1; - else if (aa > bb) - *result = 1; - else - *result = 0; -} - -void c_dd_comp_d_dd(double a, const double *b, int *result) { - dd_real aa(a), bb(b); - if (aa < bb) - *result = -1; - else if (aa > bb) - *result = 1; - else - *result = 0; -} - -void c_dd_pi(double *a) { - TO_DOUBLE_PTR(dd_real::_pi, a); -} - -} diff --git a/src/external/PackedCSparse/qd/c_dd.h b/src/external/PackedCSparse/qd/c_dd.h deleted file mode 100644 index 310162ed..00000000 --- a/src/external/PackedCSparse/qd/c_dd.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * include/c_dd.h - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2001 - * - * Contains C wrapper function prototypes for double-double precision - * arithmetic. This can also be used from fortran code. - */ -#ifndef _QD_C_DD_H -#define _QD_C_DD_H - -#include "qd_config.h" -#include "fpu.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* add */ -void c_dd_add(const double *a, const double *b, double *c); -void c_dd_add_d_dd(double a, const double *b, double *c); -void c_dd_add_dd_d(const double *a, double b, double *c); - -/* sub */ -void c_dd_sub(const double *a, const double *b, double *c); -void c_dd_sub_d_dd(double a, const double *b, double *c); -void c_dd_sub_dd_d(const double *a, double b, double *c); - -/* mul */ -void c_dd_mul(const double *a, const double *b, double *c); -void c_dd_mul_d_dd(double a, const double *b, double *c); -void c_dd_mul_dd_d(const double *a, double b, double *c); - -/* div */ -void c_dd_div(const double *a, const double *b, double *c); -void c_dd_div_d_dd(double a, const double *b, double *c); -void c_dd_div_dd_d(const double *a, double b, double *c); - -/* copy */ -void c_dd_copy(const double *a, double *b); -void c_dd_copy_d(double a, double *b); - -void c_dd_sqrt(const double *a, double *b); -void c_dd_sqr(const double *a, double *b); - -void c_dd_abs(const double *a, double *b); - -void c_dd_npwr(const double *a, int b, double *c); -void c_dd_nroot(const double *a, int b, double *c); - -void c_dd_nint(const double *a, double *b); -void c_dd_aint(const double *a, double *b); -void c_dd_floor(const double *a, double *b); -void c_dd_ceil(const double *a, double *b); - -void c_dd_exp(const double *a, double *b); -void c_dd_log(const double *a, double *b); -void c_dd_log10(const double *a, double *b); - -void c_dd_sin(const double *a, double *b); -void c_dd_cos(const double *a, double *b); -void c_dd_tan(const double *a, double *b); - -void c_dd_asin(const double *a, double *b); -void c_dd_acos(const double *a, double *b); -void c_dd_atan(const double *a, double *b); -void c_dd_atan2(const double *a, const double *b, double *c); - -void c_dd_sinh(const double *a, double *b); -void c_dd_cosh(const double *a, double *b); -void c_dd_tanh(const double *a, double *b); - -void c_dd_asinh(const double *a, double *b); -void c_dd_acosh(const double *a, double *b); -void c_dd_atanh(const double *a, double *b); - -void c_dd_sincos(const double *a, double *s, double *c); -void c_dd_sincosh(const double *a, double *s, double *c); - -void c_dd_read(const char *s, double *a); -void c_dd_swrite(const double *a, int precision, char *s, int len); -void c_dd_write(const double *a); -void c_dd_neg(const double *a, double *b); -void c_dd_rand(double *a); -void c_dd_comp(const double *a, const double *b, int *result); -void c_dd_comp_dd_d(const double *a, double b, int *result); -void c_dd_comp_d_dd(double a, const double *b, int *result); -void c_dd_pi(double *a); - -#ifdef __cplusplus -} -#endif - -#endif /* _QD_C_DD_H */ diff --git a/src/external/PackedCSparse/qd/c_qd.cc b/src/external/PackedCSparse/qd/c_qd.cc deleted file mode 100644 index fd50e922..00000000 --- a/src/external/PackedCSparse/qd/c_qd.cc +++ /dev/null @@ -1,450 +0,0 @@ -/* - * src/c_qd.cc - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2001 - * - * Contains C wrapper function for quad-double precision arithmetic. - * This can be used from fortran code. - */ -#include - -#include "qd_config.h" -#include "qd_real.h" -#include "c_qd.h" - -#define TO_DOUBLE_PTR(a, ptr) ptr[0] = a.x[0]; ptr[1] = a.x[1]; \ - ptr[2] = a.x[2]; ptr[3] = a.x[3]; - -extern "C" { - - - -/* add */ -void c_qd_add(const double *a, const double *b, double *c) { - qd_real cc; - cc = qd_real(a) + qd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_qd_add_qd_dd(const double *a, const double *b, double *c) { - qd_real cc; - cc = qd_real(a) + dd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_qd_add_dd_qd(const double *a, const double *b, double *c) { - qd_real cc; - cc = dd_real(a) + qd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_qd_add_qd_d(const double *a, double b, double *c) { - qd_real cc; - cc = qd_real(a) + b; - TO_DOUBLE_PTR(cc, c); -} -void c_qd_add_d_qd(double a, const double *b, double *c) { - qd_real cc; - cc = a + qd_real(b); - TO_DOUBLE_PTR(cc, c); -} - - - -/* sub */ -void c_qd_sub(const double *a, const double *b, double *c) { - qd_real cc; - cc = qd_real(a) - qd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_qd_sub_qd_dd(const double *a, const double *b, double *c) { - qd_real cc; - cc = qd_real(a) - dd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_qd_sub_dd_qd(const double *a, const double *b, double *c) { - qd_real cc; - cc = dd_real(a) - qd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_qd_sub_qd_d(const double *a, double b, double *c) { - qd_real cc; - cc = qd_real(a) - b; - TO_DOUBLE_PTR(cc, c); -} -void c_qd_sub_d_qd(double a, const double *b, double *c) { - qd_real cc; - cc = a - qd_real(b); - TO_DOUBLE_PTR(cc, c); -} - - - -/* mul */ -void c_qd_mul(const double *a, const double *b, double *c) { - qd_real cc; - cc = qd_real(a) * qd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_qd_mul_qd_dd(const double *a, const double *b, double *c) { - qd_real cc; - cc = qd_real(a) * dd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_qd_mul_dd_qd(const double *a, const double *b, double *c) { - qd_real cc; - cc = dd_real(a) * qd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_qd_mul_qd_d(const double *a, double b, double *c) { - qd_real cc; - cc = qd_real(a) * b; - TO_DOUBLE_PTR(cc, c); -} -void c_qd_mul_d_qd(double a, const double *b, double *c) { - qd_real cc; - cc = a * qd_real(b); - TO_DOUBLE_PTR(cc, c); -} - - - -/* div */ -void c_qd_div(const double *a, const double *b, double *c) { - qd_real cc; - cc = qd_real(a) / qd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_qd_div_qd_dd(const double *a, const double *b, double *c) { - qd_real cc; - cc = qd_real(a) / dd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_qd_div_dd_qd(const double *a, const double *b, double *c) { - qd_real cc; - cc = dd_real(a) / qd_real(b); - TO_DOUBLE_PTR(cc, c); -} -void c_qd_div_qd_d(const double *a, double b, double *c) { - qd_real cc; - cc = qd_real(a) / b; - TO_DOUBLE_PTR(cc, c); -} -void c_qd_div_d_qd(double a, const double *b, double *c) { - qd_real cc; - cc = a / qd_real(b); - TO_DOUBLE_PTR(cc, c); -} - - - - -/* selfadd */ -void c_qd_selfadd(const double *a, double *b) { - qd_real bb(b); - bb += qd_real(a); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_selfadd_dd(const double *a, double *b) { - qd_real bb(b); - bb += dd_real(a); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_selfadd_d(double a, double *b) { - qd_real bb(b); - bb += a; - TO_DOUBLE_PTR(bb, b); -} - - - -/* selfsub */ -void c_qd_selfsub(const double *a, double *b) { - qd_real bb(b); - bb -= qd_real(a); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_selfsub_dd(const double *a, double *b) { - qd_real bb(b); - bb -= dd_real(a); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_selfsub_d(double a, double *b) { - qd_real bb(b); - bb -= a; - TO_DOUBLE_PTR(bb, b); -} - - - -/* selfmul */ -void c_qd_selfmul(const double *a, double *b) { - qd_real bb(b); - bb *= qd_real(a); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_selfmul_dd(const double *a, double *b) { - qd_real bb(b); - bb *= dd_real(a); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_selfmul_d(double a, double *b) { - qd_real bb(b); - bb *= a; - TO_DOUBLE_PTR(bb, b); -} - - - -/* selfdiv */ -void c_qd_selfdiv(const double *a, double *b) { - qd_real bb(b); - bb /= qd_real(a); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_selfdiv_dd(const double *a, double *b) { - qd_real bb(b); - bb /= dd_real(a); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_selfdiv_d(double a, double *b) { - qd_real bb(b); - bb /= a; - TO_DOUBLE_PTR(bb, b); -} - - - -/* copy */ -void c_qd_copy(const double *a, double *b) { - b[0] = a[0]; - b[1] = a[1]; - b[2] = a[2]; - b[3] = a[3]; -} -void c_qd_copy_dd(const double *a, double *b) { - b[0] = a[0]; - b[1] = a[1]; - b[2] = 0.0; - b[3] = 0.0; -} -void c_qd_copy_d(double a, double *b) { - b[0] = a; - b[1] = 0.0; - b[2] = 0.0; - b[3] = 0.0; -} - - -void c_qd_sqrt(const double *a, double *b) { - qd_real bb; - bb = sqrt(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_sqr(const double *a, double *b) { - qd_real bb; - bb = sqr(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_qd_abs(const double *a, double *b) { - qd_real bb; - bb = abs(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_qd_npwr(const double *a, int n, double *b) { - qd_real bb; - bb = npwr(qd_real(a), n); - TO_DOUBLE_PTR(bb, b); -} - -void c_qd_nroot(const double *a, int n, double *b) { - qd_real bb; - bb = nroot(qd_real(a), n); - TO_DOUBLE_PTR(bb, b); -} - -void c_qd_nint(const double *a, double *b) { - qd_real bb; - bb = nint(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_aint(const double *a, double *b) { - qd_real bb; - bb = aint(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_floor(const double *a, double *b) { - qd_real bb; - bb = floor(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_ceil(const double *a, double *b) { - qd_real bb; - bb = ceil(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_qd_log(const double *a, double *b) { - qd_real bb; - bb = log(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_log10(const double *a, double *b) { - qd_real bb; - bb = log10(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_exp(const double *a, double *b) { - qd_real bb; - bb = exp(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_qd_sin(const double *a, double *b) { - qd_real bb; - bb = sin(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_cos(const double *a, double *b) { - qd_real bb; - bb = cos(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_tan(const double *a, double *b) { - qd_real bb; - bb = tan(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_qd_asin(const double *a, double *b) { - qd_real bb; - bb = asin(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_acos(const double *a, double *b) { - qd_real bb; - bb = acos(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_atan(const double *a, double *b) { - qd_real bb; - bb = atan(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_qd_atan2(const double *a, const double *b, double *c) { - qd_real cc; - cc = atan2(qd_real(a), qd_real(b)); - TO_DOUBLE_PTR(cc, c); -} - -void c_qd_sinh(const double *a, double *b) { - qd_real bb; - bb = sinh(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_cosh(const double *a, double *b) { - qd_real bb; - bb = cosh(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_tanh(const double *a, double *b) { - qd_real bb; - bb = tanh(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_qd_asinh(const double *a, double *b) { - qd_real bb; - bb = asinh(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_acosh(const double *a, double *b) { - qd_real bb; - bb = acosh(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} -void c_qd_atanh(const double *a, double *b) { - qd_real bb; - bb = atanh(qd_real(a)); - TO_DOUBLE_PTR(bb, b); -} - -void c_qd_sincos(const double *a, double *s, double *c) { - qd_real ss, cc; - sincos(qd_real(a), ss, cc); - TO_DOUBLE_PTR(cc, c); - TO_DOUBLE_PTR(ss, s); -} - -void c_qd_sincosh(const double *a, double *s, double *c) { - qd_real ss, cc; - sincosh(qd_real(a), ss, cc); - TO_DOUBLE_PTR(cc, c); - TO_DOUBLE_PTR(ss, s); -} - -void c_qd_read(const char *s, double *a) { - qd_real aa(s); - TO_DOUBLE_PTR(aa, a); -} - -void c_qd_swrite(const double *a, int precision, char *s, int len) { - qd_real(a).write(s, len, precision); -} - -void c_qd_write(const double *a) { - std::cout << qd_real(a).to_string(qd_real::_ndigits) << std::endl; -} - -void c_qd_neg(const double *a, double *b) { - b[0] = -a[0]; - b[1] = -a[1]; - b[2] = -a[2]; - b[3] = -a[3]; -} - -void c_qd_rand(double *a) { - qd_real aa; - aa = qdrand(); - TO_DOUBLE_PTR(aa, a); -} - -void c_qd_comp(const double *a, const double *b, int *result) { - qd_real aa(a), bb(b); - if (aa < bb) - *result = -1; - else if (aa > bb) - *result = 1; - else - *result = 0; -} - -void c_qd_comp_qd_d(const double *a, double b, int *result) { - qd_real aa(a); - if (aa < b) - *result = -1; - else if (aa > b) - *result = 1; - else - *result = 0; -} - -void c_qd_comp_d_qd(double a, const double *b, int *result) { - qd_real bb(b); - if (a < bb) - *result = -1; - else if (a > bb) - *result = 1; - else - *result = 0; -} - -void c_qd_pi(double *a) { - TO_DOUBLE_PTR(qd_real::_pi, a); -} - -} diff --git a/src/external/PackedCSparse/qd/c_qd.h b/src/external/PackedCSparse/qd/c_qd.h deleted file mode 100644 index d11a7ff1..00000000 --- a/src/external/PackedCSparse/qd/c_qd.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * include/c_qd.h - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2001 - * - * Contains C wrapper function prototypes for quad-double precision - * arithmetic. This can also be used from fortran code. - */ -#ifndef _QD_C_QD_H -#define _QD_C_QD_H - -#include "c_dd.h" -#include "qd_config.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* add */ -void c_qd_add(const double *a, const double *b, double *c); -void c_qd_add_dd_qd(const double *a, const double *b, double *c); -void c_qd_add_qd_dd(const double *a, const double *b, double *c); -void c_qd_add_d_qd(double a, const double *b, double *c); -void c_qd_add_qd_d(const double *a, double b, double *c); -void c_qd_selfadd(const double *a, double *b); -void c_qd_selfadd_dd(const double *a, double *b); -void c_qd_selfadd_d(double a, double *b); - -/* sub */ -void c_qd_sub(const double *a, const double *b, double *c); -void c_qd_sub_dd_qd(const double *a, const double *b, double *c); -void c_qd_sub_qd_dd(const double *a, const double *b, double *c); -void c_qd_sub_d_qd(double a, const double *b, double *c); -void c_qd_sub_qd_d(const double *a, double b, double *c); -void c_qd_selfsub(const double *a, double *b); -void c_qd_selfsub_dd(const double *a, double *b); -void c_qd_selfsub_d(double a, double *b); - -/* mul */ -void c_qd_mul(const double *a, const double *b, double *c); -void c_qd_mul_dd_qd(const double *a, const double *b, double *c); -void c_qd_mul_qd_dd(const double *a, const double *b, double *c); -void c_qd_mul_d_qd(double a, const double *b, double *c); -void c_qd_mul_qd_d(const double *a, double b, double *c); -void c_qd_selfmul(const double *a, double *b); -void c_qd_selfmul_dd(const double *a, double *b); -void c_qd_selfmul_d(double a, double *b); - -/* div */ -void c_qd_div(const double *a, const double *b, double *c); -void c_qd_div_dd_qd(const double *a, const double *b, double *c); -void c_qd_div_qd_dd(const double *a, const double *b, double *c); -void c_qd_div_d_qd(double a, const double *b, double *c); -void c_qd_div_qd_d(const double *a, double b, double *c); -void c_qd_selfdiv(const double *a, double *b); -void c_qd_selfdiv_dd(const double *a, double *b); -void c_qd_selfdiv_d(double a, double *b); - -/* copy */ -void c_qd_copy(const double *a, double *b); -void c_qd_copy_dd(const double *a, double *b); -void c_qd_copy_d(double a, double *b); - -void c_qd_sqrt(const double *a, double *b); -void c_qd_sqr(const double *a, double *b); - -void c_qd_abs(const double *a, double *b); - -void c_qd_npwr(const double *a, int b, double *c); -void c_qd_nroot(const double *a, int b, double *c); - -void c_qd_nint(const double *a, double *b); -void c_qd_aint(const double *a, double *b); -void c_qd_floor(const double *a, double *b); -void c_qd_ceil(const double *a, double *b); - -void c_qd_exp(const double *a, double *b); -void c_qd_log(const double *a, double *b); -void c_qd_log10(const double *a, double *b); - -void c_qd_sin(const double *a, double *b); -void c_qd_cos(const double *a, double *b); -void c_qd_tan(const double *a, double *b); - -void c_qd_asin(const double *a, double *b); -void c_qd_acos(const double *a, double *b); -void c_qd_atan(const double *a, double *b); -void c_qd_atan2(const double *a, const double *b, double *c); - -void c_qd_sinh(const double *a, double *b); -void c_qd_cosh(const double *a, double *b); -void c_qd_tanh(const double *a, double *b); - -void c_qd_asinh(const double *a, double *b); -void c_qd_acosh(const double *a, double *b); -void c_qd_atanh(const double *a, double *b); - -void c_qd_sincos(const double *a, double *s, double *c); -void c_qd_sincosh(const double *a, double *s, double *c); - -void c_qd_read(const char *s, double *a); -void c_qd_swrite(const double *a, int precision, char *s, int len); -void c_qd_write(const double *a); -void c_qd_neg(const double *a, double *b); -void c_qd_rand(double *a); -void c_qd_comp(const double *a, const double *b, int *result); -void c_qd_comp_qd_d(const double *a, double b, int *result); -void c_qd_comp_d_qd(double a, const double *b, int *result); -void c_qd_pi(double *a); - -#ifdef __cplusplus -} -#endif - -#endif /* _QD_C_QD_H */ diff --git a/src/external/PackedCSparse/qd/dd_const.cc b/src/external/PackedCSparse/qd/dd_const.cc deleted file mode 100644 index 38b7b5ae..00000000 --- a/src/external/PackedCSparse/qd/dd_const.cc +++ /dev/null @@ -1,40 +0,0 @@ -/* - * src/dd_const.cc - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2007 - */ -#include "qd_config.h" -#include "dd_real.h" - -const dd_real dd_real::_2pi = dd_real(6.283185307179586232e+00, - 2.449293598294706414e-16); -const dd_real dd_real::_pi = dd_real(3.141592653589793116e+00, - 1.224646799147353207e-16); -const dd_real dd_real::_pi2 = dd_real(1.570796326794896558e+00, - 6.123233995736766036e-17); -const dd_real dd_real::_pi4 = dd_real(7.853981633974482790e-01, - 3.061616997868383018e-17); -const dd_real dd_real::_3pi4 = dd_real(2.356194490192344837e+00, - 9.1848509936051484375e-17); -const dd_real dd_real::_e = dd_real(2.718281828459045091e+00, - 1.445646891729250158e-16); -const dd_real dd_real::_log2 = dd_real(6.931471805599452862e-01, - 2.319046813846299558e-17); -const dd_real dd_real::_log10 = dd_real(2.302585092994045901e+00, - -2.170756223382249351e-16); -const dd_real dd_real::_nan = dd_real(qd::_d_nan, qd::_d_nan); -const dd_real dd_real::_inf = dd_real(qd::_d_inf, qd::_d_inf); - -const double dd_real::_eps = 4.93038065763132e-32; // 2^-104 -const double dd_real::_min_normalized = 2.0041683600089728e-292; // = 2^(-1022 + 53) -const dd_real dd_real::_max = - dd_real(1.79769313486231570815e+308, 9.97920154767359795037e+291); -const dd_real dd_real::_safe_max = - dd_real(1.7976931080746007281e+308, 9.97920154767359795037e+291); -const int dd_real::_ndigits = 31; - - diff --git a/src/external/PackedCSparse/qd/dd_inline.h b/src/external/PackedCSparse/qd/dd_inline.h deleted file mode 100644 index 89bc24f2..00000000 --- a/src/external/PackedCSparse/qd/dd_inline.h +++ /dev/null @@ -1,621 +0,0 @@ -/* - * include/dd_inline.h - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2001 - * - * Contains small functions (suitable for inlining) in the double-double - * arithmetic package. - */ -#ifndef _QD_DD_INLINE_H -#define _QD_DD_INLINE_H - -#include -#include "inline.h" - -#ifndef QD_INLINE -#define inline -#endif - - -/*********** Additions ************/ -/* double-double = double + double */ -inline dd_real dd_real::add(double a, double b) { - double s, e; - s = qd::two_sum(a, b, e); - return dd_real(s, e); -} - -/* double-double + double */ -inline dd_real operator+(const dd_real &a, double b) { - double s1, s2; - s1 = qd::two_sum(a.x[0], b, s2); - s2 += a.x[1]; - s1 = qd::quick_two_sum(s1, s2, s2); - return dd_real(s1, s2); -} - -/* double-double + double-double */ -inline dd_real dd_real::ieee_add(const dd_real &a, const dd_real &b) { - /* This one satisfies IEEE style error bound, - due to K. Briggs and W. Kahan. */ - double s1, s2, t1, t2; - - s1 = qd::two_sum(a.x[0], b.x[0], s2); - t1 = qd::two_sum(a.x[1], b.x[1], t2); - s2 += t1; - s1 = qd::quick_two_sum(s1, s2, s2); - s2 += t2; - s1 = qd::quick_two_sum(s1, s2, s2); - return dd_real(s1, s2); -} - -inline dd_real dd_real::sloppy_add(const dd_real &a, const dd_real &b) { - /* This is the less accurate version ... obeys Cray-style - error bound. */ - double s, e; - - s = qd::two_sum(a.x[0], b.x[0], e); - e += (a.x[1] + b.x[1]); - s = qd::quick_two_sum(s, e, e); - return dd_real(s, e); -} - -inline dd_real operator+(const dd_real &a, const dd_real &b) { -#ifndef QD_IEEE_ADD - return dd_real::sloppy_add(a, b); -#else - return dd_real::ieee_add(a, b); -#endif -} - -/* double + double-double */ -inline dd_real operator+(double a, const dd_real &b) { - return (b + a); -} - - -/*********** Self-Additions ************/ -/* double-double += double */ -inline dd_real &dd_real::operator+=(double a) { - double s1, s2; - s1 = qd::two_sum(x[0], a, s2); - s2 += x[1]; - x[0] = qd::quick_two_sum(s1, s2, x[1]); - return *this; -} - -/* double-double += double-double */ -inline dd_real &dd_real::operator+=(const dd_real &a) { -#ifndef QD_IEEE_ADD - double s, e; - s = qd::two_sum(x[0], a.x[0], e); - e += x[1]; - e += a.x[1]; - x[0] = qd::quick_two_sum(s, e, x[1]); - return *this; -#else - double s1, s2, t1, t2; - s1 = qd::two_sum(x[0], a.x[0], s2); - t1 = qd::two_sum(x[1], a.x[1], t2); - s2 += t1; - s1 = qd::quick_two_sum(s1, s2, s2); - s2 += t2; - x[0] = qd::quick_two_sum(s1, s2, x[1]); - return *this; -#endif -} - -/*********** Subtractions ************/ -/* double-double = double - double */ -inline dd_real dd_real::sub(double a, double b) { - double s, e; - s = qd::two_diff(a, b, e); - return dd_real(s, e); -} - -/* double-double - double */ -inline dd_real operator-(const dd_real &a, double b) { - double s1, s2; - s1 = qd::two_diff(a.x[0], b, s2); - s2 += a.x[1]; - s1 = qd::quick_two_sum(s1, s2, s2); - return dd_real(s1, s2); -} - -/* double-double - double-double */ -inline dd_real operator-(const dd_real &a, const dd_real &b) { -#ifndef QD_IEEE_ADD - double s, e; - s = qd::two_diff(a.x[0], b.x[0], e); - e += a.x[1]; - e -= b.x[1]; - s = qd::quick_two_sum(s, e, e); - return dd_real(s, e); -#else - double s1, s2, t1, t2; - s1 = qd::two_diff(a.x[0], b.x[0], s2); - t1 = qd::two_diff(a.x[1], b.x[1], t2); - s2 += t1; - s1 = qd::quick_two_sum(s1, s2, s2); - s2 += t2; - s1 = qd::quick_two_sum(s1, s2, s2); - return dd_real(s1, s2); -#endif -} - -/* double - double-double */ -inline dd_real operator-(double a, const dd_real &b) { - double s1, s2; - s1 = qd::two_diff(a, b.x[0], s2); - s2 -= b.x[1]; - s1 = qd::quick_two_sum(s1, s2, s2); - return dd_real(s1, s2); -} - -/*********** Self-Subtractions ************/ -/* double-double -= double */ -inline dd_real &dd_real::operator-=(double a) { - double s1, s2; - s1 = qd::two_diff(x[0], a, s2); - s2 += x[1]; - x[0] = qd::quick_two_sum(s1, s2, x[1]); - return *this; -} - -/* double-double -= double-double */ -inline dd_real &dd_real::operator-=(const dd_real &a) { -#ifndef QD_IEEE_ADD - double s, e; - s = qd::two_diff(x[0], a.x[0], e); - e += x[1]; - e -= a.x[1]; - x[0] = qd::quick_two_sum(s, e, x[1]); - return *this; -#else - double s1, s2, t1, t2; - s1 = qd::two_diff(x[0], a.x[0], s2); - t1 = qd::two_diff(x[1], a.x[1], t2); - s2 += t1; - s1 = qd::quick_two_sum(s1, s2, s2); - s2 += t2; - x[0] = qd::quick_two_sum(s1, s2, x[1]); - return *this; -#endif -} - -/*********** Unary Minus ***********/ -inline dd_real dd_real::operator-() const { - return dd_real(-x[0], -x[1]); -} - -/*********** Multiplications ************/ -/* double-double = double * double */ -inline dd_real dd_real::mul(double a, double b) { - double p, e; - p = qd::two_prod(a, b, e); - return dd_real(p, e); -} - -/* double-double * (2.0 ^ exp) */ -inline dd_real ldexp(const dd_real &a, int exp) { - return dd_real(std::ldexp(a.x[0], exp), std::ldexp(a.x[1], exp)); -} - -/* double-double * double, where double is a power of 2. */ -inline dd_real mul_pwr2(const dd_real &a, double b) { - return dd_real(a.x[0] * b, a.x[1] * b); -} - -/* double-double * double */ -inline dd_real operator*(const dd_real &a, double b) { - double p1, p2; - - p1 = qd::two_prod(a.x[0], b, p2); - p2 += (a.x[1] * b); - p1 = qd::quick_two_sum(p1, p2, p2); - return dd_real(p1, p2); -} - -/* double-double * double-double */ -inline dd_real operator*(const dd_real &a, const dd_real &b) { - double p1, p2; - - p1 = qd::two_prod(a.x[0], b.x[0], p2); - p2 += (a.x[0] * b.x[1] + a.x[1] * b.x[0]); - p1 = qd::quick_two_sum(p1, p2, p2); - return dd_real(p1, p2); -} - -/* double * double-double */ -inline dd_real operator*(double a, const dd_real &b) { - return (b * a); -} - -/*********** Self-Multiplications ************/ -/* double-double *= double */ -inline dd_real &dd_real::operator*=(double a) { - double p1, p2; - p1 = qd::two_prod(x[0], a, p2); - p2 += x[1] * a; - x[0] = qd::quick_two_sum(p1, p2, x[1]); - return *this; -} - -/* double-double *= double-double */ -inline dd_real &dd_real::operator*=(const dd_real &a) { - double p1, p2; - p1 = qd::two_prod(x[0], a.x[0], p2); - p2 += a.x[1] * x[0]; - p2 += a.x[0] * x[1]; - x[0] = qd::quick_two_sum(p1, p2, x[1]); - return *this; -} - -/*********** Divisions ************/ -inline dd_real dd_real::div(double a, double b) { - double q1, q2; - double p1, p2; - double s, e; - - q1 = a / b; - - /* Compute a - q1 * b */ - p1 = qd::two_prod(q1, b, p2); - s = qd::two_diff(a, p1, e); - e -= p2; - - /* get next approximation */ - q2 = (s + e) / b; - - s = qd::quick_two_sum(q1, q2, e); - - return dd_real(s, e); -} - -/* double-double / double */ -inline dd_real operator/(const dd_real &a, double b) { - - double q1, q2; - double p1, p2; - double s, e; - dd_real r; - - q1 = a.x[0] / b; /* approximate quotient. */ - - /* Compute this - q1 * d */ - p1 = qd::two_prod(q1, b, p2); - s = qd::two_diff(a.x[0], p1, e); - e += a.x[1]; - e -= p2; - - /* get next approximation. */ - q2 = (s + e) / b; - - /* renormalize */ - r.x[0] = qd::quick_two_sum(q1, q2, r.x[1]); - - return r; -} - -inline dd_real dd_real::sloppy_div(const dd_real &a, const dd_real &b) { - double s1, s2; - double q1, q2; - dd_real r; - - q1 = a.x[0] / b.x[0]; /* approximate quotient */ - - /* compute this - q1 * dd */ - r = b * q1; - s1 = qd::two_diff(a.x[0], r.x[0], s2); - s2 -= r.x[1]; - s2 += a.x[1]; - - /* get next approximation */ - q2 = (s1 + s2) / b.x[0]; - - /* renormalize */ - r.x[0] = qd::quick_two_sum(q1, q2, r.x[1]); - return r; -} - -inline dd_real dd_real::accurate_div(const dd_real &a, const dd_real &b) { - double q1, q2, q3; - dd_real r; - - q1 = a.x[0] / b.x[0]; /* approximate quotient */ - - r = a - q1 * b; - - q2 = r.x[0] / b.x[0]; - r -= (q2 * b); - - q3 = r.x[0] / b.x[0]; - - q1 = qd::quick_two_sum(q1, q2, q2); - r = dd_real(q1, q2) + q3; - return r; -} - -/* double-double / double-double */ -inline dd_real operator/(const dd_real &a, const dd_real &b) { -#ifdef QD_SLOPPY_DIV - return dd_real::sloppy_div(a, b); -#else - return dd_real::accurate_div(a, b); -#endif -} - -/* double / double-double */ -inline dd_real operator/(double a, const dd_real &b) { - return dd_real(a) / b; -} - -inline dd_real inv(const dd_real &a) { - return 1.0 / a; -} - -/*********** Self-Divisions ************/ -/* double-double /= double */ -inline dd_real &dd_real::operator/=(double a) { - *this = *this / a; - return *this; -} - -/* double-double /= double-double */ -inline dd_real &dd_real::operator/=(const dd_real &a) { - *this = *this / a; - return *this; -} - -/********** Remainder **********/ -inline dd_real drem(const dd_real &a, const dd_real &b) { - dd_real n = nint(a / b); - return (a - n * b); -} - -inline dd_real divrem(const dd_real &a, const dd_real &b, dd_real &r) { - dd_real n = nint(a / b); - r = a - n * b; - return n; -} - -/*********** Squaring **********/ -inline dd_real sqr(const dd_real &a) { - double p1, p2; - double s1, s2; - p1 = qd::two_sqr(a.x[0], p2); - p2 += 2.0 * a.x[0] * a.x[1]; - p2 += a.x[1] * a.x[1]; - s1 = qd::quick_two_sum(p1, p2, s2); - return dd_real(s1, s2); -} - -inline dd_real dd_real::sqr(double a) { - double p1, p2; - p1 = qd::two_sqr(a, p2); - return dd_real(p1, p2); -} - - -/********** Exponentiation **********/ -inline dd_real dd_real::operator^(int n) { - return npwr(*this, n); -} - - -/*********** Assignments ************/ -/* double-double = double */ -inline dd_real &dd_real::operator=(double a) { - x[0] = a; - x[1] = 0.0; - return *this; -} - -/*********** Equality Comparisons ************/ -/* double-double == double */ -inline bool operator==(const dd_real &a, double b) { - return (a.x[0] == b && a.x[1] == 0.0); -} - -/* double-double == double-double */ -inline bool operator==(const dd_real &a, const dd_real &b) { - return (a.x[0] == b.x[0] && a.x[1] == b.x[1]); -} - -/* double == double-double */ -inline bool operator==(double a, const dd_real &b) { - return (a == b.x[0] && b.x[1] == 0.0); -} - -/*********** Greater-Than Comparisons ************/ -/* double-double > double */ -inline bool operator>(const dd_real &a, double b) { - return (a.x[0] > b || (a.x[0] == b && a.x[1] > 0.0)); -} - -/* double-double > double-double */ -inline bool operator>(const dd_real &a, const dd_real &b) { - return (a.x[0] > b.x[0] || (a.x[0] == b.x[0] && a.x[1] > b.x[1])); -} - -/* double > double-double */ -inline bool operator>(double a, const dd_real &b) { - return (a > b.x[0] || (a == b.x[0] && b.x[1] < 0.0)); -} - -/*********** Less-Than Comparisons ************/ -/* double-double < double */ -inline bool operator<(const dd_real &a, double b) { - return (a.x[0] < b || (a.x[0] == b && a.x[1] < 0.0)); -} - -/* double-double < double-double */ -inline bool operator<(const dd_real &a, const dd_real &b) { - return (a.x[0] < b.x[0] || (a.x[0] == b.x[0] && a.x[1] < b.x[1])); -} - -/* double < double-double */ -inline bool operator<(double a, const dd_real &b) { - return (a < b.x[0] || (a == b.x[0] && b.x[1] > 0.0)); -} - -/*********** Greater-Than-Or-Equal-To Comparisons ************/ -/* double-double >= double */ -inline bool operator>=(const dd_real &a, double b) { - return (a.x[0] > b || (a.x[0] == b && a.x[1] >= 0.0)); -} - -/* double-double >= double-double */ -inline bool operator>=(const dd_real &a, const dd_real &b) { - return (a.x[0] > b.x[0] || (a.x[0] == b.x[0] && a.x[1] >= b.x[1])); -} - -/* double >= double-double */ -inline bool operator>=(double a, const dd_real &b) { - return (b <= a); -} - -/*********** Less-Than-Or-Equal-To Comparisons ************/ -/* double-double <= double */ -inline bool operator<=(const dd_real &a, double b) { - return (a.x[0] < b || (a.x[0] == b && a.x[1] <= 0.0)); -} - -/* double-double <= double-double */ -inline bool operator<=(const dd_real &a, const dd_real &b) { - return (a.x[0] < b.x[0] || (a.x[0] == b.x[0] && a.x[1] <= b.x[1])); -} - -/* double <= double-double */ -inline bool operator<=(double a, const dd_real &b) { - return (b >= a); -} - -/*********** Not-Equal-To Comparisons ************/ -/* double-double != double */ -inline bool operator!=(const dd_real &a, double b) { - return (a.x[0] != b || a.x[1] != 0.0); -} - -/* double-double != double-double */ -inline bool operator!=(const dd_real &a, const dd_real &b) { - return (a.x[0] != b.x[0] || a.x[1] != b.x[1]); -} - -/* double != double-double */ -inline bool operator!=(double a, const dd_real &b) { - return (a != b.x[0] || b.x[1] != 0.0); -} - -/*********** Micellaneous ************/ -/* this == 0 */ -inline bool dd_real::is_zero() const { - return (x[0] == 0.0); -} - -/* this == 1 */ -inline bool dd_real::is_one() const { - return (x[0] == 1.0 && x[1] == 0.0); -} - -/* this > 0 */ -inline bool dd_real::is_positive() const { - return (x[0] > 0.0); -} - -/* this < 0 */ -inline bool dd_real::is_negative() const { - return (x[0] < 0.0); -} - -inline dd_real::operator bool() const { - return (x[0] != 0.0); -} - -inline dd_real::operator double() const { - return to_double(*this); -} - -/* Absolute value */ -inline dd_real abs(const dd_real &a) { - return (a.x[0] < 0.0) ? -a : a; -} - -inline dd_real fabs(const dd_real &a) { - return abs(a); -} - -/* Round to Nearest integer */ -inline dd_real nint(const dd_real &a) { - double hi = qd::nint(a.x[0]); - double lo; - - if (hi == a.x[0]) { - /* High word is an integer already. Round the low word.*/ - lo = qd::nint(a.x[1]); - - /* Renormalize. This is needed if x[0] = some integer, x[1] = 1/2.*/ - hi = qd::quick_two_sum(hi, lo, lo); - } else { - /* High word is not an integer. */ - lo = 0.0; - if (std::abs(hi-a.x[0]) == 0.5 && a.x[1] < 0.0) { - /* There is a tie in the high word, consult the low word - to break the tie. */ - hi -= 1.0; /* NOTE: This does not cause INEXACT. */ - } - } - - return dd_real(hi, lo); -} - -inline dd_real floor(const dd_real &a) { - double hi = std::floor(a.x[0]); - double lo = 0.0; - - if (hi == a.x[0]) { - /* High word is integer already. Round the low word. */ - lo = std::floor(a.x[1]); - hi = qd::quick_two_sum(hi, lo, lo); - } - - return dd_real(hi, lo); -} - -inline dd_real ceil(const dd_real &a) { - double hi = std::ceil(a.x[0]); - double lo = 0.0; - - if (hi == a.x[0]) { - /* High word is integer already. Round the low word. */ - lo = std::ceil(a.x[1]); - hi = qd::quick_two_sum(hi, lo, lo); - } - - return dd_real(hi, lo); -} - -inline dd_real aint(const dd_real &a) { - return (a.x[0] >= 0.0) ? floor(a) : ceil(a); -} - -/* Cast to double. */ -inline double to_double(const dd_real &a) { - return a.x[0]; -} - -/* Cast to int. */ -inline int to_int(const dd_real &a) { - return static_cast(a.x[0]); -} - -/* Random number generator */ -inline dd_real dd_real::rand() { - return ddrand(); -} - -#endif /* _QD_DD_INLINE_H */ diff --git a/src/external/PackedCSparse/qd/dd_real.cc b/src/external/PackedCSparse/qd/dd_real.cc deleted file mode 100644 index ff4d5223..00000000 --- a/src/external/PackedCSparse/qd/dd_real.cc +++ /dev/null @@ -1,1303 +0,0 @@ -/* - * src/dd_real.cc - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2007 - * - * Contains implementation of non-inlined functions of double-double - * package. Inlined functions are found in dd_inline.h (in include directory). - */ -#include -#include -#include -#include -#include -#include -#include - -#include "qd_config.h" -#include "dd_real.h" -#include "util.h" - -#include "bits.h" - -#ifndef QD_INLINE -#include "dd_inline.h" -#endif - -using std::cout; -using std::cerr; -using std::endl; -using std::ostream; -using std::istream; -using std::ios_base; -using std::string; -using std::setw; - -/* This routine is called whenever a fatal error occurs. */ -void dd_real::error(const char *msg) { - //if (msg) { cerr << "ERROR " << msg << endl; } -} - -/* Computes the square root of the double-double number dd. - NOTE: dd must be a non-negative number. */ -QD_API dd_real sqrt(const dd_real &a) { - /* Strategy: Use Karp's trick: if x is an approximation - to sqrt(a), then - - sqrt(a) = a*x + [a - (a*x)^2] * x / 2 (approx) - - The approximation is accurate to twice the accuracy of x. - Also, the multiplication (a*x) and [-]*x can be done with - only half the precision. - */ - - if (a.is_zero()) - return 0.0; - - if (a.is_negative()) { - dd_real::error("(dd_real::sqrt): Negative argument."); - return dd_real::_nan; - } - - double x = 1.0 / std::sqrt(a.x[0]); - double ax = a.x[0] * x; - return dd_real::add(ax, (a - dd_real::sqr(ax)).x[0] * (x * 0.5)); -} - -/* Computes the square root of a double in double-double precision. - NOTE: d must not be negative. */ -dd_real dd_real::sqrt(double d) { - return ::sqrt(dd_real(d)); -} - -/* Computes the n-th root of the double-double number a. - NOTE: n must be a positive integer. - NOTE: If n is even, then a must not be negative. */ -dd_real nroot(const dd_real &a, int n) { - /* Strategy: Use Newton iteration for the function - - f(x) = x^(-n) - a - - to find its root a^{-1/n}. The iteration is thus - - x' = x + x * (1 - a * x^n) / n - - which converges quadratically. We can then find - a^{1/n} by taking the reciprocal. - */ - - if (n <= 0) { - dd_real::error("(dd_real::nroot): N must be positive."); - return dd_real::_nan; - } - - if (n%2 == 0 && a.is_negative()) { - dd_real::error("(dd_real::nroot): Negative argument."); - return dd_real::_nan; - } - - if (n == 1) { - return a; - } - if (n == 2) { - return sqrt(a); - } - - if (a.is_zero()) - return 0.0; - - /* Note a^{-1/n} = exp(-log(a)/n) */ - dd_real r = abs(a); - dd_real x = std::exp(-std::log(r.x[0]) / n); - - /* Perform Newton's iteration. */ - x += x * (1.0 - r * npwr(x, n)) / static_cast(n); - if (a.x[0] < 0.0) - x = -x; - return 1.0/x; -} - -/* Computes the n-th power of a double-double number. - NOTE: 0^0 causes an error. */ -dd_real npwr(const dd_real &a, int n) { - - if (n == 0) { - if (a.is_zero()) { - dd_real::error("(dd_real::npwr): Invalid argument."); - return dd_real::_nan; - } - return 1.0; - } - - dd_real r = a; - dd_real s = 1.0; - int N = std::abs(n); - - if (N > 1) { - /* Use binary exponentiation */ - while (N > 0) { - if (N % 2 == 1) { - s *= r; - } - N /= 2; - if (N > 0) - r = sqr(r); - } - } else { - s = r; - } - - /* Compute the reciprocal if n is negative. */ - if (n < 0) - return (1.0 / s); - - return s; -} - -dd_real pow(const dd_real &a, int n) { - return npwr(a, n); -} - -dd_real pow(const dd_real &a, const dd_real &b) { - return exp(b * log(a)); -} - -static const int n_inv_fact = 15; -static const double inv_fact[n_inv_fact][2] = { - { 1.66666666666666657e-01, 9.25185853854297066e-18}, - { 4.16666666666666644e-02, 2.31296463463574266e-18}, - { 8.33333333333333322e-03, 1.15648231731787138e-19}, - { 1.38888888888888894e-03, -5.30054395437357706e-20}, - { 1.98412698412698413e-04, 1.72095582934207053e-22}, - { 2.48015873015873016e-05, 2.15119478667758816e-23}, - { 2.75573192239858925e-06, -1.85839327404647208e-22}, - { 2.75573192239858883e-07, 2.37677146222502973e-23}, - { 2.50521083854417202e-08, -1.44881407093591197e-24}, - { 2.08767569878681002e-09, -1.20734505911325997e-25}, - { 1.60590438368216133e-10, 1.25852945887520981e-26}, - { 1.14707455977297245e-11, 2.06555127528307454e-28}, - { 7.64716373181981641e-13, 7.03872877733453001e-30}, - { 4.77947733238738525e-14, 4.39920548583408126e-31}, - { 2.81145725434552060e-15, 1.65088427308614326e-31} -}; - -/* Exponential. Computes exp(x) in double-double precision. */ -dd_real exp(const dd_real &a) { - /* Strategy: We first reduce the size of x by noting that - - exp(kr + m * log(2)) = 2^m * exp(r)^k - - where m and k are integers. By choosing m appropriately - we can make |kr| <= log(2) / 2 = 0.347. Then exp(r) is - evaluated using the familiar Taylor series. Reducing the - argument substantially speeds up the convergence. */ - - const double k = 512.0; - const double inv_k = 1.0 / k; - - if (a.x[0] <= -709.0) - return 0.0; - - if (a.x[0] >= 709.0) - return dd_real::_inf; - - if (a.is_zero()) - return 1.0; - - if (a.is_one()) - return dd_real::_e; - - double m = std::floor(a.x[0] / dd_real::_log2.x[0] + 0.5); - dd_real r = mul_pwr2(a - dd_real::_log2 * m, inv_k); - dd_real s, t, p; - - p = sqr(r); - s = r + mul_pwr2(p, 0.5); - p *= r; - t = p * dd_real(inv_fact[0][0], inv_fact[0][1]); - int i = 0; - do { - s += t; - p *= r; - ++i; - t = p * dd_real(inv_fact[i][0], inv_fact[i][1]); - } while (std::abs(to_double(t)) > inv_k * dd_real::_eps && i < 5); - - s += t; - - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s += 1.0; - - return ldexp(s, static_cast(m)); -} - -/* Logarithm. Computes log(x) in double-double precision. - This is a natural logarithm (i.e., base e). */ -dd_real log(const dd_real &a) { - /* Strategy. The Taylor series for log converges much more - slowly than that of exp, due to the lack of the factorial - term in the denominator. Hence this routine instead tries - to determine the root of the function - - f(x) = exp(x) - a - - using Newton iteration. The iteration is given by - - x' = x - f(x)/f'(x) - = x - (1 - a * exp(-x)) - = x + a * exp(-x) - 1. - - Only one iteration is needed, since Newton's iteration - approximately doubles the number of digits per iteration. */ - - if (a.is_one()) { - return 0.0; - } - - if (a.x[0] <= 0.0) { - dd_real::error("(dd_real::log): Non-positive argument."); - return dd_real::_nan; - } - - dd_real x = std::log(a.x[0]); /* Initial approximation */ - - x = x + a * exp(-x) - 1.0; - return x; -} - -dd_real log10(const dd_real &a) { - return log(a) / dd_real::_log10; -} - -static const dd_real _pi16 = dd_real(1.963495408493620697e-01, - 7.654042494670957545e-18); - -/* Table of sin(k * pi/16) and cos(k * pi/16). */ -static const double sin_table [4][2] = { - {1.950903220161282758e-01, -7.991079068461731263e-18}, - {3.826834323650897818e-01, -1.005077269646158761e-17}, - {5.555702330196021776e-01, 4.709410940561676821e-17}, - {7.071067811865475727e-01, -4.833646656726456726e-17} -}; - -static const double cos_table [4][2] = { - {9.807852804032304306e-01, 1.854693999782500573e-17}, - {9.238795325112867385e-01, 1.764504708433667706e-17}, - {8.314696123025452357e-01, 1.407385698472802389e-18}, - {7.071067811865475727e-01, -4.833646656726456726e-17} -}; - -/* Computes sin(a) using Taylor series. - Assumes |a| <= pi/32. */ -static dd_real sin_taylor(const dd_real &a) { - const double thresh = 0.5 * std::abs(to_double(a)) * dd_real::_eps; - dd_real r, s, t, x; - - if (a.is_zero()) { - return 0.0; - } - - int i = 0; - x = -sqr(a); - s = a; - r = a; - do { - r *= x; - t = r * dd_real(inv_fact[i][0], inv_fact[i][1]); - s += t; - i += 2; - } while (i < n_inv_fact && std::abs(to_double(t)) > thresh); - - return s; -} - -static dd_real cos_taylor(const dd_real &a) { - const double thresh = 0.5 * dd_real::_eps; - dd_real r, s, t, x; - - if (a.is_zero()) { - return 1.0; - } - - x = -sqr(a); - r = x; - s = 1.0 + mul_pwr2(r, 0.5); - int i = 1; - do { - r *= x; - t = r * dd_real(inv_fact[i][0], inv_fact[i][1]); - s += t; - i += 2; - } while (i < n_inv_fact && std::abs(to_double(t)) > thresh); - - return s; -} - -static void sincos_taylor(const dd_real &a, - dd_real &sin_a, dd_real &cos_a) { - if (a.is_zero()) { - sin_a = 0.0; - cos_a = 1.0; - return; - } - - sin_a = sin_taylor(a); - cos_a = sqrt(1.0 - sqr(sin_a)); -} - - -dd_real sin(const dd_real &a) { - - /* Strategy. To compute sin(x), we choose integers a, b so that - - x = s + a * (pi/2) + b * (pi/16) - - and |s| <= pi/32. Using the fact that - - sin(pi/16) = 0.5 * sqrt(2 - sqrt(2 + sqrt(2))) - - we can compute sin(x) from sin(s), cos(s). This greatly - increases the convergence of the sine Taylor series. */ - - if (a.is_zero()) { - return 0.0; - } - - // approximately reduce modulo 2*pi - dd_real z = nint(a / dd_real::_2pi); - dd_real r = a - dd_real::_2pi * z; - - // approximately reduce modulo pi/2 and then modulo pi/16. - dd_real t; - double q = std::floor(r.x[0] / dd_real::_pi2.x[0] + 0.5); - t = r - dd_real::_pi2 * q; - int j = static_cast(q); - q = std::floor(t.x[0] / _pi16.x[0] + 0.5); - t -= _pi16 * q; - int k = static_cast(q); - int abs_k = std::abs(k); - - if (j < -2 || j > 2) { - dd_real::error("(dd_real::sin): Cannot reduce modulo pi/2."); - return dd_real::_nan; - } - - if (abs_k > 4) { - dd_real::error("(dd_real::sin): Cannot reduce modulo pi/16."); - return dd_real::_nan; - } - - if (k == 0) { - switch (j) { - case 0: - return sin_taylor(t); - case 1: - return cos_taylor(t); - case -1: - return -cos_taylor(t); - default: - return -sin_taylor(t); - } - } - - dd_real u(cos_table[abs_k-1][0], cos_table[abs_k-1][1]); - dd_real v(sin_table[abs_k-1][0], sin_table[abs_k-1][1]); - dd_real sin_t, cos_t; - sincos_taylor(t, sin_t, cos_t); - if (j == 0) { - if (k > 0) { - r = u * sin_t + v * cos_t; - } else { - r = u * sin_t - v * cos_t; - } - } else if (j == 1) { - if (k > 0) { - r = u * cos_t - v * sin_t; - } else { - r = u * cos_t + v * sin_t; - } - } else if (j == -1) { - if (k > 0) { - r = v * sin_t - u * cos_t; - } else if (k < 0) { - r = -u * cos_t - v * sin_t; - } - } else { - if (k > 0) { - r = -u * sin_t - v * cos_t; - } else { - r = v * cos_t - u * sin_t; - } - } - - return r; -} - -dd_real cos(const dd_real &a) { - - if (a.is_zero()) { - return 1.0; - } - - // approximately reduce modulo 2*pi - dd_real z = nint(a / dd_real::_2pi); - dd_real r = a - z * dd_real::_2pi; - - // approximately reduce modulo pi/2 and then modulo pi/16 - dd_real t; - double q = std::floor(r.x[0] / dd_real::_pi2.x[0] + 0.5); - t = r - dd_real::_pi2 * q; - int j = static_cast(q); - q = std::floor(t.x[0] / _pi16.x[0] + 0.5); - t -= _pi16 * q; - int k = static_cast(q); - int abs_k = std::abs(k); - - if (j < -2 || j > 2) { - dd_real::error("(dd_real::cos): Cannot reduce modulo pi/2."); - return dd_real::_nan; - } - - if (abs_k > 4) { - dd_real::error("(dd_real::cos): Cannot reduce modulo pi/16."); - return dd_real::_nan; - } - - if (k == 0) { - switch (j) { - case 0: - return cos_taylor(t); - case 1: - return -sin_taylor(t); - case -1: - return sin_taylor(t); - default: - return -cos_taylor(t); - } - } - - dd_real sin_t, cos_t; - sincos_taylor(t, sin_t, cos_t); - dd_real u(cos_table[abs_k-1][0], cos_table[abs_k-1][1]); - dd_real v(sin_table[abs_k-1][0], sin_table[abs_k-1][1]); - - if (j == 0) { - if (k > 0) { - r = u * cos_t - v * sin_t; - } else { - r = u * cos_t + v * sin_t; - } - } else if (j == 1) { - if (k > 0) { - r = - u * sin_t - v * cos_t; - } else { - r = v * cos_t - u * sin_t; - } - } else if (j == -1) { - if (k > 0) { - r = u * sin_t + v * cos_t; - } else { - r = u * sin_t - v * cos_t; - } - } else { - if (k > 0) { - r = v * sin_t - u * cos_t; - } else { - r = - u * cos_t - v * sin_t; - } - } - - return r; -} - -void sincos(const dd_real &a, dd_real &sin_a, dd_real &cos_a) { - - if (a.is_zero()) { - sin_a = 0.0; - cos_a = 1.0; - return; - } - - // approximately reduce modulo 2*pi - dd_real z = nint(a / dd_real::_2pi); - dd_real r = a - dd_real::_2pi * z; - - // approximately reduce module pi/2 and pi/16 - dd_real t; - double q = std::floor(r.x[0] / dd_real::_pi2.x[0] + 0.5); - t = r - dd_real::_pi2 * q; - int j = static_cast(q); - int abs_j = std::abs(j); - q = std::floor(t.x[0] / _pi16.x[0] + 0.5); - t -= _pi16 * q; - int k = static_cast(q); - int abs_k = std::abs(k); - - if (abs_j > 2) { - dd_real::error("(dd_real::sincos): Cannot reduce modulo pi/2."); - cos_a = sin_a = dd_real::_nan; - return; - } - - if (abs_k > 4) { - dd_real::error("(dd_real::sincos): Cannot reduce modulo pi/16."); - cos_a = sin_a = dd_real::_nan; - return; - } - - dd_real sin_t, cos_t; - dd_real s, c; - - sincos_taylor(t, sin_t, cos_t); - - if (abs_k == 0) { - s = sin_t; - c = cos_t; - } else { - dd_real u(cos_table[abs_k-1][0], cos_table[abs_k-1][1]); - dd_real v(sin_table[abs_k-1][0], sin_table[abs_k-1][1]); - - if (k > 0) { - s = u * sin_t + v * cos_t; - c = u * cos_t - v * sin_t; - } else { - s = u * sin_t - v * cos_t; - c = u * cos_t + v * sin_t; - } - } - - if (abs_j == 0) { - sin_a = s; - cos_a = c; - } else if (j == 1) { - sin_a = c; - cos_a = -s; - } else if (j == -1) { - sin_a = -c; - cos_a = s; - } else { - sin_a = -s; - cos_a = -c; - } - -} - -dd_real atan(const dd_real &a) { - return atan2(a, dd_real(1.0)); -} - -dd_real atan2(const dd_real &y, const dd_real &x) { - /* Strategy: Instead of using Taylor series to compute - arctan, we instead use Newton's iteration to solve - the equation - - sin(z) = y/r or cos(z) = x/r - - where r = sqrt(x^2 + y^2). - The iteration is given by - - z' = z + (y - sin(z)) / cos(z) (for equation 1) - z' = z - (x - cos(z)) / sin(z) (for equation 2) - - Here, x and y are normalized so that x^2 + y^2 = 1. - If |x| > |y|, then first iteration is used since the - denominator is larger. Otherwise, the second is used. - */ - - if (x.is_zero()) { - - if (y.is_zero()) { - /* Both x and y is zero. */ - dd_real::error("(dd_real::atan2): Both arguments zero."); - return dd_real::_nan; - } - - return (y.is_positive()) ? dd_real::_pi2 : -dd_real::_pi2; - } else if (y.is_zero()) { - return (x.is_positive()) ? dd_real(0.0) : dd_real::_pi; - } - - if (x == y) { - return (y.is_positive()) ? dd_real::_pi4 : -dd_real::_3pi4; - } - - if (x == -y) { - return (y.is_positive()) ? dd_real::_3pi4 : -dd_real::_pi4; - } - - dd_real r = sqrt(sqr(x) + sqr(y)); - dd_real xx = x / r; - dd_real yy = y / r; - - /* Compute double precision approximation to atan. */ - dd_real z = std::atan2(to_double(y), to_double(x)); - dd_real sin_z, cos_z; - - if (std::abs(xx.x[0]) > std::abs(yy.x[0])) { - /* Use Newton iteration 1. z' = z + (y - sin(z)) / cos(z) */ - sincos(z, sin_z, cos_z); - z += (yy - sin_z) / cos_z; - } else { - /* Use Newton iteration 2. z' = z - (x - cos(z)) / sin(z) */ - sincos(z, sin_z, cos_z); - z -= (xx - cos_z) / sin_z; - } - - return z; -} - -dd_real tan(const dd_real &a) { - dd_real s, c; - sincos(a, s, c); - return s/c; -} - -dd_real asin(const dd_real &a) { - dd_real abs_a = abs(a); - - if (abs_a > 1.0) { - dd_real::error("(dd_real::asin): Argument out of domain."); - return dd_real::_nan; - } - - if (abs_a.is_one()) { - return (a.is_positive()) ? dd_real::_pi2 : -dd_real::_pi2; - } - - return atan2(a, sqrt(1.0 - sqr(a))); -} - -dd_real acos(const dd_real &a) { - dd_real abs_a = abs(a); - - if (abs_a > 1.0) { - dd_real::error("(dd_real::acos): Argument out of domain."); - return dd_real::_nan; - } - - if (abs_a.is_one()) { - return (a.is_positive()) ? dd_real(0.0) : dd_real::_pi; - } - - return atan2(sqrt(1.0 - sqr(a)), a); -} - -dd_real sinh(const dd_real &a) { - if (a.is_zero()) { - return 0.0; - } - - if (abs(a) > 0.05) { - dd_real ea = exp(a); - return mul_pwr2(ea - inv(ea), 0.5); - } - - /* since a is small, using the above formula gives - a lot of cancellation. So use Taylor series. */ - dd_real s = a; - dd_real t = a; - dd_real r = sqr(t); - double m = 1.0; - double thresh = std::abs((to_double(a)) * dd_real::_eps); - - do { - m += 2.0; - t *= r; - t /= (m-1) * m; - - s += t; - } while (abs(t) > thresh); - - return s; - -} - -dd_real cosh(const dd_real &a) { - if (a.is_zero()) { - return 1.0; - } - - dd_real ea = exp(a); - return mul_pwr2(ea + inv(ea), 0.5); -} - -dd_real tanh(const dd_real &a) { - if (a.is_zero()) { - return 0.0; - } - - if (std::abs(to_double(a)) > 0.05) { - dd_real ea = exp(a); - dd_real inv_ea = inv(ea); - return (ea - inv_ea) / (ea + inv_ea); - } else { - dd_real s, c; - s = sinh(a); - c = sqrt(1.0 + sqr(s)); - return s / c; - } -} - -void sincosh(const dd_real &a, dd_real &s, dd_real &c) { - if (std::abs(to_double(a)) <= 0.05) { - s = sinh(a); - c = sqrt(1.0 + sqr(s)); - } else { - dd_real ea = exp(a); - dd_real inv_ea = inv(ea); - s = mul_pwr2(ea - inv_ea, 0.5); - c = mul_pwr2(ea + inv_ea, 0.5); - } -} - -dd_real asinh(const dd_real &a) { - return log(a + sqrt(sqr(a) + 1.0)); -} - -dd_real acosh(const dd_real &a) { - if (a < 1.0) { - dd_real::error("(dd_real::acosh): Argument out of domain."); - return dd_real::_nan; - } - - return log(a + sqrt(sqr(a) - 1.0)); -} - -dd_real atanh(const dd_real &a) { - if (abs(a) >= 1.0) { - dd_real::error("(dd_real::atanh): Argument out of domain."); - return dd_real::_nan; - } - - return mul_pwr2(log((1.0 + a) / (1.0 - a)), 0.5); -} - -QD_API dd_real fmod(const dd_real &a, const dd_real &b) { - dd_real n = aint(a / b); - return (a - b * n); -} - -QD_API dd_real ddrand() { - static const double m_const = 4.6566128730773926e-10; /* = 2^{-31} */ - double m = m_const; - dd_real r = 0.0; - double d; - - /* Strategy: Generate 31 bits at a time, using lrand48 - random number generator. Shift the bits, and reapeat - 4 times. */ - - for (int i = 0; i < 4; i++, m *= m_const) { -// d = lrand48() * m; - d = std::rand() * m; - r += d; - } - - return r; -} - -/* polyeval(c, n, x) - Evaluates the given n-th degree polynomial at x. - The polynomial is given by the array of (n+1) coefficients. */ -dd_real polyeval(const dd_real *c, int n, const dd_real &x) { - /* Just use Horner's method of polynomial evaluation. */ - dd_real r = c[n]; - - for (int i = n-1; i >= 0; i--) { - r *= x; - r += c[i]; - } - - return r; -} - -/* polyroot(c, n, x0) - Given an n-th degree polynomial, finds a root close to - the given guess x0. Note that this uses simple Newton - iteration scheme, and does not work for multiple roots. */ -QD_API dd_real polyroot(const dd_real *c, int n, - const dd_real &x0, int max_iter, double thresh) { - dd_real x = x0; - dd_real f; - dd_real *d = new dd_real[n]; - bool conv = false; - int i; - double max_c = std::abs(to_double(c[0])); - double v; - - if (thresh == 0.0) thresh = dd_real::_eps; - - /* Compute the coefficients of the derivatives. */ - for (i = 1; i <= n; i++) { - v = std::abs(to_double(c[i])); - if (v > max_c) max_c = v; - d[i-1] = c[i] * static_cast(i); - } - thresh *= max_c; - - /* Newton iteration. */ - for (i = 0; i < max_iter; i++) { - f = polyeval(c, n, x); - - if (abs(f) < thresh) { - conv = true; - break; - } - x -= (f / polyeval(d, n-1, x)); - } - delete [] d; - - if (!conv) { - dd_real::error("(dd_real::polyroot): Failed to converge."); - return dd_real::_nan; - } - - return x; -} - - -/* Constructor. Reads a double-double number from the string s - and constructs a double-double number. */ -dd_real::dd_real(const char *s) { - if (dd_real::read(s, *this)) { - dd_real::error("(dd_real::dd_real): INPUT ERROR."); - *this = dd_real::_nan; - } -} - -dd_real &dd_real::operator=(const char *s) { - if (dd_real::read(s, *this)) { - dd_real::error("(dd_real::operator=): INPUT ERROR."); - *this = dd_real::_nan; - } - return *this; -} - -/* Outputs the double-double number dd. */ -ostream &operator<<(ostream &os, const dd_real &dd) { - bool showpos = (os.flags() & ios_base::showpos) != 0; - bool uppercase = (os.flags() & ios_base::uppercase) != 0; - return os << dd.to_string((int)os.precision(), (int)os.width(), os.flags(), - showpos, uppercase, os.fill()); -} - -/* Reads in the double-double number a. */ -istream &operator>>(istream &s, dd_real &a) { - char str[255]; - s >> str; - a = dd_real(str); - return s; -} - -void dd_real::to_digits(char *s, int &expn, int precision) const { - int D = precision + 1; /* number of digits to compute */ - - dd_real r = abs(*this); - int e; /* exponent */ - int i, d; - - if (x[0] == 0.0) { - /* this == 0.0 */ - expn = 0; - for (i = 0; i < precision; i++) s[i] = '0'; - return; - } - - /* First determine the (approximate) exponent. */ - e = to_int(std::floor(std::log10(std::abs(x[0])))); - - if (e < -300) { - r *= dd_real(10.0) ^ 300; - r /= dd_real(10.0) ^ (e + 300); - } else if (e > 300) { - r = ldexp(r, -53); - r /= dd_real(10.0) ^ e; - r = ldexp(r, 53); - } else { - r /= dd_real(10.0) ^ e; - } - - /* Fix exponent if we are off by one */ - if (r >= 10.0) { - r /= 10.0; - e++; - } else if (r < 1.0) { - r *= 10.0; - e--; - } - - if (r >= 10.0 || r < 1.0) { - dd_real::error("(dd_real::to_digits): can't compute exponent."); - return; - } - - /* Extract the digits */ - for (i = 0; i < D; i++) { - d = static_cast(r.x[0]); - r -= d; - r *= 10.0; - - s[i] = static_cast(d + '0'); - } - - /* Fix out of range digits. */ - for (i = D-1; i > 0; i--) { - if (s[i] < '0') { - s[i-1]--; - s[i] += 10; - } else if (s[i] > '9') { - s[i-1]++; - s[i] -= 10; - } - } - - if (s[0] <= '0') { - dd_real::error("(dd_real::to_digits): non-positive leading digit."); - return; - } - - /* Round, handle carry */ - if (s[D-1] >= '5') { - s[D-2]++; - - i = D-2; - while (i > 0 && s[i] > '9') { - s[i] -= 10; - s[--i]++; - } - } - - /* If first digit is 10, shift everything. */ - if (s[0] > '9') { - e++; - for (i = precision; i >= 2; i--) s[i] = s[i-1]; - s[0] = '1'; - s[1] = '0'; - } - - s[precision] = 0; - expn = e; -} - -/* Writes the double-double number into the character array s of length len. - The integer d specifies how many significant digits to write. - The string s must be able to hold at least (d+8) characters. - showpos indicates whether to use the + sign, and uppercase indicates - whether the E or e is to be used for the exponent. */ -void dd_real::write(char *s, int len, int precision, - bool showpos, bool uppercase) const { - string str = to_string(precision, 0, ios_base::scientific, showpos, uppercase); - std::strncpy(s, str.c_str(), len-1); - s[len-1] = 0; -} - - -void round_string(char *s, int precision, int *offset){ - /* - Input string must be all digits or errors will occur. - */ - - int i; - int D = precision ; - - /* Round, handle carry */ - if (D>0 && s[D] >= '5') { - s[D-1]++; - - i = D-1; - while (i > 0 && s[i] > '9') { - s[i] -= 10; - s[--i]++; - } - } - - /* If first digit is 10, shift everything. */ - if (s[0] > '9') { - // e++; // don't modify exponent here - for (i = precision; i >= 1; i--) s[i+1] = s[i]; - s[0] = '1'; - s[1] = '0'; - - (*offset)++ ; // now offset needs to be increased by one - precision++ ; - } - - s[precision] = 0; // add terminator for array -} - -string dd_real::to_string(int precision, int width, ios_base::fmtflags fmt, - bool showpos, bool uppercase, char fill) const { - string s; - bool fixed = (fmt & ios_base::fixed) != 0; - bool sgn = true; - int i, e = 0; - - if (isnan()) { - s = uppercase ? "NAN" : "nan"; - sgn = false; - } else { - if (*this < 0.0) - s += '-'; - else if (showpos) - s += '+'; - else - sgn = false; - - if (isinf()) { - s += uppercase ? "INF" : "inf"; - } else if (*this == 0.0) { - /* Zero case */ - s += '0'; - if (precision > 0) { - s += '.'; - s.append(precision, '0'); - } - } else { - /* Non-zero case */ - int off = (fixed ? (1 + to_int(floor(log10(abs(*this))))) : 1); - int d = precision + off; - - int d_with_extra = d; - if(fixed) - d_with_extra = std::max(60, d); // longer than the max accuracy for DD - - // highly special case - fixed mode, precision is zero, abs(*this) < 1.0 - // without this trap a number like 0.9 printed fixed with 0 precision prints as 0 - // should be rounded to 1. - if(fixed && (precision == 0) && (abs(*this) < 1.0)){ - if(abs(*this) >= 0.5) - s += '1'; - else - s += '0'; - - return s; - } - - // handle near zero to working precision (but not exactly zero) - if (fixed && d <= 0) { - s += '0'; - if (precision > 0) { - s += '.'; - s.append(precision, '0'); - } - } else { // default - - char *t; // = new char[d+1]; - int j; - - if(fixed){ - t = new char[d_with_extra+1]; - to_digits(t, e, d_with_extra); - } - else{ - t = new char[d+1]; - to_digits(t, e, d); - } - - off = e + 1; - - if (fixed) { - // fix the string if it's been computed incorrectly - // round here in the decimal string if required - round_string(t, d, &off); - - if (off > 0) { - for (i = 0; i < off; i++) s += t[i]; - if (precision > 0) { - s += '.'; - for (j = 0; j < precision; j++, i++) s += t[i]; - } - } else { - s += "0."; - if (off < 0) s.append(-off, '0'); - for (i = 0; i < d; i++) s += t[i]; - } - } else { - s += t[0]; - if (precision > 0) s += '.'; - - for (i = 1; i <= precision; i++) - s += t[i]; - - } - delete [] t; - } - } - - // trap for improper offset with large values - // without this trap, output of values of the for 10^j - 1 fail for j > 28 - // and are output with the point in the wrong place, leading to a dramatically off value - if(fixed && (precision > 0)){ - // make sure that the value isn't dramatically larger - double from_string = atof(s.c_str()); - - // if this ratio is large, then we've got problems - if( fabs( from_string / this->x[0] ) > 3.0 ){ - - // loop on the string, find the point, move it up one - // don't act on the first character - for(i=1; i < (int)s.length(); i++){ - if(s[i] == '.'){ - s[i] = s[i-1] ; - s[i-1] = '.' ; - break; - } - } - - from_string = atof(s.c_str()); - // if this ratio is large, then the string has not been fixed - if( fabs( from_string / this->x[0] ) > 3.0 ){ - dd_real::error("Re-rounding unsuccessful in large number fixed point trap.") ; - } - } - } - - - if (!fixed && !isinf()) { - /* Fill in exponent part */ - s += uppercase ? 'E' : 'e'; - append_expn(s, e); - } - } - - /* Fill in the blanks */ - int len = s.length(); - if (len < width) { - int delta = width - len; - if (fmt & ios_base::internal) { - if (sgn) - s.insert(static_cast(1), delta, fill); - else - s.insert(static_cast(0), delta, fill); - } else if (fmt & ios_base::left) { - s.append(delta, fill); - } else { - s.insert(static_cast(0), delta, fill); - } - } - - return s; -} - -/* Reads in a double-double number from the string s. */ -int dd_real::read(const char *s, dd_real &a) { - const char *p = s; - char ch; - int sign = 0; - int point = -1; - int nd = 0; - int e = 0; - bool done = false; - dd_real r = 0.0; - int nread; - - /* Skip any leading spaces */ - while (*p == ' ') - p++; - - while (!done && (ch = *p) != '\0') { - if (ch >= '0' && ch <= '9') { - int d = ch - '0'; - r *= 10.0; - r += static_cast(d); - nd++; - } else { - - switch (ch) { - - case '.': - if (point >= 0) - return -1; - point = nd; - break; - - case '-': - case '+': - if (sign != 0 || nd > 0) - return -1; - sign = (ch == '-') ? -1 : 1; - break; - - case 'E': - case 'e': - nread = std::sscanf(p+1, "%d", &e); - done = true; - if (nread != 1) - return -1; - break; - - default: - return -1; - } - } - - p++; - } - - if (point >= 0) { - e -= (nd - point); - } - - if (e != 0) { - r *= (dd_real(10.0) ^ e); - } - - a = (sign == -1) ? -r : r; - return 0; -} - -/* Debugging routines */ -void dd_real::dump(const string &name, std::ostream &os) const { - std::ios_base::fmtflags old_flags = os.flags(); - std::streamsize old_prec = os.precision(19); - os << std::scientific; - - if (name.length() > 0) os << name << " = "; - os << "[ " << setw(27) << x[0] << ", " << setw(27) << x[1] << " ]" << endl; - - os.precision(old_prec); - os.flags(old_flags); -} - -void dd_real::dump_bits(const string &name, std::ostream &os) const { - string::size_type len = name.length(); - if (len > 0) { - os << name << " = "; - len +=3; - } - os << "[ "; - len += 2; - print_double_info(os, x[0]); - os << endl; - for (string::size_type i = 0; i < len; i++) os << ' '; - print_double_info(os, x[1]); - os << " ]" << endl; -} - -dd_real dd_real::debug_rand() { - - if (std::rand() % 2 == 0) - return ddrand(); - - int expn = 0; - dd_real a = 0.0; - double d; - for (int i = 0; i < 2; i++) { - d = std::ldexp(static_cast(std::rand()) / RAND_MAX, -expn); - a += d; - expn = expn + 54 + std::rand() % 200; - } - return a; -} diff --git a/src/external/PackedCSparse/qd/dd_real.h b/src/external/PackedCSparse/qd/dd_real.h deleted file mode 100644 index e16438aa..00000000 --- a/src/external/PackedCSparse/qd/dd_real.h +++ /dev/null @@ -1,293 +0,0 @@ -/* - * include/dd_real.h - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2007 - * - * Double-double precision (>= 106-bit significand) floating point - * arithmetic package based on David Bailey's Fortran-90 double-double - * package, with some changes. See - * - * http://www.nersc.gov/~dhbailey/mpdist/mpdist.html - * - * for the original Fortran-90 version. - * - * Overall structure is similar to that of Keith Brigg's C++ double-double - * package. See - * - * http://www-epidem.plansci.cam.ac.uk/~kbriggs/doubledouble.html - * - * for more details. In particular, the fix for x86 computers is borrowed - * from his code. - * - * Yozo Hida - */ - -#ifndef _QD_DD_REAL_H -#define _QD_DD_REAL_H - -#include -#include -#include -#include -#include "qd_config.h" -#include "fpu.h" - -// Some compilers define isnan, isfinite, and isinf as macros, even for -// C++ codes, which cause havoc when overloading these functions. We undef -// them here. -#ifdef isnan -#undef isnan -#endif - -#ifdef isfinite -#undef isfinite -#endif - -#ifdef isinf -#undef isinf -#endif - -#ifdef max -#undef max -#endif - -#ifdef min -#undef min -#endif - -struct QD_API dd_real { - double x[2]; - - dd_real(double hi, double lo) { x[0] = hi; x[1] = lo; } - dd_real() {x[0] = 0.0; x[1] = 0.0; } - dd_real(double h) { x[0] = h; x[1] = 0.0; } - dd_real(int h) { - x[0] = (static_cast(h)); - x[1] = 0.0; - } - - dd_real (const char *s); - explicit dd_real (const double *d) { - x[0] = d[0]; x[1] = d[1]; - } - - static void error(const char *msg); - - double _hi() const { return x[0]; } - double _lo() const { return x[1]; } - - static const dd_real _2pi; - static const dd_real _pi; - static const dd_real _3pi4; - static const dd_real _pi2; - static const dd_real _pi4; - static const dd_real _e; - static const dd_real _log2; - static const dd_real _log10; - static const dd_real _nan; - static const dd_real _inf; - - static const double _eps; - static const double _min_normalized; - static const dd_real _max; - static const dd_real _safe_max; - static const int _ndigits; - - bool isnan() const { return QD_ISNAN(x[0]) || QD_ISNAN(x[1]); } - bool isfinite() const { return QD_ISFINITE(x[0]); } - bool isinf() const { return QD_ISINF(x[0]); } - - static dd_real add(double a, double b); - static dd_real ieee_add(const dd_real &a, const dd_real &b); - static dd_real sloppy_add(const dd_real &a, const dd_real &b); - - dd_real &operator+=(double a); - dd_real &operator+=(const dd_real &a); - - static dd_real sub(double a, double b); - - dd_real &operator-=(double a); - dd_real &operator-=(const dd_real &a); - - dd_real operator-() const; - - static dd_real mul(double a, double b); - - dd_real &operator*=(double a); - dd_real &operator*=(const dd_real &a); - - static dd_real div(double a, double b); - static dd_real sloppy_div(const dd_real &a, const dd_real &b); - static dd_real accurate_div(const dd_real &a, const dd_real &b); - - dd_real &operator/=(double a); - dd_real &operator/=(const dd_real &a); - - dd_real &operator=(double a); - dd_real &operator=(const char *s); - - dd_real operator^(int n); - static dd_real sqr(double d); - - static dd_real sqrt(double a); - - bool is_zero() const; - bool is_one() const; - bool is_positive() const; - bool is_negative() const; - - explicit operator bool() const; // new - explicit operator double() const; // new - - static dd_real rand(void); - - void to_digits(char *s, int &expn, int precision = _ndigits) const; - void write(char *s, int len, int precision = _ndigits, - bool showpos = false, bool uppercase = false) const; - std::string to_string(int precision = _ndigits, int width = 0, - std::ios_base::fmtflags fmt = static_cast(0), - bool showpos = false, bool uppercase = false, char fill = ' ') const; - int read(const char *s, dd_real &a); - - /* Debugging Methods */ - void dump(const std::string &name, std::ostream &os = std::cerr) const; - void dump_bits(const std::string &name, - std::ostream &os = std::cerr) const; - - static dd_real debug_rand(); -}; - - -namespace std { - template <> - class numeric_limits : public numeric_limits { - public: - inline static double epsilon() { return dd_real::_eps; } - inline static dd_real max() { return dd_real::_max; } - inline static dd_real safe_max() { return dd_real::_safe_max; } - inline static double min() { return dd_real::_min_normalized; } - static const int digits = 104; - static const int digits10 = 31; - }; -} - -QD_API dd_real ddrand(void); -QD_API dd_real sqrt(const dd_real &a); - -QD_API dd_real polyeval(const dd_real *c, int n, const dd_real &x); -QD_API dd_real polyroot(const dd_real *c, int n, - const dd_real &x0, int max_iter = 32, double thresh = 0.0); - -QD_API inline bool isnan(const dd_real &a) { return a.isnan(); } -QD_API inline bool isfinite(const dd_real &a) { return a.isfinite(); } -QD_API inline bool isinf(const dd_real &a) { return a.isinf(); } - -/* Computes dd * d where d is known to be a power of 2. */ -QD_API dd_real mul_pwr2(const dd_real &dd, double d); - -QD_API dd_real operator+(const dd_real &a, double b); -QD_API dd_real operator+(double a, const dd_real &b); -QD_API dd_real operator+(const dd_real &a, const dd_real &b); - -QD_API dd_real operator-(const dd_real &a, double b); -QD_API dd_real operator-(double a, const dd_real &b); -QD_API dd_real operator-(const dd_real &a, const dd_real &b); - -QD_API dd_real operator*(const dd_real &a, double b); -QD_API dd_real operator*(double a, const dd_real &b); -QD_API dd_real operator*(const dd_real &a, const dd_real &b); - -QD_API dd_real operator/(const dd_real &a, double b); -QD_API dd_real operator/(double a, const dd_real &b); -QD_API dd_real operator/(const dd_real &a, const dd_real &b); - -QD_API dd_real inv(const dd_real &a); - -QD_API dd_real rem(const dd_real &a, const dd_real &b); -QD_API dd_real drem(const dd_real &a, const dd_real &b); -QD_API dd_real divrem(const dd_real &a, const dd_real &b, dd_real &r); - -QD_API dd_real pow(const dd_real &a, int n); -QD_API dd_real pow(const dd_real &a, const dd_real &b); -QD_API dd_real npwr(const dd_real &a, int n); -QD_API dd_real sqr(const dd_real &a); - -QD_API dd_real sqrt(const dd_real &a); -QD_API dd_real nroot(const dd_real &a, int n); - -QD_API bool operator==(const dd_real &a, double b); -QD_API bool operator==(double a, const dd_real &b); -QD_API bool operator==(const dd_real &a, const dd_real &b); - -QD_API bool operator<=(const dd_real &a, double b); -QD_API bool operator<=(double a, const dd_real &b); -QD_API bool operator<=(const dd_real &a, const dd_real &b); - -QD_API bool operator>=(const dd_real &a, double b); -QD_API bool operator>=(double a, const dd_real &b); -QD_API bool operator>=(const dd_real &a, const dd_real &b); - -QD_API bool operator<(const dd_real &a, double b); -QD_API bool operator<(double a, const dd_real &b); -QD_API bool operator<(const dd_real &a, const dd_real &b); - -QD_API bool operator>(const dd_real &a, double b); -QD_API bool operator>(double a, const dd_real &b); -QD_API bool operator>(const dd_real &a, const dd_real &b); - -QD_API bool operator!=(const dd_real &a, double b); -QD_API bool operator!=(double a, const dd_real &b); -QD_API bool operator!=(const dd_real &a, const dd_real &b); - -QD_API dd_real nint(const dd_real &a); -QD_API dd_real floor(const dd_real &a); -QD_API dd_real ceil(const dd_real &a); -QD_API dd_real aint(const dd_real &a); - -QD_API dd_real ddrand(void); - -double to_double(const dd_real &a); -int to_int(const dd_real &a); - -QD_API dd_real exp(const dd_real &a); -QD_API dd_real ldexp(const dd_real &a, int exp); -QD_API dd_real log(const dd_real &a); -QD_API dd_real log10(const dd_real &a); - -QD_API dd_real sin(const dd_real &a); -QD_API dd_real cos(const dd_real &a); -QD_API dd_real tan(const dd_real &a); -QD_API void sincos(const dd_real &a, dd_real &sin_a, dd_real &cos_a); - -QD_API dd_real asin(const dd_real &a); -QD_API dd_real acos(const dd_real &a); -QD_API dd_real atan(const dd_real &a); -QD_API dd_real atan2(const dd_real &y, const dd_real &x); - -QD_API dd_real sinh(const dd_real &a); -QD_API dd_real cosh(const dd_real &a); -QD_API dd_real tanh(const dd_real &a); -QD_API void sincosh(const dd_real &a, - dd_real &sinh_a, dd_real &cosh_a); - -QD_API dd_real asinh(const dd_real &a); -QD_API dd_real acosh(const dd_real &a); -QD_API dd_real atanh(const dd_real &a); - -QD_API dd_real fabs(const dd_real &a); -QD_API dd_real abs(const dd_real &a); /* same as fabs */ - -QD_API dd_real fmod(const dd_real &a, const dd_real &b); - -QD_API std::ostream& operator<<(std::ostream &s, const dd_real &a); -QD_API std::istream& operator>>(std::istream &s, dd_real &a); -#ifdef QD_INLINE -#include "dd_inline.h" -#endif - -#endif /* _QD_DD_REAL_H */ - diff --git a/src/external/PackedCSparse/qd/fpu.cc b/src/external/PackedCSparse/qd/fpu.cc deleted file mode 100644 index 96ddc488..00000000 --- a/src/external/PackedCSparse/qd/fpu.cc +++ /dev/null @@ -1,124 +0,0 @@ -/* - * src/fpu.cc - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2001 - * - * Contains functions to set and restore the round-to-double flag in the - * control word of a x86 FPU. - */ - -#include "qd_config.h" -#include "fpu.h" - -#ifdef X86 -#ifdef _WIN32 -#include -#else - -#ifdef HAVE_FPU_CONTROL_H -#include -#endif - -#ifndef _FPU_GETCW -#define _FPU_GETCW(x) asm volatile ("fnstcw %0":"=m" (x)); -#endif - -#ifndef _FPU_SETCW -#define _FPU_SETCW(x) asm volatile ("fldcw %0": :"m" (x)); -#endif - -#ifndef _FPU_EXTENDED -#define _FPU_EXTENDED 0x0300 -#endif - -#ifndef _FPU_DOUBLE -#define _FPU_DOUBLE 0x0200 -#endif - -#endif -#endif /* X86 */ - -extern "C" { - -void fpu_fix_start(unsigned int *old_cw) { -#ifdef X86 -#ifdef _WIN32 -#ifdef __BORLANDC__ - /* Win 32 Borland C */ - unsigned short cw = _control87(0, 0); - _control87(0x0200, 0x0300); - if (old_cw) { - *old_cw = cw; - } -#else - /* Win 32 MSVC */ - unsigned int cw = _control87(0, 0); - _control87(0x00010000, 0x00030000); - if (old_cw) { - *old_cw = cw; - } -#endif -#else - /* Linux */ - volatile unsigned short cw, new_cw; - _FPU_GETCW(cw); - - new_cw = (cw & ~_FPU_EXTENDED) | _FPU_DOUBLE; - _FPU_SETCW(new_cw); - - if (old_cw) { - *old_cw = cw; - } -#endif -#endif -} - -void fpu_fix_end(unsigned int *old_cw) { -#ifdef X86 -#ifdef _WIN32 - -#ifdef __BORLANDC__ - /* Win 32 Borland C */ - if (old_cw) { - unsigned short cw = (unsigned short) *old_cw; - _control87(cw, 0xFFFF); - } -#else - /* Win 32 MSVC */ - if (old_cw) { - _control87(*old_cw, 0xFFFFFFFF); - } -#endif - -#else - /* Linux */ - if (old_cw) { - int cw; - cw = *old_cw; - _FPU_SETCW(cw); - } -#endif -#endif -} - -#ifdef HAVE_FORTRAN - -#define f_fpu_fix_start FC_FUNC_(f_fpu_fix_start, F_FPU_FIX_START) -#define f_fpu_fix_end FC_FUNC_(f_fpu_fix_end, F_FPU_FIX_END) - -void f_fpu_fix_start(unsigned int *old_cw) { - fpu_fix_start(old_cw); -} - -void f_fpu_fix_end(unsigned int *old_cw) { - fpu_fix_end(old_cw); -} - -#endif - -} - diff --git a/src/external/PackedCSparse/qd/fpu.h b/src/external/PackedCSparse/qd/fpu.h deleted file mode 100644 index 35eab18c..00000000 --- a/src/external/PackedCSparse/qd/fpu.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * include/fpu.h - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2001 - * - * Contains functions to set and restore the round-to-double flag in the - * control word of a x86 FPU. The algorithms in the double-double and - * quad-double package does not function with the extended mode found in - * these FPU. - */ -#ifndef _QD_FPU_H -#define _QD_FPU_H - -#include "qd_config.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Set the round-to-double flag, and save the old control word in old_cw. - * If old_cw is NULL, the old control word is not saved. - */ -QD_API void fpu_fix_start(unsigned int *old_cw); - -/* - * Restore the control word. - */ -QD_API void fpu_fix_end(unsigned int *old_cw); - -#ifdef __cplusplus -} -#endif - -#endif /* _QD_FPU_H */ diff --git a/src/external/PackedCSparse/qd/inline.h b/src/external/PackedCSparse/qd/inline.h deleted file mode 100644 index 52425545..00000000 --- a/src/external/PackedCSparse/qd/inline.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * include/inline.h - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2001 - * - * This file contains the basic functions used both by double-double - * and quad-double package. These are declared as inline functions as - * they are the smallest building blocks of the double-double and - * quad-double arithmetic. - */ -#ifndef _QD_INLINE_H -#define _QD_INLINE_H - -#define _QD_SPLITTER 134217729.0 // = 2^27 + 1 -#define _QD_SPLIT_THRESH 6.69692879491417e+299 // = 2^996 - -#ifdef QD_VACPP_BUILTINS_H -/* For VisualAge C++ __fmadd */ -#include -#endif - -#include -#include - -namespace qd { - -static const double _d_nan = std::numeric_limits::quiet_NaN(); -static const double _d_inf = std::numeric_limits::infinity(); - -/*********** Basic Functions ************/ -/* Computes fl(a+b) and err(a+b). Assumes |a| >= |b|. */ -inline double quick_two_sum(double a, double b, double &err) { - double s = a + b; - err = b - (s - a); - return s; -} - -/* Computes fl(a-b) and err(a-b). Assumes |a| >= |b| */ -inline double quick_two_diff(double a, double b, double &err) { - double s = a - b; - err = (a - s) - b; - return s; -} - -/* Computes fl(a+b) and err(a+b). */ -inline double two_sum(double a, double b, double &err) { - double s = a + b; - double bb = s - a; - err = (a - (s - bb)) + (b - bb); - return s; -} - -/* Computes fl(a-b) and err(a-b). */ -inline double two_diff(double a, double b, double &err) { - double s = a - b; - double bb = s - a; - err = (a - (s - bb)) - (b + bb); - return s; -} - -#ifndef QD_FMS -/* Computes high word and lo word of a */ -inline void split(double a, double &hi, double &lo) { - double temp; - if (a > _QD_SPLIT_THRESH || a < -_QD_SPLIT_THRESH) { - a *= 3.7252902984619140625e-09; // 2^-28 - temp = _QD_SPLITTER * a; - hi = temp - (temp - a); - lo = a - hi; - hi *= 268435456.0; // 2^28 - lo *= 268435456.0; // 2^28 - } else { - temp = _QD_SPLITTER * a; - hi = temp - (temp - a); - lo = a - hi; - } -} -#endif - -/* Computes fl(a*b) and err(a*b). */ -inline double two_prod(double a, double b, double &err) { -#ifdef QD_FMS - double p = a * b; - err = QD_FMS(a, b, p); - return p; -#else - double a_hi, a_lo, b_hi, b_lo; - double p = a * b; - split(a, a_hi, a_lo); - split(b, b_hi, b_lo); - err = ((a_hi * b_hi - p) + a_hi * b_lo + a_lo * b_hi) + a_lo * b_lo; - return p; -#endif -} - -/* Computes fl(a*a) and err(a*a). Faster than the above method. */ -inline double two_sqr(double a, double &err) { -#ifdef QD_FMS - double p = a * a; - err = QD_FMS(a, a, p); - return p; -#else - double hi, lo; - double q = a * a; - split(a, hi, lo); - err = ((hi * hi - q) + 2.0 * hi * lo) + lo * lo; - return q; -#endif -} - -/* Computes the nearest integer to d. */ -inline double nint(double d) { - if (d == std::floor(d)) - return d; - return std::floor(d + 0.5); -} - -/* Computes the truncated integer. */ -inline double aint(double d) { - return (d >= 0.0) ? std::floor(d) : std::ceil(d); -} - -/* These are provided to give consistent - interface for double with double-double and quad-double. */ -inline void sincosh(double t, double &sinh_t, double &cosh_t) { - sinh_t = std::sinh(t); - cosh_t = std::cosh(t); -} - -inline double sqr(double t) { - return t * t; -} - -inline double to_double(double a) { return a; } -inline int to_int(double a) { return static_cast(a); } - -} - -#endif /* _QD_INLINE_H */ diff --git a/src/external/PackedCSparse/qd/qd.pdf b/src/external/PackedCSparse/qd/qd.pdf deleted file mode 100644 index 9525b8cac490f4c3229bc7074e37075cebe7eae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194502 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 SmE72tYykD$gkxvSUpTr@w^W=dn^OhAde zm79;wig~eXui{2&FBM|$d8cg)bi?WrF3hc*4xU|{j4?lv$mq7kg2qEJOfb&sh)Z$r zBt(KiXUfKEt&WW^nkO3ze*ij2st_i&#{b89{b%=IyY^p`_TQD6g@qC7|7c8{|I5oU zGyLC}xf`u5$89#GnoTjE5uU^>B4FpE&vTBnnN%mIQY!cfzIDgzcA^ni>zoSRwxV<$c-&!8h~@uNVtT(vIP1<|O*5M){SZ&IOz2g?GpAIVU9(cr^qJR>SrMb&j}` zqRr+>e*fM-|AproV6c$lv-BMZgPyA1N^EHWi>t~s3ex<*Y2j{P-Sv;gjUIIKwR>w$ z9s;`LaI5GBbGH?9+ZrVnm^D>ezNg)$e0l0fTKjK#5;z49(j+V6+z0|uVw-ex!psqQ ztbPnZM6~(q}^1p((}L-qK|hDa^xlWWAC z7UAxmK|&Why#tIGhgt?|ZC~w5DvSe&c|bB=-&b>%zO{ZTNkFbF*QI&YK{Z7i?DxXx zIxkiMix~4u{DuZ5!&3|a1$e|)#1uI<57~w`xA5wbHwi5PTu!=!R%8ude${$@<@J&d z^V-p7WL#YzV#}0peW5+$@CY!f{xtw|20rPPF?mJ#COWcWR6U;A7O@qul34=S)z3>{ zkK}~*UP$OC9Tvhp8;e0N7K3SAcQ{2YhG}078yo+!x-KQ!8RzAN{-%v0Z)cgftp+d` zo*PCA>-?aGS3G{og3&Kk2klipFG`}K;JFc<$nd6!FSfcdCXB`a>hNTm*N^d()-8VU z9s`cte#IO^yD=e+umoB*+lGqq3kf5g7ZCHD#X%x^O4_7=S5W@LYzJgi`-ULVo@x7S zlFKvh2v4wl1+2yei=+J?L7hcI0wFHlsRCO7uFw^1{x*@WjG}p(0pf;>98DFj7ELxN z*rbOzg=kW6b@CJ5%RlbISJ#Nm-S(x;=4NI(gIK}&UAXI8id~Dqc%!N2DXIF6eb=Z% z>v7Qs_K38JM$bIxI+9-S$UF0lUIP_57l;2`w$ah0KZ0lg!y2J=E`T{q2b-j_5t1(( z=eM`qVgEHPEThx65^t3Ul8kRQ@X%Di36VHoa7B>EnSmv=4(oIVUg2_jX3m49wFGM! zF*Der9PJZHo8d#wqL80nWImi^a%yLUjk9DN;d8YI^V1Jx5Zj^6#if@TgHa`@F}-MZ ziTot8i8OQ4KU^`pqzpKoa9ZM@3O0L>E}g(fR1$Af(6*qDORt!*A~Lf z>2&VQr6;_9C-E=SLQ=Y2oW>C`;|7dS4R>w~-K%ts(6k@!#Ob&ILky;4owu&%T||Q4 zb(xj_*f}#B3@`)Zp1#nd#>nTw&iSkPYKqVTE2o_K1BR|-;l<18>?e@xKwj2?X7?%v zv&si=og=Jr{vA6{91v{ZPjir+8J=czTxa+Y;zcsEL;%a>)I0NePeI;9T?5c|I-Qsq zA-u~R+yuA-9S*3$14>ryTTApjMt?STwQP^@{i<^ClwP;KYawef+191Ke5=d3rIs1k zD2X2nZOE|6{HaAjPIl9_wVE{Ke}cTtebsC2u?fL(V>WIbI_=!O2B`9oBY}#yei(uV zWrP6K3OD}+1wp&@cM{g8wx}O?rVwt6DcPft!+B0Ky3Ky2?bC;dc2;Y&SXX0*N0PFW zG65J*p;XRU8eA;|d;1$Q6Oo31qWZEpCQc`RU6H09>(1j2@1`uZ#F#@IqqqqNiRqj& zFSO^at^4l8RM@$d1Jb*yb<1yTs6f(V7E)VFp9xEY}IVv;ti* zSC$~7nwAyHp7ORbOyj01gBffmWXxlb;7b;64OUDrNyo1qr*^XWHQ=V@HST^p9`^^S zzJ4T~JZLq8FDy&Eh(CEc>QhG-6O~PejfgXZh4w}*vMoko8B)fNbK)dEk2~vfP9F&d zK5w)&$quOTNOU5W69v<=9<*vB!vcLEm2j!AH!=F6v?pu7*jf9{((AHgK>zWP5o&R7<5_Lrb4Gz`*O;+_3jh;SMulg{kUuPXLI-O=NGT*5Bz;^$;jkIz(XE*3SXT8T~@MnY? z4bFHjO6ZDZ_vC=C=;q+zq-q}z@mD$RnN2R#6y)a-{S>yc8|f@bIdX9v2#@Ve|TdA- z`;#r=(YSp`7lR_w{Jm%e&63$3o zx(`9C$0PF#wjKqjxjZ*pnW>1q*Tvpzwy4Hx-^Gqk-S1wl2e}@kE<`+FfBqq!Lkeps80u!vV9y z<^;vB_MY$2;xVrEOpFpv*sWu^{|(@bP!`hlQO+oe^#x6mnn;i8Mu4ZQ4;1wYI8%%G z2Wy&MXhckTSdEr4Ev&MC)251=i~6BfOwl`^6*64QBf!DR+{7x-&Iw#6JO{Dj86W6N zREIBvx^K}Eu%yvrv41Fv8*u&t7kmmYMo9!r=;6)-mMsM|WNt9d|5B%Bkt1n_sTP9x zix=j+m|#VJ-q0({Gst!%%Ic^S=Ep8xbc%|&>V=ho)4Ckhz|mx?V8;bpI5tCx2jB0G z;t?iyxsn&yeyAHcY3&iAsQ{XyJDg4H~K<~dsNCX=E$CwQQ(wpq+H2x6+T z%Wp9xAK5hotd8C-Hw#rLpshSM;U0V?JJl_js5X^a%-@xj-vIfMO!|$m5@f#W!khKR zRe(G}DFMPbY+NK)O9CM~iX8q36Z8v!sdzV8)l;}kP1nIjYe7FuQOms0y1F$k?>Jf*{gd=I0vH$uLgbDf=8}E zNgtPJqsYMy1+}W*1a^Ok*D{b%gkW7;%BV}9zZ*U_+0w3P#A$#yS?BSfWm?iteG#px z`ys_D0jA?a+6-Up6&rlJyeuq8jOiB_RB111Y@`x{AcBmF2_T9lZs*ReuoB!>bo}nh zMG%Tiz1?mhTsco?)ongODN4%;_fIQn0?IVVFF+$vTGT?{kO!NC*C1#F!cl-Y+rQ=j zF5diQGy^?zJG={s(>3H!1KZfWdkky<6Az?4Qc!o^FKxjLjhr8Qre_XXCVh)x&+3-a zRWuf)o>=?12|oy;dG|?ofqWGg zaxk!zgMogXty`A1aJ+X?eX^H*tOGL7mHuC<0Wk^{Ef>Ttz8gKj6rbHU`oeTTn6|vm z!Wgm3zlo;sUxbV3eY=Th=rPb<$~qwF3ekn3&|h+AY4~q7lyp!57{AdL;FWL8J*0D> z^|?ERWesS%(>gJScVxU?@O}$8y;MXHyyQ3iVVqt%bcYD6(xheEtcn)AE&_bkDyeSd z4B~9Ps`g5?n>mV3YX;KZX>jt3!^w&mHi$zp6cfMxA4mAsl|21EzY#I#{X4uQvSNYe{%v**?n(dqJ#)dwwm<2T-+<@l5U!u3|L_ zEzsN)7?ehDK1jm88j6d#EOI9 zBIQgAhxO89U3Sau!4&2d4$HkY5s|r-b{7f?;Qm?mRSR8w*ewqB<1sa{X2R-7L6RRO z_pZ9r05X-bqa2jy?Svi8kwTWS9k)!A6MLaNaCQp1#zien!JDjE--)mXITi-nh;@=6 z(5p}s(x-rKv7Rt1yozqg%wyE?=1vy%bn$SqOzuEXBH}B&W($^I1=4+USi3$gMmuiu zZiH;7TYB05qz?Nlf&)b^55|BJ`CsivZ5aU{RE}uYb)M&3PshA)b_%*aFFLq{&=DDR z>HZkXK_RK(S*SW|50K%4i^fF+3>W3?L(?{phR z=xCw@yZwU2D$fxRxZS6E!rBBXt_UIw5B3qg5T+%yoIG4Qg+Pn9?x0w=@N*qf)mRMe zKcP&WZh0fju{;Bntr-orN4HUEJT$%KzQ}+YjzdoG=vDdvehi3U2lU=xDfj**ka(To zDVkaLGSAWJ*CG463Qs2^!S&P)ci8MHX7r4eNKN|#E!~3l;E={Hy8)QD=1ef#XJ?4j9p|Ai9r?O})rm3+#^|U3U zMLpb)Hr8LNSfCYSneuwi-fd*z=mPo-Ee6qf@{VUj1ZPY|$IrrzYR(Um=;JTdk7DQq z_=h>}a<4e#LjmGNDB^FNrHfdKoc0+M)Zz#wSOV!obHRLz4wN?#V=TL8JYT6`gE2sg z&*!e4Q1WEZL4TZ|_EP;J_N>!#=D($oo2OpagHiFIT+y5$jZvF|^bPEsc%Ew(fWwHj z>dL^ht{&_eCs=l;<@H((_h@y%{I4;BSuyuSBdG`9W!Zcy#~@Ps6@b7@cNfw*gzrdp zjpk4^!14-OT!92#>L?KMt6&md;2y|imEYfZb3~>xJkbvXD8nF6C4>Ub2*J2NI1kpv z9YQ-8kPFIvN2*U~2z-D0_LM@EaEE`J6p%zdi$}SDy^(*PPtBOLLAs%-j@J;*Kx>yPtno?yQgzk&}4JRN>Gy7``Scw}_K0=2) z{51)xNCeAJDMB-F!Qhfc#A<_x(4Xxx@RgWw&Wc%~Rco%l@ zBQPm};Ik%qn=|R<0sg5)Au-yo6}5XiqSOk=m3e{QgEZFAdqxZ*5LTGGX1!kl7fi&F zp`D7|Rjx=t>|UdnQ4$E@s0@eIQ#&0c{_E&Z0%()`t--=88HJlwkrMI)1@AX~`Y9DE zdA?|r`HWqsrLkV4QcfM|-l|otG=&1Z?u{Zq;0oGl=k;1n> zXUX_Mqvpfa3_j%e&@IHr#p=p&S^{zArf4KMOvXE%nZ>F_N+d4QdeP2co@}#DiSBbH z^knmH`sKZ8k9k>vex0^$0YxGF8TpM(#DF+w2hBm+Bt&1#oZp4s8|R6!gJ2-iZ=3lo zD%DIs@?o)AKtwEw&U}RfeX>j!-)WuvGJ%G=A8=BkNjjQHi^_RQ4Az%f=|T&V2tKBS zT=$PlD54KSg3Tx@aJfKvUR)X;$bpx0Hz1ZNXX`_@ZwGX~mkSYhaV{){$zXsT@F$}~ zO5XR+T536$_jiS#k^;GcAg8O=2Z8|VOYK2Qqu(QU@G7f7q)JOB{6{FqOTEvRBhl!< zy;1=Un_&nmVtZ(z3SoB?n=43YXY<>wLtONpp1c~?c=qV4kbI)x`6TrMkizQw+-}wb zrnBz5_b?Z4pcguJPw^W?1={{@8rfcynAkf zz5NE^Ghjw6xHI0}lVZ4&Zj5XAaLJ$pLX#UATXg8hA1<3Tqss(QSF&SubCt-A-R_VW?j&ko)*rNJ3Q}&gdo>Y+pA_)D=1M^4ug2|Mn8;jC$m-sl_mN3K|$;n`rgxfVmIr%Ck>*ma$ zNVhlFq>;TA4~i85r$HgTBt@r)O!P6dn4D@j%7{{L+WX{4SX$ZBk~cLbd(LDkKQ<_X zVYO!=6ghNzP>NKR`uTRh4xB2r()>INfm)bNG(g6Z&S|55AH-N|i-feTX#k#NJ+^YJu^wtx%vIO_GH;6cqPdkK% z2~~+cn}XBnL~2=y1ChzO$>?%jV*GuP!MpzezY>fMS1~1u7$KbHghB(+*miHZevGej`7c z?s4l794wcA^3#pJx$e$zPfj#F%2sm5Fqh9&X-DT!S7$kf`_qU&>+X}coHvTf>pIV6 z4-OJXt}2PTc*U(Ybxq~A@B`Zulm-1l)v=!Cr$G-9>4DyF+XM>mn=eB;9m`x_zr z@OaLkBFS2&vh(3FpMIBZ=fe#X;@3N!v};S^I6ik-V>eYpfARV{2s^$vLRtUvx?%c7 zu{^#OK`8i}&%*rLWAvw68QZ}dHrg$`rAf)Epepxi7ailN_?Myr-pYt*I4>2xGJXV- zGR@p<#iV(z=vc`um1DQ~WQF=7V&{UvAvAsoqUqw#$mnx#@Z(gog~&RUbn$N)Rd$}__FHWRh$!;H#j|K}&c)njhDqjISB1WnvI_Lyr|y|TFu0pA zssPTDN|sMC5Pv1 zbk9&0TtXP8{ki`?M`!TPDJ8!wGhgZ}B-<6|{n~j4V_6!$lJfSJwe08+UB8Ts#ATPB zN;k+UAR&SM-z?|C5~*^yFP#c>MoaOR8J1CTSbAISv3_O)C&Ntr7cpO_(VPp}fT3Y$ zu3m9x@>#fQ)m)8Y<_$)g%;jsFW_97T>TM!9@!D|`90+7z2bi6!eVo;h^_Z;^si}tb zf+0nruha6gPYMuP_evD*ss?<^@28`chK}3~YE`nq+nrz|bKI4Cqdn-ku*(EY7P-Q# zjqNefAQNF~Mae0Cz6$zS0iC^|{O_oHoon9IFn?M}V*0k2!MF`2lCk~U?=%+OYeOHH z2m>=^(k2!QDvG%W$`BS~ges=8i_#|xR)JTr(9z&Y&&>JG>0REOtzwu_6m(0@xnjT2 z?|6dlM77h}#PVdZv6`Hf5pZnZGA(?Q6?ZW2oWb7UiYu;(afn7u#=OBg?GVct4~gG> zpj@@XH~2E;f6oZ{*I8~@RBp4pQRRA68^5&w+`xRLT}%wjrsW+8YqwPr#%9B1b`3a2 zdk0L?V0;9`9#k-`V^waPKShOx?=z(3P_50{+Ii}>NnZ2Xd1EIkMRBD<4m@u@-CZ$> z8c@TGgAjbEI$)+yf|lVMk-`6ymtiZ3_<4&bnplQ#FIZL7+N0Zzus%j~QdWzwpbn_o zpdT@}_p}%b*Vzn&9Y6`-hjcaxYfW z{EaY{nmEWrAxR{R5ulm=b2XbR9++FF8J#=wz3za&huTy-;WIk(Q`&RRL*Y7&hSW_DIcIdnet)kB z!_9C2y5No;#C!%F$dpq_N8WLwqUTMF$F0d&9_JxaXV<~@h>PMv)Oob`uxq?iQEvZC zi3R?WVh{5C zvo}_+r*6;Df`1AQT{j4X^}Q&4S(M#&)obX%CJ~7{F&xL3%5jhB@E>qZ#Fq7!tA=0( z_oHc1Ya+%*p*UL3;%%n0{wP^4V4WcjN2@d7mkHKY>NtdFsY&>pT`zrH@rELnBDT-I@2y?#`ieFNv)PcV@uttNekn`y>}e?!_NtVef)tRnTOE0fp(YINnHDtDP2@y1MBaSG zrhTa6-P6Y|kgTH?>V7W$B`uHu@J@0bJ=TNgP0mYVTS-2$sfMh&8J58pkiHp4MZgkG z_^Tn~Tz2$wM1Zvbh7EcrH-ZKu=r6sRoDW-`d`xJw@OlO@+>G@pn*`{*RuBfY zPZd@*buJEFt`dvk&C zsSOz=qxJZ=WLn$x(?hkzV)G%$CHvIyFT1%-s?d%1rG*%x8M--9=egIW?S+e^ivm#? zO703bA{%R2@*Aoo&&3il12Y%s!-D%sD!t0QLhoh2Zp3tHIuP!Orimm{y?+h@CgXux zezkoWlH#kL|E|%~A7EBIXK0PL3l1nqWQn@D;)s-(XUEqzKV5YPy=`#~K~|(`){=sk zPVf_~=lDBahavq}7)!x3P`i+;q@tio(|UWWdHcBfmZ_jzFn0lu_jXyHa|x9J z&1T&GUB5@xvRxq)V@)!N#dNZ0e?6pl=88PCRLCc%sgH3!+wz;N_`I^GL4}XMG)bQ=<05L8;E)aHQ#M*4F z@0^GCroV!}Nt}vC4cLeE2g8*v%dB`&t0M-u?JkW0`f;W>YV~*Gwmy5vFoVPHp>~H7 z)#81SVpsD7dwzQz2~x+sF~TQ?w=is$Vk0bmi8UPAZ7~JqZcrS=ce~Ix`$$+fJ|jm~Y$xdk+I!CR z!G`?tj1M?SRI|0|JtK~y-X=e0SC7F&2NCcm!^+Ox+U^D`3u{^A=B~emy{NvSK{c^d z?Y0kaJse;79Jf0-ijBzwl|Y+qpJ2INFpS`pCL_>)uvsQ&L|ZM(PS7p_UVkj4w7n&E z{17o~RuY$sXck+t?twCMNoQ`Cj0q|8$cZm)#OFh|^qIPrgp3V1adrkRaPaSNpyw~} z?-!m5XaVnkCxHJm=fuvy&i+3MAj|)V|KCRz*8jWVCvB}bk``1^kMKmqxPzXQvPje=j{#S|u)Z+#IeK^VdhFjW-|nw_BrFH;z2{ty-mdRgqTU%d z)$3}O9;B|RF?2oGxmWNV>Jrww+E=W9l3{r!Z!@|B!03fu4gbn@C5M#V?C3qMYQ8@o z^B4k?ok1wQrh38@=?>r$iZDU48;vRC-QHuw9>Iy3RMlpg}=a-s-%vrD&oL1rry zu1UJoy*9edLhSAc-%{2E=z!}Ze%E%5F=XvxSSjycyy$A~vwIWGjQQpz>riZ28G)Tb zS1bY@+|fI9YHATbUd1gADPdedx&l~1SH00L<|hNj9@5j_qr*m(clznm&pMfQ#XTrc zR%pLakb2J-dc}i}>FS=vy*(X?11-`!*BvCt^NPnk22NjkdKbcsZg_~L0|&iEJD{(V zu+}RKBmv-2l2LNTy(PXVQbYt7fLJA@kGm5MI0|{V!)rP&LF1)eOyG$Ky6-27J2Fq} zsqZ4W?{S~&qyW`fD`Buk)-7@$`&j?t6pwR^86a#hkF{hWN?-_IkFJTTG-xS|#)3_Z`8SH^Ga4_iYCtjn@5mm{=En}$i`mqIBlFK9dphBR8HLU4TGfXu zPIlk@@`7CrqsBKL1w}ipaQRmtEq)dFEn1mbtM}4wUa@3G@j5HHV`^1b@F0E*xF!y9 z1p`G4u3^tV}ltAv7gvKYEbR?;gI0k*|816X1!>(3?B1fEJ`BH8WDa_M{zg=p- z<7IB@kETC)$WM?TNuh`$Uyt6)nhjJZ4$^$tj#Ae2^ zI$da%+W>7chq~3bN$$6*ODr%f;BO8+U-GY?SUk^P+7hi}$$yJBi2mBo-RJ;#(CSvf@C; zQ~YH1n2=TLj*xdeLJ68~QSvq^Dj0x9-RKY}NlchCI3K#baWFD%B77u;4%R6H04{DY z+Es)6pEGn9Oaf7}3i+l<_FW)1k71fX5M%OwI#i+pf!m|FLkbTqH@@L`9A|E!e$&7M zfJfUaH;J52Sz&%+P$JNLXn1LfznFyXH~!10i@09Az%t5_Y>X(t5#kMj&mx)S zLKA{aA=4;+^ut3~c}yU5rH#Tu(#81cF(2DNHL|0Vff1C!#2p7;JL&9`o6RbNqBE!8 zD?ntx>&5Fv5Uj6rj15di6#CW@_)P{UmXSLRsS4vLI0g;CNIO5FwLd%qWOb1EIo2Ri zX-NaW2NV@hPd_DulDH!w_D$y!Uq_dhPRTX2SViMt%6i%m2~bV7O}%pIAqe2LqQ<$Mz{>U2m;pN z86ta&^z_Y{tmRS-Yj6;@mxVNeeOy~Q*H3O|(A4k<(V#Q5D(cnxVm3r`{V^uIjl4yk z&tEDIe-%t^-Q(@#Ql%nC9cq96^UABp7iO}mWhsynk%|68Z{Val!&iWZ~;td zgFK`Q!cFmN#o_Z5VSv~7CQGUvgJO333@eu+VN)(y^hxh(7%NZeM%;e))FoqFB4x4Q zeN@c8gpVoG>}+L%(NcnXs6u)NMlH5%uc)`(4Ryw5;XWZ^xgYEZUr@dJ6={htZ%tES z^XTlps5Fm_97FoA#w)EFuW3ik5lD0EN8%g~ zGAVw=FaVBaI!z0;Q!r(X$F?F1%n~y#(!FnsOOfE;`d{O z)yH9srA5aR)1#h&fQ3p4Qx)zo7~{&{5dEVb)Q2}i*Wnv!WUhzSj~CKmisd(>sU!N5 zlFg^nYnOzmlL++C;!kkA$R{12tD@F&kCjcztAm!`C;#Q5MR_ee)t7a^iSYOz6hF=P zw{Xj0PA>T{w}d5x77v`aB6 zA>M;BR0uN4L^P)&d{88oD&(ONyiV*z-|a-zE7QQFct}oDvZOa+Z;yifu*<;GFQb4U zZWY8ZJ|x9$UBLPjYF^lgV=G}D2Z6B2Rq)VwaQXhx&4ixwl)AuJ3zf=fRPwZM{w3pkn<;;GuwXv_z?MA<|Vi7U3*Vuq9|JMv4%0V{i;?oKH9uwVFnfh9s7nQ$`i6?_`S2 z5}g-ojw~J~+>_5HtejkU*33`S)~cYML|ctaAwVA_BUv#+pv^bZ7)#iAR>+#LgE(?bHkqT+#7SSopaOEIu*K=cWR20*Ezw z*4qBp3Ul*v`g0U9*a#ZJyY%ZoC^RTF$MFRC?l|08-WlqGj<@4^ z#P0c=PM*6{q}Ju%*mJIeRU0XOk(T8bw1Btphl=46v@Sink7kuVy$#l|P!PV1lyySL zd%M~o6OjMzhn7JLj@mSy|Nk)dPQjuCTes%2ZQHhO+qP}nwrv}G*|u%l#_oMi_r2W_ z|HJL~io_gQkyT&LIg-1QW`@PlQ@THfn8$%yX+3#rE*YhbLZ_~JAxAb;s!Hj?*T-HJ zsT*fQt(-l*H8kf{H#D!acyTd=-n~nUJWa6QCe`mzPScf1v3i{ayTc~^d{XGj>LhMF zw^XPzun-zsRU1>Q_7QDkigUzmgIZWpWHaPy)51{dFA=ozhFvTnFh7(8Rh->w@0?Y4 zR1k_!@Aw&EH5PE*(LLf()5)X6b|$sq{&cu6#p5ih8;CSjC;l5#H{R`1f=rm~H+2bt z-FLF|Rau1dw#y`HJop1G=?4JV0jbQ-Ldz%9;%?C2Z}QzJa=}%|rt(gdJ3uAcLE3ck z;tt6{{eI9zkyFNFLkh`%1%Z2`%kN7L;gM}^Uk3SdH{n>|!XQ|?N1;UokGz~CLFWV) zg_dFGSta!8tEr+374fW;(u!gpbamyfX&&-B*%`u2X)0o*v9E%|Hf(ep_ zFRdjr`e$+A9AO0g(SMS||7G~=)6F5~=kU#?8$gkqBqGT~25^M^s39T;aIS*vrkK}EK@){bBTF>4bZR<91vPEYpqa$pZFr#da+N8@ z3WC7V+W`yRqx|%}dBh`BsTS1*LQx6wT1NkZTP>mtO|hHWvVp-qRz9xpUW?Nu@*%ZN z5LQjL7mA#ymd}Q8v4b8RXdM;udtnr^D6StZi-@9Pp)`d)c}sZ|(O5pR_(ftKtqXS5 z#2O=D3*CTsq^V*h*O|_EZa-(K%--y`Jl0l#N8t7MKa8gKn^kb2Vbrf_8co@y+;OT~ ziVExmT>}q*p+sDOG$=d(bVWDk^Vf!Ou@FxVHZ9F30@Vj1n*T9EC5kbq%$9S30NkI# z##uCm5PVaNILP516cLjamp!Xjp4h@%@U-mCb_l*+H$4Fs*7~=()(epl zJ!^`|`ltA+^cGWH;~j<(;M;4886;D&ziKHd9kPeJXK}la^jsT)Rb2p-qtP3;iFb3> z?fy&rCoOMAz#^j2?o3KMjC=R;XP`(?)}WuPh_@7O>SRgevWV<}Jw}O2ePQ{2Ihu-| zJJ|CFy!>|%^FNr+e_76dvc6eZ8JPbU^I`p8RdD|w=EMH~C+oXMN3x!{9TCoHxqe>J zsR-_kG!UNA037m=pt|4x6V z&3QuOd+rOpI=#An)(MY&b_wcCqr@Pz?#LI@dx{)!lt#g2cg%4!|BP^e96?al>*tB8 z!t&=u|B;S5MZTPb%J9kW1`q9OkOOxu_m6Zk`7xo@qcwgBfca|nKx$?lueiQ$l)Dj(1z={@~)E8 zMVeJ}S0w4+yI^7E$p!OqL#iED7Oq6JB|`LPK%(WI^T*j&!{06RONrZux#MMJO0`?m z@d%Thv6J|_Wcu^6VUuS^&$n-Lpz_75eC6}#wx67uy}r%s$+2rl$uwi5d+&CcBoPIKr7?L?M(YB0 ztcbr1_ix81_C`>rSL3_7Q4gSpO(iDDex)pC=z@S$!`0*sX5? z{8Y0|8@E7C>+4e}YEEP=Tfbc>KFgco(;1&a@Ivz8+NYqc*McFpF~VTz8ZhNvZAe&Y z_JO2PQjQYrxO4%vK3}jVDHfjLVp4IWt_1NhgVgD%%eC#sd-NQBO-VZ4t2!l!wXW)8 zxwhM^vD&UY;Vqxp@cQPs*~qW z1u1s(mT1cYK2L}v*KYbF7{lm3lJV@f{IFk3^}yfIsICB4t~j_c9DK=TX@-VHV#>S) zEwLBHl+h9C7CYb3h}HbT?F)(|h+?{^m~I^u)^D7!?pLMUh$3($E`Jo$@qAt);a{HF zc~)jhY~N58mU z$wK;=xXw3%6>!RbEd2(w9Me%V=VU_l`?YYz!vV*fBfTKOR=r3@p0uU2cC{RJI0ac; zR+H-5)$;f)Yg5dsx)=3kwGxYm0**RFdO)UDy(mVWG^L$)O$V9e6l*iji*$-_ZJGr# z`Ewy_FPREYuZ=Pr&dwXAA9MysWZpHR;BOo#iOB&}pjD32KLPh_@@(DnoPz-R2|@r5 zT`mB-X?X*_gos97SgeRtMUDZrup~@6rV_@TmV}5j2@u=15s?|;LGcWUPD(63MgMLN zf^AX<26N66w#?Uf<8>*@M6}@#=Zc|NTI-7RIL2T&Bc6D1VwJy){S?@7w_{ZuIl;t* z08fHb4w&+A#d6Zz016(c;}Hus1Emb=VCdF|n8GYS)-c}8vP8Kwvc)q}uX&c6(C%;$ zbv`V!WOK%FbNkf?lLu$rngmE*dEl!JBZtUA%_d=_s{z!yd5s@Y#J1Ee05f@&gGYMz zT>`dCbuq^>^_k+7OmG*MWZJC?^RdpD!5z)U?Nxv)EY+s0*PAPq*-u8b6xVUYa~C0@ zAK>Iqazq19dgzZbA?%`iOGqG(Ir``6TV;>vj*ib(De9jkhXqxioiprv&?(Xn>|YEM zQ|{)>X^p<`gYq2~^Pn-cVTHg+UuF2L|NH5Ba{OD=N^-?4n@%`uQyW)2L^S3M*$e_~ z&6{+HS&RB3pt&=WHYt0@<5m?-8@kx{Qq1Jf)n+8etwMGBkDYLE!EoeBFH1LIXv3Fz z@L5Yzcgj%I-ZB~DomJ4e3rqre{=JaNa6ge*-y=C|RhwHd?0?W9a+D_Xp&4P;nmVUL zK6Q+C6Ymlz6;tQe`r}OH2lNW)*Y4 zt4spB|GJP}FYFd7bqJ7MbN+W2Bz6-a@ulwxqpUpvMax>0DFN|5tMx*uZNfJ!kSIET z*NYyXVUkQz@pKl5&o$Y2aa;d_NV(nC6`Ep^5FVgzXtRDJ8Kw z%3W;a`h7|}z=p=Xy+}U9=pQ6W8s3mVkeN~_3D>-Xm0KSm#{u~>kUpz<9y6@;yo_(7 zb)7T$I4pK%zbb>|+$sbQ!kJv4@f}qI!V&G|`^1!XFu7&0Yc%e=(&s{P2c2n@A=XpR zaPu+zM=o#m&(k#J)N6$dHMH?Y5MGhi(jRa|3!jdM>e1I!otK77IYnh9x5P-4YZbNS zt^3jFRIRv{OL9w$>s&N{C^l9n!0V42@AvZ6$@`i1?CGI%4n%F7%wc5>MeY&JHX>_u zVbFPD!`t=}KSBju7|?@chnTaGIRQ-9wiX`}NISqWjf;JsE>O!c^4Svtv&FH6!ipBp zBXfF!PDHJb!q>RxvgA|*6QaHbsj=}`_kM5Lzy^$N$ytTw@$Ny8k$2OKp`Q$KrG=w4e4iK z>WJfV#%D|={~rHdk}FJ87AG_gTyW1QGIP~38V~FZS%%T|6CoDrt&qG4CAzHpL@Dc2 zGj>hv1;QSS;!({bOAXvq_^6o^25DT`-7aabk6Q}N)$K)y-@v%hl^7MhGx!^8*Aary zvCX2`PViI7&hjZc!M`ScIu08LRdiVxTunhj9I4UOj`gE3$L=H{qGZe;Vg;i%$z6_; zaX?@m@?TkCcF>{#dh~P%QEWP1p^taB!XH^Og^E6L5M2{(k$*Q32oiK@*Mt4AW7Y8G zEN#T;`81G;)9Zo+oZJA(U9rnX-O)~RxXt-?AN`^`9~vjl#M2?JR&-TS%{JeDooNX+Y1*J0dv;h;oOzCwlMQJEtm^C!kbPro>d;JyD~DX z)kkv|d(Mi>=rDB(_%6dNw2=W>In}P< zKi1u;T)|h^_q96J%uQcvXAXR+nx{~K=b~3|cRGo^8~l*QsKZXa@*U4pqeEwQYOg|d zH6+ReayIkbjMo%zw|Lc^)n3h?H+Vb;o(v1)E!x?J{E{LDTRs0?=rms96=U!Xf1D0< z(qsROMffDG6au;S-DS2i1~HqNWhF36r`*{WP+V%UCDYhdnqjLyYoT!3yZ>^?T+|vs z3lX`hlH;$uaDiB6!L2!Sx_Amiv>4gx<-amc#usXlot9Zt-*a6V%%5N3T6o&`@P4zXW>lv zVdZ#P+}$_(k>y<8T%V!H==^wdv4~`mSUwgP{^?KHU7ViTna}>+@&csiWrZ=Y6(dZN z*=P0R^VOvY18(sV=!V;m`8WiHPGVPt10-19!^2&5wfwo*u4A0Sfzy*F09ew|csWOo z_GjoG_$ASjv}g+d@o>Ys@@pzu04U;{{511e>=L1Z;zq&k@qv@cXo!FzU`Du3LgnwD z(ku~*9R%OtI}9j(xlhFXbnMjlGbwdV0Emk<91!$nlM5mGCIYJNc7^d4So?)wWIPZN zsC6INPa~y-Y{OM&Y4L%%%9r0TI3o&?pci1jGZkh-@MYn*`m6+q#DKTJ7E<4N@L=4( z&~uVCEM=N+#JFRu(7CxSrJSVsJVNjRf}M%bsL?{Er-Am1xT|l;Z{KJmer`Fh6}>^ zW?M@)e{$v9<6+=6)AIjPPzfpj{4&8^FlC%fZrBThc$W4pDKn1vj-RLy9_xDMLzlfr2j=Yq)u6X5~ppI1~Ur)r)^TMajkh>4eDDCg7U_Y6Wuu- z{u3gg(q8TSLU2qQ?uh0(k3UN9j-ku_V|cihBJ&zPH1EF&ZX&KK~))pBe&cDGfyZ3vLRcm}lWx>hA zEy$s=g?mD>5=6dle!;Baw1Qj_Iu*0mX8{hSz3&6T#Sl_#Xnb3q8sPXDPrF6{QR zM?BiNJf`w9!laKNb$$eQI+Az2(eMKG$L;v1j0(gQoDWYf;inTLv<7&}8kVe(^0v?s z@g^^W^_1nkez{HAk=SyBY{E9T8OfSe;K@^V0qzvHc7C0 zr;NA%lUe+SMf{gpFmn8FX2HhvKPuJPnE(GUi<^HIgg7IJub#oh{{7oLw#>C&{6Y7C zHa5oqKnJn+fE*H=qDVDr)Fgz&e?863R9#J7)#t9Q#4)x&2w5&G>%>>nGxg0(XP#m) zPQ>>8KkmZiQ7y$b+$Z-a36P%Tr71^x(W;1}Hmxb9NaQ?C#*vdIJu= zDZXeYO=4(|tnhU)+n*iP{!WOQ$JSkrMKj4?Yhhh}UeU(hwEmtx+Y{*5Vt;_~N`Vsb z@d7vQ;tyK{Ck~djjoN%;^du~=#_d8{vvYHH5{O9LK_KKoNpfyGXJl zPau1Uhf}27MJf&iHCW>9!~elSXSEoFp}2u63Aqcg8Tr7407wy(Z2zGhPpA=aCpN(V zrrVAO`(*;nK-=>3@p8I5{utd-z%W|G)fE_A$>0&UzIBN|pMmitV1uxyv1ID@hFyJAR)kmI!o z6MO&<)eCI>l2WnSy*r?2>a2#rFCa+KlLZS4SbD1zev3tll7$UiYTNa4b=~kZey@q{ z8&lg4h)#5?n1RJtJvV?DW&j5&Tr2pMD%ZD3vHs02;ifCXjz9z&sp1kSv(`ld5W8w~ zAHXc_F|^pN!5R)ExRZX;KR3ajL|b&{0|7(j4{#9T<59itgxK&_MQqLL4n+%CI>~D1 ziINfmrXlwu44U_f^yTuJ0(xPQPLkYGm0P<4LUMx6Dsc0Pq{QJkQN%||o|^lizIiL< zU4ZQ1WK&{e=vPlAqC$55I4m(YK{fGK`6dG`h{T`%xfRGry$pFxl4D@U49^l!0m}IC zk^WRgOiHZ28S1*xRw)kuf%;+5ZuPCV=6md(=QGe31RBRZo3#ml$cOJN;moeco_MZ??Fvu(MbdnOy)`q-x7=QPj4i}WrhZbgKK)~ zJQ|hucYaD9^&SmMwGhuASPTKSKuodNl2WKQ6dh*ovkL$@6>5iEc!bf4gl*0>TP@}d zLolWC*bBnC_3Len86p{SQM$Cu*w4zl_N{TCbnqyn+^cXB*y!=EYu(McOl)RA6%Ry3 zeTF%>NAQmlIr=3GFo6~F_NC@VQl&abTM`8ea}osUk?Y5D4(9W`YlIdxseTT5a36?e za^D0r+7kXiY{v{Se2%A6vEKs4g1`?dt-{*Uz zQKiKa3fKlfAO{G|O}x3-%0x}5FXJa;Ps(Pg9$Vt zyaqW>2k5TBEMTLBr9e|Z1`Pscq6B9^T#(%uIW!|YY*F@rw0)M-fLb+Iv=a)k!CGKr zC?SrNZHdIqmu75eq$lY~yYDp4Ht7>*Lm1!%$YV20Q4 zu&olErhcTN9T0u^K;cy^4RGMU$t53x_IofE+OcBRHpx${3=a{Ug4q2Q9!6YIhv&<( zpM%h;y&eNz05^z0<|(JAv8K=!$dz-KB9~YRib1K*fpgASq>VCwPR_>%(e6oHr`dz3y(}MQaZ2ZKS#%Iz`cKwi2sL*dL{Vxk{^(T_B4<>7!0ph_Y zjeK6kehJ#S)SNl{xU*m|%!*aad`g9UHf^jCiW2V6P&AxoEx21Jyg);=pb`fk+zj7)E=A!U%HWkE?+n#v(yw+OI91On`ry9E*H8o9e3*8QZKL#b{QYF|ehXIOkxg4;k{gyw} zCk6rFl9RNog_zOlj3X%rC%)cLg$D34T~}}5H;lH01Y|Xlsi`R7z40uN6OK{^B?61y z8>E4@c>7h4vTc3fVVC8QP_D)n7||R%uPIGZd}1Bwdllp_hG}_l(51DuyK|fxvMNz! z5F&Y^K9V?s;dVSjo)+S33O~Ra#}2l&0z4G>;;aWg@m}+%U1V0ucyn2Uu&UUMyo8>U z_&KWI=!}&7Ycb5Z4Y1KvbxF2tZH$pdQj#tBzkpF>%2eRHFwi0DUhxC5Pr;*%ae-Ay8sZjloKuT#DBDn@mh}n zu+ImpGme>Wyo?KK5ShvO;Z_0G)G77XiQy$H$#hCWjAk-NBQiGq0vP~7nF^(0I(3Sm zPTij*>#U5Jgtj+!g-GE^R2E+`diR!O(7;GF!)=BbxZzjtsw>4Id7*3|5{(6x^7_U% z<~X7lj!M;4yB0P?4ttm3e;x17vWZyUccEnW-WcbQ5P8AJbx4DiC-SQ2Pj?AwW-x$+ zWG+5==^#-r$mk@2u>|MGNUS!!4*lw@^KakXczy!kxBkR&HUHdoZ&Z}J1#--BnP=91 z5D{{5`E}2yFkTzdpAX}eq8in`3HoX^>I6=jgh0{(sNUtL3|04bw*QzZsc4XeX3~Kp;t?Jz zM$27#dh=@KTX-~CnLumv1)0a;%p3VRP32AW1BsuwT*o-Ck9e_Wu z?-7MZpvEw$WYjzT0_5$Whsn}_7NY_H>XR&B?m|KAvB5k2!Wo!E*v3CJ;zTIUk(}{n zOG)_Jmvzu-+c-b)nd{!g&g2Q`11lE)xIko}wKgB?nx1o58;7kR1O5fT;oi|BU@UgaEML}me} z@PiLR0fOF0ova$L%I*hxo(QNV>b(PW_BqN8a4r%tLkrM}AH^kqD(2(T=XHzE-~xHy zE%R=6mgKyx5B|iX`{p0}L45OB%YYA}=hshVMAIi_d(BXfm^q-s;%3e07aS?T`e+sz z?TIT=Rod5kiGyTB4MwvuM+oxo-Ot>0WY@lY(;&kQzAECUTjSs+UX?X;q08UR%mK9F zE!Lm5N%OWhf2B2>&S}BWAKYDj$5HFqJ1N z9ego!;xr?DcjQ_eyBt5JjeobgvJi4&k&1#Cy$k4AXlpF;C3A@z0XM)lRzGdCNAxRY zqBi^SvRR^CFGF&U_ddT3C!_D-Uqvp?SHAG*H?ZLBdI&7HBJ!BC74Iu+Qk>(gS*_*O zSX;V7gGRYxmvlqhHr7$ODsfKv3EO-ZBgX5$EEyUq-0ek)kMdTB;m&9+2-eX|o%ZZ^ zAf|8IW4`lI%W}h?vYdle^BxD5o&``lt9!F^=5|F#Ub3~tkkj6=x%}d_s)Ov?m_E}D z>j1BIKLPMonN8H4ogGtrKj-Eyg11b!hNAUMy(Z1I0Y6%#EL{8Wu+{x*Hc017A8HGi z2*SO!w4w=0#n*`!ogrHf(}c2_BypRohc!ll{3v4zQz}G|$_mZ3JZ~fBiF@B*EhBuC zR%d&Cb~;p(8E?Ei@$XCi6kA2S8}yqExYxDzdSHMej$f~qhJivpQh@+2v)FG}C-v;@ zh}+$3ePXwUZY4L=!38q1DVU_ zUM;n;^YxnCc5lPTxyriJ5Y);>R09rTMN~7Jx+al0Ld`ueNYd@#$sS9C7hnGy1+;uv z58C3i+6)vyIr2&6VGSPcnpBeI8|j#+a>XMb4>O>@Sz(IGej+n9$rZYx5x(p2FK&06 zg(+5|JpKCu_l>zJ8C90juZ}JAS8Ifl4-}kk(s5ZfKdezhgCNJ0{Swo+&^FTjAbSBz zI>-T_xBXNXmHOyiibx=L{{nB?;Dj9|1rWbR72~#hI~{$3el+WDQ`FV0D>r(Df{pyk zbPWddSffCD38xut^h0HLNr#!}TePS$OK_5a)Wx;VmUBl_j4bF1Ym_QN7OHWF*a*nE z_|eOzlQ*>M5IGrZb(O_3jdY8$xGDi(?J9zM!uy=Wq+c>qdf7A;?Y}&$N5_?rGKd7L zwJX{A&ByhBC&gZ{&2{|qO)O^0GcJse%7z{f0#n+@J=QVrl|i{XSmH~FpeOkKjKQ&6 zeoQG_(k{}CS(}?@fmq}$VQh=G@7CURt6KCsmr{{z${0=<4LO$#QY*c2Q-l|zXyA=9 zeVFqV@VZ^7i*D3FnP|l$d8>;UccsCZc{CB=JM+DJRm~@KHkP>XgHYwxFzriKH@S@vGVhIp;mJkjyurSRgq6L#5(+KM z#m{I@bk4;sXuQ&YQcO05YRX;0=Etg0%|}6`D{?f}@}E?qB3JXiu#^HQ&Y{d#1KORq zY9LYlSGPE?>sW%CDG$c(;8O3EM@m;}Pc60O8q}g*ACf9`9a2f(Ob%96(GjP%FwR~7RY)*_#e z5gSF;IvFohH`dbiN%|q{*I5+N6MdU!>yzv-sm-!%wBD{xm7 zy^J`io!CuJvnpU@lnzeJF_ex}70))L`Qbb!W)w;E@){G9-@jXgte;Z-O*zO=boGw- zO-KZCi5R}WE5S)h+#$Lt1GUV?%>4Q5b9kkmo?Xte35s)yxF2ZYx}&~pH@`GQ)?`Zn zzXBvTX5jq0jJaZ6uiaa3bHA}kINmS+2hRB~rui?o-A2fIjo!(BzFgcN&ZWD&9)?D?pzBhzmM5vI$r?9LylZ)P z_4O%i#osKyUq+^)>($xOeM0^1^j(%nlWj(FjjOlr=<@U{B1f~xn-+%N1+OH6KTv2$Kd*90`-Cy(u{XL|qLD!jVfMZUS`p}DH0Fodf zTibRvNUF|Ado%PyD2o@!;^I7DV`_4so{-(S^K=UinpUIds&Sjrc!9h+^jKh3tz#-PSNo%}y@0e~xCd`XBMoOtV(ddw; zmZpOsOY#n~^z6$wmP3p)y?Rx^DgJ*R9dA@7%u6&@Q;s|N>TY60L2h}VE&KSvyiKTd^IGU%IiS+JQ#kqriVeIn|hR zGlh4!R*5)^7l9f}5~uyAHD>a0Aat4MuV37VW~wpfq_AU*K`XYw&RrD#;Xhdtje|xw zdG_g3Y^dhUn=+WjBi)EJWl)bPcJ$M|=aNYi1aDiECzMJ)K7N#77umnoRVf|=X~+hw z*vGuus5_$rM|cnqF@1B+QjGPK<4V7RBGXa+8_DhxoGAsoC}WW79e^u8^>2hRxeyPr z=t`D@43#_wn!U5s(k7549)JF^#hSrJpp!rjvBv)@S^D1@m>*}ng&0Rk4mSGatE`NnJ0qVHr;pw?B~x5!UlU9{n^vuzK5mV_k6qbo?OoMZ>U}yr z-Y=hIarOrGg!JJL0685D2UP(q$-{_VOhEgDu=l*#feLm>YW0r+!T|4;0K=64$1ngM zjP|J-wjF7Pg>-23w^d?@SWA*y>Y+g!I9=&|K0AWb6 znqS6)rG43^?vc^#e!DvC#-3Kss-EvD7Fkh z0;cx@A{roF_NdzP*l--&a)77WbBr0ff9r98E&< zI2u4O0gaAn9N;h-Lw~gDX$Z9P>>er^~OZ4>CP7;aXL?AHYaU6XX zHx&qwjRl$^CLl8ZSz7CWL$uKl*gHf*)DZ_M%9s%85be|+$<*nqkpaU5Kw-S=?JkxY zmO;I73&1iSz93G{!2%2Z%J zPpJxCf*-?PPgn*~B&|#Y)VTucA`n4iO_)>zcg2E0hJnB^CNn5NFV%!g1kfi*k$7oD z&QFPD^Y)3tK}x`XJ7)2gEi~z&VYPk&M<5VocTt%FdP`~-N5K4s!;ZHL#EG#Jr0qOB>>h76c~i#6>kza zF6p)kk5j>_290}|UbAl^aUkFj&+?$}C-9AFIYY*X6LT+{S!E1^H^r!31N;4D4({hf zaEvyvoh%XiSAI+ly}H0^w5N%Ly0f)2f+lpA>A#2 zJQJIe29F6&#{^p<1?C6d<6w-aP>~PIa)_A(nTNGYiE=&1jXW*aiIaf~vOJqP=<}0J%SqHD+bdJ?HCFiQzVA@%=u>tbENe&^w3Yv5w7i@YjkNoNsxR=H&B+f zd5My6)|ug4u@|L1v&WE1f=r9CK?%$-MpsqcJ6U9EGZd)4N2H;kpOvu8B8U$=u>Qvu zm8tyHYaP~v$RPm{0KWW^f>Sl0~Tygvx5PReCvz(^d?_Q=Mp$VuhIblXBsC)! z$ixKH_O-95s$q$}Bp;$Qj6&ZG(9)4;qId9DM_U|Yh)3{-8uy&ie3T^oS?od2%Eq{e zdsQwKk^NdKVTE6oZBM=Ik)&K=D15sh(G(%_U(I;iKEdm_ujHQne*@rlNn9C_lSl4h z*%#LT0Wl*q8j{f19>Go(Wqs1m^h^b|!7U3h<0Pv)jE04x)aMUwVHAdn!SyOp48b-+Wy#hpWRh@1`1n+M+`)hvP% zM1uZNF!`k@0Jmkwr?2iI27@Ui<;*@MFg1wK=?y=!Fo!>jUU|#d*`&#N|PkWrEY&s zNh#XCB*HRXxSPv+s9HX039w1)je#^)8ydeNo#|ExUs>1VKX8$|A>lNOAh=3Q-bp3! zXwXO_lw(%Sm# ziL10dP}9>J=8U7X1yzVIdUxLiJ`EO7KY_I0BW1dU*r6ZlBnlH?Ggs6aEi|M1r(>%y zqdl1$_+%1^*M<_HkU6fg!H)o$rZVJA;mSnDj{)pQwa>B_qi0upv!XSLJO3FR8#HMU zT-Hzs9U(M9cPYGLS0L6ci95Vw0;$JJNRa+abjVi^2dP%A3VQBy#cmb6!mUYX@ z1Bb(fpYA7$upmtWopK@n)R%yzjeaYI3mHg(D*F9ZI(izV68C*X==-}3BFtJ^K*FB< zL|}O{A1EalmpW+QibqDI`xtjFd8EDPTC{7Ix<)g#ISAz@9SZC~d z@1OEIgTT;M97lz;!F4}JFt8eGrIVcI?2$G7@aW}n4@heq^vu24t!M=r(`*nR9Bl(6 z%IXv9#&u00bHE_V0l_0CaTqRS;vy9b*oVlro~Bn+SWK*J*?Jm5~ zT5dw-;=N$N)k&lEXq%<&%RP36E0~99V*H%iDwBF~2#HQ@!kbfb5Oy_S`xCB+X{eU{ zyEF~B*J?KrLz~s)XuE0!NgRsR1mctvU_x|#^gB+X(ANf?Oz9hMi%{phaMGfNiQ}2I z8LRk8)b8oMb{Y#~%(rSi%dAU=2k^);WB|A?rJ2QvkaF z78+V!yso(*H4X5hpxHUr&>z(#r34mgGJ;&+iUJ=~^R)Zz*+An;VSmmI3SNaW*Vus} zpHgJ8@e%+KVsyVHG$|Uo4ie#ZYw)Iv;(SrqfX6z0e|(wF(XP=oJ4b++N+aBO-PGl3 z?0wl&!Wa6VqjeOiF{Ml*m13*LhQ14F=xDKz47BsEtgm>*DvDm*v>H&Y>a%8Np7eR# z!ala~=-{SEBr21f5}ORw;PSvo&jG{HP}T7JBmqj2%5TJ{L^03_Ry{A8Orqf5%GA?Fmy=HV0omCf#@ej@?wc3f{?CDiLVbr;CbSY1$Pz-V3kXB%|57AUN-_(rYG5Lmp6Ckh+nl3q*TUb>IdW%A1|@mjItJIP;olg*{= z2)@2?JQa{%Ut%C>pdlzymA2T^B#f!H+;x~Lm2ZT26V0=4uogz6L~&|(6(X(+ypE8r z`o5@6+H6n@4De&84#oN4o@rSrhX#;75EDM#`_x2Ers z**i1fD@B|MM8ci)crb^WT1RRH3&3*5cy>A!^wd3=7M~(uo`{CwE~qjv_WgN^2L;n~ zD3*=7Pc?b?fJFomy_Ly!?D~@q38g)77w!=-(l+Xe?2V(*hOkIwzZ&Y|z%2xRYF)4F z?b#`A^9+GOA5mvR;z(eLuU4@H5@)e!Mxkxsj1n<)(PmF?n1(1l4k3t;uw|tE))S1w zqwH`*N)uNxw!r~AM@)ttHf-RaQ-I=&D`{*Cb9GB#@A04j^5!am?%QF}{<2_`vlpDj zrhhPNSwln5G~MQ3Cbp_<&2QK*a3v2Xskmb8E$IoVKWOlv2n$#}hqO*R;f(XU%EGLo zhunhDS|MsIALKcEn!+S0bqCapF^ffQr0ADXn9G&bXdg(P(B1Tk0F?ztYVrk_kQ5s} zL)afg=ziv5ZG*PhSIbwCu7wg2v6_6r@y$qEeoZC&#YbYV^-^p=&+?LsmX4x5)2clE zHV>685n^v~k^17VTDj6Di^jGH!O!rMJMN7!%B2s|djNUBaz>BjS+Ql+l1`IRXrT^> zGSykQ@2VYbYE+2X6bVj|F=g1#2rJ_Fy4cW>BXbaysZ$hQ${n(Djjijg4qhrSP*B6E z+DnRl4~W+7cdH-U@XT#SZtsczw68bZx!u>GFJfjnL!$(Epw#`+tM}dVa61*wgX(c7GZ@WGBPbKF>hr z5ic5{`k4w2*UP=G;<&y)3f7R^NNbh@_}JP09jocCjwNVVf1vLW)q z^6BTee^(t_7$sa~Kpm#T9nH;TSP4Z0XN*n}v>g z8OEUkt^!dMK5&?=*slX?SFs@AMZ6h4@&`T|49`{zvX^d1qfnI&%YX$v8Z1tmodV0l zQh5R3ilotEAGH0cNDz@-3cA05^b6&Q=KD4zq+#QqMU9EA%#8*c1WaFLLJcB#-!CGz zD6&O9wS1r+euD@nBel%eGg@sMo7h&OVk#r%Wfo}+R$Z^;X)q-LbDZ8hxpRBF^D_PU z=ZHkj#sv}B8*4?BCwxtw$UIeU6Z=#emn<#t>mAvWk$t_SE3YMTlROh~rF<0;)=oh# zYEY^VEsj+FO{r(Jq9SnNC1QvmP&P){utHvZ!Kg759Dg<5vph^ezPV)$tG(!|>5Yw) zW$c3|eOm_MGE6Y&J9nl8@J8y38)4G5PCQZ7dP{9shi(nR8=-IdwyR_Yu9%^d!GQQY z3@slHXj0ZUu;vb+hQ~Fiib70sr{U@cwUIclTzs~jaKaH%J6**_x;>TsAZBWYTF}zr zQMVF(L}V_SgZBEB;1p9sa;{+>a(2uvvesNv2b-UwxS6xG;U-P?Rx-V7;E5*%d&9)f zM#xY~mptBe9E>X?4=2|$?L~uil?Q9VW%mZ+N}O_)@v(KT&o!=5P#w9_;;fTm76l~UEbBwc;xGIwik~ZX&rP-=ehbZm^O6Ggi=6(j zGi=ON#>5DR*Xs9hJXSD8;@n>8RhjIbNSHSHH+OzkzfyOjH)pAE z=Z)^6aM`U5#R!MnSKM0YIi~Jah~+j1c|e}^G>U-e-Eg4wWKh?;L%nNhw1IC&2a@)@ zD@-jz;qNO&IXW}Hq^?5I+|a~6r5(3b$-?}PxY-9f4!?mrkvRN7oHXtWv`*5~HA3;b z-t>PJc&Z<7#=pIpTXiLJg#6y(#i~`HJDvx~*ZlkD$E}szc#bMD>ojjiJqlx^#P{=tE96vN&x?N9ZiZJNA9bH*+m6o`FQTh0dY|2$&%dFf|SQ zRO}Stg;z0OVutRs@Mdbl31K6<&iy?r1US5LS@>-0;|Vr4Qo3BkTU&9>$fk{xJ#%g? zj9JtRs~bc5=(BQ9Zu;nL5#x&tH;O<@LSI`zGH@ z$+bK%uQw&NdCdo%L&om`oJ`2gO_6ivG4X71Wdhxqe2u43b~ga&r~>bI zW3G>{MV;F44i?x7EphIdZS%3ggN$N>Un?95G*&tGrMLRFO3f)LeHJwUtYX{_{i1Ot zKC7{|1WB+n(;koWKQG-Io7r|0%-%NF8njn?+vHh>I1qP~hpPUW5r{=9`h41PCA1Op z-IZsoND|JEhuDO(VkcYCwS^9+fay`L)hpJ(=ySKhE5tNjrfaq1&St)!?hgD5aQO=!~U!EYM7ByfoKnSA3u_GaHGG;ErQV zU8JM+Rf9=!U+G2F?$BXAv3E2T<^EFs=r$s~O6C}yPdg}J9MyPXuGy;aKw&nvAwIm# z1P2*lf`{l=o3}bcZ8vEx^Npk~{$WNQ zU`D3RMpb*97MUVrMy$?^d`vn^B5cq>x`~R~;`4MkCGyB)jI6Q+b!2z;q&|GIV5gci zL#MGrcSr4V=`sQ)R=vRyxkxMZ@qIUIoLWU2;j!^>`fm&-M-DnrA3E}MVqSl}qa!gb zFB~n>@xn6I8X1|Xd6A~p#OVSsV~4W}@z|I!tNjvPu}>z)wCf( za};=R`hps{q??a%4`pwnrlOL1Rg7A#Krgb=9@tfWu8r`f%1V-eMPt^e*J-sMSp{Qe z<{<)!&&2*z{s<~^X|PaG6mkTo{1++ZRa+HV6y_*f5ge4INgVFN(cb|wl_pE0`NhUa zA|xYZ$ke?|1z!VXsxa5}kV(y#=$b8xbn@leh_C;Pv3Cj*EoicZ+qP}nwr$(CZQI?a zZQI6a+qO^J*6nZpe8h^z$1)FN<-gejT4>5|2S%nIO zDI4Rtfc9uU{!naCc&ac%*@1g#4-W*M#Rp ziTA=172-O5465HLFC@;N7AQkCkTL3Dh%?{-f0@q|?r-Ub6jOvzTPViZRAQ=c{Z08? zMJ1-kG6p>+_>aGYxniSkDcVpUIQy!WJ#T(i&iq@5sbvWC6w_QcI${9rOPpLhfzHaev(gf_9@2 zrxc?YResZLv1Jj)qW?JOsx_<(<6Ii0noTukvzbivPo>e3XcTHnFv?-|JLa#kIEXjY zL~v7~;V8>M51>%9F+%1t|7Z2)swl)L#Q$Sb$SaHGTfF}{PyCb&x(&!dEp{tqi*R2) z^%|0clzP3C3`lztgek+Mq0s-k zx4-E>ls={@w;rg6Bz;V-={lGSpQqw{DlrO&g#THA1|QQ`wIRUd;Y62x|8D7Jy~$aUlH(P{+!)kCAX)NABT_6KKP&S&!@@byS9H; zK8~@v;-I)($3ic!7iXV@{D=crsA1q!%T$ZJFoZmjWlM2+rNTh(@)JXoR1tW)NqkP_dP_s|H+_%R<>oy1|Q9^ilbEZ2TKKVLxVr`fKjv*@foK@W?=*+0&aLFetrjHl_+CII=tT>jlW0BhDVYBOwn zkLemng9;1TyTeIUN)sCm7vZmSb;~{xu7DH@r+s<{B&UZ)e%}++ADsR!3wicK;a05I zpJn^T)e;-Q)=PKPpzmd){@FpDSeQb;T5G+fGjE6M`cn!aMxXdNSkwjo`;zhBf`Uv8 ztpAhj=lI{X8yx>{wHv(SwK%`Yes-9=6JRXo^Obh#4tg}6fTKiP%=><0#9P7VKra+Y z&AJXr6j9$Vks~a{)MfiKKW09Nkg=KCsj;=TDXX5HC`mieZ^|D%Tz35LW&1qeHqRc& z8JnIvGo?*qEDdT0haN?}S#i^Yr<1o6`%QH0j$wZL+<8|fkA_slZ?A`^ld};Sw-38y zw%zY1cx=msShB$kakx=Q=Z}{TbEdQTAS;j=wr&b?)WE5pvo^Og+q!t zo^yeke1TXSfnW_lEErHMR&XpL&`dF0ixXgm%O|mu+2g#b!{=mi0u=1MEXrSz?rjsr z@tQ`ndqg%xLnf<_f9>l%>-_KJQVRCl#g4T(A&q=C@MG8F@@(9H%n=;I*~HJ8&deB~ z%zfT19{6uhzblDqT(r?cX=7R|<7zJ`wEFKmAqc5-#VmC_!KhvU|840MIE1S2AP|aa zmN>$#lqTPz4Cn-L|%Lm@bV`kS<*ysK%{%7h>MwiTbGdukAT@Mx@=m{ zE}pAWMi@jqk$GRPcq39W@Wfqs%$!kqz!y7`4K!A9NgdP%?T=H?vqmFkUqIXix% z)5Jl;a6Y5#qJHlJFRXvUBYh??4!_@1plCl(t!v?rnq;xgw4R<6t2<33NaO%{#V?^J z0u3Iv$DL-=HJzu|5ytN2K9{SD)>x~(QEnv6(0^w23Wlyfezq}*^O%(ZsV6q`_tv>bS`Itji zdJ@OMBXGYHn!F;6dc2aaL4!*c2|$<$2`BugK4CEgG+FOAo_B3n(lhQeeZxfX-K0mx*Q==o- zk$otnJM8Y|!~ZzyluGB=$Y+rE!6X*Vn`+>qYtT~|uF!Ztawg>K!-&OdA0s*8N!P$+ zm#G9*k(qqQCMgXzysi+axQ^7m29`)L^u$qMEK}Mg8DJ*VQwUnQI12WOyK$xYCBfJL zkrmrB=@g%wy`RW3S?wlz7=tIE4q9}Kpf9U7;!l|8CDc`5TequOoWf6YY;wLpeF$IC zJb~YQSp2R(SkKP@PeK?xZy)j!L@hH~#^1p{I3_VGHd#^mtwoWMvizVx%9)t8t1s2e zH7WK`urB1l4S#i-SgASdO`x-r%}3$ss^7}YK3qAXX)AsHY-Sa;lil0JXX|p%dEs7x zuH-q25JiB~Aol1s=tQ(ggKrJ1FcN;JL%9*^2{!8x3y zT&!w1`*j5REHr%77Z=Z6zQX6+yqsqjRW@3C1^A0I3b|3j-t0zX&p}>7TI^JBAw!IzDv5h?2D7$&%UZ&eKak=S{) z_4)QGeI3gE$r1pgV)R38QZg<`=gGT)hImjp7RB-LmELklKHkZqs#r)V*+$-{z}jkJ z?US?yWR1JkR8H#3|I1jWdw>E?IAD`v>K0?VgK1^6*z9Dppwz`?z%428o#M<@kyvLcfxdKAq-_#ceX_q zy8Jb#T2AA|03_6l_r(r3&E-$j)uKto#e4R!WygT0Y$~~7f_QG^gNI4UDe**_LXiPB zy2M$4baK(rGvTI&=TDP3gP4PzFwaQv1dQLUj(f_USk~Fsi9k=$m^$pW9E;ydJ7HI+3uQO_So;(gW3V7_% zjo}i~73W{esA6-okC?RC=13$siUwWD{!=p;mVArYrE!XLfpb}$>SPB!j?2l`<2*s% z>MxO`Q6x}GTNII`Z!X5#mT)9myf?Xh^Wt^C!`=5`R(G4c!@Ie;y~(?0854;X0bq!z#Exl34xPORetC=nuI%1fjMh~pX_NdX!ZSgtWP**n}FX<2yLNJJJEn+tC zN@#7nt0%}r6JzT-e*nzbp(zIw0ywW&Nfkvd197tCQ6c-Ano&pC7UV?8L;lRG1H5%W z5AoHp{G(R@71+yFW(t=YKXA4Ad9A@G_2ri7vi9PThaQOEZ#_?sbcV_{iXib#?*b0R z^qwes>|a8dyyBJ>lV-l@zyn+pB+pz96mGsNsAri7C;;k_LN;DTSvij=%wJVcs|1-e z^Fk|1`CCTOTr7?3W6bVoX-}-tdL{MNpy!f|AOT;W^QTP?{A_3oSQE^O!Y( z_n&YeT;U+Cj9pks4yiW~7{|KB5MuXurvcE5qHY$b9G;ZE;06)sMQpn0g<(O!0*Z;S zRm+9j*jc&V1B417DZ2(kxlPT5C1mtC{-KNfzACqfTL?&yLclkQM^x|QAm>Od29{GEqa$v@I8z*|xQz>r&@E+E+<4tve(0-&M}`+2tO5@d=k`u=6eATZ?W>apJ2bff$E+8C5*X{~r1_?lGEvo`q3<+DR zoTD$TmI{DA$||Y3tA}yHW|eh|k+>{01&R+HP8pu4x$NcH6t1`w z)+X;<4wDd`Zycl(s0JzQhfZ}2g9s8+A@m;wAq>Yu%*mjpxDlhs{25nsP-(xh4s;n> z!wwC`&x?`4AvH6sP#aR!S#%Ia>7y4Ghu;^l#wyV}NH;2baT}6`9Ivxi`NV8Z*f8Vo zmVkqOc<|p%q@~&J;`FF&Jg!2Y&ItQVPo8ru1sTp&YuOw9BHRuHDksiBh+@&}#~nN( zv66W(F&_1AM&Ja(889tK+Janv`A6HM#G2upfX2D?^5Z}9M2=9;AQ;EkGTv?%YN`Ck zciKcL<8K?Z>vMxHZPN8G{%zxFDBMhrS2XMR{0w%6K^j|11cH;#Ckursg9G|zKG}j< zV!B9Xey?>W4Me-UCM-XX2=BF~Zbd2RWQ{^te%{{2iE6vZlunwAoID6ClGy3x*`x0u zUM$0KFdXBbuY)o(xDOP2E_tGiafSBq*#Up_pq{;bxcpE$5klz$c7Q&Q?5i^eHiy{0^l` zik)Yk6ZM?Ts`KKkw%S%eRT;&-eAP);;h{nUn-UAwj2{6pX6<$4vWx7G&=XN8Zms#b zae~N=CY&+200ZWiG`(q)fah)Aei;Yk_=~u+jKP-`EVi z*LTv#li-kqKX-f`1sFVQ`Cz)>@K7rN-jGKY<)|t9gi%X}K+4_*d(PEUgtCu+Qt^@n zC{Rf)ic~SQ;44;C6}kbf`)|Bq-l6bu*u`GJ}NV$=-i z;9xX|jz|~5oBwpKy4&us|AFTsQEZI_2d>2d0fk$z5@A`e%{>vNL$@)V&*D8|pQ+Rd z2cwCm`p)3uwMS0=2t~nAJ7pc=g5oWzXw+JrmI;O4 z*8;@Cc@$>8fOG%3E(4`Wm?M2&o3q`abO0@_+B}!Y((Wf!0hpqinJFHK9+5_9i^q*= zxXeW`7$6hFbKQlaGeFw%XCUsX+&K&nF`iTn%npB`1`?Bjbb!OW08Ra#06 zVzeZr>Ci}|Zkdq!_^)w{?trE7wcbW`z^8?p+EmmN_X@MVVe5H6DC~Gm%MUMgW}@6) zpwb_X`LtKS*>*uf?X*DV?;ub3i1Fq<48|=31F+&qX^)NUeHDIKN0Ki3F1dep7PCa8 zk$Q=KmKD%@%xmnlzFJo3;J6<+#LA<1Oxy0hyD6k&FqO}tbG{JGi3N@Hi4ywhwYK?G~uq7M}9jwy0c5s!@~$CBdbVO67W}Y zCb>9qHP2x(~*{Dv$&Q3eaM!H_1SyJ#%VZv^~-fk zj0a1Xz$oA{=nxf7`VpOF_-{qY+kuRC64waYQ)K!N!O2Pd86Sn<69U4tYB)^_dL~BP z`>3B^uToEO4CbXMxu^&!@<5Ku$7(HVivps(TL^r;u#Lkq^1l5SL@PA}>Z7V^5a;E( z<#WG&GC2F){q;S)S@#<)u%-TO5P#l}==*~G`9A8d=-Kl8T16!)tdKn-@DbvMpU{I3 zS<+zLgP6-`O5b1cFt*Ps0hZ|2%yzAUQ>}YxZ|{D^=y19V@FTPM+?cf<8iWinIDJcN zaZXg&b1Uhw#4H}^Ev6bDd7NrS7a6|J;>`cDXLt3SpRV`dvRrujN*5|UktSdy@O|Dk z$B4c;RkPXTOhp9q3i30-W8G}{ ziFGps5OLwu_4S=eN58i_=78d}Ry3he@;O5Sde86%=jKV!5P;`q6dlL*&mcL^f!;nU zKnf*70 zwT`(0D?Vd>K2{iD+GHO(P(l1CD(RzXbpn)kg)7|^q6h+3DFEpHD>&$aN)mtDpufpf2o zaaVgXral`pcWhahCrN3harNe&5=AY1aIsmGZmB7weah%0lAuEiQ!6M$5^h{)=ea_? z$p}8xKaun!<2nmA?&c(t(9b;YzI-AsdUE_Ey<38t44qTl+{3b`gFk`zZ@6CaR;r5?4?{rz5 zbZP*<=vJt08Yr+&LSp%gB>d;s!wor5BBdoGr}(;6gYup5c|?f1Ahj3}JYbnKvnz^Uo0DmyMvLTez~ zK+~eXuu~JD4oYW?Co88_>53aymhOdxbiQTWDoY%vPN*%SD-)Y4OBIjFKKv)Fizt`* zbZcXDTZrV!nv+4IpdfG0ZNbslC>1*VU5`;?g+X|`j=roADo44u0K19yM($iuP6=6< zM`B|VH|Ffxg1aTLO;u`#FGMkQ_N-ekJrOQh`rAybQXiPkepVswxq{l3Bg%ta?jdKX zIciFFeU~YbV?s|+PRW=<2H4d@c5+pJ zVD|@FTrMArbmjwZ!S#BmY>=z)cjb(9*LMa0Xl^`^xhb=T@(zKmIR(m{YWxFLu*vQ1 z^vlD~bVZbEwt9RO=~VJ|dv7n6KWOM4dIjl6#%GFnh4_p6Di{sF?K8lw2T5kBJ_&yl z6X$t(Hqw5LzWw?;ibOP4JDT9z@^QsdRz8B8ZoPW{(gtCooupRMRFhd>!HB3i^sZ0q zI7ntslPs~ieH0d?eT=m;RE7-FqE(S3YrIR0<<+!5y>oUycuxKyO z+9Y17LEJZtXwYE(`rRvx&e@x%AId*bL^jp56gMvg!Zyi2yXnwHU-ArR^hBrq(k>AG zORx(iY+>!KI;f~Ej_OsLS6zkga7@A+F{oVwVVc=Yvj=(JO4eEHe*{3Lt2glhybkjQ zYDe@HULb7V@xY{` zJ95Gsr@BYg>tV!@dJGmz1{z;QE*O)zCd%D_M8eh2`f(<^Tf<^L5m*0yGNT_|#`d^c zT99jKdrI##Nqv0ltXj9#45S!w6`l7Cm&~t(vB%S|Fi;H(3wr-RC1~gJF}S4d^E{xH zuE)c36ot5e4w1Q_=N zI|=hHO&6hypU_t$O8!_vP{b?PE+gaEnw;r%A#~V`(zl?8cHo5myN=HVqxhf#99HcE z6jhwgHXup<`HLXp_6$<~hw6+d`%^R!Q2rj*hn7~u)BYj>j?hfQ&q0aByX^w4PgfC+ z{_~TUVZl)Z_1Q2;syff3=93}FtnZznYcSaap`z|GBgIQ~zlQ4?F^u1-zP(wQ#mi+H zJ8JJldA$quX`0|(4KyX_vL@>O?@E1C1ahS3Qej#T+x3hXTyS<&X&!X|3buXh`(;%| zPI_MYo_giOvg(QrW#6FT&C1T_@mT4Gy^V-pE*DSsUf;)@JGLjh*E@tZNJIe1e z`LA5be}Efo%$)xN+~D}%zzvT7C*a1Fj$|^9IBGBaH==V9cGqMFJs6yu0RaTZT5i@= zuvihSbyINz?5AgMy7aNq`f@aOC?rIvP)%+1RJ#4w4%5RIYt}1k5&zk4IDIYO_kte3 zr}uE}Pe`A9ZExR!;lOVd)_(NGZ`?BCm$=&V4Y{Hg3WUJPM<~z+1TyDVdoWfMJ1~&KCI&0;c}oMnAPY3 z%e!4tl5Q}Ie$vqW_)tde=@nAX#OPiRwpE#HS6@Qax05*PxVU+Wx`ko+A^l1>58W+b zb;jt5zm=N}@^&I?+CCB$EruC*WLc)2ezWvfyeu$zN?vRH9qd6)UdxSV)6e@MoqAt@ zikP&$BY2IUVitcU-2*`n#4xiRZh`!?I^~$HJvfC1qMOUZ4~Dlf*KB{r{wJE8z_wn3LfO{1SBSwUjc|hn? z!#}l5+4|~B6d@e@m(%OY7>XLEhqeUG%Wp*7u3l@KSu> zxMEwk?ERu{JWdVXz(x-*yo%C`c=K#ox2K&CAb$CfY|m4V^XvZMo=WUrPd=c#@IvZh zT2Y7Jq>$;~TudRuRX7}Ez0|wi&q!g+35U$~8gE?3kmk{jn+1I_e15sDIC#l&D$o-a z=BENJ$Pl48Q&=qXT30?xYFm`K7sEgW-D+n2v--LK@*xk+?IYjmpJYJ41f3;Etp=5o z9Kt5w=dQA1o`cYp{II>1cR(L-3nROW$Q53%j^f*3X4`aeVCJsSRX9TO^^3}+u=rW6 z8I=ECVPI}9r4v#`58z1|t~EHAM&sl1K;hC2Br`vErgEk?LlJH^?}QXvkD(|R$e8My zm_}wy6{s9rP3%~kS1ZlMtX5e-z9_iP!7mJzk4$9?nX&sJtEG?=!^;=!d_P2Jr%>C} zT(|xS42_E8MFEktj8^kgurZ8dQ{6*mV~#x>u+`MLaCN)-1ODJ^+@Gm>+8PF>U>XZ- zWn3*2@EI~W7n-|`eqhdJj$N_hyA+Z>RAWHTC60bjVNO_Hf({vy$Uw#J&7B~v_+^nI z6g58xrgOHkBS1UcLDjj4eZ1(4TM|H9tPuNRZzQ+Qxyeh;PMK9s)&r~M*;mi5lz_Gn zNIh};{#G?aZLWn{8=HeN1g(LpOTCqlra#gDcPG20K#PkRwLr9sA$f@pTa2*v9s?En zzBkexHIrs9Y-;WdfibETdF{S%`jgV z(ZtG1CJlq8qoyA*=c}7JVyu)ch{na;06}DW5du8*Ire%Qqao?Isu-i6X};joYBFeC zLK#;bh2I;qR&38!O26dRKJ)g5%-Q#0wJK}Zr{@hNoWhcIowO+D4qpMUo&zRC7VK_F z!4ECh%l_{`#CfLOXwXb~zbqy1>o_1G1Qx&$qnyi}_mn0#5E0x5a+oaF>zUe8K}}=j z$V7U7vGFf zZ%7C@ektoXvDu(TvgsB_)2o=wa)4IGW;`!<3Ea@kc+EK4FGiuh#!2d0Mp4dPf)kcy zcvhQWe9O=lLIgj_1R^Wb5YL7PM}i&ng<17#&C?0abbCaGF;DjG1_%_Ap^Pk z4V;r@2APUG5m^k6{SWTCaBV7QhgnFV=)z;a5nJC7A$@1Q+_J!;olY5@rzIhWC$@n| zlBBHYu{MM(yIYJ8?7Dw=q;%SH`YJ0+HY^=?ns?iMzKRy}ZB>wwUex#2?x6bvdD?Jvy zRBcd!2nm8=#hxxOO6IVhZbR}2yjb{7=$JLp`HfYO0NU*}qO+O&T!aZExuhOdkT$L@ zRS?RA!QHiWz)!&Ry}c4?Qm$j;nGE-?l6XA2js65g?by&kxJQM^_{qw!7s_RWY}j6! zC8UAuBe73L^nIH$5Z?!RD z2S6@>qE%F?3WUglOb@=qEr*Ey3es*Lc^RMKlXGjuQP3y!z#mggd1)_Q%Er9~L9_`EBzSe%1^!u%I{ZYl(++Ya zd7fL=Cc%n)_R>tw+j>n#O>Y2CRAck$EOjodNY6wrMntiik^bG9qr*s?BsCLydI?k@ zc4FP2Fh_cNb>fKL$3o`glEM>09$gIxwVc@SeSHk-yy3Pxtb78Dn|o9~&-hkny<1}I za;oE+4&0(evXTk`lMU&m!C|Ut-9|O12U$4SPY_#d%Zs$YQf3M$RtV4NyEz?M2ti?W ztB7;tM)!0&RKKpXLj0-!p?o@PMc$6}+lRCD?8GdO95#%9ibmQ>_}g=4Zq3pFD=LNT z#onOl)G-rV02B+8gY9Z^8a8N{A~&w&i=CQj-R%9=YL8$!PDf=nPq3gh?Yh>d^Q?Hn z$>A$?=AqI`U(%{%g3ID|QZal}1t;60Z=O>E%~FegZQm762Zf5I|BS4t;x8HN#L;Qi zZ@`(hC@<;Cn4nltnlcZNlbvV3hvR-=UO~9~i+S}d{(5~J?Bt|ymQk4ayl^BIKS5S??C`l?j1|_zmpy3idg2w?P zXnc?1n-3oOB78X293O)GU-&y4zDIWNa7TE~LBs0ndfFDoDw%xzY3~J&5mb~HLkNff zy3nxnlJN=@yyqf71zvyadS zX0P&~#Hz{RT?To<8s76%i7j(^bE+@^hLSRqf?(<$vmw+RyAwHHySx@s499=LX^j{%22@+2!-wXF@3b zr1|-<@K0F!T|_(u^VQyJ#Umld8K^J08@@jbfwHr)((fH>$o@KVh^y*IXSF89&{Rg@ zc_LckuR$7!*OxB4*(NL8hNnlWKSc}arhIo!;^sU9C-ic!%=7lvE+&*1+bK`cJ{ySX zmSYazbr9gm%a-Ef_OwWkRLim9x3DrO*H8X%^=E^A^iUGw90$UCiCyheE*4k%AMCTy z@xRSuKcnMm$`Y8o#Mm-9kc%K}nPf#XBG_wVF(v3W8q7ne!j4|7?enwz?%$^CarUqU z7q)r4G7jZkQ__~Wd^aaI(a?>llEAvNl2dN(<+k#s4d+(yl5dYVEz`YL71VH!K@E=l zy$KQ=OS+A-_RAIoM;T^)jj?Za;%h5!xRPFd$Gx84@DN9@ph!Y;xys5D>!!6>u?z6$y$mF(|94fJwLeCBnmWB89_o|1?s^ z*=&(fb%tOZK!Ulw8CNYoZem)j+^GDt#Tou3Xt@-|u1K=R_883 z?Hm7WF?`CduD>_i2bdWv`u@Lv{r?+I$;`>g@!#@Yoc|k6$@%{Tr`+b9j3XI!42!oO zAlLW7#$cGUZJ12Gk-^}TXth{NkeJNO`Zw6yUiEYtjJ8VjvxE2+GZj@?yOWElG-TA! zqpF#zn0OaAHfC>kBDpp7O8)cldG%X+NALb{9xs3LD<;@im+SK&G6cx}mUn7z@8<~} zoYIbH1T`|2wON-}Ts9n=%r3VsIXK)V@8_>D>ZwG?aRtAqC?n-bxOX54Q9KE~AA_3{d>43=Yh& zT(ye_XlI`zoX;X-Y7R01z=0J8K{<&)34p=Ld5QvH3=s8-#Jvd;u7m=2NFM4i#ok5_ zU@s5oby%~&1xd-)*5BMS_ zCwAd>MOzyl`m_)Z|5OF%e*8Qc1;tda8*=QB+^}FO!>NjwD21=L=OZ8>CDMHGs3kih z$@K23otf^SzX5><=Rbd)kcWEv3}t6&KoKrhFujD3tR@!S7{iN3-RKYJfSIpZ2Ct7h zQN5)F#R>%)Cd&w(!Xx|Rrk6uYl zag((uG~Nm!@DN=GN+fewO@EO?PtON;apVP*>Q4rg);arqgW3RAQj5_MCra9f^F&Gk zj9?U^Chmo2qxc@4%LR6V%lpe5Nn@KuDvwH*1c~mb4G|Xx^WvBQkYqlJiAL}K$cVlA zYP}6&lW2<=2Y5ObEZdN)dnO`yYKj#6TZTQ0d|b2m@y#ZiLDNq)f z08CKWK%h_n3vB-*7}&QLkw~$9PlpWm6U59xA3)-lOQzhf^{QM!ah&O-=l2v8i@^)F zNM-D3l#iJ`8A`y>qJ$u;_YzlNc1`9EyNY$D3jAlnRZzSA?hDbh1%T|euPDkMnFqcb z&r$myZbGe1N^lOS!qG}st~sXbJ5N(s7M1xUb2VcdEHc!9dF(YG+rHj#VSdOPAGAz@ z1yFUQ>;8A=w&lTxrZ;by)<#Q+^o3|LQYD2e&L590sn<6YPC5?-^RXec2zZxpK#1?& zB%KrFA^AF@#?D|+AWpR%tN#92_r_6_htZcquO zyeoSJX7^z~vJ>}~3Vs@~5^XdUYR1vzSULdwE$KOi)d!mWKg?kr%Mn?Rq!5)Y8)~9~ zLr&}#d;)T$L-5)*t4D&##o0S5K&f@tHHJ4t^gI`?IGS~-me*c@hk`Fasbc`e0OeRq zhGkKPa)_$Q- z|E_pcV0VBOy<9|^{sdMX(Q3)6oZ9hCW#l_{pxmLF7sl|nHmoPzvc|UO<0Aqr$;@J)m6otGWP(<>Gi%}qHE=C7~D~Q_XON&=elkR@Wqm&4)Sv6I^ z+h(QF5*h6wsU)M-khPVPVe)F^11y>lSQ;t2O3~}(h`M6TP5JDu;cLb>z2!1``9Y~)r<-3ry-4Sugw@QT8{{`9V;%D*Q0c+iytuXBd!v30@|9;T ziQ=me0G-;~B(xF)*qf!%cXe=_=mO=;M@^revRH_NiOK#|QA#1kn&`2@{QSkYhDAbX zn`qt9S-~@a62%0M&diZw3Zj5%@diprji|sp%eU?Ww;aix6W_e#sx(y7+px zm<>z-lok>7F_Sn3VcBE7=6uqeq`@akxsjWm9_>qND5U^&)rzG^^*i6nF-DYtQmRun7w?f|MWwzIX?IIKuFT>fUgBW4!;Q<$*8g&r z%0OD)FIf5l!zE^kmd0`}a5eg2eZyux;ptSN-x@#1ksmR1U_4jHKhYr|0Au<%VGY_Z zqz{~z?*TUVIsiHNPxudTxJvv8VIY(o+-eU+Cj8B(#ab$&|47M-mwcR8JIPuiHv~majj63>#&)tjjeZc`Sl3Rx3j!^5`b2Mnse+J92f3 zJ2QD7Ydk@17(}4o6C9%M2%lUraqw{9fE6Lw%S<#(39OEkk??Pt_>nj<1_{Jo(_nfK z#}sdz1vIGEYqZ7VqU%?-*64n;! zO8BK{Bx*wPy3(QqAmu1zw6Nb3D(SxBm(CPw=|;`b=WuwfJOC?d5?zS@nOloT|4X=f z|6#`(5#B&ixPL(l##6flh*pKGQjf@mHdOuR$G!+faxG3yWHZ6G)Dx}w2>=Dg!S zxx*x@UO4A#BcU1)=drl@y?1b6R{n!(ZXZ1QD9(^UdxR<>ENr;GepV!<>D<^c&)uNl z;#}vy!%}G*^p&wvNYZC^r^m2F3~IYN65BHYaSqbwW;-JuE3Clfm%OJ#7cjCRBx(=! z5=Hp(XhsBprEKwS?<*iX|nKq@I( zFN(LTR*kdNHEyiL_?oPexepEP2D}1!L=Pnbmeg$Y{!|TbFkdihZ)-$%kY4a0 zv?^Wsk8I&vJ%4V51MR!h-mT!5vSs* zH_gnAuh}nDR6&}Ca?0(8*?dhRDj=0@Law5PZv$QWA`r;u8nW|oxE8#I)b zw7jay${myNP)TW=WGe&qe7zf$!X4#No+y)Z3Mj~`UB*M`)*N_Mk9+8ZNepVco)z+- zwXkJcacWLooeKyQd0N&|^=wE(hgb=`A}eD^$~Zy&6*Chx?pO~g`X7=el_ty6J2@+% zTO=6i&Y`0Tz+4AYf$35ZjsGQBjN-QRc?paLXx0*oTIbnqnlvxhL%K20)DQ8hUwTSH zMRoD(wLB8`)G7PdJHvdWV0Q%8nROoe{Wx|ulPp+aP; zm27uBuXifu!sn!JOKEM(yMAd>I~GNtsc8}{!h2sCow3{FDJ3(D;(<0m?Y7w(!y~gs zTv7n#+i#7MIbm=~*N*tna6e)`{2S~#zf6(M;StP7Z}KpQRf9E627vMK4t?&8;p;-O zi9FP>>a;vPJ8R7BrJF9CMFo1&{6hho5}hir%~o!=dROmk+STa4MzZXS#dDTi3F5C*! zpozjoWCJxFG8`75v0-v(PmRVn(A)||B>mX$Gb)WYtbVO=M@mxcWoZ3xjKjG2t~cw{ z@`}I07f7C%ZMx)G1Cigg-a8}+{O(U)=!nxWj(|f z1$^Hd)4UhMG!Z)gt@z&B!V{||kS@G^be>Mzdq`H-uAa6JL`QhrIUcgM9|+N{LFbQn zg&|&^Hv0u6MhicZtsNSauU9bG*0vzjB(f{Gm>XO#g<`81q&joq?Go_e7{P42S+4b^ z85TWF7q`p?=4qqdPc4R8nA3@CHTS7<&LLb|62FG6kz^^U26OZ0utt za;ir2qhHP?A_hux+1&*ar$iVkzQv#lW9SB*Ms#kXiW)Yj602a4ZT9Gg1Fl)KBxm*V z%@$BfVabogPevn6riBvZ`UKYzEvQnZ2I+proC}E@pEK69EaoKc*bnsK$(~CO$7@Tj88`Si&_Nj&G_3LOhnbODj0}dv1*&X>|pF;ZS6q`0Xk&vPUMLp8ok*jQBYhEQt zeixL^N$pIml5}$k)HN$OzP7vWUDzSrg1Xz!Ui81Xo0=}I_KeCCYgV|{>0+$UUfUZq z!M1$rSP#vf7dEW4WUZQfuVhulC10Lc4f$fK8cKU^mt~5DZ083RFQ0fx$F@$1WETSa z;>LaHLwWeY00u4G4o@G^rO0;!8@!-;EKSGt7TO4cP5$xc*soCh*0a}J_rBoSj=(zb zfA@wfw{Df++Mj|LH6r!az|SlMgyHC>@$0=wcz~!MPdtKL z0pX0PNp&uD>C`V0dIz4EcEE?HbvwJVvvj205F3(Dr1T+?z3~)};JJBa+HRf|-AXYw zNqyX@+vdyhSK}YNkl_YtaKR%dK+U&_wYA@`nm43(u5T0C(iM#tHTQ-cDaY~BHITL0 z18cDGMdBMca=7mj-h?pI*ogHh8lqO2@j>~)4{#uzm`k59)D~WQWOy7%igxOgIx-3& z6<_!AfvC+PAg_qSTNH>_jgr>@q8+TSqq9!sfGEe9UL<-AZRdfp@G+gr)?985>)xcq zTZS`NeV4sgdB*Nfc%`q+)G%n$ah5P%Rt^^Eb~3rN-tV7QjLBHSAuQz&vV(w*Cp=c3_9P_xKD{Cp}Li!Yp+{J;Qf>j?n`c<24N z|JJBcE3&d;MrCH?%o%M%oxGx1Pjh1l8sdMWd{8Ao-myWY^q=VaR%+q~!|x8(+S4;B zP9DAUp}!Do&plnjm*5hIFvfRiX$x|mMzN>i_SZy@67Wz%ZOk%)UoPNzk@x)gHk{t! zaDUyV3_qHs`k6f^Yl5EEszqEr*NJX8LzP@&PNaOrm#yb)Feu5qzq~c8-EBPI!dt@9 zxR`};X10>MEwd4W5vs8A90S~R8M%}@@ZiA>OE zFf{KLY+SV@wK5k7^j1xm0|bnZ-5sl_f!y@b^d{z6EB>{&gND)fD9nU#OZuR7HZI4v z9kxF}VnrrX30?J|uERI% zERba0e$`=Jo(%#^;U5h9KA?8k1mhGtUPqt0lOCKEGm=Sl`@&kS@PzUW^blGsxGu@! zoYY(#3_4|sjJ78(RbsaDxl<1d;1u1O71pwk5Fl5V(Z$qW6CZN{9iM?^7k_q{f_C;2j{4WTA?|H#v-k3Ovw)j$M0xPUg_!5 zy#i}1xP3I*_!+CSWczNs+0rf}muy`mvnp`o0k z4ZljKGtXKl{a`eN)(@exEt8%ivVo7P>tDc*7>Puy2lSVg`NO>hS-e5MMicq;fVWan ze<9d#oxoj5+aeyx!_f?fr?5HC{M50E1(oB)E((=DH?iK!`W%!(3~a~%n=W0Yx7g8+ zO)e?LK4YV03M;?Wq3Y+FbgG`@gxz!CFF z6UVolnUF=E$ya<*4Q;_U=f1xR&u-Vn%ssn`HLe1U&YbM9#)}Q_WCVMNZ_-Y2&LC=I zmo{#PW$_q$s`1t)cXx7G-I9fD-?x0M!nQ6_YM#LG(0Xd*6oH$+8QaYCMN7{^DkVn| z`8azTwb`Bi25MtZr1-ZTfPZE7|3&_zWB%`AnC$;f{$u}Nk^dSsMx!@a;6dy!s%PYI zayU0qumgxe?d!S!zzW0eTV3QB_3r}%-aY1yl;w#_xNybO)p%$pD0vPJXJyhxv5gBq z@ZP)@aen+1P=V8d(}9&&vtx;3l>RF)PoTW@@M2HbJFPe3!|uuUvE|7zQuOWSiJoRr zEST^0c740K``Mdmbw5qOXr|4@NuK}KvE-I=H->-Lop^5~Zr>yWSyv;!WPG7S@krt& zz}}-DOVoCuJs##kBRFMgNxwvBT!DkR&&nKveq591Vw0EECS&YnjL^Gs>JNgk&zcHE zGZ5MdJ3j{an}dVZ5U!oWGKUq6 zNWQFCQ7Hy~;;7S)8oF6&cJ=rEFT- z4-PLBlDJl*l${8Zy$z~~?-@919S{eS?8Ti&L#9$zqJPM9k^d2>Dyks+M*|93~0<)nUPjzduE) z;8v1uRf`8rwBr$@2@UpL+uB&B&CJHg$^Xz-g1-2-xCe0q?@gi@RkR=ywa<7@B#zMLrRa+oWK1pr6kZ@NAA&hft_A)z~&_SM- zx&5Pj%1U<#u%&k}wmK#HLYsP+@XURW)(%itQczhwiqfGLq0>Q=D z4ddsI8w(Mw;mI*5?sW&WsKTWz+|q$fYP#HGt@M&}DB4NtHiJ>uG1`Cw2Y@I=bVMe8+CR|MD3vsp@Q3U^b*R zE$M&zEWGu{XN=UYEdEr=wnqAdDih>Y=tVk8&{IAZ9l}@Ts(SzFT~+0aQrwW@X(JL< zne6j1_|7tXHSW=t%hK}N=u6=QI!o4YbQdK@Oz3vHhVCw`K_u63v<}^l4`h!JNcLy#=cnMQij1#rr}Fjfg)|Y(fAvI_3(&o87{-QU3;gydqx%x&@3Mf=Uii7Y(NUrREBxk?c^e+wty?kmieiVsV``xjV+6!02 zV>8bL;Y}{GW_dS0r39ZypWk-N{@@10hp|_8Bwujd!fOv@Or0(xDXI&ar=#r;2|18I_lswy*5IVP9SJb`N)c%Z#G$$-VgeMAsu69(mh{Ql!HT z7njS`mt@ORZ0NQxp}pf(w|$O+X|PHoLLcq^in1milhIApz)|B8v_$^&Rk?Sk9jz^{ z>t6e<3^EGE1t`)n&)LV9c>e>Jp%T<>1fCx^xwI?apfM`nq~HK$UNfC@a~A1zj%mot z-k>oAy0o2F%Ka9ikA7Q%N+a{w`05OD_+VIq@-7WUrzIH2dQaEB=$7NV>-#3u?H*sn zJoH4~FQG3x9A7PVzd%VGs#o7_Tv+C(xVp`)j=baa>^M!&zIx-GnU%uryxzha%f1{D zmT*8FV)?A0Q4n`A)#-SDc&%;k_WXGMs*cI##ku~HEMkd09bK(QQ!X;oETp^M!d-ih zr+9TS**vZ_DYkTAAo*0HiY~_Q;KJG*+sAY1wu>>Vn%QDWeE)J~C`~Dvj(6H&Wf-nZ zui5Xirnh)x>L>`4J&pL;@wE54bjYd@QxcBlltSfEY}VgXF4`1$2oBwRqQ}y(&+Y0R zmULBraX7<@5{Jr(KYd(@iljGTU*xKrz8}{*Gn-c6^!TZ0BF~u6+CZL%-NaNVzsTxU z{Lq@!Y3{>)R{y;9`m`_i*nRr6Yr5VYQ@l_U71rb>3A0-5!;eH|%ti|WsQrab?s^ldDb02ac7PW^ z?=QbBK>L-+-rH!C4%5}u+5mvp$K8C<+6DP?5h;Dxd6K%WH*q{MIg-m=A*kdz=Vo{vqO+`dobK!y_pOKXe(TusJnB4}M( z0VvL=8NmKu!gZ5@d{NJF;R0|)P@E6Cnt?=^dA>AK;eD2&La@fraCU*AcJWrCC%f_cK}Ly=$@)ebH_&t5=M7n;i}rhwl(b#7*hSrj30_l8%=)^$(c=L+_IWs;3h#CNnW9X! z03>j;k>YFQ!D`V^Y7_MXYFd;owE99Ir4RCAR{P}QO}lmnwt234a=)`cOlxV}ttWop z+`bfU{wepLZy7-|NnW8fZ9ppZV*$3v2MMPVw_*}li`8fd<4IsiXI>0WG;th4GZAKK zaATJDvO*qQBUc-mRMt&xl9~~=nI*O9G&O6UGafVcqn(P>UOsvheQb<_wjff%VAb%; zMJDM#X)XLY)88P5Zq<-hr?wNpXt3Pq#{FXocz6w5>mO6(hNE=u)@Ddvq*jQ+SXM=r zs4sgHFHTn4F%Q_*3;M~Lg;FiZO02t@K{#2&m?wTx6tePxDapjSbegZ!3_i;0yi5A!4nN;jhnyOq9i=+jMF~D zSvX_QEDWgUgjJ*W?)b4vh6`96#-H5Fb_J~%{`DZgU-u>^-k#japDTR#jxhhJ+y3pgq!vzmYSD2F`7{`HUSvrAf8(f)3CW!BE7D20?b5O1yAWh zsH`|km#ZQWnvFO^K$8!ImRfl8t;bi-^2e8qlvh`Cj2eWH@0pj8qv&-O7Ap3*X!pHo z^-7mdgo_JPWjQDnnf@U#a4W}_P^q`4r)(i8gs&0jRAdufic3I=n)u@-QOeR2_8k-Y ze-Ek4K@P73p$kb``XV&d85+#ZD5M0-ZU+pJVJOw5CC$foMQkW&{H9aMwEIjMZ;LGd z@zII7nHjD8r%(cV1&k5-?;rfe6SNjK0P_T~M2Sm~6x+r9fU_bw`H4_zIanj2kpO$} zu#hDX6}s0!BI6?*!8Cy`-BiKQq4y^mR;x|xf&PhxpR>$=?1XZqyq%!dtbdx6St@e< zEDvKTV9R&tVyj=Ao6|0MTSE_Tq_2z2sO*`!iO>C4n+YsMa%QCmOuz33(<=XIb8%Ui zu_8*@Xu}dDSUvFv7lkDM;Nm}?>>pe-HZ-99g9`(z#NYeIRCJ1Uh9&>BI9(8BuBcAQ z9yR`h*Yd)`PEqZQ#6ru)PGiE0Q+CGNt*}wL{9YcD^{AqnV;5OJc(Pkug4Z9{)5?jf zJ^+ARKqN7*IT|GI8=>A)o2b!rXu6T&^qzoR-ySvB ztWyN5MnP2^tA)`FUI|uwsaq;TYadU9lW+49`wdxiq^Vn~YQ3uFv!xe3XHA2H4zDyn2Tb#5EsiXo7t`-+ud{b#}@PxsOq{dC>I zo+(NFLmz#}FRXB(YO&hDxeFM;py}((M!gN#}D(kAXHx| zcEcI&Q2*`ae(^Nze*69Kcjx=t?S1jr?sI=w+a?^@#-)qv^UeD1%lRzc*HtAG#_hon zB*7Y+>h``(tpJAn8|=*2`0a8RYbM;n4AG^`(q**202)k!3r zKRnlExek_tvIA}>du1jbIRBE0$6wUCpo56# z8<3emS$qcearg77iYa*3%{(4-S8)^ybn+fhd|^l0F!XonuF%q7prJp7=2RG1J1z9- zp!=|Yt=#ijkR09`OmEOm#>jMXeHFU^3AJqcadbUMi%kU?MfZj|FpCnzEIGZ^TOb(g zD&lUppt6Fd%8x3kx_KURe6pmGp+&SqOhs=$>(dECI(=|~+-rTI_?VkV9}gVQI-&a8 zAynrk<}8#5AfEpED3%0z+ne91D_$y^vSQC>O9)UT1n82XK<fW?dw;zZm21bAJFi|$*u4{8wzL-jt_2p=9tGoLw zn|=1E9qH`heR#e!dpQ6!yv%zyLZV$+<_*$dCqir)u zfl-rujFY{yS$Cn4xShu zm7wmigZFiBcqcL-LyWeL1BimEUa3|y94it?|Jyw0tU>H?#AtV~Jw^qa3vvHk!eSz5 zgy|?xpG+l{+)0j3-0YhhGha)|0A)OhX~~Yc*!`f+wzjku%%G!VNPmZi^gx%&enu6W z90sqTmd%t}Tg4!%oMMqEB`LxxiW}Jgk4~t=y2o+N{(0UHNol7q&{;Fh?b~Z?qCK4f zD%paf-ma1Faip+QCJk=T)$Lg!+Coyu+ujeVun@EK{7QgH*#dJ;wcM;KzjkO5^vCQK z&yUspLuS&?9D4f9i3mh8H-@6mXEVvWyaN5!rGk0FTQJ-92{v}ncFd-FG>{A1XGg7 z{YsJlyF^KY(X8GUX^8Jm#w{Vf3Zk5t*C>O!yc0{^;9O~>^_Rvfkzqq2O8>98ZT}cY z!}vO2@ms^_A~{H_+8Y<@{vnr|MHZ7OjGVl#44FZF8HZ}QpxNp7dD|;|)Y97!gz`50 zMom0HGev(8^H>Rwl>@VQuci4z96Bv}1`x4nWIDg08kpz~N|%K#^3AeV8WuYNP;W!_ z()92VzM7@8bb>I%Id}vWb7JP%d|-K;#nd6OGB4sjh!+!PTAt+y=Hl!-=(dvTyQh5? z|KK0nEuE$5cT)^N_~f-e_p3`Np7C;S>9+Ltqpj&L2SoJRvH`-x6H~FEQBN>k*d5KRckM)=p2CRMZA<8J_t?{53NyQLoL@Al&VW4k)JJg;Azzwj^{g}#5jWRB@^s9X;c{>wvJF(@ny zQ*`WY)mLK7dbzV;q8vm~c+o85EN=YL_f0fXEN#F^;V7v1L{TlRL={BBwtOJa5Tzn4 zU8TmzOCaq+xp{L!#A!2}S-~k?mfL=?b)`xbFZ^~-s{l6GDGqq~N&7`t3m*gr)lm<~9GfRaBU*NMDEm^4Oj*u})C>^6O`wuYr0k_gGO2!( zkSxU{ZqX-zDWj4yXGkc9uPg zIQ%OwvCYTwy*?Yw_REtp~vWJ`Up%iZLjD%Ii} zNxdl@esh~YfMsbayTw^nT3sv7=aQLG?(YaSQYSI()@zt2_AWE#7NAdfC{ew(90@9iLh4heE}9GCk}0^jVMn=Cw~RIapZ)=V54&v zkX!5o>L6tJ_Y8U#%wI%wJxw85|eEC>&;6(SFp# z#*M^MM6=C6x>{XN;n#sHz9m9&QeFN623>TS)N0R<=vCL;@6BO%;V;GJ09^xHIM_L^ zQ`LA>y_tV7K+AbhQ^3e`^#gMcB?*Jh>Z`KAYPS`f0;+X^R@7QDwcD54zgB_;H_#55 z$9KX=BML;KM9N~!V=_-}Oe!;*c^fwpEJlk0j@=lkAh4t+1<67*vp-lMr)7iauM0A9 z5$--w&FaiW+CxVtbaUp%%Vp3l(y*5x=o!6i5La3Vel!F3qHnpZi0BI=P|I4n2^&A6 zr(LuyydOtnOxKw(6*kN9T{FS@NIbmykcoxb5tTR^9ZB+up}jssf{?_5B4?5aNNT!nM_+#RB9kMAl|mPHK#+f0 z07QUUP3RhuH`g}Yfuv$clv*6sbfZ4|R%I0OS`2deXh5$P#@jciiVhp*yLjtx-><;= zqsfR>--x3+)c`bCSimY6<&zgm63B2YK3a)%J4jwso2RtB!!`;SzeP7CWH1Gq(Ak9=-^1cApMq;bQLh^uzk{H}s;!dm zc2lO2o=Aij&e|R|SN2@^PIutWa(}>E5MCALO#U}O#}nDKmf~A@eQ{OMSZ~Q|v!e?H zL6PjM9Mgi7HVg0dlwVz`;UGvkjDg)BfSwZC`>tvb;vmowM^lGA2GkeNU=&3OjX2nz zs?0FiWUR8(i-?pd()ZKgM7wJeTi?owlj^}u+WKAFIDlWE(0}kS*)Uaz{G_-6@>{2T zoSuDL+=+zbUN$O_kJODP*+9Ttu$FH*QvV!LJNl{>HIh7c>7lpRz5?uM@o}c)uahU! z@Uax|L?>c#&Hd&=f_4>Gv|BF+Qc9hquI{77D}i@B9x^l4>#aSig#L$1jJk}tzCJaa zt7tSAQg!&@6whpkdiko#cuQSba>m1~P+flE){&eT);B`_ta;?UB4s#-3*DIuR9}`G zy9c1lNH5cb2y^qJ8F!+fM=JZE&uAR7O$of%A;2-&O9pDq0xUiKzR7$fX8{xI-uV|h zSoO^EuBg^A%Ou{NDsa6F^UcpeF~|sjRw3~WN~7>%2bio|gFdbE`6&T+=$1=24K)LN z7kL5kGg;jtf`ljUxnh@dw>&`6DM_ZWgV|J={-KyA7%VM!qm}h4zmZhE;@o16c{Uj9 ziHbl;ARmAIoUD8ZB=0)4w_V~nbRMa5Pl9LN$NH%qvQLP;%m;s_;mge1OSxhMQQV0= zV!3BKnn#Ua68C!o&y%4hcW%No2eKhfxepmcf2(#fYy0|U8|>}@$IO|s7^Fim+q*ap zCJ|3(gxo!??{xOtKxN&-g$Evr1l70JQ){MnxeuC>jOB^Enqj~d*^N5NME-vXn z$_9;;&|~f?**G#yBmdAZ5lIQ{plO(Kr~6II1r{*-+9q;y75;(E{q-3DacHM zoR^5B`A_qzNP$=&`M?Y`Kw30gY`B(%y-pw1L!*ti5L0YoBF4G#2I8-V)>=3W#cy;h z4%`*|5^RW|s_0%a&=LvhQD+_W+7j2uMtYrA%aeu52_9~3X%qzljZ}-t# z-*#}af^kmCwuo3~cM|`U1J;XsLtbjiBz+6Ds6dA9iO7f*#PVPj~tVGXUg}#*|0_G%KCI zs{~*J10-td7#Sx(0baANu{}ih>ZxnG#+<5L#@%{5#P322R+h>=yD3ikb}wuT8!a~_ zcyz6_8_qx@i1g{fdGh}>CL%iGS`=o?b2wsh#ic+J--{C$zRROIE>kp6kvYWjlH4<0 zOZ+0=R4SwIN#GdhwAw={^;j{DEy96t>2%+=k5wa&z3kg}={&at-2dA?rRK@!gHro_ z*xSH)VHp0Z5J+4vU1VZRXi8RX4-+c33p1^9E^s3Z@&JW59^2koG7mFk^Bo3|oE5Ew zzd64iO#&mF*Hwt07k*mV*H4UoJ601lKZ<5t<+hG}IP?bylH%KwFf%&HUbh~8vWBg9 zyMp3?YFZ8C3qY(!EppcS@BZ@C)NitSW0G?Njo{*Jh8?NH*hGho_^rpy(@k0R_o_QD z)>(V4gWBB*O)wj575e?jv3LRAC@rlem{YWvOs876uFFotpcZ*}#2&OwMDvdR592%T z>+Qc+U4gvcK%H>?sQ;e@`#;O@e-`YF>8e zrQ@8+G4p31Y4nJ37$D3K``3y#K3G2)?-F1#>;?YKbqI1sV!C@|ZC(xfbutBNxe}q$ z!Bz8Lm=2R$sBWK|&2iQupO5DECA+H?d=Hvbbir#zP?o)7X%5wX*H49?v7r2W?Uu*e z%cr6(Ag%(eSM~enYHLEknU73UAw9KrXbU@ z@DL!AOBjJc;Sg0z9o-5>G_N3Za8u0Z@cIqmMo1gKs8NA-mtv-xx)KtN?x#WFm`!6OhhmKp3wWq%)bpCJaOT_b6U?wY?Iblvvf6-H zG=h@1kdqclrT$=TK;$JhQeWgmPQ1Y{Hp!P#U5fb;{uVh3^eDE+>C5wIz3Lwk$k}5y zVWro?Ga;ph@InI-3=NKPZ}; zvX7>-Hu1(rN?aq$lhlS;f>MAaLrYsjTe|}YiAv!LXsZydVOtn6o3pwiN$NTHjSarM zIU5x@6_^ZITtmz2oZSV!{F4!oe0dvg!Mr=LB(YiJP;|Vf3X8RSW7%F|pvX zCn}{yrFlvfZ0?bt|Dt~%MPo|g2x%swi~aCQIivjxuLlPhI+YmC)nE~mybHtI#O@kW;D7#*tZynNnT0@1h=jsM4^N9P2$(>|>O3GH=K)dbgLo{k9BV&yS?RStN!O z>lH;FW9#lCX+B8Ge!mvU?KrwIN14<^RkQF^XUZ%4tSb{*e3NG4_<6l@IqN78j_vVw za=(~@kH6ld#f9O#VhaP;``nWQ{;(pAQ=U;?TggN-2!q{=Hy~PL1>x?FT(d(C1^wDH zFg{+1z5kr+>IQHS7JxHx1RTooUb^Nk5%1O#(t14d_eiWYvIMaw)u8)J;~#fWfj~`W z5?AQ;EUC=KCo_xmSCx8j5{LLd`)bl4f{`CU@&?JLE$|C?3#2A^GKJYTefB+ZzpzOk zmo~{h2xzFCVKAlUX?|7So5+`g;jbfjZYV5Z-CW$XZGE(Tk%psfe^_*lL6y^q<5fA% z*+?o1j{8BZ`Vk{EOaCn-1@ta?i>)YNpn(6%&Q7>JotA^GFgsg0TMu0yV7dyno*Ef; z==!7|c6e(pftoGm5ou;0o(t1Q;a3JDw#@WgxiN=ShAMWiNzk7Bq41A?TFWkFKQxDq z*0F7)IYxY=xpoT@?edV{Z8$=UO$PY}kRpg)h{1{}m&;4ae=AvWyjTvY1^yzF4wq$j zgA#Dzf{+ozVcNU}7jfZg^&-MEsJ67$t3AFljsF2lXGyqnZD+pQZ-aLnDLd!{S377s zIseg4^1&|`Y@oIr)Z}{XpGXWpYom0V{t5T{)8aAMqFX*r9#UOjN#23OT1dbo$?n*? zk%u4D%)_Z5@Yaqf6yufMNi0T`nWALOU#~_^7H=P@x<`@@!=sU$)@CIB6C(e78I0M- z>GQ^_ORCD_pRqYdR(QHi-DhCaap9+LUjF_TYiYRtMiF~!&!&*spPS{7S#}eeH@GQ0 zYa8RVHEVJZQ4#umQkJ^@tRf^N0C7`~NGf-jQii59OWC9{c+9}! zI1z3q?KflsR%`fDfsUS?+w-DDa@rUDIjjfee7{x*mZrjoIT_Jf0?}`q=jCfTJ?CPv`&|{ zjsDD`|m{)k`cCv_)o$fPe{BH6t4h^hv?~Ax$UEYlBN|8aQ$vD8 zyy@c{2O&)jBP~g3lRGocS+75KRUyk|=vHVz<}<3-!uAQv9x@*P9n{90r z-Qw`;a+jR6Ffq~lTg%-tZRFs4%DTEIf1F$AeAZ;CjWa z(^6x4`n#OxT*ZIgzVBkY7b9q=v1bGKT?+a(DV1o7s8 zUDMS8SY4Ejh+XqK!&{4g5B1i$GQmv>m9$eDrW5)e!L_ji`GZGC9DH2DZ}wI?F9&3I zcCSl+;IAda7P`=!1Xz9_AX_n?b@w2To|m8NpL;Y{wi>)t!i#9vV~$`)QJXU50*FHS z3#0_VR9Oo)PPQ7Rs{F-%0nWjd@mS?#V$_sdOWZ1N%rROIHXWZ$u&Lz=Ne!7f4G|iB z7zqXr=oI9Za1{hSETd-C!3Hz2eGTT5#6|%L#@#q&J7cgx!J806wuYGdO?Q)*VGbLd z2&1B!Aj9A>f6C!9_7O7SV{0cUj^Qe|I%LJGg*wS7?^-B z4bQ9-vgnuX4cfBGJ2wY4eb{rn+r-2*EIsHa)kqRk@|6NK8}anXeZ;{$4Yc?WtG-heqEy3u>econUgv31nVz5JRE31wuLVWjXSvxbL5kAkBX zIUA2N_#+5QC_Tf0fN9nH0c7QELO=pL0-FJE5Ik{sW$ z(S2REfgg4j0X)VU1ZN_(D95oR!1ku>G1$TxJ2Ersi@!ff-TAzhYynFco^M3Lxl7gt z*-fm-5dYSjCOM-z;T<_v`VZ?W+X^DxqHaJKC;lOgnM~X`g5qEOBW78%1`;b(U~)E% zGzdDDv3qh?uPKppY9Qcc0s7e7v0heJ&YC~xA|fz&%=gY@gX47H?Ep@B2-|ZP0hjb7 zdkl+aaq!Mc5&AKX?rMlM(4peGI|Cjc!z2>odr`S>s>)cYw*(d2#pL^DP#@VQ5+(cZ z7|X&N9N0QtAw9)e0TA1CvfeDbfv*WA! zUgOE`kln3^2hgRB(m4ET{(QDlhA_(R%*j5F(Vw{|gH+}qzc=CCSb2*s6@G$=6dLA6 z^*UO-0@8JxfGsT4OcBk*^5EUgY_rPaVO(zy9fjw%hOxt-w5i_nF&v=prx@Hfrr>O9 zxuMVjYIQ(dnD*^>V&V#cj}s*v0rl(}6|61$v4R|&To|y9>Ejcc#dOLlaTt9DU%g{N zB}%_t=jxz&)z3>i0?dT8d%7aJdWifWaUD#Bxl_H)SN}TBvZfys2amREF2x>s(e3EZf zX?QZIqpC>-m7bKFS?oYF#p=exqv&5ld4yPJe^EMq6BJGHaTP&#`8 zuc$^r!IvP5XjD`#H_dFzI|Hzisk^m3V}oZ9a$Z z)WH&Iqq?n>N@+7P1|zpy{p+~d`sK|B6Nh2|vIdNj49AB_M zc#)ME#v8vFK@?g+j0b39@B1xN6L$oBU9t%V@p2OyW-ORgD0GgR$T6iU`}XnQ<^*p# zmQOXgfLF7z{{V2gp``ZZK!0E6z$1z_Al0;$coK>d{7USvxdFG$7(o&Nsh@u=a_S3( zm7I$Gsq%?xVsy5}WE{0jnZ(J%j_=7D*uzAEeaBBwats-MgkV%LY7)s!x)zwk^uX{* zzvc{WwoFCxi@SHAJ5Cl+uBvD(MPO=>k7V)?tDf$gCH6DPTbAMR$ju|K5w&QGuVny9Wd(+4jNDP|#(&>1;U)=q5N=2?}@nTH&zw*`yf=YYfZAI{KZ0Qd9 zq3E?~w4B6fPe0KPCBoXlBC#jFst;Ew;xj7~8*+&h7{#vcC9MNEDLPuN$MTC?lp>DE z+fm72#1sU1E1$D>2_U3~u=M*!sfxqcOaf(D3~h{q7%djqk8GRGCWCTkL=C43)1I2} zuVk9#8ANyvHE??t8=P1n($P1o61PPItdGrVhO4tRz1$z2!QyQ3{h#9?(c!W9MC%z1 zMSj^2@w$6Hp4{R&Uw6G;m6wb7Y>k$SbPs;NpCo(-`QZ9=yziVX$GBuy*^hF1WVRl} zTU&(;s#zf>bvy^}&&fAAnz%7Urb+E3w!aX$F(CW5JB+b%V+?WJaj6(<2;+ektmP8M z?9U4A4i7!0Nh~Bw-MNpIj>J>S%|Sb~FEdy56B{Ss3_)P=0Kx%hVMntE0XusW24ZfLcd9{g+URT;%4mdQo)3!!SRm6?+vc( zKlFR%8^j@k`=sD+0BHL?pwOkTl4|m=ionc}qp4LNbymw{h{w)lR?P*_4ZWCzu1F=w zPQj(ZHP#nqCaM!{DgvV8J+@*u=zss}ot7;=C^Q8E{e7p?YSp4%r3(TD4PZnnh^8_g zhhc7^ne>hlWfIH{7DNiVRWU;OM542>m8h_%fIT-Zr8&pq_DjeSOMP z!89Lkg8P_>1Gg4e|d#xs${?>iSHvDb5?nT_~*{S7kFYw)VxLNS`X`1dUnvF&q z{PM-HCS$Jl>BJO7Wwu5yYCl_siMv+Z;0q&6ewl+k<*8b0oAS&htWl{~M(i%ygUQh8 z^$jI{@SDg(gefnQS5;|=j=!tTsD6fX zi=4n#6Jxr?i$^|0NGxHKJLS>KFXnbwU0^*cjY8Z!fIOsBvOyofePxZk*(cI%cv5v-?oCF@jN z*ziQ&q;yM~^p{g;2#x@=MQmZ6WyA&zusxaHXffvXLEXzOy{w+Aa{QMk)5%y|P49v= zzc!%6`Bp(DRhPLt@9z>#=I!H!G~*Oi>5p@3NR~6Y$Jbrx|*D;m*haz zYv^urN4?`WO%3CXu$3E~q3VU?Bx|Fq__|QB6AaX7%8h;20^x$sEe?X}R2|%sIOxW3 z8)zR4sKWSLqSRD_UHcncWt9l_T}M@C3y6DqsjVQ~nl?SrgBvIECM2K7z%mDK}N&v$BQy$GH@FTvLGQ#AQA+hsb&gnTVd*dSB`ch3( z=kuogc0=8OmREXlJV6}xXL8`$qviM%Qb_&CiW$|2V!WGK)b0XV?$!kE5TpJ~u~p0@ zmlo5H+kmHG2x!F53;sfl41spDI@D#d1(y{wM|3INLVgKQcES~!(!MVhM$ZupJ)8@O zXI|n;x6p?Vcj+9cjWyF3!M0we(_o<@JBls@hwQjiaIS=+eet%2@q)^M@d(MajVnP? zE1LUXEb;PYPPq~Yb2MwJW1MR`L%}%680cuYbip7pe$?F;_od)4gw$qL>z8yvV&LVd zCi+5ZpbY{&0d39XHrmY`(QTL2~8ewHy01F)3?j&F2Ryob&NAaG7 z&9IPnZ^e4aTI#*qd5ILc*KzW}hawVC$R|47b^^CBEqJ+QaH2qt;~rS{tAQ)Aw(&t& z2Sxak@Up$4r2rwy50+YxuvDs?g*~7_U<)MJxIKx8_c5bc`T)S%-W`d6u{s={uAl%% zhq$5R&VWEU`x4M2mWqMZhE3G_aDR-)uT3`mCWH$>P^R?jS0CE#F9iVPm$G#8jn;ns z1-dG8FZ(DHN64dTOV3)^0jVroq)t$xkw}r>XD5aXOgU_5FRHqKuRomD{Nh$R!0B#h zmdxEOO(ZiY0~O8Kntkb>GM^dkc6~ztWi)1HDpHK_l>lDR#YIlWFYoo`19`Df7KPbY z*Ag%nUC<{w#w#;De|%k*#Z6p<|Jshjfpoq5e)<0cYvfcFy#HzS|BAWCVxMd(8lV;}^w`SR~z+Mnn{S%lOTUL(pr5h^QWL z$-u=E;U~L=ESGAM{>*MjfIf_a`IUnmX&C4>vI4*kUZXJ~gBFvln;+p1O_Z8mldo?_ zuawaNM5eId80c;H^xHPgWBB8_Smhg-&`qT1-}kfrm0SBK3&+Gx$MD|-REB>)yiL#W zPi9V@R@lta(a0X3R@hR{(MZt9z{b#shX>NZ(cVbU3eq*RQ&S>=SR`)A49l`T3C^Gbc4Lj??YRrh$ZRN&umywo<#9p z9TBS!eX9*0H`$11?dxy%83}M{F?+4nRl&w?PE~uc_H#fU@6GHdP|zpm+Myz>kLE&2pM~R)e1Dm&P&3y$f0dUghpojya;vB3&s)5mw!ORt$rzu}+qP}nwr$(CZQHi-uJx|1dif(NvLdn?+1ZWL+^w_68f(sEn7D7- z-!tepa-V8k8Cmh3(ZG???O)!>)p3cm?;c*<^%J59rYCzvC^h;uYCc#dUmp$~vO}?3 z6du@PFfT%!@2Blye0zV#;vn6kVBG%RaNQq4JmN3`vcXu-&6Deq?`6CF;(0ZMLN}kW!H5FvTL!~i=vzOgN3bZ4^JU;!|XEr*$ zv5L!8e!)(v(wuBqT2dL&39tKIK^is=TN%vF>o26DOj?ze#AtP0Vu9@M+tAlF3LnmA-9ta(9ZtXGFntDePwa_nPc&ez1J$JT-cZ>X6Iq zwkiIjbBfjXUil~2wdj-}pL(I5#7iR-@E?(O zbM;(eKJ|xzn)Hv{ zgc*=I06oxT@Pq(0X8-hzx(;wCdb&(Z`p7h)G)qw9aM}69jMFkmHz3V?ntn`dGAM(P zqM3(OA?JnrG}s&aLbdMpX(MzUC6<3-_7pDOSn!OoL_!4v4i^Lm6wsC|e%?AtFF1Pd zhx;BJ{y=O4S%F2pP`^!cB4~R(jDY!$)wmczk!(G{n*O60RZf`T?cb_-21^ejPX+9U}^Wxe~h8xYae zTMmK06DgRf>d~CG%|9MLNTIdd;>R%VU0-=2rywN3Ev_-MPu|!N032*cnQD9_It7=f zV6RZHz2Fmd4!A|r3k9Cbzwi$XMhFm0l;$^wv4}2U`1VjlJsjL>FV->#g@Ed!%`<5o zKUg$SO#~tcX|YaBwD;)Y>C|8_?e=aWZM*@LYla*uBdCZrU8>>Imn0xQ%FJB}|F!%L z8ldDEE>g^F7#@3=Ja{hdltac`puBnPrkYg)2*kD{n>WL9%j*~7@8AGRKFUU0NUzl8 zroj`>F;09k?H1clt)h8zWl)p4Zb)#6YzfXYS2ClNuW@AGoVp+lCphqkF?~? zW3ZTq@l6I7@_|6^hGJoswj}U?u+}*-uZTp(Os+0CPb)S7AgP6CLo_2t1MY@G;zQ!Q zl68YIu#6z!{H`j9K^4g`xbitX@}gTRgZ-c%I2`6|#o$k|;+y86Z)6fdk%_faW+4nw&?$abqvq$42y?w*g= zLUEcSt+#b)T{nvhY|GWI# z^ZmTr?XJ(${oiF-H~S1F!`B1OgQY{pB1Ru_;_z@uD;?MoF(Xh^tWtmyWCL5mkZFV@ zLI-Wz@E=!%ode9+&{#;wXN?}}UE)(M`)F+xa>z`eQz2pXK(u#@wace2Psk%c!CCb6lSin}f-?v4jS#AF@Bp-Tn) z`;hivwq_SUJ1TP9;iG`uLV}-nRJ0c@zA74ERf!edve<%tff$iNwSq?t5(?q&<|KDG z3h%fz-jH}M_OR>_q%9(U8qi^w%q|V~lDU@BY)ByY5xpsk}Jaf}oTqsK^{#-R&CF`#%!fBuA4E6s|#wu$a$onZ@;#{vgNQ@U2NM%2ad?W~GEEvPXW-*V#y;mFC;gw%A!xrTxP zXus2?Q}d0VSj|AQVdj*Osr9iU7Q0G_$Q;tP3ZAYzCeQK6pqVrgX?teOwJhY2t|~VH z1&tPr!}O{+mLX_~Kh@c)RX)P5&b1KMa7jTo5aSlJLy_;iniiUci^&}O`G_$VvNRp7 z$ogq*sFgI?r!(3Y|K7)wSeR}xb5q(PwDFJQQaCCssu!LEG${>z*LQ=nu{r@aD^R)9WRPrBzC0R_G5 zNJzL$VfaQmmwB?)IWw$2fk;wg{Vi-aSZGz(0C9?LelaR%tx$T^5{-5dS;K(7!EzD) z2!s(O15Wx@J8iE{`YJIT6r<`--!vCr9b6O+el1ZB00kR))J9Xks^h>nZtJyF0{rB# z&(db%38k?i{~X;%1g2kvMnJlGD0p(;t(4FP=UBRch)Az!2I;KFyD1Tm|I?W48j$DC zO6$jfyp?Efw3#?6=}Ydc20P*7RNy8E!FQRE4S=xoWg#@Jzb`RtAPP#qR!=Rm-(_OLTbF>U=*+Y8MH*xXg+VXS{*@F2Jhy(>l13;_ zbHyTc#ybH)Vr#pnUydB`86IA@a#2HV$||Ik+@Ym$4n;^ULg<|maadZW*N)YV9##dI z#&sOex$SDo25Z;~RZ?EQ-e{#XfzGu3>n*2f$t<&`TC7YZMHBHBLiihvNVPx>*YK>` zw|c8niCaPV)^-99Sa^L&1?GBggbm&-dyVoYFic#bo?#A0GM?cIk~pu$r??eTlFo8VQEcqD_YopRo#uGXxJnedpj;ojDPbkn zL4j>)P;saT#USOirJPns#TKXGS=6MuUCD^=xC_MT!W`ozlB{FR_Te!$i3$dv9^IPo zyHCU345~>2!Y0cVwA36kx+sTW%NaYB0R^+|8o<~B2>qxQlbxU(AYVi*_5%frV!KU9 z_;n9kugTq8b}=879r{@gIKn}c*-Sf?7?jJM_qx*zjvI@5g|x9EHDJJwB^axx9$eZ5 z;=88j-gqcz9pCS7UDgJ}rwwS*)*}50Q&g%-RXIC#UUZf8ok(4|_82UM7u&1(* z2b{FA#e#d(%Rn0|}~ z2cGY)G0YXn5(%v4GG%z0SR(uL@g0dyKpjMxqlZt`n)ZKP=&}pY^8rM)J8MmSrZ09Q zNoOrlQY;lXh5MjvGO`nLW{^?i{49tkr&WTS<*|b+4Dln!P0iw8+ABQ}EXZD02h_*B?k6 zW#Zb7(}geD6V_rE=dIb(;4}kUsy3}v{0IoEusiFS>m2vUN~qe7Z(4N5yfW1j`qYW+ zZ~zNya%@H}VoqpV3LR8Gooe=dhsuQ3SXa8WUVHS(=dl^3-F?`%lSMw@|h-H%Jdzcr^HMrC+`AF z;mJ}1`F&J-cfnEhYXiWb!dIa}Lo^J3G44h}~tvK6Ohim#+FlUW98`e_bnA zl}Sds)mBMQly^dm{dp=_!MkfLxS~jr?D>z*AIg2nc+=!9P}#IL7OlEmd>cBTaKLn( zMZ_VWHG+vv%U3=J5{rEu#D&0t*O(6IjZvTn0Z+va z_LI%ILlKjIMUq!zqO4xPMlh9t_q7_Bq&OcmU5@B)w4@i?#A=NR zh?D@+!I%yUA>y3sCY@2@hSM7?6VPgb2vE)v^y=Wam((O|^U+B{^QK|pkyKV*Trg3% z?`Ia!CiU{urV$e4jvK8{OUqK-hvZH>#~(aXT4UgFf_~?N>ns!X&ZKe&wt4%eg720h zg)%b#B2NGqNwiL~RQ}!zanRm57aerHJk^0%lN1y^v0QE?V&q%hEdwi!Nc(qAHG|nD zD?vBBv_M|TDI7VIpA%o`L++{Tn&f0gDxzbN`@1hBdk#Oql~yFNf9X~W<|t;Pzk@1FKh<LR}f#>I?JWS_9^&8DWzJ~F`R~Y0#oWzGMBpRGS3b^QJCvU$9d^xupi}zq6vL< zN70mo7oW>FsCfLo&2cXZ#h^Ix?@wj!YML|g#QV}gmHV9ZV!%PB3*~l}NU67o0iwpx zqhLhZ^k~A4@YCag;Q?{p*to!?{&CYsIx}w5HrL-CjXy(0?meZ$T%;tz9RYp`Kq-GZ zKiGc@W{kpzd}RbbxL#w%jmw#AbYK`PB-Zbt)2Sc6)8lf|ONh$ishOn-oi3t3g{sW2 z=xT?wDiy)5hS{GjxNNsHiTbwV)#fq6MU;7Ea|nk8~LtnPcRutK9AV z#Pc0w`={E5;iSV!ETwaMJ_C|CYti)bhAr#G4ZeZCziOVN`xiD25I$`8mX+J*c8na8 z*{JmGb#(%T4>YOS;Klzs7GXUxzTq10uuYyl|1uj>2&Xze9fF+KuX&iAZ7l4b&av8< zqA9a7=|mLQG6&x%zAd=K=+Zz+^5p!STFWmY578j3jl}EU%CY^@9c6Z?c;P?pdKU_w zX&@K?&{Jujok@?!{a`@X_x|dC3avldfD#lZqsFr$ow`48xLg{B>z4rq%An)*In#|M zH5lbw2~(Tkkg46Zn?zO@B?Tl(`j({@P95>~v+Ujul!+f)OLKS(g%>S#H`0o%UMLdU zd&wK)NUdQQe?d`JW`_Tk{F(nt=>M;; z|BvL)%=*89qOCfT={Tc^r#$h=H_`UK*K977uQLx$0!(1g z&p$-#6IIuFn8dvNnzHU{bcu-iK8-1Qwj(6$K|krgelCtqx7PihFCQW{e8c(XeR{G$Yzce5mSm>p{hU8An7^#Z$!}(^mx#3IfQZvUDkL8u+^C@SYvtvAyNp zb?*{5$}VH%6IP!J`eyWP@W}zg5S$|Hzdk|{5(5RIgJY{P@alGX25AHr*lQ}uf^-(G zu_N=%EKNfX%w@5D+o4%v-lt;8O32sn+%oy022Z^-e19U(Zb?f%!tB!Pl?)$AJ?pL# zrj|UBvG4q4f4MQLaOq)kLfPGbbQUawn9ZjbO3XY)xtV*fO-p(=EtxHj`F0g{pD#IVRcFC^XcjqXs@~HqBOMXg_k55GwZ4XN8pPVIYXG=-9Oy6yD!_enMNfZQ~)vG zI(A<`L-s^Hhp(j~u=szy*@8Vo5k= z0Bo8rjBBl%2?K=pJ_s4-=LAeHXe+oQzxihrV!S8Q(^pfmA+B20M1L~=xJ__OEd8-@ z1INuMh9P&-;*yB8d{qL19DX6RjL(fFO(DF=iY4Y9_On^h;$fn;m#9Z+;oc0(DnZyn zDMek#S=P-c2RNDm&ShBu(pnH?%`-$7g9wdRzd0f$bK0Z&*##}3E4fRn{SI@{8rrUU zzTP`5dMV)^3+-S9yh#-%jEK#zwt44A}2v3_U9+xPY(4gYM0}EUlJ1pWDivSng zj#-uc`^XNS`-P(uU%rxPopu>0f3*gX)JYKc<<2{qfeEmQ7*7fw<>=8&BsPq^&2e({ zCr3qC2%BvDwcUgwy7E48fCQcoIB4^rg|RqU7(O>awSaxl<4F+Ys434E;;3!t?W{%p z3{>P1*{^L&&^aPW_&x>B7>D1!pBcbUQ!pF21}*_qV^H6%nQ$Seun4mUIf}cK1A%!$ zZdv0hY{4Jds9Pcr*~q_7d8ApS2UXz7l}K{zl2OYX3Dh-aO|eoQyutt?;gvCi(8M=M z9Ba4}y^q=eY z`&cXi(#6~)%^p_NIUZ}8(bzDJrE!HJI3k`WKqse}3R~f921LAP z?F1?^YJ*T9K&6W{sGtL*@yM88!nv+Den=yPb(tvj_mKAj@$j>It$5)I@sD}qN@@Jx zKOS~U|IEwRayf%PaYH59RGwc=;nfMOF2v%3hR%~H83Q;V@kQuz!3(d( zP=SpwIyln}JZA&Cd0cXQJ<(Op(kCP1RpYq5FKlJ(8L|x%hcVr)=^{ME&NYNo68zqG zHsy}XgKG3pm2mg77a&ER{QJ*7rQD@_K75WLU%ujclp`uT_HkxGXooEuu%@xr6vTe} zwr%+`&6Y+vxyIHH87F(Cyg3DpfF8#7nFW-QmHJ5qj*kb93Eh&_+8zfeGMs(ui<1y%I3OBeZSn}uB)p{Ubds?Iff#|y$ZN`%z##j{Sbehm(&&#ATnl8+FV;~Y zIWd`qgA?rBNEJ+M_DYh2QxY((p|0F>4Lf!|Bx4-4|rg_s5Q_jN@Sf7PMb4BEhIcCOiv6gHXUjhpJz zrVdv|<$~Xxqnd<7wJ+(cNM0vCfNdma&T+Y+JV}Mxf_iF(8)aePEU3)s?Isl;lo~lE zsaD!Jw@vQKoD`n=af+&fr;oKy7JbkQAG{NwS6JP({($+*>7-OM} z@3OxUO%>BOo}6YA4n)n>NIrp+12DS@h%=pRv>qzhzF5+OyhM8hOn~^0e$`Kw4U@9SsP~clo6d+Fj{ zM+YAU6n5Ypy71;0s+Z&c!Wr|mO9YGq#nH9@4zumaGf=#UG-W+BLRU_d#4|TeqiL-n zeNe>lui!Qez;msJ#77WD-sP6bfF$mp5tEjI<_wyc;Y2UG@Sshv+n^~g;Qi|`_1D)i zx`2ZS3lFI_9uSEddFD9=U*u}q@H+C?(K)rXpu7+)EKQLUP}pqN4ZzqPc?Uqzr1MJ* zAU`NHX?MBJICcWzQUf7!jfpiDA3{|fP6Y?4Q}aeNp=mUrfFx2~Vw8vD(SgC41=&UL z(YyzY>8W-CT8SE#T#VK(;WzKNg2nV$+vGp)_PF3IH+S?QUrkahDQFp1p<+xXH` zz!#77;Q4kf)slBs+5Fm}Cv|TC+gl88&0gjMr3Y79QH2pxY%mV#8ruYDW&>W+NW)>e#ElV0qmBod>rXu^<)FWF$ z5#MTZZS#g$tzE5>h9QLEbQq@(bJfhm_C9Xsy`kb1C_b!yZd4PA=lmHOTc2mghFp4@ z>BqWa;7hP0Sg*_YRbLJP1Mazy$Eg#6OSKumhc?Ck&v25Iv+@N*D=QUc9$6e_zwT^zj`o`6|yDz)7BEhyO2h7D%+8Vtu0rG+&{90##%j^Q zj_1cZOaDBsY@M%iJT=rE1%FE*z3ID&HDGlK*diz}poS(_j|+(B3Z%G>4!qGfjMCf+ z>+$-v>#52!CMc{;bnS8!t7mILo5d}+4(etUmaMu0M|A2H1#`sCi>BqEd?pD^S&u}( z`Cmyx76peCg}tVc_uz}YU{mr7EEbk|&A&hrz6E*hCsXPW)x zHTVY-Nx;Zz%QODeU7}=0<+R4x9LU!3_*bLE!3kC6L{Tu}wJDvsH%T!Uq3{MBxA}S7 z_~x;pqt{BkU*8fZQ;DKr_waJ>D`6SfdV|3Hqwm4R`F7W>4b>n%JhO|{=`~JnDgvfHY$O`#gfVI`ozCwe>`YQWvifa+O zJ2(Ggd*1G#JO%%F4M01Zsq9FP_Hk)tj4b9Z9Zh5YsBhw zfm7GHf%crA1JTW;nxX9uDP^@+HyUc#CpXo}e*IUq(?5>Me-CJ`HL@q^rgE2afjWe~ev&GPpqypd$&Ro8k)!1qLM zv^3Gp94Rh@e#?SeavD81T^mD)9Cm0bK|0gN>5C8d(KF7-X z-}#Nq|2HJ!{~<*z4F4Nabc3^LhcnJNFXBgF4-E?8W^-F{E1U*AqFyw>Mw2auM>AX? z62(Rn*<~RK@o-yt+1yobE-6)*7euh;R2F~PRi9^$&Gra8{9Ede&%@X8p1YgV$6=7& zKm02XpND(LV37RddFSzXK?w5)E^j8!vyaoq1Ht?;78RR%wr1q??tUPxdFx%m}G z@;3Z^Il_|G7iCK(DErY(jiM+2u*`0mjgOKUZ@!yVnv!RuFXIgdfI;lW+?~n**ph93 zy@NY<4nYQtS;yTe;g=-~Jgm@YN?oL_*YGy*c{j`@3&U9v9{# zDZBWKB9lG_EVToav0}-sO>WvYdj~~W2$g_~Q;CjTL&I+M523wMp@q1`1)}HK*uv4a|c82E(jMp;(9vD<$<0 z$oeP-$=}EU1U>kY@kL7-!pV|2)gXXb7tZ&dXtZF7X*L_0_5|sdLjsYUxvL{m5Q-97{|%yvr<2T|K`4G> zJ;n(=Q0&a&b&%qUnup$<9&l)?n>^WhRCofEE1=w34RZ4QblK{bGmr_$230(n4FO$;ox5+eTt zL0XhP!PIXCIsT+cplu{ITz?9!RHpOJR743+LdBDHpM-fY80%pDG4fD(5(wVl#P4Zh zG_AHEI)(~Wx3fVw!jfxRzn#~%=K_@86cD1&!)mBUGm+zYrTOqNT)3F`(u z>Sa|#NKw6+klc4PTMwbf;U+1aAAHfyg3IKUT8*?0e0m+4!on2}Mol(y?`#yzq-QFt zD8v-BW1Q!+n~?u8hSfdOUY^sypJ-YD5+n-n>*0X=Tooi^#IJFMj0GBMJTN|XZ2~wv zKur#3IQPga?G*Y7+VbcZN|k};i85m%YDul*mOwbmJQbA2c9j##50Mh9OuVm*xkU%y%I;W12n5iJbfzb%i)F_?U^QAukwAFbxC)4S2Z z`)OK-ACE|XTLMND*jrL@K|{ok`+|)J7BP0)6(U{Yo$%>{>3Ez7SyW%7N6N9=qN%SD zo~gZ&tW8PbB&(s@(#EbVfCCAM5q=10BX5M&K-@7vM@y&eG$BCw0CB?bYasg?NJt7C z2E;nGdqNInTp@7XX>(}jdX7?7+o6ToUzGUbvkW!5@ba`}lKx!vi8Mgd!;Dl56JkPG z9)%h?f(lGz(v{$avH#a2W*iT4SVIp7{}+#EI{^Poh{`UUzr;+yr=1bY*EoE$SN;}f zr|0qc^yKj|IXL@w>+at%@ayw&V}3WEJJ0UV@%Cr#^sm)gJut25cS)LMHf9Eq$xj|S zhkR8DerkC9i!@ivkckA>qc}#Im|m2TS+Bjy2Sxe1cvJ3Y9Ghdmr8l^D?h=;UOi~6& z6<5&RanvR~PvwWIRxRM4wg|=e>bMFw*MoRBt>QRQHPr#0uKAxB4b)B=WLk@uqY|31 zok>*YKwFiGBpqybr&0rWK5Ruz<_PD5@q$OSWGYXx=VqD8c|X0NrK_Pr>XjfW8%Xbo=qBR)AJZI#JitLEgOl_MH2Q)a_QKGbJ= zM?-u{HM}@fh&iZ^aY)NduKFn@ ze0H|lqsnlO8%x2*dDFFFr<(OpX)2_6rey@TxbPq8LTyEZmC8Dq&ni9<5k!MQuAmMi zvtG=*2qGDghzNL4zj5JseFQdgVZa+0N!<4UH|3dFk|=M0*8YaznF&Xw#!Y zyIDzjK?^O#EO4f#7SgR!F)ftU^L8uw`01%h&KPlx4si7Y-LK<4)KIrkh~x-78dDb1 zaV^9{m59zwfVWeL2yckO>^jX;QWM>%MQDw+M*=X%t0{wzYagsuC+|R;gJe9@(@3h= zvxABXwu3ic1arOmXMPy@Dkn_w36X1t&nY7*w7g*jQ_biu+|_Qe7Q?>vU|vC-joabR zkoE+#r$@;gf5mX!yJNa_!%0KhZb{a@gApstD2)#~czjxd(k>fxCOh2u6b1xwcC()T zSn8OJmm>c8b^D@n>v>&{fKUhjHZ3y`x%DK{Hd7TVbywG&LxT7*$0DC{W4%OVEW`}+ zXO3J6P}XL36I%4KOP}DAy5Xwe+VXKy7aiMh&`E^^>m0)u^iv_L}f34Ic zly$>O1X{Y&e<@J!HP3+e36icMF2`RgqCEWLvWuIDMCM9%ec90Tf+^|1B8jnG!|*|& zu)I>54S@o&svKzrwha|=kpvWr*88-u>%O2;p!%tkY?n`k!X0ylbNt@TbDGInMuROnYj``_=9 z2w+O=8;HbM>ZyBqjx}v&HE%Pv)&((CyKWLR1i_O8R>1+Dj4F9DUad5AU8QpGyWx?g7Ih|`ljX>dYP&;90QQ(3*il{zFe*0M8I{YYY zBAu@e6cAzoq34BpaY37e!sQwbhyx`xAKwId3^gy+yw*;r=tRJ2zVs+=U*C!v&X0N& zF_baW3LNHi%4@EIHr&ul11;$r+@Rt|y`@x;W2z|}qzz?sH9c!tTp(y*Y=}oiT#};; zm;1H80l}26&7FP|oE#|u>QJA{Nu|ovoY{mYV}X&7d*aLW&Vtw>fa-F+;laSdH-(u! zNUb0pK)1nKL6v!0q}tqVXK9xbEoW3*!|L5_M_BI9Qf(?0XgT%P;;~}04Fu<SYY(T+oYw3)`$Y2yEpw~ZdqD-O^IA6JnyE2~0z^^@MhmX5V<2EO z)IYTyr6V(iu)2K?lL#^Kx#}5iQ~jvi4_(D$Qp6er6uDb{D*L(FQ#rCs+S0JfM|`i> zgTZ@J^W*5u5PXH_RH4CM?Ph}qkBq)Em{=;uVdj>}_KY)e5;^Odq#Y>STJ zKk^F5&b%hftVRf)t+@lm%KMgs$X;pn)V7p%t24G#;)75Km+PuN3J2m1qp{+V}1joHUr{-?coGdq%cUI1#^jL zEQ|>YRgQM#)9W@|I!y(IcBNaumht?62ABn<)RBM`-GlQ*CqBi34MqZ48;5Y01^)~1 zGei|{;n#80e$RWGHAE!^Z=cerF;QenaiKY(0bkCZ8?_h4va`Kko{Yzj&_E8qry>k= zkhC2HbL31XJLRCwVIBKY?xL}?q^tIVggXv^4{zieC`G%D_^}j;xVyWi;qp)b$9#B| z`dSd53MnU*{o4E5Q=6M0Q?09K8$DZGxQ^+(C~sZ%U}N>S=>&xQbgY-A^WIhM@}X-O zx+plhU^Qn2`eq+q!^)$ROg-ViH<{hm9;Ka9=}9gF4iA*por5C>GD33}WKeH*FL>Mf z*!&eVP-k$CHUpk}TB#~K_ zsGIKY2v@wMlA^5r6s*)Xg?xICTJaHYhD^e>LoOHvy>m6Kj|7RGKsTs^Zt=K|+dV9< zN#`A9;#x+Cxm0}@-un?vt+`w$(Y*DsN_fHKq{6GlH-S{(B>HOgX_l&3`s@oV^ilkv z3Ombt*}pv@cn~68_D;-hW6`R!=S``S%Ab+o-3Dbl^X4YMWX@*BNp&XrS zO*8ihJzvt7^KdXZz@M^NQs0g+5+)dd3>r!1q-FNr?ty;ppp$To`; zmOxMwt`m`fy;E4RP6-WWz1*2nIwPHXUwB(mh4|EM{L~B4&y$7j26^4rHQNvoI)Whv z*_vH$NuGor9aQhP2-ms*-TloU7|tdcfc1uaoe=FM&&69yjWevYIQmO^8$V`AdAqWn zC6gM`_$=rM-1-c_6uTH%e1oi>G@$@dQuOTI)8^78&Z@Ot)=a_pdA_}@G|9NsrId%YfB zqHJ{WdiEU)ch6?z-c5xm6Z#o3Xxcmdj?cy9VsQDsogQ!J@9XoyS8T7R1Lv>#;(GjH zetEvluaon9dA9uliMJm72nv3b+eqxFr_+SOiPPrdb@7#C)E~~?4IVDADM}a_FKL=x z9De=><)S;fW$4DmJ27guaddHhyWia#k9iDbD{s(n58bSrX1Fp^3gc~dT$v1K!_AkH z)Q7hB)R@ew*mOVh>!O-eequ&J}cQ33D4$8JT^%&3;9hk=Ur+3 z@p^7KZ^{^$MzEUctV z1bK5R5!|SyT@{_Jg#ZHt$7#CCcBt?&+xFSQ%p>d7!4w9s8t8Ex+PkqrxJCmWw*(@MQUt!KStL4B6LU~3z&9`n zW%RW&M9tE`6guj%s8XE9+1_zaI?Q_27Yj63?qQ*7$dBik_ev>D#r$IYh1yDR?)nA< zGZMf+gfs9}(ltuUZ#ZRN;Zt_YqzEM5o1jxp5K6saQalzw{+BNqG_zr1s!E@te`>Gb z41kt`tQ!_SpuOPCOPV%$gNdgIl+-Ic35HrcEb0EvqzflcjgYLrkWvtpn#2U#)MQ)> zdhaX`?ew-&zEMGgY;8o^wAircMOUQDF+IVb?WzdWI4G)_tsw?#F_fgCL`9&IIksJ4 zsZ~6wm#aqof+Tec5$k4SE7YkLhmYKnWneagQ>)lqFI$~ZV7gsW)F#p``FhV9^aR!- z7o>t6-8ZmBpvrc^C30aI#rB|R*c{BMY@l+9aEzHn%Mf>9xC?eoEzcFyo56znf#)rl zve3uY*rt~^#fStbggoX0@R~{)>##3=&D2vbV>95b41#dS#4+W9cmPlChI9u7sf~XZ z&{A+t$K}w^xmqRS0rQO(;A$E~tie2ps%DE&6?tb6u-a0xNQX_}V{2sFOClTYmigGr^zWUf zY%_|#^-DYOHZ=kk!;TqEz#h1vNt-X=$I+NfaE5@eBUxpLcRcg7^%jZF=PZ@ed+Rnr zO4q6vu%2oe=Rs>xr&Ph{%|WdJS#OPOZT+{ZP?!qs$kkMeSP$B0Hlg;Dcp+jvH4@gt zmI>`Xs=ww}J79e{GIxX;`BM0}h2r$h&NRgy{xP*2%TP~76=wF~fxy$&s5YaFg##X% z_x9i2GSEk;3TGsbGU#V+06dZzBc8HloR~83=WIx3C`<8+sKqSkRU*#lduKS=s%kn& zYc_yx=w|wfY06uDXhI|>6@<1d3blLL2GQPhRzbwwJC!<27-7`QFs%2S*^C%+xzL+Y zr2|vc%QPgEup5mWZrO}y81Vg#_u$L<6S-B;@=?bE3^V$dOd+!tR;t(=mnfBfG09jG zUiz;_6>EqcKd5OzDyz{a3Tuc`R^^TQg#*94Jwu{o9!4FX00MFAd1a?-slBaLu)eYq z_cef{LSCz-B7L1)4eD~rLx6sp2w|NprFfWww&JILL*^&z{#J@7d09!do6!nk<_|Uk zH>9+z+Kp;tgG!0|wVcwowK7hjrb10P9rU(&9umts*;81JnqN z6#EvBRMwF@>A}40Alw4G!yIXV&qSJ;O#{@U8i@*}KIX-@k$rXC9nh&QR}G(uj&0v1 z!*gVmU(-?Kev`Iql(1O(N8{4v`Yug5{>+JqR9@B@M_HynW7j z9Tyfr+61lj6gkGEk_4}N-ZeYDyX`22N0$-&@rD4(8Lj0^s&xDG#a{L>#V>O#kdUY# zJ!RS9Gl@Gp8+RwzX0ZimKHC>*uY6-24jEqbx4Aweex zuo#JsYowD3y*@0X%W9Qv9MGp`h^*uoW`LcJQpf3aaF-Ks>Uf!X0;$w{8o7!3Cbm241WU`41JX^CTbU z9BScvPY~StNdppAAB%L;zvS{c$(JAd0kSA1;9T*b%jriQPxsp>Po!|$Rihzm1qcH! zMKL(c1StFEj@-f@LZRCMs{>oHHa3D7>n-9P9)k=92SpsiB2T4C(LK1V^(u+`mt_|{a z#58R_a@2=eDr5j$xz*oS60{6Qa915Lyc|w8D?HGXQa?$x;3FqVP2XB%v_vetE1dIs z`Av^l00!3a7zo;OL=R{o6rwZm_d%zZ3smlZ`wi=wcIr)YKU{waoj1Uvij0d4%e`BN z_;K8=p)ApAr`zf}%;TI{ajSjsDR!_Ar7nDM$3aPiz<-Nz)3dz!dd{I>^Ol3_?;mT^Q+cGr98Fo=nq;#ehZLfCC#4`Hrr@yM> z_rw+oatwP1Mt|hEj&{bB*macK%s%4aA{}>ITGbSU)V|oSW#xc2@H$vFZ)_ks@^d(M zukT#_F|1!y*0xB}2bITdmRH%9n z3sehq;#-BX@9rRfIL=z#(mzdtUz+%va^Gl~ZR5puGX$sT5*f;vd>YEE z5bneEYJNgb|3IL?D(sQuu(}w>?J%G12>6{I^lSRz*bR;^3s&1gYS;F?R2x3nbYtzO z-p@WK>!(ftGEw;D3qVHp(0ZYH;(iVeoNVdKKmg0hO!Q{fKShP*b)`ypo@JOPojG*P zs&9n081AE^0v>Z_fpNTpM!^#gIfaFF`j~X83toURIV{>Gs1V1)Ad%9WvqvPTWrLPyITvD3D&+$(H$p5^fwDppoI{>A z@O?&wx!$(Wq~v~9Dl)jsTK#2OGQfn$tdfRZ#OOo!n(|p!Kj0<$*`lf#uJS-+JFQJ z!Egqw`^Y6i-#w3FpI9q-F9$7Mua=IUqY9P6-%zWh(4v$tXSgDDK>eizYp^t@ihVH& ze20R8zvD8BA?4{d%J8sd?K+)4Wj2wpp8Vz-O>R69`j928_86|3S0+ zPP|uY-0!chJ3{s%Yn^PL!Sefzdw^y(O+3yYDvbs-6wCoDrNvhI#NeH&!$0)7HkH;p z%+r6v0Q;Wv<+1(`e*mLzX57VkduhgB*p8%p7-DM^ICrUVJ|( z+@prN1*AC8UPkGV^x~3%@FS6?V?nK5R=b&#v0=7x%r( z0yp^>G0l8g^Va>&s@iQTX! z=ny>_lXRAOdZ&QAbBdyY5d5gEpL|t|z+4DH@tC?pYSofJ_TY2j@$siI$8?17o1^o~ zv6|&N_{^K7$4wUSX%Kz4l+>WC70Rvs%~UKQL}B5U3%h9pBamv}*eki?io0yyDQLZ_ z6oM|T9jJ3Dx}@bob*%o{!QJy}Z9E+Y`p}lQpvdDnlwJV13PgoA#RDTt1Pw(rhyt;g zK@9j{v%pyVJ-m@JF2GROpecmqE}WMdUP11x`R@668XD9>W4Mb2V0A#ov#PHWX|wKZ zDK?LxxrEENz~fLn0@921o4iR9E9u&_)LHgaMA1(C8mz)&xiNPMR}l9P~Q5Ki{i*&^0KiEXPaw8tNm2dF^8#pep9t%UF^zqy+z+$O&}N( zrR-U7N7x#Gilb!jRQcB8C?x2#vB`EIs_GRnG2cnyu#ysBjFE+O+fHVPU!vl@oJt** zN$ySRC$M6$EYQ3lqx-eetJIld^J%eW-+@H^dnX&ha<^%{4-zvRBEoNhwHzc^`ZTLj zgJ&vkg|4@fqj{6mti`IsML3!sDWL=@^-dh(dbFOOM>-zr79K(oud#GK9o*5;teT)S z(~(%}6<4oh#grTVV^}oeR#?YA#iIlrD4}_wMG982EXa#^IUbD4`o-lC%ShL>rW;{E zu+66H|FIRXsxCe(afJ^^?}Bp4?O3%*;ydT9v%PPOZla(Y4nL|VRH+3Wd3$h3u;+tu zrCLKaLxJnvDG0e@x~S}t`6)Ci%wYloeCctT%OCXRwxB`nwwH2r`jV`8M!Bdjf)dv> zh}Ep!&u~t-;52>0d*rx$U|d5UX9R(u;#=X zUKdTLhxoo+s$5aG=d0RkkWlfa9iGS$u3jp%vk|l0VYAWShrTj&@Yg=)tVeb5$5Z>e z-}iwiU_@-22mUhjthw0ygw#6|C})JMB69GGw)J2JNz|`VN^ZfZqNpJJR(iKEEALQz z{(~{;xAarZ@N46*M-2YlTez94vi<89)*swGo&7Oa+i&!@m!pL>a3NW&GLDbWfrUIj zgH3EsVfemp65k!Y6hoydHlJ)xw>~QRR{W!}B3sg{-5UjP_K^HG@|L5bog0NgX82kkeL3l`V%mEbjYFzi z#}TNt${Y>-%d_VLRc%4+WA^Q11Z_7a1+Csn_`T+^xyzw7OK$xo$;s)mWX{(<A z0vAaN_>$~s!39p>hClV(C`s^5lHICii()0L9Q3E-7$LeL0g@{q%MuMfP)TxHmj(t| z$H&>q2@a%WMF|M7_94jvIRP!geno~f8lOCplr_#Zd#2czIAP&|in#>Pywww$`-+$- z=8H_TE|OW9<7k%TjNDR(jwFRY5#9%i-XeI)m39O=4fO(Lk-QT&9H5rrOhm8@$~Jp9 zB@N+zHe>TF~m5OHb|6nzfCm#`xf9#r1mOL8P!XQuT;J8$cclwZv>)Y)cI zw}IujLICd)P;F3yTnqJ>Qu6Gk)&uy1!F0snd{qBoWCF!jB~z}SnfsOb?T;`F-`t?6 zrfs~AQp18Zi~LtY1pv85Bcql%mYzH3@0VQj2Uc{gjF~OMP_g(v+b~OzsJ0g_0TjqG zq9Z}HE5Yp=jAtC?hUHv13ZN+-+GR(ZE3XNYT}({RH;c%rpad-ilEbfsXqn?w$y!pq z=#Td`SRPgjHu)tAI0gvOHHq}#g+^+`4CN;89%(y4Wwq{KEd z3Xh4xn{GeU%R|_Mlz@Fiov^=U8-MCqIY<*2!O<&4KoEnao~w08e_^50vjR*jmk03# z7)l4D^=Z#IWXr^4n51Mv5AqGgy>Ph65KL@VZy7RNFQjR5j-$hjXtx156B7-QK(E-i z6bzv8e&ULh==GB%F3O%L17h=YUrk#lCU<`VtNUC8HSFvKuvPQIV45Nj>o4R+6H7 z(ZqhWaRh&K)v7>Iz~9uBDYUPYBY+-2S7(1GV=o|*f%TZoK*(8AHK=rPuL>IQpl6WW z9&5gnkdjp?8<4BiR;EBR#N*=rz<@S2qTpp>e=~pc?BLBG*E2x#00WX~_^L&~^3ipv zzc&Zc#}N&KZ^vrYxj^kHVcZDdZ@?IYWgDj3QM9B`PAt7Z99O_?Sdb=uM>eu^MpEs;A`ueZXf)=bA!a zX3;pnwgeDG?WCOvgaujJ7)~U}+h2|!kqNuVY}=%F2%&3?ee*%&jY?>%&g0$<27$i; z8gE!JbQrw`qKutuQ9JV6qRhFhwKN7oE&y_{hhwbaAUz_@xGVb!BLp%;VojNrqfUBE ztKIG#5IqOpC5#|8e&p*&ZBtNEcnMU))Y+7K@>-2s86&)zhOCuMDO&lu^rtFl^@?#Lx{3cV;Fjx z_zSveKw4aZmzjcpn`DDYp!g>&(pgps2RrTWDnk7ymt_4~VI)KUpfp;rRdp%>0c!#q z!`UUMU_n23emg9mjG8;&q41||6U6+vgrSxh9Qjc?jut~ZSBu##6VTjdse@RPHI*<> zdPsO+3yvG`e*(Vhuu&+JcGCho;UXF|Da%!6@XBGGhH)SvL~CQ67gHE-oQ`E_A-dQ* z!h<1P2HC4xLEsoG<6xkMuAZUqQkbE}w>0)r$L^b6Yqhc0sU=oM|Cqrw3I%0P@;JYrlnP0k<2?c4k}gQ9B7V?DEip{Gqc=gPeM>$b-}1uz&#@d zia!&GW%vRcKnG}J(!>?#&&{P_#aB*Uq)%dPV!MBmCcB3Mc>~t-_X!<#u2q_mvQS12E@8*aMjc)f z?1E-Op+bG}lY}MWMc@c23D-HvwDIT3m-5t zv+V_WRp465y?8s7OnQT39RTyb`M@y;xXU)Fio!kUAMfT8%!dS%c(H&|8^Pz7r1Z5g zh}FOvV`7bUq_{A}j@u$#e#JhcHI2tG!xmoA`pwC-@5dm~hew^WKJ_b4mgUXN0fju} z`xAf3nWgv4#Q_*HMTW#h!IK|eO57YI_nG~^f)_Lb`2K_e2_~{iP4Cnc1FNj~lAaZS zc@DGCiGT)@K!(85uaqqD$cY#2&_mBCTHs^=GCDI;e*4ItX}@@ZmNq%#pCHa#s(1Lj z*)Fx1e84HIj`oXSSIHo80rzVc7RArMpi=9GuGuyz7}$mEBv3xx$ocln7)8HV0#a>$ zmFFdM9tQH4seBKD4YTlcqaJvyB({WY(@T6b^inpcTUjg2MON zcD%D1c<+Z6BDI^%LBX&Y7?ITj2zQcswIE`%h$ReRf2IwE;LKwX_Vx|Qir@sGbuquk4f}LIz{)wjLVxhqrrZ<%V_LL1gcBeGhJmv zAx1uHNPWdqojH$NVM%$zo-_p?`!VT&kunVMm}a;W{i$8en!1&V3c2b3?5^uDt!3`l znLq{P&uS2yftl@M*rAb9ewg998)3{;k#;tW6B6x7wR=nETV<+4y4A+0SmH)YLvW}(HB($rBv?1@D8h@5EyemsDxGm17_aH3f!?>> z;SNmesLZIw)Ll6xy3Izd;}&Qa%`oTTYy4cAXKFt$LjUf>im!5$8NNhF1IO3-p?MwM zyhxX=J?3mbB9U_9TduvPhp#Hr04r8XL=(=fToYw;T-S~z!uXtfT8YNIFUJ#z{o=>HkY-;SjCrkX zrIB^4nH4K*11VS}W~gri>dhHAvl^BtJV_0cyfEvZ|7naj4P`Mfit@96*6w6E7NB^q zgQ1V2(;;O-*mY_JJ+ZF|MX6ysZGE|55_LqXYnhZCJm$)u;Gy-E*(X8+Z*F&Bt706YL&_!*g&pPIR| zHoFbhqs3TPi8zZMZ=`&DNZ!l{Wmzv}eVsjx$R~y=l%rh+=ns*yv$>FDafo{fin8&_Z9KU!ErEEMZf57X z7`HGc9CmPQd}1ALl?y`O0Og{BUF+I}={13&QivBP|JI6>+>9~`rwF~}Vu9ylVjB_; zP>$1aAYx|-0?;KL>sKCg+j_jr<6LHGNpETW9KF?mC}*!kn*tc_$8)SYz$sc(G4XEfZ5}9*mZ5aWv26jdK8=V)ch2rd5#I|{nK6$807150}HKTMJPaM%& zBvwtk9`vp4&lozt0Q31!ij^5cOLw4b9{~c)cpO$zxVlqN@YK^{nczKw`CmJUJciHo zb_#RLPp3yH>+CBj87G;lC83$n2$#ZsVv$5}5#;gW3n(tMtvWX#djwZNK21a96(z}% zwWb|X7)-g>UE04RMM}gD%d5}gD2xJ4J^J7C1uz#1H=W@(;eqSVfbL0Lf{^y7AAT(Q z9w(6)Hgb`Y01L76MmshZgH7Ze=m#;4?g=)LpPQDO@$hpp=Z0trFWDb-Kkf-3+Qs44 zFE4DaFv5yftin;ni;c0d>3wSF7No7vq!NG+os7xao?y&NxWdi{{t_z53AmdI4h_IgOV}Z}K1imK0EOs&eJ3Ci z5zkdo1sbv7V5(^190#3$*gP( zK!l?y{i4xSDo_y2xtGr|k@@atjaXZn*Gze4FHs2U>0h0mlLt=06Uzm51dwE0j<*QJ z1_AqTG#@D4YkYh=pdZ4uRB@v=!EZPd!Jcy>{2rE|rI!p|3HE+g@9x)32DG)pkjNX< zmHz@IVK)sQumAJrO6`ONNHY23HIzST)*D35@J4=;SHT9_TRTdcqfU!VH6}{(9w}vt z>i9bFiDz6I#cKBn$^$}OeE~?vNE1ck)CrSTn*@L=pV(_;w$xTnnbGJeMm*nzP#7L1 z;3VPTuIdo=#meg^3T@J3v1rhU-5O}akR*9C7q;FQ?qt4kp(l8#d#)D{PDB($0ygHdTqS}!(P2M7L7MxO%Krw%si=irR*Y}>*ln9}Jx95RGjfGn1&xgeP)~`guj2tt5*$$Z zZxjPXz7&?}hGM|C17lNDx);#h_x-|Wu%2wwuM||sa``b9?q)cDtfWJsEe~J>+qV9r z^3?|y@P>qhf2nbBB+8byKOZ*eafLqBI3OaYJ2<$ip7LkW>w}|Ge}LOpsboljSReY+TYAJ^F;Xmg=VML`jr_0D!VOfu(1 zpk`=JIkA?ui(q9xa!H9)xV9&0nUw`??~-+-IYDV3v65Y%crz%O9bPatBPIewTx9o} zD zAY&{S)~4eKqRftp&nDKjktJTqCxEy~BiqmN%qMRnU^(f&kK#ZAgp=6DN6?;^O~s%r zr_8iG@OR+WJ4)pm5ow?2p*M{@-7@-1fq!`bHTQ&|6}BD}>Ul$F=Nm{P##HqF4Lk++ zuTK>U#{jhP+<}uEiBjrC|Jgnd_yNwy59$8joZ|mt3jf0?vNAGo{QpS`tp9_Cj`jaZ zL)XJQQA^U{_zFHi?k6ySt{$UmnK-Zlj87twY8VYWGY#y5aWVgCePH_f#KxOh=MJ)F zpk}t}t-28;=1!hu!oW52CM>cPM848}hfe)6<>!$Y1y8 zcBB3Cn-&hJBgqTEcID>fL^hMwUG5rZUGQk;{xt0S7EYWp1#kLi&Vv=Aq-Cp*A7{j% zdePw39$q{i7zEa%0_>o<^)t<5DPv$VBx?_En4r6PxBRL@sDf84Afc(=;3H`?b}|~2>g@|><(B_B#~A_aN+A4m(5uiJ(-T?*%cf*s zA9uQ-6d>K?CU6lEif|HXFS;MSqi{A1oXuTE=h~@hoK0JK_bh^1A-Jcs496kiSo3z!$*}z5vuw za3q^K@hPnBH{3vJuZf~fC=1EM7iX>>t03sIf)~EpU5_@HGR>3`h+>tchD0V0mT!+4 zs91>P)0SL9M;NHr2@a&8$#8K#`l^Pvbp{$b!sh6qs`Uv(dy9m_ix9^b{KLljk-j z&$FIn}0=-NEfNkWIB?|>1Y1_ zvNd26P~&>d`dU}ffRQJX<_!V-5$WmAuHN&;jrN{TQ(=C{gFyQ3P%;5i%suB;lo;1- z{yaZVhRGj)2byIfG6}~OHGr<~6Gumb@+Ox^Rg@q1_Jr1&6J#F7dzXmUe=YI~m$*C1 z=M@Dh5k+Q^t`$o$==A_OlT#J@qPP%Kv8Yal@@(pd0Tv=Ie1 z#eQR)+ygAGCfu>HM$R?|cL*vq!1sig5~o8e6=O3!VQge}#6YLmA(1!~hYouIiNVJ* zMIH%y(PAPZF~$){97qp7`mVH*j9TajF6aD%ZQ{VRz^CWqJ_|F9U$d1tcOxu8!> zs3z*1y9UJGriSq~t;JMJ`c<9OVMZ(CY|xncp=3QX51Ll{obWXGi7>rw#Mf0BlkVZh zh@9<>gT6FQThW!C!k9e|SG2mZ!ax&QYAW~MH*J;dH76+-@U3d0-1pb2zIU^;P-j@y zhtemH;cHP0m`wbHZu2B>oE$E)5s&SKdDBSJTq1SvI|R-!R3HPo>ywF#^uiiuRa+ld zcFb6%5aWteXcb*VKsi-brO;iIoTg|QkeF2Kf(2$Gt%);1I@v7GC6qP@P2!}J?K#|Q zvr*aBOR9rCQnf@uK4V~bsS!oz!sB>+=T0|AOiGPA6%PydEd zu-kLCin0-z&LNm6$f)Qz^&z0gDZu!6fIvf(@#F1g;_!SN2pm`iP!!iKht_(X z5zA+m+iMxH9sSurQ+cux4FG5)pjA(XAC~fWf&iF|67A)0#>f%>3k4GyW2E(bu5-|I zdA85tVbdmz3xM+D26O4;Vnr>RVh&c7QZGaK5g!Gupi`A4H+l)&> zgrRoLbJGbQD>b^jqp3_O*HE&f$yRVi{ioFypIPTTj?26AM!-cdDy>=lMC8h2a3()H zaSHmQ+!{`uQh0=10YZ{=Z`Oj+j1-P)ChzGRYutWzCht85Z=f<@ip1NYf!r)VlyUk* z6}x#{BF^G^Ebdx^=XQWjW0~^5vm``kX0&I=0&-JCeHAjNNO2JpJiLyVV*C&>bzOqy zvv;%oQsN%XVW$#Q_cv}NHTa(idpHWN1ftfz?i6A2_C;NGwXAsoGoSx#r&S5|ZqR(V zL#Rv~c3*r`@slX+iHV%cEG|eY-|hkveK6!EuoxbZ)dQVNQx!_chl%+14G^(4@#W_~ zDC%e!td)-pj|qYoNa4t&Cupvl0%b-bbAyVmSHM16oEfle%V5|>FL?m6bD0VSv$<~* zE1}z$5ObC*v)vcK+fp`6Dbi_(Vkl1Pni6tk_`m-oxwKbZXOWdFok%G z@IrEAxA5HC8+-vAY{|UY-t}8c*t%Z+R;j^f%IE%6EXk}*hozO# zc>hWLJT@rhD%EWsoko$Bm4W$NshH{SF-tsbRtrV*K!v54Q2%=yWF@>?o!*54rA4AE zD>Ps=N0BLFP8xF3uwPbs_PgxzvLTZy-M}ny%I1`*9X%_&xQ!Av^KRsY7$~X^4+TND zMfZGsA8F9v%=>Bod_RJt()qP$QsLTYR^88K8G1X@bj(W^>P=(2bnPW)f?-a6`7(#x zO|G^kN`;@{IN_T%CGNZa!qPB=6RLNLTrnhGRX^ND>eujP6CJ+m{T z?`Cf|e{z)fTGtt25Yq1_aJAdlPUxGtbC&g_cH-{WnSc>`9WTp*M2hx%*nVqI61a=0 z(h(kkRM~oC{4WmSIE*;Ap``y*q_JmTw7$F)7lY(rpB;}t!TB!>d zmi8h_eniJ@+MW@sA~la+2&!j*M(Dt>yT-!X?oZBcL=PNuNG9GRq)2ua(G^OV*m)3Q(i#gVYx zLib{r)HkZtvxxChbnv6b8Ty1yUjzr-5u`8g4bE1YevXkBW^vc$yFKn%UsCpOgQ|LK zfHCS>&Osk+_OItp=$AQ1wDK2Odzb5vKE#FB4{&7LJ^l>Ik)Ksc3qXz85Y>$KnO~;j z+rJYFV}7wi9)bFCT{0Wfv z(+V!Vp7f4?zj(l$w5}(^9~sPW&WjAoVGa5rVe+e&=Fw@Fe;+IH*O;%K*401O%=2o$ z(>KbN`ORJ^fAN{Mm)}UiGUMHrEb}1|H1adFS?57uY34!ZN&k4uEQbs^G|T)>>>OA; zll1tmi`z74$eZ=SDh3a~#!iS5s~`1=}5+W@&ZK)%_gNtZ0_e zZCe#n^bH$nk3LDJY9L9mCbT0!efr_HbGb&0`rh-~+&J;vVXlFPOD14?TM*$;XxpS6E+2IMbDz%Gumhp@n>EZ-I z`X>FzzD)`f<`}6T=N)!EebbJx2-YP8FxW(9J`OY#zTG)TTjp$sAwawYe{JAeAp{+q0cE@A#qYYW&nx`#zl44A8={ia^OYH;w zC4aWixL(BKC;Y>VGfL@;{GWTi`VbbMzrk+iV|YmmtwajVq38xo_`$#wHhV9i7vct&;>EHDqqux1+rCB3+l3- z^5a_Jzbr$g+0hD<`M*~*t@MdjxciCiyiFzhwuq#_sDmTsUXkJ^sO^zg^U~D{av4uq z_>@h$@#}x}4b$1ME9G!ZF7(Q?^OXA>w+8pq|H74+DNanbR{rny(n_67LAagt-qfE& zMjdvVdPQq(Z4#xkSo=|R6qR4b^W>hx^BhwPLYLfDO6CncVggl;L>Kj>9gfjcve08{ zt(2F6-_z#it+wZ5dCiN!4K}Tdr6}2`B5qjOFF_w^ji%;;854ynMX4J`RTtWxB;nd8 zTiEceYI9?PoqZ}LoY7;AxYmYMxB?Abx4J9raM8v~cEyODLXn{ibv}Ji3da@+L>q() zoR(v0ae*U+(X&`>wU{o?F<Gc7^O71x-AZNgv0dKEHqpps zGG=O2Iy^;spbPCteXs&S(ekHH%hvoV^1b%^G+=N^>K=g+%0e1`m6(N&n1|G1A?QDa zfGg2NtyX#|>Q&d#x(%x(euo3IkpHq$6a}=os__aO5f3N>rr<8M!r?z=4Q^m{jqgJp zpK*7{%jh??T~AeC5yFxY&j_Y_Zhkl*obCPQ1SIN$@fk&nwdLmkczwvf(#4nCI_Cn? zhb|KcPScwp2I1d>v@hgHhg0u_8MrN1fO6EvZb@RLLO>3|KPGjt319d}9*)KZGx{dJ zWl(keE1^r{oE%dS8j|Tg8S;EDz zCG?NW@^SKK4yM0q;#5%trY7|j8sx1_hqR2^|g(yLj{+d^3R~LbVjmU0&U8X8X(q%BfE|_ zwRV!nmYLsZ=|x+VR+`Vk7I)}*|1cJ0S1>77vHN-s3`-&7rp>A8b&FA0s2b7Mbp+jYJ=jbk;IfL>|mk# zXqgacgX?A3H9CjG~1xz1HM}e!ZEpL2J zd!K9u)v2HgUi|6Zsc9NhyQoS4P2t6ZFg)WdgQqv!-?R8a!{ zr7{cz5Xp>Nzo%WEav>mYRZC?jEu?<0o7G+R0p-(#HsHdK$W~*;LF=~p%>YTw@z$l~ zaA(M0KzQ~-avi5G`FT#Bzg|a>ZxyHe-dgxBucT>8xOr=45@VP084vl$`gn|B=1X*_ z{;mqG_Zm035YNrL(PsjW5wxo1c(#@G3oholh4w!X!T&8T{bvct`hSSv|3O^J_WvX< zUD1+u-WEYPt!CyI7?Gr!_wd>sf)xf(4koHs#i4*Bl(SLd*e8+m*Oz}i=X|*OYe>DJ zGO20lZnpd_`??ml;5v(Woc+U^Ctur`lxO36Pj&Rp{^p*bYmNYRJTsP5_2m*4)PKM} z?F|2Zqp3C*x*fSKHIzK=uD($Rn%wzTU0v)V<4-B_hx$kxb+4B;#5|B%k*90py2wV<4;|$1o zZl)|qgWaBuD^%T!?wu{O8HooE)5Pw`PH@gQ>PpWbSV6}JlNZqreXqR_Os%Q7cB zVWqht+ay12N=n8$)MbRT%~aRVMru}IIZsflAm3WSBc4COi#l0_gCo_?c#(NiP=uo5 zO(U`-ung63i4s;MFwJi-id?m%p-x}}Nv8x#7KHg9Kc9&U@h?8 zu4HcwYo6&Lm z8HEnPW8=QwXM;u6TT@|TbW$p%LgqAdXw*SA*#*#)=*!y)nX8ZrBc|ZKM|U_tw#%e) z(o9-zeTzv{qC5v;f}R45=i|by5foxXe)Ojp=p10--|=`kn9J|p9;4W&U|B27Gp0S= zO{E@^X{(OLKw*VC5Z8B&WCTWAs30aL^-XF(%1I5cP9l6WX|I9;kx6^j(Rl5Qfm600 zn5)?Q{NmT*Nky87ZhnaH3#(bpO$Q}e*n_}vc3NmElWUe^kv7k?|74mIx=7M%$KJ-1 znFHs-lZ8K87rQzl6=bBz@Rnkk0ULuj;7`OtA62-A;-;=NfL9Vn>+VR&V zW0ePTm?z=$wvF61rh7SdMbrUL?aA%Wa?s84m<%?=wega|qJjwn1*c9%LowbRbX*j&G zQ&BCY+YDD62N`XJ?KjP0*r#E{D)|m0GSOt?pxQ;?&@fyX(}B)RbuioBQ!W>}3$30|ZkL2eoKb!{;+Ur7#mC^8B;gi*Q?=qT zsEa=1tzcKMt#usHJo1u%6x=DJ_?|vk>jsM{!?oo!NZ~izA=$YRc+O}0Q#^AgVK4}BpjJVQo%6g6(e!&|oK&M-cr_kI(4ZP7XZN?d zEn;)c}Q1vkc z!H@sJ#>#C!Tkf*q55*^bFe}>d|Gnq^ubu2a!%s#wj{oC>%l1DEKiU4DhM(8klFq2& zNWG8Hr{zl`?(20GJ_n~e2aM}xER0dtK?p*F{v^bJt1`iUpC+rRn%{qUr;YM(f<>x2 zUnV~urb_(y5TbYx-s-;mzOGiUKY#Y0{-$!g0r|?=fB%s#g#th6J2D5y#}^`{g)i1@ zcKl~5xKOjLh3DbA-=YnJ!q@fu?c%2v<*c-MVX_+KFe@8p)&NovsG{=nXE%I=%e1*@ z@X@m<-_P{Wg~$FFDc^W?4)w`6Id0+G;|+CM94!6dUnD&Teph->3{%u1BMuHy`O6{5ZuWToVHrmnHG_gn$6vD_EKh4CHSY zK;3~>gE_s<3#?RJ18^5w7R8bSgESi}qcYg#1uaWfQ4hj;?e+M5htn1~x6im`r4x4fx0>4k_^4Seu9ZEKO~rjWyF6NwQ~l||VHkOL$@coQFpqDP5RxARBWHR9Eu zky2xE(7d_IO~_O}a&hWU9^EUzY}_S_&|ZHyGcj)l#i+Y1TUweRoFn=kC@_tG?=0dk6K`y#KCD@Y;o_@ARe(nvPak zm&iX(nqK+m&fwVvqI$YrJVUS+Cq*$lSEmutSh5#~0RkC7LB#9~qCCT;AM%W$7z=Lh z;;8^l!)F1P`}f}hqIR3wgHnxth>qW=875H&TUhrf!w5KdqBRGMB&`@NEONu)*|M@E zwJuH($|>xPU01MDI{OEeHb!-4cTXkCKa$~xzbxDzUIx;l#dS#l#eBf9FLB<=kmCVh z20|n0;GzdtUjugV&;ZEoBhPECavU7Hu+K?h^Wx6#(xbV7r&qM*)*8G_t7$vZx+UnT_Xr#y6+#Zo#+oa;-bM*~1 zRRRLCuP;>MYmY`1qW6tK4OjNKp~xOchAV0;5jNJzp}hjH9vU1;9zBgz^0)ev*;2gV z_TjA+q}nKh^XVy4Q!%CPp|%M=_c76Br8-E;+W9^}i&ZYdTMvI0qpo?mzalnyH?(ZB zyr1X%`6!pd3VVX*dsq4e?|XNvFj+6&4n_4Cr{PQU)nAk1@Km2wKQ5=3mUSsI41Ji2 zV0flK1BD=@(X*OC-mcmH+nOH>GU3Ik4g6U*m~|;`K5b;{(c`Papz)CrHC4;%yc1>zztdg-p=d8CoaNFJoW*H zogzdov*NCmQB1HaD(?z{fqaymCK+axyj^@!FtD&LyK*cmzgY~6YQ0fIo!06pSY_dTWEn5qV2PtYNk;FnS;h-kjjqK^G(9c0 zyw(LP-+g8rjerMhF*uC}?+e>w4?9 zovyb=l*1;oW=G5^=v!wgZCGa^eL(#)ylg|ct#B|={yO&bR$nExSwg8<+Mo$9e{moF zHy6HRSas24SE6=w10}V1vhbuX&TYEnWq3EPV<1ZHS<*YtE`1TvM|LM=IEGe%z^e|W zAGd?%XR&tcynM*Wltk~jxDgVCcc%H9^2c+teDHddpYCogDmNJ6`Mm154ZahYGK74` zH+hhG+t}baHDaqt@RE=KivlzJ;$F`Q79PPl zm+pp4e_!)ZAwM{C<97>Hf8LAMf|Hw*KYUKlZHu~gxM8?uG z=25vH4oxKn?vH5Z9NW^o?kJ6T0@GORmo?|+4;2ff3X9R^)h7Bh`Mo{=vgL zQECF)Q_tgsk)N(!3Mx)ksp_qz7TU9(YRkjo*xIWV%IAn#Dvx9K%4E$3o3`rp^g6w$ z_h2x^N7LGm-NAD69VccY{b#9d!}WMyUN=nWI2VMm)?usmD1E>btEKrM@5=Ygt#6** z|5>_S{+^=-65U!n6kZO|#>Ue5wbww;X3^Tgb*+60Thxl-Xq zx11QMw|w-z71OoB>1p>ePZ!ywd|n$Q68dy!%$AcLOzW-?@N6v9Qrt~@ynFn;-IWY1 z96t8!5=lhgQIBn&)I54t^y_-hH`2*C?5U@*D0Y7eTI$SuhiQgglVpjaVM3$eLpfJ6 z-_)qDmDxntG1q4ion)2vzB8KsrT<*=9l2!Adlr$0h0<$Gb)J{K5Y=qOV&5S1&bN8J zddx_ZFx1PM=o@8u*wqXtBieuQq~9y5=^rNF?rsdszz0j$A9AhT71lhEdX|npLK(NQ z+zvO`PCJ=fJ|ySYD9C&~f0#4wqp8wu1m$JpotYFudgH=-jWPsOxV@*dKVB?i8t!!@ zGNL+eKc_;-ZoMyRrv1`t=iZt(+5M(cPQ<1=Z0G_vecR?PfxT}Em>F1<_S}wDKS(ID zzc^?rzfWX7$%^---PyF z@=Rfi$}Ni9Z#{RPGxL2}H8ZNgH~isc?)*y~aj9#fqvz*{)nBY|8L^4YA0lp>PhJSv zCW+?5eW3^|Yoyxt{l||PcKPycKV7sCo(#O9JHu*xlVUu*#6~w-hjau@IDQ?aDER4> zV9`07B^kOY@(lXD#Jl2_=GYq(au@^GANzl5^Pa$sao6nPx<_$DUe~bCF`}h{^_}Xy zNAEf1to+UK2jlv}A4{gw3eUbfN}D3y{9e9@DtJ@Po`w&5FCRvJSGNi%-TFvzgH_yC zx!W|K!zg*uuPNa2_!x_CHLar%e^+kT-f?dBz+)aESMagt8lHM?wZw#-o)UJ`$p(CK z6ZcI@PHYWBvAN!MqqdAxkGpe2t5Q~p*}>_q`fTBkd)_4_hbB$-)=$qfFuS+Wu}57# z^xR)7|30b!8)M>xQ>O?lXBz=3`;fIp@l$_tVtZ`{ajD$rN$K ztDHD`?&`)h&nt)W+XyGl^Pl-~reV@^kFj_YZ*WrK^WoE-0Y7ARi)^5dy_4^}mD1+~ zilR7h4)e9a)_n8Pu0-W&+OKs}{GMnB4LaG2&8^bb5yyk)-g+liD&-)L1i5Y7Ygsx}iV3DZ`bK!u>GHv6`IL7}_BA@5G@N+CktwXS)0`t;2bHBY z_3BORRNQAipOM@HlR|tupUZ#Vo?Rj?NmU*t9~yP-gLwU`$;k38ja{2ZHm47K;<&nz z3vtX&&ptjVigIVoLxt06((bzhO?L#_=Q4fqtBrq~5a`j-5Vdt+17lCxMmjma+lSlm zg@OF@JZtwia4To-UHeRZ-G$Ef+lrxuA0m_O-tW$!3OrNK$0nMxzetUxsIW33O-eq$ z!y`=LlKKZ*oQbkqR z!sUXKAFbE;mZ@BBJA`{6zxiOToPs`G-2*XEL`;$I`1-g2meX;FF2$Qy9 zjGV^{+gNrf*PUC~i1?l1%sc!p)(P_a^K`#8Id_Xuo5uTb(k;fVs_QO&W8a!7XEkVX zmMZ3AQS#HlQ$3Tm3Wb!fgC#pHY-iNs;-c`|v>)8t9a$mi$!z#uK)w1$|dt zdyY!*`Tw9bc_%WFxh{I*UMVK&d~#`(^RA`~ME$t_Ybg(3e;jy8`?1c#^MdIH4g;mk zRQ@QcGn8s<8z`AorTFxxge0%C@7T8U$i_qH4cq0hYmvS4l=m!yOAoy}eaZB5hNyL@ zgHzHw-@|mTJe1<|pZIv!bCs~_1(cjU^TWUWn*PTu-!IZCgYBtIoBFfp(scWX<7X#~_u5uUW>q96>CPPQ5bn8WdY$sTPP1^T3>$Y$ia2V%#EJAA`z0|Ox$ zNoajfnTSf279*VerUK%5vs)Td+fVFHV)We`a@q~AGve($eWvKCVT4uEmvWC(gIV{) z121;G9W6D=GwYn7$Va6rG9e|K*Chw-sZrWV5sMMx{Au8oU=v=)r7@ASUINK`VP@w^ zr?ic0*Sp*19TwxTm1_&ONwd*76qvs&;yOy2uu}sNDLP zCmi~?suVBCr4la2Z^W0tl+CtZ#M;jF=zd#qN#j!w%Abh@{gjrXtE8jsFmGY5c3JOl z-;jn*X;7MXph!VP4u4HZeH_7d0o&@ykipR2L2GT;prZeZp}KR!^WFi;OWe7Y302{V zdPC0Nb6j4(-obywXWECV@r?MBsR+^M70+$VF9mVY9X!-$Cs=h-%aO*-_t=h}@6zVm zUhF)pnF9Rw=X9uiZ+?w)E@wTQw%#_p5(WI<-7tU&U#% z7%0GEM8y{a1!OK0JwJCMQp?hgh*T%qI9STM`Er{;5d)k!j#~_iHbWqF+`KHkh}@!} zl?Tz)iyH&|#t4e zKnw}mUjRfy0TvxH2r$0N1$X&SqE1bg0`l2d|TGo)sxC^(WN-si-|L@Z4N}S?rI6K}O)9jir~Rvzy)G3qyziGptVZva|s;+^7X* zYFS)D(317A?1VrdHMP{aQPR>2Gf%!`=@1a`TP}A4FB%K|=l~E&t0GbdjYgnhW(Aj` z2sEsJAazh;2-2DeF7e2c#Ue;D6ujK>NLVz2v^XGj zu%d{CpQ6_J>+#7&*~&L1|E|H`BNvAPUqv8c^bY{80@X4qV41M^vMW%rlzRkC2~G?_ zBI7?z`QL)_*I0qg{y&2P39rT4)oBusN08*pF971P2$DzvrOV{`x3I1@nagN{4gW=G zR-g^`1T5D6E!xO9<==t|Fbf7jfQ7@V)DF7<7NJ=IE9?_ktX&<}rS6yCA2!w(pIX@` zq&F|tuHNT=Iu&FuO$HS?jjVtQw%8Y;BIE0SlR%b;d3k);{9YVk<@n@S`G0ZzRVN)@ z8vY0h$?#sR{=*C{%eYktfMg>t_ORkzNk;Qx^`8a+ON8j+8u8bo!HdRXcPmGOjo-y; zGSsflPpixv3PnCSs|*0GYJWArG7*q$$i=oRyMm3%#cC8-Qo%uz-zc!Cf@9%kc~vDR z(B)Nib!or!ZmUuS3SJ2p2VV&rY(g$pqtN0299U-rqVpF(|2wde<9HR=$dnrZ4moUp z2M*bC{Wti5t-eJBtb_qx=@+ZX=!{I7k?8|VW04WZU#lJ@%k8fRAbT0IvB;OJl?o3E zRuLBaUHM+H3AR{Grsb`^qOMMPWWX%F`07Lm8&->>tpW`BME^l_{D%uU+3K-6h~%M< zl^Pn!yjpw%GCEjY-jL1M5@yIq0@hg;J6nkk*hpHeCL4>aS2EQ94IRMjywI7fr6&;z zTp$g!Waahrb{$ZcH$;iT=B^yk)7rzq-OJ5`8-*bWBsdTWH3!iS2M%Z**1mVF*e|IdmTDpRJUVLt;6pX)E z2F_$t3SR8jx%ku6!prmT*flt)t9sB7U{_rk|2uY3Xp%C%I?IUS$nXpJZINfN@X|oy z3<80i`2H!RIaR%%j&G8q`!JqEZLi) zQA=+s1}y;pfDV3@5?Bx{f)3~p4dR0s;B1A?qQL&ea{qpSS^uq+tT!+=0YqjAz-L4N zOF9Acf(HsS9*)+Ea$^?Gcu*$})kAH?#bJmE0CpU7zfexr>msFtcJSDs6&836q1MnD zvj`8khvDYNfj*!s2p>=@@Du_*gK{hgFkwL)3VP$kGH6V22dAejN)RBJNE+H7=95(Y zp9&@{($?02OyH2T)D=9TqN|{w0P_S2y^<+NUW!$jfm=thxky~rYp~+W(+;i|=@E}Yk>TK**@#Dnfv*qH>WqdR0zA zp_U;-p$SW%;lwc9I7p6wLkx0#BG3d#WBH3en9y(w5*2<1WT%O7V}L+`4oF6dkxD>+ zPz`8{fZG3)18Pr#0O|!m0Y)Q$@3;~~fy@Pq3<3D$@W2I+2fk29{z7#apmjr%6M6y< zbO3SSZHJ#Bh#{c1P&uSkLhlIo0e=@3gyKOl)HQs&0O-Qt(6BJL;1MkF-a?N;XAB7H zFP1}3!1tgZ=o&%=j7sQrL3OyK!EC?1MVB322vYgoP*BENCmJ9 zNyhw1O0P&1S(NYpiu#BGQW|ONfV6dn#5M55BW>KgoQa;E4hReudDz>{iwIZ-)+Z4d zaZ&;4P8_{d4Jn_1)i6j9DX{dkM-pA26DT1dZ5)8A>gnJ~&UBFbW(94_DCih#!0Uk6 z@5{i#9@SN88~+P!FKb3P*lY2xYYe~9{wjhM1L9;LLljIYq{fH??>!#7sO4f|zv*Hh zIB~IG=ab~K`Qv;-)eCs}cf}t-ho>{ZJsG;;;L7jl*48_qC+Y%5W#LrdxhLJW@I{ep!RIQffOcvk-ZR*xkBUL`=O*^9Cf zNL7;c@kcI%s{cbS6h*o?xO#j3o%TWQU|Z5YbPVKl)gi~q0o?;Dmw8g&!|L;nB{veu zjBpHCpTNYeBFcW5PKfEiLJF0M0hbSKtbh=#7!2iNOL4$TP%AOu&x2ZkGt6f|%K=OB zADlO!XFSN)!hx_64lG)Dz{WV(?!*JvDO7`jGvn~kG7ats5JQ18xCd(~1UnuwY`_)# zG^ha(g0@f_Xr(5f-ha$+WU_V%^~wj8v^5~q16T3yYY;rv9~ch%i_N;kaX>MEMuGn$ zu&{DV`oD(e-n&a&smpUoyTVMRoqj zmt-RH-(4L+iUyMC?&;v{=1R6e!Z`dLQbjdYg@XqmT38`_q17H(F{`R0SaREs%(+P> zd=Zdp@>j>=BrKeNnV8?|03g3k++Wq>U=jqA3XKo0(QvZw@)?wav2gf*%U*%|T0o+L zgEKI}kP6OVGmIP&I75j@HKMDXmpwNcFD5PR>E%JRbV2y0nw`Gy8Y;RWY)n%AZE&rY z4u7I*zz54`#UoU*R>BPQ+A53zvmMP6>U)nyFg|)XSDfAW?aT|a5;r0pS6MDmy|5=R zATikS;in6%l)?p;KT&tWQd-ml{3pIm?aI7NS*8~>O>pjh;v27c6@PN~JE_^=y6j!} zgcsn8K`$+$eyTit5$E^KGjXkGkJ5d8uj0J4%{jsnWl`z$pH90<89btNa;Nz4xLj;4 zcHHJ!MLm0&#OJ*B#x-8Yy}c;*2k}$AjX-7Y9I@x4-tT#qT8;A5$LmiOLY;|r2S2TQ z`dEbyoi)d+s_XLO5OS?lLQkI9wB2K2NtOG>jWpi_~+|cXfbp4pzFqAXIWC0Z6+AYZb9*zCmZm z)`9+@Ytnz%m|D7n>Oh+%`dqGEZcXX|{tx1|3muXb!UHVb!(HKFBYUZAl@@=fgIX>D z^M^J|^^ozkXn-xgD9QF*coG3jIx@KjunDbhf8o43~BA)VeL$WN)|5RipA@N4uC?kPy&oRkYI+i z@^*G6dV#DgBxLdt4|`iWBkcfpLgPX=Ad3s>>EPnvZ0Uitba(e~^CcBy&`3)U54R(* z;fE7N5}k=I09phNi*zO0S$a9Rxx!`$H0MZbqJuLChd^x?uVD)kY2{&Q4W0zW@D<6d z1X%z`D@zX$xIixkF34r|YU{SF0&t9|1Gdo9Tgeu1dhH*iHL!4(Ls4k_A{Q(<{~=O< z0s*A|WFdj277JyFzo`4Y?TUMdXjhK1I5w$f1qASjzm_hO{NghUeJu3#3{Eio9kcREs;csEs84wnruhr+HsDJ#rde7#fZ_n)ha;Z< z1i#C8B9O^@=o$lA+(6lf&cF5q;b9RMaP0zC;F*B=oB*611UP{g_7TDvcchWZ{NRY464Asxayo;kryG(5g$CS1j=HkmDN%CtEL-0L();|ASEp zJqfp1YQNAIw2DK=q6!16FRQjBJt+=G6%&Q10`nKG;I^P12TWrubil}hpj))CFu*Rr z0t*cXhla!e1b9f_0p4#6&@@0hU`Ru641260zXasL2K0)9u7Ns^#gp?kpaDo8{)N6l zCNBS7eFIF94bj=l63Qa*vIi;R2s94q4tstV%p{P#yP%CAt=(K)EJ0fQ3I`*cM*2J1 zkV42hZZ4Ltax;p7Uc?|d0(ys53^9=FDhAvgSjYnk z{_sHJ1H}fa0FA+ChzXE;6A+9Ta3w-v3j(}R6~qEaX+mV9z*LTdTq0100~iZFgYhtc zk06Mld+03yZ9>5Ya3v0)fLnq0g3q8FT8Chrcd-tXK~O`_z{fAKhkv?clM;Q%B@vVv zvYZJ7FWDNFF2q&xg=E186u|crcB3%>G!T#h*b+5^j7B?8ZY%;R;|b}%pbYFbw{%w` zLK!Xa9n?Ei13!pBlCl(JApH`c3aRTwbUDb4!lA*Q2L}+vaJ7R?8z6Zxpd*lf1U|kX z_?Ia&i&`g0ml1;D2j(mh!wtTq2~e!FoIpb=Sa|o9CNBVmJniSeq6v({V#rP4Q=0Z? zEZHArD5`g%b5Dl1<=&;0G2>;N<@4&u8jlxc*4El^Xu2!6zxr*J%XW#^h|eSMGb~ds zbG%{ojymY<>>NIV&57ptSY)+pTiTIGsT%a0DsYX)~(|}YgZ_Am0?D`RmQuM?$+mRoAnyIJl)i%%` zi>w-|tnK88llI}Rjb4jnvF%Fje}5pg{RDRa<{kaG&MV{W*eRQfUvhJ( z@P-7ODx76TbLJjH=ZM>+e;CTQdiPrQWq48za_8elBXPp_xB8w;asf(*MAKQWhjb&)*=-uCmZJbMt0^yX+DaAo(9`g%_<_)nt%QC{ad_=XN&|x z@0tdSe+oK8wAaiRL4Q8Ie#Xq*dBvtFrY*^nakZmb^R+C8lwD;2Bb!|C+ z`-xp$$HUeSh3sd{33WYmrF8yST*5OC)~DaE83~@frFG5lv2@3LKKRIXE8D4eYH4Y9 z#rrPkaOs-k+GeL69Ipf-`!cE%9t9ojmZd%<;%2dd!*CUAL=F~2t^;h ze4S{Ycm4Iy8!?9u?X|pNaRVXuTbqPV%u@_y%$TqA3c$9=KVi2OiCjzE1_vKO92JFM zWHyL17Pt+RlCv9pyUcHBu|KdIh_xbRd=@wj7!H88>40=XIwM_?Zi~y12htPijr2kKBK?s5zcMIn5Rfw{RPZk| zC|Z<&BjeC3`c8Vf2F!QQ^AimAU+HYj$)B+bj2UZ_crII!7=HOOt$v}f&i$nQ{QSrH zB`JADg`MAW#|yeCi(W)qX&Yz@+)~iG)7PUXm+bST-O(h!q%`eAeO_N4j_`2P)#>iJ z`Ua!->25&*V{Sny{I#6xl+WlXeSMKX-yG!0e&cl9ODXne^1;tI)Z^?njWZv={k8T} z`fCB6u3ds&yvD-^B9zcxHO(7i@qF^zGcL}gu%TPru2ug;RA1!xi_&4v{z7-^nZV9r|}?{DwBFpLucdeD>FqPG1^y+t4vHntIlTq!yf{eX*Shr@P-(w%WXbg%gUQ*sOrq~g2^OuT5elmtZ&9E zr4yU)*D~;)NK$IzKDNU~F=9QNcq}%aE8wd?`}j5{s;G~3sCQ%h6K5LRorN`3RBN() z{OMgT%|6Qa#%j7_`><~hrwRmw$;Istr}5m7r*%k2-|G4a+wudH$s$*C)adyK^=wiY z4-cGV7DI?n7ONY*#<>j$GhS_z*OLk89OzH^K2LGW_1=a@mo8@&R2ES;d4)5hQ^#(# z$0r?1F$gsD?Piz`zS_ribqmY6k#JtYr`1k+Y&IX?BtB>e6FQl#6KAs~zh3EOgLC0| zx6T`ZFPhhj99ImK{N_$8kB|&)^Bb&ho|><)LeJD2Ikgo^4GRmK^pv$w*p9N7j`?J? zdNkOajMLb??M|0q#CO}TdTuwAS?aCKE@Mr4N?Jb7InF2D5af9)!`anSU(LYt+<-Tn z;qVP|{-eVAnFy`=58sfPwGh0g5hI3{<46SGxj`%6PZQ@vD!>&5J1h~g`SZ5{#m z;RiA)<4%p^C)@@vN7`Q`^phY~^U7SgJX!}*_a?Ra` z8`5vO z@cOr_tZlk|~VCEU)~W_8+A75lr&jgN-xevT*N)^@epek>bge0X+kVRf&MNW86s zrTJydlSi+l!##4d($FPz8(G&{G2l8?u;#Rv6xouq3DO7FnOwig+`hK!saI3y&7X6x zQwSd~UlvdK>_=6Ygf3U{O`K&bt?rY)Y6Yv1!GO1THGi*SXWgH#zKA3ll&T#I4T zfA>gI;z2aKOx*UE?IMxiLuct2ZcT=z#R~}v)RxKJ$~Q4cX-QKn;hdAs9cfi!7`~|g z@dQ(J%b5_#rFwXb8h+}goPr?+;5JxiPIu*&QejS#$2(4{H6u%F#(>5Vr1dp8ZN zm+j>+*p_=&KC|r;?gDew^UkMM#KY^p5Z@TbTkK62-I>>wA4_QE_$aPyaPm>oW$TZs zSM_A_4eyxW+0^MG;y6$ADT^`o;``QoZFF+8l(UgeX3vw)<1P6&*9W#FxAOgCcb&~7DTSYuw6YqRJWY=Ad@vrxxlcAB{-ud#p|64I zRf*#@33Y*iRR%P(FXq2Ix#@jBcjlN!hmhy~1m!KUJEL14dtX&0D(l(nMZ2QadB%aQ_qaY(*ycqIw4QtU=jsz&Et0oq_FFV8h$8h6d7H$P6OT5P@9M(7^VN zKiET}K(AYA4=rn9C^9X~0qOdSUPamhPo`JF1^=>Mg~O4nRn|5ZmR1%vHa4DLrl+x# zg?h)7F!S-2-+3C}bbZCV%VuyQFnSUg8ymP(Pu@*I93%AnEa1C$uj%p7Ajd$ext394 za=P~Ai@kZ*EbJW|3VM=Kj1!Ynld^kK49}dtkYY&D-!HiCy@1`-b9x_z#0J65ajz}A z)?H!FWnWnU*TEi5*f2 zwwm!NK>-sVpLel;sz_kXWlJ!b956w!CUmNpL>be8WAYPUg^9Szdu&tMUc2vk^&VB5 zv-46!gPu0j?-IyQEiMikt(Dh(QLy)>WzC%5>w}!bgJNAA+D!2mwYCd%8$Z|SGOJ@M z#QbOtuj<~x{KZH8M&5{HuKn3u2317N&|r>zdWpq+mbfnSrkwYKOt5yOFxz`_EO2-?aB5JepJX-Z7Am zOWQrEzy55b{`zUZt~Bpt?>jEuVyUdB`x(6)iO)XQO$jt#C{#(m;e20nma6)^MjAeL zmaQjsVz!3p* zAwcG``&YalzhnU98?Fb&)!QJRGc$UL!gr%IW<%IUql{VJFi|`Ndi#y^ic4MdHOy@DB#d23j7MZ$s!rW$@^anp{C>9cTXX8vga<|H z)Z}Q@&!29yiu>tNm)21nzgCqHoj<|oG_Of9zkBn%3y;NgclWS5nhL{{MDK9aY3_d8 zP=jDUG0wJ1W<3=}IDN(N0a@#;`MbxM4n7;sHhFTZ#LSt<(!YCpW|FqlV=`iVieWN> z`=?S~=?UL&0gAOvg+&QUd8RQLw6{Gb7-r6m&b+lV?U3dd#G)UVI1X$nYB6C|({6td z>w~&~NW)3?i%SvXw9g^7!CM+1KW!X+zp1x+hsURiS<2h;%90_H=bK8?tTAr$Ar50| z=Ec4*l%g)Et7rM>Hn$r)GTzUfv-8v{M(_uH0} zy@NG3QerW594JeWU*JTct; zdS>t(A>~m4y9w?KU87SqZ7GWuUl2;!sN zDX$TlbmLMA26yU?f9PXPSIR>-SyJ!eLQm^Gz1@!HI&4lgk{O@h&&z)_-@YFyn^4oA zY=7$bk#@w_j;gUjhm(_U3?r!I9UVm&h69|FH*V~`ty8Zw#JAnwK1?A;>sXG(hT`at z!D}11HPfy%f83w9<7q^5PjYgkuy|H1T_=TQ>Iv!7hgmy&*V){Y61NuHzxTKZvM}sE z{TvT7ea#WI!WicVC+M!;43DcOZnUr7IGNiTSbDL%c%bM)-X_8G`z22V%Wb{9Gr-;; z7?~9+B88IbU==WW$CD#gLR++7s-S#rgE(cC3DcF&YsAa$NqabcUzaF^y<~rk%SDJz zJytU=?hWT~+1f1ki&_QE`p^4iDRnu_Hu1zp(tEp1i~mr5t!S4kR+N1uX-im;uE72S zuDls3veIh?Zn`r%9$@8jtfV_~pWXdP1f6AKi@a}Clb)>k6V;C04~_kAY9-o2M%N3M+eDJQ3O z^o;SZH}hytxZRq4midl5Y5g+=eS`B{Xj9W8HfuRC&k&~`3`c*k-?r&xCX*lQ_Q%AF zV(|^~V$SPduWt${&2GcmcxLw%9A6{pc%{M7HcjSlnX`v-Ku z&%bDB&91>oZJca-oFQ*5P<3zc)q_sNsr#9S)D8?jeizOaFCLybuHnPtJH#6oRw7)n z{#8nEYQdG!_WE}_#b|aPH~y)@_*`Rr4VSO^N9Ljo|IE?3VD!R9 zGhF)E)|j~u#m+BBw`MU79(;z1Rt$8D4eJ(bJ9tR=*eL}Jof>_ywT{O5q#&8s(`ME@ z)crIws-`mv0mt|H>YpqLD-n_o^B;OVS|EK;yW46g?4Vew`B;7=)ebpKXcL##X3FYL zZn>hjRL(^T3~fI~ZZLU=?2)HZGk+GeZa>eH8$$ufDe>}3Vg>6w8f%Zzwgu z25i|;d-}d{pUQQ}+JaY`ch^m|9W4H=_!-Z7fzj{qMEseoEdqT;ubN!ZqS50OT|=VR z71_$i0%x8%R_3VW#Ti`LN})?(H1O_tRNn|SR`ro)0aImVq%bF~_S!>D45H7@6)-r_ ze%-PS%bqNGz`AYdLwBF$Yae-k|7c{J?}gL7FN<`$>H?2dH@-ewneOs+D6e#DQcFt< zpK2sKi-`Ahf$IjAM@};ILM5M{f5%=Qm>cR{bgXcSBc=u$MK&-FXCS z%eQY)pO5ZAN#WOKsTmr@XqX!x46L0Uf3dYRCEFwE(4IT7KPAdyUA-@T+`=9zJg}oE zR?t7T@?OrJooS;AMtj}%hqJ}(iF@OCqH5}UtZCHyu#P_c69ES)HR2l5Te}_k>FRJf zSh-?R8FX4o=oxuRWBj2L&KGS>)|Xm2%JB$3Egt*sbbn7k*D0hNpPy6T9b+owjjB1F z2zJ^|V??VS|GUIuS>?D*%_q)r<%rx6Dad8K?&^UZp^Tgiz7;K=a=@( z*z==9+EItJW_cuhb9)c)u%2W$GRy0=*elv?TJ2x4D~so@($TzYl-T&4ni`?o6wYln zGtxU_eu&v_9N}~J+xNqlw$4UH$Tk-pF}-`M`F8(B!%MUid^``UYYn(=VO})SNL#!( z_CDkx_f$r?TZtUk%(Zu=*t?9kxDgaQMjWXe`2ytzXY^AI9)HfdHP!nXQB~fnb+*hf z7g?}&kf|vmB6#~$?TGIVlT%G+Rm~2TH>bP4JY35E^BK*3Wdk} zKAAOt3H)5GDk5?E@ac$ol<$Vv+Lsg#DPHQgwh3{zwa`(p&=c3PyG*$FgzX~r zo?P3+eOAeysXs9?C?PWD>a=2^z0~lR1ZT^{p=A60xLKKYgUO%gqt%W@UE3H!6MebuY)oBv>3p`~AelT-?xk znKC)D;6T+8TmLjh_7f%jSl6_-9MbPEtx1}#W6Uj*IglzKWF(~VT5$dOjgRY#>%-3o zpDDPSu5>rai;9kIyNIAIDs)m_E5CVHW0UU71LC5L@l-t@=(_OlZpVZqbU3SRXQnQe z+x7L^PF8b1xlgenn7ZKXi?KYs16I}bnEsg0JOx)K;wzZC3|Nuoea$DGGe`LE-u=|u zsIy6j%I(o~_={t8bvDem#7aW z^8c)x$waHf+-}p3&#TwIh7~upbg-K1ea4dJCg8)Q7gss^qtSErRQSutu9k9UXTd{S zu6NYfe747744O^vo_h5RlOJ6cW3PYVDpykITMe<#gHC#vKUMztBvKNWUj0dGc87zD zotRg~Lrm<&N~+0kR+6D%^gV5(25isIcx=!(U_c!4Qz(%;akYxUkhUsnS5|YGQLyVi zbl6stFI>ff2*nF8BBJ8+OPQZ=Cur^N-=*?QKeCpS_QhOpkDP0UTzleiwTrQ){RW$_ zO-cLnZXs;TMC#>E7AJpmluD%V3&xkxzGhGg+49r2^#ILRu2(xt1{tz35t0LO{5^L< z`FziOP*CjF7Wm3~dL&oL@S*aK%jaTpe?*&|WG*_Fc<5>?Hj>6!|6ube0_|7a(5})s zz09lH^8TFsN2uy1aM@$f_2#f6e{7*1|~q8MSUjhh`|8Bx4p8}I$2 zAF(MSlv}OjNttV*PJ*mL^U$lWSvHbu8E^O340Ufk)#sRYeXH^QY{>~@$zvCh8REl- z#tx3*3;5B5weOPT{6ez0y7jMTX6>5Ra;iPD=0xt%z2-a2DaHza4D3kPZ0F#xm@s+9 zq8`YVg1Bo1Cd_Vsi00 zx%JOx8l;rd__OAYKb-v}lPeO@n6TCV^l^jJJ1MX1jw?<*iO`K!?r&nx-q+b(T$SZ; z$R^EVoNz2k@Vac@DZ{y2#DlU5R;c7gG#z>>pw+UGYofQQR?P?%vnwoSuIZ?)mbE`s zKIQkK!XuQk;pJ}`INX&wrps|Rt_pE<-pCE?%-Q_LH{@JbrN*$=PGP%x-}au)cb>kQ z6MHO}Z%p}W>KwahY<@N0)w5A2YWjJaU&*~xiT73e+4o;Bmv9NZSY_VNFmC0X5q{{- zk$z`&rt<^ZpI%ePjOt8qOoa28IBXxDoIcsSsktB_tx)3e2<7dtgpBmr4NsbPS_!?` zK9v&r_T|@2Um9XZr#CuMT$nNNbNCVhL>_HN`goziGb=;tiX+3_je^xbZcrbU3p_SC z*YPy))BLOY`Dl|MTvazi4DtpKNAe-|c|~M;d+QUH4Xy$Qn(vj}N7=R)bKOktqd9h| z_g##-$fext7qc!^<@VDuMOybh=X^f;@kwo+v{D!6;MVO!LLCeRJ!V_qvKug5pTAW1 z>i**khdk4Ij0LWL;C~u5U!R^=et6R;TGK8gjnL*ZZ92x=ecfVI%gg7xqBNZ(-i^Y< z_JQUnrjto-Kf`j~`=mYHq;ZbT^g?`1&o%Q~GDIeSdt2#m!$aA(_qdweZuYxjuRoI3RKF}=Jom>(4+l#2tO=ri%&^fGO*Zt z-MkUeUwSX|*iS^(`^UJ@Laxz^=`2#z_ph-Cjyv&;MZP$#tiY5}DK3r2)gM>d9?Bs% z(5Z=ZK(ubcPRJ5Ii$GS0(@_)DX0lsvAglGI?uR-KD69fIfIe}W}4cI+M1lxl3r!vw^9S1`p!{<-_0u-n#)q& zg};Hwi73e5jlAKq0r}v?u)RNGUn6RFxtCvY>yJSIFX$Eal>OPkEdwe zO@kfQ_wlYRP2=^!;h}+?%xQHs(hmnUU&PxdB%Dpg7!oO2-Fl>y8u!HClPW*YXDK2e zA#*K8_1(BYp!C&EdR6hos-+jA6C?Hzk5Y@rQ@xz6c8Jb0V9PG1kqQ$k=0IA_%5578 zdW})xPLV!|Hu`Epf$lhdBIWeAR5qKVN_zZ_&)O$bw@fJRjbDF^Zk*{}!h>;6Nvfa9 zJer!}ScL+O=9iM?aqH~Ln(g%WQJ@2MZ?7~wGWN+jYu_pD*3CSur$%qJ>bh$L8NYry z-KO3u8{mHh*|(XEgY_V*zOL>;>nEuB$*~B=2Y=Fg16a-hd$?(WbHpWiQXx<6hdVX9b(9h_}oqU0F;%?GCw^E|7PhIca z5QF0^_YT>XGXL6ObG2Rj&<(+!pOw};U8gz5gdT4F`9b>aiP2e+~F<$DSVEWSD8fHld_pAvMd2xaMIWZ-e38&;mSGa%6abWzHJ~DMSG0U|Fb}V6pPwC@*l^d_B*cH6kqX#v=)Q(PfB?M%D)|lV(!@8ul_Tgyr{M9k_pmY_roH3WQr&1*q**Ah1Xv{l8 zGQQ9qL#9c%u)ZEUac!9HPP2RC;liYr_r0cKk>TOT*RGklaH(!3_5NexUGdSLrKk_s zGmisV+XT_2*y^w33o6LT7rtF2-`!{w$ZA_P*OUMvLQ9FI|EE(SNA+lb&~(>RU15@*?wFnGdGfxF zO@OT@9>P}jvRF8^{6+aw;g?Fv6bGN@ENkg zTA#mEjUGREe((Mc>U`|sJ0Nb!&gm<6 z?OfBnjScVDXlvhDr}F_>*wG(wGo)%-ScawVNJqQCVM2O2-L?+(I>8<6Q*|T4^f&KD zq;VL$$vt`UgmF>MWTj5b`U0hRHXF`h(IJY5X?YW38Y+2P(%0(lr}PlUpASE+Bi7+T<%3r=h3bo(YFdbZPsUZ*vITKo%ryPBXzxW%?~|3 zIuXSSH$>4eoI>Y_P1u|oPLK^pDk)Oton?C$zQ(&J>HS;x9g>wiLstGly9Wh|E}w5< zZbh$0zQ`&YK7kP3opJ0MX5#%})$F%MzIwsa87)oxPZ5F^$R7@2o8|B)*t}!6`zpT> zzGZD}fqfjKFtC2(eGIi_`^X7BnRokl_c6wPeVXvBk_!KZ@Ntah+eVu7=W+c9F7T>4 zvW9!_edk*%9Ojro(2Hvp?RZms?(BoTR_rXgr*Yaf8ouv++_s+DhP#$&^5_^xx5`0% zp2z0j(qrDN6czA(qJI(}{{2HwORF3Xd_)Zowqq=0qyH)4q~>y$_98VJbAE{Z1ej+54NJk$YsOQGUxq;9!-fNPq_GzIg`C-A>pEY zj6=4YeqHsa$)J~;EG%qoyr!bOnvppo4Qefd+O6&{^hAq`u?Fr<>bo1%G@5kB)kW%+ zo~Vng_3+pdGL?YQRTZAz!tM!f_De)<4bh3#jc(A<-Ty`6{d?xbb6LznUk9_Zm#xT;-Y~xMZ|^4g7FmaI89LGP=NdtoiKJ=Yt~} zV}nYT=AD71vtK>p_EilVb$JVWtQT?)|L*3)Mg1V9E4))2zvE`ESBoKEi$Q5m_K%Qm zRlC5JjD|0J53|nhEC_hxVJb2>odOf;Tt(eWrmTQVC=ms329BG7hwm+Dlmn z21rAs5uAGf?Z$N?g0Da=?92t%qz${)U=tAdb^>WD5J*i}{J7K7H={t>HYr(w^aZG; z??J&Ei=hMtQVs)1V{q^R8Q$QVQ!COL9N~oTf1J<&Z3S6OY=Cz^AO7X5R7*Fc7l6NK zMY<&AK)8Ud^3WSCXG6gImRHG%fb-2)$%}yZ*pss=RPZk^<6 zt>u%}`&L$Lk0ajld}gLiI&=W{yo}(Ee9(0+I?sdu&J1rON5?Db*IS;MaBsx#r(G+% z{zU2e^~X=VLA|W_Huj3TsN43|?AVNyKd02Wt8ezcuN(__>uJOE{Lbbbno%`t9ICBG`qYKJY&hpjH?${gG|h=7#^0v?)Thu*0hcDKgbJ04ed}IO&9Cj1 z*(+HkOC4t_>ey48jLBv!p7v(!?EN@Qa6juAalYb)C+)W$jC)n}Cx)5$@d-+oz@yX! zn+s?;%bKNLN!g#TFnRryZZ43rpJ!Bt(%@Ug9hz_2TS_dixRhml8q}ZSo9ik)TFHGc zaQeaiQ@H35$(MT=z8K%;w|Vsa%48bbxsl0I6V8u)mAp+aiMppoFc0OM*}DT?&~RyN z!=oIVvzWdlC~9oSd5@PmSX)(Sa=p$MkdMuz)-}2Iyj|9DCoY{;)+O_WR&cSXn*u zp;pQ@{r01dA|)rkCmHX5a&a!_lpx!6fdS3wOn>cbdO_C-xZsZmlm%5)4jfKQw94Vo zGrvw(r(^d2uy&5km4EA^?YLvx$%;C*ZQHhO+qTV)Z95&?w%u`Zd+($FKKq_iyKdbN zu&UOZSx^1uGv*jSpUUJcSd4|8OOeQRe`TBzp8YrzS&i?MV>;yHMhJGUKRKYmBj#Cm zH$Oj0ZS${iGHa3U0>$4*bww(3xFZ8|MKe{El9-DLC-^SHQXFFoG&Kz;C7@YJ#G zmNm&$O7G8mcwhfS?66DH+sBR3YAXo%bYo z;;bH~x>b_>hHe+gzGJNCC2@-F5nNi?l=ORnoM$h<`&mGII>pUlo!Z1FU0!L^fbs~U zrP3(Tfyq1`0n)-)fyu@CV~WG8!7?d3Fv>3FJwQ%g4(d81vEJs+bNx+>jI&^ zo{xatf8>ce}L zVvQq;3k&Mj{-KHdEH^zbCb!WzEzbNQh&qYTekrWKUG4I?vk|7>xZ(4b$2Ubq=tu{vg4jwMON9ax5Wy%U;DW6~*Q^TElf@o&bI=CEf$ zId!dRE^@sJcR@|p?vYd;8*qV=UBQIZsbSfjD=H6ffBM?5B=+ zd~2}3^I<}j?wNNY+7DQ2P+0;GM2lBfTC10tfG1-Wxh}jcIpbc0cV;nJleVmZ1Xf)E zuLc!$3S0t^^+nE`A)%@T9IF|kt(wD#p8~+*tbeT35XT-D=fGd>fK)i)0U(7RD99zK z?nEi;RMz^FpvZ$@1RXTcu%fssX8~Dxs+dZ7 z&HifcL5bf6GzORh%1hvsg5%|`Bvy@0JU&UM=oByE1He`8id%-nRv99qS$~eXU~-L= zD$U6NG2?#wEx7LB5LBrHBFfYxAQK|s7#vkIKP&dqB11t>ahtA}2o~~iKviUYs$XT< z_2YCWrfBPi{erlrhmU*JmF^>+v_fV$b-~tT`8u`VY&qU4PA^1WV_eTW za6Yk?mk%y)#f=ZCtT=cC{4B9}pO1YL=W1Ehn!&bpt+E{mc@B*spLOQ%bHSM=aF>1v zNw?n81rptnY1bq0hK%)m@MBUkz(J1B8AAT08cE^`x+sf<7Nt_06Ls6Sla45TuQ94PuFzjaYh`<#X;)V)-3wx!E2P9gq zhF8_OcBQlB2(Tcan6yer86ZTI!X=jT(!BNtab z{9Y>;%pg*nw42_FK`R)F%qZTgXcaM@0FRV^2f(ohFdPi&r&d^QR^e}I+aOsy>DStx3 zyCPYE7}YqQ12C(a$~icWvo)MNNb=~lv>I!T<1~MpL-~O^NNT5P#eK$tj|;-$#+(yD zW=M7sQL-C;V#xFX0T7fTEgB-{!z@iE*&zfmH9(}p-=FlHp?AWuUUS3?$CK$Dh-UC+ zDs%K7gAlB%#D#M!#EfRXWs&ALPN|_OeD6@1TQ>vp7*xUKRB(n#vpgmLKFv#jCNBCF#yM^8k`(%@Xqv`3@7N+^PJZd^QKaMP zB<6fPA2_CIq*D9Pbl%o^wFP6+mYDCIq@N09ECWXFy>OEe*ykuP|DbD|wh%Ge15aqL zU;@-zp;IJ1FWwzC`@4NDn3ikk!W&+Qq}<3!#Hte0na(Pno{q`hr_F)EHWDVEmuE$oM=9kC- zZ_nE|SoJVQJ3=4dR|tV`w=K3s2_4gtxsjHdNAwL|dmKWCO)yE04yY=rY{U4SLB}gs)L;4lmEg|5Qnw*`{?E>z$(~Bqda)rH{UJBy2 z_g&KsZezK@X}rXxn`CNYxyr+>TFKeBSP4)}Su_5f!axNXAx7`|6z1vN^NtpN;nGj^I z3ar5%$z(N1DuaHf6hd3u3ybPT$dk8E6tE*L;L5k;e$m}&zIVg)yk@8L?7CO&N-8Y= z?sqQpR+V2U^Ajeyl=mU$Pt>1L@g#WkzUx?=N|&F^VNq;tlGA0vtVnLu{-_=D?Bt8?j37@yMyixi@2GNEq zBLAGQ<({pOthv$@hc9qvRcFdU$q3agKIN}CURaw^`)>3eStu23yt=r^qbzgJoysBX zIEP(^9Bq6(*!Dami_O0ST7=3Q{VsWIej600z<###zBIBF=WMewm zot%SOkXsp`eK!0&3aWYWJJhkgtsF^O>Kv%Oq^z=$0cV|wuIc$$3He36qXZP6(YW2u zE8&8k=kORtxnfs^Q*?_qyD9Rx@59)-Iy8b^QeLR~FOK~vPCIRB(~^er%gEb#-G0M# zUxRKCOyII2sfbR>wui}gcQ3-dl_p0Is=h@5kqH-8a{Xw zBlo*x}MJ#9&hOEjfUZ8Wfz`3y5TDAiVWwfsO;$ z42ZrS@_W4O`(0hFnypNmG}|3Hh`Z`|EX}7@eVPuVpX5uE!g)Mo&~y2F`w#de;xEWF z$SuUN!lHK<%3Ix%*ShAw3cindw9{%|CtvFlrYb|I{OAcY*>Zumwh<2EfSe3W+m2CK z+3xr_-D%~ROPnpp1@tgdSAl)0PJ*otvx1Pfg%_O#LE@54C7LCmsZV&nc()}p0SD)) zQvE8)4_a{%Ea`@d>g5v1R(4z2+fjEbx^Rbit9&?eZyocBC3(8}4)=8kA9RinD-mj! zucYCDGMnJFH*e{B@d&6kqo9IV7I_kxR{XWuyFt~em=2|0^e{q(R7CRt1s_lqXGisF zKC!&Ci{7$iMUI5yeH}QcIfyMEmyU1J3_!J86TG(Qd**KMJsQQQ#@Q)G5JRlbLT zz8=+L9DxxpKm}a9kMuGm$)($n=lRLVqL&N=%$d%L##QOaFstyGYJHl(Jt6`?81Y};hXeE<^N?Za50NmiOKBVS4}2bw2IKs-;C z*haS6sXR`aI2Tca-FU#MkE3FY)xlDZlJ3HiIU_RPM@al{>nN%D(}p>=8B7>vvI$Na z4<10&AE*PqZ2sQZwFG-zQ{mw!=A}8l8;&pek>)eHm8dVtt-^W&ULWq!hflM=;f+0t z;MXbpSM^>2mlMwM#|wLpr6^Sf)%vP63GDvcwgK6k*~z*|kdmm-KH~L{Ed!5V%_R4w z6&bOPCz&zCto+>KA)@n+dcatouY8B4%32+!eN!dxwl6y@Vy!&vpW_a|5zC{3--gt7 z`>` zE{;{Pw3L-KepC{%xdybS4~;hKD5-|b;TJgV5e~OZ7-_}>V8+Ec(;`cb7W3$fC}=~a zr0bwi5c=Z?uKZ5=vMOSWW^aJu;+G}O06-4K5Q0~D`G}+%37TnH!b(5Gl4wWQ(<4ip zDPLlMY_pF2LJa`u2^OR6L&?yPnbLEI;0^0YDl*#)P5`N@v`H|iu~uP)I(VBV65_a= zDjQjF`m_jx?p$@HLD9$;iW8npd4<}qgsaO3a*XD4;-KncolI0lGFF-K{Q%9w}0(GDvlyyUR1tZFc?}+w%L>O=PflMs{S_6@|Wj z7_{n~R_piL+Q5r>Qaa%2ijV!I6}#7Dm34|5z#-;RCEXNF_Kd;+(Vd4naF+DPfO}kJB}0*Jzi7 z2WjioKqJW6gE_4oE%F*Ht@$vUT`XH`c8D}UkNP`wsjJGgt`$+BB2lsej`;A>$}OgR zPDA- zwFFxAt%9IU-9A-3Ew)2A1D4zz*M>Ro z1><6>_`q>_X}xYl2KO%Rdz>8-Du)(l%)wtcSg5I8d5gj$l36KEl2HFfmDCdbn9}IKB7RMzWe*-f zxIW)FiZ!lbeXFFC&uli|dqX?b4L2sfiZ|NbG_;0b8#eB*HB(A*oR{tu!JM&}vG!Rk z{nm2*3IolkfQc%g7{e7V?KUhK4(82T^GwXY`z7P~gSx0iIdAdj!&VzjQ9WZ|o!JKh zX3G0O<9=+l2&>tFxyh}J5uy9*Vm>Y74}$K5NLArseuAJdE; zrZ$qCq3aHwx3`tq>Jx8$2dWyYQ)QD?C#HjMKX?%w79>1Cq>oz~)?F)p^8q=2Hk4E> z)7WU#PFb&8&`zNY`N;bouxT0ONO3Ug4^pk)?s|lhdeTrf^OQxY&4gNhlvLxd+Rj84 z_Yg#0UwvwnvYl)V2BV6aRGaCEur(wjPIiZS{}{;d-ZdO{*(ym_MECM|vU(h{%>Wx{ z`V}KkF&$Aamye;Gzj&dp)tW-eDRfGTc=Ln4M&Pvar!qXM7E=sny|;BxwvX&LSAwqcUYsnl*oSCWO^>-lY~babq70AmuxLj8*L!j7 z<`7Ocdm1>xDZ1D`?{3^+j$B(S4$c1EE&RIpT3j!hpydI1Hej;+w$|>wldUWbgC+|X z6gDGIvYMdFi74DcvL17Mo$#w3q(WG-6<#|J+qcM=U-w`0>YZ)ech_qE*DuqOJDI+E zbneV7C_Os1DA`9iU^!->~Eu!zs#>Drvh#q>_&$IcskGdV2%>+EKVqoU}4% zBy)3yzppYjsbvbiT@^fZ7;Hgm8}6PL)pT`le11%LnX19wgJ=(X(#m9j;P-bPghx9* z{UNP?80}Q-fov=5%CteYU|fXP)Y;UQP`!H&vAY51_6oNq`P6@R?#Ph`XSSp0G&4H# zNQ0&nr_d}=Lu7Wzt^slS{^Wt&PfAA^cysbM7^r@;6CE@lm_ zprv3?kg#5FWZvtg23qlp1qYsTCHWY3Vk3Co9(`j!Qhm85+dYiqSm3^TzkZr4hIFy- z&-O7ZqjFxOW$nY-zzYTdSvMIqJ+VM$TI^{2?#AMz4wn(k^G;RzJV?LZm$ufZmnh{S z+gD@r2bdlCZkJjcrgN{i`=zELM(?lO_2MTV1l)~Mc$Cs@MR6k7s!T~5*dliq1z;N) zPgj{!_-RPyuqA-#`wjNsF|R7ja~^q7{jol$rf@CoH;2MIhl1YPHZkPYd-0sY`vZDKwD#VQUk#yU$+^MhU=lYRn5=ZE_vk~H5&TjI?IxHzd#w5I{|Iy`9= zFH}gt+QsnQjYAD6tl6U0m?_!$H1NIKS7kcBO?sDpGK_66Cu)CpU{)Q><0n>{2d?SVhv zHwJZS&q?g+ts@jx_Ha+_JzU6X3r2z(*d`NYx#_Mf8U;t#&@~$3zU4xU>Pk$)&tNMl z>m*FwBjGhR0m#@l+(^GOi77;Wb6$ zjjp9fd;6uq&gy{FD@D3We9$1G6p9s)l&PRnKj`jYa$r_)Z?xb$5uS!q=r85uNh=f> z@x5b;a_vUsO057Pp4N9N;T#`)aiNu08h9V}nV7-cD8CYM*QN?=7;_CRG8Kzb$wFCX zMU171=s(MrlSkNpo+SxUw^=4oG5J`YDA)yGn*Sbx1cz0R2oDSr!{iYN6%??^*ow=T zFg{$)?Svi4xAOFG>ki$5ZKj)BE<)A9y}-FRLTt@W>vkq1;-N=qNCcCT=2tg27h0V% zs~Nmhq>UxzCcNMC1fcG{hft_oBH%yiCIs`n_w23kx+PT)78V(Ttkbzm~J zT_wFu0Dc8VQy<$Z{N_Qsi<_dT$_s%#OFjyYB~MTU(RP;LXe9qTnzE$Bwi!{i2y=oK zITUPgtr^_%4i?92G!oIBI1;SB2r0 z*{agC;gs8W4gN4ICQ#?uUa{-F>Osj*x1QbkO=o*TktyNAhfpySQ+FwOaq-V9Sr(?% zn2}8uL&T@tRYgL_p?6c(ddM*}9>jZ~cS;t)IDZ513P3BFnS+wBRGbl+OC5P4#vLQg zfl+Dk766wkP>UpDbX5(o&5roA9d1k)Mc2DKL&%mkhFiFsw5#+wc95{~2Ek+OW2-D= zhRJ`E;H6SJFH&>!wKA(yqLd)2)C5HHwnQzY3uEKt9XR`bvG5>8m?wF`LFE-8E);NT ze|ic+-@~6qIB$Z4B64?Qci+eR?p;4+IsM8Ub5#zQs`2rb_(o?)-vFujmF_Q!_jLpz z9Z;-FRiBr;Y5sa4W{hDMeeGc!+ zleoEcf-l%{NjQ9nT%4&W8Yw+@cyg9yKPuQLtz>|9y}9G^_-1Q$b}4p;E4{JPwa@BG z7liN!FDa8({Xat^e=k-2OVG%F&t3f+H1emc@^@&2{f|TRugnO;e=@fJ-A?g0O5{K2 zqrd(1e_}@dv{e3)K>9~!gy|mzFn@zE{)S-ufh7J`lcII|M?C58Cj7rL4}Wpr|Lb@X z{U3wrUzvv_Pbo!JoRMp5#OfHfY;&UYj!QgxNA(G<`tT`knDmHha$#@-ccoS$v2E(+ z#$uG$1J$)Thc^KUO{yk7_cAUNeql1nW=!-H>PYpJAxz}WPc54|o2vq=v59w6br~6l zDSWcy`;VOKmjW?x5Po?k#@O-6X>AQ_sjjdR7CHr5dS~+yklzO9P@^USE+PhkM=|JS z?@dZq_X|hN-;sq~FDb{7B^T=3*9@Vi&fPQFG@Gs0f2~pgjGPyN5ko2EaEOC|!Me#!M8*}X>J05egUrHpN9cy;0o;8%SN3OC2zq{{|M8^5rMfy;fyI+ z+H|6(qu@y%cK{uu7p1cUyO_<-k3=W6{lH%_fusnk!FinX)VW|m8!NSQ?2q%$aLjYJr#G@^y0YsgnG zn~m91@%H|eGtrY+i9v)CldD&A)Dv$~WvN}N>mb*FtVY*X*>&xhYQ=z8uW+a)CB-v&vx9@52gQ@XBMf>0DV3ck~l!Hiwi}5Gv zCQa$!adWN&ivF6SECDKq6ec1 z<5v@<)Ptj;dg|Z%UFy-t@ABI@4!1g=mMk=(j!+h-c2>u@ZKKHSryh2(w5Jr(<>%uO zX)G4!jWVXDXM^f+_Uh{QJ2FXUh~NJ_ zi~gQ)`d4PrKeqt?6Pf=bO8R4@{?nEESNKI1_CHTK{%aQf&!!~if0{*qdpPo6{NmsE z+W$af|L>-xf8!RFXjT8+mGn1X?0;I4{*D&@6Ib{*jqJZn75=HO{JpO7znYR<|2Sy> z*^~5lbN^pw<6m6;|N3nF6AAe16P4^go+Omz=Bkq7@+>)XNjouCEL1Wg8F^$;lq@>| z;RO{S!n{#(f;<7}fKBiAbkTG~qY`28y1{UaQotvh7qahNf+#4DXj+hkfMmx^z0XXUS$i-*#;_ zXJ^2LibwF<8@NaCysyi874%l!JS*2Lbw_ZA>v~&y?26&>QO5`?)!cHa>Ai5DKOy37 zx4sKyptsjR07gjqRXd&8h(xJgu5zS+mnyA~ZM0+Bwni%Vr_C-W@e(ccO2<0oj~UN> zs?b$icA0bz>y3w7#;qK-M17nz`3VaX`g^o{(uNRw6H>;)^rk52{n04>6gtJUx(N;w z3dZC*(L`eY1bYJ(`ieB+2`UqE!yy<$aJoPYOOZYp6Awn< z`B2RM6}k@$O%rfx+yQ#ZG`RFassV!p;pom(uDazg9pMyYss{CxM}rzW#a5InOy9Pa z>Zbu7Oz*aCX>ZQAsE?zhz)EvyPfMmsLIPqQ}x`I?i#gnFDjiRZ%-H9v<%`B0@m{rYN zt*nYTwdR!1+-JeO*^@RcdsK9h*mcE!X??o$!##NoK)!`v+2G|%44IDF8Sw`cXLMx1 z@%(T|-YU9yLXgggpQ`LyEaE zI(bUGq4w&)dU@ysv7^(diIi3dX}1Z#`<7Go?NYW2o((iO1h|St)%ek~M%Y)6{;Kl< zdsDzdSkoUT;Rn+pR+wKtU_$G8oJ#2Av2TrA1GkD6-=um$*n^hZ4lcvIxWCmbj9v&k zFyRrL{E%d}SKobkexi$Ae3h;dgCVBK$e>Ed3U(8tzT_ZuMoM=(FdR=B1B#6}L5>EP zDGzd=qF3=PopRHpA9yz7ZV;SyhrB<(D_Wo*>t~H0SZkK23Y+P9Cp9HmSzI(?9L4Ji zgV(Sx>xUzQ;OgO=G=|FU#snrl+V;!Y=llp`bz*mVIp%?&f2#p@d&3ZcK$mGYdL;-f zK7sT?&1^lTRK14AZzmk8R2jWEzX4KSV#YD55qcwXOt)>k?ICtu-T@$q1b!{B zf^SCMHh~RbkL3mX)FhXUOw?}@ACfNp9xMH_5d8?j^`ZRXC4BM;nReEpO_(c6zi7cR zv4x`^lu%Ug0+4^4vWsSY0R}{5W_=9iha0sA##ZF#N5u@@HUT)UhYz!NSc@ibszvGv zsLuifV_H^?PaYC(24E{+!{)7W_5#X_L?(;9!e&t9uzOWLP2P(h$HfE3hi>_fA$eo7 z*hHuNvtRf{k?a&d&&Mm-0(tO5@B$|olAS^W6$0}aUd-wdfB4g)tLs)_KmXZaf!eN( z9%>PyoIpD(YXssEJy+izh2)s(F%>*ikiQ||0<1ea8M_=KBxpFqMM><1Iuen?+FkCXv zr`SrnawFGcCtz0{g#*eFqL;n}=M`rR@3Pi;%M5ySmtIa)1FjxwX*Xgt?utk$CVh1o zgX@`7Wm}AG=*lZ4+SdM-* z`;dZ?;@ZNBiZZBrwsc6?fjw>W&D(}d)Y(>wu7~Iaft?MIJ;-*fn1Y-%Q9{V5n4(+6 zoHH?<;hyy1$!y?VN!nebsQR#M${xP$=NA3atq}O6Umpj)OuB74K9D>?vH_VX%++G) z5R$zwH%hdr)-qFw*u9;)Ck?!ZzClKTza1K{mA-TDb%zZ|v-tzJLko_AqKuj-rzU0y zTQ7t7M+~Z689pSOw-!xBZmiGeank=@H9>SG!mjaAws2nf#E)>T z-O*BB-duG09#S4X#mUkZLWyc^HWu&tX`q%gRI`{`PQGf=ZTrVd`Pn;? zVKaYfQDmqPPbEQnK|$V$nYz@#(uYOWmy5AejOv(xM)>UcF^4C*=W<9zzz4D`Kj1=k zbpxfBk|SNMO0npiE;a_NOysyD)kcX-OH-ppOSKJ)RDj$n7%=eLNtzf%K;>6_Bh2TI zRRTTRW^ii#;@oL)hMnyJy>TN2A{q9Fpi#kN&lync1Otq zenTmRe8&QW5=bd1AfJ!?wJbwrVdvyWtYrhnKkEm2VqH>$Q%N0Zv|CsS>h&phfo0hm zHG#HQ7#RW1E_60?(sMg1&H?VJ_ds*VB=gK#l*J@k1VFnrS`g^ zbJF2iT@!t_IZp(9%b_tTd^NNpX5a;KY5NPJbcw42u zcoj27G`7DN8^9xM-91x+=<3RRhTcz!rMs3!pkRm-f<%KnzlbB2$Q-2wr5m*T+GW< zG(2Nt+35!4gR%+ruZ?&n~=2a?y<&O?67pvJZj6%6-BYKDI>|q zCcF_f5nh3I0-q+J)3M}c9fl_SK~iCOFXP zNfB;4sM59J`}#c2FV7DxS)p%I|+gjc-G1@bF+6BwJLkJvR}eO3BsK zEZ-Wy97C=pt#~n@e^}X%HgsN0Je<=h9SAh)E5Qotwb5_%RlgGy~Tw8^($bbFflsw2rRNy6KW+mB2nn|bBLND7EoUUdO zNt@1DtzI^33iqh8Kp6v2Eva|Y)&sppxAS44bVa?LWJqd_kNmTm zw@hhX!*=L**qc5vIGvm&;w3uN;)J9KN~n1BK~L0q^E>FgMfnN~o$`mmxEmc{Y_(~* zU3QZLS)LY|v79KjzoxPp)34TZHte5SIMJyu8(h1yeJ{-vCQ>-NPp`#p{uFf2pq}zC zG_FIa&@lGXBHyR?^Q?U)X4r~W!_E0^p-~a@V+JcZ*}N$PXXl#9ZBq5}0AT^PhNUIxhoM~rU3exNJIjQj=zzG9oyAtV(V^~6YO+M?;WNnDPsQE1jn2jg z+DVMpbC$D20vHy|z)9t)KpgF<{DJU1PA|8Tz)QCSs!SmkrR#ENzi%rh8^Y+D2WFD( zNZ1DW$cGS`dgRUy`|J{F4$pk5QjxvFqQxbcy>U7D9svxE1cFrF3s%9q5p{4D`O>PQ z%Tz3dzAgjj`*o_*vC#z|+cBfMExJ{-o1E9Wv7=wd0XSEtu}8Bp*sRvD%2(cO?5pS{ zf$PoRRCR8LdN9g#;dDvnus1!vH2P!vwC6B@WV?p%$%s;QmE_WN2Prj>8P-_2Fk<$7 zuVU`uwiD@PG6Q~J$rmGHJu9>t!j@KWn3>f9&uy#2o(p;_@o#A|1MR@@pu^$iADk=u z#EO%j8VRq?B6js3_UOcg#i{7gEdkK6B?-1ShzLD=H(73ilXpag{U}4{<%$WR+m}|6 zOwBV74etSm-*TK%GC)3^hPbQU0hs(bUmdo$Gq&}O-o6if8ay20SIs92ho5VuN0lY! z$=z)F-mhCBoN9Ka1KbVzw(-BezcBK%EmZ=%fs!C=Cp*uA1Z%>t*V?;S~yr1uD!g`o*@xa7ic z;)#durNg~#40mLAc|Lhr3f8TX?y=CFJP4&k;*Z{vqBfEp1VU;(H6`!lxgdAvp@$J) znB7+mvzmn@h3pCw27r`4GrzeGKfBpD`kUP_f}>D}pW14s-!AX$&k#<%)X(JmT2q18>Y_i(SwvB-Y2DyO z`mL~Tap0}FZc@(u`RELVNvPzx)Tsv8E+|KIISvIVjDjtk?8tT4r>&V_yWe%3=`-PR zLnMX0RPp40wk3|ynk86T&mv=wkiobGJX4M}(d=@rI7n@GGA70DKtKeEsumJg9 zFC>7`bW3KTSB$Fcp<;`YcwNt!nd`$RImrl&Be&c{i!f%uB~kp~kniT-K7AK@yJhD= z=b>oxM!dSso$Qf#I^}d7>d0XxjJ7^(8sS}u^IplbD&tC*2YF8&qjVWM3!lsk|6!Xg zlUu}Fwv1Z@5>OzCoDCNIE0GGedY^lN?r3r*nqpB?$vOS-aAu+fY{Ba34*oXn&WO4A zBw?M`XC2WgHtMJR?*m)|s+YxRv{ZMZRPea(geNO^lsar|4?TO`fp319Q+p`C%wOV( z!9j}dRv{9R4LY|X!&Q((8Q8O06?#YWI1C7p;5NA&GJ7TFdbr+3;kr-$`%3s)q1&5Rbx9IdoV^& zang83P;~@%A8(HyVtdT$Yf%9y`(VKmPJ?5{Cs4E=54%v4KMSR|clgdD*{qh_Ir3u} zp7ii+P~$T1|!Nr26+~cO+Y*q%uGBR zb@4;L1I=70#C(UUYN{F=I4gQ2yXUgaCGrulJ>EZC_K5ZFcek@3xGpgi}=;OS0 zH=6#8zOC5meq(_fJeBR?uej>A9Lkk0wbu(ySCY^Q4!p1niY|cGzKxd~1ga;gIu(tH zK$lWINm8w$hJKQafb-|`F;%|_M;4{Ts`1cflsvt_1SCsN8 zg$&HtTv*TX8sJVmDR7f52Sp<|5E1(7Qg4I^;6Z33aN_j=ztz>+Q60u}u>=t|lRPh? zzI)b5W%vlw1RI3;sjhBVlvP6pfGot{U}b_V`gahLtB6<2hjJi*c7Rk6ss^i$F|)t{ zS6Jr#XnFfBQN)CkBv`kp=OeOC%8gQA-}fDs>(*$%f29;pEL>{V^sL^E`CN9+oMrNr ziIsIIE&DeZ%8X{(xQM8bu!yJ>pbIU2mv8uX>RM2vJMFdZ4h5n#QMNQPeOZ!*ndx37 z<3gs?Dj_9&T|%v%IUD(nU|n^!ba`UWrz>;r?NP9~Ue{NUmontV){Qzd{r_^c{g*e^ z|EtMJQbbKkUGYysQc<1l?=8RoyxIOEgJEU-6N~--EQ9&e>iEm$wUNH5sjaIj>j|` z=!Xca&O{#)w`m<;Le%dZZ+RH(`>)1FzNNtnT?xqlQb<&z9(rqI2% z9oRg+jc#~8V;4di{0J2Z9LK#`t76INwrUm7y}r6C^2Ci==J{hp^CsOIW|MmV?3)X$ zM&ulTsGjYjl7zufD-5L!|H}0;tB~-v38B0EA}1vdGHy$fwr(yhptt4E_#5HmU; z?B$95gmOT1^%8#lUaIL7d7Gq!$SXrF#-67$eV7WhE1YvL0v5YPB2uiUMKhZ2U*TOE&_2j?L)Dg1E)*ogO>GUCVe{KwpU z*h@O20WdmqC-~S)@4$j}R9RC#t{l`kjpP&Da9K;`6(?9CQSXuvT_r%QjR}O;z z-wPe0|K8{LFI&dH6*~U5b^2SQ@Sjo~e`1Ay-yAvp>1q6ZOZ1ON{=at$S^u9pg^X;h ze?9ZXYUWBxs?FWPV_nNYQKZIsi3>w@P0L^X9JR%uOo}ni}mj$m}^f5CDDMUBNqt$U9&#SMIOYec?sI z8s03i%SWFjKvTbKbUEiC-2 z%w&W*8hVG1df0Jgd2CgHsI5ji(tc{YyQ_zln#e{BCJdv$`ZSfH3B!6C?1X~}T0^{g zpBqDB`sxJAaIE@}8@;a)3u8q(`-IYPu6uC$I4IrLgoX+9{&?pED8o4h{%~@-kiQ<= zFu}g@sf;Z95PNp=m;4rw)kN*PeoK~jR>$ht1ujiw?$|Q?6ZYp~SRip~j1|VqW0^&2 z9gTanqIM5Xmz~o!ayxxL#&}wDu5mg#=5p>K;}ye45;vg^I8VyD=>`2`uce)guIUbED>cQWbg^E&5|r%@o2ixFbUbE?){J1C zXD2>@!mv&7=-du8rq6!B(xaO=Q4{3l@TH3D6zz#(CV9i2bg1%tS|vgw8junCwR$(*n^N(7l?`M>Rd1;n}(WD*Z&EZ|f3ZjrP1~iBPr1CHwQDo8(y98MauHt#J0m#$=Zb6J#b?>FS zBw#54PLnuLZ}ax@X@1~#957a+Enw7f3oNLtI$Uo5XvM+Vh=hEZ9&lqLh4re!;rj?X^Nq- zudgaNc{JQ}?$|R)(y#|Gy*vmyU9A?+l%Zs=NWi$L)M><4E*f!7nrA8Pag&mks!t^H z4f}2VJR-+|+ z%vYZSic~5+PM#tY9v&OU_>Ps+L41u`1%>K5RIo|Nre+f=(;@M*Uj}aED~yXL^p`kW zh7?lRh=g$L&_;3R&{m)!|6+PGs3wM#fAFfldB;;x2>2AR4?T7j7dN`Hn>rkw{T6znCK=tmTu;>tdJ?hQ-mjNri;T5>N$%pE_416=*0W0H8 z1Gf;r;Aqxrm3yFF`cxDf<1H?MKt~{BijnwDwer*r4tyr?q?oRAa99nhfxmivp2j$R zPcUw0dEE#hcS9`%t{|{x~7+u-AF5T(awr$(C*|D)=+qTV)jZQl0sAJn5 z+qU&(?|sg>z0bM#j_>|^-*?Wr=K8VL7&WTusk%J{D^E~unJy4we4?@=W{-PgMH}c& zxPVZX>4y@wXF9={l1g3(&2ed7hysE_%@oy6XpAobbdM6y9e8GYb})G->kn8{xv1(s zDeXFF55jq!+|yi5;#iY1t&N**5Sb11i+@Sv|CxaybDdBltFM&#jJ{yv4d43$e)T5x z()zh)Q2T}qJDfjVb}#Xi1Y|#svkCImp3TE3F2PIwO-m4i$SZtTJu1<5{T)AxAr>IX zn!dxTLA8)y77N98pTlv@{n-3Q8nHlTqo5`mTS(Ya*91eptujo*&xFW31SJ*q^~2Hj z)CNxKkIQn(n|>|=ipcC4-bS((W@;KdcBX0Z*zEn;DPiR7GTI_exoq$d-8 z2heQ^r9GBU4flT0)ws=1x(ym?CGku6a*^)(c@{gi6MXU(-yF>-`|~|~fBVFiA%PrW zo5X^T+hJ-CrM%bcvh^_Rf z2?pE`f_wf8Pop^}x*PQK+7|T!qSZ?Z3M7DEqL?gkaG{BJ`4*(oyora0%3T zvJ*xU=@JWLyDk?yqbEJGBa8_|k${tz9E+an1@4HE;R<7%9W80h`uR9yq!ts|q~{Wz zEe>pzX`Y%U*00E(DOkLTu@#Y{bFQ^^hBoZDWK`9eDy$LBAmN2{v5|o*zTC?u^?rT< zimm%5N7t@eF0jvjwhicXe=$;m=w9r_ex1On0V=5T5nCOl_j@!)lPuw7GSLjP19M^qp8m zHQnGB$I?3)rp4vuJ>oaS^ zRg>rP-%%P!x?T7fx_w0xd?mk>G8I-l6z26Qr~zoe_|RF>Kf8x40|%oPi4|0dnb)e! zCMEqK&6aaVf2g5feLBbv!()Krjy++Vu$1{Ol4>sNAMM$am(9QCcm>6$As=#1rca*Chz{y;Nfv9H&06PL8}<8K)shH?K01-Dg-r3 z7O*_KDL7{=5Wiw}WcS-!qUSSU^B=3Qh-yAc$pKCJq|mg*S7eUOwZK^Z?NPXrnU*{L6hMenc-_iVB1kX(IB--dke=8@1EdG zmHy>H=z69u5)AaX$EMc;&oT6tpz_(Ai}yiwES$p|M4_sVh+mIk07Z_gg)D!dGMoXn zUj;Z1-%TM=&ouRk{=yS9ZZb0Eh>W6* z6=t^oiZdVC9$|zw0xK1d(Npn6A`$RKmJvzRM%{^}lYvg9L`w{E(wxWIBIKi~Hya5k z<&b8eup)$C`ttbRD*0BYe}aCbR$V(ct(E>13umh)$8(>KYCkbAk3rVCxi{+dIWvSBniE9?0c$r{>n>T24SxS7)9Fv_|50YCl@n$7`c zE7ir?vEeUrsOv0FSa%k(E#e8#TXh0PtCmcusZ{WKR?)ufH$Y9>Y0LM%FK)~HVag-I zsEVf*V5GCMp>Z7Ac?3W2QR<64nld^|J@!vLeg!H-n=2rtXGvhz3-HNoj=^Qo zIU@24sVcI%ICdQ7L~o-0{9X44+9C9(%pX-<(8UMeVW}hvMaScjz8^_9}IIFVCRJ5Vzd4Db?b=t<~Vv$UI)hoT)Y)Jt&B(Md3$^N5DxG{=T3 zo+Bro*1eHTX-!?IIa;TNx5pLBGZjvSU|J0)eeS5Hj}4?zKre&s3nImDil2I@s)mwL zI9mG!3VTy-A0p5eaptrf9gcJ)-l?fwTOy;=hFiF)p_e3Yyp!*A)}B{bs?FsJa)ih4 z3PTlHY0ojRxv!SbhOQ=vnl>U$WtTYi}mqZm00f6kGCq3H{$SqA#LDE%Hsod(8{4NT{?$MQU~rKn^v*n)&F-ln(#xpKtIhjH$)qi6+To2dE zlSMI<+R^wJSx{*0)<%3YzkET)XrYgN=S31C){@{Xh>kOjkAoCA$cKVtzlm4fEsX=c zqTQ!e-|K1R)SI#ycK>ZJ=H7=KG!{$E)N zNi_*Yxj$G6B}S&dQ-};KA93hRzf*|Jzs+gS5|J()h(h`;j_OdoF9e|ckB zJ~sdI#tMD#6B2)Bc`E-SyYt^WL(M--uODQDiNha;)<60^UH<6y{7=^^2gARGQU7`H ze@?MvV&P!;jfV72@zho^!5Wyb(;t^qROSXV-`B6Aq%+ry$T0sLPoyujrqB!#7{IUs zW=s(Wly0z>zR9PZ)a=gyyeQy+h$J-M_cJcJ*sAR0$YtilaQV!$7@hwVv-2pH@0ET3 z+MT}R{?Xfaf|;m$E*K$P#PB`t8>w`5N6w~MFGezh|j#P!Q_){y*| z0OpM1221^cVgO3`XLhlNlEUE`@V@VGotEgFO60slh2{^>a zd!90oFyf74aRXXbqx|=Bt23{Y)&lRlXhlh(n(gSNl4`q=tv<9)xLRo zhUv*kt-whN2t7Pi7N(&_=4c%WBTOJ6_DUHdUb56Cx<$JMtBZmlU562Dfp%vuhy@|| z1d%gFr^$_y6eGk!*AP<}Y`W&dr6Qz$-$6F!d+b!*eM(+7Wv}26dSOnMT0AsyBKN+H zuZqpeWO+qb+`uzDqNl4B23f$dVMEMt4BVm5qastTO#2#YX6T!%hag@?9b^Bptdd#1 z$F^*UEIl{T!zU3^6qi>}M0O+<$LFs1YT=be5~WzSFIf7+AbZOY-%c>ivqmLED=|xGFnPm zTmVWU2-aX6Hc+9gQdVfKfDTX5QLu_?R8lTk)@yK?3^d)GWEAf>gxEK4yk;cP%9jX+TaL08LBaQ%Gp3O)Pvz+c;aNE@=%wX47YAE`@pjnf-bQ60b~5! zm&n^w9NVHL>6IsFY>Sv;fmT`DuaA@a(l{?n8N^G}l?pOASkD5f0j40u zAR$&L9LDgcZ!e3>eR`zX#z6Z!HBy1(eY+^LdR7>5x?30z(dkFhMOHAK8~Av`oqDT0 zPHm6H!VhYb{WB{_2-6ljI3a^A^h^bz&_TW^7<37zVGX9Eo?&4` z9JzuztEoE$L1f-_Z2l0lwOcW|9`dJXXKjMuy`xpD*@|FPZ=82MD!>gDu}CQgJG0R` z-XUD>3`3r{R?V!FdW?PXub5vx9PoD%uh^`dLSZ{M=i7eOzG7GFSB+^#B_5V7*^e+^ zDnQH1z5!2X>o1SGW4a$1_F?1rKx)}jaOo6&Nfl@=X)fzc2Tu1$jtfA6z?kSVDW&~! zBI5k@$iz0cS{)wlAlP6)CsaV4sB9G6sB7}fQgu6aB)KD{CH;XK;cFU}xuf4<< zf>!$>IiK9X3<nEWGgi`8 z7c2mE-_rW>0*25lB0v&jmEs=}NJ!?&xha!Mu)sF0&6EOFOa?gDlCcIzM)uUFX}Ea9 zs$mi+V)Xj0YNAgQue2-e8Lt~u)p z$e=lC+6_)?<4>h`>f?B3^i4F4=x?-*)dxBn$7m2GdTUtUh?ojnxC2&sa$E8_i_2(G z)bp+dDfjJ2NWqKRwJR#h^rflCPLo5I4e3c%khXR_w&@%=$&V#@KT`EY)CLZHgP~y; z6`mJV1cAHtn|t0v(*bx}Ft<{9&SX8q>k|l-oxl=;uZJ1yFG%b$h;vueibk+dn3JE_ zULG?pFAEv2zgrUl(-XVn-*76Ml%2PiW@E@n#(~;)+mMgx9Mu^Qy26p~cDXk#0k;yh z*2w{PV*otBVLrbd9$5>iAq8s&bFpUuwUv`W@<#jKQH;z{TIPNpc1FGJ*xIx^#xUD9 z5l0AY_G%1oip}sP&XbQ@`TVNyobc_E;KmM_cPPjqO5C>H7AdJA20OTq_@iO~*= zD?jGkle&%$>L9sGE10Dz7i7utPHFEx`8_VPN%i%uX z!6Apav9xQ$8LFWzUS;ce_7F@-Hxra2sofC+_UwS$GpU&Pi8*&T&tygh8!k5;am6BI zmE!DTqzAX;4W38m4ZH6&^n0Q0b9;wdm$c6W=>c*jq?L1y+O>Ue_aN?ZS8UF6PsnrF z%hR6x{i~-g*U%QH9)r7Tt?Z;Yy!V3p;c%bzTb?3f=KXhnt#s4Jq61TRWjR}(-l03UT6`&VSX;Wq*e+*CG>+-SKpjRv-3I?#{{;+egd}&w4Qfb??E_$QfgE3B{{;d9 zWQY0c1rCW@at%Io3OyUC4v6sRhY8@cCg46O(Tr1Nc232 zEn`7yaPhV+(G(l1Bj2%G77I5s?OfWTLsLtBWfm>vQ~(+PcZZ6-*g9fqtSo}nLSbr{ z$wXuBLRF+z`TJ;0gXxMBM$thZM{!1-ELO&-oWm_^GrwWEgDXDQ7GE&I8$4^DD%*cz zWS0M5nO$5)T1-v&4~+b8D*H!|0y`TU0UPJPDp!7k$RDSFD^mDl`(NW@4F6N#3M1pk zeSe3@tRE-;g2=2NApBnt+4vtx^Zy(N`wI|%^ey}~-evz=@VgVh!NlZGko+G*T^xTj zC;i^l^5?<-86GooGXD)8t6D0cn4z8KWgo&39>qD$MlbVHh0`Y>ZC8i4?^4*^7v*o$=VE0fB>nxId|}#49y=^@_9KzT54rTp*&?a}@igFi$Z$%JB003mXtkpsNFa=A z*x4u*5i_G#nXkK9{4e%<+5zgqG^D=}N5WA>5D;Y~AZ@pVw}=A>`N;Yab$i`}sAPl` zf>PXQl-x!y0YsDzl>#oMu4pE{O-XSf4aj-uJj`k3tX{>6=@as%4~La*PEN& zfg?qU)wV7OnD!!`nIUk1=M}~M{*D8Cb%hG*@eIAS%!IR#7w0|d3ctPA59o?%x*p2? ziYzWLpRAd(mb4MPWkXxCqOG>Ltj8UvC6BwA&MV047w6~D<|!F+{#u`)R|Wnd^6RcB zH6&(n@2lkyRR+P0Ta3+QzONDe+NV59UwSreOT%Q;hsw(e_FPIq(d)aWyq09EMuXsN zAgN6Bxle{AA~bMQ5W#O=R0G2V5{_NL&YUKoH`f4>1=;}jbz1achwvj0#c=^)`fxNo z0~S*qTAYxKHqt&)>z0%itlY2Ktqv8OuL^a66%>wIo>13Uj*bT0))edZx%n-!h56q=Mzt<1t)fL-Qwq&_UgwUcz)AFt~kz(yQbza{BcoK+Ww}DHx zmS^WqGM=Ita1XY=jG|x2YbnPUOn0j;XPYz#yu&an8#*L1fe=`~$N^94xFIS>_IJHZ z249&gzjDiKRCt^_*vf#g^WS|zp7MO95S(Ph%{K5+$jNvq^78)aPb&~h;^vX^P*u~j z+d)dGDcIJu>bNPiyQfOS_VO#UKrgcRDasD{bPzh8Xoqr#JPY4c`$_Zm7m4@J;p8Jg zeG3jvj{g_vvKI9^X$jTak7D<0%+eqS4)|!|G(mS!S{!+W_uyC8XY9dSVZqUNYhRFD zEE+o~&9{;=#8BmI;T$=|V}d&9Wh0RIQF> zo<93q$IEh1i!ZfT3yH-Qdx8fAwRrc8_6X|9PejKwJVR^_g^p4&~I|2ny^F>Gp!F%w{%d|vEoC5jM!b-)zRMG}*6oW{gKUWo71jkIw zP4_&PrM<}LsTHNvXZQxe<>3ibFoZ{3jnP|ra6_$#%Im#sp=Epd-@Fqj5-*LasQzfK zplat{_QZOV`{;#PL%Hj!M zvz^tcG0iI(8I5uLZeaws*W?*rVdDU~#SCiuL_j=cj3@OIe}g^n_}YkFX8WnD zON7;$=6hP;GVU!}W(8$CQBj;VxA%< z^~13K=0^y@!3uVX9Ned%+RpY_Tu{({D>OY^wXnI;OKQR1%HT>}+Gg7|ShL_I*n3dK z+u81yX|l65>3b3jM0(SZzNRz}_SHyoiplV_XA`t3YIY`GlK7}|li}+a<3^z9!dHIP zlrxt744JrRbUH5K989XTpS4QLDLTdhpL1OWQv7?elYp2i?$Ym1s0~M`GGo_6nH8w% z7u9fEwcw@@lo86KS5k5(g9H&Ot>*62q3?tUC*_v?pNgw?%|jke#(Wx0385tQ_{5A5 zdG9&zR=$~gW?kuo9X~*hbHm4Sh@8ew<%p9QPQk;hP`A502(8v`SFJ-2osTwF5XrdP z$BB|J%vi!TNo7um-#i$=$s<)m!Bz{djo`a}rQl!c!ZSAq1cI|*v7Zu>0ke&;A8GV% zV9Q{XW-?_x!OfTeioa&H_*|>&BplULvVsw9ObCe<_mK^$+S0)|=)y4eMYNxbpwkk) zxn`4e;1n^IN-G%vxAKBU;hYJrCO~~Vyp1z7wr4*pj-t$+U(O8>?v^wRLTSadLbb(} zYq)B21x24+5+||U(_RrJOy5TUS;{&=a*JvFA|JreD<2@F+6WGoOOp zoDd{V?gjs@9^jpLX{F9Uh`pnuGpX3`qU`5o5oack&&xH(wPV{CBUQLc-=$cTwEX?u z`*(Leo#|K?!gWMd%UWcg^D z`>)CQ50LVYqQw6-#O343|A`#@TS|+8ot=ZNo5`QmItC67wyuBn_57`X&d|Vt{*N*r zlYdqDd@z9@8D8{;&Q?|?PV`15=2qr5W`AD&$NI19M&=GiRwl-_AGiFu`qQ`g&$Y9a zlewLh`#-jSmhODK!1|9O9y13M11A%QzrK`}iKF9RtG^z%{^x@>CT0ds=C(F}Wy}1< zPX5v3^YP$cWA}gE?_gkTZe(CZ?`UpqZe`%`HxCuZzZXINdGLQmWK4`KoWBv4$!gFF zD*LGIsllt%N-T0V#>$I2=9-dKED@^P#8MZCq6uOws)EO8bl+NNzCnNPuCu+fzw4@_ zM}wvb2on=s?Nwig90N4`s+BTT(y~xCo8`haTUvPUj$Oc4KweId$!_($f7$PN=UwMq zcc+o<>sMfrjb!@n$TsFTKZ!!B9~lGnX3cnwgQv1^e`1QM*~f3y`OT$ zj)k*%asqYbB!v`;RI_F^p(oTB+*P+BX~~q`ZnA?(d`2SjZ5jwTgUSz;uL{T%Jm4gxDz`;=oU3d(qxlrDQS6 zc@$+7R#gdfo3AP&eS--g^xwDYI4?(of!8%2jfTEho@_SKD<$2S z-SQ%lqR(k4ro`KZeDYp2X?Fer6ie8m9Tp{zO{IQcgR8$C2pcrPE-hCGQupEKzjmXA zsi+D@s|CPs1`=7bs;D*ysz<`?^yI9LHy#PC1pU zU`0#Kl^q@)o}9#!T(O=WGf5q2l+^V z@y)M`QfEcot$V=|Ish7u`5=^N0p9G?|A|_|6FPw64dDgvj&VB|vNR7T0AQ%%Hx0gP zg|Q^@sk|W}KA4DBrLj?1%MHa#4}=#`^88Tt`HgpLy<@sVs_W(_CuLp7_$$^_qmA$D zY|j=%O&HJZ1sU|$p1iNPi@y?g*MXwCK0VpPzfIa1S9A=;o!HzRiiG+ZVM-7!Y3eRDVCQLZpiT6zxHzBi zx7nM=xLW%xQfE=m2eaZ!8W(W%!5jTpJqwV2sm?T ztVd*IkIe~{zED(rKN>maE8~M4<@de5uvO|l&x3fUf>eCO1cEBS`qB8a@kGLXa6xk& zM8=V$e%TBbkXiWf{6%qCwS#;ocy()aNr5+SyfAfx(%gV$e(_|X0L-3tcE0r(vyCEZ z<}!)<*2gYGP`hSs?pFwnPX&ssFSxv(N&OLx0(CX)afYP(g9Jm#%G?&HJuH!yjyigX zjUR8!1#%7}q={w_{|evu-RCzr?28AU${o zN`SpTcv|i{K1}*5SB+B>Fz2@0y4~E2S6L#Qc<@sB{?#u3$=F9or+a_bbvS>DUM{#`VpAYK9#|TT?h5lm z=Wm(VN`7Ifm^dRXT#|^!mMt4exDg8lmcYJNZ?jQS^%-h50$g8E)%@Cp2ykO>;*q8G zTAREo?9ZKnj4niea^}j^FpDSQi!tXE*cF$gj8(lB|NOS|k<^#M5LBG^;0eHD0Gu^? zTze7bMC$c~yD{p9DP0(|=tb;#Tk`9KnfQs`J0HxEo7d+?;-BR|x45maYH}6A8*ism zpw{#+a-dH1TH3K?gey;3Bt1rt8#3s_s^`8YjI) zFI-&XvD=ox-wH$1KpYU;#WxecqETvZqXc&h12|sDxftn+U49<)i#l`V7X=l0MuF#A z4VH@*B67WQ7gUMWwK4UkfbA`0Gzkj~mvd0wN5Fd$ykri_M^a>IO(y=pO%Xp+tJl;$B!2JN* zdFVF;ES7Xh^EMbnGRU&`4U!c35cG6Y>wzdTb<3DURC-d$kR6kjsAEVyA{C+S!!jp2 zU2#CL^ixdzi!f9Zs%9aDqjAi|VzWqP6pSp9j>@nWXdp5; zdfi%F;thWB&~zoMIt|HcC_hFX4Ob{`rQ!ERKAZ~=VO>c>lYxzCIKrG2iirO842tmB z?DZT5!li^b0mXMPw^k0{{{)*KAn{)VAOEWoEhMI*EFt>=HdR!92b;8iWCnhCA#3JrVmH_|DZ+x@ewX&U(Ai200gW|A3IqCx8HZ>j*cJj z@wbzIk#H=(lW>Cc!hbsH|7f3-`InboiC&prg@p8912O{E3eLT>XWO|DmS;TiN74lA`|q`Xrrgj6dFFWb0t^A;|wRAn+l| zn>g719pV1*v-lh5_}lN~{}3d_$@)9OjaG+LN1k8GK}d^g4JgQ6!>sXKJ<`38fJUWK z1DdCT7;X=xC4`hF5OC;@3F0+?jU+mYXj0J*_<^3 zAq^f(i#^H+^heel1O_|IIHuf%J5LGh*J{XE1Zdz_;QRr3t?RXiX6Y0!hBe07FBnbp z+*Us;T%G)EOI=y;f}&jE*Rc<)kj7)gwOW*&x@UfQ%Pws)(qd$)PkK*C3dh2NpZ zxWcaQQ^OEL7_Nee+b`(ytTd5zyY7=)62G!lAwP+OHi?3_)Wlxe#lXfuU!ny+(d4ii z44s7QO0Vm&iPw3ZC81s$Q}4@5t6!{jA4ZybF(eY0A|i)n_mcN&8nV@ftBe1Xmmy+9 zmg{9Qgkwy%BjzL8LsEutHRRnCd3|kfI?eMqUns?RDu+R+l{?U_-Km z05_!QBJW4&fv_}0WlX`4iy{_7XbtN?_z~o%55e7?s2?8R`>8uJH{8FM!VrP+!-Kql zEDS+@V)e3s*4^p2uhWQS>l|;}6T8d*{q9@4Df1NBVsWIlj2a|JfOo*a>=RHTSUp@8 z^TmiDG}tbjF4seMoQ80cunlZB_stH&yuo4*ZpfDyb^fieQjGIX zfR6EL%Mg>i5aEXA0UnrzZ)470&-V+8l3@bg1yioi4)%6V}83`OFsiID(=B)Xa>4QgE0L{93jOcqJ6Ylvc_ula8 zrqh-a-1W;6^eiXxOZDrH+I(#GS65wI$9w%J<}-Khs6IO9ZJU{J@Innlzo$W%xeS~1 zNuH-U7zIM~YO>9cv#5MOB~@BGz@#y*Y4Zw};Coa@2BP*1ZZ%Vpc!K{3`$Y`a=2(T7 zT<>a$w4iJ$2Q4RSv|=%^NdSXHhgK`D8EP~yJ6LmWEa6*l0l{tQ@u5FO97!ygffUc73i+?w5H#;m`P#%EWo&`hO#99e&?AuOPL^KzI=Yt2AJNv zSHYI9^fkH+M%g1Rs6g`L41kDR#&hH=G6BK0Nc>z}9Jce44xb}RI7s7D-C62L@Ar)( zo7WC0%sO=N?dtA$u(iJBZ(C?zwcu9GbwC0BI|KZAih#+eG5`kFlLb^^p7-$#ma;>b zGLuM|)#x4VmEAX}N-k=5k+PcUKG$mP6Oetu&~N%kbNH1NVr~$?qp{qA=k!3$`uxre zU||?HX)scfkcMBNMF{qChk!>x)hPtvTlhgZlE#ACT=XDURu0=cm;i``GtF{w1!Q~kzz)zB&02k8PTI_Y)U~Gcm z>KyBy5&eS23g5*$Nke}*dD87-1yZeVJ)J^wKe*uDY1JuAOv8Rv;}CatZ2+mYNE=D` zEIt_;RPeR)(vDF38-koT91W6F<8;=EI8eR0I9!+zFq;wn6|JFHBe;s{!vWrkTg&_p zH$AfawUS@31w$SV@r%;l~LatPBl+^ID7PKRDkl`{{w zZOYWy&m)vL{*V@dmwiTjqkX%$a19g-!dgSm>;k}vy5DLvv{cJGT3{qns#e}2jRS#9G2Ad}q+|l5^N{8dk(69>_Eqrx+Tl^d*{pXy#w)?(K=nkAWfZ8%F~+dwFpddE8O$o0*t7bT&!+q`M~$-Ebw_I@gMh-c=q3IFndK@fGE}!#$@=#r6 zqpQ2T&hkPE4|`u;yhaokA9H(c z4GI=$F%@<)owO>GE*CvPH)bu3NBH}*?bg>J_11lBNe?PwH#dx zNDAef#lz2#2y7@xya#U_kS5@QVHiIx@UaP*6*MYFPSN-~ezW)~%g5b(IFp@|x&O^l;s8;` zcS_0N(?F>>KA#9MX8m|V3Pba4>;?g}OQ2xk>f*C8DBzRqW^ye7m>V!Uf+nIiT6roC z$ZW$AJsi7%kW>s<9u=GDAv!*soL&>y)vl_Hp?AHU+5$P04VKT;l}zr}&}$6<6;>o| zME_Q(v2QW0hJH1&yaE{KcJX_5E4-XjGO&(792HxRVsp#pX=(C?7wj`z0p8F0;CA}# zZllxrAsYTTz^5WN|Jv97PR$#Y{XrWMn))nZ#;pDrcE(A3N_} z_P^aYu20BDHg<7o);y5G(d7O(U99KvGILqg?Qf-fZ7SDREvAA$1BR(P7nCuvu~!Ci zWSJ#sjzJV&^_g~FeRnfNJa%LuvK8etxwkNHZtQQwtmn$ITfh8142PNvg@Tv+bm)e_SC0CtTHKyAs3*6xcySBkJ1v(O60H!k^+u-d zKvNq0YG^Guo$6Fokl=bt|cMk!^$)8>lvGH67fFLj6nk4Bh$5vUF439tx zg8uwq6!A@y3IWh%u`_{vD-~l8>+Zu|qb*C!U?2j_`OU(#sM)qK$=Dv*Q8u^n;;P2S zD6ssu0q0!*wuqLxg71am{ymCustPux?)h}%<%P4x<3G??2)IR&_25`?L5-75zbL)q z^k93F8svzM;RXkaYenH}HufjLwkFAuMV;Vj^Sq3|}b1>VWd zN=)wVM(C=dUC)>FBnzC&8Y7T3pwNIx&c~6a4c^@W2`J^MGdnia_%d4$t&mDX84|8NEYOAUq4GhJ-MZ+;>ik zOU+z(>EzrP=d7zu>dd9~g4>nwlaCPu5}dH&yiGvfnC`VI$AJ& zg^gt=ZGNQRGIdWq%3r;n(`(N3o}4l>E9NckDiEHITa>LgkZ$d!yjdV%-}E1q8fUoM zBaBacG*F)}i&c$^`M<)83oM(->#jI9Zvlx->id?YZF~b#p*-O-lL7q_n*hb zHkMolku?$-`GavqpCL(U!|5wtE|~$ZqJYF2Ut>3YHw^);j^eFs)^1|;lAv^tljy`v zfN^kT$=%PBg$FEGWwpsCQXF9WH}DNU&tPc2ZWfNdhwD}D?DM=bKn65cQ}<46ADG*( z8+Wb!5dh45fyU!*=vQMlV5%>fTG7xgZn#^dqp@bHP~U)qlpR4k@g-hK-==Y?DoIf7 zBT6SN=6rsrfx2U+Yf;pzd=m2CfBd#Rg|0mD32H{ss7-;^Y^sUI4uVC=F7MNAu})1CPsGR=eW_DVD_NLSYM8u$ zV&JYR*;l*LL!N$C?x3t)YGpRZG76_9iPrUj(X zFIEYwiBZccxbH}N_Wg@(C#r%dreTM6t5M|sEU)`n3#^RP@Lp^(m0}Xfr;}nnE1m1z zM~y86@Y7VFThZ4sW^f{ZCMC@D{$kH?B$7_}hny5kr?I7(XG@BDAi0vFeN}XZ zPxSM@)bK{N>EV%|&+W{%;#jlE%OI#?s#j8p=_9X}kG_%tCz)L}v@i!}{JQ21w$|G3 zky|qu51eT3POabjG>*bgLp?Q7I0|nz43tHA0h=L--nhXnSd8#$p#+t9JxP3ENl!hf zFaku1NGcY2F{grtCpr${o2cYDiKP>-t{GQEN8uyw`o%uez_ac+kq*OP#WJ5e1|EOr zH1sC5(`)ZtnPi8vO=_srGs3pp|2R)%!1oUp`T68?LAB~m`Lxpu6UuMj%ivQ zC;<$U`$$Pwrjntr6IJU!r@VWz+Nhzmh!?Z6ero3ym5XW`I7P9ztwoNdiHg0yE?#T3 zR&%hYjei%p*Fup)5?3Dh9t=iWwrB{8^>%7=@F|zo%^jo8Zq&6X*nKfKXjpzmEF_P2 z5Dzt1uw6uoFMryJj55!qOPgAv+ zwyXwZ*V`kT!4CK${`|)^d=HFf&Zi`T7$_8|G7C!gJljD-=SiwChLbG;7%oozvw7!Ym8)8VIFM9nm~=c^@t*NF zJI1Z#+~B67uScQkEG{uDoTRW4Wl1Yd86HjG-(3XtX0c)I2yKE|e_-X6i*K>m!8v`p zkh%?Llnhn5ezsAO1S=X2)KDQr2s|jhI>~x{l+l@~bxepSTb2$lIMeX=Xf{d zfV1<#gR}E?GOuJ&X}7&>JkDjsxx7{$^li8zXPKQZ+<9+~drO zJ$r64dBK|gfvyGGgn>8^P(T893@r9XCBP8pjX|a2pm4U3dX*IO@*x5<8X*xgk(7~9 z2*wFF+x22Dv|luyRf$UQdW1`pH;yNI=0+L&JbK z5m;-3rfJDeR4XSPGJ;b1TP=V9wa8Gp0|~-Vq|#L{QYWub0gh+ED;qxZJD}{CPSViB zA%p{#c#Q-;L)RCq3g$V+?KBz=_O1#YZ*WZ6Y>!bm5sFhiYz10^WE>d-3=5nQxT3siF~aYpgCLJia3 z^^(8JGi*O(jz2<;-2X0Bu>8AJ@yEgc-HgM)$nl#Qr$NnK0mT*V%v8Sxl_Y!#O5+rB z8!_6yG*c&lQ6U1I3QUlN$^o{3U;w7ak9lf04wB&-LymJ`69Yq3U{|4w1SbMO)yq^N zT9>SvSZQxmeOv0Fmx$kL6Iy1 zv&ml1FeaHs2ZY4g;_CDrx=FHg?D3%9-jyu>iBtO$#)Ds465z4BR0TxUpo`qWEJytn zn?b&Pa(-UCokg-N{EGfG9s%lNEorO^mZ!1h9Ig~;ayM|)KoZ&jgOX*i?Tm5|7R(BY1M4ztOHe= zreIZ}sd7cBf(0U~M6jY|sjLb@LzJdGsKVJS3L;jYf>vpT6Own&(E1SFWzvh_Rgq)v zH6nWO$o@3vH19NZ6uD!R>NoTS?0fT?^GAT6{4Eh9RZM86!fY7Vj?5A(3-@>}45Df{VVi1>=(9q|PJ#vT4a}RS!qh6= zK904`#-H}x^`mciE~&>shN|06^R~d@ze39)kcg$>_D#{EM&NaJ#-7F0+aE2xdAwXYL3_IU)DI^Sw7#WLP5+FA*+F93W=L<_ zLQA^+U0W&5@p*lbjF>ixiQcse;>Xkqtx$vTgzz`Z>j*BBruavXi*5dxBv6}e$#LH& zrAjSC$zAo@&FQdY8|?mr5u~4iuAJFWTPi=Y%BT0b3sTjx?=oxcayV=!Y|&P_%(UXl zD40;OV91oka%fEK2hS+<=by5BnjfwP(;c&gTcTlOM)5WKM!PG}o;DcR;H85;t@Ldg zpKB3?*5Cg>%HAMREL=>1XfmLZKnNM8DK5&Pwj-twnx&|4` z7J)g`C3qOW+)DjOo6@F|Mv;?*Zti`mA^h)RzS0fA?pczaOgW#+Uvg-Y+IHjD`nun# z1uy6Dd|K7}wa`=Gto{l;C`m%ga>}+B(bdRroD?a8WLDAHvWB+3_+1C5ZsMu(9$8Pw z74f%{$Ak=KH6`}_fK0D(HFaoeAAm{Rs57?l{jjiZsDty2>Z%aOpef8-sFd4_caP(B zud2>_ELwEQ!EsJ*tA)Ym2{;hB$kWSyZdS0XS`a2pvdLEk3lz=Y3Kozdb*g+e*b-L3!x8eAr0=uJOGg+I?$`z$ zflQYZTGLNYTj@Q9q|@;CBd^go?Yy`SruJWD&^d_6%h6u9vjq$QQ>OQ1`6J%9RzEdx z==CF$X~W+xpCe_&C8S;oIP=luOpsY|c;{fB#M% z$+Ybd=#atKQu)gZ0q|aH|YH=>nx=O=1rK~o4n>lq%Edp)S!PP(U75kg4_A&NwjE>OJLUb zS9=qx+Bm;-?adRdf=1udBZY$bUE3$YOka(jdtO=^QJ64x4N|W~U1kE=UU2-neD+Lm zS9~V7^aw`f5m~w8ow!FF+j5!3aI|cRylzm^_MQ@W`3hhFS{bq*sYe8cvTf>k6xCRK z>#Cdl8yMu0)snKLHWABwR;fKB*@FIH?39PoiVMQ>Dn%4WEkDG~P1C?wA~qOtqk9on(T5mgKA84wfenprdTYYQd|w+n?0cD_@ne3c)GtT*vm?MH zOno9Zjc77HtDO(CKC+Y8yu@YesNYHH`H_~(CeBzJx-qC1K18icrRUS!b6`F+R-B?<7zjB!{<%J5STvkW9z=qickuYNaAYtg4 zzEPO(oijRG+HWtz|8+;QeOnX$1HGpE%b=iVEBbGBVSjz-?<~xJT{@%sYu8M{(a1^} zm+r4_&3_)InEqytWc(Mzi!hDI-*^|ff8$-0{=vKG)BJag4od z{QDBy_u=e6k&=HN(*9cJ`v*_*x9z_F4Nt=SkJ3&xa90JRR&G2-OyE*~K>SHIU*G0z z%F$eVuyS8tRp)%mjV4F2IV!7EVzb9PBD2T*lO#u*)@gYNsyBT#L69L35JX4BffSDL zsJkKu_u#jpiZB?L%E|HgqN%yUqxAQ$@AKJP#}y6?ojq{Rj;*jz`C7aC=K6G1oxcKW zPp~ks&j3;#oe#xjG)zE^CMpO0H5?Uo^yGT8~AR?8T}qYKN>LKxQCk?pYVEX@A$I{z94ukjWJOr3W=3!N=7?5 ziIKwPA?Hrgdp)X{`*|~)3^#|x&Yl4Z7ayEM$cZ50FR^w}PO)>`MFfhFq7bxxP<!hz zl>eN68th~yz18Su@F359k&c`9LywhoFB<;)W5~G>Fz_oI;N;6TnzgO|HAZLN#%Vif ze!R+#KY7y+$2ON!JrpcRxby4cW!K z*9GR2DW7(l^=N@Nc|KSb63nEig>b0yHk5V?Oer~;5WL}?Xrkd@rJCfjXl9XgBj205 zs_Ri}yxJLDQ;U85MHuJ-c+N zqvB*9**j(2xLVX+%8l}b;YD@IhE%~;`*U7sBpyHw*sy_RY(BqouECC;*?Pc>D5mV> z@WQq=-j%ZkuGl~a!wPFxGoNUH+@|X}Y&Ni+BPgS&rDu|Pv0IAhPOg)!j^)A?Ku+~( z5l=`HMemP6aqm!V)H3QewIx)tmZOFFab9MOedgn^V&nA1y$B1~(Bp7e79mx0wK!b9hO{&|4$;#uVP(8KH!pr(Ae`I`Qy91C;8U)`3h#wdwa~TC|YgWLP zaS?R8H%X2rYU3NN<%#ri)fK=jvVR5oEsO7l9b6MYrohIxv{UwM zbaEwcBa2wbs^;QqLA=D;@D-tW7OTw~%!K?|K;`5aLyCe?PiU@;ZLqdndCknL#BJ!W zPr_8yGt6E0nkee!P68tITR!tKmwb=?f|qO%BvZ7s4V9(k5RBfIk7-(I0V$WR321dW z->-#N2^pWI1GK8DH`I;bXH$0f-})7nOg!9l*ON2u{Z?#ZF6kWW?XbfHksga8N0V^E zvuJ5L8(1JN+^9s(4sdp{7@R9S(Kd`}=eqb<=yl>%hNxUj8bl_DP@=#PBneo|C5i4{ zbhPuJjm@OE<{>>+N3~DYGSzj+kCm=ISA1Ks)T>Afu}d&m+hup4d;%%Z?ThN}UQ{}XkE0H0e(NRdbDoU8!Ya;lPDk$1mtY+8w23LwB@94> z*(Q#l&@UNKFyi(;zH3Hku&pEn zJKavKFgv}GtM3?0%*m^CaUC(U`xP-^IDo!h}}KSc1=&E)w+a>An_WhBJ$ zjlDUy4e$tTGU6(k%$nFgKQ`W}NCU3yt&>LlsxhEnoVB;R4^#15&u-Ua3Dy;b1q6V4$Ej?c{bA!9c`miy+&M-D&%eRb6O31)t5O3@%=nF>w{seXocl6w@`(c zebs7Exg5XULdCf*e$k{l77`~XkGT`|4l{<~vL3SM7-yAh_%d#rVXIEVXqF-_j-eo- zovh3YEXKv&)knljfFPr5{^!dSMK0QgdJyFxBzR9(!3I=?BZV^<70+PsgkevX8E-*X z#Ax~ppe6ddl1e}vKk)tXHIR{(NF9PjA2iIN7gTxM#%KJ{ME8C3aaGV1M z*ZdQ8HRk>Jmc-H9*4EQUpcczw#AkrnO=~?Y>yxK!7Z*sfZ8pD{3Q0f(v?)U7MEB#ycGaAS6 zI9vk)dou|*luJ16y5LvtmFk_ASLna*6EL)sYI zo!-43Z>o!{@3|rfkJBSJYecclEPDcvrJX6V&(j4I+LD_hc7d9vJeS6>yFNdVO@EuK z)$-E-Q>mTD%&UNoK4R(YiEE|QbE$}vN%yN1e1;F^tt=X{1V(^e#=Qk-eCjrDZR7at zwjS^1gZuEY$Xwqck2G1_(klSlaqMOP48wyKtTb<114GI$$|osOL##Vp$tO0u4uzrPB9Ne0y zlmpjMYefUrfJ)X1PMa~^!fU;jvURF!zfNiT4O-K1F7u@ zN+ZPB+3s3Sz5CS;gmOB)ca zx0+utLy5wpL9M9EkRuvg*+CTyllfaqjXZ`S;Ed%lu-lo`*M03;Qlncac{=z#+RcVF zOfZn0%sPy3;+R)PpE6OOtEyJEDCQ?DETk$h^*Lb}nwMV^xvL!cAb}p))erkM4FPgI z-aI#-hoXw{MTvVhMgnL^uIzDDb+cUaX$Xf7&}f04ZW!$xc!)47*$uE#c+mM){8TU7 z><1Fu%Ts0nlnuz>doEt~^*?V!xCM#rDBYLfJI@};2R;|%?zg*gB5l*rxi-a7QxE5Y0Rm_g0ds_1{8{?6DB0jGu&uGq% z-9-_8WPky@JEWzzZseNArSoh4#H;AR@_q(YGm0zn8}{1|Oq#cLp`g z1_~f&aOvcW%|yfMQp*I`N08VQ^zT%!-$vj4Wbm+sISFbH+0Jr{HR((VD)hOrwh{TZ z7d(=*bb}I?tsu?bB!kr@;QHd1)-bS+31L%ivjoB0|0JHeVV^#qr62bk!@V0A<>^<*WPhqxF)CZztDGNCmRM{)7XppI$5@5I_O3$F80T=8)N=K=HF_Mk+6n-lJi10 z@7U9DbL=-4EIr`KXvPnxB?5bQWhxMKY_|@YIKC`kMa^+JbKZzqk>=$qa#4}NSYYlR@9xWh5Nz&^)ai#BRXr;%3(pK` zO+H(FA)<{QvkPR6S@l3l>U6HW>{?Ch8ezyB#dXWP-gE=CWa$u(Y2H^rJ(Wc zWc_9y6@Y+P4R2gZY$w>T4@+&9sfBfA0eKVVwBkp(A{}s4%uWz*%*A$g$S2+Ub}a7h zTIvOH+l;ljF9dE^No+;mph`<7GikT)kiMNM6R|@3U(DU7(f0GQbRVD^faBe)d)6IL%y5Unj?( z$JW)D9C|?p_jar$Jj})U3)Do2GeVqX`6>4?W{XMuXfO!N=rI8>uGO0kQ;8YEc|3cd zi9I#%&ThB_BI)r8mI@jRidIQ#At0m!%+n4bmEaaKJf6 zT2SaGvyVJxzUE=Gm^9lD(PrlaP$t)(o9^pZ7LRG=hNd%NE&@51aRHc)@9EDc7F@{% zG2vY>@0*lcNPSFJ*dhvWUe(`A4UvRnhGiAB3@jMcO~YX$w*A5>(6ycC6J9)_{q{^A zAFu<-tH~lHBh=HNO8F4>ZOYHfX-wBTnAnM_16P~X$)%_u2E9i5GS@-b9;;N{0e zmsw{sEEhP*aN7>l?(aEB1BWJX0~f#+t=6tJy>ch4{I;1p<*qtN24X^BH1l7`{?}{$ zRtTFSJY8uHXXiBiQy)OAM5cE+qSa0|yE~JoLF}+fGuqC2sMzYzrVk0~n$7(1@!N;43{It^I;IRhy^= zyG?5#wu!W$(DH6!Jdvp<-U}pKjEb06j1+P9HOy znv$?=Se<@`%VH&r@fZ2uy#`6Fe!&J8h;;8iGGTE|yMPaCyEcgCPtqoA@1MN{1C3MP z-%oS-`!t{EJjpMyC|+sScui$GiaVKUELey9E}l=&`pTJGyn5d+UWz%c&;i|E0bS`|Dq22o;G!pH$&tq zC}*8xT|FcRtFzTN`Spvek2u@H^XY6ey5o%^8jI#^(5@5glu+$-S2G4`@Z}UDdX68> zZRR{&Zzo`@FMD_{T_z?mTw5Uaot!gy!a9E8bcos9ma}f{+LhV2ayffOoF8o&CUHK7 zekBW&c9e?^RESy$y1Uq7>X1gT`63x~i2DQj~ zb_OD;KS>IiTg%9%;Ie%rBHsBQaFI7zZO#Z5lh0$Mr7xBM71leCG~mQHJ}zXw!rR|X ze~#jJwGeYe)`3|$aar0eCL->NuM%|CKfWK;n~F*b8VaT~qZA29#bg~=<<0b7SWG(Y ziyZ?kVEV&H%(d`~Z|~#IjF*mkCQNT+b=)y_KZp0gJlr{iKJ)Jl-K@#2K3}2K--#Ie zdVcId?h7yX{H{MJe$hN=>5r!$HJObQ>1v2@^D+2NZu3U*3FQ-r%qXHopT{9yX;=G zT?>>=rU+h650)A|`oA`g4o>EUO2tYXTBW1$(HIUL);7jXWB`N8ekV0PVnI#xGS!(`s; z26pj|LS~27!Tg+%Zfc-0GtAMErcU*w z&#@Iu>aX#G+#&z8XLPpCWV}S@>Xry$4YCLB)R(|-udxQQlaR5Sa7*KlQ9zYp=5Vhh zy8Oz_vC3FU5Uj(RT>Y%Pf(dDm>1Aui9M}yP%*gYOdDre8z&TkqMs=)XCq+5$-K73z zRk(fs%`%%gr_)q}8op3@t7T0GL>&u40kAEIpxBaNv@z?O9HW5#LwmV|WSx7RwWZ65 z_%Q)0f(PS<3iyri!5q4ZT6ev4RyG0EynChOHgPIN*UGN1CGWi;gyEY)`PXEL6pb{E%>Us^ z{*R#A$kI{oyFAOt*1^ou#+t_XKg2OKW;EtB7Bv64m}~nV?rK{z8oPgAv9;85F#Tpw z98HbBZ}C44JDC6Lu;Z@_|7#+Jk%58!Z$wIgiie|uQzJK?EDV%P25ZGGn-Fk#o_0!$ zif|8K#b}+ZdiO1JkN7&;U9v1`3OdT9bI4 zWI}8`LS#uX&QZ#u@~y!^r8!+>1Y@ZS?d!XFFxf57{HYr9`OTxFu;dMb#aCpaE+4iw=nmNoY&_sLI}Qd44| z0tuOY$Tel=%S0|$Q|0Awis36tCu)gA=j5Hf8oiqo(%5*^`jCR_9f_V$eaPZ318TLA zKOTwo%o0V%D-IVDmXO8BAKR~YN4F|P)9$(rP#b~Pes_d%1zhxhf~-Y!L~(^5=$6%J zT0%A=X#`vKEgIP9VpMaUBUy4Z{u=8))W541p@UDGpr!NGGghr0I&RgSt6_)`9z;=? zq*GGJN_#CbYb(r<9FfQ=Ji9@2{fJm$keg$3Z00wy*qyl2@J=!)m`VIUm0CU^BmiM)A@ z_z7V6kfm88LWT=y+Z%ujNKU&r*}UlRZs08Da^Tk~|3C|nS5GB%?hW)y)UFjjby^ne z_b{EDV;ai)=QF2uG>-ZWwx1N);ljnTck_KkRo5q`)EWMvCkv4cNMSR^W0QdtN(#$l z4b+1=-Lb71@4~)?U10j}m0gb05cW2$jY(^fylV;g|Yl6#?o8yAjrxrg2As%G%QNaB=nOwMuHd>Az493Qj=CN0{1uL>CCt3ozVW3%O`wf zpCBy~28fi`h8}f)J^&#~(Ws{U9R#S-f>BHfCZMco3*v2S>(pBbMaLTkjFmzT1ZR12Sn? z${ri-3xSNStgI}|&Tk<&fCA!J9vPb46`#m6k9b*;R3TnBMB=bf>ejpxa}-dq+4<9| z|1!pOLjifBn;}*l3hQwi3vHy>cyxg4hOL9`l%^}u;TAKZ=5D$j%lcD~qJ;DGI?g3^ zBqs9534rUtNdatIgyUshXuhi#`?Zp6E3>bZW6%e|D7`tOdc!bE0^UOPcncXnLS6i# z09cV~fw#lAkeV-=00ursJfE0YJJU5W@n+R0d%h2_e&35R!1IVkC-WWPn#VIqf@%U$ zcFI`RVI%`1Yf2kN40m(?6ALatB_*_7ka*14))aAIz!Oc*t2Dm_)7G4rDS0#-nT9Lb z>0;XN(KTJs&UKyuG_h5_Vv1=eQoNYSZ}zKiMTvhy8lApqK+i57F%-F)`D65TR`U67@EObqQe1 z^PgTsO~5||e1CZBpBL8_cQf-(;3o5Ugch9>KoV7tQr)mK?In=U5*)5FzT&22cXhvB z|3uDx;s>5!=7`739O*{1I)0bpslfbldlPZ$(?1h{w4|!^qEf-kVD?#>d8{5oJ7X0T zSteu=2&_~G=5L>*$l;)czoNOC)KIC;ljkoE9&>m3z)^qpz-wmaZ#o!;PO!Tm#gbYj zRc9ZSQp&iXEWji^X2ZIU%}J~2YKxSp-rBr9aP~k)Whd_@52#_A}$qHm-F3TaRqWU73%L;uUei zJs^0u!s5hC*~xy0Tdi4Mr&D=i4~hZWM)ahPf;+iZ_|)4>;$NN4;d986#2H1c6zj)1 zX%VnPFp+dK-Or55#W`w}a6dufe9O6Ju}+AUrN;GN^c^4AweUQA8v(^EZW!N+%7r2e zg{ue`dN&ZYRf-XrZ?i$S7KYe_$6oZGw)Qn!{hH{mGSfMJ#NLhgX_0ka5fVegy}m+? zwH4{O{(QxQH@k!${5b0Im&w$dWkC%I(i}O>Z4(Rh64Cm|=eP`Q+gl`_^45sw+Fg-J zrZ`D=iqB>AbwEdnM^Z{BZnk3GCjOD726D zuc{!CU@))M1^b-mP%5Gx2=414w4F$fk3W22)XShW+@tF6>XxL;r&w8qLky+pM{4kE z6*VytA>ljta$=LHH8+u_HqF7#zqBTiQpamon;|dWT}nWLRmN$v_t=k?+f~+wfOZBb zH_H?HSVK8lha9tFZfXrVejzxL0m3$&LD@LaWe-d1dy*JxK1LJhYVMP?g=alWs8&-a zf>&l)ZO{gpQ9eWAN7Js4jgx1%?f)Q|a@0P139$wBfmmG5f)Ubx!ph?%Ac7=qr^A7; zgJ_d;0j|Il!pV|U=jDtse5jf7)Kg^d=MARL>X;A=*eg>NgGTDgWrhH65Yx-mh(8Q3 zG(e7wqn(!zC#gKaFeO?n3>9E+>KeIlfOCGL9kmyHgYqd3XvhZa;4@3Wh)<&RsD3td zF}dUY6N3Gi`5DYz>?M>gLXnj}g8{pW-)KCGoUb+xWMdP;b#!5NauHdNgTZEh%*xsg zg&aR+3YxsA|08~&c`lnA@P#mNn$aa&qus{EsMB4DxW_0NvF^+)Gu8ek{7T}j(c^py zMUGi(o$DBR4Eqsk{fxFnQL79ODpgC7+G>I#LOy1ec*1lsv`Oil3eXco6ZUZx7E{PU z%%+JT=KiSN59{lE$_D57q-)JuDNH;vqViGFjl25BgvMbL5<8G0Kyc{QrGDcY8?$qo zZt>|&`<@oFPX;p8P)Uh#5T-&y$`wft?;M!gr-W9fIkGQ@>W-T4$uzlc2w8M;ne(c{ zGR~ZdfG(H_Yun|rkjWgBDcap%{r3K(p$j&nS__LnOX#EBfQQMw)@k;f%NG&~E2nzk zfJ@Rnm=gQxb6ZHmVy?I@TwC2TUXrM^s*)M*j1)(L1jL}DTz4$9RlK{2C7s(g7iA(6 z6VGE38WxIJ>D;Yiv6$&3j<0fhhVRuTH#eWP-#TZk>Cdr(W9q?i$a?D!XVc)uL2)fB zq!8j*$friA%yAf77Kg^r1HpxY3T*D}aC=hag?zDk^>yUht27C@)ExCUrL?Ef#RT~i zLoMW@Vqa`Qy7}k4M_UZ3wTy+z*D!KDx6jbkzT{mMOyyn`bQ(0E_cOWvFycBDvyK9)|UTgsoONj|C>(lB_$9qb)i zocFU5ZXj#o;PG42Dl6Ix%GOo>M%4x#lI0jwr<-0n0&I~hJcT(EQa(jFUNW2U2&q4! zqVNXVB=bMFNO|*iPt8M)N?`Zb9-O+xJj@Bt*i%Cfa|@1drkXnH@O@x?Y(V7RG?EA; z8M2<9*ZRbQQLf5WeWrA77x$BA>IM#+v~2={qqSy?eD9j}815t5^;2b>N_=j%U(w(oRKNoa?r3mP5h>>KE=hQH!YRbjA88yqNWsmTniHFxm{3mJa-p0Qk)~$mYFaS+Z=R-R-(a{?<)tS!#V4rUm9=Dob9;y;%zc{5EV@O2 zqkIQ^@K2DUA?e&)J=JIojw`CzyWE3A{X-il&AkWW=LL8t27TPV`?-@0a=rojEwSKBG9s9Dd9%&$sC znz-78NO@LgZrDws@(B9;=mi)Rj_!|d=%AJ)UvJQMq#8$U{ryT!hrodVx=2KZkD@^M z0JR_^mK7y8J~hLCkBBa)?~k5`Z3IFS#Esd$>gKsUPP;vXb>`q)d?$#OUz%PpT;&#( zF`_oHDfg4LirCp>*sgJJ%n(v%Vz4widt!$dm5R0Z_&h{7YTU&~cs#w8lhHzWp3VX}=mT~^?Y-(>gi-&` zt?p9dLJAV!VHCgWe=SU7qQj-5WB6`$|63IGKTDBmzr&}$MN!|2OaD5GV*I|vKcgs? z?-1)hqo}`tBfBSpI9a_1A^}b+*OC!ou>mY%4<*Ocl|jDbq>M zM6f?eF4PXWeA$9Bba1&kmz1152}FoD^`5xnGE*yNQ;!UPn>@FglvtFphIr954823x z06vuX^$hLyhU5uDHa_kBtK;b-BhsBqOQq&^Q=fNE*Bbd6 zz|%tb4=zk(unIN!bF|$9%+rfqR)h8N8w6tMRL%k8)8eM0$dpOiy+3&4!p1~(zGzcW zM(L;?#&`^VXoKbYmMNj*w#H0#Au0V4x|n|k#tn@L>w?sJCG{--G>pp|lQV>=4Yf~1 z7-Oa!jJpp;r3_i>D%0MjphXZF^t6xM>$@{}{ppnCIfO3c=wmRJ^f3l7n1nJko{OO; zb~FvQ%q%ZV6KaBJY0)J5nl@}7L7OWm96};MWD6TAC$QLechFu>xjZq3F$QxlKebz5 zAJII2(UyrE5DXU&*YTjbEVz6yxa#L7c(XjcbJE%J=6VI`)O!SN&p86Sxw_eT|M)a` zO@?+g;ob3V^m7LCslKnbbazNt?%RE`M&hB`VS-Pdnl4wspd8EXe{ zREBk;Z|K4Ayh z4B_pX@hfi(EPu_D94>am+z=nFDm-lJOE|>OS=0BpzInV<+U*}oVfGs;8E+r04qblb zh!4JsS&Wg$qpUaiNdu!%C?5K=2I1YcKWFQn_I0H^n*7wk1;fZU7+86$Ok{;{8j;sB zF+#yGpzPpK#^pT8c#^IkasbCpI)e;o-f27~yqmqSzusGe&J{-GM<+Qci53qn2Z z#|BlaU{#=|MiIGFWBc}jR}v!ggWRU!2esR*7K?t>l!G61bIHc6!Z1?@VKes76GDoE z)CA}LWJzVG*sTb_6xG=#7XO)n**87jAy!n7GA88Eq8ixA36pyLM-qRo2!`lm#5Z`) z7GApR3H1#^P(=AApGWs;ZQ@!_ETi^(ct)SV6UwPA%u`~c`&W818n42T#IywCbc&so z1PSFV+4FTMVp6i`S}$m#Wkq8_H7dP6L=C zUXxcmzCnISdmNopp^N6X-L*ev#}ap`kVorRJIn@J<*n#!4}^uX-I=N6b^d_()r*d; zkf$bxC7c>ofciH_nZbiaM(X889;=2)JRIvMWC&Qut&!S9TV;(V3z)}Te|iS*g;N~L z0}RFA7_zSLY1$&91)A3jAyZA4lghPmFeB?Tjb-l>4|{us95Ek&CyjeaL1U%(RCsFC`0+TlH(b-&W@R>#0F7L~oF$hi z8ck@6Lr|?iKu|dr4?eX{BR$DdSBmg-a$=ENz*}2dE3>n(?^ooeq_A4Co=B8uO83*T z9vRQqN1{WgiyuCZnu!`dB`> z%f~s+nJnBiYo2#JP(Lth1~E}w(158JZ3u|fMPM)psOTC(U$Bf>T&vxN6*?v96gunp zjCRi&*+s9<;jBgo7*RbJI#2BX%mQ*PRmfZMupQWoF=&t&5ys_=xopGQU}>?@Zg+@d zv?Au*@s<&$_m>W1*5~OlN1Baaw%DG>_@p2r-@ow;$)i?FKa*bn{Mg)tj z6r0gb*aXW4c+!g7thAI=xSUJH*FCCpQ9jcLIO=7qQYY)Rkg<}BxBs}dkIC(I` z<~9c1clT@d=g|@`d)`IazRFp)w__Ak+)gtqqo=)L_4r!i@Jxhqnzr7@n;kDiuVK|6 zljOF9*`ZiTIgH}J2`rn+n}YlSg#?zf^EF26DvNgsL6XAF5Im* z7p3N3nmr}@Xp%XFCKQBbN@z0=vOiK*{nI&NJo4`pc5Z77Y+p9HsyEuvEQ`oxevy3M zQOHGIUY41v!8&p%`Rs5alD3IQmJ6H(wK4}Zi;y=r#jtGassGqr_<_B}y%f<0IMM8* z;;9B5vq5=IR7h0U33O=&{m7mS0@9YpNOyy7lslH{s$<^E*>eCd5?AVWdq~zzWQ%@j z;x+TEwlN}eR@p;h%T?{Byw^J~Rvm{$H=MlSwW)zaNCG9kemn zrjW$|3S?oS04(av#hN_9^<-WZoPXi|4xV3u^!NCx$sN{H+ca-a2m~u|g)I(uHX31) zs#ly>LW`3&O6K8!4HiLpjxBa+H<>IOP1b$BYc2r$=BVsQU1{usPH%{WeN7Q-FpXct zMyPqn8WmwtKOtekGxDWq5&5B%FwhAPum{)zF%$TiQv ze)&jd%w}Cta7Fke=)m9pP*{jb5FQdytvriEnucqdYHZ>JC$-0fjsP7xm6Q8%7r@3M=F`jsy8-c{nR8gp?q0VQ-n z5*_QYC*@sE+9r4iM=2K3lmnzXH;&e#LDNAPgNuYzq8dLvPK0nCeUhKUbx`V=Nnu^R zF=HS!sSPD?6PcV}=@&yB#ErV91s^OE^3nvS`yvcc*;y$VnWdST$<`+|@{<}mv0N|Q z=St4_%jyW)`qzdmh%_mSyw#Wqg#BBWZy8|XO|_!{FYG(@OfH;JXkb;A)T4v?f>uHO zC~+l&$?V3zw zed#{=4wENVVd7#l>D#Hag|HNqgVw`tXJH_5GnQH3*PfdH5~FJg9hizd*SVD7HT=RC zbw#v^%k$})a$eEAlzI3)HGotlb?NRrnS@lgB~!^swoQ<<{F#GTb3Po-O+#MUN0pcD zCF1AsMcYm+|DxI~W`2JGj^<5-_1(j!`Nbyxi(kKFY>Hp)Pzw`uy&}qH1T}HD@RH0* zcCr`6R$;e{Znud=?bYG%o^rM#Jau%0Vu(IrGU&~ece=mWRv{YL#61$21^kE@%c@^+ zVDTiAm!Kn)H-j;w9&03(@I+{nG*7D>Bug$P$xZuIe`EfX$E8NeNDLf(ns7i|%aVEL z#&>=Iv=n6)kGs0GE}Uy>*FUOLEvGf#zMAs4q?YoD#MPXUSh{*Kz}O8ny6gFygtfEu zqER(tt@kP1>gJoDK+%}71BLuRM2a%e%@Sia9$E$RroMs5>uKjYBmELv#_FDaO zF=CkUkRpvm+ZsGLvf^ck4HHLQ$bEsl`D+p0pZ%r;3h@dCw=L99n@*397y2^Xd8ABx z2q)*@kgRZKOA>elAC*m`gJx1e8=cP?Qd&IfhBxL%V)cVtUFk z_Y1X9@^cJfEh>T3jSY@UEiP~JpI0-@t7wsBRp6~_F>Q*K(*+Pk=!RgVo?3)-vOD0P zJM9krtA2loq+B*}l$8`Js%XSWVWxgTsUgiX+a{xHnvgfu7}BTICJvL}qu9TU!J?;$ zCvxyU)J^A3oA9Gq4G|=cHOT%vz>Lk<9g>2*TR+xkeZ-<~;JNtqnP7v)&AS~dFqYn4 zK5mn*$RR81Cfi=ztpZ^g%1y>6#bbUjFUPz*SAV1Qy_;io6jDYhO;~1D#!k;pkEaK! zTDr`@jx{e2yZG}hKOzY9YGm4@BPGU zWU-RR?MNWxn|B{+q71W@6hI%>l&8L$$c7xsSQ&w&I+=ndr>j>a+ zYU94nmls7jD1>OQ3rz=@aV>SacSt zb$-_a=&a2MvMN@!z{x>9*&+gRPt;zl5uzk9Is>uv)@C2+TZ8g@#uVvd!B*^cr=PJA z)5Iv}&tuAN8$5ZS(|uN=l!cm9O85>*A4YP{g}ol6c3sD#Yz|8xz2R+`pyk;tpBPkE zL@G2HRLIW^9)oqBmiuc(@NL9#w39$q8At4pJC5`@0`{wmH|Yo&#JN(}ITm_C4t{7G=uXThwrK&^e9U!@nLwff51IJXpxu4Q*Je zwn$3ZyyC#-`yh=*J8GfS!6(e`NRepJ51TR+c z@VKA5ChFonc7wngwJehl$=CsY#nemd>Rgomn2<)lW@%;m{@;HC-NFh0dkg7DNrKR^ zP7fInc=?`eA_$;1x`owVI&T+<^~Pi z0Q)AW^~e3s%baumm(xFtMvYCAFwXXnUY3Pj@GhliF1CL#1*)7zUmr8Hsi{G$`Z8)i zYcE6>zD{MyIY_8u!|g6Cp1E3LK-nu<={d+5+1Tmjj%mNF%;gyg16JuNd6=sRsfutv z4(et=Z)*4!1>dGcPbOr!wfArUiQ`b=Aqn;FQUAZzt^~TNDh;#f009IQi=a5KP)re% z-20aM-ivK&+fYOr3SCYqndCy76F<0TZ{h5Phi5l8Cns+x?R>=P^6ah$ z)Hox_1**mGKL4N;(}fq@_|~~mq_Ak2(sk9>!_Tg-<(Cz{QSBkLr_RTbDk& zujt^3g|(B&)WwsdmA=K7#=f+md8kbZy(Zau9co(f^T|&p$t}a`Q<_s!NbQ@I3!Uqg zV^W73Ui$09y_z@6{l9fQV3!-_9z6We#%w96+U)CCvE@3`i1Z`NMb|BRvwD7Zq~Nc1^ou+JnVY8t$~teQi|k^y}_BvE|dHg*c7q!>oH+>T6w3<(~U;M^UF!mk&+;Fk5ZT8qjO~p`^aE zleeFr|8jDY^7P(v-M%?!@S@%~4=T}A%HeAk_Wty%@|x;u&fNDW$Jh5Z7B5Mv+ce{Y zj(rgR=A%T81C`#;0$rn-N$=vE#7U}*vV2ov*((@`r7<24|aZQcYi76 zJ>7GI$otCZ3*nsy3g;~uxx2nY-=1$Ay?>9j#*^z=JLK|Gor&Q0{ z<$ckblJ>SeL;bj^C8j)A48tT8;1QGa&)g8ZYW7u|le`vzs*EARgLm!89H?zM{t zWL>B`uzG~WR^0LZFW!Ceovfh^{U2U@u4~DkK3&@_b&&fP=aI`}LayZ<{aHy*Y#NvM z{InjYYa6CVpU@?J*Esi`s*RO51?KPEdPe`{vY{7#h~>;4Zfmk++;!r3j~9xLXYMmT z@UNMDwwHvSsX5oVWnxj?O6vvNjn{8@<)_Wf7mJTCT{**k=k*6NtHuO+|M^VGfh8|( z9eJovw+3I!&8vRMD>(W0)vEiwQJwbwbI+}lhV0yN|7GaTZdj1o)z`di;Kozmb?Ym4 zBcYk&xz&7zX;Aj|q029=>=vA0S@eA4<`V14wV!-2xL?WoHHDeP{d$ft@5kOB=B`+< zD4J2{^w+)_`r(Cf;qKMv1E-UY^}lp^nn^&%;)uo&9QWS ze2N*aHL^+1#fL;H()D9)qq#^R;H~gPINqolu>lKrbFPrx=ZpqI6&yAaJ+KTpT;_ah z&J~96SGvAD5(%13rf4*3j0(m;$ZY~&s3ydlc-{ab4B<+D#2z#F!-GIxToKRMtJC~p zV_YXAyn1W$j5T2+GW{kmV@jDbl&&8>I+q(>9tcNTMRSUg@Osk~ z%dde#5UuuYhc8-<=ith03phNkN-LaJnXcy%0t+PrQVJ2YKeAaw1|*vi0wZB)cKlGw zKN@ODyE--yDuh5=98*2P@PyQg2}3x^s1hza5Uh+JA;f_|iOX+2-jW+u>EsFmu1FLP z8%i_LOwvqRVA}ZQntIA+`|rN;`LqX9HBdH1JL7YN^?yu|YZy~U*;O@zQ$pT2 z1{`IkE2oZzA*>kmbd;H0fsoG*84PEmdg1I)EwN3IetJt9d>QdXyiQ9TVVT}Y>xI{& zA;#>r``zjKn8D$6+2NE@y=Ah)2;pmWzSm=Ey@<~;{m!YK(8NiAUx6iB3P%!Kha7;3^z}WcO)T+5^Ql&wPIaaB6$_9RiP7HIRV2HJGGY%^IYT1pjzm zj-yErXo6t?yFVBaXA}sf{vYT8{)JkMQ(L1q#A3N(M=a!Y>5v9HomR+NKOB)HLE>Co zoQ9Et;r9~puQ>k|nu@RpyCi9!t287l+Dep26BHSKV9=JPU1Mr4LW0Co<21Rdk~kM* zMUttxm?)~ijFSaK(T%>qT_+F%=iF~`fbPeJiLyO$PXzzVQ8QV zrHd9zk+K)6y2ALBM;KA#FpQ$}1!Gl|X`jL)dY<+RQXttFokh&hM4pzb=||@?!n~?d zwn6@>Jnd&0Ix1Q}tRMypgcq0`!i0#lev&LOK0pd&8)KWqAvI__ zu%zv?n;3Hm@r1SwDTIgp=(Nx8*jEU=!$Q$SNuXpPEEDYr@wRgjj}=1a0fuuMS-CQk z<4BPiJCI1|xta_*H^4Fxw#7@(1!GZ^Xqt!>OxXc1>qs(96Cigf+n|QEQxhSFSR8>< z6Lrz_V{imAM0ze1Zx*X6Vs%k5V)T;`UE6^m(zYQ%l$ctKR9-uwvu!Lf(3tvyBtUTD zIN(PxWd{<$Ta*ugpTOc=1?MO7!%#U1Eknc@_Kr@_4~Y_H^@IAt@KYtk&?IJ!()cm9 zNl*_c+rSP2jctN18Vy!iiY5_-#xL*_sa(^{g^e7kxhjiaq{=eo7x0xrV^!lv*AgTV zUfXw4`&`92hH^z?6{!lXAK0d_`9}c$iTpGfgpLtdCQ&{Beh`qvxf)HO^+NON) z`UpgrwE`LosCJ3^A(@ASPNZQdc8q?omndy7=)yC;0t6zOA0kAh^8n=1xrSuef|Q;M zKiJiN{F|7QQ1BTX5hnjMekzqOT8qi#GXR8LkB~&`j3I1H&j9@BItj}q+xtN0L+3sC zkI=OQWbkx6G=8-2q3j}_&QqAo)YEt~Px%kY0^M6^{Aj#EDS^OIa{+{O-2gjOiH;GH zCAt^Y_%ZQ-j*G??kR4A(l}Frr^>0_ zv~#BXKp?_FRpatG(+IySz`?4)<-;4{R&IP+wxndLWEiNQNz^Pg6Xj%q(Y%$HCE03K hWy>Frn5eT@bm53S6p8;=0amqEP&at+u)G}Ie*j?K -#include - -/* include/qd/qd_config.h. Generated from qd_config.h.in by configure. */ -#ifndef _QD_QD_CONFIG_H -#define _QD_QD_CONFIG_H 1 - -#ifndef QD_API -#define QD_API /**/ -#endif - -/* Set to 1 if using VisualAge C++ compiler for __fmadd builtin. */ -#ifndef QD_VACPP_BUILTINS_H -/* #undef QD_VACPP_BUILTINS_H */ -#endif - -/* If fused multiply-add is available, define to correct macro for - using it. It is invoked as QD_FMA(a, b, c) to compute fl(a * b + c). - If correctly rounded multiply-add is not available (or if unsure), - keep it undefined.*/ -#ifndef QD_FMA -/* #undef QD_FMA */ -#endif - -/* If fused multiply-subtract is available, define to correct macro for - using it. It is invoked as QD_FMS(a, b, c) to compute fl(a * b - c). - If correctly rounded multiply-add is not available (or if unsure), - keep it undefined.*/ -#ifndef QD_FMS -#define QD_FMS(a, b, c) std::fma(a,b,-c) -/* #undef QD_FMS */ -#endif - -/* Set the following to 1 to define commonly used function - to be inlined. This should be set to 1 unless the compiler - does not support the "inline" keyword, or if building for - debugging purposes. */ -#ifndef QD_INLINE -#define QD_INLINE 1 -#endif - -/* Set the following to 1 to use ANSI C++ standard header files - such as cmath, iostream, etc. If set to zero, it will try to - include math.h, iostream.h, etc, instead. */ -#ifndef QD_HAVE_STD -#define QD_HAVE_STD 1 -#endif - -/* Set the following to 1 to make the addition and subtraction - to satisfy the IEEE-style error bound - - fl(a + b) = (1 + d) * (a + b) - - where |d| <= eps. If set to 0, the addition and subtraction - will satisfy the weaker Cray-style error bound - - fl(a + b) = (1 + d1) * a + (1 + d2) * b - - where |d1| <= eps and |d2| eps. */ -#ifndef QD_IEEE_ADD -/* #undef QD_IEEE_ADD */ -#endif - -/* Set the following to 1 to use slightly inaccurate but faster - version of multiplication. */ -#ifndef QD_SLOPPY_MUL -#define QD_SLOPPY_MUL 1 -#endif - -/* Set the following to 1 to use slightly inaccurate but faster - version of division. */ -#ifndef QD_SLOPPY_DIV -#define QD_SLOPPY_DIV 1 -#endif - -/* Define this macro to be the isfinite(x) function. */ -#ifndef QD_ISFINITE -#define QD_ISFINITE(x) std::isfinite(x) -#endif - -/* Define this macro to be the isinf(x) function. */ -#ifndef QD_ISINF -#define QD_ISINF(x) std::isinf(x) -#endif - -/* Define this macro to be the isnan(x) function. */ -#ifndef QD_ISNAN -#define QD_ISNAN(x) std::isnan(x) -#endif - - -#endif /* _QD_QD_CONFIG_H */ diff --git a/src/external/PackedCSparse/qd/qd_const.cc b/src/external/PackedCSparse/qd/qd_const.cc deleted file mode 100644 index 6f4e01d2..00000000 --- a/src/external/PackedCSparse/qd/qd_const.cc +++ /dev/null @@ -1,62 +0,0 @@ -/* - * src/qd_const.cc - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2001 - * - * Defines constants used in quad-double package. - */ -#include "qd_config.h" -#include "qd_real.h" - -/* Some useful constants. */ -const qd_real qd_real::_2pi = qd_real(6.283185307179586232e+00, - 2.449293598294706414e-16, - -5.989539619436679332e-33, - 2.224908441726730563e-49); -const qd_real qd_real::_pi = qd_real(3.141592653589793116e+00, - 1.224646799147353207e-16, - -2.994769809718339666e-33, - 1.112454220863365282e-49); -const qd_real qd_real::_pi2 = qd_real(1.570796326794896558e+00, - 6.123233995736766036e-17, - -1.497384904859169833e-33, - 5.562271104316826408e-50); -const qd_real qd_real::_pi4 = qd_real(7.853981633974482790e-01, - 3.061616997868383018e-17, - -7.486924524295849165e-34, - 2.781135552158413204e-50); -const qd_real qd_real::_3pi4 = qd_real(2.356194490192344837e+00, - 9.1848509936051484375e-17, - 3.9168984647504003225e-33, - -2.5867981632704860386e-49); -const qd_real qd_real::_e = qd_real(2.718281828459045091e+00, - 1.445646891729250158e-16, - -2.127717108038176765e-33, - 1.515630159841218954e-49); -const qd_real qd_real::_log2 = qd_real(6.931471805599452862e-01, - 2.319046813846299558e-17, - 5.707708438416212066e-34, - -3.582432210601811423e-50); -const qd_real qd_real::_log10 = qd_real(2.302585092994045901e+00, - -2.170756223382249351e-16, - -9.984262454465776570e-33, - -4.023357454450206379e-49); -const qd_real qd_real::_nan = qd_real(qd::_d_nan, qd::_d_nan, - qd::_d_nan, qd::_d_nan); -const qd_real qd_real::_inf = qd_real(qd::_d_inf, qd::_d_inf, - qd::_d_inf, qd::_d_inf); - -const double qd_real::_eps = 1.21543267145725e-63; // = 2^-209 -const double qd_real::_min_normalized = 1.6259745436952323e-260; // = 2^(-1022 + 3*53) -const qd_real qd_real::_max = qd_real( - 1.79769313486231570815e+308, 9.97920154767359795037e+291, - 5.53956966280111259858e+275, 3.07507889307840487279e+259); -const qd_real qd_real::_safe_max = qd_real( - 1.7976931080746007281e+308, 9.97920154767359795037e+291, - 5.53956966280111259858e+275, 3.07507889307840487279e+259); -const int qd_real::_ndigits = 62; - diff --git a/src/external/PackedCSparse/qd/qd_inline.h b/src/external/PackedCSparse/qd/qd_inline.h deleted file mode 100644 index 89ba275b..00000000 --- a/src/external/PackedCSparse/qd/qd_inline.h +++ /dev/null @@ -1,1047 +0,0 @@ -/* - * include/qd_inline.h - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2001 - * - * Contains small functions (suitable for inlining) in the quad-double - * arithmetic package. - */ -#ifndef _QD_QD_INLINE_H -#define _QD_QD_INLINE_H - -#include -#include "inline.h" - -#ifndef QD_INLINE -#define inline -#endif - -/********** Constructors **********/ -inline qd_real::qd_real(double x0, double x1, double x2, double x3) { - x[0] = x0; - x[1] = x1; - x[2] = x2; - x[3] = x3; -} - -inline qd_real::qd_real(const double *xx) { - x[0] = xx[0]; - x[1] = xx[1]; - x[2] = xx[2]; - x[3] = xx[3]; -} - -inline qd_real::qd_real(double x0) { - x[0] = x0; - x[1] = x[2] = x[3] = 0.0; -} - -inline qd_real::qd_real() { - x[0] = 0.0; - x[1] = 0.0; - x[2] = 0.0; - x[3] = 0.0; -} - -inline qd_real::qd_real(const dd_real &a) { - x[0] = a._hi(); - x[1] = a._lo(); - x[2] = x[3] = 0.0; -} - -inline qd_real::qd_real(int i) { - x[0] = static_cast(i); - x[1] = x[2] = x[3] = 0.0; -} - -/********** Accessors **********/ -inline double qd_real::operator[](int i) const { - return x[i]; -} - -inline double &qd_real::operator[](int i) { - return x[i]; -} - -inline bool qd_real::isnan() const { - return QD_ISNAN(x[0]) || QD_ISNAN(x[1]) || QD_ISNAN(x[2]) || QD_ISNAN(x[3]); -} - -/********** Renormalization **********/ -namespace qd { -inline void quick_renorm(double &c0, double &c1, - double &c2, double &c3, double &c4) { - double t0, t1, t2, t3; - double s; - s = qd::quick_two_sum(c3, c4, t3); - s = qd::quick_two_sum(c2, s , t2); - s = qd::quick_two_sum(c1, s , t1); - c0 = qd::quick_two_sum(c0, s , t0); - - s = qd::quick_two_sum(t2, t3, t2); - s = qd::quick_two_sum(t1, s , t1); - c1 = qd::quick_two_sum(t0, s , t0); - - s = qd::quick_two_sum(t1, t2, t1); - c2 = qd::quick_two_sum(t0, s , t0); - - c3 = t0 + t1; -} - -inline void renorm(double &c0, double &c1, - double &c2, double &c3) { - double s0, s1, s2 = 0.0, s3 = 0.0; - - if (QD_ISINF(c0)) return; - - s0 = qd::quick_two_sum(c2, c3, c3); - s0 = qd::quick_two_sum(c1, s0, c2); - c0 = qd::quick_two_sum(c0, s0, c1); - - s0 = c0; - s1 = c1; - if (s1 != 0.0) { - s1 = qd::quick_two_sum(s1, c2, s2); - if (s2 != 0.0) - s2 = qd::quick_two_sum(s2, c3, s3); - else - s1 = qd::quick_two_sum(s1, c3, s2); - } else { - s0 = qd::quick_two_sum(s0, c2, s1); - if (s1 != 0.0) - s1 = qd::quick_two_sum(s1, c3, s2); - else - s0 = qd::quick_two_sum(s0, c3, s1); - } - - c0 = s0; - c1 = s1; - c2 = s2; - c3 = s3; -} - -inline void renorm(double &c0, double &c1, - double &c2, double &c3, double &c4) { - double s0, s1, s2 = 0.0, s3 = 0.0; - - if (QD_ISINF(c0)) return; - - s0 = qd::quick_two_sum(c3, c4, c4); - s0 = qd::quick_two_sum(c2, s0, c3); - s0 = qd::quick_two_sum(c1, s0, c2); - c0 = qd::quick_two_sum(c0, s0, c1); - - s0 = c0; - s1 = c1; - - if (s1 != 0.0) { - s1 = qd::quick_two_sum(s1, c2, s2); - if (s2 != 0.0) { - s2 = qd::quick_two_sum(s2, c3, s3); - if (s3 != 0.0) - s3 += c4; - else - s2 = qd::quick_two_sum(s2, c4, s3); - } else { - s1 = qd::quick_two_sum(s1, c3, s2); - if (s2 != 0.0) - s2 = qd::quick_two_sum(s2, c4, s3); - else - s1 = qd::quick_two_sum(s1, c4, s2); - } - } else { - s0 = qd::quick_two_sum(s0, c2, s1); - if (s1 != 0.0) { - s1 = qd::quick_two_sum(s1, c3, s2); - if (s2 != 0.0) - s2 = qd::quick_two_sum(s2, c4, s3); - else - s1 = qd::quick_two_sum(s1, c4, s2); - } else { - s0 = qd::quick_two_sum(s0, c3, s1); - if (s1 != 0.0) - s1 = qd::quick_two_sum(s1, c4, s2); - else - s0 = qd::quick_two_sum(s0, c4, s1); - } - } - - c0 = s0; - c1 = s1; - c2 = s2; - c3 = s3; -} -} - -inline void qd_real::renorm() { - qd::renorm(x[0], x[1], x[2], x[3]); -} - -inline void qd_real::renorm(double &e) { - qd::renorm(x[0], x[1], x[2], x[3], e); -} - - -/********** Additions ************/ -namespace qd { - -inline void three_sum(double &a, double &b, double &c) { - double t1, t2, t3; - t1 = qd::two_sum(a, b, t2); - a = qd::two_sum(c, t1, t3); - b = qd::two_sum(t2, t3, c); -} - -inline void three_sum2(double &a, double &b, double &c) { - double t1, t2, t3; - t1 = qd::two_sum(a, b, t2); - a = qd::two_sum(c, t1, t3); - b = t2 + t3; -} - -} - -/* quad-double + double */ -inline qd_real operator+(const qd_real &a, double b) { - double c0, c1, c2, c3; - double e; - - c0 = qd::two_sum(a[0], b, e); - c1 = qd::two_sum(a[1], e, e); - c2 = qd::two_sum(a[2], e, e); - c3 = qd::two_sum(a[3], e, e); - - qd::renorm(c0, c1, c2, c3, e); - - return qd_real(c0, c1, c2, c3); -} - -/* quad-double + double-double */ -inline qd_real operator+(const qd_real &a, const dd_real &b) { - - double s0, s1, s2, s3; - double t0, t1; - - s0 = qd::two_sum(a[0], b._hi(), t0); - s1 = qd::two_sum(a[1], b._lo(), t1); - - s1 = qd::two_sum(s1, t0, t0); - - s2 = a[2]; - qd::three_sum(s2, t0, t1); - - s3 = qd::two_sum(t0, a[3], t0); - t0 += t1; - - qd::renorm(s0, s1, s2, s3, t0); - return qd_real(s0, s1, s2, s3); -} - - -/* double + quad-double */ -inline qd_real operator+(double a, const qd_real &b) { - return (b + a); -} - -/* double-double + quad-double */ -inline qd_real operator+(const dd_real &a, const qd_real &b) { - return (b + a); -} - -namespace qd { - -/* s = quick_three_accum(a, b, c) adds c to the dd-pair (a, b). - * If the result does not fit in two doubles, then the sum is - * output into s and (a,b) contains the remainder. Otherwise - * s is zero and (a,b) contains the sum. */ -inline double quick_three_accum(double &a, double &b, double c) { - double s; - bool za, zb; - - s = qd::two_sum(b, c, b); - s = qd::two_sum(a, s, a); - - za = (a != 0.0); - zb = (b != 0.0); - - if (za && zb) - return s; - - if (!zb) { - b = a; - a = s; - } else { - a = s; - } - - return 0.0; -} - -} - -inline qd_real qd_real::ieee_add(const qd_real &a, const qd_real &b) { - int i, j, k; - double s, t; - double u, v; /* double-length accumulator */ - double x[4] = {0.0, 0.0, 0.0, 0.0}; - - i = j = k = 0; - if (std::abs(a[i]) > std::abs(b[j])) - u = a[i++]; - else - u = b[j++]; - if (std::abs(a[i]) > std::abs(b[j])) - v = a[i++]; - else - v = b[j++]; - - u = qd::quick_two_sum(u, v, v); - - while (k < 4) { - if (i >= 4 && j >= 4) { - x[k] = u; - if (k < 3) - x[++k] = v; - break; - } - - if (i >= 4) - t = b[j++]; - else if (j >= 4) - t = a[i++]; - else if (std::abs(a[i]) > std::abs(b[j])) { - t = a[i++]; - } else - t = b[j++]; - - s = qd::quick_three_accum(u, v, t); - - if (s != 0.0) { - x[k++] = s; - } - } - - /* add the rest. */ - for (k = i; k < 4; k++) - x[3] += a[k]; - for (k = j; k < 4; k++) - x[3] += b[k]; - - qd::renorm(x[0], x[1], x[2], x[3]); - return qd_real(x[0], x[1], x[2], x[3]); -} - -inline qd_real qd_real::sloppy_add(const qd_real &a, const qd_real &b) { - /* - double s0, s1, s2, s3; - double t0, t1, t2, t3; - - s0 = qd::two_sum(a[0], b[0], t0); - s1 = qd::two_sum(a[1], b[1], t1); - s2 = qd::two_sum(a[2], b[2], t2); - s3 = qd::two_sum(a[3], b[3], t3); - - s1 = qd::two_sum(s1, t0, t0); - qd::three_sum(s2, t0, t1); - qd::three_sum2(s3, t0, t2); - t0 = t0 + t1 + t3; - - qd::renorm(s0, s1, s2, s3, t0); - return qd_real(s0, s1, s2, s3, t0); - */ - - /* Same as above, but addition re-organized to minimize - data dependency ... unfortunately some compilers are - not very smart to do this automatically */ - double s0, s1, s2, s3; - double t0, t1, t2, t3; - - double v0, v1, v2, v3; - double u0, u1, u2, u3; - double w0, w1, w2, w3; - - s0 = a[0] + b[0]; - s1 = a[1] + b[1]; - s2 = a[2] + b[2]; - s3 = a[3] + b[3]; - - v0 = s0 - a[0]; - v1 = s1 - a[1]; - v2 = s2 - a[2]; - v3 = s3 - a[3]; - - u0 = s0 - v0; - u1 = s1 - v1; - u2 = s2 - v2; - u3 = s3 - v3; - - w0 = a[0] - u0; - w1 = a[1] - u1; - w2 = a[2] - u2; - w3 = a[3] - u3; - - u0 = b[0] - v0; - u1 = b[1] - v1; - u2 = b[2] - v2; - u3 = b[3] - v3; - - t0 = w0 + u0; - t1 = w1 + u1; - t2 = w2 + u2; - t3 = w3 + u3; - - s1 = qd::two_sum(s1, t0, t0); - qd::three_sum(s2, t0, t1); - qd::three_sum2(s3, t0, t2); - t0 = t0 + t1 + t3; - - /* renormalize */ - qd::renorm(s0, s1, s2, s3, t0); - return qd_real(s0, s1, s2, s3); -} - -/* quad-double + quad-double */ -inline qd_real operator+(const qd_real &a, const qd_real &b) { -#ifndef QD_IEEE_ADD - return qd_real::sloppy_add(a, b); -#else - return qd_real::ieee_add(a, b); -#endif -} - - - -/********** Self-Additions ************/ -/* quad-double += double */ -inline qd_real &qd_real::operator+=(double a) { - *this = *this + a; - return *this; -} - -/* quad-double += double-double */ -inline qd_real &qd_real::operator+=(const dd_real &a) { - *this = *this + a; - return *this; -} - -/* quad-double += quad-double */ -inline qd_real &qd_real::operator+=(const qd_real &a) { - *this = *this + a; - return *this; -} - -/********** Unary Minus **********/ -inline qd_real qd_real::operator-() const { - return qd_real(-x[0], -x[1], -x[2], -x[3]); -} - -/********** Subtractions **********/ -inline qd_real operator-(const qd_real &a, double b) { - return (a + (-b)); -} - -inline qd_real operator-(double a, const qd_real &b) { - return (a + (-b)); -} - -inline qd_real operator-(const qd_real &a, const dd_real &b) { - return (a + (-b)); -} - -inline qd_real operator-(const dd_real &a, const qd_real &b) { - return (a + (-b)); -} - -inline qd_real operator-(const qd_real &a, const qd_real &b) { - return (a + (-b)); -} - -/********** Self-Subtractions **********/ -inline qd_real &qd_real::operator-=(double a) { - return ((*this) += (-a)); -} - -inline qd_real &qd_real::operator-=(const dd_real &a) { - return ((*this) += (-a)); -} - -inline qd_real &qd_real::operator-=(const qd_real &a) { - return ((*this) += (-a)); -} - - -inline qd_real operator*(double a, const qd_real &b) { - return (b * a); -} - -inline qd_real operator*(const dd_real &a, const qd_real &b) { - return (b * a); -} - -inline qd_real mul_pwr2(const qd_real &a, double b) { - return qd_real(a[0] * b, a[1] * b, a[2] * b, a[3] * b); -} - -/********** Multiplications **********/ -inline qd_real operator*(const qd_real &a, double b) { - double p0, p1, p2, p3; - double q0, q1, q2; - double s0, s1, s2, s3, s4; - - p0 = qd::two_prod(a[0], b, q0); - p1 = qd::two_prod(a[1], b, q1); - p2 = qd::two_prod(a[2], b, q2); - p3 = a[3] * b; - - s0 = p0; - - s1 = qd::two_sum(q0, p1, s2); - - qd::three_sum(s2, q1, p2); - - qd::three_sum2(q1, q2, p3); - s3 = q1; - - s4 = q2 + p2; - - qd::renorm(s0, s1, s2, s3, s4); - return qd_real(s0, s1, s2, s3); - -} - -/* quad-double * double-double */ -/* a0 * b0 0 - a0 * b1 1 - a1 * b0 2 - a1 * b1 3 - a2 * b0 4 - a2 * b1 5 - a3 * b0 6 - a3 * b1 7 */ -inline qd_real operator*(const qd_real &a, const dd_real &b) { - double p0, p1, p2, p3, p4; - double q0, q1, q2, q3, q4; - double s0, s1, s2; - double t0, t1; - - p0 = qd::two_prod(a[0], b._hi(), q0); - p1 = qd::two_prod(a[0], b._lo(), q1); - p2 = qd::two_prod(a[1], b._hi(), q2); - p3 = qd::two_prod(a[1], b._lo(), q3); - p4 = qd::two_prod(a[2], b._hi(), q4); - - qd::three_sum(p1, p2, q0); - - /* Five-Three-Sum */ - qd::three_sum(p2, p3, p4); - q1 = qd::two_sum(q1, q2, q2); - s0 = qd::two_sum(p2, q1, t0); - s1 = qd::two_sum(p3, q2, t1); - s1 = qd::two_sum(s1, t0, t0); - s2 = t0 + t1 + p4; - p2 = s0; - - p3 = a[2] * b._hi() + a[3] * b._lo() + q3 + q4; - qd::three_sum2(p3, q0, s1); - p4 = q0 + s2; - - qd::renorm(p0, p1, p2, p3, p4); - return qd_real(p0, p1, p2, p3); -} - -/* quad-double * quad-double */ -/* a0 * b0 0 - a0 * b1 1 - a1 * b0 2 - a0 * b2 3 - a1 * b1 4 - a2 * b0 5 - a0 * b3 6 - a1 * b2 7 - a2 * b1 8 - a3 * b0 9 */ -inline qd_real qd_real::sloppy_mul(const qd_real &a, const qd_real &b) { - double p0, p1, p2, p3, p4, p5; - double q0, q1, q2, q3, q4, q5; - double t0, t1; - double s0, s1, s2; - - p0 = qd::two_prod(a[0], b[0], q0); - - p1 = qd::two_prod(a[0], b[1], q1); - p2 = qd::two_prod(a[1], b[0], q2); - - p3 = qd::two_prod(a[0], b[2], q3); - p4 = qd::two_prod(a[1], b[1], q4); - p5 = qd::two_prod(a[2], b[0], q5); - - /* Start Accumulation */ - qd::three_sum(p1, p2, q0); - - /* Six-Three Sum of p2, q1, q2, p3, p4, p5. */ - qd::three_sum(p2, q1, q2); - qd::three_sum(p3, p4, p5); - /* compute (s0, s1, s2) = (p2, q1, q2) + (p3, p4, p5). */ - s0 = qd::two_sum(p2, p3, t0); - s1 = qd::two_sum(q1, p4, t1); - s2 = q2 + p5; - s1 = qd::two_sum(s1, t0, t0); - s2 += (t0 + t1); - - /* O(eps^3) order terms */ - s1 += a[0]*b[3] + a[1]*b[2] + a[2]*b[1] + a[3]*b[0] + q0 + q3 + q4 + q5; - qd::renorm(p0, p1, s0, s1, s2); - return qd_real(p0, p1, s0, s1); -} - -inline qd_real qd_real::accurate_mul(const qd_real &a, const qd_real &b) { - double p0, p1, p2, p3, p4, p5; - double q0, q1, q2, q3, q4, q5; - double p6, p7, p8, p9; - double q6, q7, q8, q9; - double r0, r1; - double t0, t1; - double s0, s1, s2; - - p0 = qd::two_prod(a[0], b[0], q0); - - p1 = qd::two_prod(a[0], b[1], q1); - p2 = qd::two_prod(a[1], b[0], q2); - - p3 = qd::two_prod(a[0], b[2], q3); - p4 = qd::two_prod(a[1], b[1], q4); - p5 = qd::two_prod(a[2], b[0], q5); - - /* Start Accumulation */ - qd::three_sum(p1, p2, q0); - - /* Six-Three Sum of p2, q1, q2, p3, p4, p5. */ - qd::three_sum(p2, q1, q2); - qd::three_sum(p3, p4, p5); - /* compute (s0, s1, s2) = (p2, q1, q2) + (p3, p4, p5). */ - s0 = qd::two_sum(p2, p3, t0); - s1 = qd::two_sum(q1, p4, t1); - s2 = q2 + p5; - s1 = qd::two_sum(s1, t0, t0); - s2 += (t0 + t1); - - /* O(eps^3) order terms */ - p6 = qd::two_prod(a[0], b[3], q6); - p7 = qd::two_prod(a[1], b[2], q7); - p8 = qd::two_prod(a[2], b[1], q8); - p9 = qd::two_prod(a[3], b[0], q9); - - /* Nine-Two-Sum of q0, s1, q3, q4, q5, p6, p7, p8, p9. */ - q0 = qd::two_sum(q0, q3, q3); - q4 = qd::two_sum(q4, q5, q5); - p6 = qd::two_sum(p6, p7, p7); - p8 = qd::two_sum(p8, p9, p9); - /* Compute (t0, t1) = (q0, q3) + (q4, q5). */ - t0 = qd::two_sum(q0, q4, t1); - t1 += (q3 + q5); - /* Compute (r0, r1) = (p6, p7) + (p8, p9). */ - r0 = qd::two_sum(p6, p8, r1); - r1 += (p7 + p9); - /* Compute (q3, q4) = (t0, t1) + (r0, r1). */ - q3 = qd::two_sum(t0, r0, q4); - q4 += (t1 + r1); - /* Compute (t0, t1) = (q3, q4) + s1. */ - t0 = qd::two_sum(q3, s1, t1); - t1 += q4; - - /* O(eps^4) terms -- Nine-One-Sum */ - t1 += a[1] * b[3] + a[2] * b[2] + a[3] * b[1] + q6 + q7 + q8 + q9 + s2; - - qd::renorm(p0, p1, s0, t0, t1); - return qd_real(p0, p1, s0, t0); -} - -inline qd_real operator*(const qd_real &a, const qd_real &b) { -#ifdef QD_SLOPPY_MUL - return qd_real::sloppy_mul(a, b); -#else - return qd_real::accurate_mul(a, b); -#endif -} - -/* quad-double ^ 2 = (x0 + x1 + x2 + x3) ^ 2 - = x0 ^ 2 + 2 x0 * x1 + (2 x0 * x2 + x1 ^ 2) - + (2 x0 * x3 + 2 x1 * x2) */ -inline qd_real sqr(const qd_real &a) { - double p0, p1, p2, p3, p4, p5; - double q0, q1, q2, q3; - double s0, s1; - double t0, t1; - - p0 = qd::two_sqr(a[0], q0); - p1 = qd::two_prod(2.0 * a[0], a[1], q1); - p2 = qd::two_prod(2.0 * a[0], a[2], q2); - p3 = qd::two_sqr(a[1], q3); - - p1 = qd::two_sum(q0, p1, q0); - - q0 = qd::two_sum(q0, q1, q1); - p2 = qd::two_sum(p2, p3, p3); - - s0 = qd::two_sum(q0, p2, t0); - s1 = qd::two_sum(q1, p3, t1); - - s1 = qd::two_sum(s1, t0, t0); - t0 += t1; - - s1 = qd::quick_two_sum(s1, t0, t0); - p2 = qd::quick_two_sum(s0, s1, t1); - p3 = qd::quick_two_sum(t1, t0, q0); - - p4 = 2.0 * a[0] * a[3]; - p5 = 2.0 * a[1] * a[2]; - - p4 = qd::two_sum(p4, p5, p5); - q2 = qd::two_sum(q2, q3, q3); - - t0 = qd::two_sum(p4, q2, t1); - t1 = t1 + p5 + q3; - - p3 = qd::two_sum(p3, t0, p4); - p4 = p4 + q0 + t1; - - qd::renorm(p0, p1, p2, p3, p4); - return qd_real(p0, p1, p2, p3); - -} - -/********** Self-Multiplication **********/ -/* quad-double *= double */ -inline qd_real &qd_real::operator*=(double a) { - *this = (*this * a); - return *this; -} - -/* quad-double *= double-double */ -inline qd_real &qd_real::operator*=(const dd_real &a) { - *this = (*this * a); - return *this; -} - -/* quad-double *= quad-double */ -inline qd_real &qd_real::operator*=(const qd_real &a) { - *this = *this * a; - return *this; -} - -inline qd_real operator/ (const qd_real &a, const dd_real &b) { -#ifdef QD_SLOPPY_DIV - return qd_real::sloppy_div(a, b); -#else - return qd_real::accurate_div(a, b); -#endif -} - -inline qd_real operator/(const qd_real &a, const qd_real &b) { -#ifdef QD_SLOPPY_DIV - return qd_real::sloppy_div(a, b); -#else - return qd_real::accurate_div(a, b); -#endif -} - -/* double / quad-double */ -inline qd_real operator/(double a, const qd_real &b) { - return qd_real(a) / b; -} - -/* double-double / quad-double */ -inline qd_real operator/(const dd_real &a, const qd_real &b) { - return qd_real(a) / b; -} - -/********** Self-Divisions **********/ -/* quad-double /= double */ -inline qd_real &qd_real::operator/=(double a) { - *this = (*this / a); - return *this; -} - -/* quad-double /= double-double */ -inline qd_real &qd_real::operator/=(const dd_real &a) { - *this = (*this / a); - return *this; -} - -/* quad-double /= quad-double */ -inline qd_real &qd_real::operator/=(const qd_real &a) { - *this = (*this / a); - return *this; -} - - -/********** Exponentiation **********/ -inline qd_real qd_real::operator^(int n) const { - return pow(*this, n); -} - -/********** Miscellaneous **********/ -inline qd_real abs(const qd_real &a) { - return (a[0] < 0.0) ? -a : a; -} - -inline qd_real fabs(const qd_real &a) { - return abs(a); -} - -/* Quick version. May be off by one when qd is very close - to the middle of two integers. */ -inline qd_real quick_nint(const qd_real &a) { - qd_real r = qd_real(qd::nint(a[0]), qd::nint(a[1]), - qd::nint(a[2]), qd::nint(a[3])); - r.renorm(); - return r; -} - -/*********** Assignments ************/ -/* quad-double = double */ -inline qd_real &qd_real::operator=(double a) { - x[0] = a; - x[1] = x[2] = x[3] = 0.0; - return *this; -} - -/* quad-double = double-double */ -inline qd_real &qd_real::operator=(const dd_real &a) { - x[0] = a._hi(); - x[1] = a._lo(); - x[2] = x[3] = 0.0; - return *this; -} - -/********** Equality Comparison **********/ -inline bool operator==(const qd_real &a, double b) { - return (a[0] == b && a[1] == 0.0 && a[2] == 0.0 && a[3] == 0.0); -} - -inline bool operator==(double a, const qd_real &b) { - return (b == a); -} - -inline bool operator==(const qd_real &a, const dd_real &b) { - return (a[0] == b._hi() && a[1] == b._lo() && - a[2] == 0.0 && a[3] == 0.0); -} - -inline bool operator==(const dd_real &a, const qd_real &b) { - return (b == a); -} - -inline bool operator==(const qd_real &a, const qd_real &b) { - return (a[0] == b[0] && a[1] == b[1] && - a[2] == b[2] && a[3] == b[3]); -} - - -/********** Less-Than Comparison ***********/ -inline bool operator<(const qd_real &a, double b) { - return (a[0] < b || (a[0] == b && a[1] < 0.0)); -} - -inline bool operator<(double a, const qd_real &b) { - return (b > a); -} - -inline bool operator<(const qd_real &a, const dd_real &b) { - return (a[0] < b._hi() || - (a[0] == b._hi() && (a[1] < b._lo() || - (a[1] == b._lo() && a[2] < 0.0)))); -} - -inline bool operator<(const dd_real &a, const qd_real &b) { - return (b > a); -} - -inline bool operator<(const qd_real &a, const qd_real &b) { - return (a[0] < b[0] || - (a[0] == b[0] && (a[1] < b[1] || - (a[1] == b[1] && (a[2] < b[2] || - (a[2] == b[2] && a[3] < b[3])))))); -} - -/********** Greater-Than Comparison ***********/ -inline bool operator>(const qd_real &a, double b) { - return (a[0] > b || (a[0] == b && a[1] > 0.0)); -} - -inline bool operator>(double a, const qd_real &b) { - return (b < a); -} - -inline bool operator>(const qd_real &a, const dd_real &b) { - return (a[0] > b._hi() || - (a[0] == b._hi() && (a[1] > b._lo() || - (a[1] == b._lo() && a[2] > 0.0)))); -} - -inline bool operator>(const dd_real &a, const qd_real &b) { - return (b < a); -} - -inline bool operator>(const qd_real &a, const qd_real &b) { - return (a[0] > b[0] || - (a[0] == b[0] && (a[1] > b[1] || - (a[1] == b[1] && (a[2] > b[2] || - (a[2] == b[2] && a[3] > b[3])))))); -} - - -/********** Less-Than-Or-Equal-To Comparison **********/ -inline bool operator<=(const qd_real &a, double b) { - return (a[0] < b || (a[0] == b && a[1] <= 0.0)); -} - -inline bool operator<=(double a, const qd_real &b) { - return (b >= a); -} - -inline bool operator<=(const qd_real &a, const dd_real &b) { - return (a[0] < b._hi() || - (a[0] == b._hi() && (a[1] < b._lo() || - (a[1] == b._lo() && a[2] <= 0.0)))); -} - -inline bool operator<=(const dd_real &a, const qd_real &b) { - return (b >= a); -} - -inline bool operator<=(const qd_real &a, const qd_real &b) { - return (a[0] < b[0] || - (a[0] == b[0] && (a[1] < b[1] || - (a[1] == b[1] && (a[2] < b[2] || - (a[2] == b[2] && a[3] <= b[3])))))); -} - -/********** Greater-Than-Or-Equal-To Comparison **********/ -inline bool operator>=(const qd_real &a, double b) { - return (a[0] > b || (a[0] == b && a[1] >= 0.0)); -} - -inline bool operator>=(double a, const qd_real &b) { - return (b <= a); -} - -inline bool operator>=(const qd_real &a, const dd_real &b) { - return (a[0] > b._hi() || - (a[0] == b._hi() && (a[1] > b._lo() || - (a[1] == b._lo() && a[2] >= 0.0)))); -} - -inline bool operator>=(const dd_real &a, const qd_real &b) { - return (b <= a); -} - -inline bool operator>=(const qd_real &a, const qd_real &b) { - return (a[0] > b[0] || - (a[0] == b[0] && (a[1] > b[1] || - (a[1] == b[1] && (a[2] > b[2] || - (a[2] == b[2] && a[3] >= b[3])))))); -} - - - -/********** Not-Equal-To Comparison **********/ -inline bool operator!=(const qd_real &a, double b) { - return !(a == b); -} - -inline bool operator!=(double a, const qd_real &b) { - return !(a == b); -} - -inline bool operator!=(const qd_real &a, const dd_real &b) { - return !(a == b); -} - -inline bool operator!=(const dd_real &a, const qd_real &b) { - return !(a == b); -} - -inline bool operator!=(const qd_real &a, const qd_real &b) { - return !(a == b); -} - - - -inline qd_real aint(const qd_real &a) { - return (a[0] >= 0) ? floor(a) : ceil(a); -} - -inline bool qd_real::is_zero() const { - return (x[0] == 0.0); -} - -inline bool qd_real::is_one() const { - return (x[0] == 1.0 && x[1] == 0.0 && x[2] == 0.0 && x[3] == 0.0); -} - -inline bool qd_real::is_positive() const { - return (x[0] > 0.0); -} - -inline bool qd_real::is_negative() const { - return (x[0] < 0.0); -} - -inline qd_real::operator bool() const { - return (x[0] != 0.0); -} - -inline qd_real::operator double() const { - return to_double(*this); -} - -inline dd_real to_dd_real(const qd_real &a) { - return dd_real(a[0], a[1]); -} - -inline double to_double(const qd_real &a) { - return a[0]; -} - -inline int to_int(const qd_real &a) { - return static_cast(a[0]); -} - -inline qd_real inv(const qd_real &qd) { - return 1.0 / qd; -} - -inline qd_real max(const qd_real &a, const qd_real &b) { - return (a > b) ? a : b; -} - -inline qd_real max(const qd_real &a, const qd_real &b, - const qd_real &c) { - return (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c); -} - -inline qd_real min(const qd_real &a, const qd_real &b) { - return (a < b) ? a : b; -} - -inline qd_real min(const qd_real &a, const qd_real &b, - const qd_real &c) { - return (a < b) ? ((a < c) ? a : c) : ((b < c) ? b : c); -} - -/* Random number generator */ -inline qd_real qd_real::rand() { - return qdrand(); -} - -inline qd_real ldexp(const qd_real &a, int n) { - return qd_real(std::ldexp(a[0], n), std::ldexp(a[1], n), - std::ldexp(a[2], n), std::ldexp(a[3], n)); -} - -#endif /* _QD_QD_INLINE_H */ diff --git a/src/external/PackedCSparse/qd/qd_real.cc b/src/external/PackedCSparse/qd/qd_real.cc deleted file mode 100644 index 02cb7aa3..00000000 --- a/src/external/PackedCSparse/qd/qd_real.cc +++ /dev/null @@ -1,2624 +0,0 @@ -/* - * src/qd_real.cc - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2007 - * - * Contains implementation of non-inlined functions of quad-double - * package. Inlined functions are found in qd_inline.h (in include directory). - */ -#include -#include -#include -#include -#include -#include -#include - -#include "qd_config.h" -#include "qd_real.h" -#include "util.h" - -#include "bits.h" - -#ifndef QD_INLINE -#include "qd_inline.h" -#endif - -using std::cout; -using std::cerr; -using std::endl; -using std::istream; -using std::ostream; -using std::ios_base; -using std::string; -using std::setw; - -using namespace qd; - -void qd_real::error(const char *msg) { - //if (msg) { cerr << "ERROR " << msg << endl; } -} - -/********** Multiplications **********/ - -qd_real nint(const qd_real &a) { - double x0, x1, x2, x3; - - x0 = nint(a[0]); - x1 = x2 = x3 = 0.0; - - if (x0 == a[0]) { - /* First double is already an integer. */ - x1 = nint(a[1]); - - if (x1 == a[1]) { - /* Second double is already an integer. */ - x2 = nint(a[2]); - - if (x2 == a[2]) { - /* Third double is already an integer. */ - x3 = nint(a[3]); - } else { - if (std::abs(x2 - a[2]) == 0.5 && a[3] < 0.0) { - x2 -= 1.0; - } - } - - } else { - if (std::abs(x1 - a[1]) == 0.5 && a[2] < 0.0) { - x1 -= 1.0; - } - } - - } else { - /* First double is not an integer. */ - if (std::abs(x0 - a[0]) == 0.5 && a[1] < 0.0) { - x0 -= 1.0; - } - } - - renorm(x0, x1, x2, x3); - return qd_real(x0, x1, x2, x3); -} - -qd_real floor(const qd_real &a) { - double x0, x1, x2, x3; - x1 = x2 = x3 = 0.0; - x0 = std::floor(a[0]); - - if (x0 == a[0]) { - x1 = std::floor(a[1]); - - if (x1 == a[1]) { - x2 = std::floor(a[2]); - - if (x2 == a[2]) { - x3 = std::floor(a[3]); - } - } - - renorm(x0, x1, x2, x3); - return qd_real(x0, x1, x2, x3); - } - - return qd_real(x0, x1, x2, x3); -} - -qd_real ceil(const qd_real &a) { - double x0, x1, x2, x3; - x1 = x2 = x3 = 0.0; - x0 = std::ceil(a[0]); - - if (x0 == a[0]) { - x1 = std::ceil(a[1]); - - if (x1 == a[1]) { - x2 = std::ceil(a[2]); - - if (x2 == a[2]) { - x3 = std::ceil(a[3]); - } - } - - renorm(x0, x1, x2, x3); - return qd_real(x0, x1, x2, x3); - } - - return qd_real(x0, x1, x2, x3); -} - - - -/********** Divisions **********/ -/* quad-double / double */ -qd_real operator/(const qd_real &a, double b) { - /* Strategy: compute approximate quotient using high order - doubles, and then correct it 3 times using the remainder. - (Analogous to long division.) */ - double t0, t1; - double q0, q1, q2, q3; - qd_real r; - - q0 = a[0] / b; /* approximate quotient */ - - /* Compute the remainder a - q0 * b */ - t0 = two_prod(q0, b, t1); - r = a - dd_real(t0, t1); - - /* Compute the first correction */ - q1 = r[0] / b; - t0 = two_prod(q1, b, t1); - r -= dd_real(t0, t1); - - /* Second correction to the quotient. */ - q2 = r[0] / b; - t0 = two_prod(q2, b, t1); - r -= dd_real(t0, t1); - - /* Final correction to the quotient. */ - q3 = r[0] / b; - - renorm(q0, q1, q2, q3); - return qd_real(q0, q1, q2, q3); -} - -qd_real::qd_real(const char *s) { - if (qd_real::read(s, *this)) { - qd_real::error("(qd_real::qd_real): INPUT ERROR."); - *this = qd_real::_nan; - } -} - -qd_real &qd_real::operator=(const char *s) { - if (qd_real::read(s, *this)) { - qd_real::error("(qd_real::operator=): INPUT ERROR."); - *this = qd_real::_nan; - } - return *this; -} - -istream &operator>>(istream &s, qd_real &qd) { - char str[255]; - s >> str; - qd = qd_real(str); - return s; -} - -ostream &operator<<(ostream &os, const qd_real &qd) { - bool showpos = (os.flags() & ios_base::showpos) != 0; - bool uppercase = (os.flags() & ios_base::uppercase) != 0; - return os << qd.to_string((int)os.precision(), (int)os.width(), os.flags(), - showpos, uppercase, os.fill()); -} - -/* Read a quad-double from s. */ -int qd_real::read(const char *s, qd_real &qd) { - const char *p = s; - char ch; - int sign = 0; - int point = -1; /* location of decimal point */ - int nd = 0; /* number of digits read */ - int e = 0; /* exponent. */ - bool done = false; - qd_real r = 0.0; /* number being read */ - - /* Skip any leading spaces */ - while (*p == ' ') p++; - - while (!done && (ch = *p) != '\0') { - if (ch >= '0' && ch <= '9') { - /* It's a digit */ - int d = ch - '0'; - r *= 10.0; - r += static_cast(d); - nd++; - } else { - /* Non-digit */ - switch (ch) { - case '.': - if (point >= 0) - return -1; /* we've already encountered a decimal point. */ - point = nd; - break; - case '-': - case '+': - if (sign != 0 || nd > 0) - return -1; /* we've already encountered a sign, or if its - not at first position. */ - sign = (ch == '-') ? -1 : 1; - break; - case 'E': - case 'e': - int nread; - nread = std::sscanf(p+1, "%d", &e); - done = true; - if (nread != 1) - return -1; /* read of exponent failed. */ - break; - case ' ': - done = true; - break; - default: - return -1; - - } - } - - p++; - } - - - - /* Adjust exponent to account for decimal point */ - if (point >= 0) { - e -= (nd - point); - } - - /* Multiply the the exponent */ - if (e != 0) { - r *= (qd_real(10.0) ^ e); - } - - qd = (sign < 0) ? -r : r; - return 0; -} - -void qd_real::to_digits(char *s, int &expn, int precision) const { - int D = precision + 1; /* number of digits to compute */ - - qd_real r = abs(*this); - int e; /* exponent */ - int i, d; - - if (x[0] == 0.0) { - /* this == 0.0 */ - expn = 0; - for (i = 0; i < precision; i++) s[i] = '0'; - return; - } - - /* First determine the (approximate) exponent. */ - e = static_cast(std::floor(std::log10(std::abs(x[0])))); - - if (e < -300) { - r *= qd_real(10.0) ^ 300; - r /= qd_real(10.0) ^ (e + 300); - } else if (e > 300) { - r = ldexp(r, -53); - r /= qd_real(10.0) ^ e; - r = ldexp(r, 53); - } else { - r /= qd_real(10.0) ^ e; - } - - /* Fix exponent if we are off by one */ - if (r >= 10.0) { - r /= 10.0; - e++; - } else if (r < 1.0) { - r *= 10.0; - e--; - } - - if (r >= 10.0 || r < 1.0) { - qd_real::error("(qd_real::to_digits): can't compute exponent."); - return; - } - - /* Extract the digits */ - for (i = 0; i < D; i++) { - d = static_cast(r[0]); - r -= d; - r *= 10.0; - - s[i] = static_cast(d + '0'); - } - - /* Fix out of range digits. */ - for (i = D-1; i > 0; i--) { - if (s[i] < '0') { - s[i-1]--; - s[i] += 10; - } else if (s[i] > '9') { - s[i-1]++; - s[i] -= 10; - } - } - - if (s[0] <= '0') { - qd_real::error("(qd_real::to_digits): non-positive leading digit."); - return; - } - - /* Round, handle carry */ - if (s[D-1] >= '5') { - s[D-2]++; - - i = D-2; - while (i > 0 && s[i] > '9') { - s[i] -= 10; - s[--i]++; - } - } - - /* If first digit is 10, shift everything. */ - if (s[0] > '9') { - e++; - for (i = precision; i >= 2; i--) s[i] = s[i-1]; - s[0] = '1'; - s[1] = '0'; - } - - s[precision] = 0; - expn = e; -} - -/* Writes the quad-double number into the character array s of length len. - The integer d specifies how many significant digits to write. - The string s must be able to hold at least (d+8) characters. - showpos indicates whether to use the + sign, and uppercase indicates - whether the E or e is to be used for the exponent. */ -void qd_real::write(char *s, int len, int precision, - bool showpos, bool uppercase) const { - string str = to_string(precision, 0, ios_base::scientific, showpos, uppercase); - strncpy(s, str.c_str(), len-1); - s[len-1] = 0; -} - -void round_string_qd(char *s, int precision, int *offset){ - /* - Input string must be all digits or errors will occur. - */ - - int i; - int D = precision ; - - /* Round, handle carry */ - if (D>0 && s[D] >= '5') { - s[D-1]++; - - i = D-1; - while (i > 0 && s[i] > '9') { - s[i] -= 10; - s[--i]++; - } - } - - /* If first digit is 10, shift everything. */ - if (s[0] > '9') { - // e++; // don't modify exponent here - for (i = precision; i >= 1; i--) s[i+1] = s[i]; - s[0] = '1'; - s[1] = '0'; - - (*offset)++ ; // now offset needs to be increased by one - precision++ ; - } - - s[precision] = 0; // add terminator for array -} - - -string qd_real::to_string(int precision, int width, ios_base::fmtflags fmt, - bool showpos, bool uppercase, char fill) const { - string s; - bool fixed = (fmt & ios_base::fixed) != 0; - bool sgn = true; - int i, e = 0; - - if (isinf()) { - if (*this < 0.0) - s += '-'; - else if (showpos) - s += '+'; - else - sgn = false; - s += uppercase ? "INF" : "inf"; - } else if (isnan()) { - s = uppercase ? "NAN" : "nan"; - sgn = false; - } else { - if (*this < 0.0) - s += '-'; - else if (showpos) - s += '+'; - else - sgn = false; - - if (*this == 0.0) { - /* Zero case */ - s += '0'; - if (precision > 0) { - s += '.'; - s.append(precision, '0'); - } - } else { - /* Non-zero case */ - int off = (fixed ? (1 + to_int(floor(log10(abs(*this))))) : 1); - int d = precision + off; - - int d_with_extra = d; - if(fixed) - d_with_extra = std::max(120, d); // longer than the max accuracy for DD - - // highly special case - fixed mode, precision is zero, abs(*this) < 1.0 - // without this trap a number like 0.9 printed fixed with 0 precision prints as 0 - // should be rounded to 1. - if(fixed && (precision == 0) && (abs(*this) < 1.0)){ - if(abs(*this) >= 0.5) - s += '1'; - else - s += '0'; - - return s; - } - - // handle near zero to working precision (but not exactly zero) - if (fixed && d <= 0) { - s += '0'; - if (precision > 0) { - s += '.'; - s.append(precision, '0'); - } - } else { // default - - char *t ; // = new char[d+1]; - int j; - - if(fixed){ - t = new char[d_with_extra+1]; - to_digits(t, e, d_with_extra); - } - else{ - t = new char[d+1]; - to_digits(t, e, d); - } - - off = e + 1; - - if (fixed) { - // fix the string if it's been computed incorrectly - // round here in the decimal string if required - round_string_qd(t, d, &off); - - if (off > 0) { - for (i = 0; i < off; i++) s += t[i]; - if (precision > 0) { - s += '.'; - for (j = 0; j < precision; j++, i++) s += t[i]; - } - } else { - s += "0."; - if (off < 0) s.append(-off, '0'); - for (i = 0; i < d; i++) s += t[i]; - } - } else { - s += t[0]; - if (precision > 0) s += '.'; - - for (i = 1; i <= precision; i++) - s += t[i]; - - } - delete [] t; - } - } - - // trap for improper offset with large values - // without this trap, output of values of the for 10^j - 1 fail for j > 28 - // and are output with the point in the wrong place, leading to a dramatically off value - if(fixed && (precision > 0)){ - // make sure that the value isn't dramatically larger - double from_string = atof(s.c_str()); - - // if this ratio is large, then we've got problems - if( fabs( from_string / this->x[0] ) > 3.0 ){ - - // loop on the string, find the point, move it up one - // don't act on the first character - for(i=1; i < (int)s.length(); i++){ - if(s[i] == '.'){ - s[i] = s[i-1] ; - s[i-1] = '.' ; - break; - } - } - - from_string = atof(s.c_str()); - // if this ratio is large, then the string has not been fixed - if( fabs( from_string / this->x[0] ) > 3.0 ){ - dd_real::error("Re-rounding unsuccessful in large number fixed point trap.") ; - } - } - } - - if (!fixed) { - /* Fill in exponent part */ - s += uppercase ? 'E' : 'e'; - append_expn(s, e); - } - } - - /* Fill in the blanks */ - size_t len = s.length(); - if (len < width) { - int delta = width - len; - if (fmt & ios_base::internal) { - if (sgn) - s.insert(static_cast(1), delta, fill); - else - s.insert(static_cast(0), delta, fill); - } else if (fmt & ios_base::left) { - s.append(delta, fill); - } else { - s.insert(static_cast(0), delta, fill); - } - } - - return s; -} - -/* Computes qd^n, where n is an integer. */ -qd_real pow(const qd_real &a, int n) { - if (n == 0) - return 1.0; - - qd_real r = a; /* odd-case multiplier */ - qd_real s = 1.0; /* current answer */ - int N = std::abs(n); - - if (N > 1) { - - /* Use binary exponentiation. */ - while (N > 0) { - if (N % 2 == 1) { - /* If odd, multiply by r. Note eventually N = 1, so this - eventually executes. */ - s *= r; - } - N /= 2; - if (N > 0) - r = sqr(r); - } - - } else { - s = r; - } - - if (n < 0) - return (1.0 / s); - - return s; -} - -qd_real pow(const qd_real &a, const qd_real &b) { - return exp(b * log(a)); -} - -qd_real npwr(const qd_real &a, int n) { - return pow(a, n); -} - -/* Debugging routines */ -void qd_real::dump_bits(const string &name, std::ostream &os) const { - string::size_type len = name.length(); - if (len > 0) { - os << name << " = "; - len += 3; - } - os << "[ "; - len += 2; - for (int j = 0; j < 4; j++) { - if (j > 0) for (string::size_type i = 0; i < len; i++) os << ' '; - print_double_info(os, x[j]); - if (j < 3) - os << endl; - else - os << " ]" << endl; - } -} - -void qd_real::dump(const string &name, std::ostream &os) const { - std::ios_base::fmtflags old_flags = os.flags(); - std::streamsize old_prec = os.precision(19); - os << std::scientific; - - string::size_type len = name.length(); - if (len > 0) { - os << name << " = "; - len += 3; - } - os << "[ "; - len += 2; - os << setw(27) << x[0] << ", " << setw(26) << x[1] << "," << endl; - for (string::size_type i = 0; i < len; i++) os << ' '; - os << setw(27) << x[2] << ", " << setw(26) << x[3] << " ]" << endl; - - os.precision(old_prec); - os.flags(old_flags); -} - -/* Divisions */ -/* quad-double / double-double */ -qd_real qd_real::sloppy_div(const qd_real &a, const dd_real &b) { - double q0, q1, q2, q3; - qd_real r; - qd_real qd_b(b); - - q0 = a[0] / b._hi(); - r = a - q0 * qd_b; - - q1 = r[0] / b._hi(); - r -= (q1 * qd_b); - - q2 = r[0] / b._hi(); - r -= (q2 * qd_b); - - q3 = r[0] / b._hi(); - - ::renorm(q0, q1, q2, q3); - return qd_real(q0, q1, q2, q3); -} - -qd_real qd_real::accurate_div(const qd_real &a, const dd_real &b) { - double q0, q1, q2, q3, q4; - qd_real r; - qd_real qd_b(b); - - q0 = a[0] / b._hi(); - r = a - q0 * qd_b; - - q1 = r[0] / b._hi(); - r -= (q1 * qd_b); - - q2 = r[0] / b._hi(); - r -= (q2 * qd_b); - - q3 = r[0] / b._hi(); - r -= (q3 * qd_b); - - q4 = r[0] / b._hi(); - - ::renorm(q0, q1, q2, q3, q4); - return qd_real(q0, q1, q2, q3); -} - -/* quad-double / quad-double */ -qd_real qd_real::sloppy_div(const qd_real &a, const qd_real &b) { - double q0, q1, q2, q3; - - qd_real r; - - q0 = a[0] / b[0]; - r = a - (b * q0); - - q1 = r[0] / b[0]; - r -= (b * q1); - - q2 = r[0] / b[0]; - r -= (b * q2); - - q3 = r[0] / b[0]; - - ::renorm(q0, q1, q2, q3); - - return qd_real(q0, q1, q2, q3); -} - -qd_real qd_real::accurate_div(const qd_real &a, const qd_real &b) { - double q0, q1, q2, q3; - - qd_real r; - - q0 = a[0] / b[0]; - r = a - (b * q0); - - q1 = r[0] / b[0]; - r -= (b * q1); - - q2 = r[0] / b[0]; - r -= (b * q2); - - q3 = r[0] / b[0]; - - r -= (b * q3); - double q4 = r[0] / b[0]; - - ::renorm(q0, q1, q2, q3, q4); - - return qd_real(q0, q1, q2, q3); -} - -QD_API qd_real sqrt(const qd_real &a) { - /* Strategy: - - Perform the following Newton iteration: - - x' = x + (1 - a * x^2) * x / 2; - - which converges to 1/sqrt(a), starting with the - double precision approximation to 1/sqrt(a). - Since Newton's iteration more or less doubles the - number of correct digits, we only need to perform it - twice. - */ - - if (a.is_zero()) - return 0.0; - - if (a.is_negative()) { - qd_real::error("(qd_real::sqrt): Negative argument."); - return qd_real::_nan; - } - - qd_real r = (1.0 / std::sqrt(a[0])); - qd_real h = mul_pwr2(a, 0.5); - - r += ((0.5 - h * sqr(r)) * r); - r += ((0.5 - h * sqr(r)) * r); - r += ((0.5 - h * sqr(r)) * r); - - r *= a; - return r; -} - - -/* Computes the n-th root of a */ -qd_real nroot(const qd_real &a, int n) { - /* Strategy: Use Newton's iteration to solve - - 1/(x^n) - a = 0 - - Newton iteration becomes - - x' = x + x * (1 - a * x^n) / n - - Since Newton's iteration converges quadratically, - we only need to perform it twice. - - */ - if (n <= 0) { - qd_real::error("(qd_real::nroot): N must be positive."); - return qd_real::_nan; - } - - if (n % 2 == 0 && a.is_negative()) { - qd_real::error("(qd_real::nroot): Negative argument."); - return qd_real::_nan; - } - - if (n == 1) { - return a; - } - if (n == 2) { - return sqrt(a); - } - if (a.is_zero()) { - return qd_real(0.0); - } - - - /* Note a^{-1/n} = exp(-log(a)/n) */ - qd_real r = abs(a); - qd_real x = std::exp(-std::log(r.x[0]) / n); - - /* Perform Newton's iteration. */ - double dbl_n = static_cast(n); - x += x * (1.0 - r * npwr(x, n)) / dbl_n; - x += x * (1.0 - r * npwr(x, n)) / dbl_n; - x += x * (1.0 - r * npwr(x, n)) / dbl_n; - if (a[0] < 0.0){ - x = -x; - } - return 1.0 / x; -} - -static const int n_inv_fact = 15; -static const qd_real inv_fact[n_inv_fact] = { - qd_real( 1.66666666666666657e-01, 9.25185853854297066e-18, - 5.13581318503262866e-34, 2.85094902409834186e-50), - qd_real( 4.16666666666666644e-02, 2.31296463463574266e-18, - 1.28395329625815716e-34, 7.12737256024585466e-51), - qd_real( 8.33333333333333322e-03, 1.15648231731787138e-19, - 1.60494162032269652e-36, 2.22730392507682967e-53), - qd_real( 1.38888888888888894e-03, -5.30054395437357706e-20, - -1.73868675534958776e-36, -1.63335621172300840e-52), - qd_real( 1.98412698412698413e-04, 1.72095582934207053e-22, - 1.49269123913941271e-40, 1.29470326746002471e-58), - qd_real( 2.48015873015873016e-05, 2.15119478667758816e-23, - 1.86586404892426588e-41, 1.61837908432503088e-59), - qd_real( 2.75573192239858925e-06, -1.85839327404647208e-22, - 8.49175460488199287e-39, -5.72661640789429621e-55), - qd_real( 2.75573192239858883e-07, 2.37677146222502973e-23, - -3.26318890334088294e-40, 1.61435111860404415e-56), - qd_real( 2.50521083854417202e-08, -1.44881407093591197e-24, - 2.04267351467144546e-41, -8.49632672007163175e-58), - qd_real( 2.08767569878681002e-09, -1.20734505911325997e-25, - 1.70222792889287100e-42, 1.41609532150396700e-58), - qd_real( 1.60590438368216133e-10, 1.25852945887520981e-26, - -5.31334602762985031e-43, 3.54021472597605528e-59), - qd_real( 1.14707455977297245e-11, 2.06555127528307454e-28, - 6.88907923246664603e-45, 5.72920002655109095e-61), - qd_real( 7.64716373181981641e-13, 7.03872877733453001e-30, - -7.82753927716258345e-48, 1.92138649443790242e-64), - qd_real( 4.77947733238738525e-14, 4.39920548583408126e-31, - -4.89221204822661465e-49, 1.20086655902368901e-65), - qd_real( 2.81145725434552060e-15, 1.65088427308614326e-31, - -2.87777179307447918e-50, 4.27110689256293549e-67) -}; - -qd_real exp(const qd_real &a) { - /* Strategy: We first reduce the size of x by noting that - - exp(kr + m * log(2)) = 2^m * exp(r)^k - - where m and k are integers. By choosing m appropriately - we can make |kr| <= log(2) / 2 = 0.347. Then exp(r) is - evaluated using the familiar Taylor series. Reducing the - argument substantially speeds up the convergence. */ - - const double k = ldexp(1.0, 16); - const double inv_k = 1.0 / k; - - if (a[0] <= -709.0) - return 0.0; - - if (a[0] >= 709.0) - return qd_real::_inf; - - if (a.is_zero()) - return 1.0; - - if (a.is_one()) - return qd_real::_e; - - double m = std::floor(a.x[0] / qd_real::_log2.x[0] + 0.5); - qd_real r = mul_pwr2(a - qd_real::_log2 * m, inv_k); - qd_real s, p, t; - double thresh = inv_k * qd_real::_eps; - - p = sqr(r); - s = r + mul_pwr2(p, 0.5); - int i = 0; - do { - p *= r; - t = p * inv_fact[i++]; - s += t; - } while (std::abs(to_double(t)) > thresh && i < 9); - - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s = mul_pwr2(s, 2.0) + sqr(s); - s += 1.0; - return ldexp(s, static_cast(m)); -} - -/* Logarithm. Computes log(x) in quad-double precision. - This is a natural logarithm (i.e., base e). */ -qd_real log(const qd_real &a) { - /* Strategy. The Taylor series for log converges much more - slowly than that of exp, due to the lack of the factorial - term in the denominator. Hence this routine instead tries - to determine the root of the function - - f(x) = exp(x) - a - - using Newton iteration. The iteration is given by - - x' = x - f(x)/f'(x) - = x - (1 - a * exp(-x)) - = x + a * exp(-x) - 1. - - Two iteration is needed, since Newton's iteration - approximately doubles the number of digits per iteration. */ - - if (a.is_one()) { - return 0.0; - } - - if (a[0] <= 0.0) { - qd_real::error("(qd_real::log): Non-positive argument."); - return qd_real::_nan; - } - - if (a[0] == 0.0) { - return -qd_real::_inf; - } - - qd_real x = std::log(a[0]); /* Initial approximation */ - - x = x + a * exp(-x) - 1.0; - x = x + a * exp(-x) - 1.0; - x = x + a * exp(-x) - 1.0; - - return x; -} - -qd_real log10(const qd_real &a) { - return log(a) / qd_real::_log10; -} - -static const qd_real _pi1024 = qd_real( - 3.067961575771282340e-03, 1.195944139792337116e-19, - -2.924579892303066080e-36, 1.086381075061880158e-52); - -/* Table of sin(k * pi/1024) and cos(k * pi/1024). */ -static const qd_real sin_table [] = { - qd_real( 3.0679567629659761e-03, 1.2690279085455925e-19, - 5.2879464245328389e-36, -1.7820334081955298e-52), - qd_real( 6.1358846491544753e-03, 9.0545257482474933e-20, - 1.6260113133745320e-37, -9.7492001208767410e-55), - qd_real( 9.2037547820598194e-03, -1.2136591693535934e-19, - 5.5696903949425567e-36, 1.2505635791936951e-52), - qd_real( 1.2271538285719925e-02, 6.9197907640283170e-19, - -4.0203726713435555e-36, -2.0688703606952816e-52), - qd_real( 1.5339206284988102e-02, -8.4462578865401696e-19, - 4.6535897505058629e-35, -1.3923682978570467e-51), - qd_real( 1.8406729905804820e-02, 7.4195533812833160e-19, - 3.9068476486787607e-35, 3.6393321292898614e-52), - qd_real( 2.1474080275469508e-02, -4.5407960207688566e-19, - -2.2031770119723005e-35, 1.2709814654833741e-51), - qd_real( 2.4541228522912288e-02, -9.1868490125778782e-20, - 4.8706148704467061e-36, -2.8153947855469224e-52), - qd_real( 2.7608145778965743e-02, -1.5932358831389269e-18, - -7.0475416242776030e-35, -2.7518494176602744e-51), - qd_real( 3.0674803176636626e-02, -1.6936054844107918e-20, - -2.0039543064442544e-36, -1.6267505108658196e-52), - qd_real( 3.3741171851377587e-02, -2.0096074292368340e-18, - -1.3548237016537134e-34, 6.5554881875899973e-51), - qd_real( 3.6807222941358832e-02, 6.1060088803529842e-19, - -4.0448721259852727e-35, -2.1111056765671495e-51), - qd_real( 3.9872927587739811e-02, 4.6657453481183289e-19, - 3.4119333562288684e-35, 2.4007534726187511e-51), - qd_real( 4.2938256934940820e-02, 2.8351940588660907e-18, - 1.6991309601186475e-34, 6.8026536098672629e-51), - qd_real( 4.6003182130914630e-02, -1.1182813940157788e-18, - 7.5235020270378946e-35, 4.1187304955493722e-52), - qd_real( 4.9067674327418015e-02, -6.7961037205182801e-19, - -4.4318868124718325e-35, -9.9376628132525316e-52), - qd_real( 5.2131704680283324e-02, -2.4243695291953779e-18, - -1.3675405320092298e-34, -8.3938137621145070e-51), - qd_real( 5.5195244349689941e-02, -1.3340299860891103e-18, - -3.4359574125665608e-35, 1.1911462755409369e-51), - qd_real( 5.8258264500435759e-02, 2.3299905496077492e-19, - 1.9376108990628660e-36, -5.1273775710095301e-53), - qd_real( 6.1320736302208578e-02, -5.1181134064638108e-19, - -4.2726335866706313e-35, 2.6368495557440691e-51), - qd_real( 6.4382630929857465e-02, -4.2325997000052705e-18, - 3.3260117711855937e-35, 1.4736267706718352e-51), - qd_real( 6.7443919563664065e-02, -6.9221796556983636e-18, - 1.5909286358911040e-34, -7.8828946891835218e-51), - qd_real( 7.0504573389613870e-02, -6.8552791107342883e-18, - -1.9961177630841580e-34, 2.0127129580485300e-50), - qd_real( 7.3564563599667426e-02, -2.7784941506273593e-18, - -9.1240375489852821e-35, -1.9589752023546795e-51), - qd_real( 7.6623861392031492e-02, 2.3253700287958801e-19, - -1.3186083921213440e-36, -4.9927872608099673e-53), - qd_real( 7.9682437971430126e-02, -4.4867664311373041e-18, - 2.8540789143650264e-34, 2.8491348583262741e-51), - qd_real( 8.2740264549375692e-02, 1.4735983530877760e-18, - 3.7284093452233713e-35, 2.9024430036724088e-52), - qd_real( 8.5797312344439894e-02, -3.3881893830684029e-18, - -1.6135529531508258e-34, 7.7294651620588049e-51), - qd_real( 8.8853552582524600e-02, -3.7501775830290691e-18, - 3.7543606373911573e-34, 2.2233701854451859e-50), - qd_real( 9.1908956497132724e-02, 4.7631594854274564e-18, - 1.5722874642939344e-34, -4.8464145447831456e-51), - qd_real( 9.4963495329639006e-02, -6.5885886400417564e-18, - -2.1371116991641965e-34, 1.3819370559249300e-50), - qd_real( 9.8017140329560604e-02, -1.6345823622442560e-18, - -1.3209238810006454e-35, -3.5691060049117942e-52), - qd_real( 1.0106986275482782e-01, 3.3164325719308656e-18, - -1.2004224885132282e-34, 7.2028828495418631e-51), - qd_real( 1.0412163387205457e-01, 6.5760254085385100e-18, - 1.7066246171219214e-34, -4.9499340996893514e-51), - qd_real( 1.0717242495680884e-01, 6.4424044279026198e-18, - -8.3956976499698139e-35, -4.0667730213318321e-51), - qd_real( 1.1022220729388306e-01, -5.6789503537823233e-19, - 1.0380274792383233e-35, 1.5213997918456695e-52), - qd_real( 1.1327095217756435e-01, 2.7100481012132900e-18, - 1.5323292999491619e-35, 4.9564432810360879e-52), - qd_real( 1.1631863091190477e-01, 1.0294914877509705e-18, - -9.3975734948993038e-35, 1.3534827323719708e-52), - qd_real( 1.1936521481099137e-01, -3.9500089391898506e-18, - 3.5317349978227311e-34, 1.8856046807012275e-51), - qd_real( 1.2241067519921620e-01, 2.8354501489965335e-18, - 1.8151655751493305e-34, -2.8716592177915192e-51), - qd_real( 1.2545498341154623e-01, 4.8686751763148235e-18, - 5.9878105258097936e-35, -3.3534629098722107e-51), - qd_real( 1.2849811079379317e-01, 3.8198603954988802e-18, - -1.8627501455947798e-34, -2.4308161133527791e-51), - qd_real( 1.3154002870288312e-01, -5.0039708262213813e-18, - -1.2983004159245552e-34, -4.6872034915794122e-51), - qd_real( 1.3458070850712620e-01, -9.1670359171480699e-18, - 1.5916493007073973e-34, 4.0237002484366833e-51), - qd_real( 1.3762012158648604e-01, 6.6253255866774482e-18, - -2.3746583031401459e-34, -9.3703876173093250e-52), - qd_real( 1.4065823933284924e-01, -7.9193932965524741e-18, - 6.0972464202108397e-34, 2.4566623241035797e-50), - qd_real( 1.4369503315029444e-01, 1.1472723016618666e-17, - -5.1884954557576435e-35, -4.2220684832186607e-51), - qd_real( 1.4673047445536175e-01, 3.7269471470465677e-18, - 3.7352398151250827e-34, -4.0881822289508634e-51), - qd_real( 1.4976453467732151e-01, 8.0812114131285151e-18, - 1.2979142554917325e-34, 9.9380667487736254e-51), - qd_real( 1.5279718525844344e-01, -7.6313573938416838e-18, - 5.7714690450284125e-34, -3.7731132582986687e-50), - qd_real( 1.5582839765426523e-01, 3.0351307187678221e-18, - -1.0976942315176184e-34, 7.8734647685257867e-51), - qd_real( 1.5885814333386145e-01, -4.0163200573859079e-18, - -9.2840580257628812e-35, -2.8567420029274875e-51), - qd_real( 1.6188639378011183e-01, 1.1850519643573528e-17, - -5.0440990519162957e-34, 3.0510028707928009e-50), - qd_real( 1.6491312048996992e-01, -7.0405288319166738e-19, - 3.3211107491245527e-35, 8.6663299254686031e-52), - qd_real( 1.6793829497473117e-01, 5.4284533721558139e-18, - -3.3263339336181369e-34, -1.8536367335123848e-50), - qd_real( 1.7096188876030122e-01, 9.1919980181759094e-18, - -6.7688743940982606e-34, -1.0377711384318389e-50), - qd_real( 1.7398387338746382e-01, 5.8151994618107928e-18, - -1.6751014298301606e-34, -6.6982259797164963e-51), - qd_real( 1.7700422041214875e-01, 6.7329300635408167e-18, - 2.8042736644246623e-34, 3.6786888232793599e-51), - qd_real( 1.8002290140569951e-01, 7.9701826047392143e-18, - -7.0765920110524977e-34, 1.9622512608461784e-50), - qd_real( 1.8303988795514095e-01, 7.7349918688637383e-18, - -4.4803769968145083e-34, 1.1201148793328890e-50), - qd_real( 1.8605515166344666e-01, -1.2564893007679552e-17, - 7.5953844248530810e-34, -3.8471695132415039e-51), - qd_real( 1.8906866414980622e-01, -7.6208955803527778e-18, - -4.4792298656662981e-34, -4.4136824096645007e-50), - qd_real( 1.9208039704989244e-01, 4.3348343941174903e-18, - -2.3404121848139937e-34, 1.5789970962611856e-50), - qd_real( 1.9509032201612828e-01, -7.9910790684617313e-18, - 6.1846270024220713e-34, -3.5840270918032937e-50), - qd_real( 1.9809841071795359e-01, -1.8434411800689445e-18, - 1.4139031318237285e-34, 1.0542811125343809e-50), - qd_real( 2.0110463484209190e-01, 1.1010032669300739e-17, - -3.9123576757413791e-34, 2.4084852500063531e-51), - qd_real( 2.0410896609281687e-01, 6.0941297773957752e-18, - -2.8275409970449641e-34, 4.6101008563532989e-51), - qd_real( 2.0711137619221856e-01, -1.0613362528971356e-17, - 2.2456805112690884e-34, 1.3483736125280904e-50), - qd_real( 2.1011183688046961e-01, 1.1561548476512844e-17, - 6.0355905610401254e-34, 3.3329909618405675e-50), - qd_real( 2.1311031991609136e-01, 1.2031873821063860e-17, - -3.4142699719695635e-34, -1.2436262780241778e-50), - qd_real( 2.1610679707621952e-01, -1.0111196082609117e-17, - 7.2789545335189643e-34, -2.9347540365258610e-50), - qd_real( 2.1910124015686980e-01, -3.6513812299150776e-19, - -2.3359499418606442e-35, 3.1785298198458653e-52), - qd_real( 2.2209362097320354e-01, -3.0337210995812162e-18, - 6.6654668033632998e-35, 2.0110862322656942e-51), - qd_real( 2.2508391135979283e-01, 3.9507040822556510e-18, - 2.4287993958305375e-35, 5.6662797513020322e-52), - qd_real( 2.2807208317088573e-01, 8.2361837339258012e-18, - 6.9786781316397937e-34, -6.4122962482639504e-51), - qd_real( 2.3105810828067111e-01, 1.0129787149761869e-17, - -6.9359234615816044e-34, -2.8877355604883782e-50), - qd_real( 2.3404195858354343e-01, -6.9922402696101173e-18, - -5.7323031922750280e-34, 5.3092579966872727e-51), - qd_real( 2.3702360599436720e-01, 8.8544852285039918e-18, - 1.3588480826354134e-34, 1.0381022520213867e-50), - qd_real( 2.4000302244874150e-01, -1.2137758975632164e-17, - -2.6448807731703891e-34, -1.9929733800670473e-51), - qd_real( 2.4298017990326390e-01, -8.7514315297196632e-18, - -6.5723260373079431e-34, -1.0333158083172177e-50), - qd_real( 2.4595505033579462e-01, -1.1129044052741832e-17, - 4.3805998202883397e-34, 1.2219399554686291e-50), - qd_real( 2.4892760574572018e-01, -8.1783436100020990e-18, - 5.5666875261111840e-34, 3.8080473058748167e-50), - qd_real( 2.5189781815421697e-01, -1.7591436032517039e-17, - -1.0959681232525285e-33, 5.6209426020232456e-50), - qd_real( 2.5486565960451457e-01, -1.3602299806901461e-19, - -6.0073844642762535e-36, -3.0072751311893878e-52), - qd_real( 2.5783110216215899e-01, 1.8480038630879957e-17, - 3.3201664714047599e-34, -5.5547819290576764e-51), - qd_real( 2.6079411791527551e-01, 4.2721420983550075e-18, - 5.6782126934777920e-35, 3.1428338084365397e-51), - qd_real( 2.6375467897483140e-01, -1.8837947680038700e-17, - 1.3720129045754794e-33, -8.2763406665966033e-50), - qd_real( 2.6671275747489837e-01, 2.0941222578826688e-17, - -1.1303466524727989e-33, 1.9954224050508963e-50), - qd_real( 2.6966832557291509e-01, 1.5765657618133259e-17, - -6.9696142173370086e-34, -4.0455346879146776e-50), - qd_real( 2.7262135544994898e-01, 7.8697166076387850e-18, - 6.6179388602933372e-35, -2.7642903696386267e-51), - qd_real( 2.7557181931095814e-01, 1.9320328962556582e-17, - 1.3932094180100280e-33, 1.3617253920018116e-50), - qd_real( 2.7851968938505312e-01, -1.0030273719543544e-17, - 7.2592115325689254e-34, -1.0068516296655851e-50), - qd_real( 2.8146493792575800e-01, -1.2322299641274009e-17, - -1.0564788706386435e-34, 7.5137424251265885e-51), - qd_real( 2.8440753721127182e-01, 2.2209268510661475e-17, - -9.1823095629523708e-34, -5.2192875308892218e-50), - qd_real( 2.8734745954472951e-01, 1.5461117367645717e-17, - -6.3263973663444076e-34, -2.2982538416476214e-50), - qd_real( 2.9028467725446239e-01, -1.8927978707774251e-17, - 1.1522953157142315e-33, 7.4738655654716596e-50), - qd_real( 2.9321916269425863e-01, 2.2385430811901833e-17, - 1.3662484646539680e-33, -4.2451325253996938e-50), - qd_real( 2.9615088824362384e-01, -2.0220736360876938e-17, - -7.9252212533920413e-35, -2.8990577729572470e-51), - qd_real( 2.9907982630804048e-01, 1.6701181609219447e-18, - 8.6091151117316292e-35, 3.9931286230012102e-52), - qd_real( 3.0200594931922808e-01, -1.7167666235262474e-17, - 2.3336182149008069e-34, 8.3025334555220004e-51), - qd_real( 3.0492922973540243e-01, -2.2989033898191262e-17, - -1.4598901099661133e-34, 3.7760487693121827e-51), - qd_real( 3.0784964004153487e-01, 2.7074088527245185e-17, - 1.2568858206899284e-33, 7.2931815105901645e-50), - qd_real( 3.1076715274961147e-01, 2.0887076364048513e-17, - -3.0130590791065942e-34, 1.3876739009935179e-51), - qd_real( 3.1368174039889146e-01, 1.4560447299968912e-17, - 3.6564186898011595e-34, 1.1654264734999375e-50), - qd_real( 3.1659337555616585e-01, 2.1435292512726283e-17, - 1.2338169231377316e-33, 3.3963542100989293e-50), - qd_real( 3.1950203081601569e-01, -1.3981562491096626e-17, - 8.1730000697411350e-34, -7.7671096270210952e-50), - qd_real( 3.2240767880106985e-01, -4.0519039937959398e-18, - 3.7438302780296796e-34, 8.7936731046639195e-51), - qd_real( 3.2531029216226293e-01, 7.9171249463765892e-18, - -6.7576622068146391e-35, 2.3021655066929538e-51), - qd_real( 3.2820984357909255e-01, -2.6693140719641896e-17, - 7.8928851447534788e-34, 2.5525163821987809e-51), - qd_real( 3.3110630575987643e-01, -2.7469465474778694e-17, - -1.3401245916610206e-33, 6.5531762489976163e-50), - qd_real( 3.3399965144200938e-01, 2.2598986806288142e-17, - 7.8063057192586115e-34, 2.0427600895486683e-50), - qd_real( 3.3688985339222005e-01, -4.2000940033475092e-19, - -2.9178652969985438e-36, -1.1597376437036749e-52), - qd_real( 3.3977688440682685e-01, 6.6028679499418282e-18, - 1.2575009988669683e-34, 2.5569067699008304e-51), - qd_real( 3.4266071731199438e-01, 1.9261518449306319e-17, - -9.2754189135990867e-34, 8.5439996687390166e-50), - qd_real( 3.4554132496398904e-01, 2.7251143672916123e-17, - 7.0138163601941737e-34, -1.4176292197454015e-50), - qd_real( 3.4841868024943456e-01, 3.6974420514204918e-18, - 3.5532146878499996e-34, 1.9565462544501322e-50), - qd_real( 3.5129275608556715e-01, -2.2670712098795844e-17, - -1.6994216673139631e-34, -1.2271556077284517e-50), - qd_real( 3.5416352542049040e-01, -1.6951763305764860e-17, - 1.2772331777814617e-33, -3.3703785435843310e-50), - qd_real( 3.5703096123343003e-01, -4.8218191137919166e-19, - -4.1672436994492361e-35, -7.1531167149364352e-52), - qd_real( 3.5989503653498817e-01, -1.7601687123839282e-17, - 1.3375125473046791e-33, 7.9467815593584340e-50), - qd_real( 3.6275572436739723e-01, -9.1668352663749849e-18, - -7.4317843956936735e-34, -2.0199582511804564e-50), - qd_real( 3.6561299780477385e-01, 1.6217898770457546e-17, - 1.1286970151961055e-33, -7.1825287318139010e-50), - qd_real( 3.6846682995337232e-01, 1.0463640796159268e-17, - 2.0554984738517304e-35, 1.0441861305618769e-51), - qd_real( 3.7131719395183754e-01, 3.4749239648238266e-19, - -7.5151053042866671e-37, -2.8153468438650851e-53), - qd_real( 3.7416406297145799e-01, 8.0114103761962118e-18, - 5.3429599813406052e-34, 1.0351378796539210e-50), - qd_real( 3.7700741021641826e-01, -2.7255302041956930e-18, - 6.3646586445018137e-35, 8.3048657176503559e-52), - qd_real( 3.7984720892405116e-01, 9.9151305855172370e-18, - 4.8761409697224886e-34, 1.4025084000776705e-50), - qd_real( 3.8268343236508978e-01, -1.0050772696461588e-17, - -2.0605316302806695e-34, -1.2717724698085205e-50), - qd_real( 3.8551605384391885e-01, 1.5177665396472313e-17, - 1.4198230518016535e-33, 5.8955167159904235e-50), - qd_real( 3.8834504669882630e-01, -1.0053770598398717e-17, - 7.5942999255057131e-34, -3.1967974046654219e-50), - qd_real( 3.9117038430225387e-01, 1.7997787858243995e-17, - -1.0613482402609856e-33, -5.4582148817791032e-50), - qd_real( 3.9399204006104810e-01, 9.7649241641239336e-18, - -2.1233599441284617e-34, -5.5529836795340819e-51), - qd_real( 3.9680998741671031e-01, 2.0545063670840126e-17, - 6.1347058801922842e-34, 1.0733788150636430e-50), - qd_real( 3.9962419984564684e-01, -1.5065497476189372e-17, - -9.9653258881867298e-34, -5.7524323712725355e-50), - qd_real( 4.0243465085941843e-01, 1.0902619339328270e-17, - 7.3998528125989765e-34, 2.2745784806823499e-50), - qd_real( 4.0524131400498986e-01, 9.9111401942899884e-18, - -2.5169070895434648e-34, 9.2772984818436573e-53), - qd_real( 4.0804416286497869e-01, -7.0006015137351311e-18, - -1.4108207334268228e-34, 1.5175546997577136e-52), - qd_real( 4.1084317105790397e-01, -2.4219835190355499e-17, - -1.1418902925313314e-33, -2.0996843165093468e-50), - qd_real( 4.1363831223843456e-01, -1.0393984940597871e-17, - -1.1481681174503880e-34, -2.0281052851028680e-51), - qd_real( 4.1642956009763721e-01, -2.5475580413131732e-17, - -3.4482678506112824e-34, 7.1788619351865480e-51), - qd_real( 4.1921688836322396e-01, -4.2232463750110590e-18, - -3.6053023045255790e-34, -2.2209673210025631e-50), - qd_real( 4.2200027079979968e-01, 4.3543266994128527e-18, - 3.1734310272251190e-34, -1.3573247980738668e-50), - qd_real( 4.2477968120910881e-01, 2.7462312204277281e-17, - -4.6552847802111948e-34, 6.5961781099193122e-51), - qd_real( 4.2755509343028208e-01, 9.4111898162954726e-18, - -1.7446682426598801e-34, -2.2054492626480169e-51), - qd_real( 4.3032648134008261e-01, 2.2259686974092690e-17, - 8.5972591314085075e-34, -2.9420897889003020e-50), - qd_real( 4.3309381885315196e-01, 1.1224283329847517e-17, - 5.3223748041075651e-35, 5.3926192627014212e-51), - qd_real( 4.3585707992225547e-01, 1.6230515450644527e-17, - -6.4371449063579431e-35, -6.9102436481386757e-51), - qd_real( 4.3861623853852766e-01, -2.0883315831075090e-17, - -1.4259583540891877e-34, 6.3864763590657077e-52), - qd_real( 4.4137126873171667e-01, 2.2360783886964969e-17, - 1.1864769603515770e-34, -3.8087003266189232e-51), - qd_real( 4.4412214457042926e-01, -2.4218874422178315e-17, - 2.2205230838703907e-34, 9.2133035911356258e-51), - qd_real( 4.4686884016237421e-01, -1.9222136142309382e-17, - -4.4425678589732049e-35, -1.3673609292149535e-51), - qd_real( 4.4961132965460660e-01, 4.8831924232035243e-18, - 2.7151084498191381e-34, -1.5653993171613154e-50), - qd_real( 4.5234958723377089e-01, -1.4827977472196122e-17, - -7.6947501088972324e-34, 1.7656856882031319e-50), - qd_real( 4.5508358712634384e-01, -1.2379906758116472e-17, - 5.5289688955542643e-34, -8.5382312840209386e-51), - qd_real( 4.5781330359887723e-01, -8.4554254922295949e-18, - -6.3770394246764263e-34, 3.1778253575564249e-50), - qd_real( 4.6053871095824001e-01, 1.8488777492177872e-17, - -1.0527732154209725e-33, 3.3235593490947102e-50), - qd_real( 4.6325978355186020e-01, -7.3514924533231707e-18, - 6.7175396881707035e-34, 3.9594127612123379e-50), - qd_real( 4.6597649576796618e-01, -3.3023547778235135e-18, - 3.4904677050476886e-35, 3.4483855263874246e-51), - qd_real( 4.6868882203582796e-01, -2.2949251681845054e-17, - -1.1364757641823658e-33, 6.8840522501918612e-50), - qd_real( 4.7139673682599764e-01, 6.5166781360690130e-18, - 2.9457546966235984e-34, -6.2159717738836630e-51), - qd_real( 4.7410021465055002e-01, -8.1451601548978075e-18, - -3.4789448555614422e-34, -1.1681943974658508e-50), - qd_real( 4.7679923006332214e-01, -1.0293515338305794e-17, - -3.6582045008369952e-34, 1.7424131479176475e-50), - qd_real( 4.7949375766015301e-01, 1.8419999662684771e-17, - -1.3040838621273312e-33, 1.0977131822246471e-50), - qd_real( 4.8218377207912277e-01, -2.5861500925520442e-17, - -6.2913197606500007e-36, 4.0802359808684726e-52), - qd_real( 4.8486924800079112e-01, -1.8034004203262245e-17, - -3.5244276906958044e-34, -1.7138318654749246e-50), - qd_real( 4.8755016014843594e-01, 1.4231090931273653e-17, - -1.8277733073262697e-34, -1.5208291790429557e-51), - qd_real( 4.9022648328829116e-01, -5.1496145643440404e-18, - -3.6903027405284104e-34, 1.5172940095151304e-50), - qd_real( 4.9289819222978404e-01, -1.0257831676562186e-18, - 6.9520817760885069e-35, -2.4260961214090389e-51), - qd_real( 4.9556526182577254e-01, -9.4323241942365362e-18, - 3.1212918657699143e-35, 4.2009072375242736e-52), - qd_real( 4.9822766697278187e-01, -1.6126383830540798e-17, - -1.5092897319298871e-33, 1.1049298890895917e-50), - qd_real( 5.0088538261124083e-01, -3.9604015147074639e-17, - -2.2208395201898007e-33, 1.3648202735839417e-49), - qd_real( 5.0353838372571758e-01, -1.6731308204967497e-17, - -1.0140233644074786e-33, 4.0953071937671477e-50), - qd_real( 5.0618664534515534e-01, -4.8321592986493711e-17, - 9.2858107226642252e-34, 4.2699802401037005e-50), - qd_real( 5.0883014254310699e-01, 4.7836968268014130e-17, - -1.0727022928806035e-33, 2.7309374513672757e-50), - qd_real( 5.1146885043797041e-01, -1.3088001221007579e-17, - 4.0929033363366899e-34, -3.7952190153477926e-50), - qd_real( 5.1410274419322177e-01, -4.5712707523615624e-17, - 1.5488279442238283e-33, -2.5853959305521130e-50), - qd_real( 5.1673179901764987e-01, 8.3018617233836515e-18, - 5.8251027467695202e-34, -2.2812397190535076e-50), - qd_real( 5.1935599016558964e-01, -5.5331248144171145e-17, - -3.1628375609769026e-35, -2.4091972051188571e-51), - qd_real( 5.2197529293715439e-01, -4.6555795692088883e-17, - 4.6378980936850430e-34, -3.3470542934689532e-51), - qd_real( 5.2458968267846895e-01, -4.3068869040082345e-17, - -4.2013155291932055e-34, -1.5096069926700274e-50), - qd_real( 5.2719913478190139e-01, -4.2202983480560619e-17, - 8.5585916184867295e-34, 7.9974339336732307e-50), - qd_real( 5.2980362468629472e-01, -4.8067841706482342e-17, - 5.8309721046630296e-34, -8.9740761521756660e-51), - qd_real( 5.3240312787719801e-01, -4.1020306135800895e-17, - -1.9239996374230821e-33, -1.5326987913812184e-49), - qd_real( 5.3499761988709726e-01, -5.3683132708358134e-17, - -1.3900569918838112e-33, 2.7154084726474092e-50), - qd_real( 5.3758707629564551e-01, -2.2617365388403054e-17, - -5.9787279033447075e-34, 3.1204419729043625e-51), - qd_real( 5.4017147272989285e-01, 2.7072447965935839e-17, - 1.1698799709213829e-33, -5.9094668515881500e-50), - qd_real( 5.4275078486451589e-01, 1.7148261004757101e-17, - -1.3525905925200870e-33, 4.9724411290727323e-50), - qd_real( 5.4532498842204646e-01, -4.1517817538384258e-17, - -1.5318930219385941e-33, 6.3629921101413974e-50), - qd_real( 5.4789405917310019e-01, -2.4065878297113363e-17, - -3.5639213669362606e-36, -2.6013270854271645e-52), - qd_real( 5.5045797293660481e-01, -8.3319903015807663e-18, - -2.3058454035767633e-34, -2.1611290432369010e-50), - qd_real( 5.5301670558002758e-01, -4.7061536623798204e-17, - -1.0617111545918056e-33, -1.6196316144407379e-50), - qd_real( 5.5557023301960218e-01, 4.7094109405616768e-17, - -2.0640520383682921e-33, 1.2290163188567138e-49), - qd_real( 5.5811853122055610e-01, 1.3481176324765226e-17, - -5.5016743873011438e-34, -2.3484822739335416e-50), - qd_real( 5.6066157619733603e-01, -7.3956418153476152e-18, - 3.9680620611731193e-34, 3.1995952200836223e-50), - qd_real( 5.6319934401383409e-01, 2.3835775146854829e-17, - 1.3511793173769814e-34, 9.3201311581248143e-51), - qd_real( 5.6573181078361323e-01, -3.4096079596590466e-17, - -1.7073289744303546e-33, 8.9147089975404507e-50), - qd_real( 5.6825895267013160e-01, -5.0935673642769248e-17, - -1.6274356351028249e-33, 9.8183151561702966e-51), - qd_real( 5.7078074588696726e-01, 2.4568151455566208e-17, - -1.2844481247560350e-33, -1.8037634376936261e-50), - qd_real( 5.7329716669804220e-01, 8.5176611669306400e-18, - -6.4443208788026766e-34, 2.2546105543273003e-50), - qd_real( 5.7580819141784534e-01, -3.7909495458942734e-17, - -2.7433738046854309e-33, 1.1130841524216795e-49), - qd_real( 5.7831379641165559e-01, -2.6237691512372831e-17, - 1.3679051680738167e-33, -3.1409808935335900e-50), - qd_real( 5.8081395809576453e-01, 1.8585338586613408e-17, - 2.7673843114549181e-34, 1.9605349619836937e-50), - qd_real( 5.8330865293769829e-01, 3.4516601079044858e-18, - 1.8065977478946306e-34, -6.3953958038544646e-51), - qd_real( 5.8579785745643886e-01, -3.7485501964311294e-18, - 2.7965403775536614e-34, -7.1816936024157202e-51), - qd_real( 5.8828154822264533e-01, -2.9292166725006846e-17, - -2.3744954603693934e-33, -1.1571631191512480e-50), - qd_real( 5.9075970185887428e-01, -4.7013584170659542e-17, - 2.4808417611768356e-33, 1.2598907673643198e-50), - qd_real( 5.9323229503979980e-01, 1.2892320944189053e-17, - 5.3058364776359583e-34, 4.1141674699390052e-50), - qd_real( 5.9569930449243336e-01, -1.3438641936579467e-17, - -6.7877687907721049e-35, -5.6046937531684890e-51), - qd_real( 5.9816070699634227e-01, 3.8801885783000657e-17, - -1.2084165858094663e-33, -4.0456610843430061e-50), - qd_real( 6.0061647938386897e-01, -4.6398198229461932e-17, - -1.6673493003710801e-33, 5.1982824378491445e-50), - qd_real( 6.0306659854034816e-01, 3.7323357680559650e-17, - 2.7771920866974305e-33, -1.6194229649742458e-49), - qd_real( 6.0551104140432555e-01, -3.1202672493305677e-17, - 1.2761267338680916e-33, -4.0859368598379647e-50), - qd_real( 6.0794978496777363e-01, 3.5160832362096660e-17, - -2.5546242776778394e-34, -1.4085313551220694e-50), - qd_real( 6.1038280627630948e-01, -2.2563265648229169e-17, - 1.3185575011226730e-33, 8.2316691420063460e-50), - qd_real( 6.1281008242940971e-01, -4.2693476568409685e-18, - 2.5839965886650320e-34, 1.6884412005622537e-50), - qd_real( 6.1523159058062682e-01, 2.6231417767266950e-17, - -1.4095366621106716e-33, 7.2058690491304558e-50), - qd_real( 6.1764730793780398e-01, -4.7478594510902452e-17, - -7.2986558263123996e-34, -3.0152327517439154e-50), - qd_real( 6.2005721176328921e-01, -2.7983410837681118e-17, - 1.1649951056138923e-33, -5.4539089117135207e-50), - qd_real( 6.2246127937414997e-01, 5.2940728606573002e-18, - -4.8486411215945827e-35, 1.2696527641980109e-52), - qd_real( 6.2485948814238634e-01, 3.3671846037243900e-17, - -2.7846053391012096e-33, 5.6102718120012104e-50), - qd_real( 6.2725181549514408e-01, 3.0763585181253225e-17, - 2.7068930273498138e-34, -1.1172240309286484e-50), - qd_real( 6.2963823891492698e-01, 4.1115334049626806e-17, - -1.9167473580230747e-33, 1.1118424028161730e-49), - qd_real( 6.3201873593980906e-01, -4.0164942296463612e-17, - -7.2208643641736723e-34, 3.7828920470544344e-50), - qd_real( 6.3439328416364549e-01, 1.0420901929280035e-17, - 4.1174558929280492e-34, -1.4464152986630705e-51), - qd_real( 6.3676186123628420e-01, 3.1419048711901611e-17, - -2.2693738415126449e-33, -1.6023584204297388e-49), - qd_real( 6.3912444486377573e-01, 1.2416796312271043e-17, - -6.2095419626356605e-34, 2.7762065999506603e-50), - qd_real( 6.4148101280858316e-01, -9.9883430115943310e-18, - 4.1969230376730128e-34, 5.6980543799257597e-51), - qd_real( 6.4383154288979150e-01, -3.2084798795046886e-17, - -1.2595311907053305e-33, -4.0205885230841536e-50), - qd_real( 6.4617601298331639e-01, -2.9756137382280815e-17, - -1.0275370077518259e-33, 8.0852478665893014e-51), - qd_real( 6.4851440102211244e-01, 3.9870270313386831e-18, - 1.9408388509540788e-34, -5.1798420636193190e-51), - qd_real( 6.5084668499638088e-01, 3.9714670710500257e-17, - 2.9178546787002963e-34, 3.8140635508293278e-51), - qd_real( 6.5317284295377676e-01, 8.5695642060026238e-18, - -6.9165322305070633e-34, 2.3873751224185395e-50), - qd_real( 6.5549285299961535e-01, 3.5638734426385005e-17, - 1.2695365790889811e-33, 4.3984952865412050e-50), - qd_real( 6.5780669329707864e-01, 1.9580943058468545e-17, - -1.1944272256627192e-33, 2.8556402616436858e-50), - qd_real( 6.6011434206742048e-01, -1.3960054386823638e-19, - 6.1515777931494047e-36, 5.3510498875622660e-52), - qd_real( 6.6241577759017178e-01, -2.2615508885764591e-17, - 5.0177050318126862e-34, 2.9162532399530762e-50), - qd_real( 6.6471097820334490e-01, -3.6227793598034367e-17, - -9.0607934765540427e-34, 3.0917036342380213e-50), - qd_real( 6.6699992230363747e-01, 3.5284364997428166e-17, - -1.0382057232458238e-33, 7.3812756550167626e-50), - qd_real( 6.6928258834663612e-01, -5.4592652417447913e-17, - -2.5181014709695152e-33, -1.6867875999437174e-49), - qd_real( 6.7155895484701844e-01, -4.0489037749296692e-17, - 3.1995835625355681e-34, -1.4044414655670960e-50), - qd_real( 6.7382900037875604e-01, 2.3091901236161086e-17, - 5.7428037192881319e-34, 1.1240668354625977e-50), - qd_real( 6.7609270357531592e-01, 3.7256902248049466e-17, - 1.7059417895764375e-33, 9.7326347795300652e-50), - qd_real( 6.7835004312986147e-01, 1.8302093041863122e-17, - 9.5241675746813072e-34, 5.0328101116133503e-50), - qd_real( 6.8060099779545302e-01, 2.8473293354522047e-17, - 4.1331805977270903e-34, 4.2579030510748576e-50), - qd_real( 6.8284554638524808e-01, -1.2958058061524531e-17, - 1.8292386959330698e-34, 3.4536209116044487e-51), - qd_real( 6.8508366777270036e-01, 2.5948135194645137e-17, - -8.5030743129500702e-34, -6.9572086141009930e-50), - qd_real( 6.8731534089175916e-01, -5.5156158714917168e-17, - 1.1896489854266829e-33, -7.8505896218220662e-51), - qd_real( 6.8954054473706694e-01, -1.5889323294806790e-17, - 9.1242356240205712e-34, 3.8315454152267638e-50), - qd_real( 6.9175925836415775e-01, 2.7406078472410668e-17, - 1.3286508943202092e-33, 1.0651869129580079e-51), - qd_real( 6.9397146088965400e-01, 7.4345076956280137e-18, - 7.5061528388197460e-34, -1.5928000240686583e-50), - qd_real( 6.9617713149146299e-01, -4.1224081213582889e-17, - -3.1838716762083291e-35, -3.9625587412119131e-51), - qd_real( 6.9837624940897280e-01, 4.8988282435667768e-17, - 1.9134010413244152e-33, 2.6161153243793989e-50), - qd_real( 7.0056879394324834e-01, 3.1027960192992922e-17, - 9.5638250509179997e-34, 4.5896916138107048e-51), - qd_real( 7.0275474445722530e-01, 2.5278294383629822e-18, - -8.6985561210674942e-35, -5.6899862307812990e-51), - qd_real( 7.0493408037590488e-01, 2.7608725585748502e-17, - 2.9816599471629137e-34, 1.1533044185111206e-50), - qd_real( 7.0710678118654757e-01, -4.8336466567264567e-17, - 2.0693376543497068e-33, 2.4677734957341755e-50) -}; - -static const qd_real cos_table [] = { - qd_real( 9.9999529380957619e-01, -1.9668064285322189e-17, - -6.3053955095883481e-34, 5.3266110855726731e-52), - qd_real( 9.9998117528260111e-01, 3.3568103522895585e-17, - -1.4740132559368063e-35, 9.8603097594755596e-52), - qd_real( 9.9995764455196390e-01, -3.1527836866647287e-17, - 2.6363251186638437e-33, 1.0007504815488399e-49), - qd_real( 9.9992470183914450e-01, 3.7931082512668012e-17, - -8.5099918660501484e-35, -4.9956973223295153e-51), - qd_real( 9.9988234745421256e-01, -3.5477814872408538e-17, - 1.7102001035303974e-33, -1.0725388519026542e-49), - qd_real( 9.9983058179582340e-01, 1.8825140517551119e-17, - -5.1383513457616937e-34, -3.8378827995403787e-50), - qd_real( 9.9976940535121528e-01, 4.2681177032289012e-17, - 1.9062302359737099e-33, -6.0221153262881160e-50), - qd_real( 9.9969881869620425e-01, -2.9851486403799753e-17, - -1.9084787370733737e-33, 5.5980260344029202e-51), - qd_real( 9.9961882249517864e-01, -4.1181965521424734e-17, - 2.0915365593699916e-33, 8.1403390920903734e-50), - qd_real( 9.9952941750109314e-01, 2.0517917823755591e-17, - -4.7673802585706520e-34, -2.9443604198656772e-50), - qd_real( 9.9943060455546173e-01, 3.9644497752257798e-17, - -2.3757223716722428e-34, -1.2856759011361726e-51), - qd_real( 9.9932238458834954e-01, -4.2858538440845682e-17, - 3.3235101605146565e-34, -8.3554272377057543e-51), - qd_real( 9.9920475861836389e-01, 9.1796317110385693e-18, - 5.5416208185868570e-34, 8.0267046717615311e-52), - qd_real( 9.9907772775264536e-01, 2.1419007653587032e-17, - -7.9048203318529618e-34, -5.3166296181112712e-50), - qd_real( 9.9894129318685687e-01, -2.0610641910058638e-17, - -1.2546525485913485e-33, -7.5175888806157064e-50), - qd_real( 9.9879545620517241e-01, -1.2291693337075465e-17, - 2.4468446786491271e-34, 1.0723891085210268e-50), - qd_real( 9.9864021818026527e-01, -4.8690254312923302e-17, - -2.9470881967909147e-34, -1.3000650761346907e-50), - qd_real( 9.9847558057329477e-01, -2.2002931182778795e-17, - -1.2371509454944992e-33, -2.4911225131232065e-50), - qd_real( 9.9830154493389289e-01, -5.1869402702792278e-17, - 1.0480195493633452e-33, -2.8995649143155511e-50), - qd_real( 9.9811811290014918e-01, 2.7935487558113833e-17, - 2.4423341255830345e-33, -6.7646699175334417e-50), - qd_real( 9.9792528619859600e-01, 1.7143659778886362e-17, - 5.7885840902887460e-34, -9.2601432603894597e-51), - qd_real( 9.9772306664419164e-01, -2.6394475274898721e-17, - -1.6176223087661783e-34, -9.9924942889362281e-51), - qd_real( 9.9751145614030345e-01, 5.6007205919806937e-18, - -5.9477673514685690e-35, -1.4166807162743627e-54), - qd_real( 9.9729045667869021e-01, 9.1647695371101735e-18, - 6.7824134309739296e-34, -8.6191392795543357e-52), - qd_real( 9.9706007033948296e-01, 1.6734093546241963e-17, - -1.3169951440780028e-33, 1.0311048767952477e-50), - qd_real( 9.9682029929116567e-01, 4.7062820708615655e-17, - 2.8412041076474937e-33, -8.0006155670263622e-50), - qd_real( 9.9657114579055484e-01, 1.1707179088390986e-17, - -7.5934413263024663e-34, 2.8474848436926008e-50), - qd_real( 9.9631261218277800e-01, 1.1336497891624735e-17, - 3.4002458674414360e-34, 7.7419075921544901e-52), - qd_real( 9.9604470090125197e-01, 2.2870031707670695e-17, - -3.9184839405013148e-34, -3.7081260416246375e-50), - qd_real( 9.9576741446765982e-01, -2.3151908323094359e-17, - -1.6306512931944591e-34, -1.5925420783863192e-51), - qd_real( 9.9548075549192694e-01, 3.2084621412226554e-18, - -4.9501292146013023e-36, -2.7811428850878516e-52), - qd_real( 9.9518472667219693e-01, -4.2486913678304410e-17, - 1.3315510772504614e-33, 6.7927987417051888e-50), - qd_real( 9.9487933079480562e-01, 4.2130813284943662e-18, - -4.2062597488288452e-35, 2.5157064556087620e-51), - qd_real( 9.9456457073425542e-01, 3.6745069641528058e-17, - -3.0603304105471010e-33, 1.0397872280487526e-49), - qd_real( 9.9424044945318790e-01, 4.4129423472462673e-17, - -3.0107231708238066e-33, 7.4201582906861892e-50), - qd_real( 9.9390697000235606e-01, -1.8964849471123746e-17, - -1.5980853777937752e-35, -8.5374807150597082e-52), - qd_real( 9.9356413552059530e-01, 2.9752309927797428e-17, - -4.5066707331134233e-34, -3.3548191633805036e-50), - qd_real( 9.9321194923479450e-01, 3.3096906261272262e-17, - 1.5592811973249567e-33, 1.4373977733253592e-50), - qd_real( 9.9285041445986510e-01, -1.4094517733693302e-17, - -1.1954558131616916e-33, 1.8761873742867983e-50), - qd_real( 9.9247953459870997e-01, 3.1093055095428906e-17, - -1.8379594757818019e-33, -3.9885758559381314e-51), - qd_real( 9.9209931314219180e-01, -3.9431926149588778e-17, - -6.2758062911047230e-34, -1.2960929559212390e-50), - qd_real( 9.9170975366909953e-01, -2.3372891311883661e-18, - 2.7073298824968591e-35, -1.2569459441802872e-51), - qd_real( 9.9131085984611544e-01, -2.5192111583372105e-17, - -1.2852471567380887e-33, 5.2385212584310483e-50), - qd_real( 9.9090263542778001e-01, 1.5394565094566704e-17, - -1.0799984133184567e-33, 2.7451115960133595e-51), - qd_real( 9.9048508425645709e-01, -5.5411437553780867e-17, - -1.4614017210753585e-33, -3.8339374397387620e-50), - qd_real( 9.9005821026229712e-01, -1.7055485906233963e-17, - 1.3454939685758777e-33, 7.3117589137300036e-50), - qd_real( 9.8962201746320089e-01, -5.2398217968132530e-17, - 1.3463189211456219e-33, 5.8021640554894872e-50), - qd_real( 9.8917650996478101e-01, -4.0987309937047111e-17, - -4.4857560552048437e-34, -3.9414504502871125e-50), - qd_real( 9.8872169196032378e-01, -1.0976227206656125e-17, - 3.2311342577653764e-34, 9.6367946583575041e-51), - qd_real( 9.8825756773074946e-01, 2.7030607784372632e-17, - 7.7514866488601377e-35, 2.1019644956864938e-51), - qd_real( 9.8778414164457218e-01, -2.3600693397159021e-17, - -1.2323283769707861e-33, 3.0130900716803339e-50), - qd_real( 9.8730141815785843e-01, -5.2332261255715652e-17, - -2.7937644333152473e-33, 1.2074160567958408e-49), - qd_real( 9.8680940181418553e-01, -5.0287214351061075e-17, - -2.2681526238144461e-33, 4.4003694320169133e-50), - qd_real( 9.8630809724459867e-01, -2.1520877103013341e-17, - 1.1866528054187716e-33, -7.8532199199813836e-50), - qd_real( 9.8579750916756748e-01, -5.1439452979953012e-17, - 2.6276439309996725e-33, 7.5423552783286347e-50), - qd_real( 9.8527764238894122e-01, 2.3155637027900207e-17, - -7.5275971545764833e-34, 1.0582231660456094e-50), - qd_real( 9.8474850180190421e-01, 1.0548144061829957e-17, - 2.8786145266267306e-34, -3.6782210081466112e-51), - qd_real( 9.8421009238692903e-01, 4.7983922627050691e-17, - 2.2597419645070588e-34, 1.7573875814863400e-50), - qd_real( 9.8366241921173025e-01, 1.9864948201635255e-17, - -1.0743046281211033e-35, 1.7975662796558100e-52), - qd_real( 9.8310548743121629e-01, 4.2170007522888628e-17, - 8.2396265656440904e-34, -8.0803700139096561e-50), - qd_real( 9.8253930228744124e-01, 1.5149580813777224e-17, - -4.1802771422186237e-34, -2.2150174326226160e-50), - qd_real( 9.8196386910955524e-01, 2.1108443711513084e-17, - -1.5253013442896054e-33, -6.8388082079337969e-50), - qd_real( 9.8137919331375456e-01, 1.3428163260355633e-17, - -6.5294290469962986e-34, 2.7965412287456268e-51), - qd_real( 9.8078528040323043e-01, 1.8546939997825006e-17, - -1.0696564445530757e-33, 6.6668174475264961e-50), - qd_real( 9.8018213596811743e-01, -3.6801786963856159e-17, - 6.3245171387992842e-34, 1.8600176137175971e-50), - qd_real( 9.7956976568544052e-01, 1.5573991584990420e-17, - -1.3401066029782990e-33, -1.7263702199862149e-50), - qd_real( 9.7894817531906220e-01, -2.3817727961148053e-18, - -1.0694750370381661e-34, -8.2293047196087462e-51), - qd_real( 9.7831737071962765e-01, -2.1623082233344895e-17, - 1.0970403012028032e-33, 7.7091923099369339e-50), - qd_real( 9.7767735782450993e-01, 5.0514136167059628e-17, - -1.3254751701428788e-33, 7.0161254312124538e-50), - qd_real( 9.7702814265775439e-01, -4.3353875751555997e-17, - 5.4948839831535478e-34, -9.2755263105377306e-51), - qd_real( 9.7636973133002114e-01, 9.3093931526213780e-18, - -4.1184949155685665e-34, -3.1913926031393690e-50), - qd_real( 9.7570213003852857e-01, -2.5572556081259686e-17, - -9.3174244508942223e-34, -8.3675863211646863e-51), - qd_real( 9.7502534506699412e-01, 2.6642660651899135e-17, - 1.7819392739353853e-34, -3.3159625385648947e-51), - qd_real( 9.7433938278557586e-01, 2.3041221476151512e-18, - 1.0758686005031430e-34, 5.1074116432809478e-51), - qd_real( 9.7364424965081198e-01, -5.1729808691005871e-17, - -1.5508473005989887e-33, -1.6505125917675401e-49), - qd_real( 9.7293995220556018e-01, -3.1311211122281800e-17, - -2.6874087789006141e-33, -2.1652434818822145e-51), - qd_real( 9.7222649707893627e-01, 3.6461169785938221e-17, - 3.0309636883883133e-33, -1.2702716907967306e-51), - qd_real( 9.7150389098625178e-01, -7.9865421122289046e-18, - -4.3628417211263380e-34, 3.4307517798759352e-51), - qd_real( 9.7077214072895035e-01, -4.7992163325114922e-17, - 3.0347528910975783e-33, 8.5989199506479701e-50), - qd_real( 9.7003125319454397e-01, 1.8365300348428844e-17, - -1.4311097571944918e-33, 8.5846781998740697e-51), - qd_real( 9.6928123535654853e-01, -4.5663660261927896e-17, - 9.6147526917239387e-34, 8.1267605207871330e-51), - qd_real( 9.6852209427441727e-01, 4.9475074918244771e-17, - 2.8558738351911241e-33, 6.2948422316507461e-50), - qd_real( 9.6775383709347551e-01, -4.5512132825515820e-17, - -1.4127617988719093e-33, -8.4620609089704578e-50), - qd_real( 9.6697647104485207e-01, 3.8496228837337864e-17, - -5.3881631542745647e-34, -3.5221863171458959e-50), - qd_real( 9.6619000344541250e-01, 5.1298840401665493e-17, - 1.4564075904769808e-34, 1.0095973971377432e-50), - qd_real( 9.6539444169768940e-01, -2.3745389918392156e-17, - 5.9221515590053862e-34, -3.8811192556231094e-50), - qd_real( 9.6458979328981276e-01, -3.4189470735959786e-17, - 2.2982074155463522e-33, -4.5128791045607634e-50), - qd_real( 9.6377606579543984e-01, 2.6463950561220029e-17, - -2.9073234590199323e-36, -1.2938328629395601e-52), - qd_real( 9.6295326687368388e-01, 8.9341960404313634e-18, - -3.9071244661020126e-34, 1.6212091116847394e-50), - qd_real( 9.6212140426904158e-01, 1.5236770453846305e-17, - -1.3050173525597142e-33, 7.9016122394092666e-50), - qd_real( 9.6128048581132064e-01, 2.0933955216674039e-18, - 1.0768607469015692e-34, -5.9453639304361774e-51), - qd_real( 9.6043051941556579e-01, 2.4653904815317185e-17, - -1.3792169410906322e-33, -4.7726598378506903e-51), - qd_real( 9.5957151308198452e-01, 1.1000640085000957e-17, - -4.2036030828223975e-34, 4.0023704842606573e-51), - qd_real( 9.5870347489587160e-01, -4.3685014392372053e-17, - 2.2001800662729131e-33, -1.0553721324358075e-49), - qd_real( 9.5782641302753291e-01, -1.7696710075371263e-17, - 1.9164034110382190e-34, 8.1489235071754813e-51), - qd_real( 9.5694033573220882e-01, 4.0553869861875701e-17, - -1.7147013364302149e-33, 2.5736745295329455e-50), - qd_real( 9.5604525134999641e-01, 3.7705045279589067e-17, - 1.9678699997347571e-33, 8.5093177731230180e-50), - qd_real( 9.5514116830577067e-01, 5.0088652955014668e-17, - -2.6983181838059211e-33, 1.0102323575596493e-49), - qd_real( 9.5422809510910567e-01, -3.7545901690626874e-17, - 1.4951619241257764e-33, -8.2717333151394973e-50), - qd_real( 9.5330604035419386e-01, -2.5190738779919934e-17, - -1.4272239821134379e-33, -4.6717286809283155e-50), - qd_real( 9.5237501271976588e-01, -2.0269300462299272e-17, - -1.0635956887246246e-33, -3.5514537666487619e-50), - qd_real( 9.5143502096900834e-01, 3.1350584123266695e-17, - -2.4824833452737813e-33, 9.5450335525380613e-51), - qd_real( 9.5048607394948170e-01, 1.9410097562630436e-17, - -8.1559393949816789e-34, -1.0501209720164562e-50), - qd_real( 9.4952818059303667e-01, -7.5544151928043298e-18, - -5.1260245024046686e-34, 1.8093643389040406e-50), - qd_real( 9.4856134991573027e-01, 2.0668262262333232e-17, - -5.9440730243667306e-34, 1.4268853111554300e-50), - qd_real( 9.4758559101774109e-01, 4.3417993852125991e-17, - -2.7728667889840373e-34, 5.5709160196519968e-51), - qd_real( 9.4660091308328353e-01, 3.5056800210680730e-17, - 9.8578536940318117e-34, 6.6035911064585197e-50), - qd_real( 9.4560732538052128e-01, 4.6019102478523738e-17, - -6.2534384769452059e-34, 1.5758941215779961e-50), - qd_real( 9.4460483726148026e-01, 8.8100545476641165e-18, - 5.2291695602757842e-34, -3.3487256018407123e-50), - qd_real( 9.4359345816196039e-01, -2.4093127844404214e-17, - 1.0283279856803939e-34, -2.3398232614531355e-51), - qd_real( 9.4257319760144687e-01, 1.3235564806436886e-17, - -5.7048262885386911e-35, 3.9947050442753744e-51), - qd_real( 9.4154406518302081e-01, -2.7896379547698341e-17, - 1.6273236356733898e-33, -5.3075944708471203e-51), - qd_real( 9.4050607059326830e-01, 2.8610421567116268e-17, - 2.9261501147538827e-33, -2.6849867690896925e-50), - qd_real( 9.3945922360218992e-01, -7.0152867943098655e-18, - -5.6395693818011210e-34, 3.5568142678987651e-50), - qd_real( 9.3840353406310806e-01, 5.4242545044795490e-17, - -1.9039966607859759e-33, -1.5627792988341215e-49), - qd_real( 9.3733901191257496e-01, -3.6570926284362776e-17, - -1.1902940071273247e-33, -1.1215082331583223e-50), - qd_real( 9.3626566717027826e-01, -1.3013766145497654e-17, - 5.2229870061990595e-34, -3.3972777075634108e-51), - qd_real( 9.3518350993894761e-01, -3.2609395302485065e-17, - -8.1813015218875245e-34, 5.5642140024928139e-50), - qd_real( 9.3409255040425887e-01, 4.4662824360767511e-17, - -2.5903243047396916e-33, 8.1505209004343043e-50), - qd_real( 9.3299279883473885e-01, 4.2041415555384355e-17, - 9.0285896495521276e-34, 5.3019984977661259e-50), - qd_real( 9.3188426558166815e-01, -4.0785944377318095e-17, - 1.7631450298754169e-33, 2.5776403305507453e-50), - qd_real( 9.3076696107898371e-01, 1.9703775102838329e-17, - 6.5657908718278205e-34, -1.9480347966259524e-51), - qd_real( 9.2964089584318121e-01, 5.1282530016864107e-17, - 2.3719739891916261e-34, -1.7230065426917127e-50), - qd_real( 9.2850608047321559e-01, -2.3306639848485943e-17, - -7.7799084333208503e-34, -5.8597558009300305e-50), - qd_real( 9.2736252565040111e-01, -2.7677111692155437e-17, - 2.2110293450199576e-34, 2.0349190819680613e-50), - qd_real( 9.2621024213831138e-01, -3.7303754586099054e-17, - 2.0464457809993405e-33, 1.3831799631231817e-49), - qd_real( 9.2504924078267758e-01, 6.0529447412576159e-18, - -8.8256517760278541e-35, 1.8285462122388328e-51), - qd_real( 9.2387953251128674e-01, 1.7645047084336677e-17, - -5.0442537321586818e-34, -4.0478677716823890e-50), - qd_real( 9.2270112833387852e-01, 5.2963798918539814e-17, - -5.7135699628876685e-34, 3.0163671797219087e-50), - qd_real( 9.2151403934204190e-01, 4.1639843390684644e-17, - 1.1891485604702356e-33, 2.0862437594380324e-50), - qd_real( 9.2031827670911059e-01, -2.7806888779036837e-17, - 2.7011013677071274e-33, 1.1998578792455499e-49), - qd_real( 9.1911385169005777e-01, -2.6496484622344718e-17, - 6.5403604763461920e-34, -2.8997180201186078e-50), - qd_real( 9.1790077562139050e-01, -3.9074579680849515e-17, - 2.3004636541490264e-33, 3.9851762744443107e-50), - qd_real( 9.1667905992104270e-01, -4.1733978698287568e-17, - 1.2094444804381172e-33, 4.9356916826097816e-50), - qd_real( 9.1544871608826783e-01, -1.3591056692900894e-17, - 5.9923027475594735e-34, 2.1403295925962879e-50), - qd_real( 9.1420975570353069e-01, -3.6316182527814423e-17, - -1.9438819777122554e-33, 2.8340679287728316e-50), - qd_real( 9.1296219042839821e-01, -4.7932505228039469e-17, - -1.7753551889428638e-33, 4.0607782903868160e-51), - qd_real( 9.1170603200542988e-01, -2.6913273175034130e-17, - -5.1928101916162528e-35, 1.1338175936090630e-51), - qd_real( 9.1044129225806725e-01, -5.0433041673313820e-17, - 1.0938746257404305e-33, 9.5378272084170731e-51), - qd_real( 9.0916798309052238e-01, -3.6878564091359894e-18, - 2.9951330310507693e-34, -1.2225666136919926e-50), - qd_real( 9.0788611648766626e-01, -4.9459964301225840e-17, - -1.6599682707075313e-33, -5.1925202712634716e-50), - qd_real( 9.0659570451491533e-01, 3.0506718955442023e-17, - -1.4478836557141204e-33, 1.8906373784448725e-50), - qd_real( 9.0529675931811882e-01, -4.1153099826889901e-17, - 2.9859368705184223e-33, 5.1145293917439211e-50), - qd_real( 9.0398929312344334e-01, -6.6097544687484308e-18, - 1.2728013034680357e-34, -4.3026097234014823e-51), - qd_real( 9.0267331823725883e-01, -1.9250787033961483e-17, - 1.3242128993244527e-33, -5.2971030688703665e-50), - qd_real( 9.0134884704602203e-01, -1.3524789367698682e-17, - 6.3605353115880091e-34, 3.6227400654573828e-50), - qd_real( 9.0001589201616028e-01, -5.0639618050802273e-17, - 1.0783525384031576e-33, 2.8130016326515111e-50), - qd_real( 8.9867446569395382e-01, 2.6316906461033013e-17, - 3.7003137047796840e-35, -2.3447719900465938e-51), - qd_real( 8.9732458070541832e-01, -3.6396283314867290e-17, - -2.3611649895474815e-33, 1.1837247047900082e-49), - qd_real( 8.9596624975618511e-01, 4.9025099114811813e-17, - -1.9440489814795326e-33, -1.7070486667767033e-49), - qd_real( 8.9459948563138270e-01, -1.7516226396814919e-17, - -1.3200670047246923e-33, -1.5953009884324695e-50), - qd_real( 8.9322430119551532e-01, -4.1161239151908913e-18, - 2.5380253805715999e-34, 4.2849455510516192e-51), - qd_real( 8.9184070939234272e-01, 4.6690228137124547e-18, - 1.6150254286841982e-34, -3.9617448820725012e-51), - qd_real( 8.9044872324475788e-01, 1.1781931459051803e-17, - -1.3346142209571930e-34, -9.4982373530733431e-51), - qd_real( 8.8904835585466457e-01, -1.1164514966766675e-17, - -3.4797636107798736e-34, -1.5605079997040631e-50), - qd_real( 8.8763962040285393e-01, 1.2805091918587960e-17, - 3.9948742059584459e-35, 3.8940716325338136e-51), - qd_real( 8.8622253014888064e-01, -6.7307369600274315e-18, - 1.2385593432917413e-34, 2.0364014759133320e-51), - qd_real( 8.8479709843093779e-01, -9.4331469628972690e-18, - -5.7106541478701439e-34, 1.8260134111907397e-50), - qd_real( 8.8336333866573158e-01, 1.5822643380255127e-17, - -7.8921320007588250e-34, -1.4782321016179836e-50), - qd_real( 8.8192126434835505e-01, -1.9843248405890562e-17, - -7.0412114007673834e-34, -1.0636770169389104e-50), - qd_real( 8.8047088905216075e-01, 1.6311096602996350e-17, - -5.7541360594724172e-34, -4.0128611862170021e-50), - qd_real( 8.7901222642863353e-01, -4.7356837291118011e-17, - 1.4388771297975192e-33, -2.9085554304479134e-50), - qd_real( 8.7754529020726124e-01, 5.0113311846499550e-17, - 2.8382769008739543e-34, 1.5550640393164140e-50), - qd_real( 8.7607009419540660e-01, 5.8729024235147677e-18, - 2.7941144391738458e-34, -1.8536073846509828e-50), - qd_real( 8.7458665227817611e-01, -5.7216617730397065e-19, - -2.9705811503689596e-35, 8.7389593969796752e-52), - qd_real( 8.7309497841829009e-01, 7.8424672990129903e-18, - -4.8685015839797165e-34, -2.2815570587477527e-50), - qd_real( 8.7159508665595109e-01, -5.5272998038551050e-17, - -2.2104090204984907e-33, -9.7749763187643172e-50), - qd_real( 8.7008699110871146e-01, -4.1888510868549968e-17, - 7.0900185861878415e-34, 3.7600251115157260e-50), - qd_real( 8.6857070597134090e-01, 2.7192781689782903e-19, - -1.6710140396932428e-35, -1.2625514734637969e-51), - qd_real( 8.6704624551569265e-01, 3.0267859550930567e-18, - -1.1559438782171572e-34, -5.3580556397808012e-52), - qd_real( 8.6551362409056909e-01, -6.3723113549628899e-18, - 2.3725520321746832e-34, 1.5911880348395175e-50), - qd_real( 8.6397285612158670e-01, 4.1486355957361607e-17, - 2.2709976932210266e-33, -8.1228385659479984e-50), - qd_real( 8.6242395611104050e-01, 3.7008992527383130e-17, - 5.2128411542701573e-34, 2.6945600081026861e-50), - qd_real( 8.6086693863776731e-01, -3.0050048898573656e-17, - -8.8706183090892111e-34, 1.5005320558097301e-50), - qd_real( 8.5930181835700836e-01, 4.2435655816850687e-17, - 7.6181814059912025e-34, -3.9592127850658708e-50), - qd_real( 8.5772861000027212e-01, -4.8183447936336620e-17, - -1.1044130517687532e-33, -8.7400233444645562e-50), - qd_real( 8.5614732837519447e-01, 9.1806925616606261e-18, - 5.6328649785951470e-34, 2.3326646113217378e-51), - qd_real( 8.5455798836540053e-01, -1.2991124236396092e-17, - 1.2893407722948080e-34, -3.6506925747583053e-52), - qd_real( 8.5296060493036363e-01, 2.7152984251981370e-17, - 7.4336483283120719e-34, 4.2162417622350668e-50), - qd_real( 8.5135519310526520e-01, -5.3279874446016209e-17, - 2.2281156380919942e-33, -4.0281886404138477e-50), - qd_real( 8.4974176800085244e-01, 5.1812347659974015e-17, - 3.0810626087331275e-33, -2.5931308201994965e-50), - qd_real( 8.4812034480329723e-01, 1.8762563415239981e-17, - 1.4048773307919617e-33, -2.4915221509958691e-50), - qd_real( 8.4649093877405213e-01, -4.7969419958569345e-17, - -2.7518267097886703e-33, -7.3518959727313350e-50), - qd_real( 8.4485356524970712e-01, -4.3631360296879637e-17, - -2.0307726853367547e-33, 4.3097229819851761e-50), - qd_real( 8.4320823964184544e-01, 9.6536707005959077e-19, - 2.8995142431556364e-36, 9.6715076811480284e-53), - qd_real( 8.4155497743689844e-01, -3.4095465391321557e-17, - -8.4130208607579595e-34, -4.9447283960568686e-50), - qd_real( 8.3989379419599952e-01, -1.6673694881511411e-17, - -1.4759184141750289e-33, -7.5795098161914058e-50), - qd_real( 8.3822470555483808e-01, -3.5560085052855026e-17, - 1.1689791577022643e-33, -5.8627347359723411e-50), - qd_real( 8.3654772722351201e-01, -2.0899059027066533e-17, - -9.8104097821002585e-35, -3.1609177868229853e-51), - qd_real( 8.3486287498638001e-01, 4.6048430609159657e-17, - -5.1827423265239912e-34, -7.0505343435504109e-51), - qd_real( 8.3317016470191319e-01, 1.3275129507229764e-18, - 4.8589164115370863e-35, 4.5422281300506859e-51), - qd_real( 8.3146961230254524e-01, 1.4073856984728024e-18, - 4.6951315383980830e-35, 5.1431906049905658e-51), - qd_real( 8.2976123379452305e-01, -2.9349109376485597e-18, - 1.1496917934149818e-34, 3.5186665544980233e-51), - qd_real( 8.2804504525775580e-01, -4.4196593225871532e-17, - 2.7967864855211251e-33, 1.0030777287393502e-49), - qd_real( 8.2632106284566353e-01, -5.3957485453612902e-17, - 6.8976896130138550e-34, 3.8106164274199196e-50), - qd_real( 8.2458930278502529e-01, -2.6512360488868275e-17, - 1.6916964350914386e-34, 6.7693974813562649e-51), - qd_real( 8.2284978137582632e-01, 1.5193019034505495e-17, - 9.6890547246521685e-34, 5.6994562923653264e-50), - qd_real( 8.2110251499110465e-01, 3.0715131609697682e-17, - -1.7037168325855879e-33, -1.1149862443283853e-49), - qd_real( 8.1934752007679701e-01, -4.8200736995191133e-17, - -1.5574489646672781e-35, -9.5647853614522216e-53), - qd_real( 8.1758481315158371e-01, -1.4883149812426772e-17, - -7.8273262771298917e-34, 4.1332149161031594e-50), - qd_real( 8.1581441080673378e-01, 8.2652693782130871e-18, - -2.3028778135179471e-34, 1.5102071387249843e-50), - qd_real( 8.1403632970594841e-01, -5.2127351877042624e-17, - -1.9047670611316360e-33, -1.6937269585941507e-49), - qd_real( 8.1225058658520388e-01, 3.1054545609214803e-17, - 2.2649541922707251e-34, -7.4221684154649405e-51), - qd_real( 8.1045719825259477e-01, 2.3520367349840499e-17, - -7.7530070904846341e-34, -7.2792616357197140e-50), - qd_real( 8.0865618158817498e-01, 9.3251597879721674e-18, - -7.1823301933068394e-34, 2.3925440846132106e-50), - qd_real( 8.0684755354379922e-01, 4.9220603766095546e-17, - 2.9796016899903487e-33, 1.5220754223615788e-49), - qd_real( 8.0503133114296355e-01, 5.1368289568212149e-17, - 6.3082807402256524e-34, 7.3277646085129827e-51), - qd_real( 8.0320753148064494e-01, -3.3060609804814910e-17, - -1.2242726252420433e-33, 2.8413673268630117e-50), - qd_real( 8.0137617172314024e-01, -2.0958013413495834e-17, - -4.3798162198006931e-34, 2.0235690497752515e-50), - qd_real( 7.9953726910790501e-01, 2.0356723822005431e-17, - -9.7448513696896360e-34, 5.3608109599696008e-52), - qd_real( 7.9769084094339116e-01, -4.6730759884788944e-17, - 2.3075897077191757e-33, 3.1605567774640253e-51), - qd_real( 7.9583690460888357e-01, -3.0062724851910721e-17, - -2.2496210832042235e-33, -6.5881774117183040e-50), - qd_real( 7.9397547755433717e-01, -7.4194631759921416e-18, - 2.4124341304631069e-34, -4.9956808616244972e-51), - qd_real( 7.9210657730021239e-01, -3.7087850202326467e-17, - -1.4874457267228264e-33, 2.9323097289153505e-50), - qd_real( 7.9023022143731003e-01, 2.3056905954954492e-17, - 1.4481080533260193e-33, -7.6725237057203488e-50), - qd_real( 7.8834642762660623e-01, 3.4396993154059708e-17, - 1.7710623746737170e-33, 1.7084159098417402e-49), - qd_real( 7.8645521359908577e-01, -9.7841429939305265e-18, - 3.3906063272445472e-34, 5.7269505320382577e-51), - qd_real( 7.8455659715557524e-01, -8.5627965423173476e-18, - -2.1106834459001849e-34, -1.6890322182469603e-50), - qd_real( 7.8265059616657573e-01, 9.0745866975808825e-18, - 6.7623847404278666e-34, -1.7173237731987271e-50), - qd_real( 7.8073722857209449e-01, -9.9198782066678806e-18, - -2.1265794012162715e-36, 3.0772165598957647e-54), - qd_real( 7.7881651238147598e-01, -2.4891385579973807e-17, - 6.7665497024807980e-35, -6.5218594281701332e-52), - qd_real( 7.7688846567323244e-01, 7.7418602570672864e-18, - -5.9986517872157897e-34, 3.0566548232958972e-50), - qd_real( 7.7495310659487393e-01, -5.2209083189826433e-17, - -9.6653593393686612e-34, 3.7027750076562569e-50), - qd_real( 7.7301045336273699e-01, -3.2565907033649772e-17, - 1.3860807251523929e-33, -3.9971329917586022e-50), - qd_real( 7.7106052426181382e-01, -4.4558442347769265e-17, - -2.9863565614083783e-33, -6.8795262083596236e-50), - qd_real( 7.6910333764557959e-01, 5.1546455184564817e-17, - 2.6142829553524292e-33, -1.6199023632773298e-49), - qd_real( 7.6713891193582040e-01, -1.8885903683750782e-17, - -1.3659359331495433e-33, -2.2538834962921934e-50), - qd_real( 7.6516726562245896e-01, -3.2707225612534598e-17, - 1.1177117747079528e-33, -3.7005182280175715e-50), - qd_real( 7.6318841726338127e-01, 2.6314748416750748e-18, - 1.4048039063095910e-34, 8.9601886626630321e-52), - qd_real( 7.6120238548426178e-01, 3.5315510881690551e-17, - 1.2833566381864357e-33, 8.6221435180890613e-50), - qd_real( 7.5920918897838807e-01, -3.8558842175523123e-17, - 2.9720241208332759e-34, -1.2521388928220163e-50), - qd_real( 7.5720884650648457e-01, -1.9909098777335502e-17, - 3.9409283266158482e-34, 2.0744254207802976e-50), - qd_real( 7.5520137689653655e-01, -1.9402238001823017e-17, - -3.7756206444727573e-34, -2.1212242308178287e-50), - qd_real( 7.5318679904361252e-01, -3.7937789838736540e-17, - -6.7009539920231559e-34, -6.7128562115050214e-51), - qd_real( 7.5116513190968637e-01, 4.3499761158645868e-17, - 2.5227718971102212e-33, -6.5969709212757102e-50), - qd_real( 7.4913639452345937e-01, -4.4729078447011889e-17, - -2.4206025249983768e-33, 1.1336681351116422e-49), - qd_real( 7.4710060598018013e-01, 1.1874824875965430e-17, - 2.1992523849833518e-34, 1.1025018564644483e-50), - qd_real( 7.4505778544146595e-01, 1.5078686911877863e-17, - 8.0898987212942471e-34, 8.2677958765323532e-50), - qd_real( 7.4300795213512172e-01, -2.5144629669719265e-17, - 7.1128989512526157e-34, 3.0181629077821220e-50), - qd_real( 7.4095112535495911e-01, -1.4708616952297345e-17, - -4.9550433827142032e-34, 3.1434132533735671e-50), - qd_real( 7.3888732446061511e-01, 3.4324874808225091e-17, - -1.3706639444717610e-33, -3.3520827530718938e-51), - qd_real( 7.3681656887736990e-01, -2.8932468101656295e-17, - -3.4649887126202378e-34, -1.8484474476291476e-50), - qd_real( 7.3473887809596350e-01, -3.4507595976263941e-17, - -2.3718000676666409e-33, -3.9696090387165402e-50), - qd_real( 7.3265427167241282e-01, 1.8918673481573520e-17, - -1.5123719544119886e-33, -9.7922152011625728e-51), - qd_real( 7.3056276922782759e-01, -2.9689959904476928e-17, - -1.1276871244239744e-33, -3.0531520961539007e-50), - qd_real( 7.2846439044822520e-01, 1.1924642323370718e-19, - 5.9001892316611011e-36, 1.2178089069502704e-52), - qd_real( 7.2635915508434601e-01, -3.1917502443460542e-17, - 7.7047912412039396e-34, 4.1455880160182123e-50), - qd_real( 7.2424708295146689e-01, 2.9198471334403004e-17, - 2.3027324968739464e-33, -1.2928820533892183e-51), - qd_real( 7.2212819392921535e-01, -2.3871262053452047e-17, - 1.0636125432862273e-33, -4.4598638837802517e-50), - qd_real( 7.2000250796138165e-01, -2.5689658854462333e-17, - -9.1492566948567925e-34, 4.4403780801267786e-50), - qd_real( 7.1787004505573171e-01, 2.7006476062511453e-17, - -2.2854956580215348e-34, 9.1726903890287867e-51), - qd_real( 7.1573082528381871e-01, -5.1581018476410262e-17, - -1.3736271349300259e-34, -1.2734611344111297e-50), - qd_real( 7.1358486878079364e-01, -4.2342504403133584e-17, - -4.2690366101617268e-34, -2.6352370883066522e-50), - qd_real( 7.1143219574521643e-01, 7.9643298613856813e-18, - 2.9488239510721469e-34, 1.6985236437666356e-50), - qd_real( 7.0927282643886569e-01, -3.7597359110245730e-17, - 1.0613125954645119e-34, 8.9465480185486032e-51), - qd_real( 7.0710678118654757e-01, -4.8336466567264567e-17, - 2.0693376543497068e-33, 2.4677734957341755e-50) -}; - -/* Computes sin(a) and cos(a) using Taylor series. - Assumes |a| <= pi/2048. */ -static void sincos_taylor(const qd_real &a, - qd_real &sin_a, qd_real &cos_a) { - const double thresh = 0.5 * qd_real::_eps * std::abs(to_double(a)); - qd_real p, s, t, x; - - if (a.is_zero()) { - sin_a = 0.0; - cos_a = 1.0; - return; - } - - x = -sqr(a); - s = a; - p = a; - int i = 0; - do { - p *= x; - t = p * inv_fact[i]; - s += t; - i += 2; - } while (i < n_inv_fact && std::abs(to_double(t)) > thresh); - - sin_a = s; - cos_a = sqrt(1.0 - sqr(s)); -} - -static qd_real sin_taylor(const qd_real &a) { - const double thresh = 0.5 * qd_real::_eps * std::abs(to_double(a)); - qd_real p, s, t, x; - - if (a.is_zero()) { - return 0.0; - } - - x = -sqr(a); - s = a; - p = a; - int i = 0; - do { - p *= x; - t = p * inv_fact[i]; - s += t; - i += 2; - } while (i < n_inv_fact && std::abs(to_double(t)) > thresh); - - return s; -} - -static qd_real cos_taylor(const qd_real &a) { - const double thresh = 0.5 * qd_real::_eps; - qd_real p, s, t, x; - - if (a.is_zero()) { - return 1.0; - } - - x = -sqr(a); - s = 1.0 + mul_pwr2(x, 0.5); - p = x; - int i = 1; - do { - p *= x; - t = p * inv_fact[i]; - s += t; - i += 2; - } while (i < n_inv_fact && std::abs(to_double(t)) > thresh); - - return s; -} - -qd_real sin(const qd_real &a) { - - /* Strategy. To compute sin(x), we choose integers a, b so that - - x = s + a * (pi/2) + b * (pi/1024) - - and |s| <= pi/2048. Using a precomputed table of - sin(k pi / 1024) and cos(k pi / 1024), we can compute - sin(x) from sin(s) and cos(s). This greatly increases the - convergence of the sine Taylor series. */ - - if (a.is_zero()) { - return 0.0; - } - - // approximately reduce modulo 2*pi - qd_real z = nint(a / qd_real::_2pi); - qd_real r = a - qd_real::_2pi * z; - - // approximately reduce modulo pi/2 and then modulo pi/1024 - double q = std::floor(r.x[0] / qd_real::_pi2[0] + 0.5); - qd_real t = r - qd_real::_pi2 * q; - int j = static_cast(q); - q = std::floor(t.x[0] / _pi1024[0] + 0.5); - t -= _pi1024 * q; - int k = static_cast(q); - int abs_k = std::abs(k); - - if (j < -2 || j > 2) { - qd_real::error("(qd_real::sin): Cannot reduce modulo pi/2."); - return qd_real::_nan; - } - - if (abs_k > 256) { - qd_real::error("(qd_real::sin): Cannot reduce modulo pi/1024."); - return qd_real::_nan; - } - - if (k == 0) { - switch (j) { - case 0: - return sin_taylor(t); - case 1: - return cos_taylor(t); - case -1: - return -cos_taylor(t); - default: - return -sin_taylor(t); - } - } - - qd_real sin_t, cos_t; - qd_real u = cos_table[abs_k-1]; - qd_real v = sin_table[abs_k-1]; - sincos_taylor(t, sin_t, cos_t); - - if (j == 0) { - if (k > 0) { - r = u * sin_t + v * cos_t; - } else { - r = u * sin_t - v * cos_t; - } - } else if (j == 1) { - if (k > 0) { - r = u * cos_t - v * sin_t; - } else { - r = u * cos_t + v * sin_t; - } - } else if (j == -1) { - if (k > 0) { - r = v * sin_t - u * cos_t; - } else { - r = - u * cos_t - v * sin_t; - } - } else { - if (k > 0) { - r = - u * sin_t - v * cos_t; - } else { - r = v * cos_t - u * sin_t; - } - } - - return r; -} - -qd_real cos(const qd_real &a) { - - if (a.is_zero()) { - return 1.0; - } - - // approximately reduce modulo 2*pi - qd_real z = nint(a / qd_real::_2pi); - qd_real r = a - qd_real::_2pi * z; - - // approximately reduce modulo pi/2 and then modulo pi/1024 - double q = std::floor(r.x[0] / qd_real::_pi2.x[0] + 0.5); - qd_real t = r - qd_real::_pi2 * q; - int j = static_cast(q); - q = std::floor(t.x[0] / _pi1024.x[0] + 0.5); - t -= _pi1024 * q; - int k = static_cast(q); - int abs_k = std::abs(k); - - if (j < -2 || j > 2) { - qd_real::error("(qd_real::cos): Cannot reduce modulo pi/2."); - return qd_real::_nan; - } - - if (abs_k > 256) { - qd_real::error("(qd_real::cos): Cannot reduce modulo pi/1024."); - return qd_real::_nan; - } - - if (k == 0) { - switch (j) { - case 0: - return cos_taylor(t); - case 1: - return -sin_taylor(t); - case -1: - return sin_taylor(t); - default: - return -cos_taylor(t); - } - } - - qd_real sin_t, cos_t; - sincos_taylor(t, sin_t, cos_t); - - qd_real u = cos_table[abs_k-1]; - qd_real v = sin_table[abs_k-1]; - - if (j == 0) { - if (k > 0) { - r = u * cos_t - v * sin_t; - } else { - r = u * cos_t + v * sin_t; - } - } else if (j == 1) { - if (k > 0) { - r = - u * sin_t - v * cos_t; - } else { - r = v * cos_t - u * sin_t; - } - } else if (j == -1) { - if (k > 0) { - r = u * sin_t + v * cos_t; - } else { - r = u * sin_t - v * cos_t; - } - } else { - if (k > 0) { - r = v * sin_t - u * cos_t; - } else { - r = - u * cos_t - v * sin_t; - } - } - - return r; -} - -void sincos(const qd_real &a, qd_real &sin_a, qd_real &cos_a) { - - if (a.is_zero()) { - sin_a = 0.0; - cos_a = 1.0; - return; - } - - // approximately reduce by 2*pi - qd_real z = nint(a / qd_real::_2pi); - qd_real t = a - qd_real::_2pi * z; - - // approximately reduce by pi/2 and then by pi/1024. - double q = std::floor(t.x[0] / qd_real::_pi2.x[0] + 0.5); - t -= qd_real::_pi2 * q; - int j = static_cast(q); - q = std::floor(t.x[0] / _pi1024.x[0] + 0.5); - t -= _pi1024 * q; - int k = static_cast(q); - int abs_k = std::abs(k); - - if (j < -2 || j > 2) { - qd_real::error("(qd_real::sincos): Cannot reduce modulo pi/2."); - cos_a = sin_a = qd_real::_nan; - return; - } - - if (abs_k > 256) { - qd_real::error("(qd_real::sincos): Cannot reduce modulo pi/1024."); - cos_a = sin_a = qd_real::_nan; - return; - } - - qd_real sin_t, cos_t; - sincos_taylor(t, sin_t, cos_t); - - if (k == 0) { - if (j == 0) { - sin_a = sin_t; - cos_a = cos_t; - } else if (j == 1) { - sin_a = cos_t; - cos_a = -sin_t; - } else if (j == -1) { - sin_a = -cos_t; - cos_a = sin_t; - } else { - sin_a = -sin_t; - cos_a = -cos_t; - } - return; - } - - qd_real u = cos_table[abs_k-1]; - qd_real v = sin_table[abs_k-1]; - - if (j == 0) { - if (k > 0) { - sin_a = u * sin_t + v * cos_t; - cos_a = u * cos_t - v * sin_t; - } else { - sin_a = u * sin_t - v * cos_t; - cos_a = u * cos_t + v * sin_t; - } - } else if (j == 1) { - if (k > 0) { - cos_a = - u * sin_t - v * cos_t; - sin_a = u * cos_t - v * sin_t; - } else { - cos_a = v * cos_t - u * sin_t; - sin_a = u * cos_t + v * sin_t; - } - } else if (j == -1) { - if (k > 0) { - cos_a = u * sin_t + v * cos_t; - sin_a = v * sin_t - u * cos_t; - } else { - cos_a = u * sin_t - v * cos_t; - sin_a = - u * cos_t - v * sin_t; - } - } else { - if (k > 0) { - sin_a = - u * sin_t - v * cos_t; - cos_a = v * sin_t - u * cos_t; - } else { - sin_a = v * cos_t - u * sin_t; - cos_a = - u * cos_t - v * sin_t; - } - } -} - -qd_real atan(const qd_real &a) { - return atan2(a, qd_real(1.0)); -} - -qd_real atan2(const qd_real &y, const qd_real &x) { - /* Strategy: Instead of using Taylor series to compute - arctan, we instead use Newton's iteration to solve - the equation - - sin(z) = y/r or cos(z) = x/r - - where r = sqrt(x^2 + y^2). - The iteration is given by - - z' = z + (y - sin(z)) / cos(z) (for equation 1) - z' = z - (x - cos(z)) / sin(z) (for equation 2) - - Here, x and y are normalized so that x^2 + y^2 = 1. - If |x| > |y|, then first iteration is used since the - denominator is larger. Otherwise, the second is used. - */ - - if (x.is_zero()) { - - if (y.is_zero()) { - /* Both x and y is zero. */ - qd_real::error("(qd_real::atan2): Both arguments zero."); - return qd_real::_nan; - } - - return (y.is_positive()) ? qd_real::_pi2 : -qd_real::_pi2; - } else if (y.is_zero()) { - return (x.is_positive()) ? qd_real(0.0) : qd_real::_pi; - } - - if (x == y) { - return (y.is_positive()) ? qd_real::_pi4 : -qd_real::_3pi4; - } - - if (x == -y) { - return (y.is_positive()) ? qd_real::_3pi4 : -qd_real::_pi4; - } - - qd_real r = sqrt(sqr(x) + sqr(y)); - qd_real xx = x / r; - qd_real yy = y / r; - - /* Compute double precision approximation to atan. */ - qd_real z = std::atan2(to_double(y), to_double(x)); - qd_real sin_z, cos_z; - - if (std::abs(xx.x[0]) > std::abs(yy.x[0])) { - /* Use Newton iteration 1. z' = z + (y - sin(z)) / cos(z) */ - sincos(z, sin_z, cos_z); - z += (yy - sin_z) / cos_z; - sincos(z, sin_z, cos_z); - z += (yy - sin_z) / cos_z; - sincos(z, sin_z, cos_z); - z += (yy - sin_z) / cos_z; - } else { - /* Use Newton iteration 2. z' = z - (x - cos(z)) / sin(z) */ - sincos(z, sin_z, cos_z); - z -= (xx - cos_z) / sin_z; - sincos(z, sin_z, cos_z); - z -= (xx - cos_z) / sin_z; - sincos(z, sin_z, cos_z); - z -= (xx - cos_z) / sin_z; - } - - return z; -} - - -qd_real drem(const qd_real &a, const qd_real &b) { - qd_real n = nint(a/b); - return (a - n * b); -} - -qd_real divrem(const qd_real &a, const qd_real &b, qd_real &r) { - qd_real n = nint(a/b); - r = a - n * b; - return n; -} - -qd_real tan(const qd_real &a) { - qd_real s, c; - sincos(a, s, c); - return s/c; -} - -qd_real asin(const qd_real &a) { - qd_real abs_a = abs(a); - - if (abs_a > 1.0) { - qd_real::error("(qd_real::asin): Argument out of domain."); - return qd_real::_nan; - } - - if (abs_a.is_one()) { - return (a.is_positive()) ? qd_real::_pi2 : -qd_real::_pi2; - } - - return atan2(a, sqrt(1.0 - sqr(a))); -} - -qd_real acos(const qd_real &a) { - qd_real abs_a = abs(a); - - if (abs_a > 1.0) { - qd_real::error("(qd_real::acos): Argument out of domain."); - return qd_real::_nan; - } - - if (abs_a.is_one()) { - return (a.is_positive()) ? qd_real(0.0) : qd_real::_pi; - } - - return atan2(sqrt(1.0 - sqr(a)), a); -} - -qd_real sinh(const qd_real &a) { - if (a.is_zero()) { - return 0.0; - } - - if (abs(a) > 0.05) { - qd_real ea = exp(a); - return mul_pwr2(ea - inv(ea), 0.5); - } - - /* Since a is small, using the above formula gives - a lot of cancellation. So use Taylor series. */ - qd_real s = a; - qd_real t = a; - qd_real r = sqr(t); - double m = 1.0; - double thresh = std::abs(to_double(a) * qd_real::_eps); - - do { - m += 2.0; - t *= r; - t /= (m-1) * m; - - s += t; - } while (abs(t) > thresh); - - return s; -} - -qd_real cosh(const qd_real &a) { - if (a.is_zero()) { - return 1.0; - } - - qd_real ea = exp(a); - return mul_pwr2(ea + inv(ea), 0.5); -} - -qd_real tanh(const qd_real &a) { - if (a.is_zero()) { - return 0.0; - } - - if (std::abs(to_double(a)) > 0.05) { - qd_real ea = exp(a); - qd_real inv_ea = inv(ea); - return (ea - inv_ea) / (ea + inv_ea); - } else { - qd_real s, c; - s = sinh(a); - c = sqrt(1.0 + sqr(s)); - return s / c; - } -} - -void sincosh(const qd_real &a, qd_real &s, qd_real &c) { - if (std::abs(to_double(a)) <= 0.05) { - s = sinh(a); - c = sqrt(1.0 + sqr(s)); - } else { - qd_real ea = exp(a); - qd_real inv_ea = inv(ea); - s = mul_pwr2(ea - inv_ea, 0.5); - c = mul_pwr2(ea + inv_ea, 0.5); - } -} - -qd_real asinh(const qd_real &a) { - return log(a + sqrt(sqr(a) + 1.0)); -} - -qd_real acosh(const qd_real &a) { - if (a < 1.0) { - qd_real::error("(qd_real::acosh): Argument out of domain."); - return qd_real::_nan; - } - - return log(a + sqrt(sqr(a) - 1.0)); -} - -qd_real atanh(const qd_real &a) { - if (abs(a) >= 1.0) { - qd_real::error("(qd_real::atanh): Argument out of domain."); - return qd_real::_nan; - } - - return mul_pwr2(log((1.0 + a) / (1.0 - a)), 0.5); -} - -QD_API qd_real fmod(const qd_real &a, const qd_real &b) { - qd_real n = aint(a / b); - return (a - b * n); -} - -QD_API qd_real qdrand() { - static const double m_const = 4.6566128730773926e-10; /* = 2^{-31} */ - double m = m_const; - qd_real r = 0.0; - double d; - - /* Strategy: Generate 31 bits at a time, using lrand48 - random number generator. Shift the bits, and repeat - 7 times. */ - - for (int i = 0; i < 7; i++, m *= m_const) { - d = std::rand() * m; - r += d; - } - - return r; -} - - -/* polyeval(c, n, x) - Evaluates the given n-th degree polynomial at x. - The polynomial is given by the array of (n+1) coefficients. */ -qd_real polyeval(const qd_real *c, int n, const qd_real &x) { - /* Just use Horner's method of polynomial evaluation. */ - qd_real r = c[n]; - - for (int i = n-1; i >= 0; i--) { - r *= x; - r += c[i]; - } - - return r; -} - -/* polyroot(c, n, x0) - Given an n-th degree polynomial, finds a root close to - the given guess x0. Note that this uses simple Newton - iteration scheme, and does not work for multiple roots. */ -QD_API qd_real polyroot(const qd_real *c, int n, - const qd_real &x0, int max_iter, double thresh) { - qd_real x = x0; - qd_real f; - qd_real *d = new qd_real[n]; - bool conv = false; - int i; - double max_c = std::abs(to_double(c[0])); - double v; - - if (thresh == 0.0) thresh = qd_real::_eps; - - /* Compute the coefficients of the derivatives. */ - for (i = 1; i <= n; i++) { - v = std::abs(to_double(c[i])); - if (v > max_c) max_c = v; - d[i-1] = c[i] * static_cast(i); - } - thresh *= max_c; - - /* Newton iteration. */ - for (i = 0; i < max_iter; i++) { - f = polyeval(c, n, x); - - if (abs(f) < thresh) { - conv = true; - break; - } - x -= (f / polyeval(d, n-1, x)); - } - delete [] d; - - if (!conv) { - qd_real::error("(qd_real::polyroot): Failed to converge."); - return qd_real::_nan; - } - - return x; -} - -qd_real qd_real::debug_rand() { - if (std::rand() % 2 == 0) - return qdrand(); - - int expn = 0; - qd_real a = 0.0; - double d; - for (int i = 0; i < 4; i++) { - d = std::ldexp(std::rand() / static_cast(RAND_MAX), -expn); - a += d; - expn = expn + 54 + std::rand() % 200; - } - return a; -} - diff --git a/src/external/PackedCSparse/qd/qd_real.h b/src/external/PackedCSparse/qd/qd_real.h deleted file mode 100644 index 1ecfc732..00000000 --- a/src/external/PackedCSparse/qd/qd_real.h +++ /dev/null @@ -1,296 +0,0 @@ -/* - * include/qd_real.h - * - * This work was supported by the Director, Office of Science, Division - * of Mathematical, Information, and Computational Sciences of the - * U.S. Department of Energy under contract number DE-AC03-76SF00098. - * - * Copyright (c) 2000-2007 - * - * Quad-double precision (>= 212-bit significand) floating point arithmetic - * package, written in ANSI C++, taking full advantage of operator overloading. - * Uses similar techniques as that of David Bailey's double-double package - * and that of Jonathan Shewchuk's adaptive precision floating point - * arithmetic package. See - * - * http://www.nersc.gov/~dhbailey/mpdist/mpdist.html - * http://www.cs.cmu.edu/~quake/robust.html - * - * for more details. - * - * Yozo Hida - */ -#ifndef _QD_QD_REAL_H -#define _QD_QD_REAL_H - -#include -#include -#include -#include "qd_config.h" -#include "dd_real.h" - -struct QD_API qd_real { - double x[4]; /* The Components. */ - - /* Eliminates any zeros in the middle component(s). */ - void zero_elim(); - void zero_elim(double &e); - - void renorm(); - void renorm(double &e); - - void quick_accum(double d, double &e); - void quick_prod_accum(double a, double b, double &e); - - qd_real(double x0, double x1, double x2, double x3); - explicit qd_real(const double *xx); - - static const qd_real _2pi; - static const qd_real _pi; - static const qd_real _3pi4; - static const qd_real _pi2; - static const qd_real _pi4; - static const qd_real _e; - static const qd_real _log2; - static const qd_real _log10; - static const qd_real _nan; - static const qd_real _inf; - - static const double _eps; - static const double _min_normalized; - static const qd_real _max; - static const qd_real _safe_max; - static const int _ndigits; - - qd_real(); - qd_real(const char *s); - qd_real(const dd_real &dd); - qd_real(double d); - qd_real(int i); - - double operator[](int i) const; - double &operator[](int i); - - static void error(const char *msg); - - bool isnan() const; - bool isfinite() const { return QD_ISFINITE(x[0]); } - bool isinf() const { return QD_ISINF(x[0]); } - - static qd_real ieee_add(const qd_real &a, const qd_real &b); - static qd_real sloppy_add(const qd_real &a, const qd_real &b); - - qd_real &operator+=(double a); - qd_real &operator+=(const dd_real &a); - qd_real &operator+=(const qd_real &a); - - qd_real &operator-=(double a); - qd_real &operator-=(const dd_real &a); - qd_real &operator-=(const qd_real &a); - - static qd_real sloppy_mul(const qd_real &a, const qd_real &b); - static qd_real accurate_mul(const qd_real &a, const qd_real &b); - - qd_real &operator*=(double a); - qd_real &operator*=(const dd_real &a); - qd_real &operator*=(const qd_real &a); - - static qd_real sloppy_div(const qd_real &a, const dd_real &b); - static qd_real accurate_div(const qd_real &a, const dd_real &b); - static qd_real sloppy_div(const qd_real &a, const qd_real &b); - static qd_real accurate_div(const qd_real &a, const qd_real &b); - - qd_real &operator/=(double a); - qd_real &operator/=(const dd_real &a); - qd_real &operator/=(const qd_real &a); - - qd_real operator^(int n) const; - - qd_real operator-() const; - - qd_real &operator=(double a); - qd_real &operator=(const dd_real &a); - qd_real &operator=(const char *s); - - bool is_zero() const; - bool is_one() const; - bool is_positive() const; - bool is_negative() const; - - explicit operator bool() const; // new - explicit operator double() const; // new - - static qd_real rand(void); - - void to_digits(char *s, int &expn, int precision = _ndigits) const; - void write(char *s, int len, int precision = _ndigits, - bool showpos = false, bool uppercase = false) const; - std::string to_string(int precision = _ndigits, int width = 0, - std::ios_base::fmtflags fmt = static_cast(0), - bool showpos = false, bool uppercase = false, char fill = ' ') const; - static int read(const char *s, qd_real &a); - - /* Debugging methods */ - void dump(const std::string &name, std::ostream &os = std::cerr) const; - void dump_bits(const std::string &name, - std::ostream &os = std::cerr) const; - - static qd_real debug_rand(); - -}; - -namespace std { - template <> - class numeric_limits : public numeric_limits { - public: - inline static double epsilon() { return qd_real::_eps; } - inline static double min() { return qd_real::_min_normalized; } - inline static qd_real max() { return qd_real::_max; } - inline static qd_real safe_max() { return qd_real::_safe_max; } - static const int digits = 209; - static const int digits10 = 62; - }; -} - -QD_API qd_real polyeval(const qd_real *c, int n, const qd_real &x); -QD_API qd_real polyroot(const qd_real *c, int n, - const qd_real &x0, int max_iter = 64, double thresh = 0.0); - -QD_API qd_real qdrand(void); -QD_API qd_real sqrt(const qd_real &a); - -QD_API inline bool isnan(const qd_real &a) { return a.isnan(); } -QD_API inline bool isfinite(const qd_real &a) { return a.isfinite(); } -QD_API inline bool isinf(const qd_real &a) { return a.isinf(); } - -/* Computes qd * d where d is known to be a power of 2. - This can be done component wise. */ -QD_API qd_real mul_pwr2(const qd_real &qd, double d); - -QD_API qd_real operator+(const qd_real &a, const qd_real &b); -QD_API qd_real operator+(const dd_real &a, const qd_real &b); -QD_API qd_real operator+(const qd_real &a, const dd_real &b); -QD_API qd_real operator+(const qd_real &a, double b); -QD_API qd_real operator+(double a, const qd_real &b); - -QD_API qd_real operator-(const qd_real &a, const qd_real &b); -QD_API qd_real operator-(const dd_real &a, const qd_real &b); -QD_API qd_real operator-(const qd_real &a, const dd_real &b); -QD_API qd_real operator-(const qd_real &a, double b); -QD_API qd_real operator-(double a, const qd_real &b); - -QD_API qd_real operator*(const qd_real &a, const qd_real &b); -QD_API qd_real operator*(const dd_real &a, const qd_real &b); -QD_API qd_real operator*(const qd_real &a, const dd_real &b); -QD_API qd_real operator*(const qd_real &a, double b); -QD_API qd_real operator*(double a, const qd_real &b); - -QD_API qd_real operator/(const qd_real &a, const qd_real &b); -QD_API qd_real operator/(const dd_real &a, const qd_real &b); -QD_API qd_real operator/(const qd_real &a, const dd_real &b); -QD_API qd_real operator/(const qd_real &a, double b); -QD_API qd_real operator/(double a, const qd_real &b); - -QD_API qd_real sqr(const qd_real &a); -QD_API qd_real sqrt(const qd_real &a); -QD_API qd_real pow(const qd_real &a, int n); -QD_API qd_real pow(const qd_real &a, const qd_real &b); -QD_API qd_real npwr(const qd_real &a, int n); - -QD_API qd_real nroot(const qd_real &a, int n); - -QD_API qd_real rem(const qd_real &a, const qd_real &b); -QD_API qd_real drem(const qd_real &a, const qd_real &b); -QD_API qd_real divrem(const qd_real &a, const qd_real &b, qd_real &r); - -dd_real to_dd_real(const qd_real &a); -double to_double(const qd_real &a); -int to_int(const qd_real &a); - -QD_API bool operator==(const qd_real &a, const qd_real &b); -QD_API bool operator==(const qd_real &a, const dd_real &b); -QD_API bool operator==(const dd_real &a, const qd_real &b); -QD_API bool operator==(double a, const qd_real &b); -QD_API bool operator==(const qd_real &a, double b); - -QD_API bool operator<(const qd_real &a, const qd_real &b); -QD_API bool operator<(const qd_real &a, const dd_real &b); -QD_API bool operator<(const dd_real &a, const qd_real &b); -QD_API bool operator<(double a, const qd_real &b); -QD_API bool operator<(const qd_real &a, double b); - -QD_API bool operator>(const qd_real &a, const qd_real &b); -QD_API bool operator>(const qd_real &a, const dd_real &b); -QD_API bool operator>(const dd_real &a, const qd_real &b); -QD_API bool operator>(double a, const qd_real &b); -QD_API bool operator>(const qd_real &a, double b); - -QD_API bool operator<=(const qd_real &a, const qd_real &b); -QD_API bool operator<=(const qd_real &a, const dd_real &b); -QD_API bool operator<=(const dd_real &a, const qd_real &b); -QD_API bool operator<=(double a, const qd_real &b); -QD_API bool operator<=(const qd_real &a, double b); - -QD_API bool operator>=(const qd_real &a, const qd_real &b); -QD_API bool operator>=(const qd_real &a, const dd_real &b); -QD_API bool operator>=(const dd_real &a, const qd_real &b); -QD_API bool operator>=(double a, const qd_real &b); -QD_API bool operator>=(const qd_real &a, double b); - -QD_API bool operator!=(const qd_real &a, const qd_real &b); -QD_API bool operator!=(const qd_real &a, const dd_real &b); -QD_API bool operator!=(const dd_real &a, const qd_real &b); -QD_API bool operator!=(double a, const qd_real &b); -QD_API bool operator!=(const qd_real &a, double b); - -QD_API qd_real fabs(const qd_real &a); -QD_API qd_real abs(const qd_real &a); /* same as fabs */ - -QD_API qd_real ldexp(const qd_real &a, int n); - -QD_API qd_real nint(const qd_real &a); -QD_API qd_real quick_nint(const qd_real &a); -QD_API qd_real floor(const qd_real &a); -QD_API qd_real ceil(const qd_real &a); -QD_API qd_real aint(const qd_real &a); - -QD_API qd_real sin(const qd_real &a); -QD_API qd_real cos(const qd_real &a); -QD_API qd_real tan(const qd_real &a); -QD_API void sincos(const qd_real &a, qd_real &s, qd_real &c); - -QD_API qd_real asin(const qd_real &a); -QD_API qd_real acos(const qd_real &a); -QD_API qd_real atan(const qd_real &a); -QD_API qd_real atan2(const qd_real &y, const qd_real &x); - -QD_API qd_real exp(const qd_real &a); -QD_API qd_real log(const qd_real &a); -QD_API qd_real log10(const qd_real &a); - -QD_API qd_real sinh(const qd_real &a); -QD_API qd_real cosh(const qd_real &a); -QD_API qd_real tanh(const qd_real &a); -QD_API void sincosh(const qd_real &a, qd_real &sin_qd, qd_real &cos_qd); - -QD_API qd_real asinh(const qd_real &a); -QD_API qd_real acosh(const qd_real &a); -QD_API qd_real atanh(const qd_real &a); - -QD_API qd_real qdrand(void); - -QD_API qd_real max(const qd_real &a, const qd_real &b); -QD_API qd_real max(const qd_real &a, const qd_real &b, const qd_real &c); -QD_API qd_real min(const qd_real &a, const qd_real &b); -QD_API qd_real min(const qd_real &a, const qd_real &b, const qd_real &c); - -QD_API qd_real fmod(const qd_real &a, const qd_real &b); - -QD_API std::ostream &operator<<(std::ostream &s, const qd_real &a); -QD_API std::istream &operator>>(std::istream &s, qd_real &a); -#ifdef QD_INLINE -#include "qd_inline.h" -#endif - -#endif /* _QD_QD_REAL_H */ - diff --git a/src/external/PackedCSparse/qd/util.cc b/src/external/PackedCSparse/qd/util.cc deleted file mode 100644 index ab962081..00000000 --- a/src/external/PackedCSparse/qd/util.cc +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include "util.h" - -void append_expn(std::string &str, int expn) { - int k; - - str += (expn < 0 ? '-' : '+'); - expn = std::abs(expn); - - if (expn >= 100) { - k = (expn / 100); - str += '0' + k; - expn -= 100*k; - } - - k = (expn / 10); - str += '0' + k; - expn -= 10*k; - - str += '0' + expn; -} - diff --git a/src/external/PackedCSparse/qd/util.h b/src/external/PackedCSparse/qd/util.h deleted file mode 100644 index 7de35836..00000000 --- a/src/external/PackedCSparse/qd/util.h +++ /dev/null @@ -1,4 +0,0 @@ -#include - -void append_expn(std::string &str, int expn); - diff --git a/src/external/PackedCSparse/transpose.h b/src/external/PackedCSparse/transpose.h deleted file mode 100644 index 6e1502e3..00000000 --- a/src/external/PackedCSparse/transpose.h +++ /dev/null @@ -1,90 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis -// Copyright (c) 2022 Ioannis Iakovidis - -// This file is converted from PolytopeSamplerMatlab -//(https://github.com/ConstrainedSampler/PolytopeSamplerMatlab/blob/master/code/solver/PackedCSparse/PackedChol.h) by Ioannis Iakovidis -#pragma once -#include "SparseMatrix.h" - -// Problem: -// Compute M = A' - -// Algorithm: -// We precompute the mapping from entries of A to entries of At - -namespace PackedCSparse { - template - struct TransposeOutput : SparseMatrix - { - UniquePtr forward; - - template - void initialize(const SparseMatrix& A) - { - pcs_assert(A.initialized(), "transpose: bad inputs."); - SparseMatrix::initialize(A.n, A.m, A.nnz()); - - Ti Am = A.m, An = A.n, * Ap = A.p.get(), * Ai = A.i.get(); - Ti Bm = this->m, Bn = this->n, * Bp = this->p.get(), * Bi = this->i.get(); - Ti nz = A.nnz(); - - // compute row counts of A - Ti* count = new Ti[Bn + 1](); - - for (Ti p = 0; p < nz; p++) - count[Ai[p]]++; - - // compute this->p - Bp[0] = 0; - for (Ti i = 0; i < Bn; i++) - { - Bp[i + 1] = Bp[i] + count[i]; - count[i] = Bp[i]; // Now, cnt[i] stores the index of the first element in the i-th row - } - - // compute i and forward - if (!std::is_same::value) - forward.reset(new Ti[nz]); - for (Ti j = 0; j < An; j++) - { - for (Ti p = Ap[j]; p < Ap[j + 1]; p++) - { - Ti q = count[Ai[p]]; - Bi[q] = j; - if (!std::is_same::value) - forward[p] = q; - count[Ai[p]]++; - } - } - - delete[] count; - } - }; - - template - void transpose(TransposeOutput& o, const SparseMatrix& A) - { - if (!o.initialized()) - o.initialize(A); - - Tx* Ax = A.x.get(); Tx2 *Bx = o.x.get(); - Ti nz = o.nnz(), *forward = o.forward.get(); - - if (!std::is_same::value) - { - for (Ti s = 0; s < nz; s++) - Bx[forward[s]] = Tx2(Ax[s]); - } - } - - template - TransposeOutput transpose(const SparseMatrix& A) - { - TransposeOutput o; - transpose(o, A); - return o; - } -} diff --git a/src/external/Padua/padua.cpp b/src/external/Padua/padua.cpp deleted file mode 100644 index 3319b637..00000000 --- a/src/external/Padua/padua.cpp +++ /dev/null @@ -1,1868 +0,0 @@ -// Credit to https://people.sc.fsu.edu/~jburkardt/cpp_src/padua/padua.cpp - -# include -# include -# include -# include -# include -# include -# include -# include - - - - -#include "padua.h" - - - using std::string; - using std::cerr; - using std::ofstream; - using std::ostringstream; - using std::setprecision; - using std::cout; - using std::setw; - - -namespace padua { -//****************************************************************************80 - - void filename_inc(string *filename) - -//****************************************************************************80 -// -// Purpose: -// -// FILENAME_INC increments a partially numeric file name. -// -// Discussion: -// -// It is assumed that the digits in the name, whether scattered or -// connected, represent a number that is to be increased by 1 on -// each call. If this number is all 9's on input, the output number -// is all 0's. Non-numeric letters of the name are unaffected. -// -// If the name is empty, then the routine stops. -// -// If the name contains no digits, the empty string is returned. -// -// Example: -// -// Input Output -// ----- ------ -// "a7to11.txt" "a7to12.txt" (typical case. Last digit incremented) -// "a7to99.txt" "a8to00.txt" (last digit incremented, with carry.) -// "a9to99.txt" "a0to00.txt" (wrap around) -// "cat.txt" " " (no digits to increment) -// " " STOP! (error) -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 22 November 2011 -// -// Author: -// -// John Burkardt -// -// Parameters: -// -// Input/output, string *FILENAME, the filename to be incremented. -// - { - char c; - int change; - int i; - int lens; - - lens = (*filename).length(); - - if (lens <= 0) { - cerr << "\n"; - cerr << "FILENAME_INC - Fatal error!\n"; - cerr << " The input string is empty.\n"; - exit(1); - } - - change = 0; - - for (i = lens - 1; 0 <= i; i--) { - c = (*filename)[i]; - - if ('0' <= c && c <= '9') { - change = change + 1; - - if (c == '9') { - c = '0'; - (*filename)[i] = c; - } else { - c = c + 1; - (*filename)[i] = c; - return; - } - } - } -// -// No digits were found. Return blank. -// - if (change == 0) { - for (i = lens - 1; 0 <= i; i--) { - (*filename)[i] = ' '; - } - } - - return; - } -//****************************************************************************80 - - string i4_to_string(int i4) - -//****************************************************************************80 -// -// Purpose: -// -// I4_TO_STRING converts an I4 to a C++ string. -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 16 January 2013 -// -// Author: -// -// John Burkardt -// -// Parameters: -// -// Input, int I4, an integer. -// -// Input, string FORMAT, the format string. -// -// Output, string I4_TO_STRING, the string. -// - { - ostringstream fred; - string value; - - fred << i4; - - value = fred.str(); - - return value; - } -//****************************************************************************80 - - int padua_order(int l) - -//****************************************************************************80 -// -// Purpose: -// -// PADUA_ORDER returns the size of the Padua set of given level. -// -// Discussion: -// -// The Padua sets are indexed by a level that starts at 0. -// This function returns the number of points in each level. -// -// Example: -// -// Level Size -// ----- ---- -// 0 1 -// 1 3 -// 2 6 -// 3 10 -// 4 15 -// 5 21 -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 07 April 2014 -// -// Author: -// -// John Burkardt -// -// Reference: -// -// Marco Caliari, Stefano de Marchi, Marco Vianello, -// Bivariate interpolation on the square at new nodal sets, -// Applied Mathematics and Computation, -// Volume 165, Number 2, 2005, pages 261-274. -// -// Parameters: -// -// Input, int L, the level of the set. -// 0 <= L -// -// Output, int PADUA_ORDER, the order (number of points) in the set. -// - { - int i; - int n; - - n = 0; - for (i = 0; i <= l; i++) { - n = n + (l / 2) + 1; - if ((l % 2) == 1 && (i % 2) == 1) { - n = n + 1; - } - } - - return n; - } -//****************************************************************************80 - - void padua_plot(int l, string filename) - -//****************************************************************************80 -// -// Purpose: -// -// PADUA_PLOT plots the Padua points of given level. -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 09 June 2014 -// -// Author: -// -// John Burkardt -// -// Parameters: -// -// Input, int L, the level of the set. -// 0 <= L -// -// Input, string FILENAME, a common filename prefix for -// the files to be created. -// - { - string command_filename; - ofstream command_unit; - string data_filename; - ofstream data_unit; - int j; - int n; - string plot_filename; - double *xy; - - n = padua_order(l); - - xy = padua_points(l); -// -// Create graphics data file. -// - data_filename = filename + "_data.txt"; - data_unit.open(data_filename.c_str()); - for (j = 0; j < n; j++) { - data_unit << " " << setprecision(16) << xy[0 + j * 2] - << " " << setprecision(16) << xy[1 + j * 2] << "\n"; - } - data_unit.close(); - cout << "\n"; - cout << " Created data file '" << data_filename << "'.\n"; -// -// Create graphics command file. -// - command_filename = filename + "_commands.txt"; - command_unit.open(command_filename.c_str()); - command_unit << "# " << command_filename << "\n"; - command_unit << "#\n"; - command_unit << "# Usage:\n"; - command_unit << "# gnuplot < " << command_filename << "\n"; - command_unit << "#\n"; - command_unit << "set term png\n"; - plot_filename = filename + ".png"; - command_unit << "set output '" << plot_filename << "'\n"; - command_unit << "set xlabel '<--- X --->'\n"; - command_unit << "set ylabel '<--- Y --->'\n"; - command_unit << "set title 'Padua Points, Level " << l << "\n"; - command_unit << "set grid\n"; - command_unit << "set key off\n"; - command_unit << "set size ratio -1\n"; - command_unit << "set style data lines\n"; - command_unit << "set timestamp\n"; - command_unit << "plot [-1:+1] [-1:+1] '" << data_filename - << "' using 1:2 with points lt 3 pt 3\n"; - command_unit.close(); - - cout << " Created command file '" << command_filename << "'.\n"; -// -// Free memory. -// - delete[] xy; - - return; - } -//****************************************************************************80 - - double *padua_points(int l) - -//****************************************************************************80 -// -// Purpose: -// -// PADUA_POINTS returns the Padua points of level L. -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 09 June 2014 -// -// Author: -// -// John Burkardt -// -// Reference: -// -// Marco Caliari, Stefano de Marchi, Marco Vianello, -// Bivariate interpolation on the square at new nodal sets, -// Applied Mathematics and Computation, -// Volume 165, Number 2, 2005, pages 261-274. -// -// Parameters: -// -// Input, int L, the level of the set. -// 0 <= L -// -// Output, double PADUA_POINTS[2*((L+1)*(L+2))/2)], the Padua points. -// - { - double angle1; - double angle2; - int i; - int j; - int j_hi; - int k; - int n; - const double r8_pi = 3.141592653589793; - double *xy; - - n = ((l + 1) * (l + 2)) / 2; - xy = new double[2 * n]; - - if (l == 0) { - xy[0 + 0 * 2] = 0.0; - xy[1 + 0 * 2] = 0.0; - return xy; - } - - k = 0; - - for (i = 0; i <= l; i++) { - j_hi = (l / 2) + 1; - if ((l % 2) == 1 && (i % 2) == 1) { - j_hi = j_hi + 1; - } - - for (j = 1; j <= j_hi; j++) { - if (i * 2 == l) { - xy[0 + k * 2] = 0.0; - } else { - angle1 = (double) (i) * r8_pi / (double) (l); - xy[0 + k * 2] = cos(angle1); - } - - if ((i % 2) == 0) { - if (2 * (2 * j - 1) == l + 1) { - xy[1 + k * 2] = 0.0; - } else { - angle2 = (double) (2 * j - 1) * r8_pi / (double) (l + 1); - xy[1 + k * 2] = cos(angle2); - } - } else { - if (2 * (2 * j - 2) == l + 1) { - xy[1 + k * 2] = 0.0; - } else { - angle2 = (double) (2 * j - 2) * r8_pi / (double) (l + 1); - xy[1 + k * 2] = cos(angle2); - } - } - k = k + 1; - } - } - - return xy; - } -//****************************************************************************80 - - double *padua_points_set(int l) - -//****************************************************************************80 -// -// Purpose: -// -// PADUA_POINTS_SET sets the Padua points. -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 30 August 2016 -// -// Author: -// -// John Burkardt -// -// Reference: -// -// Marco Caliari, Stefano de Marchi, Marco Vianello, -// Bivariate interpolation on the square at new nodal sets, -// Applied Mathematics and Computation, -// Volume 165, Number 2, 2005, pages 261-274. -// -// Parameters: -// -// Input, int L, the level. -// 0 <= L <= 10. -// -// Output, double PADUA_POINTS_SET[2*N], the Padua points. -// - { - int j1; - int j1_hi; - int j2; - int n; - double t; - double *xy; - double xy00[2 * 1] = { - 0.000000000000000, 0.000000000000000}; - double xy01[2 * 3] = { - -1.000000000000000, -1.000000000000000, - -1.000000000000000, 1.000000000000000, - 1.000000000000000, 0.000000000000000}; - double xy02[2 * 6] = { - -1.000000000000000, -1.000000000000000, - -1.000000000000000, 0.5000000000000001, - 0.000000000000000, -0.4999999999999998, - 0.000000000000000, 1.000000000000000, - 1.000000000000000, -1.000000000000000, - 1.000000000000000, 0.5000000000000001}; - double xy03[2 * 10] = { - -1.000000000000000, -1.000000000000000, - -1.000000000000000, 0.000000000000000, - -1.000000000000000, 1.000000000000000, - -0.4999999999999998, -0.7071067811865475, - -0.4999999999999998, 0.7071067811865476, - 0.5000000000000001, -1.000000000000000, - 0.5000000000000001, 0.000000000000000, - 0.5000000000000001, 1.000000000000000, - 1.000000000000000, -0.7071067811865475, - 1.000000000000000, 0.7071067811865476}; - double xy04[2 * 15] = { - -1.000000000000000, -1.000000000000000, - -1.000000000000000, -0.3090169943749473, - -1.000000000000000, 0.8090169943749475, - -0.7071067811865475, -0.8090169943749473, - -0.7071067811865475, 0.3090169943749475, - -0.7071067811865475, 1.000000000000000, - 0.000000000000000, -1.000000000000000, - 0.000000000000000, -0.3090169943749473, - 0.000000000000000, 0.8090169943749475, - 0.7071067811865476, -0.8090169943749473, - 0.7071067811865476, 0.3090169943749475, - 0.7071067811865476, 1.000000000000000, - 1.000000000000000, -1.000000000000000, - 1.000000000000000, -0.3090169943749473, - 1.000000000000000, 0.8090169943749475}; - double xy05[2 * 21] = { - -1.000000000000000, -1.000000000000000, - -1.000000000000000, -0.4999999999999998, - -1.000000000000000, 0.5000000000000001, - -1.000000000000000, 1.000000000000000, - -0.8090169943749473, -0.8660254037844387, - -0.8090169943749473, 0.000000000000000, - -0.8090169943749473, 0.8660254037844387, - -0.3090169943749473, -1.000000000000000, - -0.3090169943749473, -0.4999999999999998, - -0.3090169943749473, 0.5000000000000001, - -0.3090169943749473, 1.000000000000000, - 0.3090169943749475, -0.8660254037844387, - 0.3090169943749475, 0.000000000000000, - 0.3090169943749475, 0.8660254037844387, - 0.8090169943749475, -1.000000000000000, - 0.8090169943749475, -0.4999999999999998, - 0.8090169943749475, 0.5000000000000001, - 0.8090169943749475, 1.000000000000000, - 1.000000000000000, -0.8660254037844387, - 1.000000000000000, 0.000000000000000, - 1.000000000000000, 0.8660254037844387}; - double xy06[2 * 28] = { - -1.000000000000000, -1.000000000000000, - -1.000000000000000, -0.6234898018587335, - -1.000000000000000, 0.2225209339563144, - -1.000000000000000, 0.9009688679024191, - -0.8660254037844387, -0.9009688679024190, - -0.8660254037844387, -0.2225209339563143, - -0.8660254037844387, 0.6234898018587336, - -0.8660254037844387, 1.000000000000000, - -0.4999999999999998, -1.000000000000000, - -0.4999999999999998, -0.6234898018587335, - -0.4999999999999998, 0.2225209339563144, - -0.4999999999999998, 0.9009688679024191, - 0.000000000000000, -0.9009688679024190, - 0.000000000000000, -0.2225209339563143, - 0.000000000000000, 0.6234898018587336, - 0.000000000000000, 1.000000000000000, - 0.5000000000000001, -1.000000000000000, - 0.5000000000000001, -0.6234898018587335, - 0.5000000000000001, 0.2225209339563144, - 0.5000000000000001, 0.9009688679024191, - 0.8660254037844387, -0.9009688679024190, - 0.8660254037844387, -0.2225209339563143, - 0.8660254037844387, 0.6234898018587336, - 0.8660254037844387, 1.000000000000000, - 1.000000000000000, -1.000000000000000, - 1.000000000000000, -0.6234898018587335, - 1.000000000000000, 0.2225209339563144, - 1.000000000000000, 0.9009688679024191}; - double xy07[2 * 36] = { - -1.000000000000000, -1.000000000000000, - -1.000000000000000, -0.7071067811865475, - -1.000000000000000, 0.000000000000000, - -1.000000000000000, 0.7071067811865476, - -1.000000000000000, 1.000000000000000, - -0.9009688679024190, -0.9238795325112867, - -0.9009688679024190, -0.3826834323650897, - -0.9009688679024190, 0.3826834323650898, - -0.9009688679024190, 0.9238795325112867, - -0.6234898018587335, -1.000000000000000, - -0.6234898018587335, -0.7071067811865475, - -0.6234898018587335, 0.000000000000000, - -0.6234898018587335, 0.7071067811865476, - -0.6234898018587335, 1.000000000000000, - -0.2225209339563143, -0.9238795325112867, - -0.2225209339563143, -0.3826834323650897, - -0.2225209339563143, 0.3826834323650898, - -0.2225209339563143, 0.9238795325112867, - 0.2225209339563144, -1.000000000000000, - 0.2225209339563144, -0.7071067811865475, - 0.2225209339563144, 0.000000000000000, - 0.2225209339563144, 0.7071067811865476, - 0.2225209339563144, 1.000000000000000, - 0.6234898018587336, -0.9238795325112867, - 0.6234898018587336, -0.3826834323650897, - 0.6234898018587336, 0.3826834323650898, - 0.6234898018587336, 0.9238795325112867, - 0.9009688679024191, -1.000000000000000, - 0.9009688679024191, -0.7071067811865475, - 0.9009688679024191, 0.000000000000000, - 0.9009688679024191, 0.7071067811865476, - 0.9009688679024191, 1.000000000000000, - 1.000000000000000, -0.9238795325112867, - 1.000000000000000, -0.3826834323650897, - 1.000000000000000, 0.3826834323650898, - 1.000000000000000, 0.9238795325112867}; - double xy08[2 * 45] = { - -1.000000000000000, -1.000000000000000, - -1.000000000000000, -0.7660444431189779, - -1.000000000000000, -0.1736481776669303, - -1.000000000000000, 0.5000000000000001, - -1.000000000000000, 0.9396926207859084, - -0.9238795325112867, -0.9396926207859083, - -0.9238795325112867, -0.4999999999999998, - -0.9238795325112867, 0.1736481776669304, - -0.9238795325112867, 0.7660444431189780, - -0.9238795325112867, 1.000000000000000, - -0.7071067811865475, -1.000000000000000, - -0.7071067811865475, -0.7660444431189779, - -0.7071067811865475, -0.1736481776669303, - -0.7071067811865475, 0.5000000000000001, - -0.7071067811865475, 0.9396926207859084, - -0.3826834323650897, -0.9396926207859083, - -0.3826834323650897, -0.4999999999999998, - -0.3826834323650897, 0.1736481776669304, - -0.3826834323650897, 0.7660444431189780, - -0.3826834323650897, 1.000000000000000, - 0.000000000000000, -1.000000000000000, - 0.000000000000000, -0.7660444431189779, - 0.000000000000000, -0.1736481776669303, - 0.000000000000000, 0.5000000000000001, - 0.000000000000000, 0.9396926207859084, - 0.3826834323650898, -0.9396926207859083, - 0.3826834323650898, -0.4999999999999998, - 0.3826834323650898, 0.1736481776669304, - 0.3826834323650898, 0.7660444431189780, - 0.3826834323650898, 1.000000000000000, - 0.7071067811865476, -1.000000000000000, - 0.7071067811865476, -0.7660444431189779, - 0.7071067811865476, -0.1736481776669303, - 0.7071067811865476, 0.5000000000000001, - 0.7071067811865476, 0.9396926207859084, - 0.9238795325112867, -0.9396926207859083, - 0.9238795325112867, -0.4999999999999998, - 0.9238795325112867, 0.1736481776669304, - 0.9238795325112867, 0.7660444431189780, - 0.9238795325112867, 1.000000000000000, - 1.000000000000000, -1.000000000000000, - 1.000000000000000, -0.7660444431189779, - 1.000000000000000, -0.1736481776669303, - 1.000000000000000, 0.5000000000000001, - 1.000000000000000, 0.9396926207859084}; - double xy09[2 * 55] = { - -1.000000000000000, -1.000000000000000, - -1.000000000000000, -0.8090169943749473, - -1.000000000000000, -0.3090169943749473, - -1.000000000000000, 0.3090169943749475, - -1.000000000000000, 0.8090169943749475, - -1.000000000000000, 1.000000000000000, - -0.9396926207859083, -0.9510565162951535, - -0.9396926207859083, -0.5877852522924730, - -0.9396926207859083, 0.000000000000000, - -0.9396926207859083, 0.5877852522924731, - -0.9396926207859083, 0.9510565162951535, - -0.7660444431189779, -1.000000000000000, - -0.7660444431189779, -0.8090169943749473, - -0.7660444431189779, -0.3090169943749473, - -0.7660444431189779, 0.3090169943749475, - -0.7660444431189779, 0.8090169943749475, - -0.7660444431189779, 1.000000000000000, - -0.4999999999999998, -0.9510565162951535, - -0.4999999999999998, -0.5877852522924730, - -0.4999999999999998, 0.000000000000000, - -0.4999999999999998, 0.5877852522924731, - -0.4999999999999998, 0.9510565162951535, - -0.1736481776669303, -1.000000000000000, - -0.1736481776669303, -0.8090169943749473, - -0.1736481776669303, -0.3090169943749473, - -0.1736481776669303, 0.3090169943749475, - -0.1736481776669303, 0.8090169943749475, - -0.1736481776669303, 1.000000000000000, - 0.1736481776669304, -0.9510565162951535, - 0.1736481776669304, -0.5877852522924730, - 0.1736481776669304, 0.000000000000000, - 0.1736481776669304, 0.5877852522924731, - 0.1736481776669304, 0.9510565162951535, - 0.5000000000000001, -1.000000000000000, - 0.5000000000000001, -0.8090169943749473, - 0.5000000000000001, -0.3090169943749473, - 0.5000000000000001, 0.3090169943749475, - 0.5000000000000001, 0.8090169943749475, - 0.5000000000000001, 1.000000000000000, - 0.7660444431189780, -0.9510565162951535, - 0.7660444431189780, -0.5877852522924730, - 0.7660444431189780, 0.000000000000000, - 0.7660444431189780, 0.5877852522924731, - 0.7660444431189780, 0.9510565162951535, - 0.9396926207859084, -1.000000000000000, - 0.9396926207859084, -0.8090169943749473, - 0.9396926207859084, -0.3090169943749473, - 0.9396926207859084, 0.3090169943749475, - 0.9396926207859084, 0.8090169943749475, - 0.9396926207859084, 1.000000000000000, - 1.000000000000000, -0.9510565162951535, - 1.000000000000000, -0.5877852522924730, - 1.000000000000000, 0.000000000000000, - 1.000000000000000, 0.5877852522924731, - 1.000000000000000, 0.9510565162951535}; - double xy10[2 * 66] = { - -1.000000000000000, -1.000000000000000, - -1.000000000000000, -0.8412535328311811, - -1.000000000000000, -0.4154150130018863, - -1.000000000000000, 0.1423148382732851, - -1.000000000000000, 0.6548607339452851, - -1.000000000000000, 0.9594929736144974, - -0.9510565162951535, -0.9594929736144974, - -0.9510565162951535, -0.6548607339452850, - -0.9510565162951535, -0.1423148382732850, - -0.9510565162951535, 0.4154150130018864, - -0.9510565162951535, 0.8412535328311812, - -0.9510565162951535, 1.000000000000000, - -0.8090169943749473, -1.000000000000000, - -0.8090169943749473, -0.8412535328311811, - -0.8090169943749473, -0.4154150130018863, - -0.8090169943749473, 0.1423148382732851, - -0.8090169943749473, 0.6548607339452851, - -0.8090169943749473, 0.9594929736144974, - -0.5877852522924730, -0.9594929736144974, - -0.5877852522924730, -0.6548607339452850, - -0.5877852522924730, -0.1423148382732850, - -0.5877852522924730, 0.4154150130018864, - -0.5877852522924730, 0.8412535328311812, - -0.5877852522924730, 1.000000000000000, - -0.3090169943749473, -1.000000000000000, - -0.3090169943749473, -0.8412535328311811, - -0.3090169943749473, -0.4154150130018863, - -0.3090169943749473, 0.1423148382732851, - -0.3090169943749473, 0.6548607339452851, - -0.3090169943749473, 0.9594929736144974, - 0.000000000000000, -0.9594929736144974, - 0.000000000000000, -0.6548607339452850, - 0.000000000000000, -0.1423148382732850, - 0.000000000000000, 0.4154150130018864, - 0.000000000000000, 0.8412535328311812, - 0.000000000000000, 1.000000000000000, - 0.3090169943749475, -1.000000000000000, - 0.3090169943749475, -0.8412535328311811, - 0.3090169943749475, -0.4154150130018863, - 0.3090169943749475, 0.1423148382732851, - 0.3090169943749475, 0.6548607339452851, - 0.3090169943749475, 0.9594929736144974, - 0.5877852522924731, -0.9594929736144974, - 0.5877852522924731, -0.6548607339452850, - 0.5877852522924731, -0.1423148382732850, - 0.5877852522924731, 0.4154150130018864, - 0.5877852522924731, 0.8412535328311812, - 0.5877852522924731, 1.000000000000000, - 0.8090169943749475, -1.000000000000000, - 0.8090169943749475, -0.8412535328311811, - 0.8090169943749475, -0.4154150130018863, - 0.8090169943749475, 0.1423148382732851, - 0.8090169943749475, 0.6548607339452851, - 0.8090169943749475, 0.9594929736144974, - 0.9510565162951535, -0.9594929736144974, - 0.9510565162951535, -0.6548607339452850, - 0.9510565162951535, -0.1423148382732850, - 0.9510565162951535, 0.4154150130018864, - 0.9510565162951535, 0.8412535328311812, - 0.9510565162951535, 1.000000000000000, - 1.000000000000000, -1.000000000000000, - 1.000000000000000, -0.8412535328311811, - 1.000000000000000, -0.4154150130018863, - 1.000000000000000, 0.1423148382732851, - 1.000000000000000, 0.6548607339452851, - 1.000000000000000, 0.9594929736144974}; - - n = ((l + 1) * (l + 2)) / 2; - - if (l == 0) { - xy = r8vec_copy_new(2 * n, xy00); - } else if (l == 1) { - xy = r8vec_copy_new(2 * n, xy01); - } else if (l == 2) { - xy = r8vec_copy_new(2 * n, xy02); - } else if (l == 3) { - xy = r8vec_copy_new(2 * n, xy03); - } else if (l == 4) { - xy = r8vec_copy_new(2 * n, xy04); - } else if (l == 5) { - xy = r8vec_copy_new(2 * n, xy05); - } else if (l == 6) { - xy = r8vec_copy_new(2 * n, xy06); - } else if (l == 7) { - xy = r8vec_copy_new(2 * n, xy07); - } else if (l == 8) { - xy = r8vec_copy_new(2 * n, xy08); - } else if (l == 9) { - xy = r8vec_copy_new(2 * n, xy09); - } else if (l == 10) { - xy = r8vec_copy_new(2 * n, xy10); - } else { - cerr << "\n"; - cerr << "PADUA_POINTS_SET - Fatal error!\n"; - cerr << " Illegal value of L = " << l << "\n"; - cerr << " Legal values are 1 through 10.\n"; - exit(1); - } -// -// Reverse data to match published information. -// - j1_hi = (n - 1) / 2; - - for (j1 = 0; j1 < j1_hi; j1++) { - j2 = n - 1 - j1; - t = xy[0 + 2 * j1]; - xy[0 + 2 * j1] = xy[0 + 2 * j2]; - xy[0 + 2 * j2] = t; - t = xy[1 + 2 * j1]; - xy[1 + 2 * j1] = xy[1 + 2 * j2]; - xy[1 + 2 * j2] = t; - } - - return xy; - } -//****************************************************************************80 - - double *padua_weights_set(int l) - -//****************************************************************************80 -// -// Purpose: -// -// PADUA_WEIGHTS_SET sets quadrature weights for the Padua points. -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 11 June 2014 -// -// Author: -// -// John Burkardt -// -// Reference: -// -// Marco Caliari, Stefano de Marchi, Marco Vianello, -// Bivariate interpolation on the square at new nodal sets, -// Applied Mathematics and Computation, -// Volume 165, Number 2, 2005, pages 261-274. -// -// Parameters: -// -// Input, int L, the level. -// 0 <= L <= 10. -// -// Output, double PADUA_WEIGHTS_SET[N], the quadrature weights. -// - { - int n; - double *w; - - n = ((l + 1) * (l + 2)) / 2; - w = new double[n]; - - if (l == 0) { - w[0] = 4.000000000000000E+00; - } else if (l == 1) { - w[0] = 1.000000000000000E+00; - w[1] = 1.000000000000000E+00; - w[2] = 2.000000000000000E+00; - } else if (l == 2) { - w[0] = 0.0E+00; - w[1] = 0.6666666666666663E+00; - w[2] = 2.222222222222222E+00; - w[3] = 0.4444444444444444E+00; - w[4] = 0.0E+00; - w[5] = 0.6666666666666664E+00; - } else if (l == 3) { - w[0] = -0.5555555555555480E-01; - w[1] = 0.3333333333333331E+00; - w[2] = -0.5555555555555580E-01; - w[3] = 0.8888888888888886E+00; - w[4] = 0.8888888888888893E+00; - w[5] = 0.2222222222222224E+00; - w[6] = 1.333333333333333E+00; - w[7] = 0.2222222222222220E+00; - w[8] = 0.1111111111111109E+00; - w[9] = 0.1111111111111112E+00; - } else if (l == 4) { - w[0] = -0.8888888888888932E-02; - w[1] = 0.8104919101110961E-01; - w[2] = 0.6117303121111219E-01; - w[3] = 0.3874097078666789E+00; - w[4] = 0.6259236254666545E+00; - w[5] = 0.5333333333333362E-01; - w[6] = 0.7111111111111067E-01; - w[7] = 0.9830822022444241E+00; - w[8] = 0.5458066866444642E+00; - w[9] = 0.3874097078666780E+00; - w[10] = 0.6259236254666568E+00; - w[11] = 0.5333333333333383E-01; - w[12] = -0.8888888888888703E-02; - w[13] = 0.8104919101110968E-01; - w[14] = 0.6117303121111135E-01; - } else if (l == 5) { - w[0] = -0.1037037037037093E-01; - w[1] = 0.5037037037036911E-01; - w[2] = 0.5037037037037081E-01; - w[3] = -0.1037037037036947E-01; - w[4] = 0.1876963678740801E+00; - w[5] = 0.3460933466518654E+00; - w[6] = 0.1876963678740763E+00; - w[7] = 0.4514390511851724E-01; - w[8] = 0.5541130536814713E+00; - w[9] = 0.5541130536814728E+00; - w[10] = 0.4514390511851834E-01; - w[11] = 0.2804517802740705E+00; - w[12] = 0.6376103570518378E+00; - w[13] = 0.2804517802740683E+00; - w[14] = 0.3189313191851883E-01; - w[15] = 0.3288499092814910E+00; - w[16] = 0.3288499092814925E+00; - w[17] = 0.3189313191851956E-01; - w[18] = 0.2074074074074123E-01; - w[19] = 0.3851851851851849E-01; - w[20] = 0.2074074074074051E-01; - } else if (l == 6) { - w[0] = -0.3023431594858565E-02; - w[1] = 0.1957267632451884E-01; - w[2] = 0.2633929313290840E-01; - w[3] = 0.1425431928029237E-01; - w[4] = 0.1006383046329639E+00; - w[5] = 0.2208900184526934E+00; - w[6] = 0.1743144584714012E+00; - w[7] = 0.1209372637943976E-01; - w[8] = 0.1934996220710680E-01; - w[9] = 0.3245064820875231E+00; - w[10] = 0.4027058473592984E+00; - w[11] = 0.1677234226317961E+00; - w[12] = 0.1953319357827178E+00; - w[13] = 0.4489633053035124E+00; - w[14] = 0.3721824611057551E+00; - w[15] = 0.2479213907785274E-01; - w[16] = 0.1934996220710561E-01; - w[17] = 0.3245064820875153E+00; - w[18] = 0.4027058473592959E+00; - w[19] = 0.1677234226317944E+00; - w[20] = 0.1006383046329745E+00; - w[21] = 0.2208900184526933E+00; - w[22] = 0.1743144584714027E+00; - w[23] = 0.1209372637944051E-01; - w[24] = -0.3023431594861990E-02; - w[25] = 0.1957267632451757E-01; - w[26] = 0.2633929313290797E-01; - w[27] = 0.1425431928029198E-01; - } else if (l == 7) { - w[0] = -0.3287981859413765E-02; - w[1] = 0.1337868480725671E-01; - w[2] = 0.2063492063491996E-01; - w[3] = 0.1337868480725546E-01; - w[4] = -0.3287981859408898E-02; - w[5] = 0.5949324721885513E-01; - w[6] = 0.1306477599993571E+00; - w[7] = 0.1306477599993581E+00; - w[8] = 0.5949324721885061E-01; - w[9] = 0.1263869091685831E-01; - w[10] = 0.1979944935601103E+00; - w[11] = 0.2832184784823740E+00; - w[12] = 0.1979944935601143E+00; - w[13] = 0.1263869091685747E-01; - w[14] = 0.1221817987389771E+00; - w[15] = 0.3150266070593529E+00; - w[16] = 0.3150266070593440E+00; - w[17] = 0.1221817987389802E+00; - w[18] = 0.1771365352315134E-01; - w[19] = 0.2490926964598258E+00; - w[20] = 0.3408041116306980E+00; - w[21] = 0.2490926964598291E+00; - w[22] = 0.1771365352314976E-01; - w[23] = 0.9646986307476696E-01; - w[24] = 0.2557725606433917E+00; - w[25] = 0.2557725606433927E+00; - w[26] = 0.9646986307476431E-01; - w[27] = 0.8649923133686802E-02; - w[28] = 0.1062007918394705E+00; - w[29] = 0.1505805844901012E+00; - w[30] = 0.1062007918394705E+00; - w[31] = 0.8649923133690016E-02; - w[32] = 0.6355881462931014E-02; - w[33] = 0.1405228180237514E-01; - w[34] = 0.1405228180237651E-01; - w[35] = 0.6355881462928496E-02; - } else if (l == 8) { - w[0] = -0.1269841269835311E-02; - w[1] = 0.6706089639041270E-02; - w[2] = 0.1111455441352989E-01; - w[3] = 0.1026455026455282E-01; - w[4] = 0.4930678698742625E-02; - w[5] = 0.3633146869162523E-01; - w[6] = 0.8838322767333079E-01; - w[7] = 0.9965911758463214E-01; - w[8] = 0.6400185533755555E-01; - w[9] = 0.4061629144893127E-02; - w[10] = 0.6772486772485166E-02; - w[11] = 0.1258344472781388E+00; - w[12] = 0.1927501398511116E+00; - w[13] = 0.1699470899470907E+00; - w[14] = 0.6342599488133535E-01; - w[15] = 0.8376332474107638E-01; - w[16] = 0.2170841444607031E+00; - w[17] = 0.2477307250801775E+00; - w[18] = 0.1648098048612226E+00; - w[19] = 0.1004771829779292E-01; - w[20] = 0.1015873015872910E-01; - w[21] = 0.1784328991205164E+00; - w[22] = 0.2729409493576765E+00; - w[23] = 0.2364021164021134E+00; - w[24] = 0.8936689226256009E-01; - w[25] = 0.8376332474107701E-01; - w[26] = 0.2170841444607054E+00; - w[27] = 0.2477307250801761E+00; - w[28] = 0.1648098048612200E+00; - w[29] = 0.1004771829779330E-01; - w[30] = 0.6772486772485237E-02; - w[31] = 0.1258344472781358E+00; - w[32] = 0.1927501398511135E+00; - w[33] = 0.1699470899470926E+00; - w[34] = 0.6342599488133838E-01; - w[35] = 0.3633146869162453E-01; - w[36] = 0.8838322767332588E-01; - w[37] = 0.9965911758463601E-01; - w[38] = 0.6400185533755502E-01; - w[39] = 0.4061629144888279E-02; - w[40] = -0.1269841269836355E-02; - w[41] = 0.6706089639046927E-02; - w[42] = 0.1111455441352761E-01; - w[43] = 0.1026455026454956E-01; - w[44] = 0.4930678698747173E-02; - } else if (l == 9) { - w[0] = -0.1368606701945113E-02; - w[1] = 0.4837977417140975E-02; - w[2] = 0.8876308297144902E-02; - w[3] = 0.8876308297143068E-02; - w[4] = 0.4837977417150492E-02; - w[5] = -0.1368606701935084E-02; - w[6] = 0.2425285860992349E-01; - w[7] = 0.5727330842923516E-01; - w[8] = 0.7008257906578071E-01; - w[9] = 0.5727330842922034E-01; - w[10] = 0.2425285860989794E-01; - w[11] = 0.4659404339099723E-02; - w[12] = 0.8354521980498550E-01; - w[13] = 0.1370796991940044E+00; - w[14] = 0.1370796991940248E+00; - w[15] = 0.8354521980500107E-01; - w[16] = 0.4659404339109654E-02; - w[17] = 0.5564545640233619E-01; - w[18] = 0.1524391996823315E+00; - w[19] = 0.1877107583774149E+00; - w[20] = 0.1524391996823176E+00; - w[21] = 0.5564545640232402E-01; - w[22] = 0.8186176158691754E-02; - w[23] = 0.1295355639606716E+00; - w[24] = 0.2061407656847711E+00; - w[25] = 0.2061407656847630E+00; - w[26] = 0.1295355639606894E+00; - w[27] = 0.8186176158692687E-02; - w[28] = 0.6234969028097752E-01; - w[29] = 0.1730419031522391E+00; - w[30] = 0.2169418247419051E+00; - w[31] = 0.1730419031522361E+00; - w[32] = 0.6234969028097048E-01; - w[33] = 0.7506172839505762E-02; - w[34] = 0.1142161960569350E+00; - w[35] = 0.1802176663769002E+00; - w[36] = 0.1802176663769038E+00; - w[37] = 0.1142161960569279E+00; - w[38] = 0.7506172839512260E-02; - w[39] = 0.4031900987631698E-01; - w[40] = 0.1142976211857364E+00; - w[41] = 0.1413353845521477E+00; - w[42] = 0.1142976211857414E+00; - w[43] = 0.4031900987631700E-01; - w[44] = 0.3239075586856897E-02; - w[45] = 0.4317587564913915E-01; - w[46] = 0.7015250533601934E-01; - w[47] = 0.7015250533601930E-01; - w[48] = 0.4317587564913908E-01; - w[49] = 0.3239075586852207E-02; - w[50] = 0.2550690557469151E-02; - w[51] = 0.6084230077461027E-02; - w[52] = 0.7421516754852508E-02; - w[53] = 0.6084230077458821E-02; - w[54] = 0.2550690557473353E-02; - } else if (l == 10) { - w[0] = -0.6240762604463766E-03; - w[1] = 0.2843227149025789E-02; - w[2] = 0.5250031948150784E-02; - w[3] = 0.5891746241568810E-02; - w[4] = 0.4705736485964679E-02; - w[5] = 0.2135354637732944E-02; - w[6] = 0.1610939653924566E-01; - w[7] = 0.4099595211758227E-01; - w[8] = 0.5326500934654063E-01; - w[9] = 0.4863338516658277E-01; - w[10] = 0.2843474741781434E-01; - w[11] = 0.1719619179693151E-02; - w[12] = 0.2883769745121509E-02; - w[13] = 0.5724711668876453E-01; - w[14] = 0.9659872841640438E-01; - w[15] = 0.1053210323353631E+00; - w[16] = 0.8066212502628711E-01; - w[17] = 0.2855765663647366E-01; - w[18] = 0.3981286043310814E-01; - w[19] = 0.1090390674981577E+00; - w[20] = 0.1430169021081585E+00; - w[21] = 0.1313686303763064E+00; - w[22] = 0.7932850918298831E-01; - w[23] = 0.4610696968783255E-02; - w[24] = 0.5086495679684716E-02; - w[25] = 0.9311356395361167E-01; - w[26] = 0.1562320334111262E+00; - w[27] = 0.1696057154254139E+00; - w[28] = 0.1283581371975154E+00; - w[29] = 0.4603059518094556E-01; - w[30] = 0.4894888812994630E-01; - w[31] = 0.1347281473526573E+00; - w[32] = 0.1764193542601264E+00; - w[33] = 0.1635037456303485E+00; - w[34] = 0.9822749154565460E-01; - w[35] = 0.5704840613923174E-02; - w[36] = 0.5086495679679268E-02; - w[37] = 0.9311356395362781E-01; - w[38] = 0.1562320334111511E+00; - w[39] = 0.1696057154253968E+00; - w[40] = 0.1283581371975113E+00; - w[41] = 0.4603059518094044E-01; - w[42] = 0.3981286043311782E-01; - w[43] = 0.1090390674981293E+00; - w[44] = 0.1430169021081508E+00; - w[45] = 0.1313686303763217E+00; - w[46] = 0.7932850918299997E-01; - w[47] = 0.4610696968790496E-02; - w[48] = 0.2883769745110260E-02; - w[49] = 0.5724711668875122E-01; - w[50] = 0.9659872841642343E-01; - w[51] = 0.1053210323353932E+00; - w[52] = 0.8066212502626474E-01; - w[53] = 0.2855765663644533E-01; - w[54] = 0.1610939653928420E-01; - w[55] = 0.4099595211758404E-01; - w[56] = 0.5326500934649123E-01; - w[57] = 0.4863338516656233E-01; - w[58] = 0.2843474741784810E-01; - w[59] = 0.1719619179720036E-02; - w[60] = -0.6240762604606350E-03; - w[61] = 0.2843227149011163E-02; - w[62] = 0.5250031948172295E-02; - w[63] = 0.5891746241587802E-02; - w[64] = 0.4705736485965663E-02; - w[65] = 0.2135354637703863E-02; - } else { - cerr << "\n"; - cerr << "PADUA_WEIGHTS_SET - Fatal error\n"; - cerr << " Illegal value of L = " << l << "\n"; - cerr << " Legal values are 0 through 10.\n"; - exit(1); - } -// -// Reverse order to match published data. -// - r8vec_reverse(n, w); - - return w; - } -//****************************************************************************80 - - double *padua_weights(int l) - -//****************************************************************************80 -// -// Purpose: -// -// PADUA_WEIGHTS returns quadrature weights do Padua points. -// -// Discussion: -// -// The order of the weights corresponds to the ordering used -// by the companion function padua_points(). -// -// Caliari, de Marchi and Vianello supplied a MATLAB code pdwtsMM -// which carries out this same computation in a way that makes -// more efficient use of MATLAB's vector and matrix capabilities. -// This version of the computation was painfully rewritten to display -// the individual scalar computations, so that it could be translated -// into other languages. -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 11 June 2014 -// -// Author: -// -// John Burkardt -// -// Reference: -// -// Marco Caliari, Stefano de Marchi, Marco Vianello, -// Bivariate interpolation on the square at new nodal sets, -// Applied Mathematics and Computation, -// Volume 165, Number 2, 2005, pages 261-274. -// -// Parameters: -// -// Input, int L, the level of the set. -// 0 <= L -// -// Output, double PADUA_WEIGHTS[(L+1)*(L+2)/2], the quadrature weights. -// - { - double angle; - int i; - int i2; - int j; - int j2; - int lp1h; - int lp2h; - int lp3h; - double mi; - double mj; - double *mom; - int n; - const double r8_pi = 3.141592653589793; - double *te1; - double *te2; - double *tmteo; - double *tmtoe; - double *to1; - double *to2; - double *w; - double *w1; - double *w2; - - n = ((l + 1) * (l + 2)) / 2; - w = new double[n]; - - if (l == 0) { - w[0] = 4.0; - return w; - } -// -// Relatives of L/2: -// - lp1h = (l + 1) / 2; - lp2h = (l + 2) / 2; - lp3h = (l + 3) / 2; -// -// TE1, TE2, TO1, TO2: -// Even and odd Chebyshev polynomials on subgrids 1 and 2. -// - te1 = new double[lp2h * lp2h]; - - for (j = 0; j < lp2h; j++) { - for (i = 0; i < lp2h; i++) { - angle = r8_pi * (double) (2 * i * 2 * j) / (double) (l); - te1[i + j * lp2h] = cos(angle); - } - } - - for (j = 0; j < lp2h; j++) { - for (i = 1; i < lp2h; i++) { - te1[i + j * lp2h] = te1[i + j * lp2h] * sqrt(2.0); - } - } - - to1 = new double[lp2h * lp1h]; - - for (j = 0; j < lp1h; j++) { - for (i = 0; i < lp2h; i++) { - angle = r8_pi * (double) (2 * i * (2 * j + 1)) - / (double) (l); - to1[i + j * lp2h] = cos(angle); - } - } - - for (j = 0; j < lp1h; j++) { - for (i = 1; i < lp2h; i++) { - to1[i + j * lp2h] = to1[i + j * lp2h] * sqrt(2.0); - } - } - - te2 = new double[lp2h * lp3h]; - - for (j = 0; j < lp3h; j++) { - for (i = 0; i < lp2h; i++) { - angle = r8_pi * (double) (2 * i * 2 * j) / (double) (l + 1); - te2[i + j * lp2h] = cos(angle); - } - } - - for (j = 0; j < lp3h; j++) { - for (i = 1; i < lp2h; i++) { - te2[i + j * lp2h] = te2[i + j * lp2h] * sqrt(2.0); - } - } - - to2 = new double[lp2h * lp2h]; - - for (j = 0; j < lp2h; j++) { - for (i = 0; i < lp2h; i++) { - angle = r8_pi * (double) (2 * i * (2 * j + 1)) - / (double) (l + 1); - to2[i + j * lp2h] = cos(angle); - } - } - - for (j = 0; j < lp2h; j++) { - for (i = 1; i < lp2h; i++) { - to2[i + j * lp2h] = to2[i + j * lp2h] * sqrt(2.0); - } - } -// -// MOM: Moments matrix do even * even pairs. -// - mom = new double[lp2h * lp2h]; - - for (j = 0; j < lp2h; j++) { - mj = 2.0 * sqrt(2.0) / (double) (1 - pow(2 * j, 2)); - for (i = 0; i < lp2h - j; i++) { - mi = 2.0 * sqrt(2.0) / (double) (1 - pow(2 * i, 2)); - mom[i + j * lp2h] = mi * mj; - } - } - - i = 0; - for (j = 0; j < lp2h; j++) { - mom[i + j * lp2h] = mom[i + j * lp2h] / sqrt(2.0); - } - - j = 0; - for (i = 0; i < lp2h; i++) { - mom[i + j * lp2h] = mom[i + j * lp2h] / sqrt(2.0); - } - if ((l % 2) == 0) { - i = lp2h - 1; - j = 0; - mom[i + j * lp2h] = mom[i + j * lp2h] / 2.0; - } -// -// TMTOE and TMTEO: matrix products. -// - tmtoe = new double[lp2h * lp2h]; - - for (j = 0; j < lp2h; j++) { - for (i = 0; i < lp2h; i++) { - tmtoe[i + j * lp2h] = 0.0; - } - } - - for (j2 = 0; j2 < lp2h; j2++) { - for (i2 = 0; i2 < lp2h - j2; i2++) { - for (j = 0; j < lp2h; j++) { - for (i = 0; i < lp2h; i++) { - tmtoe[i + j * lp2h] = tmtoe[i + j * lp2h] - + to2[i2 + i * lp2h] * mom[j2 + i2 * lp2h] * te1[j2 + j * lp2h]; - } - } - } - } - - tmteo = new double[lp3h * lp1h]; - - for (j = 0; j < lp1h; j++) { - for (i = 0; i < lp3h; i++) { - tmteo[i + j * lp3h] = 0.0; - } - } - - for (j2 = 0; j2 < lp2h; j2++) { - for (i2 = 0; i2 < lp2h - j2; i2++) { - for (j = 0; j < lp1h; j++) { - for (i = 0; i < lp3h; i++) { - tmteo[i + j * lp3h] = tmteo[i + j * lp3h] - + te2[i2 + i * lp2h] * mom[j2 + i2 * lp2h] * to1[j2 + j * lp2h]; - } - } - } - } -// -// W1 and W2: Interpolation weight matrices. -// - w1 = new double[lp2h * lp2h]; - - for (j = 0; j < lp2h; j++) { - for (i = 0; i < lp2h; i++) { - w1[i + j * lp2h] = 2.0 / (double) (l * (l + 1)); - } - } - - j = 0; - for (i = 0; i < lp2h; i++) { - w1[i + j * lp2h] = w1[i + j * lp2h] / 2.0; - } - - if ((l % 2) == 0) { - j = lp2h - 1; - for (i = 0; i < lp2h; i++) { - w1[i + j * lp2h] = w1[i + j * lp2h] / 2.0; - } - - i = lp2h - 1; - for (j = 0; j < lp2h; j++) { - w1[i + j * lp2h] = w1[i + j * lp2h] / 2.0; - } - } - - w2 = new double[lp3h * lp1h]; - - for (j = 0; j < lp1h; j++) { - for (i = 0; i < lp3h; i++) { - w2[i + j * lp3h] = 2.0 / (double) (l * (l + 1)); - } - } - - i = 0; - for (j = 0; j < lp1h; j++) { - w2[i + j * lp3h] = w2[i + j * lp3h] / 2.0; - } - - if ((l % 2) == 1) { - i = lp3h - 1; - for (j = 0; j < lp1h; j++) { - w2[i + j * lp3h] = w2[i + j * lp3h] / 2.0; - } - j = lp1h - 1; - for (i = 0; i < lp3h; i++) { - w2[i + j * lp3h] = w2[i + j * lp3h] / 2.0; - } - } -// -// Cubature weights as matrices on the subgrids. -// - for (j = 0; j < lp2h; j++) { - for (i = 0; i < lp2h; i++) { - w1[i + j * lp2h] = w1[i + j * lp2h] * tmtoe[i + j * lp2h]; - } - } - - for (j = 0; j < lp1h; j++) { - for (i = 0; i < lp3h; i++) { - w2[i + j * lp3h] = w2[i + j * lp3h] * tmteo[i + j * lp3h]; - } - } -// -// Pack weight matrices W1 and W2 into the vector W. -// - if ((l % 2) == 0) { - for (j = 0; j < lp2h; j++) { - for (i = 0; i < lp2h; i++) { - w[i + 2 * j * lp2h] = w1[i + j * lp2h]; - } - } - - for (j = 0; j < lp1h; j++) { - for (i = 0; i < lp3h; i++) { - w[i + (2 * j + 1) * lp2h] = w2[i + j * lp3h]; - } - } - } else { - for (j = 0; j < lp1h; j++) { - for (i = 0; i < lp2h; i++) { - w[i + j * (l + 2)] = w1[i + j * lp2h]; - } - } - - for (j = 0; j < lp1h; j++) { - for (i = 0; i < lp3h; i++) { - w[i + lp2h + j * (l + 2)] = w2[i + j * lp3h]; - } - } - - } -// -// Free memory. -// - delete[] te1; - delete[] te2; - delete[] tmteo; - delete[] tmtoe; - delete[] to1; - delete[] to2; - delete[] w1; - delete[] w2; - - return w; - } -//****************************************************************************80 - - double r8_max(double x, double y) - -//****************************************************************************80 -// -// Purpose: -// -// R8_MAX returns the maximum of two R8's. -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 18 August 2004 -// -// Author: -// -// John Burkardt -// -// Parameters: -// -// Input, double X, Y, the quantities to compare. -// -// Output, double R8_MAX, the maximum of X and Y. -// - { - double value; - - if (y < x) { - value = x; - } else { - value = y; - } - return value; - } -//****************************************************************************80 - - void r8mat_transpose_print(int m, int n, double a[], string title) - -//****************************************************************************80 -// -// Purpose: -// -// R8MAT_TRANSPOSE_PRINT prints an R8MAT, transposed. -// -// Discussion: -// -// An R8MAT is a doubly dimensioned array of R8 values, stored as a vector -// in column-major order. -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 10 September 2009 -// -// Author: -// -// John Burkardt -// -// Parameters: -// -// Input, int M, N, the number of rows and columns. -// -// Input, double A[M*N], an M by N matrix to be printed. -// -// Input, string TITLE, a title. -// - { - r8mat_transpose_print_some(m, n, a, 1, 1, m, n, title); - - return; - } -//****************************************************************************80 - - void r8mat_transpose_print_some(int m, int n, double a[], int ilo, int jlo, - int ihi, int jhi, string title) - -//****************************************************************************80 -// -// Purpose: -// -// R8MAT_TRANSPOSE_PRINT_SOME prints some of an R8MAT, transposed. -// -// Discussion: -// -// An R8MAT is a doubly dimensioned array of R8 values, stored as a vector -// in column-major order. -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 07 April 2014 -// -// Author: -// -// John Burkardt -// -// Parameters: -// -// Input, int M, N, the number of rows and columns. -// -// Input, double A[M*N], an M by N matrix to be printed. -// -// Input, int ILO, JLO, the first row and column to print. -// -// Input, int IHI, JHI, the last row and column to print. -// -// Input, string TITLE, a title. -// - { -# define INCX 5 - - int i; - int i2; - int i2hi; - int i2lo; - int i2lo_hi; - int i2lo_lo; - int inc; - int j; - int j2hi; - int j2lo; - - cout << "\n"; - cout << title << "\n"; - - if (m <= 0 || n <= 0) { - cout << "\n"; - cout << " (None)\n"; - return; - } - - if (ilo < 1) { - i2lo_lo = 1; - } else { - i2lo_lo = ilo; - } - - if (ihi < m) { - i2lo_hi = m; - } else { - i2lo_hi = ihi; - } - - for (i2lo = i2lo_lo; i2lo <= i2lo_hi; i2lo = i2lo + INCX) { - i2hi = i2lo + INCX - 1; - - if (m < i2hi) { - i2hi = m; - } - if (ihi < i2hi) { - i2hi = ihi; - } - - inc = i2hi + 1 - i2lo; - - cout << "\n"; - cout << " Row: "; - for (i = i2lo; i <= i2hi; i++) { - cout << setw(7) << i - 1 << " "; - } - cout << "\n"; - cout << " Col\n"; - cout << "\n"; - - if (jlo < 1) { - j2lo = 1; - } else { - j2lo = jlo; - } - if (n < jhi) { - j2hi = n; - } else { - j2hi = jhi; - } - - for (j = j2lo; j <= j2hi; j++) { - cout << setw(5) << j - 1 << ":"; - for (i2 = 1; i2 <= inc; i2++) { - i = i2lo - 1 + i2; - cout << setw(14) << a[(i - 1) + (j - 1) * m]; - } - cout << "\n"; - } - } - - return; -# undef INCX - } -//****************************************************************************80 - - double *r8vec_copy_new(int n, double a1[]) - -//****************************************************************************80 -// -// Purpose: -// -// R8VEC_COPY_NEW copies an R8VEC to a new R8VEC. -// -// Discussion: -// -// An R8VEC is a vector of R8's. -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 03 July 2008 -// -// Author: -// -// John Burkardt -// -// Parameters: -// -// Input, int N, the number of entries in the vectors. -// -// Input, double A1[N], the vector to be copied. -// -// Output, double R8VEC_COPY_NEW[N], the copy of A1. -// - { - double *a2; - int i; - - a2 = new double[n]; - - for (i = 0; i < n; i++) { - a2[i] = a1[i]; - } - return a2; - } -//****************************************************************************80 - - void r8vec_print(int n, double a[], string title) - -//****************************************************************************80 -// -// Purpose: -// -// R8VEC_PRINT prints an R8VEC. -// -// Discussion: -// -// An R8VEC is a vector of R8's. -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 16 August 2004 -// -// Author: -// -// John Burkardt -// -// Parameters: -// -// Input, int N, the number of components of the vector. -// -// Input, double A[N], the vector to be printed. -// -// Input, string TITLE, a title. -// - { - int i; - - cout << "\n"; - cout << title << "\n"; - cout << "\n"; - for (i = 0; i < n; i++) { - cout << " " << setw(8) << i - << ": " << setw(14) << a[i] << "\n"; - } - - return; - } -//****************************************************************************80 - - void r8vec_reverse(int n, double a[]) - -//****************************************************************************80 -// -// Purpose: -// -// R8VEC_REVERSE reverses the elements of an R8VEC. -// -// Discussion: -// -// An R8VEC is a vector of R8's. -// -// Example: -// -// Input: -// -// N = 5, A = ( 11.0, 12.0, 13.0, 14.0, 15.0 ). -// -// Output: -// -// A = ( 15.0, 14.0, 13.0, 12.0, 11.0 ). -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 18 September 2005 -// -// Author: -// -// John Burkardt -// -// Parameters: -// -// Input, int N, the number of entries in the array. -// -// Input/output, double A[N], the array to be reversed. -// - { - int i; - int i_hi; - double temp; - - i_hi = n / 2; - - for (i = 1; i <= i_hi; i++) { - temp = a[i - 1]; - a[i - 1] = a[n - i]; - a[n - i] = temp; - } - - return; - } -//****************************************************************************80 - - void timestamp() - -//****************************************************************************80 -// -// Purpose: -// -// TIMESTAMP prints the current YMDHMS date as a time stamp. -// -// Example: -// -// 31 May 2001 09:45:54 AM -// -// Licensing: -// -// This code is distributed under the GNU LGPL license. -// -// Modified: -// -// 08 July 2009 -// -// Author: -// -// John Burkardt -// -// Parameters: -// -// None -// - { -# define TIME_SIZE 40 - - static char time_buffer[TIME_SIZE]; - const struct std::tm *tm_ptr; - std::time_t now; - - now = std::time(NULL); - tm_ptr = std::localtime(&now); - - std::strftime(time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm_ptr); - - std::cout << time_buffer << "\n"; - - return; -# undef TIME_SIZE - } -} \ No newline at end of file diff --git a/src/external/Padua/padua.h b/src/external/Padua/padua.h deleted file mode 100644 index 46374e7b..00000000 --- a/src/external/Padua/padua.h +++ /dev/null @@ -1,36 +0,0 @@ -#include - -using std::string; - -namespace padua { - void filename_inc(string *filename); - - string i4_to_string(int i4); - - int padua_order(int l); - - void padua_plot(int l, string filename); - - double *padua_points(int l); - - double *padua_points_set(int l); - - double *padua_weights(int l); - - double *padua_weights_set(int l); - - double r8_max(double x, double y); - - void r8mat_transpose_print(int m, int n, double a[], string title); - - void r8mat_transpose_print_some(int m, int n, double a[], int ilo, int jlo, - int ihi, int jhi, string title); - - double *r8vec_copy_new(int n, double a1[]); - - void r8vec_print(int n, double a[], string title); - - void r8vec_reverse(int n, double a[]); - - void timestamp(); -} \ No newline at end of file diff --git a/src/external/Spectra/include/Spectra/GenEigsBase.h b/src/external/Spectra/include/Spectra/GenEigsBase.h deleted file mode 100644 index 19b12c15..00000000 --- a/src/external/Spectra/include/Spectra/GenEigsBase.h +++ /dev/null @@ -1,479 +0,0 @@ -// Copyright (C) 2018-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef GEN_EIGS_BASE_H -#define GEN_EIGS_BASE_H - -#include -#include // std::vector -#include // std::abs, std::pow, std::sqrt -#include // std::min, std::copy -#include // std::complex, std::conj, std::norm, std::abs -#include // std::invalid_argument - -#include "Util/TypeTraits.h" -#include "Util/SelectionRule.h" -#include "Util/CompInfo.h" -#include "Util/SimpleRandom.h" -#include "MatOp/internal/ArnoldiOp.h" -#include "LinAlg/UpperHessenbergQR.h" -#include "LinAlg/DoubleShiftQR.h" -#include "LinAlg/UpperHessenbergEigen.h" -#include "LinAlg/Arnoldi.h" - -namespace Spectra { - - -/// -/// \ingroup EigenSolver -/// -/// This is the base class for general eigen solvers, mainly for internal use. -/// It is kept here to provide the documentation for member functions of concrete eigen solvers -/// such as GenEigsSolver and GenEigsRealShiftSolver. -/// -template < typename Scalar, - int SelectionRule, - typename OpType, - typename BOpType > -class GenEigsBase -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef Eigen::Array Array; - typedef Eigen::Array BoolArray; - typedef Eigen::Map MapMat; - typedef Eigen::Map MapVec; - typedef Eigen::Map MapConstVec; - - typedef std::complex Complex; - typedef Eigen::Matrix ComplexMatrix; - typedef Eigen::Matrix ComplexVector; - - typedef ArnoldiOp ArnoldiOpType; - typedef Arnoldi ArnoldiFac; - -protected: - OpType* m_op; // object to conduct matrix operation, - // e.g. matrix-vector product - const Index m_n; // dimension of matrix A - const Index m_nev; // number of eigenvalues requested - const Index m_ncv; // dimension of Krylov subspace in the Arnoldi method - Index m_nmatop; // number of matrix operations called - Index m_niter; // number of restarting iterations - - ArnoldiFac m_fac; // Arnoldi factorization - - ComplexVector m_ritz_val; // Ritz values - ComplexMatrix m_ritz_vec; // Ritz vectors - ComplexVector m_ritz_est; // last row of m_ritz_vec - -private: - BoolArray m_ritz_conv; // indicator of the convergence of Ritz values - int m_info; // status of the computation - - const Scalar m_near_0; // a very small value, but 1.0 / m_near_0 does not overflow - // ~= 1e-307 for the "double" type - const Scalar m_eps; // the machine precision, ~= 1e-16 for the "double" type - const Scalar m_eps23; // m_eps^(2/3), used to test the convergence - - // Real Ritz values calculated from UpperHessenbergEigen have exact zero imaginary part - // Complex Ritz values have exact conjugate pairs - // So we use exact tests here - static bool is_complex(const Complex& v) { return v.imag() != Scalar(0); } - static bool is_conj(const Complex& v1, const Complex& v2) { return v1 == Eigen::numext::conj(v2); } - - // Implicitly restarted Arnoldi factorization - void restart(Index k) - { - using std::norm; - - if(k >= m_ncv) - return; - - DoubleShiftQR decomp_ds(m_ncv); - UpperHessenbergQR decomp_hb(m_ncv); - Matrix Q = Matrix::Identity(m_ncv, m_ncv); - - for(Index i = k; i < m_ncv; i++) - { - if(is_complex(m_ritz_val[i]) && is_conj(m_ritz_val[i], m_ritz_val[i + 1])) - { - // H - mu * I = Q1 * R1 - // H <- R1 * Q1 + mu * I = Q1' * H * Q1 - // H - conj(mu) * I = Q2 * R2 - // H <- R2 * Q2 + conj(mu) * I = Q2' * H * Q2 - // - // (H - mu * I) * (H - conj(mu) * I) = Q1 * Q2 * R2 * R1 = Q * R - const Scalar s = Scalar(2) * m_ritz_val[i].real(); - const Scalar t = norm(m_ritz_val[i]); - - decomp_ds.compute(m_fac.matrix_H(), s, t); - - // Q -> Q * Qi - decomp_ds.apply_YQ(Q); - // H -> Q'HQ - // Matrix Q = Matrix::Identity(m_ncv, m_ncv); - // decomp_ds.apply_YQ(Q); - // m_fac_H = Q.transpose() * m_fac_H * Q; - m_fac.compress_H(decomp_ds); - - i++; - } else { - // QR decomposition of H - mu * I, mu is real - decomp_hb.compute(m_fac.matrix_H(), m_ritz_val[i].real()); - - // Q -> Q * Qi - decomp_hb.apply_YQ(Q); - // H -> Q'HQ = RQ + mu * I - m_fac.compress_H(decomp_hb); - } - } - - m_fac.compress_V(Q); - m_fac.factorize_from(k, m_ncv, m_nmatop); - - retrieve_ritzpair(); - } - - // Calculates the number of converged Ritz values - Index num_converged(Scalar tol) - { - // thresh = tol * max(m_eps23, abs(theta)), theta for Ritz value - Array thresh = tol * m_ritz_val.head(m_nev).array().abs().max(m_eps23); - Array resid = m_ritz_est.head(m_nev).array().abs() * m_fac.f_norm(); - // Converged "wanted" Ritz values - m_ritz_conv = (resid < thresh); - - return m_ritz_conv.cast().sum(); - } - - // Returns the adjusted nev for restarting - Index nev_adjusted(Index nconv) - { - using std::abs; - - Index nev_new = m_nev; - for(Index i = m_nev; i < m_ncv; i++) - if(abs(m_ritz_est[i]) < m_near_0) nev_new++; - - // Adjust nev_new, according to dnaup2.f line 660~674 in ARPACK - nev_new += std::min(nconv, (m_ncv - nev_new) / 2); - if(nev_new == 1 && m_ncv >= 6) - nev_new = m_ncv / 2; - else if(nev_new == 1 && m_ncv > 3) - nev_new = 2; - - if(nev_new > m_ncv - 2) - nev_new = m_ncv - 2; - - // Increase nev by one if ritz_val[nev - 1] and - // ritz_val[nev] are conjugate pairs - if(is_complex(m_ritz_val[nev_new - 1]) && - is_conj(m_ritz_val[nev_new - 1], m_ritz_val[nev_new])) - { - nev_new++; - } - - return nev_new; - } - - // Retrieves and sorts Ritz values and Ritz vectors - void retrieve_ritzpair() - { - UpperHessenbergEigen decomp(m_fac.matrix_H()); - const ComplexVector& evals = decomp.eigenvalues(); - ComplexMatrix evecs = decomp.eigenvectors(); - - SortEigenvalue sorting(evals.data(), evals.size()); - std::vector ind = sorting.index(); - - // Copy the Ritz values and vectors to m_ritz_val and m_ritz_vec, respectively - for(Index i = 0; i < m_ncv; i++) - { - m_ritz_val[i] = evals[ind[i]]; - m_ritz_est[i] = evecs(m_ncv - 1, ind[i]); - } - for(Index i = 0; i < m_nev; i++) - { - m_ritz_vec.col(i).noalias() = evecs.col(ind[i]); - } - } - -protected: - // Sorts the first nev Ritz pairs in the specified order - // This is used to return the final results - virtual void sort_ritzpair(int sort_rule) - { - // First make sure that we have a valid index vector - SortEigenvalue sorting(m_ritz_val.data(), m_nev); - std::vector ind = sorting.index(); - - switch(sort_rule) - { - case LARGEST_MAGN: - break; - case LARGEST_REAL: - { - SortEigenvalue sorting(m_ritz_val.data(), m_nev); - ind = sorting.index(); - } - break; - case LARGEST_IMAG: - { - SortEigenvalue sorting(m_ritz_val.data(), m_nev); - ind = sorting.index(); - } - break; - case SMALLEST_MAGN: - { - SortEigenvalue sorting(m_ritz_val.data(), m_nev); - ind = sorting.index(); - } - break; - case SMALLEST_REAL: - { - SortEigenvalue sorting(m_ritz_val.data(), m_nev); - ind = sorting.index(); - } - break; - case SMALLEST_IMAG: - { - SortEigenvalue sorting(m_ritz_val.data(), m_nev); - ind = sorting.index(); - } - break; - default: - throw std::invalid_argument("unsupported sorting rule"); - } - - ComplexVector new_ritz_val(m_ncv); - ComplexMatrix new_ritz_vec(m_ncv, m_nev); - BoolArray new_ritz_conv(m_nev); - - for(Index i = 0; i < m_nev; i++) - { - new_ritz_val[i] = m_ritz_val[ind[i]]; - new_ritz_vec.col(i).noalias() = m_ritz_vec.col(ind[i]); - new_ritz_conv[i] = m_ritz_conv[ind[i]]; - } - - m_ritz_val.swap(new_ritz_val); - m_ritz_vec.swap(new_ritz_vec); - m_ritz_conv.swap(new_ritz_conv); - } - -public: - /// \cond - - GenEigsBase(OpType* op, BOpType* Bop, Index nev, Index ncv) : - m_op(op), - m_n(m_op->rows()), - m_nev(nev), - m_ncv(ncv > m_n ? m_n : ncv), - m_nmatop(0), - m_niter(0), - m_fac(ArnoldiOpType(op, Bop), m_ncv), - m_info(NOT_COMPUTED), - m_near_0(TypeTraits::min() * Scalar(10)), - m_eps(Eigen::NumTraits::epsilon()), - m_eps23(Eigen::numext::pow(m_eps, Scalar(2.0) / 3)) - { - if(nev < 1 || nev > m_n - 2) - throw std::invalid_argument("nev must satisfy 1 <= nev <= n - 2, n is the size of matrix"); - - if(ncv < nev + 2 || ncv > m_n) - throw std::invalid_argument("ncv must satisfy nev + 2 <= ncv <= n, n is the size of matrix"); - } - - /// - /// Virtual destructor - /// - virtual ~GenEigsBase() {} - - /// \endcond - - /// - /// Initializes the solver by providing an initial residual vector. - /// - /// \param init_resid Pointer to the initial residual vector. - /// - /// **Spectra** (and also **ARPACK**) uses an iterative algorithm - /// to find eigenvalues. This function allows the user to provide the initial - /// residual vector. - /// - void init(const Scalar* init_resid) - { - // Reset all matrices/vectors to zero - m_ritz_val.resize(m_ncv); - m_ritz_vec.resize(m_ncv, m_nev); - m_ritz_est.resize(m_ncv); - m_ritz_conv.resize(m_nev); - - m_ritz_val.setZero(); - m_ritz_vec.setZero(); - m_ritz_est.setZero(); - m_ritz_conv.setZero(); - - m_nmatop = 0; - m_niter = 0; - - // Initialize the Arnoldi factorization - MapConstVec v0(init_resid, m_n); - m_fac.init(v0, m_nmatop); - } - - /// - /// Initializes the solver by providing a random initial residual vector. - /// - /// This overloaded function generates a random initial residual vector - /// (with a fixed random seed) for the algorithm. Elements in the vector - /// follow independent Uniform(-0.5, 0.5) distribution. - /// - void init() - { - SimpleRandom rng(0); - Vector init_resid = rng.random_vec(m_n); - init(init_resid.data()); - } - - /// - /// Conducts the major computation procedure. - /// - /// \param maxit Maximum number of iterations allowed in the algorithm. - /// \param tol Precision parameter for the calculated eigenvalues. - /// \param sort_rule Rule to sort the eigenvalues and eigenvectors. - /// Supported values are - /// `Spectra::LARGEST_MAGN`, `Spectra::LARGEST_REAL`, - /// `Spectra::LARGEST_IMAG`, `Spectra::SMALLEST_MAGN`, - /// `Spectra::SMALLEST_REAL` and `Spectra::SMALLEST_IMAG`, - /// for example `LARGEST_MAGN` indicates that eigenvalues - /// with largest magnitude come first. - /// Note that this argument is only used to - /// **sort** the final result, and the **selection** rule - /// (e.g. selecting the largest or smallest eigenvalues in the - /// full spectrum) is specified by the template parameter - /// `SelectionRule` of GenEigsSolver. - /// - /// \return Number of converged eigenvalues. - /// - Index compute(Index maxit = 1000, Scalar tol = 1e-10, int sort_rule = LARGEST_MAGN) - { - // The m-step Arnoldi factorization - m_fac.factorize_from(1, m_ncv, m_nmatop); - retrieve_ritzpair(); - // Restarting - Index i, nconv = 0, nev_adj; - for(i = 0; i < maxit; i++) - { - nconv = num_converged(tol); - if(nconv >= m_nev) - break; - - nev_adj = nev_adjusted(nconv); - restart(nev_adj); - } - // Sorting results - sort_ritzpair(sort_rule); - - m_niter += i + 1; - m_info = (nconv >= m_nev) ? SUCCESSFUL : NOT_CONVERGING; - - return std::min(m_nev, nconv); - } - - /// - /// Returns the status of the computation. - /// The full list of enumeration values can be found in \ref Enumerations. - /// - int info() const { return m_info; } - - /// - /// Returns the number of iterations used in the computation. - /// - Index num_iterations() const { return m_niter; } - - /// - /// Returns the number of matrix operations used in the computation. - /// - Index num_operations() const { return m_nmatop; } - - /// - /// Returns the converged eigenvalues. - /// - /// \return A complex-valued vector containing the eigenvalues. - /// Returned vector type will be `Eigen::Vector, ...>`, depending on - /// the template parameter `Scalar` defined. - /// - ComplexVector eigenvalues() const - { - const Index nconv = m_ritz_conv.cast().sum(); - ComplexVector res(nconv); - - if(!nconv) - return res; - - Index j = 0; - for(Index i = 0; i < m_nev; i++) - { - if(m_ritz_conv[i]) - { - res[j] = m_ritz_val[i]; - j++; - } - } - - return res; - } - - /// - /// Returns the eigenvectors associated with the converged eigenvalues. - /// - /// \param nvec The number of eigenvectors to return. - /// - /// \return A complex-valued matrix containing the eigenvectors. - /// Returned matrix type will be `Eigen::Matrix, ...>`, - /// depending on the template parameter `Scalar` defined. - /// - ComplexMatrix eigenvectors(Index nvec) const - { - const Index nconv = m_ritz_conv.cast().sum(); - nvec = std::min(nvec, nconv); - ComplexMatrix res(m_n, nvec); - - if(!nvec) - return res; - - ComplexMatrix ritz_vec_conv(m_ncv, nvec); - Index j = 0; - for(Index i = 0; i < m_nev && j < nvec; i++) - { - if(m_ritz_conv[i]) - { - ritz_vec_conv.col(j).noalias() = m_ritz_vec.col(i); - j++; - } - } - - res.noalias() = m_fac.matrix_V() * ritz_vec_conv; - - return res; - } - - /// - /// Returns all converged eigenvectors. - /// - ComplexMatrix eigenvectors() const - { - return eigenvectors(m_nev); - } -}; - - -} // namespace Spectra - -#endif // GEN_EIGS_BASE_H diff --git a/src/external/Spectra/include/Spectra/GenEigsComplexShiftSolver.h b/src/external/Spectra/include/Spectra/GenEigsComplexShiftSolver.h deleted file mode 100644 index 2c1aee7f..00000000 --- a/src/external/Spectra/include/Spectra/GenEigsComplexShiftSolver.h +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef GEN_EIGS_COMPLEX_SHIFT_SOLVER_H -#define GEN_EIGS_COMPLEX_SHIFT_SOLVER_H - -#include - -#include "GenEigsBase.h" -#include "Util/SelectionRule.h" -#include "MatOp/DenseGenComplexShiftSolve.h" - -namespace Spectra { - - -/// -/// \ingroup EigenSolver -/// -/// This class implements the eigen solver for general real matrices with -/// a complex shift value in the **shift-and-invert mode**. The background -/// knowledge of the shift-and-invert mode can be found in the documentation -/// of the SymEigsShiftSolver class. -/// -/// \tparam Scalar The element type of the matrix. -/// Currently supported types are `float`, `double` and `long double`. -/// \tparam SelectionRule An enumeration value indicating the selection rule of -/// the shifted-and-inverted eigenvalues. -/// The full list of enumeration values can be found in -/// \ref Enumerations. -/// \tparam OpType The name of the matrix operation class. Users could either -/// use the DenseGenComplexShiftSolve wrapper class, or define their -/// own that implements all the public member functions as in -/// DenseGenComplexShiftSolve. -/// -template > -class GenEigsComplexShiftSolver: public GenEigsBase -{ -private: - typedef Eigen::Index Index; - typedef std::complex Complex; - typedef Eigen::Matrix Vector; - typedef Eigen::Matrix ComplexVector; - - const Scalar m_sigmar; - const Scalar m_sigmai; - - // First transform back the Ritz values, and then sort - void sort_ritzpair(int sort_rule) - { - using std::abs; - using std::sqrt; - using std::norm; - - // The eigenvalues we get from the iteration is - // nu = 0.5 * (1 / (lambda - sigma) + 1 / (lambda - conj(sigma))) - // So the eigenvalues of the original problem is - // 1 \pm sqrt(1 - 4 * nu^2 * sigmai^2) - // lambda = sigmar + ----------------------------------- - // 2 * nu - // We need to pick the correct root - // Let (lambdaj, vj) be the j-th eigen pair, then A * vj = lambdaj * vj - // and inv(A - r * I) * vj = 1 / (lambdaj - r) * vj - // where r is any shift value. - // We can use this identity to determine lambdaj - // - // op(v) computes Re(inv(A - r * I) * v) for any real v - // If r is real, then op(v) is also real. Let a = Re(vj), b = Im(vj), - // then op(vj) = op(a) + op(b) * i - // By comparing op(vj) and [1 / (lambdaj - r) * vj], we can determine - // which one is the correct root - - // Select a random shift value - SimpleRandom rng(0); - const Scalar shiftr = rng.random() * m_sigmar + rng.random(); - const Complex shift = Complex(shiftr, Scalar(0)); - this->m_op->set_shift(shiftr, Scalar(0)); - - // Calculate inv(A - r * I) * vj - Vector v_real(this->m_n), v_imag(this->m_n), OPv_real(this->m_n), OPv_imag(this->m_n); - const Scalar eps = Eigen::NumTraits::epsilon(); - for(Index i = 0; i < this->m_nev; i++) - { - v_real.noalias() = this->m_fac.matrix_V() * this->m_ritz_vec.col(i).real(); - v_imag.noalias() = this->m_fac.matrix_V() * this->m_ritz_vec.col(i).imag(); - this->m_op->perform_op(v_real.data(), OPv_real.data()); - this->m_op->perform_op(v_imag.data(), OPv_imag.data()); - - // Two roots computed from the quadratic equation - const Complex nu = this->m_ritz_val[i]; - const Complex root_part1 = m_sigmar + Scalar(0.5) / nu; - const Complex root_part2 = Scalar(0.5) * sqrt(Scalar(1) - Scalar(4) * m_sigmai * m_sigmai * (nu * nu)) / nu; - const Complex root1 = root_part1 + root_part2; - const Complex root2 = root_part1 - root_part2; - - // Test roots - Scalar err1 = Scalar(0), err2 = Scalar(0); - for(int k = 0; k < this->m_n; k++) - { - const Complex rhs1 = Complex(v_real[k], v_imag[k]) / (root1 - shift); - const Complex rhs2 = Complex(v_real[k], v_imag[k]) / (root2 - shift); - const Complex OPv = Complex(OPv_real[k], OPv_imag[k]); - err1 += norm(OPv - rhs1); - err2 += norm(OPv - rhs2); - } - - const Complex lambdaj = (err1 < err2) ? root1 : root2; - this->m_ritz_val[i] = lambdaj; - - if(abs(Eigen::numext::imag(lambdaj)) > eps) - { - this->m_ritz_val[i + 1] = Eigen::numext::conj(lambdaj); - i++; - } else { - this->m_ritz_val[i] = Complex(Eigen::numext::real(lambdaj), Scalar(0)); - } - } - - GenEigsBase::sort_ritzpair(sort_rule); - } -public: - /// - /// Constructor to create a eigen solver object using the shift-and-invert mode. - /// - /// \param op Pointer to the matrix operation object. This class should implement - /// the complex shift-solve operation of \f$A\f$: calculating - /// \f$\mathrm{Re}\{(A-\sigma I)^{-1}v\}\f$ for any vector \f$v\f$. Users could either - /// create the object from the DenseGenComplexShiftSolve wrapper class, or - /// define their own that implements all the public member functions - /// as in DenseGenComplexShiftSolve. - /// \param nev Number of eigenvalues requested. This should satisfy \f$1\le nev \le n-2\f$, - /// where \f$n\f$ is the size of matrix. - /// \param ncv Parameter that controls the convergence speed of the algorithm. - /// Typically a larger `ncv` means faster convergence, but it may - /// also result in greater memory use and more matrix operations - /// in each iteration. This parameter must satisfy \f$nev+2 \le ncv \le n\f$, - /// and is advised to take \f$ncv \ge 2\cdot nev + 1\f$. - /// \param sigmar The real part of the shift. - /// \param sigmai The imaginary part of the shift. - /// - GenEigsComplexShiftSolver(OpType* op, Index nev, Index ncv, const Scalar& sigmar, const Scalar& sigmai) : - GenEigsBase(op, NULL, nev, ncv), - m_sigmar(sigmar), m_sigmai(sigmai) - { - this->m_op->set_shift(m_sigmar, m_sigmai); - } -}; - - -} // namespace Spectra - -#endif // GEN_EIGS_COMPLEX_SHIFT_SOLVER_H diff --git a/src/external/Spectra/include/Spectra/GenEigsRealShiftSolver.h b/src/external/Spectra/include/Spectra/GenEigsRealShiftSolver.h deleted file mode 100644 index a7e3da8e..00000000 --- a/src/external/Spectra/include/Spectra/GenEigsRealShiftSolver.h +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef GEN_EIGS_REAL_SHIFT_SOLVER_H -#define GEN_EIGS_REAL_SHIFT_SOLVER_H - -#include - -#include "GenEigsBase.h" -#include "Util/SelectionRule.h" -#include "MatOp/DenseGenRealShiftSolve.h" - -namespace Spectra { - - -/// -/// \ingroup EigenSolver -/// -/// This class implements the eigen solver for general real matrices with -/// a real shift value in the **shift-and-invert mode**. The background -/// knowledge of the shift-and-invert mode can be found in the documentation -/// of the SymEigsShiftSolver class. -/// -/// \tparam Scalar The element type of the matrix. -/// Currently supported types are `float`, `double` and `long double`. -/// \tparam SelectionRule An enumeration value indicating the selection rule of -/// the shifted-and-inverted eigenvalues. -/// The full list of enumeration values can be found in -/// \ref Enumerations. -/// \tparam OpType The name of the matrix operation class. Users could either -/// use the wrapper classes such as DenseGenRealShiftSolve and -/// SparseGenRealShiftSolve, or define their -/// own that implements all the public member functions as in -/// DenseGenRealShiftSolve. -/// -template > -class GenEigsRealShiftSolver: public GenEigsBase -{ -private: - typedef Eigen::Index Index; - typedef std::complex Complex; - typedef Eigen::Array ComplexArray; - - const Scalar m_sigma; - - // First transform back the Ritz values, and then sort - void sort_ritzpair(int sort_rule) - { - // The eigenvalues we get from the iteration is nu = 1 / (lambda - sigma) - // So the eigenvalues of the original problem is lambda = 1 / nu + sigma - ComplexArray ritz_val_org = Scalar(1.0) / this->m_ritz_val.head(this->m_nev).array() + m_sigma; - this->m_ritz_val.head(this->m_nev) = ritz_val_org; - GenEigsBase::sort_ritzpair(sort_rule); - } -public: - /// - /// Constructor to create a eigen solver object using the shift-and-invert mode. - /// - /// \param op Pointer to the matrix operation object. This class should implement - /// the shift-solve operation of \f$A\f$: calculating - /// \f$(A-\sigma I)^{-1}v\f$ for any vector \f$v\f$. Users could either - /// create the object from the wrapper class such as DenseGenRealShiftSolve, or - /// define their own that implements all the public member functions - /// as in DenseGenRealShiftSolve. - /// \param nev Number of eigenvalues requested. This should satisfy \f$1\le nev \le n-2\f$, - /// where \f$n\f$ is the size of matrix. - /// \param ncv Parameter that controls the convergence speed of the algorithm. - /// Typically a larger `ncv` means faster convergence, but it may - /// also result in greater memory use and more matrix operations - /// in each iteration. This parameter must satisfy \f$nev+2 \le ncv \le n\f$, - /// and is advised to take \f$ncv \ge 2\cdot nev + 1\f$. - /// \param sigma The real-valued shift. - /// - GenEigsRealShiftSolver(OpType* op, Index nev, Index ncv, Scalar sigma) : - GenEigsBase(op, NULL, nev, ncv), - m_sigma(sigma) - { - this->m_op->set_shift(m_sigma); - } -}; - - -} // namespace Spectra - -#endif // GEN_EIGS_REAL_SHIFT_SOLVER_H diff --git a/src/external/Spectra/include/Spectra/GenEigsSolver.h b/src/external/Spectra/include/Spectra/GenEigsSolver.h deleted file mode 100644 index a6960acf..00000000 --- a/src/external/Spectra/include/Spectra/GenEigsSolver.h +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef GEN_EIGS_SOLVER_H -#define GEN_EIGS_SOLVER_H - -#include - -#include "GenEigsBase.h" -#include "Util/SelectionRule.h" -#include "MatOp/DenseGenMatProd.h" - -namespace Spectra { - - -/// -/// \ingroup EigenSolver -/// -/// This class implements the eigen solver for general real matrices, i.e., -/// to solve \f$Ax=\lambda x\f$ for a possibly non-symmetric \f$A\f$ matrix. -/// -/// Most of the background information documented in the SymEigsSolver class -/// also applies to the GenEigsSolver class here, except that the eigenvalues -/// and eigenvectors of a general matrix can now be complex-valued. -/// -/// \tparam Scalar The element type of the matrix. -/// Currently supported types are `float`, `double` and `long double`. -/// \tparam SelectionRule An enumeration value indicating the selection rule of -/// the requested eigenvalues, for example `LARGEST_MAGN` -/// to retrieve eigenvalues with the largest magnitude. -/// The full list of enumeration values can be found in -/// \ref Enumerations. -/// \tparam OpType The name of the matrix operation class. Users could either -/// use the wrapper classes such as DenseGenMatProd and -/// SparseGenMatProd, or define their -/// own that implements all the public member functions as in -/// DenseGenMatProd. -/// -/// An example that illustrates the usage of GenEigsSolver is give below: -/// -/// \code{.cpp} -/// #include -/// #include -/// // is implicitly included -/// #include -/// -/// using namespace Spectra; -/// -/// int main() -/// { -/// // We are going to calculate the eigenvalues of M -/// Eigen::MatrixXd M = Eigen::MatrixXd::Random(10, 10); -/// -/// // Construct matrix operation object using the wrapper class -/// DenseGenMatProd op(M); -/// -/// // Construct eigen solver object, requesting the largest -/// // (in magnitude, or norm) three eigenvalues -/// GenEigsSolver< double, LARGEST_MAGN, DenseGenMatProd > eigs(&op, 3, 6); -/// -/// // Initialize and compute -/// eigs.init(); -/// int nconv = eigs.compute(); -/// -/// // Retrieve results -/// Eigen::VectorXcd evalues; -/// if(eigs.info() == SUCCESSFUL) -/// evalues = eigs.eigenvalues(); -/// -/// std::cout << "Eigenvalues found:\n" << evalues << std::endl; -/// -/// return 0; -/// } -/// \endcode -/// -/// And also an example for sparse matrices: -/// -/// \code{.cpp} -/// #include -/// #include -/// #include -/// #include -/// #include -/// -/// using namespace Spectra; -/// -/// int main() -/// { -/// // A band matrix with 1 on the main diagonal, 2 on the below-main subdiagonal, -/// // and 3 on the above-main subdiagonal -/// const int n = 10; -/// Eigen::SparseMatrix M(n, n); -/// M.reserve(Eigen::VectorXi::Constant(n, 3)); -/// for(int i = 0; i < n; i++) -/// { -/// M.insert(i, i) = 1.0; -/// if(i > 0) -/// M.insert(i - 1, i) = 3.0; -/// if(i < n - 1) -/// M.insert(i + 1, i) = 2.0; -/// } -/// -/// // Construct matrix operation object using the wrapper class SparseGenMatProd -/// SparseGenMatProd op(M); -/// -/// // Construct eigen solver object, requesting the largest three eigenvalues -/// GenEigsSolver< double, LARGEST_MAGN, SparseGenMatProd > eigs(&op, 3, 6); -/// -/// // Initialize and compute -/// eigs.init(); -/// int nconv = eigs.compute(); -/// -/// // Retrieve results -/// Eigen::VectorXcd evalues; -/// if(eigs.info() == SUCCESSFUL) -/// evalues = eigs.eigenvalues(); -/// -/// std::cout << "Eigenvalues found:\n" << evalues << std::endl; -/// -/// return 0; -/// } -/// \endcode -template < typename Scalar = double, - int SelectionRule = LARGEST_MAGN, - typename OpType = DenseGenMatProd > -class GenEigsSolver: public GenEigsBase -{ -private: - typedef Eigen::Index Index; - -public: - /// - /// Constructor to create a solver object. - /// - /// \param op Pointer to the matrix operation object, which should implement - /// the matrix-vector multiplication operation of \f$A\f$: - /// calculating \f$Av\f$ for any vector \f$v\f$. Users could either - /// create the object from the wrapper class such as DenseGenMatProd, or - /// define their own that implements all the public member functions - /// as in DenseGenMatProd. - /// \param nev Number of eigenvalues requested. This should satisfy \f$1\le nev \le n-2\f$, - /// where \f$n\f$ is the size of matrix. - /// \param ncv Parameter that controls the convergence speed of the algorithm. - /// Typically a larger `ncv` means faster convergence, but it may - /// also result in greater memory use and more matrix operations - /// in each iteration. This parameter must satisfy \f$nev+2 \le ncv \le n\f$, - /// and is advised to take \f$ncv \ge 2\cdot nev + 1\f$. - /// - GenEigsSolver(OpType* op, Index nev, Index ncv) : - GenEigsBase(op, NULL, nev, ncv) - {} -}; - - -} // namespace Spectra - -#endif // GEN_EIGS_SOLVER_H diff --git a/src/external/Spectra/include/Spectra/LinAlg/Arnoldi.h b/src/external/Spectra/include/Spectra/LinAlg/Arnoldi.h deleted file mode 100644 index b9fa75b5..00000000 --- a/src/external/Spectra/include/Spectra/LinAlg/Arnoldi.h +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright (C) 2018-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef ARNOLDI_H -#define ARNOLDI_H - -#include -#include // std::sqrt -#include // std::invalid_argument -#include // std::stringstream - -#include "../MatOp/internal/ArnoldiOp.h" -#include "../Util/TypeTraits.h" -#include "../Util/SimpleRandom.h" -#include "UpperHessenbergQR.h" -#include "DoubleShiftQR.h" - -namespace Spectra { - - -// Arnoldi factorization A * V = V * H + f * e' -// A: n x n -// V: n x k -// H: k x k -// f: n x 1 -// e: [0, ..., 0, 1] -// V and H are allocated of dimension m, so the maximum value of k is m -template -class Arnoldi -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapMat; - typedef Eigen::Map MapVec; - typedef Eigen::Map MapConstMat; - typedef Eigen::Map MapConstVec; - -protected: - ArnoldiOpType m_op; // Operators for the Arnoldi factorization - - const Index m_n; // dimension of A - const Index m_m; // maximum dimension of subspace V - Index m_k; // current dimension of subspace V - - Matrix m_fac_V; // V matrix in the Arnoldi factorization - Matrix m_fac_H; // H matrix in the Arnoldi factorization - Vector m_fac_f; // residual in the Arnoldi factorization - Scalar m_beta; // ||f||, B-norm of f - - const Scalar m_near_0; // a very small value, but 1.0 / m_near_0 does not overflow - // ~= 1e-307 for the "double" type - const Scalar m_eps; // the machine precision, ~= 1e-16 for the "double" type - - // Given orthonormal basis functions V, find a nonzero vector f such that V'Bf = 0 - // Assume that f has been properly allocated - void expand_basis(MapConstMat& V, const Index seed, Vector& f, Scalar& fnorm) - { - using std::sqrt; - - const Scalar thresh = m_eps * sqrt(Scalar(m_n)); - Vector Vf(V.cols()); - for(Index iter = 0; iter < 5; iter++) - { - // Randomly generate a new vector and orthogonalize it against V - SimpleRandom rng(seed + 123 * iter); - f.noalias() = rng.random_vec(m_n); - // f <- f - V * V'Bf, so that f is orthogonal to V in B-norm - m_op.trans_product(V, f, Vf); - f.noalias() -= V * Vf; - // fnorm <- ||f|| - fnorm = m_op.norm(f); - - // If fnorm is too close to zero, we try a new random vector, - // otherwise return the result - if(fnorm >= thresh) - return; - } - } - -public: - Arnoldi(const ArnoldiOpType& op, Index m) : - m_op(op), m_n(op.rows()), m_m(m), m_k(0), - m_near_0(TypeTraits::min() * Scalar(10)), - m_eps(Eigen::NumTraits::epsilon()) - {} - - virtual ~Arnoldi() {} - - // Const-reference to internal structures - const Matrix& matrix_V() const { return m_fac_V; } - const Matrix& matrix_H() const { return m_fac_H; } - const Vector& vector_f() const { return m_fac_f; } - Scalar f_norm() const { return m_beta; } - Index subspace_dim() const { return m_k; } - - // Initialize with an operator and an initial vector - void init(MapConstVec& v0, Index& op_counter) - { - m_fac_V.resize(m_n, m_m); - m_fac_H.resize(m_m, m_m); - m_fac_f.resize(m_n); - m_fac_H.setZero(); - - // Verify the initial vector - const Scalar v0norm = m_op.norm(v0); - if(v0norm < m_near_0) - throw std::invalid_argument("initial residual vector cannot be zero"); - - // Points to the first column of V - MapVec v(m_fac_V.data(), m_n); - - // Normalize - v.noalias() = v0 / v0norm; - - // Compute H and f - Vector w(m_n); - m_op.perform_op(v.data(), w.data()); - op_counter++; - - m_fac_H(0, 0) = m_op.inner_product(v, w); - m_fac_f.noalias() = w - v * m_fac_H(0, 0); - - // In some cases f is zero in exact arithmetics, but due to rounding errors - // it may contain tiny fluctuations. When this happens, we force f to be zero - if(m_fac_f.cwiseAbs().maxCoeff() < m_eps) - { - m_fac_f.setZero(); - m_beta = Scalar(0); - } else { - m_beta = m_op.norm(m_fac_f); - } - - // Indicate that this is a step-1 factorization - m_k = 1; - } - - // Arnoldi factorization starting from step-k - virtual void factorize_from(Index from_k, Index to_m, Index& op_counter) - { - using std::sqrt; - - if(to_m <= from_k) return; - - if(from_k > m_k) - { - std::stringstream msg; - msg << "Arnoldi: from_k (= " << from_k << - ") is larger than the current subspace dimension (= " << - m_k << ")"; - throw std::invalid_argument(msg.str()); - } - - const Scalar beta_thresh = m_eps * sqrt(Scalar(m_n)); - - // Pre-allocate vectors - Vector Vf(to_m); - Vector w(m_n); - - // Keep the upperleft k x k submatrix of H and set other elements to 0 - m_fac_H.rightCols(m_m - from_k).setZero(); - m_fac_H.block(from_k, 0, m_m - from_k, from_k).setZero(); - - for(Index i = from_k; i <= to_m - 1; i++) - { - bool restart = false; - // If beta = 0, then the next V is not full rank - // We need to generate a new residual vector that is orthogonal - // to the current V, which we call a restart - if(m_beta < m_near_0) - { - MapConstMat V(m_fac_V.data(), m_n, i); // The first i columns - expand_basis(V, 2 * i, m_fac_f, m_beta); - restart = true; - } - - // v <- f / ||f|| - m_fac_V.col(i).noalias() = m_fac_f / m_beta; // The (i+1)-th column - - // Note that H[i+1, i] equals to the unrestarted beta - m_fac_H(i, i - 1) = restart ? Scalar(0) : m_beta; - - // w <- A * v, v = m_fac_V.col(i) - m_op.perform_op(&m_fac_V(0, i), w.data()); - op_counter++; - - const Index i1 = i + 1; - // First i+1 columns of V - MapConstMat Vs(m_fac_V.data(), m_n, i1); - // h = m_fac_H(0:i, i) - MapVec h(&m_fac_H(0, i), i1); - // h <- V'Bw - m_op.trans_product(Vs, w, h); - - // f <- w - V * h - m_fac_f.noalias() = w - Vs * h; - m_beta = m_op.norm(m_fac_f); - - if(m_beta > Scalar(0.717) * m_op.norm(h)) - continue; - - // f/||f|| is going to be the next column of V, so we need to test - // whether V'B(f/||f||) ~= 0 - m_op.trans_product(Vs, m_fac_f, Vf.head(i1)); - Scalar ortho_err = Vf.head(i1).cwiseAbs().maxCoeff(); - // If not, iteratively correct the residual - int count = 0; - while(count < 5 && ortho_err > m_eps * m_beta) - { - // There is an edge case: when beta=||f|| is close to zero, f mostly consists - // of noises of rounding errors, so the test [ortho_err < eps * beta] is very - // likely to fail. In particular, if beta=0, then the test is ensured to fail. - // Hence when this happens, we force f to be zero, and then restart in the - // next iteration. - if(m_beta < beta_thresh) - { - m_fac_f.setZero(); - m_beta = Scalar(0); - break; - } - - // f <- f - V * Vf - m_fac_f.noalias() -= Vs * Vf.head(i1); - // h <- h + Vf - h.noalias() += Vf.head(i1); - // beta <- ||f|| - m_beta = m_op.norm(m_fac_f); - - m_op.trans_product(Vs, m_fac_f, Vf.head(i1)); - ortho_err = Vf.head(i1).cwiseAbs().maxCoeff(); - count++; - } - } - - // Indicate that this is a step-m factorization - m_k = to_m; - } - - // Apply H -> Q'HQ, where Q is from a double shift QR decomposition - void compress_H(const DoubleShiftQR& decomp) - { - decomp.matrix_QtHQ(m_fac_H); - m_k -= 2; - } - - // Apply H -> Q'HQ, where Q is from an upper Hessenberg QR decomposition - void compress_H(const UpperHessenbergQR& decomp) - { - decomp.matrix_QtHQ(m_fac_H); - m_k--; - } - - // Apply V -> VQ and compute the new f. - // Should be called after compress_H(), since m_k is updated there. - // Only need to update the first k+1 columns of V - // The first (m - k + i) elements of the i-th column of Q are non-zero, - // and the rest are zero - void compress_V(const Matrix& Q) - { - Matrix Vs(m_n, m_k + 1); - for(Index i = 0; i < m_k; i++) - { - const Index nnz = m_m - m_k + i + 1; - MapConstVec q(&Q(0, i), nnz); - Vs.col(i).noalias() = m_fac_V.leftCols(nnz) * q; - } - Vs.col(m_k).noalias() = m_fac_V * Q.col(m_k); - m_fac_V.leftCols(m_k + 1).noalias() = Vs; - - Vector fk = m_fac_f * Q(m_m - 1, m_k - 1) + m_fac_V.col(m_k) * m_fac_H(m_k, m_k - 1); - m_fac_f.swap(fk); - m_beta = m_op.norm(m_fac_f); - } -}; - - -} // namespace Spectra - -#endif // ARNOLDI_H diff --git a/src/external/Spectra/include/Spectra/LinAlg/BKLDLT.h b/src/external/Spectra/include/Spectra/LinAlg/BKLDLT.h deleted file mode 100644 index 5509749b..00000000 --- a/src/external/Spectra/include/Spectra/LinAlg/BKLDLT.h +++ /dev/null @@ -1,522 +0,0 @@ -// Copyright (C) 2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef BK_LDLT_H -#define BK_LDLT_H - -#include -#include -#include - -#include "../Util/CompInfo.h" - -namespace Spectra { - - -// Bunch-Kaufman LDLT decomposition -// References: -// 1. Bunch, J. R., & Kaufman, L. (1977). Some stable methods for calculating inertia and solving symmetric linear systems. -// Mathematics of computation, 31(137), 163-179. -// 2. Golub, G. H., & Van Loan, C. F. (2012). Matrix computations (Vol. 3). JHU press. Section 4.4. -// 3. Bunch-Parlett diagonal pivoting -// 4. Ashcraft, C., Grimes, R. G., & Lewis, J. G. (1998). Accurate symmetric indefinite linear equation solvers. -// SIAM Journal on Matrix Analysis and Applications, 20(2), 513-561. -template -class BKLDLT -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapVec; - typedef Eigen::Map MapConstVec; - - typedef Eigen::Matrix IntVector; - typedef Eigen::Ref GenericVector; - typedef Eigen::Ref GenericMatrix; - typedef const Eigen::Ref ConstGenericMatrix; - typedef const Eigen::Ref ConstGenericVector; - - Index m_n; - Vector m_data; // storage for a lower-triangular matrix - std::vector m_colptr; // pointers to columns - IntVector m_perm; // [-2, -1, 3, 1, 4, 5]: 0 <-> 2, 1 <-> 1, 2 <-> 3, 3 <-> 1, 4 <-> 4, 5 <-> 5 - std::vector< std::pair > m_permc; // compressed version of m_perm: [(0, 2), (2, 3), (3, 1)] - - bool m_computed; - int m_info; - - // Access to elements - // Pointer to the k-th column - Scalar* col_pointer(Index k) { return m_colptr[k]; } - // A[i, j] -> m_colptr[j][i - j], i >= j - Scalar& coeff(Index i, Index j) { return m_colptr[j][i - j]; } - const Scalar& coeff(Index i, Index j) const { return m_colptr[j][i - j]; } - // A[i, i] -> m_colptr[i][0] - Scalar& diag_coeff(Index i) { return m_colptr[i][0]; } - const Scalar& diag_coeff(Index i) const { return m_colptr[i][0]; } - - // Compute column pointers - void compute_pointer() - { - m_colptr.clear(); - m_colptr.reserve(m_n); - Scalar* head = m_data.data(); - - for(Index i = 0; i < m_n; i++) - { - m_colptr.push_back(head); - head += (m_n - i); - } - } - - // Copy mat - shift * I to m_data - void copy_data(ConstGenericMatrix& mat, int uplo, const Scalar& shift) - { - if(uplo == Eigen::Lower) - { - for(Index j = 0; j < m_n; j++) - { - const Scalar* begin = &mat.coeffRef(j, j); - const Index len = m_n - j; - std::copy(begin, begin + len, col_pointer(j)); - diag_coeff(j) -= shift; - } - } else { - Scalar* dest = m_data.data(); - for(Index i = 0; i < m_n; i++) - { - for(Index j = i; j < m_n; j++, dest++) - { - *dest = mat.coeff(i, j); - } - diag_coeff(i) -= shift; - } - } - } - - // Compute compressed permutations - void compress_permutation() - { - for(Index i = 0; i < m_n; i++) - { - // Recover the permutation action - const Index perm = (m_perm[i] >= 0) ? (m_perm[i]) : (-m_perm[i] - 1); - if(perm != i) - m_permc.push_back(std::make_pair(i, perm)); - } - } - - // Working on the A[k:end, k:end] submatrix - // Exchange k <-> r - // Assume r >= k - void pivoting_1x1(Index k, Index r) - { - // No permutation - if(k == r) - { - m_perm[k] = r; - return; - } - - // A[k, k] <-> A[r, r] - std::swap(diag_coeff(k), diag_coeff(r)); - - // A[(r+1):end, k] <-> A[(r+1):end, r] - std::swap_ranges(&coeff(r + 1, k), col_pointer(k + 1), &coeff(r + 1, r)); - - // A[(k+1):(r-1), k] <-> A[r, (k+1):(r-1)] - Scalar* src = &coeff(k + 1, k); - for(Index j = k + 1; j < r; j++, src++) - { - std::swap(*src, coeff(r, j)); - } - - m_perm[k] = r; - } - - // Working on the A[k:end, k:end] submatrix - // Exchange [k+1, k] <-> [r, p] - // Assume p >= k, r >= k+1 - void pivoting_2x2(Index k, Index r, Index p) - { - pivoting_1x1(k, p); - pivoting_1x1(k + 1, r); - - // A[k+1, k] <-> A[r, k] - std::swap(coeff(k + 1, k), coeff(r, k)); - - // Use negative signs to indicate a 2x2 block - // Also minus one to distinguish a negative zero from a positive zero - m_perm[k] = -m_perm[k] - 1; - m_perm[k + 1] = -m_perm[k + 1] - 1; - } - - // A[r1, c1:c2] <-> A[r2, c1:c2] - // Assume r2 >= r1 > c2 >= c1 - void interchange_rows(Index r1, Index r2, Index c1, Index c2) - { - if(r1 == r2) - return; - - for(Index j = c1; j <= c2; j++) - { - std::swap(coeff(r1, j), coeff(r2, j)); - } - } - - // lambda = |A[r, k]| = max{|A[k+1, k]|, ..., |A[end, k]|} - // Largest (in magnitude) off-diagonal element in the first column of the current reduced matrix - // r is the row index - // Assume k < end - Scalar find_lambda(Index k, Index& r) - { - using std::abs; - - const Scalar* head = col_pointer(k); // => A[k, k] - const Scalar* end = col_pointer(k + 1); - // Start with r=k+1, lambda=A[k+1, k] - r = k + 1; - Scalar lambda = abs(head[1]); - // Scan remaining elements - for(const Scalar* ptr = head + 2; ptr < end; ptr++) - { - const Scalar abs_elem = abs(*ptr); - if(lambda < abs_elem) - { - lambda = abs_elem; - r = k + (ptr - head); - } - } - - return lambda; - } - - // sigma = |A[p, r]| = max {|A[k, r]|, ..., |A[end, r]|} \ {A[r, r]} - // Largest (in magnitude) off-diagonal element in the r-th column of the current reduced matrix - // p is the row index - // Assume k < r < end - Scalar find_sigma(Index k, Index r, Index& p) - { - using std::abs; - - // First search A[r+1, r], ..., A[end, r], which has the same task as find_lambda() - // If r == end, we skip this search - Scalar sigma = Scalar(-1); - if(r < m_n - 1) - sigma = find_lambda(r, p); - - // Then search A[k, r], ..., A[r-1, r], which maps to A[r, k], ..., A[r, r-1] - for(Index j = k; j < r; j++) - { - const Scalar abs_elem = abs(coeff(r, j)); - if(sigma < abs_elem) - { - sigma = abs_elem; - p = j; - } - } - - return sigma; - } - - // Generate permutations and apply to A - // Return true if the resulting pivoting is 1x1, and false if 2x2 - bool permutate_mat(Index k, const Scalar& alpha) - { - using std::abs; - - Index r = k, p = k; - const Scalar lambda = find_lambda(k, r); - - // If lambda=0, no need to interchange - if(lambda > Scalar(0)) - { - const Scalar abs_akk = abs(diag_coeff(k)); - // If |A[k, k]| >= alpha * lambda, no need to interchange - if(abs_akk < alpha * lambda) - { - const Scalar sigma = find_sigma(k, r, p); - - // If sigma * |A[k, k]| >= alpha * lambda^2, no need to interchange - if(sigma * abs_akk < alpha * lambda * lambda) - { - if(abs_akk >= alpha * sigma) - { - // Permutation on A - pivoting_1x1(k, r); - - // Permutation on L - interchange_rows(k, r, 0, k - 1); - return true; - } else { - // There are two versions of permutation here - // 1. A[k+1, k] <-> A[r, k] - // 2. A[k+1, k] <-> A[r, p], where p >= k and r >= k+1 - // - // Version 1 and 2 are used by Ref[1] and Ref[2], respectively - - // Version 1 implementation - p = k; - - // Version 2 implementation - // [r, p] and [p, r] are symmetric, but we need to make sure - // p >= k and r >= k+1, so it is safe to always make r > p - // One exception is when min{r,p} == k+1, in which case we make - // r = k+1, so that only one permutation needs to be performed - /* const Index rp_min = std::min(r, p); - const Index rp_max = std::max(r, p); - if(rp_min == k + 1) - { - r = rp_min; p = rp_max; - } else { - r = rp_max; p = rp_min; - } */ - - // Right now we use Version 1 since it reduces the overhead of interchange - - // Permutation on A - pivoting_2x2(k, r, p); - // Permutation on L - interchange_rows(k, p, 0, k - 1); - interchange_rows(k + 1, r, 0, k - 1); - return false; - } - } - } - } - - return true; - } - - // E = [e11, e12] - // [e21, e22] - // Overwrite E with inv(E) - void inverse_inplace_2x2(Scalar& e11, Scalar& e21, Scalar& e22) const - { - // inv(E) = [d11, d12], d11 = e22/delta, d21 = -e21/delta, d22 = e11/delta - // [d21, d22] - const Scalar delta = e11 * e22 - e21 * e21; - std::swap(e11, e22); - e11 /= delta; - e22 /= delta; - e21 = -e21 / delta; - } - - // Return value is the status, SUCCESSFUL/NUMERICAL_ISSUE - int gaussian_elimination_1x1(Index k) - { - // D = 1 / A[k, k] - const Scalar akk = diag_coeff(k); - // Return NUMERICAL_ISSUE if not invertible - if(akk == Scalar(0)) - return NUMERICAL_ISSUE; - - diag_coeff(k) = Scalar(1) / akk; - - // B -= l * l' / A[k, k], B := A[(k+1):end, (k+1):end], l := L[(k+1):end, k] - Scalar* lptr = col_pointer(k) + 1; - const Index ldim = m_n - k - 1; - MapVec l(lptr, ldim); - for(Index j = 0; j < ldim; j++) - { - MapVec(col_pointer(j + k + 1), ldim - j).noalias() -= (lptr[j] / akk) * l.tail(ldim - j); - } - - // l /= A[k, k] - l /= akk; - - return SUCCESSFUL; - } - - // Return value is the status, SUCCESSFUL/NUMERICAL_ISSUE - int gaussian_elimination_2x2(Index k) - { - // D = inv(E) - Scalar& e11 = diag_coeff(k); - Scalar& e21 = coeff(k + 1, k); - Scalar& e22 = diag_coeff(k + 1); - // Return NUMERICAL_ISSUE if not invertible - if(e11 * e22 - e21 * e21 == Scalar(0)) - return NUMERICAL_ISSUE; - - inverse_inplace_2x2(e11, e21, e22); - - // X = l * inv(E), l := L[(k+2):end, k:(k+1)] - Scalar* l1ptr = &coeff(k + 2, k); - Scalar* l2ptr = &coeff(k + 2, k + 1); - const Index ldim = m_n - k - 2; - MapVec l1(l1ptr, ldim), l2(l2ptr, ldim); - - Eigen::Matrix X(ldim, 2); - X.col(0).noalias() = l1 * e11 + l2 * e21; - X.col(1).noalias() = l1 * e21 + l2 * e22; - - // B -= l * inv(E) * l' = X * l', B = A[(k+2):end, (k+2):end] - for(Index j = 0; j < ldim; j++) - { - MapVec(col_pointer(j + k + 2), ldim - j).noalias() -= (X.col(0).tail(ldim - j) * l1ptr[j] + X.col(1).tail(ldim - j) * l2ptr[j]); - } - - // l = X - l1.noalias() = X.col(0); - l2.noalias() = X.col(1); - - return SUCCESSFUL; - } - -public: - BKLDLT() : - m_n(0), m_computed(false), m_info(NOT_COMPUTED) - {} - - // Factorize mat - shift * I - BKLDLT(ConstGenericMatrix& mat, int uplo = Eigen::Lower, const Scalar& shift = Scalar(0)) : - m_n(mat.rows()), m_computed(false), m_info(NOT_COMPUTED) - { - compute(mat, uplo, shift); - } - - void compute(ConstGenericMatrix& mat, int uplo = Eigen::Lower, const Scalar& shift = Scalar(0)) - { - using std::abs; - - m_n = mat.rows(); - if(m_n != mat.cols()) - throw std::invalid_argument("BKLDLT: matrix must be square"); - - m_perm.setLinSpaced(m_n, 0, m_n - 1); - m_permc.clear(); - - // Copy data - m_data.resize((m_n * (m_n + 1)) / 2); - compute_pointer(); - copy_data(mat, uplo, shift); - - const Scalar alpha = (1.0 + std::sqrt(17.0)) / 8.0; - Index k = 0; - for(k = 0; k < m_n - 1; k++) - { - // 1. Interchange rows and columns of A, and save the result to m_perm - bool is_1x1 = permutate_mat(k, alpha); - - // 2. Gaussian elimination - if(is_1x1) - { - m_info = gaussian_elimination_1x1(k); - } else { - m_info = gaussian_elimination_2x2(k); - k++; - } - - // 3. Check status - if(m_info != SUCCESSFUL) - break; - } - // Invert the last 1x1 block if it exists - if(k == m_n - 1) - { - const Scalar akk = diag_coeff(k); - if(akk == Scalar(0)) - m_info = NUMERICAL_ISSUE; - - diag_coeff(k) = Scalar(1) / diag_coeff(k); - } - - compress_permutation(); - - m_computed = true; - } - - // Solve Ax=b - void solve_inplace(GenericVector b) const - { - if(!m_computed) - throw std::logic_error("BKLDLT: need to call compute() first"); - - // PAP' = LDL' - // 1. b -> Pb - Scalar* x = b.data(); - MapVec res(x, m_n); - Index npermc = m_permc.size(); - for(Index i = 0; i < npermc; i++) - { - std::swap(x[m_permc[i].first], x[m_permc[i].second]); - } - - // 2. Lz = Pb - // If m_perm[end] < 0, then end with m_n - 3, otherwise end with m_n - 2 - const Index end = (m_perm[m_n - 1] < 0) ? (m_n - 3) : (m_n - 2); - for(Index i = 0; i <= end; i++) - { - const Index b1size = m_n - i - 1; - const Index b2size = b1size - 1; - if(m_perm[i] >= 0) - { - MapConstVec l(&coeff(i + 1, i), b1size); - res.segment(i + 1, b1size).noalias() -= l * x[i]; - } else { - MapConstVec l1(&coeff(i + 2, i), b2size); - MapConstVec l2(&coeff(i + 2, i + 1), b2size); - res.segment(i + 2, b2size).noalias() -= (l1 * x[i] + l2 * x[i + 1]); - i++; - } - } - - // 3. Dw = z - for(Index i = 0; i < m_n; i++) - { - const Scalar e11 = diag_coeff(i); - if(m_perm[i] >= 0) - { - x[i] *= e11; - } else { - const Scalar e21 = coeff(i + 1, i), e22 = diag_coeff(i + 1); - const Scalar wi = x[i] * e11 + x[i + 1] * e21; - x[i + 1] = x[i] * e21 + x[i + 1] * e22; - x[i] = wi; - i++; - } - } - - // 4. L'y = w - // If m_perm[end] < 0, then start with m_n - 3, otherwise start with m_n - 2 - Index i = (m_perm[m_n - 1] < 0) ? (m_n - 3) : (m_n - 2); - for(; i >= 0; i--) - { - const Index ldim = m_n - i - 1; - MapConstVec l(&coeff(i + 1, i), ldim); - x[i] -= res.segment(i + 1, ldim).dot(l); - - if(m_perm[i] < 0) - { - MapConstVec l2(&coeff(i + 1, i - 1), ldim); - x[i - 1] -= res.segment(i + 1, ldim).dot(l2); - i--; - } - } - - // 5. x = P'y - for(Index i = npermc - 1; i >= 0; i--) - { - std::swap(x[m_permc[i].first], x[m_permc[i].second]); - } - } - - Vector solve(ConstGenericVector& b) const - { - Vector res = b; - solve_inplace(res); - return res; - } - - int info() const { return m_info; } -}; - - -} // namespace Spectra - -#endif // BK_LDLT_H diff --git a/src/external/Spectra/include/Spectra/LinAlg/DoubleShiftQR.h b/src/external/Spectra/include/Spectra/LinAlg/DoubleShiftQR.h deleted file mode 100644 index 2191909a..00000000 --- a/src/external/Spectra/include/Spectra/LinAlg/DoubleShiftQR.h +++ /dev/null @@ -1,378 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef DOUBLE_SHIFT_QR_H -#define DOUBLE_SHIFT_QR_H - -#include -#include // std::vector -#include // std::min, std::fill, std::copy -#include // std::abs, std::sqrt, std::pow -#include // std::invalid_argument, std::logic_error - -#include "../Util/TypeTraits.h" - -namespace Spectra { - - -template -class DoubleShiftQR -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Matrix3X; - typedef Eigen::Matrix Vector; - typedef Eigen::Array IntArray; - - typedef Eigen::Ref GenericMatrix; - typedef const Eigen::Ref ConstGenericMatrix; - - Index m_n; // Dimension of the matrix - Matrix m_mat_H; // A copy of the matrix to be factorized - Scalar m_shift_s; // Shift constant - Scalar m_shift_t; // Shift constant - Matrix3X m_ref_u; // Householder reflectors - IntArray m_ref_nr; // How many rows does each reflector affects - // 3 - A general reflector - // 2 - A Givens rotation - // 1 - An identity transformation - const Scalar m_near_0; // a very small value, but 1.0 / m_safe_min does not overflow - // ~= 1e-307 for the "double" type - const Scalar m_eps; // the machine precision, - // e.g. ~= 1e-16 for the "double" type - const Scalar m_eps_rel; - const Scalar m_eps_abs; - bool m_computed; // Whether matrix has been factorized - - void compute_reflector(const Scalar& x1, const Scalar& x2, const Scalar& x3, Index ind) - { - using std::abs; - - Scalar* u = &m_ref_u.coeffRef(0, ind); - unsigned char* nr = m_ref_nr.data(); - // In general case the reflector affects 3 rows - nr[ind] = 3; - Scalar x2x3 = Scalar(0); - // If x3 is zero, decrease nr by 1 - if(abs(x3) < m_near_0) - { - // If x2 is also zero, nr will be 1, and we can exit this function - if(abs(x2) < m_near_0) - { - nr[ind] = 1; - return; - } else { - nr[ind] = 2; - } - x2x3 = abs(x2); - } else { - x2x3 = Eigen::numext::hypot(x2, x3); - } - - // x1' = x1 - rho * ||x|| - // rho = -sign(x1), if x1 == 0, we choose rho = 1 - Scalar x1_new = x1 - ((x1 <= 0) - (x1 > 0)) * Eigen::numext::hypot(x1, x2x3); - Scalar x_norm = Eigen::numext::hypot(x1_new, x2x3); - // Double check the norm of new x - if(x_norm < m_near_0) - { - nr[ind] = 1; - return; - } - u[0] = x1_new / x_norm; - u[1] = x2 / x_norm; - u[2] = x3 / x_norm; - } - - void compute_reflector(const Scalar* x, Index ind) - { - compute_reflector(x[0], x[1], x[2], ind); - } - - // Update the block X = H(il:iu, il:iu) - void update_block(Index il, Index iu) - { - // Block size - const Index bsize = iu - il + 1; - - // If block size == 1, there is no need to apply reflectors - if(bsize == 1) - { - m_ref_nr.coeffRef(il) = 1; - return; - } - - const Scalar x00 = m_mat_H.coeff(il, il), - x01 = m_mat_H.coeff(il, il + 1), - x10 = m_mat_H.coeff(il + 1, il), - x11 = m_mat_H.coeff(il + 1, il + 1); - // m00 = x00 * (x00 - s) + x01 * x10 + t - const Scalar m00 = x00 * (x00 - m_shift_s) + x01 * x10 + m_shift_t; - // m10 = x10 * (x00 + x11 - s) - const Scalar m10 = x10 * (x00 + x11 - m_shift_s); - - // For block size == 2, do a Givens rotation on M = X * X - s * X + t * I - if(bsize == 2) - { - // This causes nr=2 - compute_reflector(m00, m10, 0, il); - // Apply the reflector to X - apply_PX(m_mat_H.block(il, il, 2, m_n - il), m_n, il); - apply_XP(m_mat_H.block(0, il, il + 2, 2), m_n, il); - - m_ref_nr.coeffRef(il + 1) = 1; - return; - } - - // For block size >=3, use the regular strategy - // m20 = x21 * x10 - const Scalar m20 = m_mat_H.coeff(il + 2, il + 1) * m_mat_H.coeff(il + 1, il); - compute_reflector(m00, m10, m20, il); - - // Apply the first reflector - apply_PX(m_mat_H.block(il, il, 3, m_n - il), m_n, il); - apply_XP(m_mat_H.block(0, il, il + std::min(bsize, Index(4)), 3), m_n, il); - - // Calculate the following reflectors - // If entering this loop, block size is at least 4. - for(Index i = 1; i < bsize - 2; i++) - { - compute_reflector(&m_mat_H.coeffRef(il + i, il + i - 1), il + i); - // Apply the reflector to X - apply_PX(m_mat_H.block(il + i, il + i - 1, 3, m_n - il - i + 1), m_n, il + i); - apply_XP(m_mat_H.block(0, il + i, il + std::min(bsize, Index(i + 4)), 3), m_n, il + i); - } - - // The last reflector - // This causes nr=2 - compute_reflector(m_mat_H.coeff(iu - 1, iu - 2), m_mat_H.coeff(iu, iu - 2), 0, iu - 1); - // Apply the reflector to X - apply_PX(m_mat_H.block(iu - 1, iu - 2, 2, m_n - iu + 2), m_n, iu - 1); - apply_XP(m_mat_H.block(0, iu - 1, il + bsize, 2), m_n, iu - 1); - - m_ref_nr.coeffRef(iu) = 1; - } - - // P = I - 2 * u * u' = P' - // PX = X - 2 * u * (u'X) - void apply_PX(GenericMatrix X, Index stride, Index u_ind) const - { - const Index nr = m_ref_nr.coeff(u_ind); - if(nr == 1) - return; - - const Scalar u0 = m_ref_u.coeff(0, u_ind), - u1 = m_ref_u.coeff(1, u_ind); - const Scalar u0_2 = Scalar(2) * u0, - u1_2 = Scalar(2) * u1; - - const Index nrow = X.rows(); - const Index ncol = X.cols(); - - Scalar* xptr = X.data(); - if(nr == 2 || nrow == 2) - { - for(Index i = 0; i < ncol; i++, xptr += stride) - { - const Scalar tmp = u0_2 * xptr[0] + u1_2 * xptr[1]; - xptr[0] -= tmp * u0; - xptr[1] -= tmp * u1; - } - } else { - const Scalar u2 = m_ref_u.coeff(2, u_ind); - const Scalar u2_2 = Scalar(2) * u2; - for(Index i = 0; i < ncol; i++, xptr += stride) - { - const Scalar tmp = u0_2 * xptr[0] + u1_2 * xptr[1] + u2_2 * xptr[2]; - xptr[0] -= tmp * u0; - xptr[1] -= tmp * u1; - xptr[2] -= tmp * u2; - } - } - } - - // x is a pointer to a vector - // Px = x - 2 * dot(x, u) * u - void apply_PX(Scalar* x, Index u_ind) const - { - const Index nr = m_ref_nr.coeff(u_ind); - if(nr == 1) - return; - - const Scalar u0 = m_ref_u.coeff(0, u_ind), - u1 = m_ref_u.coeff(1, u_ind), - u2 = m_ref_u.coeff(2, u_ind); - - // When the reflector only contains two elements, u2 has been set to zero - const bool nr_is_2 = (nr == 2); - const Scalar dot2 = Scalar(2) * (x[0] * u0 + x[1] * u1 + (nr_is_2 ? 0 : (x[2] * u2))); - x[0] -= dot2 * u0; - x[1] -= dot2 * u1; - if(!nr_is_2) - x[2] -= dot2 * u2; - } - - // XP = X - 2 * (X * u) * u' - void apply_XP(GenericMatrix X, Index stride, Index u_ind) const - { - const Index nr = m_ref_nr.coeff(u_ind); - if(nr == 1) - return; - - const Scalar u0 = m_ref_u.coeff(0, u_ind), - u1 = m_ref_u.coeff(1, u_ind); - const Scalar u0_2 = Scalar(2) * u0, - u1_2 = Scalar(2) * u1; - - const int nrow = X.rows(); - const int ncol = X.cols(); - Scalar *X0 = X.data(), *X1 = X0 + stride; // X0 => X.col(0), X1 => X.col(1) - - if(nr == 2 || ncol == 2) - { - // tmp = 2 * u0 * X0 + 2 * u1 * X1 - // X0 => X0 - u0 * tmp - // X1 => X1 - u1 * tmp - for(Index i = 0; i < nrow; i++) - { - const Scalar tmp = u0_2 * X0[i] + u1_2 * X1[i]; - X0[i] -= tmp * u0; - X1[i] -= tmp * u1; - } - } else { - Scalar* X2 = X1 + stride; // X2 => X.col(2) - const Scalar u2 = m_ref_u.coeff(2, u_ind); - const Scalar u2_2 = Scalar(2) * u2; - for(Index i = 0; i < nrow; i++) - { - const Scalar tmp = u0_2 * X0[i] + u1_2 * X1[i] + u2_2 * X2[i]; - X0[i] -= tmp * u0; - X1[i] -= tmp * u1; - X2[i] -= tmp * u2; - } - } - } - -public: - DoubleShiftQR(Index size) : - m_n(size), - m_near_0(TypeTraits::min() * Scalar(10)), - m_eps(Eigen::NumTraits::epsilon()), - m_eps_rel(m_eps), - m_eps_abs(m_near_0 * (m_n / m_eps)), - m_computed(false) - {} - - DoubleShiftQR(ConstGenericMatrix& mat, const Scalar& s, const Scalar& t) : - m_n(mat.rows()), - m_mat_H(m_n, m_n), - m_shift_s(s), - m_shift_t(t), - m_ref_u(3, m_n), - m_ref_nr(m_n), - m_near_0(TypeTraits::min() * Scalar(10)), - m_eps(Eigen::NumTraits::epsilon()), - m_eps_rel(m_eps), - m_eps_abs(m_near_0 * (m_n / m_eps)), - m_computed(false) - { - compute(mat, s, t); - } - - void compute(ConstGenericMatrix& mat, const Scalar& s, const Scalar& t) - { - using std::abs; - - m_n = mat.rows(); - if(m_n != mat.cols()) - throw std::invalid_argument("DoubleShiftQR: matrix must be square"); - - m_mat_H.resize(m_n, m_n); - m_shift_s = s; - m_shift_t = t; - m_ref_u.resize(3, m_n); - m_ref_nr.resize(m_n); - - // Make a copy of mat - std::copy(mat.data(), mat.data() + mat.size(), m_mat_H.data()); - - // Obtain the indices of zero elements in the subdiagonal, - // so that H can be divided into several blocks - std::vector zero_ind; - zero_ind.reserve(m_n - 1); - zero_ind.push_back(0); - Scalar* Hii = m_mat_H.data(); - for(Index i = 0; i < m_n - 2; i++, Hii += (m_n + 1)) - { - // Hii[1] => m_mat_H(i + 1, i) - const Scalar h = abs(Hii[1]); - if(h <= 0 || h <= m_eps_rel * (abs(Hii[0]) + abs(Hii[m_n + 1]))) - { - Hii[1] = 0; - zero_ind.push_back(i + 1); - } - // Make sure m_mat_H is upper Hessenberg - // Zero the elements below m_mat_H(i + 1, i) - std::fill(Hii + 2, Hii + m_n - i, Scalar(0)); - } - zero_ind.push_back(m_n); - - for(std::vector::size_type i = 0; i < zero_ind.size() - 1; i++) - { - const Index start = zero_ind[i]; - const Index end = zero_ind[i + 1] - 1; - // Compute refelctors and update each block - update_block(start, end); - } - - m_computed = true; - } - - void matrix_QtHQ(Matrix& dest) const - { - if(!m_computed) - throw std::logic_error("DoubleShiftQR: need to call compute() first"); - - dest.noalias() = m_mat_H; - } - - // Q = P0 * P1 * ... - // Q'y = P_{n-2} * ... * P1 * P0 * y - void apply_QtY(Vector& y) const - { - if(!m_computed) - throw std::logic_error("DoubleShiftQR: need to call compute() first"); - - Scalar* y_ptr = y.data(); - const Index n1 = m_n - 1; - for(Index i = 0; i < n1; i++, y_ptr++) - { - apply_PX(y_ptr, i); - } - } - - // Q = P0 * P1 * ... - // YQ = Y * P0 * P1 * ... - void apply_YQ(GenericMatrix Y) const - { - if(!m_computed) - throw std::logic_error("DoubleShiftQR: need to call compute() first"); - - const Index nrow = Y.rows(); - const Index n2 = m_n - 2; - for(Index i = 0; i < n2; i++) - { - apply_XP(Y.block(0, i, nrow, 3), nrow, i); - } - apply_XP(Y.block(0, n2, nrow, 2), nrow, n2); - } -}; - - -} // namespace Spectra - -#endif // DOUBLE_SHIFT_QR_H diff --git a/src/external/Spectra/include/Spectra/LinAlg/Lanczos.h b/src/external/Spectra/include/Spectra/LinAlg/Lanczos.h deleted file mode 100644 index 2301dd30..00000000 --- a/src/external/Spectra/include/Spectra/LinAlg/Lanczos.h +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (C) 2018-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef LANCZOS_H -#define LANCZOS_H - -#include -#include // std::sqrt -#include // std::invalid_argument -#include // std::stringstream - -#include "Arnoldi.h" - -namespace Spectra { - - -// Lanczos factorization A * V = V * H + f * e' -// A: n x n -// V: n x k -// H: k x k -// f: n x 1 -// e: [0, ..., 0, 1] -// V and H are allocated of dimension m, so the maximum value of k is m -template -class Lanczos: public Arnoldi -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapMat; - typedef Eigen::Map MapVec; - typedef Eigen::Map MapConstMat; - typedef Eigen::Map MapConstVec; - - using Arnoldi::m_op; - using Arnoldi::m_n; - using Arnoldi::m_m; - using Arnoldi::m_k; - using Arnoldi::m_fac_V; - using Arnoldi::m_fac_H; - using Arnoldi::m_fac_f; - using Arnoldi::m_beta; - using Arnoldi::m_near_0; - using Arnoldi::m_eps; - -public: - Lanczos(const ArnoldiOpType& op, Index m) : - Arnoldi(op, m) - {} - - // Lanczos factorization starting from step-k - void factorize_from(Index from_k, Index to_m, Index& op_counter) - { - using std::sqrt; - - if(to_m <= from_k) return; - - if(from_k > m_k) - { - std::stringstream msg; - msg << "Lanczos: from_k (= " << from_k << - ") is larger than the current subspace dimension (= " << - m_k << ")"; - throw std::invalid_argument(msg.str()); - } - - const Scalar beta_thresh = m_eps * sqrt(Scalar(m_n)); - - // Pre-allocate vectors - Vector Vf(to_m); - Vector w(m_n); - - // Keep the upperleft k x k submatrix of H and set other elements to 0 - m_fac_H.rightCols(m_m - from_k).setZero(); - m_fac_H.block(from_k, 0, m_m - from_k, from_k).setZero(); - - for(Index i = from_k; i <= to_m - 1; i++) - { - bool restart = false; - // If beta = 0, then the next V is not full rank - // We need to generate a new residual vector that is orthogonal - // to the current V, which we call a restart - if(m_beta < m_near_0) - { - MapConstMat V(m_fac_V.data(), m_n, i); // The first i columns - this->expand_basis(V, 2 * i, m_fac_f, m_beta); - restart = true; - } - - // v <- f / ||f|| - MapVec v(&m_fac_V(0, i), m_n); // The (i+1)-th column - v.noalias() = m_fac_f / m_beta; - - // Note that H[i+1, i] equals to the unrestarted beta - m_fac_H(i, i - 1) = restart ? Scalar(0) : m_beta; - - // w <- A * v - m_op.perform_op(v.data(), w.data()); - op_counter++; - - // H[i+1, i+1] = = v'Bw - m_fac_H(i - 1, i) = m_fac_H(i, i - 1); // Due to symmetry - m_fac_H(i, i) = m_op.inner_product(v, w); - - // f <- w - V * V'Bw = w - H[i+1, i] * V{i} - H[i+1, i+1] * V{i+1} - // If restarting, we know that H[i+1, i] = 0 - if(restart) - m_fac_f.noalias() = w - m_fac_H(i, i) * v; - else - m_fac_f.noalias() = w - m_fac_H(i, i - 1) * m_fac_V.col(i - 1) - m_fac_H(i, i) * v; - - m_beta = m_op.norm(m_fac_f); - - // f/||f|| is going to be the next column of V, so we need to test - // whether V'B(f/||f||) ~= 0 - const Index i1 = i + 1; - MapMat Vs(m_fac_V.data(), m_n, i1); // The first (i+1) columns - m_op.trans_product(Vs, m_fac_f, Vf.head(i1)); - Scalar ortho_err = Vf.head(i1).cwiseAbs().maxCoeff(); - // If not, iteratively correct the residual - int count = 0; - while(count < 5 && ortho_err > m_eps * m_beta) - { - // There is an edge case: when beta=||f|| is close to zero, f mostly consists - // of noises of rounding errors, so the test [ortho_err < eps * beta] is very - // likely to fail. In particular, if beta=0, then the test is ensured to fail. - // Hence when this happens, we force f to be zero, and then restart in the - // next iteration. - if(m_beta < beta_thresh) - { - m_fac_f.setZero(); - m_beta = Scalar(0); - break; - } - - // f <- f - V * Vf - m_fac_f.noalias() -= Vs * Vf.head(i1); - // h <- h + Vf - m_fac_H(i - 1, i) += Vf[i - 1]; - m_fac_H(i, i - 1) = m_fac_H(i - 1, i); - m_fac_H(i, i) += Vf[i]; - // beta <- ||f|| - m_beta = m_op.norm(m_fac_f); - - m_op.trans_product(Vs, m_fac_f, Vf.head(i1)); - ortho_err = Vf.head(i1).cwiseAbs().maxCoeff(); - count++; - } - } - - // Indicate that this is a step-m factorization - m_k = to_m; - } - - // Apply H -> Q'HQ, where Q is from a tridiagonal QR decomposition - void compress_H(const TridiagQR& decomp) - { - decomp.matrix_QtHQ(m_fac_H); - m_k--; - } -}; - - -} // namespace Spectra - -#endif // LANCZOS_H diff --git a/src/external/Spectra/include/Spectra/LinAlg/TridiagEigen.h b/src/external/Spectra/include/Spectra/LinAlg/TridiagEigen.h deleted file mode 100644 index b79fe8d1..00000000 --- a/src/external/Spectra/include/Spectra/LinAlg/TridiagEigen.h +++ /dev/null @@ -1,219 +0,0 @@ -// The code was adapted from Eigen/src/Eigenvaleus/SelfAdjointEigenSolver.h -// -// Copyright (C) 2008-2010 Gael Guennebaud -// Copyright (C) 2010 Jitse Niesen -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef TRIDIAG_EIGEN_H -#define TRIDIAG_EIGEN_H - -#include -#include -#include - -#include "../Util/TypeTraits.h" - -namespace Spectra { - - -template -class TridiagEigen -{ -private: - typedef Eigen::Index Index; - // For convenience in adapting the tridiagonal_qr_step() function - typedef Scalar RealScalar; - - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - - typedef Eigen::Ref GenericMatrix; - typedef const Eigen::Ref ConstGenericMatrix; - - Index m_n; - Vector m_main_diag; // Main diagonal elements of the matrix - Vector m_sub_diag; // Sub-diagonal elements of the matrix - Matrix m_evecs; // To store eigenvectors - - bool m_computed; - const Scalar m_near_0; // a very small value, ~= 1e-307 for the "double" type - - // Adapted from Eigen/src/Eigenvaleus/SelfAdjointEigenSolver.h - static void tridiagonal_qr_step(RealScalar* diag, - RealScalar* subdiag, Index start, - Index end, Scalar* matrixQ, - Index n) - { - using std::abs; - - RealScalar td = (diag[end-1] - diag[end]) * RealScalar(0.5); - RealScalar e = subdiag[end-1]; - // Note that thanks to scaling, e^2 or td^2 cannot overflow, however they can still - // underflow thus leading to inf/NaN values when using the following commented code: - // RealScalar e2 = numext::abs2(subdiag[end-1]); - // RealScalar mu = diag[end] - e2 / (td + (td>0 ? 1 : -1) * sqrt(td*td + e2)); - // This explain the following, somewhat more complicated, version: - RealScalar mu = diag[end]; - if(td == Scalar(0)) - mu -= abs(e); - else - { - RealScalar e2 = Eigen::numext::abs2(subdiag[end-1]); - RealScalar h = Eigen::numext::hypot(td, e); - if(e2==RealScalar(0)) mu -= (e / (td + (td>RealScalar(0) ? RealScalar(1) : RealScalar(-1)))) * (e / h); - else mu -= e2 / (td + (td>RealScalar(0) ? h : -h)); - } - - RealScalar x = diag[start] - mu; - RealScalar z = subdiag[start]; - Eigen::Map q(matrixQ, n, n); - for(Index k = start; k < end; ++k) - { - Eigen::JacobiRotation rot; - rot.makeGivens(x, z); - - const RealScalar s = rot.s(); - const RealScalar c = rot.c(); - - // do T = G' T G - RealScalar sdk = s * diag[k] + c * subdiag[k]; - RealScalar dkp1 = s * subdiag[k] + c * diag[k + 1]; - - diag[k] = c * (c * diag[k] - s * subdiag[k]) - s * (c * subdiag[k] - s * diag[k + 1]); - diag[k + 1] = s * sdk + c * dkp1; - subdiag[k] = c * sdk - s * dkp1; - - if(k > start) - subdiag[k - 1] = c * subdiag[k - 1] - s * z; - - x = subdiag[k]; - - if(k < end - 1) - { - z = -s * subdiag[k+1]; - subdiag[k + 1] = c * subdiag[k + 1]; - } - - // apply the givens rotation to the unit matrix Q = Q * G - if(matrixQ) - q.applyOnTheRight(k, k + 1, rot); - } - } - -public: - TridiagEigen() : - m_n(0), m_computed(false), - m_near_0(TypeTraits::min() * Scalar(10)) - {} - - TridiagEigen(ConstGenericMatrix& mat) : - m_n(mat.rows()), m_computed(false), - m_near_0(TypeTraits::min() * Scalar(10)) - { - compute(mat); - } - - void compute(ConstGenericMatrix& mat) - { - using std::abs; - - m_n = mat.rows(); - if(m_n != mat.cols()) - throw std::invalid_argument("TridiagEigen: matrix must be square"); - - m_main_diag.resize(m_n); - m_sub_diag.resize(m_n - 1); - m_evecs.resize(m_n, m_n); - m_evecs.setIdentity(); - - // Scale matrix to improve stability - const Scalar scale = std::max(mat.diagonal().cwiseAbs().maxCoeff(), - mat.diagonal(-1).cwiseAbs().maxCoeff()); - // If scale=0, mat is a zero matrix, so we can early stop - if(scale < m_near_0) - { - // m_main_diag contains eigenvalues - m_main_diag.setZero(); - // m_evecs has been set identity - // m_evecs.setIdentity(); - m_computed = true; - return; - } - m_main_diag.noalias() = mat.diagonal() / scale; - m_sub_diag.noalias() = mat.diagonal(-1) / scale; - - Scalar* diag = m_main_diag.data(); - Scalar* subdiag = m_sub_diag.data(); - - Index end = m_n - 1; - Index start = 0; - Index iter = 0; // total number of iterations - int info = 0; // 0 for success, 1 for failure - - const Scalar considerAsZero = TypeTraits::min(); - const Scalar precision = Scalar(2) * Eigen::NumTraits::epsilon(); - - while(end > 0) - { - for(Index i = start; i < end; i++) - if(abs(subdiag[i]) <= considerAsZero || - abs(subdiag[i]) <= (abs(diag[i]) + abs(diag[i + 1])) * precision) - subdiag[i] = 0; - - // find the largest unreduced block - while(end > 0 && subdiag[end - 1] == Scalar(0)) - end--; - - if(end <= 0) - break; - - // if we spent too many iterations, we give up - iter++; - if(iter > 30 * m_n) - { - info = 1; - break; - } - - start = end - 1; - while(start > 0 && subdiag[start - 1] != Scalar(0)) - start--; - - tridiagonal_qr_step(diag, subdiag, start, end, m_evecs.data(), m_n); - } - - if(info > 0) - throw std::runtime_error("TridiagEigen: eigen decomposition failed"); - - // Scale eigenvalues back - m_main_diag *= scale; - - m_computed = true; - } - - const Vector& eigenvalues() const - { - if(!m_computed) - throw std::logic_error("TridiagEigen: need to call compute() first"); - - // After calling compute(), main_diag will contain the eigenvalues. - return m_main_diag; - } - - const Matrix& eigenvectors() const - { - if(!m_computed) - throw std::logic_error("TridiagEigen: need to call compute() first"); - - return m_evecs; - } -}; - - -} // namespace Spectra - -#endif // TRIDIAG_EIGEN_H diff --git a/src/external/Spectra/include/Spectra/LinAlg/UpperHessenbergEigen.h b/src/external/Spectra/include/Spectra/LinAlg/UpperHessenbergEigen.h deleted file mode 100644 index 4e099f56..00000000 --- a/src/external/Spectra/include/Spectra/LinAlg/UpperHessenbergEigen.h +++ /dev/null @@ -1,317 +0,0 @@ -// The code was adapted from Eigen/src/Eigenvaleus/EigenSolver.h -// -// Copyright (C) 2008 Gael Guennebaud -// Copyright (C) 2010,2012 Jitse Niesen -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef UPPER_HESSENBERG_EIGEN_H -#define UPPER_HESSENBERG_EIGEN_H - -#include -#include -#include - -namespace Spectra { - - -template -class UpperHessenbergEigen -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - - typedef Eigen::Ref GenericMatrix; - typedef const Eigen::Ref ConstGenericMatrix; - - typedef std::complex Complex; - typedef Eigen::Matrix ComplexMatrix; - typedef Eigen::Matrix ComplexVector; - - Index m_n; // Size of the matrix - Eigen::RealSchur m_realSchur; // Schur decomposition solver - Matrix m_matT; // Schur T matrix - Matrix m_eivec; // Storing eigenvectors - ComplexVector m_eivalues; // Eigenvalues - - bool m_computed; - - void doComputeEigenvectors() - { - using std::abs; - - const Index size = m_eivec.cols(); - const Scalar eps = Eigen::NumTraits::epsilon(); - - // inefficient! this is already computed in RealSchur - Scalar norm(0); - for(Index j = 0; j < size; ++j) - { - norm += m_matT.row(j).segment((std::max)(j-1, Index(0)), size-(std::max)(j-1, Index(0))).cwiseAbs().sum(); - } - - // Backsubstitute to find vectors of upper triangular form - if(norm == Scalar(0)) - return; - - for(Index n = size - 1; n >= 0; n--) - { - Scalar p = m_eivalues.coeff(n).real(); - Scalar q = m_eivalues.coeff(n).imag(); - - // Scalar vector - if(q == Scalar(0)) - { - Scalar lastr(0), lastw(0); - Index l = n; - - m_matT.coeffRef(n,n) = Scalar(1); - for(Index i = n-1; i >= 0; i--) - { - Scalar w = m_matT.coeff(i,i) - p; - Scalar r = m_matT.row(i).segment(l,n-l+1).dot(m_matT.col(n).segment(l, n-l+1)); - - if(m_eivalues.coeff(i).imag() < Scalar(0)) - { - lastw = w; - lastr = r; - } else { - l = i; - if(m_eivalues.coeff(i).imag() == Scalar(0)) - { - if (w != Scalar(0)) - m_matT.coeffRef(i,n) = -r / w; - else - m_matT.coeffRef(i,n) = -r / (eps * norm); - } - else // Solve real equations - { - Scalar x = m_matT.coeff(i,i+1); - Scalar y = m_matT.coeff(i+1,i); - Scalar denom = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) + m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag(); - Scalar t = (x * lastr - lastw * r) / denom; - m_matT.coeffRef(i,n) = t; - if(abs(x) > abs(lastw)) - m_matT.coeffRef(i+1,n) = (-r - w * t) / x; - else - m_matT.coeffRef(i+1,n) = (-lastr - y * t) / lastw; - } - - // Overflow control - Scalar t = abs(m_matT.coeff(i,n)); - if((eps * t) * t > Scalar(1)) - m_matT.col(n).tail(size-i) /= t; - } - } - } else if(q < Scalar(0) && n > 0) { // Complex vector - Scalar lastra(0), lastsa(0), lastw(0); - Index l = n-1; - - // Last vector component imaginary so matrix is triangular - if(abs(m_matT.coeff(n,n-1)) > abs(m_matT.coeff(n-1,n))) - { - m_matT.coeffRef(n-1,n-1) = q / m_matT.coeff(n,n-1); - m_matT.coeffRef(n-1,n) = -(m_matT.coeff(n,n) - p) / m_matT.coeff(n,n-1); - } - else - { - Complex cc = Complex(Scalar(0),-m_matT.coeff(n-1,n)) / Complex(m_matT.coeff(n-1,n-1)-p,q); - m_matT.coeffRef(n-1,n-1) = Eigen::numext::real(cc); - m_matT.coeffRef(n-1,n) = Eigen::numext::imag(cc); - } - m_matT.coeffRef(n,n-1) = Scalar(0); - m_matT.coeffRef(n,n) = Scalar(1); - for(Index i = n-2; i >= 0; i--) - { - Scalar ra = m_matT.row(i).segment(l, n-l+1).dot(m_matT.col(n-1).segment(l, n-l+1)); - Scalar sa = m_matT.row(i).segment(l, n-l+1).dot(m_matT.col(n).segment(l, n-l+1)); - Scalar w = m_matT.coeff(i,i) - p; - - if(m_eivalues.coeff(i).imag() < Scalar(0)) - { - lastw = w; - lastra = ra; - lastsa = sa; - } - else - { - l = i; - if(m_eivalues.coeff(i).imag() == Scalar(0)) - { - Complex cc = Complex(-ra,-sa) / Complex(w,q); - m_matT.coeffRef(i,n-1) = Eigen::numext::real(cc); - m_matT.coeffRef(i,n) = Eigen::numext::imag(cc); - } - else - { - // Solve complex equations - Scalar x = m_matT.coeff(i,i+1); - Scalar y = m_matT.coeff(i+1,i); - Scalar vr = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) + m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag() - q * q; - Scalar vi = (m_eivalues.coeff(i).real() - p) * Scalar(2) * q; - if((vr == Scalar(0)) && (vi == Scalar(0))) - vr = eps * norm * (abs(w) + abs(q) + abs(x) + abs(y) + abs(lastw)); - - Complex cc = Complex(x*lastra-lastw*ra+q*sa,x*lastsa-lastw*sa-q*ra) / Complex(vr,vi); - m_matT.coeffRef(i,n-1) = Eigen::numext::real(cc); - m_matT.coeffRef(i,n) = Eigen::numext::imag(cc); - if(abs(x) > (abs(lastw) + abs(q))) - { - m_matT.coeffRef(i+1,n-1) = (-ra - w * m_matT.coeff(i,n-1) + q * m_matT.coeff(i,n)) / x; - m_matT.coeffRef(i+1,n) = (-sa - w * m_matT.coeff(i,n) - q * m_matT.coeff(i,n-1)) / x; - } - else - { - cc = Complex(-lastra-y*m_matT.coeff(i,n-1),-lastsa-y*m_matT.coeff(i,n)) / Complex(lastw,q); - m_matT.coeffRef(i+1,n-1) = Eigen::numext::real(cc); - m_matT.coeffRef(i+1,n) = Eigen::numext::imag(cc); - } - } - - // Overflow control - Scalar t = std::max(abs(m_matT.coeff(i,n-1)), abs(m_matT.coeff(i,n))); - if((eps * t) * t > Scalar(1)) - m_matT.block(i, n-1, size-i, 2) /= t; - - } - } - - // We handled a pair of complex conjugate eigenvalues, so need to skip them both - n--; - } - } - - // Back transformation to get eigenvectors of original matrix - Vector m_tmp(size); - for(Index j = size-1; j >= 0; j--) - { - m_tmp.noalias() = m_eivec.leftCols(j+1) * m_matT.col(j).segment(0, j+1); - m_eivec.col(j) = m_tmp; - } - } - -public: - - UpperHessenbergEigen() : - m_n(0), m_computed(false) - {} - - UpperHessenbergEigen(ConstGenericMatrix& mat) : - m_n(mat.rows()), m_computed(false) - { - compute(mat); - } - - void compute(ConstGenericMatrix& mat) - { - using std::abs; - using std::sqrt; - - if(mat.rows() != mat.cols()) - throw std::invalid_argument("UpperHessenbergEigen: matrix must be square"); - - m_n = mat.rows(); - // Scale matrix prior to the Schur decomposition - const Scalar scale = mat.cwiseAbs().maxCoeff(); - - // Reduce to real Schur form - Matrix Q = Matrix::Identity(m_n, m_n); - m_realSchur.computeFromHessenberg(mat / scale, Q, true); - if(m_realSchur.info() != Eigen::Success) - throw std::runtime_error("UpperHessenbergEigen: eigen decomposition failed"); - - m_matT = m_realSchur.matrixT(); - m_eivec = m_realSchur.matrixU(); - - // Compute eigenvalues from matT - m_eivalues.resize(m_n); - Index i = 0; - while(i < m_n) - { - // Real eigenvalue - if(i == m_n - 1 || m_matT.coeff(i+1, i) == Scalar(0)) - { - m_eivalues.coeffRef(i) = m_matT.coeff(i, i); - ++i; - } - else // Complex eigenvalues - { - Scalar p = Scalar(0.5) * (m_matT.coeff(i, i) - m_matT.coeff(i+1, i+1)); - Scalar z; - // Compute z = sqrt(abs(p * p + m_matT.coeff(i+1, i) * m_matT.coeff(i, i+1))); - // without overflow - { - Scalar t0 = m_matT.coeff(i+1, i); - Scalar t1 = m_matT.coeff(i, i+1); - Scalar maxval = std::max(abs(p), std::max(abs(t0), abs(t1))); - t0 /= maxval; - t1 /= maxval; - Scalar p0 = p / maxval; - z = maxval * sqrt(abs(p0 * p0 + t0 * t1)); - } - m_eivalues.coeffRef(i) = Complex(m_matT.coeff(i+1, i+1) + p, z); - m_eivalues.coeffRef(i+1) = Complex(m_matT.coeff(i+1, i+1) + p, -z); - i += 2; - } - } - - // Compute eigenvectors - doComputeEigenvectors(); - - // Scale eigenvalues back - m_eivalues *= scale; - - m_computed = true; - } - - const ComplexVector& eigenvalues() const - { - if(!m_computed) - throw std::logic_error("UpperHessenbergEigen: need to call compute() first"); - - return m_eivalues; - } - - ComplexMatrix eigenvectors() - { - using std::abs; - - if(!m_computed) - throw std::logic_error("UpperHessenbergEigen: need to call compute() first"); - - Index n = m_eivec.cols(); - ComplexMatrix matV(n, n); - for(Index j = 0; j < n; ++j) - { - // imaginary part of real eigenvalue is already set to exact zero - if(Eigen::numext::imag(m_eivalues.coeff(j)) == Scalar(0) || j + 1 == n) - { - // we have a real eigen value - matV.col(j) = m_eivec.col(j).template cast(); - matV.col(j).normalize(); - } else { - // we have a pair of complex eigen values - for(Index i = 0; i < n; ++i) - { - matV.coeffRef(i,j) = Complex(m_eivec.coeff(i,j), m_eivec.coeff(i,j+1)); - matV.coeffRef(i,j+1) = Complex(m_eivec.coeff(i,j), -m_eivec.coeff(i,j+1)); - } - matV.col(j).normalize(); - matV.col(j+1).normalize(); - ++j; - } - } - - return matV; - } -}; - - -} // namespace Spectra - -#endif // UPPER_HESSENBERG_EIGEN_H diff --git a/src/external/Spectra/include/Spectra/LinAlg/UpperHessenbergQR.h b/src/external/Spectra/include/Spectra/LinAlg/UpperHessenbergQR.h deleted file mode 100644 index a66d9598..00000000 --- a/src/external/Spectra/include/Spectra/LinAlg/UpperHessenbergQR.h +++ /dev/null @@ -1,670 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef UPPER_HESSENBERG_QR_H -#define UPPER_HESSENBERG_QR_H - -#include -#include // std::sqrt -#include // std::fill, std::copy -#include // std::logic_error - -namespace Spectra { - - -/// -/// \defgroup Internals Internal Classes -/// -/// Classes for internal use. May be useful to developers. -/// - -/// -/// \ingroup Internals -/// @{ -/// - -/// -/// \defgroup LinearAlgebra Linear Algebra -/// -/// A number of classes for linear algebra operations. -/// - -/// -/// \ingroup LinearAlgebra -/// -/// Perform the QR decomposition of an upper Hessenberg matrix. -/// -/// \tparam Scalar The element type of the matrix. -/// Currently supported types are `float`, `double` and `long double`. -/// -template -class UpperHessenbergQR -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef Eigen::Matrix RowVector; - typedef Eigen::Array Array; - - typedef Eigen::Ref GenericMatrix; - typedef const Eigen::Ref ConstGenericMatrix; - - Matrix m_mat_T; - -protected: - Index m_n; - // Gi = [ cos[i] sin[i]] - // [-sin[i] cos[i]] - // Q = G1 * G2 * ... * G_{n-1} - Scalar m_shift; - Array m_rot_cos; - Array m_rot_sin; - bool m_computed; - - // Given x and y, compute 1) r = sqrt(x^2 + y^2), 2) c = x / r, 3) s = -y / r - // If both x and y are zero, set c = 1 and s = 0 - // We must implement it in a numerically stable way - static void compute_rotation(const Scalar& x, const Scalar& y, Scalar& r, Scalar& c, Scalar& s) - { - using std::sqrt; - - const Scalar xsign = (x > Scalar(0)) - (x < Scalar(0)); - const Scalar ysign = (y > Scalar(0)) - (y < Scalar(0)); - const Scalar xabs = x * xsign; - const Scalar yabs = y * ysign; - if(xabs > yabs) - { - // In this case xabs != 0 - const Scalar ratio = yabs / xabs; // so that 0 <= ratio < 1 - const Scalar common = sqrt(Scalar(1) + ratio * ratio); - c = xsign / common; - r = xabs * common; - s = -y / r; - } else { - if(yabs == Scalar(0)) - { - r = Scalar(0); c = Scalar(1); s = Scalar(0); - return; - } - const Scalar ratio = xabs / yabs; // so that 0 <= ratio <= 1 - const Scalar common = sqrt(Scalar(1) + ratio * ratio); - s = -ysign / common; - r = yabs * common; - c = x / r; - } - } - -public: - /// - /// Constructor to preallocate memory. Computation can - /// be performed later by calling the compute() method. - /// - UpperHessenbergQR(Index size) : - m_n(size), - m_rot_cos(m_n - 1), - m_rot_sin(m_n - 1), - m_computed(false) - {} - - /// - /// Constructor to create an object that performs and stores the - /// QR decomposition of an upper Hessenberg matrix `mat`, with an - /// optional shift: \f$H-sI=QR\f$. Here \f$H\f$ stands for the matrix - /// `mat`, and \f$s\f$ is the shift. - /// - /// \param mat Matrix type can be `Eigen::Matrix` (e.g. - /// `Eigen::MatrixXd` and `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// Only the upper triangular and the lower subdiagonal parts of - /// the matrix are used. - /// - UpperHessenbergQR(ConstGenericMatrix& mat, const Scalar& shift = Scalar(0)) : - m_n(mat.rows()), - m_shift(shift), - m_rot_cos(m_n - 1), - m_rot_sin(m_n - 1), - m_computed(false) - { - compute(mat, shift); - } - - /// - /// Virtual destructor. - /// - virtual ~UpperHessenbergQR() {}; - - /// - /// Conduct the QR factorization of an upper Hessenberg matrix with - /// an optional shift. - /// - /// \param mat Matrix type can be `Eigen::Matrix` (e.g. - /// `Eigen::MatrixXd` and `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// Only the upper triangular and the lower subdiagonal parts of - /// the matrix are used. - /// - virtual void compute(ConstGenericMatrix& mat, const Scalar& shift = Scalar(0)) - { - m_n = mat.rows(); - if(m_n != mat.cols()) - throw std::invalid_argument("UpperHessenbergQR: matrix must be square"); - - m_shift = shift; - m_mat_T.resize(m_n, m_n); - m_rot_cos.resize(m_n - 1); - m_rot_sin.resize(m_n - 1); - - // Make a copy of mat - s * I - std::copy(mat.data(), mat.data() + mat.size(), m_mat_T.data()); - m_mat_T.diagonal().array() -= m_shift; - - Scalar xi, xj, r, c, s; - Scalar *Tii, *ptr; - const Index n1 = m_n - 1; - for(Index i = 0; i < n1; i++) - { - Tii = &m_mat_T.coeffRef(i, i); - - // Make sure mat_T is upper Hessenberg - // Zero the elements below mat_T(i + 1, i) - std::fill(Tii + 2, Tii + m_n - i, Scalar(0)); - - xi = Tii[0]; // mat_T(i, i) - xj = Tii[1]; // mat_T(i + 1, i) - compute_rotation(xi, xj, r, c, s); - m_rot_cos[i] = c; - m_rot_sin[i] = s; - - // For a complete QR decomposition, - // we first obtain the rotation matrix - // G = [ cos sin] - // [-sin cos] - // and then do T[i:(i + 1), i:(n - 1)] = G' * T[i:(i + 1), i:(n - 1)] - - // Gt << c, -s, s, c; - // m_mat_T.block(i, i, 2, m_n - i) = Gt * m_mat_T.block(i, i, 2, m_n - i); - Tii[0] = r; // m_mat_T(i, i) => r - Tii[1] = 0; // m_mat_T(i + 1, i) => 0 - ptr = Tii + m_n; // m_mat_T(i, k), k = i+1, i+2, ..., n-1 - for(Index j = i + 1; j < m_n; j++, ptr += m_n) - { - Scalar tmp = ptr[0]; - ptr[0] = c * tmp - s * ptr[1]; - ptr[1] = s * tmp + c * ptr[1]; - } - - // If we do not need to calculate the R matrix, then - // only the cos and sin sequences are required. - // In such case we only update T[i + 1, (i + 1):(n - 1)] - // m_mat_T.block(i + 1, i + 1, 1, m_n - i - 1) *= c; - // m_mat_T.block(i + 1, i + 1, 1, m_n - i - 1) += s * mat_T.block(i, i + 1, 1, m_n - i - 1); - } - - m_computed = true; - } - - /// - /// Return the \f$R\f$ matrix in the QR decomposition, which is an - /// upper triangular matrix. - /// - /// \return Returned matrix type will be `Eigen::Matrix`, depending on - /// the template parameter `Scalar` defined. - /// - virtual Matrix matrix_R() const - { - if(!m_computed) - throw std::logic_error("UpperHessenbergQR: need to call compute() first"); - - return m_mat_T; - } - - /// - /// Overwrite `dest` with \f$Q'HQ = RQ + sI\f$, where \f$H\f$ is the input matrix `mat`, - /// and \f$s\f$ is the shift. The result is an upper Hessenberg matrix. - /// - /// \param mat The matrix to be overwritten, whose type should be `Eigen::Matrix`, - /// depending on the template parameter `Scalar` defined. - /// - virtual void matrix_QtHQ(Matrix& dest) const - { - if(!m_computed) - throw std::logic_error("UpperHessenbergQR: need to call compute() first"); - - // Make a copy of the R matrix - dest.resize(m_n, m_n); - std::copy(m_mat_T.data(), m_mat_T.data() + m_mat_T.size(), dest.data()); - - // Compute the RQ matrix - const Index n1 = m_n - 1; - for(Index i = 0; i < n1; i++) - { - const Scalar c = m_rot_cos.coeff(i); - const Scalar s = m_rot_sin.coeff(i); - // RQ[, i:(i + 1)] = RQ[, i:(i + 1)] * Gi - // Gi = [ cos[i] sin[i]] - // [-sin[i] cos[i]] - Scalar *Yi, *Yi1; - Yi = &dest.coeffRef(0, i); - Yi1 = Yi + m_n; // RQ(0, i + 1) - const Index i2 = i + 2; - for(Index j = 0; j < i2; j++) - { - const Scalar tmp = Yi[j]; - Yi[j] = c * tmp - s * Yi1[j]; - Yi1[j] = s * tmp + c * Yi1[j]; - } - - /* Vector dest = RQ.block(0, i, i + 2, 1); - dest.block(0, i, i + 2, 1) = c * Yi - s * dest.block(0, i + 1, i + 2, 1); - dest.block(0, i + 1, i + 2, 1) = s * Yi + c * dest.block(0, i + 1, i + 2, 1); */ - } - - // Add the shift to the diagonal - dest.diagonal().array() += m_shift; - } - - /// - /// Apply the \f$Q\f$ matrix to a vector \f$y\f$. - /// - /// \param Y A vector that will be overwritten by the matrix product \f$Qy\f$. - /// - /// Vector type can be `Eigen::Vector`, depending on - /// the template parameter `Scalar` defined. - /// - // Y -> QY = G1 * G2 * ... * Y - void apply_QY(Vector& Y) const - { - if(!m_computed) - throw std::logic_error("UpperHessenbergQR: need to call compute() first"); - - for(Index i = m_n - 2; i >= 0; i--) - { - const Scalar c = m_rot_cos.coeff(i); - const Scalar s = m_rot_sin.coeff(i); - // Y[i:(i + 1)] = Gi * Y[i:(i + 1)] - // Gi = [ cos[i] sin[i]] - // [-sin[i] cos[i]] - const Scalar tmp = Y[i]; - Y[i] = c * tmp + s * Y[i + 1]; - Y[i + 1] = -s * tmp + c * Y[i + 1]; - } - } - - /// - /// Apply the \f$Q\f$ matrix to a vector \f$y\f$. - /// - /// \param Y A vector that will be overwritten by the matrix product \f$Q'y\f$. - /// - /// Vector type can be `Eigen::Vector`, depending on - /// the template parameter `Scalar` defined. - /// - // Y -> Q'Y = G_{n-1}' * ... * G2' * G1' * Y - void apply_QtY(Vector& Y) const - { - if(!m_computed) - throw std::logic_error("UpperHessenbergQR: need to call compute() first"); - - const Index n1 = m_n - 1; - for(Index i = 0; i < n1; i++) - { - const Scalar c = m_rot_cos.coeff(i); - const Scalar s = m_rot_sin.coeff(i); - // Y[i:(i + 1)] = Gi' * Y[i:(i + 1)] - // Gi = [ cos[i] sin[i]] - // [-sin[i] cos[i]] - const Scalar tmp = Y[i]; - Y[i] = c * tmp - s * Y[i + 1]; - Y[i + 1] = s * tmp + c * Y[i + 1]; - } - } - - /// - /// Apply the \f$Q\f$ matrix to another matrix \f$Y\f$. - /// - /// \param Y A matrix that will be overwritten by the matrix product \f$QY\f$. - /// - /// Matrix type can be `Eigen::Matrix` (e.g. - /// `Eigen::MatrixXd` and `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// - // Y -> QY = G1 * G2 * ... * Y - void apply_QY(GenericMatrix Y) const - { - if(!m_computed) - throw std::logic_error("UpperHessenbergQR: need to call compute() first"); - - RowVector Yi(Y.cols()), Yi1(Y.cols()); - for(Index i = m_n - 2; i >= 0; i--) - { - const Scalar c = m_rot_cos.coeff(i); - const Scalar s = m_rot_sin.coeff(i); - // Y[i:(i + 1), ] = Gi * Y[i:(i + 1), ] - // Gi = [ cos[i] sin[i]] - // [-sin[i] cos[i]] - Yi.noalias() = Y.row(i); - Yi1.noalias() = Y.row(i + 1); - Y.row(i) = c * Yi + s * Yi1; - Y.row(i + 1) = -s * Yi + c * Yi1; - } - } - - /// - /// Apply the \f$Q\f$ matrix to another matrix \f$Y\f$. - /// - /// \param Y A matrix that will be overwritten by the matrix product \f$Q'Y\f$. - /// - /// Matrix type can be `Eigen::Matrix` (e.g. - /// `Eigen::MatrixXd` and `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// - // Y -> Q'Y = G_{n-1}' * ... * G2' * G1' * Y - void apply_QtY(GenericMatrix Y) const - { - if(!m_computed) - throw std::logic_error("UpperHessenbergQR: need to call compute() first"); - - RowVector Yi(Y.cols()), Yi1(Y.cols()); - const Index n1 = m_n - 1; - for(Index i = 0; i < n1; i++) - { - const Scalar c = m_rot_cos.coeff(i); - const Scalar s = m_rot_sin.coeff(i); - // Y[i:(i + 1), ] = Gi' * Y[i:(i + 1), ] - // Gi = [ cos[i] sin[i]] - // [-sin[i] cos[i]] - Yi.noalias() = Y.row(i); - Yi1.noalias() = Y.row(i + 1); - Y.row(i) = c * Yi - s * Yi1; - Y.row(i + 1) = s * Yi + c * Yi1; - } - } - - /// - /// Apply the \f$Q\f$ matrix to another matrix \f$Y\f$. - /// - /// \param Y A matrix that will be overwritten by the matrix product \f$YQ\f$. - /// - /// Matrix type can be `Eigen::Matrix` (e.g. - /// `Eigen::MatrixXd` and `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// - // Y -> YQ = Y * G1 * G2 * ... - void apply_YQ(GenericMatrix Y) const - { - if(!m_computed) - throw std::logic_error("UpperHessenbergQR: need to call compute() first"); - - /*Vector Yi(Y.rows()); - for(Index i = 0; i < m_n - 1; i++) - { - const Scalar c = m_rot_cos.coeff(i); - const Scalar s = m_rot_sin.coeff(i); - // Y[, i:(i + 1)] = Y[, i:(i + 1)] * Gi - // Gi = [ cos[i] sin[i]] - // [-sin[i] cos[i]] - Yi.noalias() = Y.col(i); - Y.col(i) = c * Yi - s * Y.col(i + 1); - Y.col(i + 1) = s * Yi + c * Y.col(i + 1); - }*/ - Scalar *Y_col_i, *Y_col_i1; - const Index n1 = m_n - 1; - const Index nrow = Y.rows(); - for(Index i = 0; i < n1; i++) - { - const Scalar c = m_rot_cos.coeff(i); - const Scalar s = m_rot_sin.coeff(i); - - Y_col_i = &Y.coeffRef(0, i); - Y_col_i1 = &Y.coeffRef(0, i + 1); - for(Index j = 0; j < nrow; j++) - { - Scalar tmp = Y_col_i[j]; - Y_col_i[j] = c * tmp - s * Y_col_i1[j]; - Y_col_i1[j] = s * tmp + c * Y_col_i1[j]; - } - } - } - - /// - /// Apply the \f$Q\f$ matrix to another matrix \f$Y\f$. - /// - /// \param Y A matrix that will be overwritten by the matrix product \f$YQ'\f$. - /// - /// Matrix type can be `Eigen::Matrix` (e.g. - /// `Eigen::MatrixXd` and `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// - // Y -> YQ' = Y * G_{n-1}' * ... * G2' * G1' - void apply_YQt(GenericMatrix Y) const - { - if(!m_computed) - throw std::logic_error("UpperHessenbergQR: need to call compute() first"); - - Vector Yi(Y.rows()); - for(Index i = m_n - 2; i >= 0; i--) - { - const Scalar c = m_rot_cos.coeff(i); - const Scalar s = m_rot_sin.coeff(i); - // Y[, i:(i + 1)] = Y[, i:(i + 1)] * Gi' - // Gi = [ cos[i] sin[i]] - // [-sin[i] cos[i]] - Yi.noalias() = Y.col(i); - Y.col(i) = c * Yi + s * Y.col(i + 1); - Y.col(i + 1) = -s * Yi + c * Y.col(i + 1); - } - } -}; - - - -/// -/// \ingroup LinearAlgebra -/// -/// Perform the QR decomposition of a tridiagonal matrix, a special -/// case of upper Hessenberg matrices. -/// -/// \tparam Scalar The element type of the matrix. -/// Currently supported types are `float`, `double` and `long double`. -/// -template -class TridiagQR: public UpperHessenbergQR -{ -private: - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef const Eigen::Ref ConstGenericMatrix; - - typedef typename Matrix::Index Index; - - Vector m_T_diag; // diagonal elements of T - Vector m_T_lsub; // lower subdiagonal of T - Vector m_T_usub; // upper subdiagonal of T - Vector m_T_usub2; // 2nd upper subdiagonal of T - -public: - /// - /// Constructor to preallocate memory. Computation can - /// be performed later by calling the compute() method. - /// - TridiagQR(Index size) : - UpperHessenbergQR(size) - {} - - /// - /// Constructor to create an object that performs and stores the - /// QR decomposition of an upper Hessenberg matrix `mat`, with an - /// optional shift: \f$H-sI=QR\f$. Here \f$H\f$ stands for the matrix - /// `mat`, and \f$s\f$ is the shift. - /// - /// \param mat Matrix type can be `Eigen::Matrix` (e.g. - /// `Eigen::MatrixXd` and `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// Only the major- and sub- diagonal parts of - /// the matrix are used. - /// - TridiagQR(ConstGenericMatrix& mat, const Scalar& shift = Scalar(0)) : - UpperHessenbergQR(mat.rows()) - { - this->compute(mat, shift); - } - - /// - /// Conduct the QR factorization of a tridiagonal matrix with an - /// optional shift. - /// - /// \param mat Matrix type can be `Eigen::Matrix` (e.g. - /// `Eigen::MatrixXd` and `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// Only the major- and sub- diagonal parts of - /// the matrix are used. - /// - void compute(ConstGenericMatrix& mat, const Scalar& shift = Scalar(0)) - { - this->m_n = mat.rows(); - if(this->m_n != mat.cols()) - throw std::invalid_argument("TridiagQR: matrix must be square"); - - this->m_shift = shift; - m_T_diag.resize(this->m_n); - m_T_lsub.resize(this->m_n - 1); - m_T_usub.resize(this->m_n - 1); - m_T_usub2.resize(this->m_n - 2); - this->m_rot_cos.resize(this->m_n - 1); - this->m_rot_sin.resize(this->m_n - 1); - - m_T_diag.array() = mat.diagonal().array() - this->m_shift; - m_T_lsub.noalias() = mat.diagonal(-1); - m_T_usub.noalias() = m_T_lsub; - - // A number of pointers to avoid repeated address calculation - Scalar *c = this->m_rot_cos.data(), // pointer to the cosine vector - *s = this->m_rot_sin.data(), // pointer to the sine vector - r; - const Index n1 = this->m_n - 1; - for(Index i = 0; i < n1; i++) - { - // diag[i] == T[i, i] - // lsub[i] == T[i + 1, i] - // r = sqrt(T[i, i]^2 + T[i + 1, i]^2) - // c = T[i, i] / r, s = -T[i + 1, i] / r - this->compute_rotation(m_T_diag.coeff(i), m_T_lsub.coeff(i), r, *c, *s); - - // For a complete QR decomposition, - // we first obtain the rotation matrix - // G = [ cos sin] - // [-sin cos] - // and then do T[i:(i + 1), i:(i + 2)] = G' * T[i:(i + 1), i:(i + 2)] - - // Update T[i, i] and T[i + 1, i] - // The updated value of T[i, i] is known to be r - // The updated value of T[i + 1, i] is known to be 0 - m_T_diag.coeffRef(i) = r; - m_T_lsub.coeffRef(i) = Scalar(0); - // Update T[i, i + 1] and T[i + 1, i + 1] - // usub[i] == T[i, i + 1] - // diag[i + 1] == T[i + 1, i + 1] - const Scalar tmp = m_T_usub.coeff(i); - m_T_usub.coeffRef(i) = (*c) * tmp - (*s) * m_T_diag.coeff(i + 1); - m_T_diag.coeffRef(i + 1) = (*s) * tmp + (*c) * m_T_diag.coeff(i + 1); - // Update T[i, i + 2] and T[i + 1, i + 2] - // usub2[i] == T[i, i + 2] - // usub[i + 1] == T[i + 1, i + 2] - if(i < n1 - 1) - { - m_T_usub2.coeffRef(i) = -(*s) * m_T_usub.coeff(i + 1); - m_T_usub.coeffRef(i + 1) *= (*c); - } - - c++; - s++; - - // If we do not need to calculate the R matrix, then - // only the cos and sin sequences are required. - // In such case we only update T[i + 1, (i + 1):(i + 2)] - // T[i + 1, i + 1] = c * T[i + 1, i + 1] + s * T[i, i + 1]; - // T[i + 1, i + 2] *= c; - } - - this->m_computed = true; - } - - /// - /// Return the \f$R\f$ matrix in the QR decomposition, which is an - /// upper triangular matrix. - /// - /// \return Returned matrix type will be `Eigen::Matrix`, depending on - /// the template parameter `Scalar` defined. - /// - Matrix matrix_R() const - { - if(!this->m_computed) - throw std::logic_error("TridiagQR: need to call compute() first"); - - Matrix R = Matrix::Zero(this->m_n, this->m_n); - R.diagonal().noalias() = m_T_diag; - R.diagonal(1).noalias() = m_T_usub; - R.diagonal(2).noalias() = m_T_usub2; - - return R; - } - - /// - /// Overwrite `dest` with \f$Q'HQ = RQ + sI\f$, where \f$H\f$ is the input matrix `mat`, - /// and \f$s\f$ is the shift. The result is a tridiagonal matrix. - /// - /// \param mat The matrix to be overwritten, whose type should be `Eigen::Matrix`, - /// depending on the template parameter `Scalar` defined. - /// - void matrix_QtHQ(Matrix& dest) const - { - if(!this->m_computed) - throw std::logic_error("TridiagQR: need to call compute() first"); - - // Make a copy of the R matrix - dest.resize(this->m_n, this->m_n); - dest.setZero(); - dest.diagonal().noalias() = m_T_diag; - // The upper diagonal refers to m_T_usub - // The 2nd upper subdiagonal will be zero in RQ - - // Compute the RQ matrix - // [m11 m12] points to RQ[i:(i+1), i:(i+1)] - // [0 m22] - // - // Gi = [ cos[i] sin[i]] - // [-sin[i] cos[i]] - const Index n1 = this->m_n - 1; - for(Index i = 0; i < n1; i++) - { - const Scalar c = this->m_rot_cos.coeff(i); - const Scalar s = this->m_rot_sin.coeff(i); - const Scalar m11 = dest.coeff(i, i), - m12 = m_T_usub.coeff(i), - m22 = m_T_diag.coeff(i + 1); - - // Update the diagonal and the lower subdiagonal of dest - dest.coeffRef(i , i ) = c * m11 - s * m12; - dest.coeffRef(i + 1, i ) = - s * m22; - dest.coeffRef(i + 1, i + 1) = c * m22; - } - - // Copy the lower subdiagonal to upper subdiagonal - dest.diagonal(1).noalias() = dest.diagonal(-1); - - // Add the shift to the diagonal - dest.diagonal().array() += this->m_shift; - } -}; - -/// -/// @} -/// - - -} // namespace Spectra - -#endif // UPPER_HESSENBERG_QR_H diff --git a/src/external/Spectra/include/Spectra/MatOp/DenseCholesky.h b/src/external/Spectra/include/Spectra/MatOp/DenseCholesky.h deleted file mode 100644 index 354c9508..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/DenseCholesky.h +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef DENSE_CHOLESKY_H -#define DENSE_CHOLESKY_H - -#include -#include -#include -#include "../Util/CompInfo.h" - -namespace Spectra { - - -/// -/// \ingroup MatOp -/// -/// This class defines the operations related to Cholesky decomposition on a -/// positive definite matrix, \f$B=LL'\f$, where \f$L\f$ is a lower triangular -/// matrix. It is mainly used in the SymGEigsSolver generalized eigen solver -/// in the Cholesky decomposition mode. -/// -template -class DenseCholesky -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstMat; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef const Eigen::Ref ConstGenericMatrix; - - const Index m_n; - Eigen::LLT m_decomp; - int m_info; // status of the decomposition - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param mat An **Eigen** matrix object, whose type can be - /// `Eigen::Matrix` (e.g. `Eigen::MatrixXd` and - /// `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// - DenseCholesky(ConstGenericMatrix& mat) : - m_n(mat.rows()), m_info(NOT_COMPUTED) - { - if(mat.rows() != mat.cols()) - throw std::invalid_argument("DenseCholesky: matrix must be square"); - - m_decomp.compute(mat); - m_info = (m_decomp.info() == Eigen::Success) ? - SUCCESSFUL : - NUMERICAL_ISSUE; - } - - /// - /// Returns the number of rows of the underlying matrix. - /// - Index rows() const { return m_n; } - /// - /// Returns the number of columns of the underlying matrix. - /// - Index cols() const { return m_n; } - - /// - /// Returns the status of the computation. - /// The full list of enumeration values can be found in \ref Enumerations. - /// - int info() const { return m_info; } - - /// - /// Performs the lower triangular solving operation \f$y=L^{-1}x\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = inv(L) * x_in - void lower_triangular_solve(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_n); - MapVec y(y_out, m_n); - y.noalias() = m_decomp.matrixL().solve(x); - } - - /// - /// Performs the upper triangular solving operation \f$y=(L')^{-1}x\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = inv(L') * x_in - void upper_triangular_solve(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_n); - MapVec y(y_out, m_n); - y.noalias() = m_decomp.matrixU().solve(x); - } -}; - - -} // namespace Spectra - -#endif // DENSE_CHOLESKY_H diff --git a/src/external/Spectra/include/Spectra/MatOp/DenseGenComplexShiftSolve.h b/src/external/Spectra/include/Spectra/MatOp/DenseGenComplexShiftSolve.h deleted file mode 100644 index 7f189067..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/DenseGenComplexShiftSolve.h +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef DENSE_GEN_COMPLEX_SHIFT_SOLVE_H -#define DENSE_GEN_COMPLEX_SHIFT_SOLVE_H - -#include -#include -#include - -namespace Spectra { - - -/// -/// \ingroup MatOp -/// -/// This class defines the complex shift-solve operation on a general real matrix \f$A\f$, -/// i.e., calculating \f$y=\mathrm{Re}\{(A-\sigma I)^{-1}x\}\f$ for any complex-valued -/// \f$\sigma\f$ and real-valued vector \f$x\f$. It is mainly used in the -/// GenEigsComplexShiftSolver eigen solver. -/// -template -class DenseGenComplexShiftSolve -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef const Eigen::Ref ConstGenericMatrix; - - typedef std::complex Complex; - typedef Eigen::Matrix ComplexMatrix; - typedef Eigen::Matrix ComplexVector; - - typedef Eigen::PartialPivLU ComplexSolver; - - ConstGenericMatrix m_mat; - const Index m_n; - ComplexSolver m_solver; - ComplexVector m_x_cache; - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param mat An **Eigen** matrix object, whose type can be - /// `Eigen::Matrix` (e.g. `Eigen::MatrixXd` and - /// `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// - DenseGenComplexShiftSolve(ConstGenericMatrix& mat) : - m_mat(mat), m_n(mat.rows()) - { - if(mat.rows() != mat.cols()) - throw std::invalid_argument("DenseGenComplexShiftSolve: matrix must be square"); - } - - /// - /// Return the number of rows of the underlying matrix. - /// - Index rows() const { return m_n; } - /// - /// Return the number of columns of the underlying matrix. - /// - Index cols() const { return m_n; } - - /// - /// Set the complex shift \f$\sigma\f$. - /// - /// \param sigmar Real part of \f$\sigma\f$. - /// \param sigmai Imaginary part of \f$\sigma\f$. - /// - void set_shift(Scalar sigmar, Scalar sigmai) - { - m_solver.compute(m_mat.template cast() - Complex(sigmar, sigmai) * ComplexMatrix::Identity(m_n, m_n)); - m_x_cache.resize(m_n); - m_x_cache.setZero(); - } - - /// - /// Perform the complex shift-solve operation - /// \f$y=\mathrm{Re}\{(A-\sigma I)^{-1}x\}\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = Re( inv(A - sigma * I) * x_in ) - void perform_op(const Scalar* x_in, Scalar* y_out) - { - m_x_cache.real() = MapConstVec(x_in, m_n); - MapVec y(y_out, m_n); - y.noalias() = m_solver.solve(m_x_cache).real(); - } -}; - - -} // namespace Spectra - -#endif // DENSE_GEN_COMPLEX_SHIFT_SOLVE_H diff --git a/src/external/Spectra/include/Spectra/MatOp/DenseGenMatProd.h b/src/external/Spectra/include/Spectra/MatOp/DenseGenMatProd.h deleted file mode 100644 index 6933dac0..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/DenseGenMatProd.h +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef DENSE_GEN_MAT_PROD_H -#define DENSE_GEN_MAT_PROD_H - -#include - -namespace Spectra { - - -/// -/// \defgroup MatOp Matrix Operations -/// -/// Define matrix operations on existing matrix objects -/// - -/// -/// \ingroup MatOp -/// -/// This class defines the matrix-vector multiplication operation on a -/// general real matrix \f$A\f$, i.e., calculating \f$y=Ax\f$ for any vector -/// \f$x\f$. It is mainly used in the GenEigsSolver and -/// SymEigsSolver eigen solvers. -/// -template -class DenseGenMatProd -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef const Eigen::Ref ConstGenericMatrix; - - ConstGenericMatrix m_mat; - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param mat An **Eigen** matrix object, whose type can be - /// `Eigen::Matrix` (e.g. `Eigen::MatrixXd` and - /// `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// - DenseGenMatProd(ConstGenericMatrix& mat) : - m_mat(mat) - {} - - /// - /// Return the number of rows of the underlying matrix. - /// - Index rows() const { return m_mat.rows(); } - /// - /// Return the number of columns of the underlying matrix. - /// - Index cols() const { return m_mat.cols(); } - - /// - /// Perform the matrix-vector multiplication operation \f$y=Ax\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = A * x_in - void perform_op(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_mat.cols()); - MapVec y(y_out, m_mat.rows()); - y.noalias() = m_mat * x; - } -}; - - -} // namespace Spectra - -#endif // DENSE_GEN_MAT_PROD_H diff --git a/src/external/Spectra/include/Spectra/MatOp/DenseGenRealShiftSolve.h b/src/external/Spectra/include/Spectra/MatOp/DenseGenRealShiftSolve.h deleted file mode 100644 index d7ba8f2a..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/DenseGenRealShiftSolve.h +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef DENSE_GEN_REAL_SHIFT_SOLVE_H -#define DENSE_GEN_REAL_SHIFT_SOLVE_H - -#include -#include -#include - -namespace Spectra { - - -/// -/// \ingroup MatOp -/// -/// This class defines the shift-solve operation on a general real matrix \f$A\f$, -/// i.e., calculating \f$y=(A-\sigma I)^{-1}x\f$ for any real \f$\sigma\f$ and -/// vector \f$x\f$. It is mainly used in the GenEigsRealShiftSolver eigen solver. -/// -template -class DenseGenRealShiftSolve -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef const Eigen::Ref ConstGenericMatrix; - - ConstGenericMatrix m_mat; - const Index m_n; - Eigen::PartialPivLU m_solver; - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param mat An **Eigen** matrix object, whose type can be - /// `Eigen::Matrix` (e.g. `Eigen::MatrixXd` and - /// `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// - DenseGenRealShiftSolve(ConstGenericMatrix& mat) : - m_mat(mat), m_n(mat.rows()) - { - if(mat.rows() != mat.cols()) - throw std::invalid_argument("DenseGenRealShiftSolve: matrix must be square"); - } - - /// - /// Return the number of rows of the underlying matrix. - /// - Index rows() const { return m_n; } - /// - /// Return the number of columns of the underlying matrix. - /// - Index cols() const { return m_n; } - - /// - /// Set the real shift \f$\sigma\f$. - /// - void set_shift(Scalar sigma) - { - m_solver.compute(m_mat - sigma * Matrix::Identity(m_n, m_n)); - } - - /// - /// Perform the shift-solve operation \f$y=(A-\sigma I)^{-1}x\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = inv(A - sigma * I) * x_in - void perform_op(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_n); - MapVec y(y_out, m_n); - y.noalias() = m_solver.solve(x); - } -}; - - -} // namespace Spectra - -#endif // DENSE_GEN_REAL_SHIFT_SOLVE_H diff --git a/src/external/Spectra/include/Spectra/MatOp/DenseSymMatProd.h b/src/external/Spectra/include/Spectra/MatOp/DenseSymMatProd.h deleted file mode 100644 index 23ca36e4..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/DenseSymMatProd.h +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef DENSE_SYM_MAT_PROD_H -#define DENSE_SYM_MAT_PROD_H - -#include - -namespace Spectra { - - -/// -/// \ingroup MatOp -/// -/// This class defines the matrix-vector multiplication operation on a -/// symmetric real matrix \f$A\f$, i.e., calculating \f$y=Ax\f$ for any vector -/// \f$x\f$. It is mainly used in the SymEigsSolver eigen solver. -/// -template -class DenseSymMatProd -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef const Eigen::Ref ConstGenericMatrix; - - ConstGenericMatrix m_mat; - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param mat An **Eigen** matrix object, whose type can be - /// `Eigen::Matrix` (e.g. `Eigen::MatrixXd` and - /// `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// - DenseSymMatProd(ConstGenericMatrix& mat) : - m_mat(mat) - {} - - /// - /// Return the number of rows of the underlying matrix. - /// - Index rows() const { return m_mat.rows(); } - /// - /// Return the number of columns of the underlying matrix. - /// - Index cols() const { return m_mat.cols(); } - - /// - /// Perform the matrix-vector multiplication operation \f$y=Ax\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = A * x_in - void perform_op(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_mat.cols()); - MapVec y(y_out, m_mat.rows()); - y.noalias() = m_mat.template selfadjointView() * x; - } -}; - - -} // namespace Spectra - -#endif // DENSE_SYM_MAT_PROD_H diff --git a/src/external/Spectra/include/Spectra/MatOp/DenseSymShiftSolve.h b/src/external/Spectra/include/Spectra/MatOp/DenseSymShiftSolve.h deleted file mode 100644 index 2e2c67f6..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/DenseSymShiftSolve.h +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef DENSE_SYM_SHIFT_SOLVE_H -#define DENSE_SYM_SHIFT_SOLVE_H - -#include -#include - -#include "../LinAlg/BKLDLT.h" -#include "../Util/CompInfo.h" - -namespace Spectra { - - -/// -/// \ingroup MatOp -/// -/// This class defines the shift-solve operation on a real symmetric matrix \f$A\f$, -/// i.e., calculating \f$y=(A-\sigma I)^{-1}x\f$ for any real \f$\sigma\f$ and -/// vector \f$x\f$. It is mainly used in the SymEigsShiftSolver eigen solver. -/// -template -class DenseSymShiftSolve -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef const Eigen::Ref ConstGenericMatrix; - - ConstGenericMatrix m_mat; - const int m_n; - BKLDLT m_solver; - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param mat An **Eigen** matrix object, whose type can be - /// `Eigen::Matrix` (e.g. `Eigen::MatrixXd` and - /// `Eigen::MatrixXf`), or its mapped version - /// (e.g. `Eigen::Map`). - /// - DenseSymShiftSolve(ConstGenericMatrix& mat) : - m_mat(mat), m_n(mat.rows()) - { - if(mat.rows() != mat.cols()) - throw std::invalid_argument("DenseSymShiftSolve: matrix must be square"); - } - - /// - /// Return the number of rows of the underlying matrix. - /// - Index rows() const { return m_n; } - /// - /// Return the number of columns of the underlying matrix. - /// - Index cols() const { return m_n; } - - /// - /// Set the real shift \f$\sigma\f$. - /// - void set_shift(Scalar sigma) - { - m_solver.compute(m_mat, Uplo, sigma); - if(m_solver.info() != SUCCESSFUL) - throw std::invalid_argument("DenseSymShiftSolve: factorization failed with the given shift"); - } - - /// - /// Perform the shift-solve operation \f$y=(A-\sigma I)^{-1}x\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = inv(A - sigma * I) * x_in - void perform_op(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_n); - MapVec y(y_out, m_n); - y.noalias() = m_solver.solve(x); - } -}; - - -} // namespace Spectra - -#endif // DENSE_SYM_SHIFT_SOLVE_H diff --git a/src/external/Spectra/include/Spectra/MatOp/SparseCholesky.h b/src/external/Spectra/include/Spectra/MatOp/SparseCholesky.h deleted file mode 100644 index 0788596d..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/SparseCholesky.h +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SPARSE_CHOLESKY_H -#define SPARSE_CHOLESKY_H - -#include -#include -#include -#include -#include "../Util/CompInfo.h" - -namespace Spectra { - - -/// -/// \ingroup MatOp -/// -/// This class defines the operations related to Cholesky decomposition on a -/// sparse positive definite matrix, \f$B=LL'\f$, where \f$L\f$ is a lower triangular -/// matrix. It is mainly used in the SymGEigsSolver generalized eigen solver -/// in the Cholesky decomposition mode. -/// -template -class SparseCholesky -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef Eigen::SparseMatrix SparseMatrix; - typedef const Eigen::Ref ConstGenericSparseMatrix; - - const Index m_n; - Eigen::SimplicialLLT m_decomp; - int m_info; // status of the decomposition - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param mat An **Eigen** sparse matrix object, whose type can be - /// `Eigen::SparseMatrix` or its mapped version - /// `Eigen::Map >`. - /// - SparseCholesky(ConstGenericSparseMatrix& mat) : - m_n(mat.rows()) - { - if(mat.rows() != mat.cols()) - throw std::invalid_argument("SparseCholesky: matrix must be square"); - - m_decomp.compute(mat); - m_info = (m_decomp.info() == Eigen::Success) ? - SUCCESSFUL : - NUMERICAL_ISSUE; - } - - /// - /// Returns the number of rows of the underlying matrix. - /// - Index rows() const { return m_n; } - /// - /// Returns the number of columns of the underlying matrix. - /// - Index cols() const { return m_n; } - - /// - /// Returns the status of the computation. - /// The full list of enumeration values can be found in \ref Enumerations. - /// - int info() const { return m_info; } - - /// - /// Performs the lower triangular solving operation \f$y=L^{-1}x\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = inv(L) * x_in - void lower_triangular_solve(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_n); - MapVec y(y_out, m_n); - y.noalias() = m_decomp.permutationP() * x; - m_decomp.matrixL().solveInPlace(y); - } - - /// - /// Performs the upper triangular solving operation \f$y=(L')^{-1}x\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = inv(L') * x_in - void upper_triangular_solve(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_n); - MapVec y(y_out, m_n); - y.noalias() = m_decomp.matrixU().solve(x); - y = m_decomp.permutationPinv() * y; - } -}; - - -} // namespace Spectra - -#endif // SPARSE_CHOLESKY_H diff --git a/src/external/Spectra/include/Spectra/MatOp/SparseGenMatProd.h b/src/external/Spectra/include/Spectra/MatOp/SparseGenMatProd.h deleted file mode 100644 index 90881395..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/SparseGenMatProd.h +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SPARSE_GEN_MAT_PROD_H -#define SPARSE_GEN_MAT_PROD_H - -#include -#include - -namespace Spectra { - - -/// -/// \ingroup MatOp -/// -/// This class defines the matrix-vector multiplication operation on a -/// sparse real matrix \f$A\f$, i.e., calculating \f$y=Ax\f$ for any vector -/// \f$x\f$. It is mainly used in the GenEigsSolver and SymEigsSolver -/// eigen solvers. -/// -template -class SparseGenMatProd -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef Eigen::SparseMatrix SparseMatrix; - typedef const Eigen::Ref ConstGenericSparseMatrix; - - ConstGenericSparseMatrix m_mat; - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param mat An **Eigen** sparse matrix object, whose type can be - /// `Eigen::SparseMatrix` or its mapped version - /// `Eigen::Map >`. - /// - SparseGenMatProd(ConstGenericSparseMatrix& mat) : - m_mat(mat) - {} - - /// - /// Return the number of rows of the underlying matrix. - /// - Index rows() const { return m_mat.rows(); } - /// - /// Return the number of columns of the underlying matrix. - /// - Index cols() const { return m_mat.cols(); } - - /// - /// Perform the matrix-vector multiplication operation \f$y=Ax\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = A * x_in - void perform_op(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_mat.cols()); - MapVec y(y_out, m_mat.rows()); - y.noalias() = m_mat * x; - } -}; - - -} // namespace Spectra - -#endif // SPARSE_GEN_MAT_PROD_H diff --git a/src/external/Spectra/include/Spectra/MatOp/SparseGenRealShiftSolve.h b/src/external/Spectra/include/Spectra/MatOp/SparseGenRealShiftSolve.h deleted file mode 100644 index df4ec6cf..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/SparseGenRealShiftSolve.h +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SPARSE_GEN_REAL_SHIFT_SOLVE_H -#define SPARSE_GEN_REAL_SHIFT_SOLVE_H - -#include -#include -#include -#include - -namespace Spectra { - - -/// -/// \ingroup MatOp -/// -/// This class defines the shift-solve operation on a sparse real matrix \f$A\f$, -/// i.e., calculating \f$y=(A-\sigma I)^{-1}x\f$ for any real \f$\sigma\f$ and -/// vector \f$x\f$. It is mainly used in the GenEigsRealShiftSolver eigen solver. -/// -template -class SparseGenRealShiftSolve -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef Eigen::SparseMatrix SparseMatrix; - typedef const Eigen::Ref ConstGenericSparseMatrix; - - ConstGenericSparseMatrix m_mat; - const int m_n; - Eigen::SparseLU m_solver; - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param mat An **Eigen** sparse matrix object, whose type can be - /// `Eigen::SparseMatrix` or its mapped version - /// `Eigen::Map >`. - /// - SparseGenRealShiftSolve(ConstGenericSparseMatrix& mat) : - m_mat(mat), m_n(mat.rows()) - { - if(mat.rows() != mat.cols()) - throw std::invalid_argument("SparseGenRealShiftSolve: matrix must be square"); - } - - /// - /// Return the number of rows of the underlying matrix. - /// - Index rows() const { return m_n; } - /// - /// Return the number of columns of the underlying matrix. - /// - Index cols() const { return m_n; } - - /// - /// Set the real shift \f$\sigma\f$. - /// - void set_shift(Scalar sigma) - { - SparseMatrix I(m_n, m_n); - I.setIdentity(); - - m_solver.compute(m_mat - sigma * I); - if(m_solver.info() != Eigen::Success) - throw std::invalid_argument("SparseGenRealShiftSolve: factorization failed with the given shift"); - } - - /// - /// Perform the shift-solve operation \f$y=(A-\sigma I)^{-1}x\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = inv(A - sigma * I) * x_in - void perform_op(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_n); - MapVec y(y_out, m_n); - y.noalias() = m_solver.solve(x); - } -}; - - -} // namespace Spectra - -#endif // SPARSE_GEN_REAL_SHIFT_SOLVE_H diff --git a/src/external/Spectra/include/Spectra/MatOp/SparseRegularInverse.h b/src/external/Spectra/include/Spectra/MatOp/SparseRegularInverse.h deleted file mode 100644 index ec6614a5..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/SparseRegularInverse.h +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (C) 2017-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SPARSE_REGULAR_INVERSE_H -#define SPARSE_REGULAR_INVERSE_H - -#include -#include -#include -#include - -namespace Spectra { - - -/// -/// \ingroup MatOp -/// -/// This class defines matrix operations required by the generalized eigen solver -/// in the regular inverse mode. For a sparse and positive definite matrix \f$B\f$, -/// it implements the matrix-vector product \f$y=Bx\f$ and the linear equation -/// solving operation \f$y=B^{-1}x\f$. -/// -/// This class is intended to be used with the SymGEigsSolver generalized eigen solver -/// in the regular inverse mode. -/// -template -class SparseRegularInverse -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef Eigen::SparseMatrix SparseMatrix; - typedef const Eigen::Ref ConstGenericSparseMatrix; - - ConstGenericSparseMatrix m_mat; - const int m_n; - Eigen::ConjugateGradient m_cg; - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param mat An **Eigen** sparse matrix object, whose type can be - /// `Eigen::SparseMatrix` or its mapped version - /// `Eigen::Map >`. - /// - SparseRegularInverse(ConstGenericSparseMatrix& mat) : - m_mat(mat), m_n(mat.rows()) - { - if(mat.rows() != mat.cols()) - throw std::invalid_argument("SparseRegularInverse: matrix must be square"); - - m_cg.compute(mat); - } - - /// - /// Return the number of rows of the underlying matrix. - /// - Index rows() const { return m_n; } - /// - /// Return the number of columns of the underlying matrix. - /// - Index cols() const { return m_n; } - - /// - /// Perform the solving operation \f$y=B^{-1}x\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = inv(B) * x_in - void solve(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_n); - MapVec y(y_out, m_n); - y.noalias() = m_cg.solve(x); - } - - /// - /// Perform the matrix-vector multiplication operation \f$y=Bx\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = B * x_in - void mat_prod(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_n); - MapVec y(y_out, m_n); - y.noalias() = m_mat.template selfadjointView() * x; - } -}; - - -} // namespace Spectra - -#endif // SPARSE_REGULAR_INVERSE_H diff --git a/src/external/Spectra/include/Spectra/MatOp/SparseSymMatProd.h b/src/external/Spectra/include/Spectra/MatOp/SparseSymMatProd.h deleted file mode 100644 index ef8f96ee..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/SparseSymMatProd.h +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SPARSE_SYM_MAT_PROD_H -#define SPARSE_SYM_MAT_PROD_H - -#include -#include - -namespace Spectra { - - -/// -/// \ingroup MatOp -/// -/// This class defines the matrix-vector multiplication operation on a -/// sparse real symmetric matrix \f$A\f$, i.e., calculating \f$y=Ax\f$ for any vector -/// \f$x\f$. It is mainly used in the SymEigsSolver eigen solver. -/// -template -class SparseSymMatProd -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef Eigen::SparseMatrix SparseMatrix; - typedef const Eigen::Ref ConstGenericSparseMatrix; - - ConstGenericSparseMatrix m_mat; - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param mat An **Eigen** sparse matrix object, whose type can be - /// `Eigen::SparseMatrix` or its mapped version - /// `Eigen::Map >`. - /// - SparseSymMatProd(ConstGenericSparseMatrix& mat) : - m_mat(mat) - {} - - /// - /// Return the number of rows of the underlying matrix. - /// - Index rows() const { return m_mat.rows(); } - /// - /// Return the number of columns of the underlying matrix. - /// - Index cols() const { return m_mat.cols(); } - - /// - /// Perform the matrix-vector multiplication operation \f$y=Ax\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = A * x_in - void perform_op(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_mat.cols()); - MapVec y(y_out, m_mat.rows()); - y.noalias() = m_mat.template selfadjointView() * x; - } -}; - - -} // namespace Spectra - -#endif // SPARSE_SYM_MAT_PROD_H diff --git a/src/external/Spectra/include/Spectra/MatOp/SparseSymShiftSolve.h b/src/external/Spectra/include/Spectra/MatOp/SparseSymShiftSolve.h deleted file mode 100644 index 1821cc32..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/SparseSymShiftSolve.h +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SPARSE_SYM_SHIFT_SOLVE_H -#define SPARSE_SYM_SHIFT_SOLVE_H - -#include -#include -#include -#include - -namespace Spectra { - - -/// -/// \ingroup MatOp -/// -/// This class defines the shift-solve operation on a sparse real symmetric matrix \f$A\f$, -/// i.e., calculating \f$y=(A-\sigma I)^{-1}x\f$ for any real \f$\sigma\f$ and -/// vector \f$x\f$. It is mainly used in the SymEigsShiftSolver eigen solver. -/// -template -class SparseSymShiftSolve -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef Eigen::SparseMatrix SparseMatrix; - typedef const Eigen::Ref ConstGenericSparseMatrix; - - ConstGenericSparseMatrix m_mat; - const int m_n; - Eigen::SparseLU m_solver; - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param mat An **Eigen** sparse matrix object, whose type can be - /// `Eigen::SparseMatrix` or its mapped version - /// `Eigen::Map >`. - /// - SparseSymShiftSolve(ConstGenericSparseMatrix& mat) : - m_mat(mat), m_n(mat.rows()) - { - if(mat.rows() != mat.cols()) - throw std::invalid_argument("SparseSymShiftSolve: matrix must be square"); - } - - /// - /// Return the number of rows of the underlying matrix. - /// - Index rows() const { return m_n; } - /// - /// Return the number of columns of the underlying matrix. - /// - Index cols() const { return m_n; } - - /// - /// Set the real shift \f$\sigma\f$. - /// - void set_shift(Scalar sigma) - { - SparseMatrix mat = m_mat.template selfadjointView(); - SparseMatrix identity(m_n, m_n); - identity.setIdentity(); - mat = mat - sigma * identity; - m_solver.isSymmetric(true); - m_solver.compute(mat); - if(m_solver.info() != Eigen::Success) - throw std::invalid_argument("SparseSymShiftSolve: factorization failed with the given shift"); - } - - /// - /// Perform the shift-solve operation \f$y=(A-\sigma I)^{-1}x\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = inv(A - sigma * I) * x_in - void perform_op(const Scalar* x_in, Scalar* y_out) const - { - MapConstVec x(x_in, m_n); - MapVec y(y_out, m_n); - y.noalias() = m_solver.solve(x); - } -}; - - -} // namespace Spectra - -#endif // SPARSE_SYM_SHIFT_SOLVE_H diff --git a/src/external/Spectra/include/Spectra/MatOp/internal/ArnoldiOp.h b/src/external/Spectra/include/Spectra/MatOp/internal/ArnoldiOp.h deleted file mode 100644 index b79704b5..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/internal/ArnoldiOp.h +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright (C) 2018-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef ARNOLDI_OP_H -#define ARNOLDI_OP_H - -#include -#include // std::sqrt - -namespace Spectra { - - -/// -/// \ingroup Internals -/// @{ -/// - -/// -/// \defgroup Operators Operators -/// -/// Different types of operators. -/// - -/// -/// \ingroup Operators -/// -/// Operators used in the Arnoldi factorization. -/// -template -class ArnoldiOp -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Vector; - - OpType& m_op; - BOpType& m_Bop; - Vector m_cache; - -public: - ArnoldiOp(OpType* op, BOpType* Bop) : - m_op(*op), m_Bop(*Bop), m_cache(op->rows()) - {} - - inline Index rows() const { return m_op.rows(); } - - // In generalized eigenvalue problem Ax=lambda*Bx, define the inner product to be = x'By. - // For regular eigenvalue problems, it is the usual inner product = x'y - - // Compute = x'By - // x and y are two vectors - template - Scalar inner_product(const Arg1& x, const Arg2& y) - { - m_Bop.mat_prod(y.data(), m_cache.data()); - return x.dot(m_cache); - } - - // Compute res = = X'By - // X is a matrix, y is a vector, res is a vector - template - void trans_product(const Arg1& x, const Arg2& y, Eigen::Ref res) - { - m_Bop.mat_prod(y.data(), m_cache.data()); - res.noalias() = x.transpose() * m_cache; - } - - // B-norm of a vector, ||x||_B = sqrt(x'Bx) - template - Scalar norm(const Arg& x) - { - using std::sqrt; - return sqrt(inner_product(x, x)); - } - - // The "A" operator to generate the Krylov subspace - inline void perform_op(const Scalar* x_in, Scalar* y_out) - { - m_op.perform_op(x_in, y_out); - } -}; - - - -/// -/// \ingroup Operators -/// -/// Placeholder for the B-operator when \f$B = I\f$. -/// -class IdentityBOp {}; - - - -/// -/// \ingroup Operators -/// -/// Partial specialization for the case \f$B = I\f$. -/// -template -class ArnoldiOp -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Vector; - - OpType& m_op; - -public: - ArnoldiOp(OpType* op, IdentityBOp* /*Bop*/) : - m_op(*op) - {} - - inline Index rows() const { return m_op.rows(); } - - // Compute = x'y - // x and y are two vectors - template - Scalar inner_product(const Arg1& x, const Arg2& y) const - { - return x.dot(y); - } - - // Compute res = = X'y - // X is a matrix, y is a vector, res is a vector - template - void trans_product(const Arg1& x, const Arg2& y, Eigen::Ref res) const - { - res.noalias() = x.transpose() * y; - } - - // B-norm of a vector. For regular eigenvalue problems it is simply the L2 norm - template - Scalar norm(const Arg& x) - { - return x.norm(); - } - - // The "A" operator to generate the Krylov subspace - inline void perform_op(Scalar* x_in, Scalar* y_out) - { - m_op.perform_op(x_in, y_out); - } -}; - -/// -/// @} -/// - - -} // namespace Spectra - -#endif // ARNOLDI_OP_H diff --git a/src/external/Spectra/include/Spectra/MatOp/internal/SymGEigsCholeskyOp.h b/src/external/Spectra/include/Spectra/MatOp/internal/SymGEigsCholeskyOp.h deleted file mode 100644 index d7acdb2a..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/internal/SymGEigsCholeskyOp.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SYM_GEIGS_CHOLESKY_OP_H -#define SYM_GEIGS_CHOLESKY_OP_H - -#include -#include "../DenseSymMatProd.h" -#include "../DenseCholesky.h" - -namespace Spectra { - - -/// -/// \ingroup Operators -/// -/// This class defines the matrix operation for generalized eigen solver in the -/// Cholesky decomposition mode. It calculates \f$y=L^{-1}A(L')^{-1}x\f$ for any -/// vector \f$x\f$, where \f$L\f$ is the Cholesky decomposition of \f$B\f$. -/// This class is intended for internal use. -/// -template < typename Scalar = double, - typename OpType = DenseSymMatProd, - typename BOpType = DenseCholesky > -class SymGEigsCholeskyOp -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - - OpType& m_op; - BOpType& m_Bop; - Vector m_cache; // temporary working space - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param op Pointer to the \f$A\f$ matrix operation object. - /// \param Bop Pointer to the \f$B\f$ matrix operation object. - /// - SymGEigsCholeskyOp(OpType& op, BOpType& Bop) : - m_op(op), m_Bop(Bop), m_cache(op.rows()) - {} - - /// - /// Return the number of rows of the underlying matrix. - /// - Index rows() const { return m_Bop.rows(); } - /// - /// Return the number of columns of the underlying matrix. - /// - Index cols() const { return m_Bop.rows(); } - - /// - /// Perform the matrix operation \f$y=L^{-1}A(L')^{-1}x\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = inv(L) * A * inv(L') * x_in - void perform_op(const Scalar* x_in, Scalar* y_out) - { - m_Bop.upper_triangular_solve(x_in, y_out); - m_op.perform_op(y_out, m_cache.data()); - m_Bop.lower_triangular_solve(m_cache.data(), y_out); - } -}; - - -} // namespace Spectra - -#endif // SYM_GEIGS_CHOLESKY_OP_H diff --git a/src/external/Spectra/include/Spectra/MatOp/internal/SymGEigsRegInvOp.h b/src/external/Spectra/include/Spectra/MatOp/internal/SymGEigsRegInvOp.h deleted file mode 100644 index ac00dcb2..00000000 --- a/src/external/Spectra/include/Spectra/MatOp/internal/SymGEigsRegInvOp.h +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2017-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SYM_GEIGS_REG_INV_OP_H -#define SYM_GEIGS_REG_INV_OP_H - -#include -#include "../SparseSymMatProd.h" -#include "../SparseRegularInverse.h" - -namespace Spectra { - - -/// -/// \ingroup Operators -/// -/// This class defines the matrix operation for generalized eigen solver in the -/// regular inverse mode. This class is intended for internal use. -/// -template < typename Scalar = double, - typename OpType = SparseSymMatProd, - typename BOpType = SparseRegularInverse > -class SymGEigsRegInvOp -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - - OpType& m_op; - BOpType& m_Bop; - Vector m_cache; // temporary working space - -public: - /// - /// Constructor to create the matrix operation object. - /// - /// \param op Pointer to the \f$A\f$ matrix operation object. - /// \param Bop Pointer to the \f$B\f$ matrix operation object. - /// - SymGEigsRegInvOp(OpType& op, BOpType& Bop) : - m_op(op), m_Bop(Bop), m_cache(op.rows()) - {} - - /// - /// Return the number of rows of the underlying matrix. - /// - Index rows() const { return m_Bop.rows(); } - /// - /// Return the number of columns of the underlying matrix. - /// - Index cols() const { return m_Bop.rows(); } - - /// - /// Perform the matrix operation \f$y=B^{-1}Ax\f$. - /// - /// \param x_in Pointer to the \f$x\f$ vector. - /// \param y_out Pointer to the \f$y\f$ vector. - /// - // y_out = inv(B) * A * x_in - void perform_op(const Scalar* x_in, Scalar* y_out) - { - m_op.perform_op(x_in, m_cache.data()); - m_Bop.solve(m_cache.data(), y_out); - } -}; - - -} // namespace Spectra - -#endif // SYM_GEIGS_REG_INV_OP_H diff --git a/src/external/Spectra/include/Spectra/SymEigsBase.h b/src/external/Spectra/include/Spectra/SymEigsBase.h deleted file mode 100644 index 24d5b505..00000000 --- a/src/external/Spectra/include/Spectra/SymEigsBase.h +++ /dev/null @@ -1,447 +0,0 @@ -// Copyright (C) 2018-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SYM_EIGS_BASE_H -#define SYM_EIGS_BASE_H - -#include -#include // std::vector -#include // std::abs, std::pow, std::sqrt -#include // std::min, std::copy -#include // std::invalid_argument - -#include "Util/TypeTraits.h" -#include "Util/SelectionRule.h" -#include "Util/CompInfo.h" -#include "Util/SimpleRandom.h" -#include "MatOp/internal/ArnoldiOp.h" -#include "LinAlg/UpperHessenbergQR.h" -#include "LinAlg/TridiagEigen.h" -#include "LinAlg/Lanczos.h" - -namespace Spectra { - - -/// -/// \defgroup EigenSolver Eigen Solvers -/// -/// Eigen solvers for different types of problems. -/// - -/// -/// \ingroup EigenSolver -/// -/// This is the base class for symmetric eigen solvers, mainly for internal use. -/// It is kept here to provide the documentation for member functions of concrete eigen solvers -/// such as SymEigsSolver and SymEigsShiftSolver. -/// -template < typename Scalar, - int SelectionRule, - typename OpType, - typename BOpType > -class SymEigsBase -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef Eigen::Array Array; - typedef Eigen::Array BoolArray; - typedef Eigen::Map MapMat; - typedef Eigen::Map MapVec; - typedef Eigen::Map MapConstVec; - - typedef ArnoldiOp ArnoldiOpType; - typedef Lanczos LanczosFac; - -protected: - OpType* m_op; // object to conduct matrix operation, - // e.g. matrix-vector product - const Index m_n; // dimension of matrix A - const Index m_nev; // number of eigenvalues requested - const Index m_ncv; // dimension of Krylov subspace in the Lanczos method - Index m_nmatop; // number of matrix operations called - Index m_niter; // number of restarting iterations - - LanczosFac m_fac; // Lanczos factorization - Vector m_ritz_val; // Ritz values - -private: - Matrix m_ritz_vec; // Ritz vectors - Vector m_ritz_est; // last row of m_ritz_vec, also called the Ritz estimates - BoolArray m_ritz_conv; // indicator of the convergence of Ritz values - int m_info; // status of the computation - - const Scalar m_near_0; // a very small value, but 1.0 / m_near_0 does not overflow - // ~= 1e-307 for the "double" type - const Scalar m_eps; // the machine precision, ~= 1e-16 for the "double" type - const Scalar m_eps23; // m_eps^(2/3), used to test the convergence - - // Implicitly restarted Lanczos factorization - void restart(Index k) - { - if(k >= m_ncv) - return; - - TridiagQR decomp(m_ncv); - Matrix Q = Matrix::Identity(m_ncv, m_ncv); - - for(Index i = k; i < m_ncv; i++) - { - // QR decomposition of H-mu*I, mu is the shift - decomp.compute(m_fac.matrix_H(), m_ritz_val[i]); - - // Q -> Q * Qi - decomp.apply_YQ(Q); - // H -> Q'HQ - // Since QR = H - mu * I, we have H = QR + mu * I - // and therefore Q'HQ = RQ + mu * I - m_fac.compress_H(decomp); - } - - m_fac.compress_V(Q); - m_fac.factorize_from(k, m_ncv, m_nmatop); - - retrieve_ritzpair(); - } - - // Calculates the number of converged Ritz values - Index num_converged(Scalar tol) - { - // thresh = tol * max(m_eps23, abs(theta)), theta for Ritz value - Array thresh = tol * m_ritz_val.head(m_nev).array().abs().max(m_eps23); - Array resid = m_ritz_est.head(m_nev).array().abs() * m_fac.f_norm(); - // Converged "wanted" Ritz values - m_ritz_conv = (resid < thresh); - - return m_ritz_conv.cast().sum(); - } - - // Returns the adjusted nev for restarting - Index nev_adjusted(Index nconv) - { - using std::abs; - - Index nev_new = m_nev; - for(Index i = m_nev; i < m_ncv; i++) - if(abs(m_ritz_est[i]) < m_near_0) nev_new++; - - // Adjust nev_new, according to dsaup2.f line 677~684 in ARPACK - nev_new += std::min(nconv, (m_ncv - nev_new) / 2); - if(nev_new == 1 && m_ncv >= 6) - nev_new = m_ncv / 2; - else if(nev_new == 1 && m_ncv > 2) - nev_new = 2; - - if(nev_new > m_ncv - 1) - nev_new = m_ncv - 1; - - return nev_new; - } - - // Retrieves and sorts Ritz values and Ritz vectors - void retrieve_ritzpair() - { - TridiagEigen decomp(m_fac.matrix_H()); - const Vector& evals = decomp.eigenvalues(); - const Matrix& evecs = decomp.eigenvectors(); - - SortEigenvalue sorting(evals.data(), evals.size()); - std::vector ind = sorting.index(); - - // For BOTH_ENDS, the eigenvalues are sorted according - // to the LARGEST_ALGE rule, so we need to move those smallest - // values to the left - // The order would be - // Largest => Smallest => 2nd largest => 2nd smallest => ... - // We keep this order since the first k values will always be - // the wanted collection, no matter k is nev_updated (used in restart()) - // or is nev (used in sort_ritzpair()) - if(SelectionRule == BOTH_ENDS) - { - std::vector ind_copy(ind); - for(Index i = 0; i < m_ncv; i++) - { - // If i is even, pick values from the left (large values) - // If i is odd, pick values from the right (small values) - if(i % 2 == 0) - ind[i] = ind_copy[i / 2]; - else - ind[i] = ind_copy[m_ncv - 1 - i / 2]; - } - } - - // Copy the Ritz values and vectors to m_ritz_val and m_ritz_vec, respectively - for(Index i = 0; i < m_ncv; i++) - { - m_ritz_val[i] = evals[ind[i]]; - m_ritz_est[i] = evecs(m_ncv - 1, ind[i]); - } - for(Index i = 0; i < m_nev; i++) - { - m_ritz_vec.col(i).noalias() = evecs.col(ind[i]); - } - } - -protected: - // Sorts the first nev Ritz pairs in the specified order - // This is used to return the final results - virtual void sort_ritzpair(int sort_rule) - { - // First make sure that we have a valid index vector - SortEigenvalue sorting(m_ritz_val.data(), m_nev); - std::vector ind = sorting.index(); - - switch(sort_rule) - { - case LARGEST_ALGE: - break; - case LARGEST_MAGN: - { - SortEigenvalue sorting(m_ritz_val.data(), m_nev); - ind = sorting.index(); - } - break; - case SMALLEST_ALGE: - { - SortEigenvalue sorting(m_ritz_val.data(), m_nev); - ind = sorting.index(); - } - break; - case SMALLEST_MAGN: - { - SortEigenvalue sorting(m_ritz_val.data(), m_nev); - ind = sorting.index(); - } - break; - default: - throw std::invalid_argument("unsupported sorting rule"); - } - - Vector new_ritz_val(m_ncv); - Matrix new_ritz_vec(m_ncv, m_nev); - BoolArray new_ritz_conv(m_nev); - - for(Index i = 0; i < m_nev; i++) - { - new_ritz_val[i] = m_ritz_val[ind[i]]; - new_ritz_vec.col(i).noalias() = m_ritz_vec.col(ind[i]); - new_ritz_conv[i] = m_ritz_conv[ind[i]]; - } - - m_ritz_val.swap(new_ritz_val); - m_ritz_vec.swap(new_ritz_vec); - m_ritz_conv.swap(new_ritz_conv); - } - -public: - /// \cond - - SymEigsBase(OpType* op, BOpType* Bop, Index nev, Index ncv) : - m_op(op), - m_n(m_op->rows()), - m_nev(nev), - m_ncv(ncv > m_n ? m_n : ncv), - m_nmatop(0), - m_niter(0), - m_fac(ArnoldiOpType(op, Bop), m_ncv), - m_info(NOT_COMPUTED), - m_near_0(TypeTraits::min() * Scalar(10)), - m_eps(Eigen::NumTraits::epsilon()), - m_eps23(Eigen::numext::pow(m_eps, Scalar(2.0) / 3)) - { - if(nev < 1 || nev > m_n - 1) - throw std::invalid_argument("nev must satisfy 1 <= nev <= n - 1, n is the size of matrix"); - - if(ncv <= nev || ncv > m_n) - throw std::invalid_argument("ncv must satisfy nev < ncv <= n, n is the size of matrix"); - } - - /// - /// Virtual destructor - /// - virtual ~SymEigsBase() {} - - /// \endcond - - /// - /// Initializes the solver by providing an initial residual vector. - /// - /// \param init_resid Pointer to the initial residual vector. - /// - /// **Spectra** (and also **ARPACK**) uses an iterative algorithm - /// to find eigenvalues. This function allows the user to provide the initial - /// residual vector. - /// - void init(const Scalar* init_resid) - { - // Reset all matrices/vectors to zero - m_ritz_val.resize(m_ncv); - m_ritz_vec.resize(m_ncv, m_nev); - m_ritz_est.resize(m_ncv); - m_ritz_conv.resize(m_nev); - - m_ritz_val.setZero(); - m_ritz_vec.setZero(); - m_ritz_est.setZero(); - m_ritz_conv.setZero(); - - m_nmatop = 0; - m_niter = 0; - - // Initialize the Lanczos factorization - MapConstVec v0(init_resid, m_n); - m_fac.init(v0, m_nmatop); - } - - /// - /// Initializes the solver by providing a random initial residual vector. - /// - /// This overloaded function generates a random initial residual vector - /// (with a fixed random seed) for the algorithm. Elements in the vector - /// follow independent Uniform(-0.5, 0.5) distribution. - /// - void init() - { - SimpleRandom rng(0); - Vector init_resid = rng.random_vec(m_n); - init(init_resid.data()); - } - - /// - /// Conducts the major computation procedure. - /// - /// \param maxit Maximum number of iterations allowed in the algorithm. - /// \param tol Precision parameter for the calculated eigenvalues. - /// \param sort_rule Rule to sort the eigenvalues and eigenvectors. - /// Supported values are - /// `Spectra::LARGEST_ALGE`, `Spectra::LARGEST_MAGN`, - /// `Spectra::SMALLEST_ALGE` and `Spectra::SMALLEST_MAGN`, - /// for example `LARGEST_ALGE` indicates that largest eigenvalues - /// come first. Note that this argument is only used to - /// **sort** the final result, and the **selection** rule - /// (e.g. selecting the largest or smallest eigenvalues in the - /// full spectrum) is specified by the template parameter - /// `SelectionRule` of SymEigsSolver. - /// - /// \return Number of converged eigenvalues. - /// - Index compute(Index maxit = 1000, Scalar tol = 1e-10, int sort_rule = LARGEST_ALGE) - { - // The m-step Lanczos factorization - m_fac.factorize_from(1, m_ncv, m_nmatop); - retrieve_ritzpair(); - // Restarting - Index i, nconv = 0, nev_adj; - for(i = 0; i < maxit; i++) - { - nconv = num_converged(tol); - if(nconv >= m_nev) - break; - - nev_adj = nev_adjusted(nconv); - restart(nev_adj); - } - // Sorting results - sort_ritzpair(sort_rule); - - m_niter += i + 1; - m_info = (nconv >= m_nev) ? SUCCESSFUL : NOT_CONVERGING; - - return std::min(m_nev, nconv); - } - - /// - /// Returns the status of the computation. - /// The full list of enumeration values can be found in \ref Enumerations. - /// - int info() const { return m_info; } - - /// - /// Returns the number of iterations used in the computation. - /// - Index num_iterations() const { return m_niter; } - - /// - /// Returns the number of matrix operations used in the computation. - /// - Index num_operations() const { return m_nmatop; } - - /// - /// Returns the converged eigenvalues. - /// - /// \return A vector containing the eigenvalues. - /// Returned vector type will be `Eigen::Vector`, depending on - /// the template parameter `Scalar` defined. - /// - Vector eigenvalues() const - { - const Index nconv = m_ritz_conv.cast().sum(); - Vector res(nconv); - - if(!nconv) - return res; - - Index j = 0; - for(Index i = 0; i < m_nev; i++) - { - if(m_ritz_conv[i]) - { - res[j] = m_ritz_val[i]; - j++; - } - } - - return res; - } - - /// - /// Returns the eigenvectors associated with the converged eigenvalues. - /// - /// \param nvec The number of eigenvectors to return. - /// - /// \return A matrix containing the eigenvectors. - /// Returned matrix type will be `Eigen::Matrix`, - /// depending on the template parameter `Scalar` defined. - /// - virtual Matrix eigenvectors(Index nvec) const - { - const Index nconv = m_ritz_conv.cast().sum(); - nvec = std::min(nvec, nconv); - Matrix res(m_n, nvec); - - if(!nvec) - return res; - - Matrix ritz_vec_conv(m_ncv, nvec); - Index j = 0; - for(Index i = 0; i < m_nev && j < nvec; i++) - { - if(m_ritz_conv[i]) - { - ritz_vec_conv.col(j).noalias() = m_ritz_vec.col(i); - j++; - } - } - - res.noalias() = m_fac.matrix_V() * ritz_vec_conv; - - return res; - } - - /// - /// Returns all converged eigenvectors. - /// - virtual Matrix eigenvectors() const - { - return eigenvectors(m_nev); - } -}; - - -} // namespace Spectra - -#endif // SYM_EIGS_BASE_H diff --git a/src/external/Spectra/include/Spectra/SymEigsShiftSolver.h b/src/external/Spectra/include/Spectra/SymEigsShiftSolver.h deleted file mode 100644 index 56bd44ec..00000000 --- a/src/external/Spectra/include/Spectra/SymEigsShiftSolver.h +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SYM_EIGS_SHIFT_SOLVER_H -#define SYM_EIGS_SHIFT_SOLVER_H - -#include - -#include "SymEigsBase.h" -#include "Util/SelectionRule.h" -#include "MatOp/DenseSymShiftSolve.h" - -namespace Spectra { - - -/// -/// \ingroup EigenSolver -/// -/// This class implements the eigen solver for real symmetric matrices using -/// the **shift-and-invert mode**. The background information of the symmetric -/// eigen solver is documented in the SymEigsSolver class. Here we focus on -/// explaining the shift-and-invert mode. -/// -/// The shift-and-invert mode is based on the following fact: -/// If \f$\lambda\f$ and \f$x\f$ are a pair of eigenvalue and eigenvector of -/// matrix \f$A\f$, such that \f$Ax=\lambda x\f$, then for any \f$\sigma\f$, -/// we have -/// \f[(A-\sigma I)^{-1}x=\nu x\f] -/// where -/// \f[\nu=\frac{1}{\lambda-\sigma}\f] -/// which indicates that \f$(\nu, x)\f$ is an eigenpair of the matrix -/// \f$(A-\sigma I)^{-1}\f$. -/// -/// Therefore, if we pass the matrix operation \f$(A-\sigma I)^{-1}y\f$ -/// (rather than \f$Ay\f$) to the eigen solver, then we would get the desired -/// values of \f$\nu\f$, and \f$\lambda\f$ can also be easily obtained by noting -/// that \f$\lambda=\sigma+\nu^{-1}\f$. -/// -/// The reason why we need this type of manipulation is that -/// the algorithm of **Spectra** (and also **ARPACK**) -/// is good at finding eigenvalues with large magnitude, but may fail in looking -/// for eigenvalues that are close to zero. However, if we really need them, we -/// can set \f$\sigma=0\f$, find the largest eigenvalues of \f$A^{-1}\f$, and then -/// transform back to \f$\lambda\f$, since in this case largest values of \f$\nu\f$ -/// implies smallest values of \f$\lambda\f$. -/// -/// To summarize, in the shift-and-invert mode, the selection rule will apply to -/// \f$\nu=1/(\lambda-\sigma)\f$ rather than \f$\lambda\f$. So a selection rule -/// of `LARGEST_MAGN` combined with shift \f$\sigma\f$ will find eigenvalues of -/// \f$A\f$ that are closest to \f$\sigma\f$. But note that the eigenvalues() -/// method will always return the eigenvalues in the original problem (i.e., -/// returning \f$\lambda\f$ rather than \f$\nu\f$), and eigenvectors are the -/// same for both the original problem and the shifted-and-inverted problem. -/// -/// \tparam Scalar The element type of the matrix. -/// Currently supported types are `float`, `double` and `long double`. -/// \tparam SelectionRule An enumeration value indicating the selection rule of -/// the shifted-and-inverted eigenvalues. -/// The full list of enumeration values can be found in -/// \ref Enumerations. -/// \tparam OpType The name of the matrix operation class. Users could either -/// use the wrapper classes such as DenseSymShiftSolve and -/// SparseSymShiftSolve, or define their -/// own that implements all the public member functions as in -/// DenseSymShiftSolve. -/// -/// Below is an example that illustrates the use of the shift-and-invert mode: -/// -/// \code{.cpp} -/// #include -/// #include -/// // is implicitly included -/// #include -/// -/// using namespace Spectra; -/// -/// int main() -/// { -/// // A size-10 diagonal matrix with elements 1, 2, ..., 10 -/// Eigen::MatrixXd M = Eigen::MatrixXd::Zero(10, 10); -/// for(int i = 0; i < M.rows(); i++) -/// M(i, i) = i + 1; -/// -/// // Construct matrix operation object using the wrapper class -/// DenseSymShiftSolve op(M); -/// -/// // Construct eigen solver object with shift 0 -/// // This will find eigenvalues that are closest to 0 -/// SymEigsShiftSolver< double, LARGEST_MAGN, -/// DenseSymShiftSolve > eigs(&op, 3, 6, 0.0); -/// -/// eigs.init(); -/// eigs.compute(); -/// if(eigs.info() == SUCCESSFUL) -/// { -/// Eigen::VectorXd evalues = eigs.eigenvalues(); -/// // Will get (3.0, 2.0, 1.0) -/// std::cout << "Eigenvalues found:\n" << evalues << std::endl; -/// } -/// -/// return 0; -/// } -/// \endcode -/// -/// Also an example for user-supplied matrix shift-solve operation class: -/// -/// \code{.cpp} -/// #include -/// #include -/// #include -/// -/// using namespace Spectra; -/// -/// // M = diag(1, 2, ..., 10) -/// class MyDiagonalTenShiftSolve -/// { -/// private: -/// double sigma_; -/// public: -/// int rows() { return 10; } -/// int cols() { return 10; } -/// void set_shift(double sigma) { sigma_ = sigma; } -/// // y_out = inv(A - sigma * I) * x_in -/// // inv(A - sigma * I) = diag(1/(1-sigma), 1/(2-sigma), ...) -/// void perform_op(double *x_in, double *y_out) -/// { -/// for(int i = 0; i < rows(); i++) -/// { -/// y_out[i] = x_in[i] / (i + 1 - sigma_); -/// } -/// } -/// }; -/// -/// int main() -/// { -/// MyDiagonalTenShiftSolve op; -/// // Find three eigenvalues that are closest to 3.14 -/// SymEigsShiftSolver eigs(&op, 3, 6, 3.14); -/// eigs.init(); -/// eigs.compute(); -/// if(eigs.info() == SUCCESSFUL) -/// { -/// Eigen::VectorXd evalues = eigs.eigenvalues(); -/// // Will get (4.0, 3.0, 2.0) -/// std::cout << "Eigenvalues found:\n" << evalues << std::endl; -/// } -/// -/// return 0; -/// } -/// \endcode -/// -template > -class SymEigsShiftSolver: public SymEigsBase -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Array Array; - - const Scalar m_sigma; - - // First transform back the Ritz values, and then sort - void sort_ritzpair(int sort_rule) - { - Array m_ritz_val_org = Scalar(1.0) / this->m_ritz_val.head(this->m_nev).array() + m_sigma; - this->m_ritz_val.head(this->m_nev) = m_ritz_val_org; - SymEigsBase::sort_ritzpair(sort_rule); - } - -public: - /// - /// Constructor to create a eigen solver object using the shift-and-invert mode. - /// - /// \param op Pointer to the matrix operation object, which should implement - /// the shift-solve operation of \f$A\f$: calculating - /// \f$(A-\sigma I)^{-1}v\f$ for any vector \f$v\f$. Users could either - /// create the object from the wrapper class such as DenseSymShiftSolve, or - /// define their own that implements all the public member functions - /// as in DenseSymShiftSolve. - /// \param nev Number of eigenvalues requested. This should satisfy \f$1\le nev \le n-1\f$, - /// where \f$n\f$ is the size of matrix. - /// \param ncv Parameter that controls the convergence speed of the algorithm. - /// Typically a larger `ncv_` means faster convergence, but it may - /// also result in greater memory use and more matrix operations - /// in each iteration. This parameter must satisfy \f$nev < ncv \le n\f$, - /// and is advised to take \f$ncv \ge 2\cdot nev\f$. - /// \param sigma The value of the shift. - /// - SymEigsShiftSolver(OpType* op, Index nev, Index ncv, Scalar sigma) : - SymEigsBase(op, NULL, nev, ncv), - m_sigma(sigma) - { - this->m_op->set_shift(m_sigma); - } -}; - - -} // namespace Spectra - -#endif // SYM_EIGS_SHIFT_SOLVER_H diff --git a/src/external/Spectra/include/Spectra/SymEigsSolver.h b/src/external/Spectra/include/Spectra/SymEigsSolver.h deleted file mode 100644 index 8ba3e509..00000000 --- a/src/external/Spectra/include/Spectra/SymEigsSolver.h +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SYM_EIGS_SOLVER_H -#define SYM_EIGS_SOLVER_H - -#include - -#include "SymEigsBase.h" -#include "Util/SelectionRule.h" -#include "MatOp/DenseSymMatProd.h" - -namespace Spectra { - - -/// -/// \ingroup EigenSolver -/// -/// This class implements the eigen solver for real symmetric matrices, i.e., -/// to solve \f$Ax=\lambda x\f$ where \f$A\f$ is symmetric. -/// -/// **Spectra** is designed to calculate a specified number (\f$k\f$) -/// of eigenvalues of a large square matrix (\f$A\f$). Usually \f$k\f$ is much -/// less than the size of the matrix (\f$n\f$), so that only a few eigenvalues -/// and eigenvectors are computed. -/// -/// Rather than providing the whole \f$A\f$ matrix, the algorithm only requires -/// the matrix-vector multiplication operation of \f$A\f$. Therefore, users of -/// this solver need to supply a class that computes the result of \f$Av\f$ -/// for any given vector \f$v\f$. The name of this class should be given to -/// the template parameter `OpType`, and instance of this class passed to -/// the constructor of SymEigsSolver. -/// -/// If the matrix \f$A\f$ is already stored as a matrix object in **Eigen**, -/// for example `Eigen::MatrixXd`, then there is an easy way to construct such -/// matrix operation class, by using the built-in wrapper class DenseSymMatProd -/// which wraps an existing matrix object in **Eigen**. This is also the -/// default template parameter for SymEigsSolver. For sparse matrices, the -/// wrapper class SparseSymMatProd can be used similarly. -/// -/// If the users need to define their own matrix-vector multiplication operation -/// class, it should implement all the public member functions as in DenseSymMatProd. -/// -/// \tparam Scalar The element type of the matrix. -/// Currently supported types are `float`, `double` and `long double`. -/// \tparam SelectionRule An enumeration value indicating the selection rule of -/// the requested eigenvalues, for example `LARGEST_MAGN` -/// to retrieve eigenvalues with the largest magnitude. -/// The full list of enumeration values can be found in -/// \ref Enumerations. -/// \tparam OpType The name of the matrix operation class. Users could either -/// use the wrapper classes such as DenseSymMatProd and -/// SparseSymMatProd, or define their -/// own that implements all the public member functions as in -/// DenseSymMatProd. -/// -/// Below is an example that demonstrates the usage of this class. -/// -/// \code{.cpp} -/// #include -/// #include -/// // is implicitly included -/// #include -/// -/// using namespace Spectra; -/// -/// int main() -/// { -/// // We are going to calculate the eigenvalues of M -/// Eigen::MatrixXd A = Eigen::MatrixXd::Random(10, 10); -/// Eigen::MatrixXd M = A + A.transpose(); -/// -/// // Construct matrix operation object using the wrapper class DenseSymMatProd -/// DenseSymMatProd op(M); -/// -/// // Construct eigen solver object, requesting the largest three eigenvalues -/// SymEigsSolver< double, LARGEST_ALGE, DenseSymMatProd > eigs(&op, 3, 6); -/// -/// // Initialize and compute -/// eigs.init(); -/// int nconv = eigs.compute(); -/// -/// // Retrieve results -/// Eigen::VectorXd evalues; -/// if(eigs.info() == SUCCESSFUL) -/// evalues = eigs.eigenvalues(); -/// -/// std::cout << "Eigenvalues found:\n" << evalues << std::endl; -/// -/// return 0; -/// } -/// \endcode -/// -/// And here is an example for user-supplied matrix operation class. -/// -/// \code{.cpp} -/// #include -/// #include -/// #include -/// -/// using namespace Spectra; -/// -/// // M = diag(1, 2, ..., 10) -/// class MyDiagonalTen -/// { -/// public: -/// int rows() { return 10; } -/// int cols() { return 10; } -/// // y_out = M * x_in -/// void perform_op(double *x_in, double *y_out) -/// { -/// for(int i = 0; i < rows(); i++) -/// { -/// y_out[i] = x_in[i] * (i + 1); -/// } -/// } -/// }; -/// -/// int main() -/// { -/// MyDiagonalTen op; -/// SymEigsSolver eigs(&op, 3, 6); -/// eigs.init(); -/// eigs.compute(); -/// if(eigs.info() == SUCCESSFUL) -/// { -/// Eigen::VectorXd evalues = eigs.eigenvalues(); -/// // Will get (10, 9, 8) -/// std::cout << "Eigenvalues found:\n" << evalues << std::endl; -/// } -/// -/// return 0; -/// } -/// \endcode -/// -template < typename Scalar = double, - int SelectionRule = LARGEST_MAGN, - typename OpType = DenseSymMatProd > -class SymEigsSolver: public SymEigsBase -{ -private: - typedef Eigen::Index Index; - -public: - /// - /// Constructor to create a solver object. - /// - /// \param op Pointer to the matrix operation object, which should implement - /// the matrix-vector multiplication operation of \f$A\f$: - /// calculating \f$Av\f$ for any vector \f$v\f$. Users could either - /// create the object from the wrapper class such as DenseSymMatProd, or - /// define their own that implements all the public member functions - /// as in DenseSymMatProd. - /// \param nev Number of eigenvalues requested. This should satisfy \f$1\le nev \le n-1\f$, - /// where \f$n\f$ is the size of matrix. - /// \param ncv Parameter that controls the convergence speed of the algorithm. - /// Typically a larger `ncv` means faster convergence, but it may - /// also result in greater memory use and more matrix operations - /// in each iteration. This parameter must satisfy \f$nev < ncv \le n\f$, - /// and is advised to take \f$ncv \ge 2\cdot nev\f$. - /// - SymEigsSolver(OpType* op, Index nev, Index ncv) : - SymEigsBase(op, NULL, nev, ncv) - {} - -}; - - -} // namespace Spectra - -#endif // SYM_EIGS_SOLVER_H diff --git a/src/external/Spectra/include/Spectra/SymGEigsSolver.h b/src/external/Spectra/include/Spectra/SymGEigsSolver.h deleted file mode 100644 index 8e774284..00000000 --- a/src/external/Spectra/include/Spectra/SymGEigsSolver.h +++ /dev/null @@ -1,334 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SYM_GEIGS_SOLVER_H -#define SYM_GEIGS_SOLVER_H - -#include "SymEigsBase.h" -#include "Util/GEigsMode.h" -#include "MatOp/internal/SymGEigsCholeskyOp.h" -#include "MatOp/internal/SymGEigsRegInvOp.h" - -namespace Spectra { - - -/// -/// \defgroup GEigenSolver Generalized Eigen Solvers -/// -/// Generalized eigen solvers for different types of problems. -/// - -/// -/// \ingroup GEigenSolver -/// -/// This class implements the generalized eigen solver for real symmetric -/// matrices, i.e., to solve \f$Ax=\lambda Bx\f$ where \f$A\f$ is symmetric and -/// \f$B\f$ is positive definite. -/// -/// There are two modes of this solver, specified by the template parameter -/// GEigsMode. See the pages for the specialized classes for details. -/// - The Cholesky mode assumes that \f$B\f$ can be factorized using Cholesky -/// decomposition, which is the preferred mode when the decomposition is -/// available. (This can be easily done in Eigen using the dense or sparse -/// Cholesky solver.) -/// See \ref SymGEigsSolver "SymGEigsSolver (Cholesky mode)" for more details. -/// - The regular inverse mode requires the matrix-vector product \f$Bv\f$ and the -/// linear equation solving operation \f$B^{-1}v\f$. This mode should only be -/// used when the Cholesky decomposition of \f$B\f$ is hard to implement, or -/// when computing \f$B^{-1}v\f$ is much faster than the Cholesky decomposition. -/// See \ref SymGEigsSolver "SymGEigsSolver (Regular inverse mode)" for more details. - -// Empty class template -template < typename Scalar, - int SelectionRule, - typename OpType, - typename BOpType, - int GEigsMode > -class SymGEigsSolver -{}; - - - -/// -/// \ingroup GEigenSolver -/// -/// This class implements the generalized eigen solver for real symmetric -/// matrices using Cholesky decomposition, i.e., to solve \f$Ax=\lambda Bx\f$ -/// where \f$A\f$ is symmetric and \f$B\f$ is positive definite with the Cholesky -/// decomposition \f$B=LL'\f$. -/// -/// This solver requires two matrix operation objects: one for \f$A\f$ that implements -/// the matrix multiplication \f$Av\f$, and one for \f$B\f$ that implements the lower -/// and upper triangular solving \f$L^{-1}v\f$ and \f$(L')^{-1}v\f$. -/// -/// If \f$A\f$ and \f$B\f$ are stored as Eigen matrices, then the first operation -/// can be created using the DenseSymMatProd or SparseSymMatProd classes, and -/// the second operation can be created using the DenseCholesky or SparseCholesky -/// classes. If the users need to define their own operation classes, then they -/// should implement all the public member functions as in those built-in classes. -/// -/// \tparam Scalar The element type of the matrix. -/// Currently supported types are `float`, `double` and `long double`. -/// \tparam SelectionRule An enumeration value indicating the selection rule of -/// the requested eigenvalues, for example `LARGEST_MAGN` -/// to retrieve eigenvalues with the largest magnitude. -/// The full list of enumeration values can be found in -/// \ref Enumerations. -/// \tparam OpType The name of the matrix operation class for \f$A\f$. Users could either -/// use the wrapper classes such as DenseSymMatProd and -/// SparseSymMatProd, or define their -/// own that implements all the public member functions as in -/// DenseSymMatProd. -/// \tparam BOpType The name of the matrix operation class for \f$B\f$. Users could either -/// use the wrapper classes such as DenseCholesky and -/// SparseCholesky, or define their -/// own that implements all the public member functions as in -/// DenseCholesky. -/// \tparam GEigsMode Mode of the generalized eigen solver. In this solver -/// it is Spectra::GEIGS_CHOLESKY. -/// -/// Below is an example that demonstrates the usage of this class. -/// -/// \code{.cpp} -/// #include -/// #include -/// #include -/// #include -/// #include -/// #include -/// #include -/// -/// using namespace Spectra; -/// -/// int main() -/// { -/// // We are going to solve the generalized eigenvalue problem A * x = lambda * B * x -/// const int n = 100; -/// -/// // Define the A matrix -/// Eigen::MatrixXd M = Eigen::MatrixXd::Random(n, n); -/// Eigen::MatrixXd A = M + M.transpose(); -/// -/// // Define the B matrix, a band matrix with 2 on the diagonal and 1 on the subdiagonals -/// Eigen::SparseMatrix B(n, n); -/// B.reserve(Eigen::VectorXi::Constant(n, 3)); -/// for(int i = 0; i < n; i++) -/// { -/// B.insert(i, i) = 2.0; -/// if(i > 0) -/// B.insert(i - 1, i) = 1.0; -/// if(i < n - 1) -/// B.insert(i + 1, i) = 1.0; -/// } -/// -/// // Construct matrix operation object using the wrapper classes -/// DenseSymMatProd op(A); -/// SparseCholesky Bop(B); -/// -/// // Construct generalized eigen solver object, requesting the largest three generalized eigenvalues -/// SymGEigsSolver, SparseCholesky, GEIGS_CHOLESKY> -/// geigs(&op, &Bop, 3, 6); -/// -/// // Initialize and compute -/// geigs.init(); -/// int nconv = geigs.compute(); -/// -/// // Retrieve results -/// Eigen::VectorXd evalues; -/// Eigen::MatrixXd evecs; -/// if(geigs.info() == SUCCESSFUL) -/// { -/// evalues = geigs.eigenvalues(); -/// evecs = geigs.eigenvectors(); -/// } -/// -/// std::cout << "Generalized eigenvalues found:\n" << evalues << std::endl; -/// std::cout << "Generalized eigenvectors found:\n" << evecs.topRows(10) << std::endl; -/// -/// // Verify results using the generalized eigen solver in Eigen -/// Eigen::MatrixXd Bdense = B; -/// Eigen::GeneralizedSelfAdjointEigenSolver es(A, Bdense); -/// -/// std::cout << "Generalized eigenvalues:\n" << es.eigenvalues().tail(3) << std::endl; -/// std::cout << "Generalized eigenvectors:\n" << es.eigenvectors().rightCols(3).topRows(10) << std::endl; -/// -/// return 0; -/// } -/// \endcode - -// Partial specialization for GEigsMode = GEIGS_CHOLESKY -template < typename Scalar, - int SelectionRule, - typename OpType, - typename BOpType > -class SymGEigsSolver: - public SymEigsBase, IdentityBOp> -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - - BOpType* m_Bop; - -public: - /// - /// Constructor to create a solver object. - /// - /// \param op Pointer to the \f$A\f$ matrix operation object. It - /// should implement the matrix-vector multiplication operation of \f$A\f$: - /// calculating \f$Av\f$ for any vector \f$v\f$. Users could either - /// create the object from the wrapper classes such as DenseSymMatProd, or - /// define their own that implements all the public member functions - /// as in DenseSymMatProd. - /// \param Bop Pointer to the \f$B\f$ matrix operation object. It - /// represents a Cholesky decomposition of \f$B\f$, and should - /// implement the lower and upper triangular solving operations: - /// calculating \f$L^{-1}v\f$ and \f$(L')^{-1}v\f$ for any vector - /// \f$v\f$, where \f$LL'=B\f$. Users could either - /// create the object from the wrapper classes such as DenseCholesky, or - /// define their own that implements all the public member functions - /// as in DenseCholesky. - /// \param nev Number of eigenvalues requested. This should satisfy \f$1\le nev \le n-1\f$, - /// where \f$n\f$ is the size of matrix. - /// \param ncv Parameter that controls the convergence speed of the algorithm. - /// Typically a larger `ncv` means faster convergence, but it may - /// also result in greater memory use and more matrix operations - /// in each iteration. This parameter must satisfy \f$nev < ncv \le n\f$, - /// and is advised to take \f$ncv \ge 2\cdot nev\f$. - /// - SymGEigsSolver(OpType* op, BOpType* Bop, Index nev, Index ncv) : - SymEigsBase, IdentityBOp>( - new SymGEigsCholeskyOp(*op, *Bop), NULL, nev, ncv - ), - m_Bop(Bop) - {} - - /// \cond - - ~SymGEigsSolver() - { - // m_op contains the constructed SymGEigsCholeskyOp object - delete this->m_op; - } - - Matrix eigenvectors(Index nvec) const - { - Matrix res = SymEigsBase, IdentityBOp>::eigenvectors(nvec); - Vector tmp(res.rows()); - const Index nconv = res.cols(); - for(Index i = 0; i < nconv; i++) - { - m_Bop->upper_triangular_solve(&res(0, i), tmp.data()); - res.col(i).noalias() = tmp; - } - - return res; - } - - Matrix eigenvectors() const - { - return SymGEigsSolver::eigenvectors(this->m_nev); - } - - /// \endcond -}; - - - -/// -/// \ingroup GEigenSolver -/// -/// This class implements the generalized eigen solver for real symmetric -/// matrices in the regular inverse mode, i.e., to solve \f$Ax=\lambda Bx\f$ -/// where \f$A\f$ is symmetric, and \f$B\f$ is positive definite with the operations -/// defined below. -/// -/// This solver requires two matrix operation objects: one for \f$A\f$ that implements -/// the matrix multiplication \f$Av\f$, and one for \f$B\f$ that implements the -/// matrix-vector product \f$Bv\f$ and the linear equation solving operation \f$B^{-1}v\f$. -/// -/// If \f$A\f$ and \f$B\f$ are stored as Eigen matrices, then the first operation -/// can be created using the DenseSymMatProd or SparseSymMatProd classes, and -/// the second operation can be created using the SparseRegularInverse class. There is no -/// wrapper class for a dense \f$B\f$ matrix since in this case the Cholesky mode -/// is always preferred. If the users need to define their own operation classes, then they -/// should implement all the public member functions as in those built-in classes. -/// -/// \tparam Scalar The element type of the matrix. -/// Currently supported types are `float`, `double` and `long double`. -/// \tparam SelectionRule An enumeration value indicating the selection rule of -/// the requested eigenvalues, for example `LARGEST_MAGN` -/// to retrieve eigenvalues with the largest magnitude. -/// The full list of enumeration values can be found in -/// \ref Enumerations. -/// \tparam OpType The name of the matrix operation class for \f$A\f$. Users could either -/// use the wrapper classes such as DenseSymMatProd and -/// SparseSymMatProd, or define their -/// own that implements all the public member functions as in -/// DenseSymMatProd. -/// \tparam BOpType The name of the matrix operation class for \f$B\f$. Users could either -/// use the wrapper class SparseRegularInverse, or define their -/// own that implements all the public member functions as in -/// SparseRegularInverse. -/// \tparam GEigsMode Mode of the generalized eigen solver. In this solver -/// it is Spectra::GEIGS_REGULAR_INVERSE. -/// - -// Partial specialization for GEigsMode = GEIGS_REGULAR_INVERSE -template < typename Scalar, - int SelectionRule, - typename OpType, - typename BOpType > -class SymGEigsSolver: - public SymEigsBase, BOpType> -{ -private: - typedef Eigen::Index Index; - -public: - /// - /// Constructor to create a solver object. - /// - /// \param op Pointer to the \f$A\f$ matrix operation object. It - /// should implement the matrix-vector multiplication operation of \f$A\f$: - /// calculating \f$Av\f$ for any vector \f$v\f$. Users could either - /// create the object from the wrapper classes such as DenseSymMatProd, or - /// define their own that implements all the public member functions - /// as in DenseSymMatProd. - /// \param Bop Pointer to the \f$B\f$ matrix operation object. It should - /// implement the multiplication operation \f$Bv\f$ and the linear equation - /// solving operation \f$B^{-1}v\f$ for any vector \f$v\f$. Users could either - /// create the object from the wrapper class SparseRegularInverse, or - /// define their own that implements all the public member functions - /// as in SparseRegularInverse. - /// \param nev Number of eigenvalues requested. This should satisfy \f$1\le nev \le n-1\f$, - /// where \f$n\f$ is the size of matrix. - /// \param ncv Parameter that controls the convergence speed of the algorithm. - /// Typically a larger `ncv` means faster convergence, but it may - /// also result in greater memory use and more matrix operations - /// in each iteration. This parameter must satisfy \f$nev < ncv \le n\f$, - /// and is advised to take \f$ncv \ge 2\cdot nev\f$. - /// - SymGEigsSolver(OpType* op, BOpType* Bop, Index nev, Index ncv) : - SymEigsBase, BOpType>( - new SymGEigsRegInvOp(*op, *Bop), Bop, nev, ncv - ) - {} - - /// \cond - ~SymGEigsSolver() - { - // m_op contains the constructed SymGEigsRegInvOp object - delete this->m_op; - } - /// \endcond -}; - - -} // namespace Spectra - -#endif // SYM_GEIGS_SOLVER_H diff --git a/src/external/Spectra/include/Spectra/Util/CompInfo.h b/src/external/Spectra/include/Spectra/Util/CompInfo.h deleted file mode 100644 index b8e639d6..00000000 --- a/src/external/Spectra/include/Spectra/Util/CompInfo.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef COMP_INFO_H -#define COMP_INFO_H - -namespace Spectra { - - -/// -/// \ingroup Enumerations -/// -/// The enumeration to report the status of computation. -/// -enum COMPUTATION_INFO -{ - SUCCESSFUL = 0, ///< Computation was successful. - - NOT_COMPUTED, ///< Used in eigen solvers, indicating that computation - ///< has not been conducted. Users should call - ///< the `compute()` member function of solvers. - - NOT_CONVERGING, ///< Used in eigen solvers, indicating that some eigenvalues - ///< did not converge. The `compute()` - ///< function returns the number of converged eigenvalues. - - NUMERICAL_ISSUE ///< Used in Cholesky decomposition, indicating that the - ///< matrix is not positive definite. -}; - - -} // namespace Spectra - -#endif // COMP_INFO_H diff --git a/src/external/Spectra/include/Spectra/Util/GEigsMode.h b/src/external/Spectra/include/Spectra/Util/GEigsMode.h deleted file mode 100644 index d03f269d..00000000 --- a/src/external/Spectra/include/Spectra/Util/GEigsMode.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef GEIGS_MODE_H -#define GEIGS_MODE_H - -namespace Spectra { - - -/// -/// \ingroup Enumerations -/// -/// The enumeration to specify the mode of generalized eigenvalue solver. -/// -enum GEIGS_MODE -{ - GEIGS_CHOLESKY = 0, ///< Using Cholesky decomposition to solve generalized eigenvalues. - - GEIGS_REGULAR_INVERSE, ///< Regular inverse mode for generalized eigenvalue solver. - - GEIGS_SHIFT_INVERT, ///< Shift-and-invert mode for generalized eigenvalue solver. - - GEIGS_BUCKLING, ///< Buckling mode for generalized eigenvalue solver. - - GEIGS_CAYLEY ///< Cayley transformation mode for generalized eigenvalue solver. -}; - - -} // namespace Spectra - -#endif // GEIGS_MODE_H diff --git a/src/external/Spectra/include/Spectra/Util/SelectionRule.h b/src/external/Spectra/include/Spectra/Util/SelectionRule.h deleted file mode 100644 index 19f71dcf..00000000 --- a/src/external/Spectra/include/Spectra/Util/SelectionRule.h +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SELECTION_RULE_H -#define SELECTION_RULE_H - -#include // std::vector -#include // std::abs -#include // std::sort -#include // std::complex -#include // std::pair -#include // std::invalid_argument - -namespace Spectra { - - -/// -/// \defgroup Enumerations -/// -/// Enumeration types for the selection rule of eigenvalues. -/// - -/// -/// \ingroup Enumerations -/// -/// The enumeration of selection rules of desired eigenvalues. -/// -enum SELECT_EIGENVALUE -{ - LARGEST_MAGN = 0, ///< Select eigenvalues with largest magnitude. Magnitude - ///< means the absolute value for real numbers and norm for - ///< complex numbers. Applies to both symmetric and general - ///< eigen solvers. - - LARGEST_REAL, ///< Select eigenvalues with largest real part. Only for general eigen solvers. - - LARGEST_IMAG, ///< Select eigenvalues with largest imaginary part (in magnitude). Only for general eigen solvers. - - LARGEST_ALGE, ///< Select eigenvalues with largest algebraic value, considering - ///< any negative sign. Only for symmetric eigen solvers. - - SMALLEST_MAGN, ///< Select eigenvalues with smallest magnitude. Applies to both symmetric and general - ///< eigen solvers. - - SMALLEST_REAL, ///< Select eigenvalues with smallest real part. Only for general eigen solvers. - - SMALLEST_IMAG, ///< Select eigenvalues with smallest imaginary part (in magnitude). Only for general eigen solvers. - - SMALLEST_ALGE, ///< Select eigenvalues with smallest algebraic value. Only for symmetric eigen solvers. - - BOTH_ENDS ///< Select eigenvalues half from each end of the spectrum. When - ///< `nev` is odd, compute more from the high end. Only for symmetric eigen solvers. -}; - -/// -/// \ingroup Enumerations -/// -/// The enumeration of selection rules of desired eigenvalues. Alias for `SELECT_EIGENVALUE`. -/// -enum SELECT_EIGENVALUE_ALIAS -{ - WHICH_LM = 0, ///< Alias for `LARGEST_MAGN` - WHICH_LR, ///< Alias for `LARGEST_REAL` - WHICH_LI, ///< Alias for `LARGEST_IMAG` - WHICH_LA, ///< Alias for `LARGEST_ALGE` - WHICH_SM, ///< Alias for `SMALLEST_MAGN` - WHICH_SR, ///< Alias for `SMALLEST_REAL` - WHICH_SI, ///< Alias for `SMALLEST_IMAG` - WHICH_SA, ///< Alias for `SMALLEST_ALGE` - WHICH_BE ///< Alias for `BOTH_ENDS` -}; - -/// \cond - -// Get the element type of a "scalar" -// ElemType => double -// ElemType< std::complex > => double -template -class ElemType -{ -public: - typedef T type; -}; - -template -class ElemType< std::complex > -{ -public: - typedef T type; -}; - -// When comparing eigenvalues, we first calculate the "target" -// to sort. For example, if we want to choose the eigenvalues with -// largest magnitude, the target will be -abs(x). -// The minus sign is due to the fact that std::sort() sorts in ascending order. - -// Default target: throw an exception -template -class SortingTarget -{ -public: - static typename ElemType::type get(const Scalar& val) - { - using std::abs; - throw std::invalid_argument("incompatible selection rule"); - return -abs(val); - } -}; - -// Specialization for LARGEST_MAGN -// This covers [float, double, complex] x [LARGEST_MAGN] -template -class SortingTarget -{ -public: - static typename ElemType::type get(const Scalar& val) - { - using std::abs; - return -abs(val); - } -}; - -// Specialization for LARGEST_REAL -// This covers [complex] x [LARGEST_REAL] -template -class SortingTarget, LARGEST_REAL> -{ -public: - static RealType get(const std::complex& val) - { - return -val.real(); - } -}; - -// Specialization for LARGEST_IMAG -// This covers [complex] x [LARGEST_IMAG] -template -class SortingTarget, LARGEST_IMAG> -{ -public: - static RealType get(const std::complex& val) - { - using std::abs; - return -abs(val.imag()); - } -}; - -// Specialization for LARGEST_ALGE -// This covers [float, double] x [LARGEST_ALGE] -template -class SortingTarget -{ -public: - static Scalar get(const Scalar& val) - { - return -val; - } -}; - -// Here BOTH_ENDS is the same as LARGEST_ALGE, but -// we need some additional steps, which are done in -// SymEigsSolver.h => retrieve_ritzpair(). -// There we move the smallest values to the proper locations. -template -class SortingTarget -{ -public: - static Scalar get(const Scalar& val) - { - return -val; - } -}; - -// Specialization for SMALLEST_MAGN -// This covers [float, double, complex] x [SMALLEST_MAGN] -template -class SortingTarget -{ -public: - static typename ElemType::type get(const Scalar& val) - { - using std::abs; - return abs(val); - } -}; - -// Specialization for SMALLEST_REAL -// This covers [complex] x [SMALLEST_REAL] -template -class SortingTarget, SMALLEST_REAL> -{ -public: - static RealType get(const std::complex& val) - { - return val.real(); - } -}; - -// Specialization for SMALLEST_IMAG -// This covers [complex] x [SMALLEST_IMAG] -template -class SortingTarget, SMALLEST_IMAG> -{ -public: - static RealType get(const std::complex& val) - { - using std::abs; - return abs(val.imag()); - } -}; - -// Specialization for SMALLEST_ALGE -// This covers [float, double] x [SMALLEST_ALGE] -template -class SortingTarget -{ -public: - static Scalar get(const Scalar& val) - { - return val; - } -}; - -// Sort eigenvalues and return the order index -template -class PairComparator -{ -public: - bool operator() (const PairType& v1, const PairType& v2) - { - return v1.first < v2.first; - } -}; - -template -class SortEigenvalue -{ -private: - typedef typename ElemType::type TargetType; // Type of the sorting target, will be - // a floating number type, e.g. "double" - typedef std::pair PairType; // Type of the sorting pair, including - // the sorting target and the index - - std::vector pair_sort; - -public: - SortEigenvalue(const T* start, int size) : - pair_sort(size) - { - for(int i = 0; i < size; i++) - { - pair_sort[i].first = SortingTarget::get(start[i]); - pair_sort[i].second = i; - } - PairComparator comp; - std::sort(pair_sort.begin(), pair_sort.end(), comp); - } - - std::vector index() - { - std::vector ind(pair_sort.size()); - for(unsigned int i = 0; i < ind.size(); i++) - ind[i] = pair_sort[i].second; - - return ind; - } -}; - -/// \endcond - - -} // namespace Spectra - -#endif // SELECTION_RULE_H diff --git a/src/external/Spectra/include/Spectra/Util/SimpleRandom.h b/src/external/Spectra/include/Spectra/Util/SimpleRandom.h deleted file mode 100644 index 7b1e6162..00000000 --- a/src/external/Spectra/include/Spectra/Util/SimpleRandom.h +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (C) 2016-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef SIMPLE_RANDOM_H -#define SIMPLE_RANDOM_H - -#include - -/// \cond - -namespace Spectra { - - -// We need a simple pseudo random number generator here: -// 1. It is used to generate initial and restarted residual vector. -// 2. It is not necessary to be so "random" and advanced. All we hope -// is that the residual vector is not in the space spanned by the -// current Krylov space. This should be met almost surely. -// 3. We don't want to call RNG in C++, since we actually want the -// algorithm to be deterministic. Also, calling RNG in C/C++ is not -// allowed in R packages submitted to CRAN. -// 4. The method should be as simple as possible, so an LCG is enough. -// 5. Based on public domain code by Ray Gardner -// http://stjarnhimlen.se/snippets/rg_rand.c - - -template -class SimpleRandom -{ -private: - typedef Eigen::Index Index; - typedef Eigen::Matrix Vector; - - const unsigned int m_a; // multiplier - const unsigned long m_max; // 2^31 - 1 - long m_rand; - - inline long next_long_rand(long seed) - { - unsigned long lo, hi; - - lo = m_a * (long)(seed & 0xFFFF); - hi = m_a * (long)((unsigned long)seed >> 16); - lo += (hi & 0x7FFF) << 16; - if(lo > m_max) - { - lo &= m_max; - ++lo; - } - lo += hi >> 15; - if(lo > m_max) - { - lo &= m_max; - ++lo; - } - return (long)lo; - } -public: - SimpleRandom(unsigned long init_seed) : - m_a(16807), - m_max(2147483647L), - m_rand(init_seed ? (init_seed & m_max) : 1) - {} - - Scalar random() - { - m_rand = next_long_rand(m_rand); - return Scalar(m_rand) / Scalar(m_max) - Scalar(0.5); - } - - // Vector of random numbers of type Scalar - // Ranging from -0.5 to 0.5 - Vector random_vec(const Index len) - { - Vector res(len); - for(Index i = 0; i < len; i++) - { - m_rand = next_long_rand(m_rand); - res[i] = Scalar(m_rand) / Scalar(m_max) - Scalar(0.5); - } - return res; - } -}; - - -} // namespace Spectra - -/// \endcond - -#endif // SIMPLE_RANDOM_H diff --git a/src/external/Spectra/include/Spectra/Util/TypeTraits.h b/src/external/Spectra/include/Spectra/Util/TypeTraits.h deleted file mode 100644 index a4cc05b2..00000000 --- a/src/external/Spectra/include/Spectra/Util/TypeTraits.h +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (C) 2018-2019 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef TYPE_TRAITS_H -#define TYPE_TRAITS_H - -#include -#include - -/// \cond - -namespace Spectra { - - -// For a real value type "Scalar", we want to know its smallest -// positive value, i.e., std::numeric_limits::min(). -// However, we must take non-standard value types into account, -// so we rely on Eigen::NumTraits. -// -// Eigen::NumTraits has defined epsilon() and lowest(), but -// lowest() means negative highest(), which is a very small -// negative value. -// -// Therefore, we manually define this limit, and use eplison()^3 -// to mimic it for non-standard types. - -// Generic definition -template -struct TypeTraits -{ - static inline Scalar min() - { - return Eigen::numext::pow(Eigen::NumTraits::epsilon(), Scalar(3)); - } -}; - -// Full specialization -template <> -struct TypeTraits -{ - static inline float min() - { - return std::numeric_limits::min(); - } -}; - -template <> -struct TypeTraits -{ - static inline double min() - { - return std::numeric_limits::min(); - } -}; - -template <> -struct TypeTraits -{ - static inline long double min() - { - return std::numeric_limits::min(); - } -}; - - -} // namespace Spectra - -/// \endcond - -#endif // TYPE_TRAITS_H diff --git a/src/external/Spectra/include/Spectra/contrib/LOBPCGSolver.h b/src/external/Spectra/include/Spectra/contrib/LOBPCGSolver.h deleted file mode 100644 index 5ca001f6..00000000 --- a/src/external/Spectra/include/Spectra/contrib/LOBPCGSolver.h +++ /dev/null @@ -1,501 +0,0 @@ -// Written by Anna Araslanova -// Modified by Yixuan Qiu -// License: MIT - -#ifndef LOBPCG_SOLVER -#define LOBPCG_SOLVER - -#include -#include - -#include -#include -#include -#include -#include - -#include "../SymGEigsSolver.h" - - -namespace Spectra { - - /// - /// \ingroup EigenSolver - /// - - /// *** METHOD - /// The class represent the LOBPCG algorithm, which was invented by Andrew Knyazev - /// Theoretical background of the procedure can be found in the articles below - /// - Knyazev, A.V., 2001. Toward the optimal preconditioned eigensolver : Locally optimal block preconditioned conjugate gradient method.SIAM journal on scientific computing, 23(2), pp.517 - 541. - /// - Knyazev, A.V., Argentati, M.E., Lashuk, I. and Ovtchinnikov, E.E., 2007. Block locally optimal preconditioned eigenvalue xolvers(BLOPEX) in HYPRE and PETSc.SIAM Journal on Scientific Computing, 29(5), pp.2224 - 2239. - /// - /// *** CONDITIONS OF USE - /// Locally Optimal Block Preconditioned Conjugate Gradient(LOBPCG) is a method for finding the M smallest eigenvalues - /// and eigenvectors of a large symmetric positive definite generalized eigenvalue problem - /// \f$Ax=\lambda Bx,\f$ - /// where \f$A_{NxN}\f$ is a symmetric matrix, \f$B\f$ is symmetric and positive - definite. \f$A and B\f$ are also assumed large and sparse - /// \f$\textit{M}\f$ should be \f$\<< textit{N}\f$ (at least \f$\textit{5M} < \textit{N} \f$) - /// - /// *** ARGUMENTS - /// Eigen::SparseMatrix A; // N*N - Ax = lambda*Bx, lrage and sparse - /// Eigen::SparseMatrix X; // N*M - initial approximations to eigenvectors (random in general case) - /// Spectra::LOBPCGSolver solver(A, X); - /// *Eigen::SparseMatrix B; // N*N - Ax = lambda*Bx, sparse, positive definite - /// solver.setConstraints(B); - /// *Eigen::SparseMatrix Y; // N*K - constraints, already found eigenvectors - /// solver.setB(B); - /// *Eigen::SparseMatrix T; // N*N - preconditioner ~ A^-1 - /// solver.setPreconditioner(T); - /// - /// *** OUTCOMES - /// solver.solve(); // compute eigenpairs // void - /// solver.info(); // state of converjance // int - /// solver.residuals(); // get residuals to evaluate biases // Eigen::Matrix - /// solver.eigenvalues(); // get eigenvalues // Eigen::Matrix - /// solver.eigenvectors(); // get eigenvectors // Eigen::Matrix - /// - /// *** EXAMPLE - /// \code{.cpp} - /// #include - /// - /// // random A - /// Matrix a; - /// a = (Matrix::Random(10, 10).array() > 0.6).cast() * Matrix::Random(10, 10).array() * 5; - /// a = Matrix((a).triangularView()) + Matrix((a).triangularView()).transpose(); - /// for (int i = 0; i < 10; i++) - /// a(i, i) = i + 0.5; - /// std::cout << a << "\n"; - /// Eigen::SparseMatrix A(a.sparseView()); - /// // random X - /// Eigen::Matrix x; - /// x = Matrix::Random(10, 2).array(); - /// Eigen::SparseMatrix X(x.sparseView()); - /// // solve Ax = lambda*x - /// Spectra::LOBPCGSolver solver(A, X); - /// solver.compute(10, 1e-4); // 10 iterations, L2_tolerance = 1e-4*N - /// std::cout << "info\n" << solver.info() << std::endl; - /// std::cout << "eigenvalues\n" << solver.eigenvalues() << std::endl; - /// std::cout << "eigenvectors\n" << solver.eigenvectors() << std::endl; - /// std::cout << "residuals\n" << solver.residuals() << std::endl; - /// \endcode - /// - - template < typename Scalar = long double> - class LOBPCGSolver { - private: - - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - - typedef std::complex Complex; - typedef Eigen::Matrix ComplexMatrix; - typedef Eigen::Matrix ComplexVector; - - typedef Eigen::SparseMatrix SparseMatrix; - typedef Eigen::SparseMatrix SparseComplexMatrix; - - const int m_n; // dimension of matrix A - const int m_nev; // number of eigenvalues requested - SparseMatrix A, X; - SparseMatrix m_Y, m_B, m_preconditioner; - bool flag_with_constraints, flag_with_B, flag_with_preconditioner; - - public: - SparseMatrix m_residuals; - Matrix m_evectors; - Vector m_evalues; - int m_info; - - private: - - // B-orthonormalize matrix M - int orthogonalizeInPlace(SparseMatrix &M, SparseMatrix &B, \ - SparseMatrix &true_BM, bool has_true_BM = false) { - - SparseMatrix BM; - - if (has_true_BM == false) { - if (flag_with_B) { BM = B * M; } - else { BM = M; } - } - else { - BM = true_BM; - } - - Eigen::SimplicialLDLT chol_MBM(M.transpose() * BM); - - if (chol_MBM.info() != SUCCESSFUL) { - // LDLT decomposition fail - m_info = chol_MBM.info(); - return chol_MBM.info(); - } - - SparseComplexMatrix Upper_MBM = chol_MBM.matrixU().template cast(); - ComplexVector D_MBM_vec = chol_MBM.vectorD().template cast(); - - D_MBM_vec = D_MBM_vec.cwiseSqrt(); - - for (int i = 0; i < D_MBM_vec.rows(); i++) { - D_MBM_vec(i) = Complex(1.0, 0.0) / D_MBM_vec(i); - } - - SparseComplexMatrix D_MBM_mat(D_MBM_vec.asDiagonal()); - - SparseComplexMatrix U_inv(Upper_MBM.rows(), Upper_MBM.cols()); - U_inv.setIdentity(); - Upper_MBM.template triangularView().solveInPlace(U_inv); - - SparseComplexMatrix right_product = U_inv * D_MBM_mat; - M = M*right_product.real(); - if (flag_with_B) { true_BM = B * M; } - else { true_BM = M; } - - return SUCCESSFUL; - } - - void applyConstraintsInPlace(SparseMatrix &X, SparseMatrix&Y, \ - SparseMatrix&B) { - SparseMatrix BY; - if (flag_with_B) { BY = B * Y; } - else { BY = Y; } - - SparseMatrix YBY = Y.transpose() * BY; - SparseMatrix BYX = BY.transpose() * X; - - SparseMatrix YBY_XYX = (Matrix(YBY).bdcSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(Matrix(BYX))).sparseView(); - X = X - Y * YBY_XYX; - } - - /* - return - 'AB - CD' - */ - Matrix stack_4_matricies(Matrix A, Matrix B, \ - Matrix C, Matrix D) { - Matrix result(A.rows() + C.rows(), A.cols() + B.cols()); - result.topLeftCorner(A.rows(), A.cols()) = A; - result.topRightCorner(B.rows(), B.cols()) = B; - result.bottomLeftCorner(C.rows(), C.cols()) = C; - result.bottomRightCorner(D.rows(), D.cols()) = D; - return result; - } - - Matrix stack_9_matricies(Matrix A, Matrix B, Matrix C, \ - Matrix D, Matrix E, Matrix F, \ - Matrix G, Matrix H, Matrix I) { - - Matrix result(A.rows() + D.rows() + G.rows(), A.cols() + B.cols() + C.cols()); - result.block(0, 0, A.rows(), A.cols()) = A; - result.block(0, A.cols(), B.rows(), B.cols()) = B; - result.block(0, A.cols() + B.cols(), C.rows(), C.cols()) = C; - result.block(A.rows(), 0, D.rows(), D.cols()) = D; - result.block(A.rows(), A.cols(), E.rows(), E.cols()) = E; - result.block(A.rows(), A.cols() + B.cols(), F.rows(), F.cols()) = F; - result.block(A.rows() + D.rows(), 0, G.rows(), G.cols()) = G; - result.block(A.rows() + D.rows(), A.cols(), H.rows(), H.cols()) = H; - result.block(A.rows() + D.rows(), A.cols() + B.cols(), I.rows(), I.cols()) = I; - - return result; - } - - void sort_epairs(Vector &evalues, Matrix &evectors, int SelectionRule) { - - std::function cmp; - if (SelectionRule == SMALLEST_ALGE) - cmp = std::less{}; - else - cmp = std::greater{}; - - std::map epairs(cmp); - for (int i = 0; i < m_evectors.cols(); ++i) - epairs.insert(std::make_pair(evalues(i), evectors.col(i))); - - int i = 0; - for (auto& epair : epairs) { - evectors.col(i) = epair.second; - evalues(i) = epair.first; - i++; - } - } - - void removeColumns(SparseMatrix& matrix, std::vector& colToRemove) - { - // remove columns through matrix multiplication - SparseMatrix new_matrix(matrix.cols(), matrix.cols() - int(colToRemove.size())); - int iCol = 0; - std::vector> tripletList; - tripletList.reserve(matrix.cols() - int(colToRemove.size())); - - for (int iRow = 0; iRow < matrix.cols(); iRow++) { - if (std::find(colToRemove.begin(), colToRemove.end(), iRow) == colToRemove.end()) { - tripletList.push_back(Eigen::Triplet(iRow, iCol, 1)); - iCol++; - } - } - - new_matrix.setFromTriplets(tripletList.begin(), tripletList.end()); - matrix = matrix * new_matrix; - } - - int checkConvergence_getBlocksize(SparseMatrix & m_residuals, Scalar tolerance_L2, std::vector & columnsToDelete) { - // square roots from sum of squares by column - int BlockSize = m_nev; - Scalar sum, buffer; - - for (int iCol = 0; iCol < m_nev; iCol++) { - sum = 0; - for (int iRow = 0; iRow < m_n; iRow++) { - buffer = m_residuals.coeff(iRow, iCol); - sum += buffer * buffer; - } - - if (sqrt(sum) < tolerance_L2) { - BlockSize--; - columnsToDelete.push_back(iCol); - } - } - return BlockSize; - } - - - public: - - LOBPCGSolver(const SparseMatrix& A, const SparseMatrix X) : - m_n(A.rows()), - m_nev(X.cols()), - m_info(NOT_COMPUTED), - flag_with_constraints(false), - flag_with_B(false), - flag_with_preconditioner(false), - A(A), - X(X) - { - if (A.rows() != X.rows() || A.rows() != A.cols()) - throw std::invalid_argument("Wrong size"); - - //if (m_n < 5* m_nev) - // throw std::invalid_argument("The problem size is small compared to the block size. Use standard eigensolver"); - } - - void setConstraints(const SparseMatrix& Y) { - m_Y = Y; - flag_with_constraints = true; - } - - void setB(const SparseMatrix& B) { - if (B.rows() != A.rows() || B.cols() != A.cols()) - throw std::invalid_argument("Wrong size"); - m_B = B; - flag_with_B = true; - } - - void setPreconditioner(const SparseMatrix& preconditioner) { - m_preconditioner = preconditioner; - flag_with_preconditioner = true; - } - - void compute(int maxit = 10, Scalar tol_div_n = 1e-7) { - - Scalar tolerance_L2 = tol_div_n * m_n; - int BlockSize; - int max_iter = std::min(m_n, maxit); - - SparseMatrix directions, AX, AR, BX, AD, ADD, DD, BDD, BD, XAD, RAD, DAD, XBD, RBD, BR, sparse_eVecX, sparse_eVecR, sparse_eVecD, inverse_matrix; - Matrix XAR, RAR, XBR, gramA, gramB, eVecX, eVecR, eVecD; - std::vector columnsToDelete; - - if (flag_with_constraints) { - // Apply the constraints Y to X - applyConstraintsInPlace(X, m_Y, m_B); - } - - // Make initial vectors orthonormal - // implicit BX declaration - if (orthogonalizeInPlace(X, m_B, BX) != SUCCESSFUL) { - max_iter = 0; - } - - AX = A * X; - // Solve the following NxN eigenvalue problem for all N eigenvalues and -vectors: - // first approximation via a dense problem - Eigen::EigenSolver eigs(Matrix(X.transpose() * AX)); - - if (eigs.info() != SUCCESSFUL) { - m_info = eigs.info(); - max_iter = 0; - } - else { - m_evalues = eigs.eigenvalues().real(); - m_evectors = eigs.eigenvectors().real(); - sort_epairs(m_evalues, m_evectors, SMALLEST_ALGE); - sparse_eVecX = m_evectors.sparseView(); - - X = X * sparse_eVecX; - AX = AX * sparse_eVecX; - BX = BX * sparse_eVecX; - } - - - for (int iter_num = 0; iter_num < max_iter; iter_num++) { - m_residuals.resize(m_n, m_nev); - for (int i = 0; i < m_nev; i++) { - m_residuals.col(i) = AX.col(i) - m_evalues(i) * BX.col(i); - } - BlockSize = checkConvergence_getBlocksize(m_residuals, tolerance_L2, columnsToDelete); - - if (BlockSize == 0) { - m_info = SUCCESSFUL; - break; - } - - // substitution of the original active mask - if (columnsToDelete.size() > 0) { - removeColumns(m_residuals, columnsToDelete); - if (iter_num > 0) { - removeColumns(directions, columnsToDelete); - removeColumns(AD, columnsToDelete); - removeColumns(BD, columnsToDelete); - } - columnsToDelete.clear(); // for next iteration - } - - if (flag_with_preconditioner) { - // Apply the preconditioner to the residuals - m_residuals = m_preconditioner * m_residuals; - } - - if (flag_with_constraints) { - // Apply the constraints Y to residuals - applyConstraintsInPlace(m_residuals, m_Y, m_B); - } - - if (orthogonalizeInPlace(m_residuals, m_B, BR) != SUCCESSFUL) { - break; - } - AR = A * m_residuals; - - // Orthonormalize conjugate directions - if (iter_num > 0) { - if (orthogonalizeInPlace(directions, m_B, BD, true) != SUCCESSFUL) { - break; - } - AD = A * directions; - } - - // Perform the Rayleigh Ritz Procedure - XAR = Matrix(X.transpose() * AR); - RAR = Matrix(m_residuals.transpose() * AR); - XBR = Matrix(X.transpose() * BR); - - if (iter_num > 0) { - - XAD = X.transpose() * AD; - RAD = m_residuals.transpose() * AD; - DAD = directions.transpose() * AD; - XBD = X.transpose() * BD; - RBD = m_residuals.transpose() * BD; - - gramA = stack_9_matricies(m_evalues.asDiagonal(), XAR, XAD, XAR.transpose(), RAR, RAD, XAD.transpose(), RAD.transpose(), DAD.transpose()); - gramB = stack_9_matricies(Matrix::Identity(m_nev, m_nev), XBR, XBD, XBR.transpose(), Matrix::Identity(BlockSize, BlockSize), RBD, XBD.transpose(), RBD.transpose(), Matrix::Identity(BlockSize, BlockSize)); - - } - else { - gramA = stack_4_matricies(m_evalues.asDiagonal(), XAR, XAR.transpose(), RAR); - gramB = stack_4_matricies(Matrix::Identity(m_nev, m_nev), XBR, XBR.transpose(), Matrix::Identity(BlockSize, BlockSize)); - } - - //calculate the lowest/largest m eigenpairs; Solve the generalized eigenvalue problem. - DenseSymMatProd Aop(gramA); - DenseCholesky Bop(gramB); - - SymGEigsSolver, \ - DenseCholesky, GEIGS_CHOLESKY> geigs(&Aop, &Bop, m_nev, std::min(10, int(gramA.rows()) - 1)); - - geigs.init(); - int nconv = geigs.compute(); - - //Mat evecs; - if (geigs.info() == SUCCESSFUL) { - m_evalues = geigs.eigenvalues(); - m_evectors = geigs.eigenvectors(); - sort_epairs(m_evalues, m_evectors, SMALLEST_ALGE); - } - else { - // Problem With General EgenVec - m_info = geigs.info(); - break; - } - - // Compute Ritz vectors - if (iter_num > 0) { - eVecX = m_evectors.block(0, 0, m_nev, m_nev); - eVecR = m_evectors.block(m_nev, 0, BlockSize, m_nev); - eVecD = m_evectors.block(m_nev + BlockSize, 0, BlockSize, m_nev); - - sparse_eVecX = eVecX.sparseView(); - sparse_eVecR = eVecR.sparseView(); - sparse_eVecD = eVecD.sparseView(); - - DD = m_residuals * sparse_eVecR; // new conjugate directions - ADD = AR * sparse_eVecR; - BDD = BR * sparse_eVecR; - - DD = DD + directions * sparse_eVecD; - ADD = ADD + AD * sparse_eVecD; - BDD = BDD + BD * sparse_eVecD; - } - else { - eVecX = m_evectors.block(0, 0, m_nev, m_nev); - eVecR = m_evectors.block(m_nev, 0, BlockSize, m_nev); - - sparse_eVecX = eVecX.sparseView(); - sparse_eVecR = eVecR.sparseView(); - - DD = m_residuals * sparse_eVecR; - ADD = AR * sparse_eVecR; - BDD = BR * sparse_eVecR; - } - - X = X * sparse_eVecX + DD; - AX = AX * sparse_eVecX + ADD; - BX = BX * sparse_eVecX + BDD; - - directions = DD; - AD = ADD; - BD = BDD; - - } // iteration loop - - // calculate last residuals - m_residuals.resize(m_n, m_nev); - for (int i = 0; i < m_nev; i++) { - m_residuals.col(i) = AX.col(i) - m_evalues(i) * BX.col(i); - } - BlockSize = checkConvergence_getBlocksize(m_residuals, tolerance_L2, columnsToDelete); - - if (BlockSize == 0) { - m_info = SUCCESSFUL; - } - } // compute - - Vector eigenvalues() { - return m_evalues; - } - - Matrix eigenvectors() { - return m_evectors; - } - - Matrix residuals() { - return Matrix(m_residuals); - } - - int info() { return m_info; } - - }; - - -} // namespace Spectra - -#endif // LOBPCG_SOLVER diff --git a/src/external/Spectra/include/Spectra/contrib/PartialSVDSolver.h b/src/external/Spectra/include/Spectra/contrib/PartialSVDSolver.h deleted file mode 100644 index dad5b400..00000000 --- a/src/external/Spectra/include/Spectra/contrib/PartialSVDSolver.h +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (C) 2018 Yixuan Qiu -// -// This Source Code Form is subject to the terms of the Mozilla -// Public License v. 2.0. If a copy of the MPL was not distributed -// with this file, You can obtain one at https://mozilla.org/MPL/2.0/. - -#ifndef PARTIAL_SVD_SOLVER_H -#define PARTIAL_SVD_SOLVER_H - -#include -#include "../SymEigsSolver.h" - - -namespace Spectra { - - -// Abstract class for matrix operation -template -class SVDMatOp -{ -public: - virtual int rows() const = 0; - virtual int cols() const = 0; - - // y_out = A' * A * x_in or y_out = A * A' * x_in - virtual void perform_op(const Scalar* x_in, Scalar* y_out) = 0; - - virtual ~SVDMatOp() {} -}; - -// Operation of a tall matrix in SVD -// We compute the eigenvalues of A' * A -// MatrixType is either Eigen::Matrix or Eigen::SparseMatrix -template -class SVDTallMatOp: public SVDMatOp -{ -private: - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef const Eigen::Ref ConstGenericMatrix; - - ConstGenericMatrix m_mat; - const int m_dim; - Vector m_cache; - -public: - // Constructor - SVDTallMatOp(ConstGenericMatrix& mat) : - m_mat(mat), - m_dim(std::min(mat.rows(), mat.cols())), - m_cache(mat.rows()) - {} - - // These are the rows and columns of A' * A - int rows() const { return m_dim; } - int cols() const { return m_dim; } - - // y_out = A' * A * x_in - void perform_op(const Scalar* x_in, Scalar* y_out) - { - MapConstVec x(x_in, m_mat.cols()); - MapVec y(y_out, m_mat.cols()); - m_cache.noalias() = m_mat * x; - y.noalias() = m_mat.transpose() * m_cache; - } -}; - -// Operation of a wide matrix in SVD -// We compute the eigenvalues of A * A' -// MatrixType is either Eigen::Matrix or Eigen::SparseMatrix -template -class SVDWideMatOp: public SVDMatOp -{ -private: - typedef Eigen::Matrix Vector; - typedef Eigen::Map MapConstVec; - typedef Eigen::Map MapVec; - typedef const Eigen::Ref ConstGenericMatrix; - - ConstGenericMatrix m_mat; - const int m_dim; - Vector m_cache; - -public: - // Constructor - SVDWideMatOp(ConstGenericMatrix& mat) : - m_mat(mat), - m_dim(std::min(mat.rows(), mat.cols())), - m_cache(mat.cols()) - {} - - // These are the rows and columns of A * A' - int rows() const { return m_dim; } - int cols() const { return m_dim; } - - // y_out = A * A' * x_in - void perform_op(const Scalar* x_in, Scalar* y_out) - { - MapConstVec x(x_in, m_mat.rows()); - MapVec y(y_out, m_mat.rows()); - m_cache.noalias() = m_mat.transpose() * x; - y.noalias() = m_mat * m_cache; - } -}; - -// Partial SVD solver -// MatrixType is either Eigen::Matrix or Eigen::SparseMatrix -template < typename Scalar = double, - typename MatrixType = Eigen::Matrix > -class PartialSVDSolver -{ -private: - typedef Eigen::Matrix Matrix; - typedef Eigen::Matrix Vector; - typedef const Eigen::Ref ConstGenericMatrix; - - ConstGenericMatrix m_mat; - const int m_m; - const int m_n; - SVDMatOp* m_op; - SymEigsSolver< Scalar, LARGEST_ALGE, SVDMatOp >* m_eigs; - int m_nconv; - Matrix m_evecs; - -public: - // Constructor - PartialSVDSolver(ConstGenericMatrix& mat, int ncomp, int ncv) : - m_mat(mat), m_m(mat.rows()), m_n(mat.cols()), m_evecs(0, 0) - { - // Determine the matrix type, tall or wide - if(m_m > m_n) - { - m_op = new SVDTallMatOp(mat); - } else { - m_op = new SVDWideMatOp(mat); - } - - // Solver object - m_eigs = new SymEigsSolver< Scalar, LARGEST_ALGE, SVDMatOp >(m_op, ncomp, ncv); - } - - // Destructor - virtual ~PartialSVDSolver() - { - delete m_eigs; - delete m_op; - } - - // Computation - int compute(int maxit = 1000, Scalar tol = 1e-10) - { - m_eigs->init(); - m_nconv = m_eigs->compute(maxit, tol); - - return m_nconv; - } - - // The converged singular values - Vector singular_values() const - { - Vector svals = m_eigs->eigenvalues().cwiseSqrt(); - - return svals; - } - - // The converged left singular vectors - Matrix matrix_U(int nu) - { - if(m_evecs.cols() < 1) - { - m_evecs = m_eigs->eigenvectors(); - } - nu = std::min(nu, m_nconv); - if(m_m <= m_n) - { - return m_evecs.leftCols(nu); - } - - return m_mat * (m_evecs.leftCols(nu).array().rowwise() / m_eigs->eigenvalues().head(nu).transpose().array().sqrt()).matrix(); - } - - // The converged right singular vectors - Matrix matrix_V(int nv) - { - if(m_evecs.cols() < 1) - { - m_evecs = m_eigs->eigenvectors(); - } - nv = std::min(nv, m_nconv); - if(m_m > m_n) - { - return m_evecs.leftCols(nv); - } - - return m_mat.transpose() * (m_evecs.leftCols(nv).array().rowwise() / m_eigs->eigenvalues().head(nv).transpose().array().sqrt()).matrix(); - } -}; - - -} // namespace Spectra - -#endif // PARTIAL_SVD_SOLVER_H diff --git a/src/external/arpack++/include/README b/src/external/arpack++/include/README deleted file mode 100644 index dc4a33dc..00000000 --- a/src/external/arpack++/include/README +++ /dev/null @@ -1,232 +0,0 @@ -This is the ARPACK++ include directory. - -1) Files included in this directory: - - a) Files that contain ARPACK++ classes definitions: - - i) Base classes: - - file class - ---------- ---------------- - arrseig.h ARrcStdEig - arrgeig.h ARrcGenEig - arseig.h ARStdEig - argeig.h ARGenEig - armat.h ARMatrix - - - ii) Classes that require matrix-vector product functions: - - file class - ---------- ---------------- - arssym.h ARSymStdEig - arsnsym.h ARNonSymStdEig - arscomp.h ARCompStdEig - argsym.h ARSymGenEig - argnsym.h ARNonSymGenEig - argcomp.g ARCompGenEig - - - iii) Classes that require matrices in CSC format (SuperLU version): - - file class - ---------- ---------------- - arlssym.h ARluSymStdEig - arlsnsym.h ARluNonSymStdEig - arlscomp.h ARluCompStdEig - arlgsym.h ARluSymGenEig - arlgnsym.h ARluNonSymGenEig - arlgcomp.h ARluCompGenEig - - - iv) Classes that require matrices in CSC format (UMFPACK version): - - file class - ---------- ---------------- - arussym.h ARluSymStdEig - arusnsym.h ARluNonSymStdEig - aruscomp.h ARluCompStdEig - arugsym.h ARluSymGenEig - arugnsym.h ARluNonSymGenEig - arugcomp.h ARluCompGenEig - - - v) Classes that require matrices in band format: - - file class - ---------- ---------------- - arbssym.h ARluSymStdEig - arbsnsym.h ARluNonSymStdEig - arbscomp.h ARluCompStdEig - arbgsym.h ARluSymGenEig - arbgnsym.h ARluNonSymGenEig - arbgcomp.h ARluCompGenEig - - - vi) Reverse communication classes: - - file class - ---------- ---------------- - arrssym.h ARrcSymStdEig - arrsnsym.h ARrcNonSymStdEig - arrscomp.h ARrcCompStdEig - arrgsym.h ARrcSymGenEig - arrgnsym.h ARrcNonSymGenEig - arrgcomp.h ARrcCompGenEig - - - vii) Matrix classes: - - file class - ---------- ---------------- - arlsmat.h ARluSymMatrix - arlspen.h ARluSymPencil - arlnsmat.h ARluNonSymMatrix - arlnspen.h ARluNonSymPencil - arusmat.h ARumSymMatrix - aruspen.h ARumSymPencil - arunsmat.h ARumNonSymMatrix - arunspen.h ARumNonSymPencil - arbsmat.h ARbdSymMatrix - arbspen.h ARbdSymPencil - arbnsmat.h ARbdNonSymMatrix - arbnspen.h ARbdNonSymPencil - arhbmat.h ARhbMatrix - - - b) Package interface files: - - i) ARPACK FORTRAN interface: - - file Contents - ---------- ----------------------------------------------- - saupp.h Interface with dsaupd and ssaupd subroutines. - seupp.h Interface with dseupd and sseupd subroutines. - naupp.h Interface with dnaupd and snaupd subroutines. - neupp.h Interface with dneupd and sneupd subroutines. - caupp.h Interface with znaupd and cnaupd subroutines. - ceupp.h Interface with zneupd and cneupd subroutines. - debug.h Interface with ARPACK debugging variables. - arpackf.h Fortran to C function prototypes convertion. - - - ii) LAPACK and BLAS1 interface: - - file Contents - ---------- ----------------------------------------------- - lapackc.h Various LAPACK function declarations. - lapackf.h Fortran to C function prototypes convertion. - blas1c.h Various BLAS1 function declarations. - blas1f.h Fortran to C function prototypes convertion. - - - iii) SuperLU interface: - - file Contents - ---------- ----------------------------------------------- - superluc.h Various SuperLU function declarations. - arlspdef.h Altered version of ssp_defs.h, dsp_defs.h, - csp_defs.h and zsp_defs.h header files. - arlsupm.h Unaltered copy of supermatrix.h header file. - arlnames.h Unaltered copy of Cnames.h header file. - arlutil.h Unaltered copy of util.h, superlu_enum_consts.h. - arlcomp.h Unaltered copy of dcomplex.h and scomplex.h. - - - iv) UMFPACK interface: - - file Contents - ---------- ----------------------------------------------- - umfpackc.h Various UMFPACK function declarations. - umfpackf.h Fortran to C function prototypes convertion. - - - c) Other auxiliary files: - - file Contents - ---------- ----------------------------------------------- - arch.h Machine dependent functions and variable types. - arcomp.h "arcomplex" complex type definition. - arerror.h "ArpackError" class definition. - - - -2) Compiler-dependent instructions. - - Some compiler-dependent functions and data types used by arpack++ are - grouped in the file arch.h. This file should be changed to reflect the - characteristics of your system. Another file, arcomp.h, contains the - definition of a class template called arcomplex, created to emulate - the g++ complex class when another compiler is being used. This file - must also be changed if g++ (or CC) is not being used. - - a) Changing ARPACK++ parameters and definitions included in arch.h: - - All ARPACK++ parameters that are not intended to be changed frequently - were included in the arch.h file. Are defined in this file - - i) Some machine and problem-dependent umfpack parameters. - - If the umfpack is to be used, the user can modify some of its - parameters to correctly reflect the environment and the class - of problems being solved. The constants included in arch.h - correspond to a subset of the parameters generated by the um21i - umfpack function. Other relevant parameters can also be passed - to the ARumNonSymMatrix class constructor. - - ii) Some fortran to c conversion functions. - - Because fortran and c++ functions tend to have different - representations in different platforms, a function that - converts a fortran function name to the c++ format is - defined in arch.h. This function can be altered by the user - if the environment being used was not included in arch.h. - - iii) Some fortran to c type conversion rules. - - arch.h also includes the definition of some rules required - to convert INTEGER and LOGICAL FORTRAN types to c++. - - iv) The c++ bool type. - - If the c++ compiler being used does not include a bool type, - this type can also be defined in arch.h. - - - b) Redefining arcomplex class in arcomp.h: - - ARPACK++ uses a self-defined complex class called arcomplex. - Actually, arcomplex is a class template used to represent - both single and double precision complex numbers. It was created - in an effort to permit ARPACK++ to deal with different compilers, - since c++ does not define a unique complex type. - arcomplex is intended to emulate the gnu g++ complex class when - other compilers are being used (when g++ is used, ARPACK++ simply - declares arcomplex to be the standard complex type). arcomp.h - includes a complex class definition for the CC compiler only. At - the present time, no other compiler was used to generate ARPACK++ - programs, so further work must be done to permit the use of the - library with other compilers. - To define a new complex type, the user must create a class - template (called arcomplex) that contains at least three members: - - i) A default constructor; - ii) A copy constructor; and - iii) A constructor that takes two real numbers as parameters (one - is the real and other the imaginary part of the complex number). - - Naturally, all usual mathematical operations on complex numbers, - such as addition, multiplication, multiplication by a real number, - etc, should also be defined. But because most compilers include a - complex data type, the simplest way of defining arcomplex is to use - only the three constructors mentioned above to establish a relation - between the actual complex class and the gnu g++ standard. - - -5) ARPACK (fortran) authors: - - Danny Sorensen (sorensen@caam.rice.edu) - Richard Lehoucq (lehoucq@mcs.anl.gov) - Chao Yang (chao@caam.rice.edu) - Kristi Maschhoff (kristyn@caam.rice.edu) - diff --git a/src/external/arpack++/include/arbgcomp.h b/src/external/arpack++/include/arbgcomp.h deleted file mode 100644 index 93f68228..00000000 --- a/src/external/arpack++/include/arbgcomp.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARBGComp.h. - Arpack++ class ARluCompGenEig definition - (band matrix version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARBGCOMP_H -#define ARBGCOMP_H - -#include -#include -#include "arch.h" -#include "arbnsmat.h" -#include "arbnspen.h" -#include "arrseig.h" -#include "argcomp.h" - - -template -class ARluCompGenEig: - public virtual - ARCompGenEig, ARFLOAT >, - ARbdNonSymPencil, ARFLOAT > > { - - private: - - // a) Data structure used to store matrices. - - ARbdNonSymPencil, ARFLOAT > Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluCompGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(arcomplex sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(arcomplex sigmap); - - // c.2) Constructors and destructor. - - ARluCompGenEig() { } - // Short constructor. - - ARluCompGenEig(int nevp, ARbdNonSymMatrix, ARFLOAT>& A, - ARbdNonSymMatrix, ARFLOAT>& B, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluCompGenEig(int nevp, ARbdNonSymMatrix, ARFLOAT>& A, - ARbdNonSymMatrix, ARFLOAT>& B, - arcomplex sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluCompGenEig(const ARluCompGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluCompGenEig() { } - - // d) Operators. - - ARluCompGenEig& operator=(const ARluCompGenEig& other); - // Assignment operator. - -}; // class ARluCompGenEig. - - -// ------------------------------------------------------------------------ // -// ARluCompGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluCompGenEig:: -Copy(const ARluCompGenEig& other) -{ - - ARCompGenEig, ARFLOAT >, - ARbdNonSymPencil, ARFLOAT> >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - -} // Copy. - - -template -inline void ARluCompGenEig:: -ChangeShift(arcomplex sigmaRp) -{ - - this->objOP->FactorAsB(sigmaRp); - ARrcStdEig >::ChangeShift(sigmaRp); - -} // ChangeShift. - - -template -inline void ARluCompGenEig::SetRegularMode() -{ - - ARStdEig, - ARbdNonSymPencil, ARFLOAT> >:: - SetRegularMode(&Pencil, - &ARbdNonSymPencil, ARFLOAT>::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluCompGenEig:: -SetShiftInvertMode(arcomplex sigmap) -{ - - ARCompGenEig, ARFLOAT>, - ARbdNonSymPencil, ARFLOAT> >:: - SetShiftInvertMode(sigmap, &Pencil, - &ARbdNonSymPencil,ARFLOAT>::MultInvAsBv); - -} // SetShiftInvertMode. - - -template -inline ARluCompGenEig:: -ARluCompGenEig(int nevp, ARbdNonSymMatrix, ARFLOAT>& A, - ARbdNonSymMatrix, ARFLOAT>& B, const std::string& whichp, - int ncvp, ARFLOAT tolp, int maxitp, - arcomplex* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARbdNonSymPencil, ARFLOAT>::MultInvBAv, - &Pencil, - &ARbdNonSymPencil, ARFLOAT>::MultBv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluCompGenEig:: -ARluCompGenEig(int nevp, ARbdNonSymMatrix, ARFLOAT>& A, - ARbdNonSymMatrix, ARFLOAT>& B, - arcomplex sigmap, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, arcomplex* residp, - bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARbdNonSymPencil, ARFLOAT>::MultInvAsBv, - &Pencil, - &ARbdNonSymPencil,ARFLOAT>::MultBv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - SetShiftInvertMode(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluCompGenEig& ARluCompGenEig:: -operator=(const ARluCompGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARBGCOMP_H diff --git a/src/external/arpack++/include/arbgnsym.h b/src/external/arpack++/include/arbgnsym.h deleted file mode 100644 index 19a14130..00000000 --- a/src/external/arpack++/include/arbgnsym.h +++ /dev/null @@ -1,243 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARBGNSym.h. - Arpack++ class ARluNonSymGenEig definition - (band matrix version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARBGNSYM_H -#define ARBGNSYM_H - -#include -#include -#include "arch.h" -#include "arbnsmat.h" -#include "arbnspen.h" -#include "argnsym.h" - - -template -class ARluNonSymGenEig: - public virtual ARNonSymGenEig, - ARbdNonSymPencil > { - - private: - - // a) Data structure used to store matrices. - - ARbdNonSymPencil Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluNonSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp = 0.0); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - virtual void SetComplexShiftMode(char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp); - - // c.2) Constructors and destructor. - - ARluNonSymGenEig() { } - // Short constructor. - - ARluNonSymGenEig(int nevp, ARbdNonSymMatrix& A, - ARbdNonSymMatrix& B, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluNonSymGenEig(int nevp, ARbdNonSymMatrix& A, - ARbdNonSymMatrix& B, ARFLOAT sigma, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (real shift and invert mode). - - ARluNonSymGenEig(int nevp, ARbdNonSymMatrix& A, - ARbdNonSymMatrix& B, char partp, - ARFLOAT sigmaRp, ARFLOAT sigmaIp, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (complex shift and invert mode). - - ARluNonSymGenEig(const ARluNonSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluNonSymGenEig() { } - // Destructor. - - // d) Operators. - - ARluNonSymGenEig& operator=(const ARluNonSymGenEig& other); - // Assignment operator. - -}; // class ARluNonSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARluNonSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluNonSymGenEig:: -Copy(const ARluNonSymGenEig& other) -{ - - ARNonSymGenEig, - ARbdNonSymPencil >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - this->objA = &Pencil; - -} // Copy. - - -template -inline void ARluNonSymGenEig:: -ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp) -{ - - if (sigmaIp == 0.0) { - this->objOP->FactorAsB(sigmaRp); - } - else { - this->objOP->FactorAsB(sigmaRp, sigmaIp, this->part); - } - ARrcNonSymGenEig::ChangeShift(sigmaRp, sigmaIp); - -} // ChangeShift. - - -template -inline void ARluNonSymGenEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(&Pencil, &ARbdNonSymPencil::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluNonSymGenEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARNonSymGenEig, - ARbdNonSymPencil >:: - SetShiftInvertMode(sigmap, &Pencil, - &ARbdNonSymPencil::MultInvAsBv); - -} // SetShiftInvertMode. - - -template -inline void ARluNonSymGenEig:: -SetComplexShiftMode(char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp) -{ - - ARNonSymGenEig, - ARbdNonSymPencil >:: - SetComplexShiftMode(partp, sigmaRp, sigmaIp, &Pencil, - &ARbdNonSymPencil::MultInvAsBv, - &Pencil, &ARbdNonSymPencil::MultAv); - -} // SetComplexShiftMode. - - -template -inline ARluNonSymGenEig:: -ARluNonSymGenEig(int nevp, ARbdNonSymMatrix& A, - ARbdNonSymMatrix& B, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARbdNonSymPencil::MultInvBAv, &Pencil, - &ARbdNonSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluNonSymGenEig:: -ARluNonSymGenEig(int nevp, ARbdNonSymMatrix& A, - ARbdNonSymMatrix& B, ARFLOAT sigmap, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARbdNonSymPencil::MultInvAsBv, &Pencil, - &ARbdNonSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - SetShiftInvertMode(sigmap); - -} // Long constructor (real shift and invert mode). - - -template -inline ARluNonSymGenEig:: -ARluNonSymGenEig(int nevp, ARbdNonSymMatrix& A, - ARbdNonSymMatrix& B, char partp, - ARFLOAT sigmaRp, ARFLOAT sigmaIp, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARbdNonSymPencil::MultInvAsBv, &Pencil, - &ARbdNonSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - SetComplexShiftMode(partp, sigmaRp, sigmaIp); - -} // Long constructor (complex shift and invert mode). - - -template -ARluNonSymGenEig& ARluNonSymGenEig:: -operator=(const ARluNonSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARBGNSYM_H diff --git a/src/external/arpack++/include/arbgsym.h b/src/external/arpack++/include/arbgsym.h deleted file mode 100644 index 82926bca..00000000 --- a/src/external/arpack++/include/arbgsym.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARBGSym.h. - Arpack++ class ARluSymGenEig definition - (band matrix version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARBGSYM_H -#define ARBGSYM_H - -#include -#include -#include "arch.h" -#include "arbsmat.h" -#include "arbspen.h" -#include "argsym.h" - - -template -class ARluSymGenEig: - public virtual ARSymGenEig, - ARbdSymPencil > { - - private: - - // a) Data structure used to store matrices. - - ARbdSymPencil Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmap); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - virtual void SetBucklingMode(ARFLOAT sigmap); - - virtual void SetCayleyMode(ARFLOAT sigmap); - - // c.2) Constructors and destructor. - - ARluSymGenEig() { } - // Short constructor. - - ARluSymGenEig(int nevp, ARbdSymMatrix& A, - ARbdSymMatrix& B, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluSymGenEig(char InvertModep, int nevp, ARbdSymMatrix& A, - ARbdSymMatrix& B, ARFLOAT sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert, buckling and Cayley modes). - - ARluSymGenEig(const ARluSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluSymGenEig() { } - // Destructor. - - // d) Operators. - - ARluSymGenEig& operator=(const ARluSymGenEig& other); - // Assignment operator. - -}; // class ARluSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARluSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluSymGenEig:: -Copy(const ARluSymGenEig& other) -{ - - ARSymGenEig, - ARbdSymPencil >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - this->objA = &Pencil; - -} // Copy. - - -template -inline void ARluSymGenEig::ChangeShift(ARFLOAT sigmap) -{ - - this->objOP->FactorAsB(sigmap); - ARrcSymGenEig::ChangeShift(sigmap); - -} // ChangeShift. - - -template -inline void ARluSymGenEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(&Pencil, &ARbdSymPencil::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluSymGenEig:: -SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARbdSymPencil >:: - SetShiftInvertMode(sigmap, &Pencil, &ARbdSymPencil::MultInvAsBv); - this->ChangeMultBx(&Pencil, &ARbdSymPencil::MultBv); - -} // SetShiftInvertMode. - - -template -inline void ARluSymGenEig:: -SetBucklingMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARbdSymPencil >:: - SetBucklingMode(sigmap, &Pencil, &ARbdSymPencil::MultInvAsBv); - this->ChangeMultBx(&Pencil, &ARbdSymPencil::MultAv); - -} // SetBucklingMode. - - -template -inline void ARluSymGenEig:: -SetCayleyMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARbdSymPencil >:: - SetCayleyMode(sigmap, &Pencil, &ARbdSymPencil::MultInvAsBv, - &Pencil, &ARbdSymPencil::MultAv); - this->ChangeMultBx(&Pencil, &ARbdSymPencil::MultBv); - -} // SetCayleyMode. - - -template -inline ARluSymGenEig:: -ARluSymGenEig(int nevp, ARbdSymMatrix& A, - ARbdSymMatrix& B, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->InvertMode = 'S'; - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARbdSymPencil::MultInvBAv, &Pencil, - &ARbdSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluSymGenEig:: -ARluSymGenEig(char InvertModep, int nevp, ARbdSymMatrix& A, - ARbdSymMatrix& B, ARFLOAT sigmap, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARbdSymPencil::MultInvAsBv, &Pencil, - &ARbdSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - this->InvertMode = this->CheckInvertMode(InvertModep); - switch (this->InvertMode) { - case 'B': - this->ChangeMultBx(&Pencil, &ARbdSymPencil::MultAv); - case 'S': - ChangeShift(sigmap); - break; - case 'C': - SetCayleyMode(sigmap); - } - -} // Long constructor (shift and invert, buckling and Cayley modes). - - -template -ARluSymGenEig& ARluSymGenEig:: -operator=(const ARluSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARBGSYM_H diff --git a/src/external/arpack++/include/arbnsmat.h b/src/external/arpack++/include/arbnsmat.h deleted file mode 100644 index f56069f7..00000000 --- a/src/external/arpack++/include/arbnsmat.h +++ /dev/null @@ -1,431 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARBNSMat.h. - Arpack++ class ARbdNonSymMatrix definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - - -#include "arbnspen.h" - -#ifndef ARBNSMAT_H -#define ARBNSMAT_H - -#include -#include "arch.h" -#include "armat.h" -#include "arerror.h" -#include "blas1c.h" -#include "lapackc.h" - -template class ARbdNonSymPencil; - -template -class ARbdNonSymMatrix: public ARMatrix { - - friend class ARbdNonSymPencil; - friend class ARbdNonSymPencil; - - protected: - - bool factored; - int ndiagL; - int ndiagU; - int lda; - int info; - int* ipiv; - ARTYPE* A; - ARTYPE* Ainv; - - void ClearMem(); - - virtual void Copy(const ARbdNonSymMatrix& other); - - void ExpandA(); - - void SubtractAsI(ARTYPE sigma); - - void CreateStructure(); - - void ThrowError(); - - public: - - bool IsFactored() { return factored; } - - void FactorA(); - - void FactorAsI(ARTYPE sigma); - - void MultMv(ARTYPE* v, ARTYPE* w); - - void MultMtv(ARTYPE* v, ARTYPE* w); - - void MultMtMv(ARTYPE* v, ARTYPE* w); - - void MultMMtv(ARTYPE* v, ARTYPE* w); - - void Mult0MMt0v(ARTYPE* v, ARTYPE* w); - - void MultInvv(ARTYPE* v, ARTYPE* w); - - void DefineMatrix(int np, int ndiagLp, int ndiagUp, ARTYPE* Ap); - - ARbdNonSymMatrix(): ARMatrix() { factored = false; } - // Short constructor that does nothing. - - ARbdNonSymMatrix(int np, int ndiagLp, int ndiagUp, ARTYPE* Ap); - // Long constructor. - - ARbdNonSymMatrix(const ARbdNonSymMatrix& other) { Copy(other); } - // Copy constructor. - - virtual ~ARbdNonSymMatrix() { ClearMem(); } - // Destructor. - - ARbdNonSymMatrix& operator=(const ARbdNonSymMatrix& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARbdNonSymMatrix member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARbdNonSymMatrix::ClearMem() -{ - - if (factored) { - delete[] Ainv; - delete[] ipiv; - Ainv = NULL; - ipiv = NULL; - } - -} // ClearMem. - - -template -inline void ARbdNonSymMatrix:: -Copy(const ARbdNonSymMatrix& other) -{ - - // Copying very fundamental variables and user-defined parameters. - - this->m = other.m; - this->n = other.n; - this->defined = other.defined; - factored = other.factored; - ndiagL = other.ndiagL; - ndiagU = other.ndiagU; - lda = other.lda; - info = other.info; - A = other.A; - - // Returning from here if "other" was not factored. - - if (!factored) return; - - // Copying vectors. - - Ainv = new ARTYPE[ this->n*lda]; - ipiv = new int[ this->n]; - - copy( this->n*lda, other.Ainv, 1, Ainv, 1); - for (int i=0; i< this->n; i++) ipiv[i] = other.ipiv[i]; - -} // Copy. - - -template -void ARbdNonSymMatrix::ExpandA() -{ - - int i, inca; - - // Copying A to Ainv. - - inca = ndiagL+ndiagU+1; - for (i = 0; i < inca; i++) { - copy( this->n, &A[i], inca, &Ainv[ndiagL+i], lda); - } - -} // ExpandA. - - -template -void ARbdNonSymMatrix::SubtractAsI(ARTYPE sigma) -{ - - // Copying A to Ainv. - - ExpandA(); - - // Subtracting sigma from diagonal elements. - - for (int i=(ndiagL+ndiagU); i<(lda* this->n); i+=lda) Ainv[i] -= sigma; - -} // SubtractAsI. - - -template -inline void ARbdNonSymMatrix::CreateStructure() -{ - - ClearMem(); - Ainv = new ARTYPE[lda* this->n]; - ipiv = new int[ this->n]; - -} // CreateStructure. - - -template -inline void ARbdNonSymMatrix::ThrowError() -{ - - if (info < 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARbdNonSymMatrix::FactorA"); - } - else if (info) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARbdNonSymMatrix::FactorA"); - } - -} // ThrowError. - - -template -void ARbdNonSymMatrix::FactorA() -{ - - // Quitting the function if A was not defined. - - if (! this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARbdNonSymMatrix::FactorA"); - } - - // Reserving memory for some vectors used in matrix decomposition. - - CreateStructure(); - - // Copying A to Ainv; - - ExpandA(); - - // Decomposing A. - - gbtrf( this->n, this->n, ndiagL, ndiagU, Ainv, lda, ipiv, info); - - // Handling errors. - - ThrowError(); - - factored = true; - -} // FactorA. - - -template -void ARbdNonSymMatrix::FactorAsI(ARTYPE sigma) -{ - - // Quitting the function if A was not defined. - - if (! this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARbdNonSymMatrix::FactorAsI"); - } - - // Reserving memory for some vectors used in matrix decomposition. - - CreateStructure(); - - // Subtracting sigma*I from A. - - SubtractAsI(sigma); - - // Decomposing AsI. - - gbtrf( this->n, this->n, ndiagL, ndiagU, Ainv, lda, ipiv, info); - - // Handling errors. - - ThrowError(); - - factored = true; - -} // FactorAsI. - - -template -void ARbdNonSymMatrix::MultMv(ARTYPE* v, ARTYPE* w) -{ - - ARTYPE one; - ARTYPE zero; - - one = (ARTYPE)0 + 1.0; - zero = (ARTYPE)0; - - // Quitting the function if A was not defined. - - if (! this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARbdNonSymMatrix::MultMv"); - } - - // Determining w = M.v. - - gbmv("N", this->m, this->n, ndiagL, ndiagU, one, A, - ndiagL+ndiagU+1, v, 1, zero, w, 1); - -} // MultMv. - - -template -void ARbdNonSymMatrix::MultMtv(ARTYPE* v, ARTYPE* w) -{ - - ARTYPE one; - ARTYPE zero; - - one = (ARTYPE)0 + 1.0; - zero = (ARTYPE)0; - - // Quitting the function if A was not defined. - - if (! this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARbdNonSymMatrix::MultMtv"); - } - - // Determining w = M'.v. - - gbmv("T", this->m, this->n, ndiagL, ndiagU, one, A, - ndiagL+ndiagU+1, v, 1, zero, w, 1); - -} // MultMtv. - - -template -void ARbdNonSymMatrix::MultMtMv(ARTYPE* v, ARTYPE* w) -{ - - ARTYPE* t = new ARTYPE[ this->m]; - - MultMv(v,t); - MultMtv(t,w); - - delete[] t; - -} // MultMtMv. - - -template -void ARbdNonSymMatrix::MultMMtv(ARTYPE* v, ARTYPE* w) -{ - - ARTYPE* t = new ARTYPE[ this->n]; - - MultMtv(v,t); - MultMv(t,w); - - delete[] t; - -} // MultMMtv. - - -template -void ARbdNonSymMatrix::Mult0MMt0v(ARTYPE* v, ARTYPE* w) -{ - - MultMv(&v[ this->m],w); - MultMtv(v,&w[ this->m]); - -} // Mult0MMt0v. - - -template -void ARbdNonSymMatrix::MultInvv(ARTYPE* v, ARTYPE* w) -{ - - // Quitting the function if A (or AsI) was not factored. - - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARbdNonSymMatrix::MultInvv"); - } - - // Overwritting w with v. - - copy( this->n, v, 1, w, 1); - - // Solving A.w = v (or AsI.w = v). - - gbtrs("N", this->n, ndiagL, ndiagU, 1, Ainv, lda, ipiv, w, this->m, info); - - // Handling errors. - - ThrowError(); - -} // MultInvv. - - -template -inline void ARbdNonSymMatrix:: -DefineMatrix(int np, int ndiagLp, int ndiagUp, ARTYPE* Ap) -{ - - // Defining member variables. - - this->m = np; - this->n = np; - ndiagL = ndiagLp; - ndiagU = ndiagUp; - lda = 2*ndiagL+ndiagU+1; - A = Ap; - this->defined = true; - Ainv = NULL; - ipiv = NULL; - info = 0; - -} // DefineMatrix. - - -template -inline ARbdNonSymMatrix:: -ARbdNonSymMatrix(int np, int ndiagLp, - int ndiagUp, ARTYPE* Ap) : ARMatrix(np) -{ - - factored = false; - DefineMatrix(np, ndiagLp, ndiagUp, Ap); - -} // Long constructor. - - -template -ARbdNonSymMatrix& ARbdNonSymMatrix:: -operator=(const ARbdNonSymMatrix& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARBNSMAT_H diff --git a/src/external/arpack++/include/arbnspen.h b/src/external/arpack++/include/arbnspen.h deleted file mode 100644 index 2284ffa3..00000000 --- a/src/external/arpack++/include/arbnspen.h +++ /dev/null @@ -1,470 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARBNSPen.h. - Arpack++ class ARbdNonSymPencil definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARBNSPEN_H -#define ARBNSPEN_H - -#include "arch.h" -#include "arerror.h" -#include "blas1c.h" -#include "lapackc.h" -#include "arbnsmat.h" - - -template -class ARbdNonSymPencil -{ - - protected: - - char part; - ARbdNonSymMatrix* A; - ARbdNonSymMatrix* B; - ARbdNonSymMatrix AsB; -#ifdef ARCOMP_H - ARbdNonSymMatrix, ARFLOAT> AsBc; -#endif - - int max(int a, int b) { return (a>b)?a:b; } - - int min(int a, int b) { return (a dy[], int incy); - - void ComplexAxpy(int n, arcomplex da, ARTYPE dx[], - int incx, arcomplex dy[], int incy); - - virtual void Copy(const ARbdNonSymPencil& other); - - void SubtractAsB(ARTYPE sigma); - -#ifdef ARCOMP_H - void SubtractAsB(ARFLOAT sigmaR, ARFLOAT sigmaI); -#endif - - public: - -#ifdef ARCOMP_H - bool IsFactored() { return (AsB.IsFactored()||AsBc.IsFactored()); } -#else - bool IsFactored() { return AsB.IsFactored(); } -#endif - - void FactorAsB(ARTYPE sigma); - -#ifdef ARCOMP_H - void FactorAsB(ARFLOAT sigmaR, ARFLOAT sigmaI, char partp = 'R'); -#endif - - void MultAv(ARTYPE* v, ARTYPE* w) { A->MultMv(v,w); } - - void MultBv(ARTYPE* v, ARTYPE* w) { B->MultMv(v,w); } - - void MultInvBAv(ARTYPE* v, ARTYPE* w); - -#ifdef ARCOMP_H - void MultInvAsBv(arcomplex* v, arcomplex* w); -#endif - - void MultInvAsBv(ARFLOAT* v, ARFLOAT* w); - - void DefineMatrices(ARbdNonSymMatrix& Ap, - ARbdNonSymMatrix& Bp); - - ARbdNonSymPencil() { part = 'N'; } - // Short constructor that does nothing. - - ARbdNonSymPencil(ARbdNonSymMatrix& Ap, - ARbdNonSymMatrix& Bp); - // Long constructor. - - ARbdNonSymPencil(const ARbdNonSymPencil& other) { Copy(other); } - // Copy constructor. - - virtual ~ARbdNonSymPencil() { } - // Destructor. - - ARbdNonSymPencil& operator=(const ARbdNonSymPencil& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARbdNonSymPencil member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARbdNonSymPencil:: -Copy(const ARbdNonSymPencil& other) -{ - - part = other.part; - A = other.A; - B = other.B; - AsB = other.AsB; -#ifdef ARCOMP_H - AsBc = other.AsBc; -#endif - -} // Copy. - - -template -void ARbdNonSymPencil:: -ComplexCopy(int n, ARFLOAT dx[], int incx, arcomplex dy[], int incy) -{ - - for (int ix=0, iy=0; ix<(n*incx); ix+=incx, iy+=incy) { - dy[iy] = arcomplex(dx[ix], 0.0); - } - -} // ComplexCopy. - - -template -void ARbdNonSymPencil:: -ComplexAxpy(int n, arcomplex da, ARTYPE dx[], int incx, - arcomplex dy[], int incy) -{ - - for (int ix=0, iy=0; ix<(n*incx); ix+=incx, iy+=incy) { - dy[iy] += da*dx[ix]; - } - -} // ComplexAxpy. - - -template -void ARbdNonSymPencil::SubtractAsB(ARTYPE sigma) -{ - - int i, inca, incb, minL, minU, begB, begAsB; - ARTYPE negsig; - - inca = A->ndiagL+A->ndiagU+1; - incb = B->ndiagL+B->ndiagU+1; - negsig = -sigma; - - // Expanding A. - - begAsB = AsB.ndiagL+AsB.ndiagU-A->ndiagU; - for (i = 0; i < inca; i++) { - copy(AsB.n, &A->A[i], inca, &AsB.Ainv[begAsB+i], AsB.lda); - } - - // Transferring part of B (*(-sigma)) if AsB.ndiagU > A->ndiagU. - - if (A->ndiagU < AsB.ndiagU) { - for (i = 0; i < AsB.ndiagU-A->ndiagU; i++) { - copy(AsB.n, &B->A[i], incb, &AsB.Ainv[AsB.ndiagL+i], AsB.lda); - scal(AsB.n, negsig, &AsB.Ainv[AsB.ndiagL+i], AsB.lda); - } - } - - // Subtracting sigma*B from A. - - minL = min(A->ndiagL, B->ndiagL); - minU = min(A->ndiagU, B->ndiagU); - begB = B->ndiagU-minU; - begAsB = AsB.ndiagL+AsB.ndiagU-minU; - - for (i = 0; i < minL+minU+1; i++) { - axpy(AsB.n, -sigma, &B->A[begB+i], incb, &AsB.Ainv[begAsB+i], AsB.lda); - } - - // Transferring part of B (*(-sigma)) if AsB.ndiagL > A->ndiagL. - - if (A->ndiagL < AsB.ndiagL) { - begB = B->ndiagU+1+minL; - begAsB = AsB.ndiagL+AsB.ndiagU+1+minL; - for (i = 0; i < AsB.ndiagL-A->ndiagL; i++) { - copy(AsB.n, &B->A[begB+i], incb, &AsB.Ainv[begAsB+i], AsB.lda); - scal(AsB.n, negsig, &AsB.Ainv[begAsB+i], AsB.lda); - } - } - -} // SubtractAsB (ARTYPE shift). - - -#ifdef ARCOMP_H -template -void ARbdNonSymPencil:: -SubtractAsB(ARFLOAT sigmaR, ARFLOAT sigmaI) -{ - - int i, inca, incb, minL, minU, begB, begAsB; - arcomplex sigma; - - inca = A->ndiagL+A->ndiagU+1; - incb = B->ndiagL+B->ndiagU+1; - sigma = arcomplex(sigmaR, sigmaI); - - // Expanding A. - - begAsB = AsBc.ndiagL+AsBc.ndiagU-A->ndiagU; - for (i = 0; i < inca; i++) { - ComplexCopy(AsBc.n,(ARFLOAT*)(&A->A[i]),inca,&AsBc.Ainv[begAsB+i],AsBc.lda); - } - - // Transferring part of B (*(-sigma)) if AsBc.ndiagU > A->ndiagU. - - if (A->ndiagU < AsBc.ndiagU) { - for (i = 0; i < AsBc.ndiagU-A->ndiagU; i++) { - ComplexCopy(AsBc.n, (ARFLOAT*)(&B->A[i]), incb, - &AsBc.Ainv[AsBc.ndiagL+i], AsBc.lda); - scal(AsBc.n, -sigma, &AsBc.Ainv[AsBc.ndiagL+i], AsBc.lda); - } - } - - // Subtracting sigma*B from A. - - minL = min(A->ndiagL, B->ndiagL); - minU = min(A->ndiagU, B->ndiagU); - begB = B->ndiagU-minU; - begAsB = AsBc.ndiagL+AsBc.ndiagU-minU; - - for (i = 0; i < minL+minU+1; i++) { - ComplexAxpy(AsBc.n, -sigma, &B->A[begB+i], incb, - &AsBc.Ainv[begAsB+i], AsBc.lda); - } - - // Transferring part of B (*(-sigma)) if AsBc.ndiagL > A->ndiagL. - - if (A->ndiagL < AsBc.ndiagL) { - begB = B->ndiagU+1+minL; - begAsB = AsBc.ndiagL+AsBc.ndiagU+1+minL; - for (i = 0; i < AsBc.ndiagL-A->ndiagL; i++) { - ComplexCopy(AsBc.n, (ARFLOAT*)(&B->A[begB+i]), incb, - &AsBc.Ainv[begAsB+i], AsBc.lda); - scal(AsBc.n, -sigma, &AsBc.Ainv[begAsB+i], AsBc.lda); - } - } - -} // SubtractAsB (arcomplex shift). -#endif // ARCOMP_H - - -template -void ARbdNonSymPencil::FactorAsB(ARTYPE sigma) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARbdNonSymPencil::FactorAsB"); - } - - // Quitting the function if A and B are not square. - - if ((A->nrows() != A->ncols()) || (B->nrows() != B->ncols())) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARbdNonSymPencil::FactorAsB"); - } - - // Copying A to AsB if sigma = 0. - - if (sigma == (ARTYPE)0) { - - AsB = *A; - if (!AsB.IsFactored()) AsB.FactorA(); - return; - - } - - // Defining matrix AsB. - - if (!AsB.IsDefined()) { - AsB.DefineMatrix(A->ncols(), max(A->ndiagL, B->ndiagL), - max(A->ndiagU, B->ndiagU), A->A); - } - - // Reserving memory for some vectors used in matrix decomposition. - - AsB.CreateStructure(); - - // Subtracting sigma*B from A and storing the result on AsB. - - SubtractAsB(sigma); - - // Decomposing AsB. - - gbtrf(AsB.n, AsB.n, AsB.ndiagL, AsB.ndiagU, - AsB.Ainv, AsB.lda, AsB.ipiv, AsB.info); - - // Handling errors. - - AsB.ThrowError(); - - AsB.factored = true; - -} // FactorAsB (ARTYPE shift). - - -#ifdef ARCOMP_H -template -void ARbdNonSymPencil:: -FactorAsB(ARFLOAT sigmaR, ARFLOAT sigmaI, char partp) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARbdNonSymPencil::FactorAsB"); - } - - // Quitting the function if A and B are not square. - - if ((A->nrows() != A->ncols()) || (B->nrows() != B->ncols())) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARbdNonSymPencil::FactorAsB"); - } - - // Defining matrix AsBc. - - if (!AsBc.IsDefined()) { - part = partp; - AsBc.DefineMatrix(A->ncols(), max(A->ndiagL,B->ndiagL), - max(A->ndiagU,B->ndiagU), 0); - } - - // Reserving memory for some vectors used in matrix decomposition. - - AsBc.CreateStructure(); - - // Subtracting sigma*B from A and storing the result on AsBc. - - SubtractAsB(sigmaR, sigmaI); - - // Decomposing AsBc. - - gbtrf(AsBc.n, AsBc.n, AsBc.ndiagL, AsBc.ndiagU, - AsBc.Ainv, AsBc.lda, AsBc.ipiv, AsBc.info); - - // Handling errors. - - AsBc.ThrowError(); - - AsBc.factored = true; - -} // FactorAsB (arcomplex shift). -#endif // ARCOMP_H. - - -template -void ARbdNonSymPencil::MultInvBAv(ARTYPE* v, ARTYPE* w) -{ - - if (!B->IsFactored()) B->FactorA(); - - A->MultMv(v, w); - B->MultInvv(w, w); - -} // MultInvBAv. - - -#ifdef ARCOMP_H -template -void ARbdNonSymPencil:: -MultInvAsBv(arcomplex* v, arcomplex* w) -{ - - AsB.MultInvv((ARTYPE*)v, (ARTYPE*)w); - -} // MultInvAsBv (arcomplex). -#endif // ARCOMP_H. - - -template -void ARbdNonSymPencil::MultInvAsBv(ARFLOAT* v, ARFLOAT* w) -{ - - if (part == 'N') { // shift is real. - - AsB.MultInvv((ARTYPE*)v, (ARTYPE*)w); - - } - else { // shift is complex. - -#ifdef ARCOMP_H - - int i; - arcomplex *tv, *tw; - - tv = new arcomplex[AsBc.ncols()]; - tw = new arcomplex[AsBc.ncols()]; - - for (i=0; i!=AsBc.ncols(); i++) tv[i] = arcomplex(v[i], 0.0); - - AsBc.MultInvv(tv, tw); - - if (part=='I') { - for (i=0; i!=AsBc.ncols(); i++) w[i] = imag(tw[i]); - } - else { - for (i=0; i!=AsBc.ncols(); i++) w[i] = real(tw[i]); - } - - delete[] tv; - delete[] tw; - -#endif // ARCOMP_H. - - } - -} // MultInvAsBv (ARFLOAT). - - -template -inline void ARbdNonSymPencil:: -DefineMatrices(ARbdNonSymMatrix& Ap, - ARbdNonSymMatrix& Bp) -{ - - A = &Ap; - B = &Bp; - -} // DefineMatrices. - - -template -inline ARbdNonSymPencil:: -ARbdNonSymPencil(ARbdNonSymMatrix& Ap, - ARbdNonSymMatrix& Bp) -{ - - DefineMatrices(Ap, Bp); - -} // Long constructor. - - -template -ARbdNonSymPencil& ARbdNonSymPencil:: -operator=(const ARbdNonSymPencil& other) -{ - - if (this != &other) { // Stroustrup suggestion. - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARBNSPEN_H diff --git a/src/external/arpack++/include/arbscomp.h b/src/external/arpack++/include/arbscomp.h deleted file mode 100644 index 334cd3a6..00000000 --- a/src/external/arpack++/include/arbscomp.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARBSComp.h. - Arpack++ class ARluCompStdEig definition - (band matrix version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARBSCOMP_H -#define ARBSCOMP_H - -#include -#include -#include "arch.h" -#include "arscomp.h" -#include "arbnsmat.h" -#include "arrseig.h" - - -template -class ARluCompStdEig: - public virtual ARCompStdEig, ARFLOAT> > { - - public: - - // a) Public functions: - - // a.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(arcomplex sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(arcomplex sigmap); - - // a.2) Constructors and destructor. - - ARluCompStdEig() { } - // Short constructor. - - ARluCompStdEig(int nevp, ARbdNonSymMatrix, ARFLOAT>& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluCompStdEig(int nevp, ARbdNonSymMatrix, ARFLOAT>& A, - arcomplex sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluCompStdEig(const ARluCompStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluCompStdEig() { } - // Destructor. - - - // b) Operators. - - ARluCompStdEig& operator=(const ARluCompStdEig& other); - // Assignment operator. - -}; // class ARluCompStdEig. - - -// ------------------------------------------------------------------------ // -// ARluCompStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluCompStdEig:: -ChangeShift(arcomplex sigmaRp) -{ - - this->objOP->FactorAsI(sigmaRp); - ARrcStdEig >::ChangeShift(sigmaRp); - -} // ChangeShift. - - -template -inline void ARluCompStdEig::SetRegularMode() -{ - - ARStdEig, - ARbdNonSymMatrix,ARFLOAT> >:: - SetRegularMode(this->objOP,&ARbdNonSymMatrix,ARFLOAT>::MultMv); - -} // SetRegularMode. - - -template -inline void ARluCompStdEig:: -SetShiftInvertMode(arcomplex sigmap) -{ - - ARStdEig, - ARbdNonSymMatrix,ARFLOAT> >:: - SetShiftInvertMode(sigmap, this->objOP, - &ARbdNonSymMatrix,ARFLOAT>::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluCompStdEig:: -ARluCompStdEig(int nevp, ARbdNonSymMatrix, ARFLOAT>& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, arcomplex* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &A, - &ARbdNonSymMatrix, ARFLOAT>::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluCompStdEig:: -ARluCompStdEig(int nevp, ARbdNonSymMatrix, ARFLOAT>& A, - arcomplex sigmap, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, arcomplex* residp, - bool ishiftp) - -{ - - this->DefineParameters(A.ncols(), nevp, &A, - &ARbdNonSymMatrix, ARFLOAT>::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluCompStdEig& ARluCompStdEig:: -operator=(const ARluCompStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARBSCOMP_H diff --git a/src/external/arpack++/include/arbsmat.h b/src/external/arpack++/include/arbsmat.h deleted file mode 100644 index e38c2ccf..00000000 --- a/src/external/arpack++/include/arbsmat.h +++ /dev/null @@ -1,378 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARBSMat.h. - Arpack++ class ARbdSymMatrix definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - - -#include "arbspen.h" - -#ifndef ARBSMAT_H -#define ARBSMAT_H - -#include -#include "arch.h" -#include "armat.h" -#include "arerror.h" -#include "blas1c.h" -#include "lapackc.h" - -template class ARbdSymPencil; - -template -class ARbdSymMatrix: public ARMatrix { - - friend class ARbdSymPencil; - - protected: - - bool factored; - char uplo; - int nsdiag; - int lda; - int info; - int* ipiv; - ARTYPE* A; - ARTYPE* Ainv; - - void ClearMem(); - - virtual void Copy(const ARbdSymMatrix& other); - - void ExpandA(); - - void SubtractAsI(ARTYPE sigma); - - void CreateStructure(); - - void ThrowError(); - - public: - - bool IsFactored() { return factored; } - - void FactorA(); - - void FactorAsI(ARTYPE sigma); - - void MultMv(ARTYPE* v, ARTYPE* w); - - void MultInvv(ARTYPE* v, ARTYPE* w); - - void DefineMatrix(int np, int nsdiagp, ARTYPE* Ap, char uplop = 'L'); - - ARbdSymMatrix(): ARMatrix() { factored = false; } - // Short constructor that does nothing. - - ARbdSymMatrix(int np, int nsdiagp, ARTYPE* Ap, char uplop = 'L'); - // Long constructor. - - ARbdSymMatrix(const ARbdSymMatrix& other) { Copy(other); } - // Copy constructor. - - virtual ~ARbdSymMatrix() { ClearMem(); } - // Destructor. - - ARbdSymMatrix& operator=(const ARbdSymMatrix& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARbdSymMatrix member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARbdSymMatrix::ClearMem() -{ - - if (factored) { - delete[] Ainv; - delete[] ipiv; - Ainv = NULL; - ipiv = NULL; - } - -} // ClearMem. - - -template -inline void ARbdSymMatrix:: -Copy(const ARbdSymMatrix& other) -{ - - // Copying very fundamental variables and user-defined parameters. - - this->m = other.m; - this->n = other.n; - this->defined = other.defined; - factored = other.factored; - uplo = other.uplo; - nsdiag = other.nsdiag; - lda = other.lda; - info = other.info; - A = other.A; - - // Returning from here if "other" was not factored. - - if (!factored) return; - - // Copying vectors. - - Ainv = new ARTYPE[this->n*lda]; - ipiv = new int[this->n]; - - copy(this->n*lda, other.Ainv, 1, Ainv, 1); - for (int i=0; in; i++) ipiv[i] = other.ipiv[i]; - -} // Copy. - - -template -void ARbdSymMatrix::ExpandA() -{ - - int i; - - if (uplo == 'U') { - - // Copying the main diagonal of A to Ainv. - - copy(this->n, &A[nsdiag], nsdiag+1, &Ainv[2*nsdiag], lda); - - // Copying the superdiagonals of A to Ainv. - - for (i = 0; i < nsdiag; i++) { - copy(this->n, &A[i], nsdiag+1, &Ainv[nsdiag+i], lda); - copy(this->n-nsdiag+i, &A[i+(nsdiag-i)*(nsdiag+1)], nsdiag+1, - &Ainv[3*nsdiag-i], lda); - } - - } - else { - - // Copying the main diagonal of A to Ainv. - - copy(this->n, &A[0], nsdiag+1, &Ainv[2*nsdiag], lda); - - // Copying the subdiagonals of A to Ainv. - - for (i = 1; i <= nsdiag; i++) { - copy(this->n, &A[i], nsdiag+1, &Ainv[2*nsdiag+i], lda); - copy(this->n-i, &A[i], nsdiag+1, &Ainv[2*nsdiag-i+i*lda], lda); - } - - } - -} // ExpandA. - - -template -void ARbdSymMatrix::SubtractAsI(ARTYPE sigma) -{ - - // Copying A to Ainv. - - ExpandA(); - - // Subtracting sigma from diagonal elements. - - for (int i=(2*nsdiag); i<(lda*this->n); i+=lda) Ainv[i] -= sigma; - -} // SubtractAsI. - - -template -inline void ARbdSymMatrix::CreateStructure() -{ - - ClearMem(); - Ainv = new ARTYPE[lda*this->n]; - ipiv = new int[this->n]; - -} // CreateStructure. - - -template -inline void ARbdSymMatrix::ThrowError() -{ - - if (info < 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARbdSymMatrix::FactorA"); - } - else if (info) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARbdSymMatrix::FactorA"); - } - -} // ThrowError. - - -template -void ARbdSymMatrix::FactorA() -{ - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARbdSymMatrix::FactorA"); - } - - // Reserving memory for some vectors used in matrix decomposition. - - CreateStructure(); - - // Copying A to Ainv; - - ExpandA(); - - // Decomposing A. - - gbtrf(this->n, this->n, nsdiag, nsdiag, Ainv, lda, ipiv, info); - - // Handling errors. - - ThrowError(); - - factored = true; - -} // FactorA. - - -template -void ARbdSymMatrix::FactorAsI(ARTYPE sigma) -{ - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARbdSymMatrix::FactorAsI"); - } - - // Reserving memory for some vectors used in matrix decomposition. - - CreateStructure(); - - // Subtracting sigma*I from A. - - SubtractAsI(sigma); - - // Decomposing AsI. - - gbtrf(this->n, this->n, nsdiag, nsdiag, Ainv, lda, ipiv, info); - - // Handling errors. - - ThrowError(); - - factored = true; - -} // FactorAsI. - - -template -void ARbdSymMatrix::MultMv(ARTYPE* v, ARTYPE* w) -{ - - ARTYPE one = (ARTYPE)0 + 1.0; - ARTYPE zero = (ARTYPE)0; - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARbdSymMatrix::MultMv"); - } - - // Determining w = M.v. - - sbmv(&uplo, this->n, nsdiag, one, A, nsdiag+1, v, 1, zero, w, 1); - -} // MultMv. - - -template -void ARbdSymMatrix::MultInvv(ARTYPE* v, ARTYPE* w) -{ - - // Quitting the function if A (or AsI) was not factored. - - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARbdSymMatrix::MultInvv"); - } - - // Overwritting w with v. - - copy(this->n, v, 1, w, 1); - - // Solving A.w = v (or AsI.w = v). - - gbtrs("N", this->n, nsdiag, nsdiag, 1, Ainv, lda, ipiv, w, this->m, info); - - // Handling errors. - - ThrowError(); - -} // MultInvv. - - -template -inline void ARbdSymMatrix:: -DefineMatrix(int np, int nsdiagp, ARTYPE* Ap, char uplop) -{ - - // Defining member variables. - - this->m = np; - this->n = np; - nsdiag = nsdiagp; - lda = 3*nsdiag+1; - uplo = uplop; - A = Ap; - this->defined = true; - Ainv = NULL; - ipiv = NULL; - info = 0; - -} // DefineMatrix. - - -template -inline ARbdSymMatrix:: -ARbdSymMatrix(int np, int nsdiagp, - ARTYPE* Ap, char uplop) : ARMatrix(np) -{ - - factored = false; - DefineMatrix(np, nsdiagp, Ap, uplop); - -} // Long constructor. - - -template -ARbdSymMatrix& ARbdSymMatrix:: -operator=(const ARbdSymMatrix& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARBSMAT_H diff --git a/src/external/arpack++/include/arbsnsym.h b/src/external/arpack++/include/arbsnsym.h deleted file mode 100644 index 808a4246..00000000 --- a/src/external/arpack++/include/arbsnsym.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARBSNSym.h. - Arpack++ class ARluNonSymStdEig definition - (band matrix version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARBSNSYM_H -#define ARBSNSYM_H - -#include -#include -#include "arch.h" -#include "arsnsym.h" -#include "arbnsmat.h" - - -template -class ARluNonSymStdEig: - public virtual ARNonSymStdEig > { - - public: - - // a) Public functions: - - // a.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - // a.2) Constructors and destructor. - - ARluNonSymStdEig() { } - // Short constructor. - - ARluNonSymStdEig(int nevp, ARbdNonSymMatrix& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluNonSymStdEig(int nevp, ARbdNonSymMatrix& A, - ARFLOAT sigma, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluNonSymStdEig(const ARluNonSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluNonSymStdEig() { } - // Destructor. - - // b) Operators. - - ARluNonSymStdEig& operator=(const ARluNonSymStdEig& other); - // Assignment operator. - -}; // class ARluNonSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARluNonSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluNonSymStdEig:: -ChangeShift(ARFLOAT sigmaRp) -{ - - this->sigmaR = sigmaRp; - this->sigmaI = 0.0; - this->mode = 3; - this->iparam[7] = this->mode; - - this->objOP->FactorAsI( this->sigmaR); - this->Restart(); - -} // ChangeShift. - - -template -inline void ARluNonSymStdEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode( this->objOP, &ARbdNonSymMatrix::MultMv); - -} // SetRegularMode. - - -template -inline void ARluNonSymStdEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARStdEig >:: - SetShiftInvertMode(sigmap, this->objOP, - &ARbdNonSymMatrix::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluNonSymStdEig:: -ARluNonSymStdEig(int nevp, ARbdNonSymMatrix& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &A, - &ARbdNonSymMatrix::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluNonSymStdEig:: -ARluNonSymStdEig(int nevp, ARbdNonSymMatrix& A, - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->DefineParameters(A.ncols(), nevp, &A, - &ARbdNonSymMatrix::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluNonSymStdEig& ARluNonSymStdEig:: -operator=(const ARluNonSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARBSNSYM_H diff --git a/src/external/arpack++/include/arbspen.h b/src/external/arpack++/include/arbspen.h deleted file mode 100644 index 0dbd73bb..00000000 --- a/src/external/arpack++/include/arbspen.h +++ /dev/null @@ -1,303 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARBSPen.h. - Arpack++ class ARbdSymPencil definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARBSPEN_H -#define ARBSPEN_H - -#include "arch.h" -#include "arerror.h" -#include "blas1c.h" -#include "lapackc.h" -#include "arbsmat.h" - - -template -class ARbdSymPencil -{ - - protected: - - ARbdSymMatrix* A; - ARbdSymMatrix* B; - ARbdSymMatrix AsB; - - int max(int a, int b) { return (a>b)?a:b; } - - int min(int a, int b) { return (aMultMv(v,w); } - - void MultBv(ARTYPE* v, ARTYPE* w) { B->MultMv(v,w); } - - void MultInvBAv(ARTYPE* v, ARTYPE* w); - - void MultInvAsBv(ARTYPE* v, ARTYPE* w) { AsB.MultInvv(v,w); } - - void DefineMatrices(ARbdSymMatrix& Ap, ARbdSymMatrix& Bp); - - ARbdSymPencil() { AsB.factored = false; } - // Short constructor that does nothing. - - ARbdSymPencil(ARbdSymMatrix& Ap, ARbdSymMatrix& Bp); - // Long constructor. - - ARbdSymPencil(const ARbdSymPencil& other) { Copy(other); } - // Copy constructor. - - virtual ~ARbdSymPencil() { } - // Destructor. - - ARbdSymPencil& operator=(const ARbdSymPencil& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARbdSymPencil member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARbdSymPencil::Copy(const ARbdSymPencil& other) -{ - - A = other.A; - B = other.B; - AsB = other.AsB; - -} // Copy. - - -template -void ARbdSymPencil::SubtractAsB(ARTYPE sigma) -{ - - int i, n, minD, ndA, ndB, ndAsB, lda; - ARTYPE negsig; - - negsig = -sigma; - n = AsB.n; - ndA = A->nsdiag; - ndB = B->nsdiag; - ndAsB = AsB.nsdiag; - lda = AsB.lda; - - // Expanding A. - - if (A->uplo == 'U') { - - // Copying the main diagonal of A. - - copy(n, &A->A[ndA], ndA+1, &AsB.Ainv[2*ndAsB], lda); - - // Copying the superdiagonals of A. - - for (i = 0; i < ndA; i++) { - copy(n, &A->A[i], ndA+1, &AsB.Ainv[2*ndAsB-ndA+i], lda); - copy(n-ndA+i, &A->A[i+(ndA-i)*(ndA+1)], ndA+1, - &AsB.Ainv[2*ndAsB+ndA-i], lda); - } - - } - else { - - // Copying the main diagonal of A to Ainv. - - copy(n, &A->A[0], ndA+1, &AsB.Ainv[2*ndAsB], lda); - - // Copying the subdiagonals of A to Ainv. - - for (i = 1; i <= ndA; i++) { - copy(n, &A->A[i], ndA+1, &AsB.Ainv[2*ndAsB+i], lda); - copy(n-i, &A->A[i], ndA+1, &AsB.Ainv[2*ndAsB-i+i*lda], lda); - } - - } - - // Transferring part of B (*(-sigma)) if AsB.nsdiag > A->nsdiag. - - if (A->nsdiag < AsB.nsdiag) { - - if (B->uplo == 'U') { - - for (i = 0; i < ndAsB-ndA; i++) { - copy(n, &B->A[i], ndB+1, &AsB.Ainv[ndAsB+i], lda); - scal(n, negsig, &AsB.Ainv[ndAsB+i], lda); - copy(n-ndAsB+i, &AsB.Ainv[ndAsB+i+(ndAsB-i)*lda], lda, - &AsB.Ainv[lda-i-1], lda); - } - - } - else { - - for (i = ndA+1; i <= ndAsB; i++) { - copy(n, &B->A[i], ndB+1, &AsB.Ainv[2*ndAsB+i], lda); - scal(n, negsig, &AsB.Ainv[2*ndAsB+i], lda); - copy(n-i, &AsB.Ainv[2*ndAsB+i], lda, - &AsB.Ainv[2*ndAsB-i+i*lda], lda); - } - - } - - } - - // Subtracting sigma*B from A. - - minD = min(ndA, ndB); - - if (B->uplo == 'U') { - - // Subtracting the main diagonal of B. - - axpy(n, negsig, &B->A[ndB], ndB+1, &AsB.Ainv[2*ndAsB], lda); - - // Subtracting the superdiagonals. - - for (i = 0; i < minD; i++) { - axpy(n, negsig, &B->A[ndB-minD+i], ndB+1, - &AsB.Ainv[2*ndAsB-minD+i], lda); - copy(n-minD+i, &AsB.Ainv[2*ndAsB-minD+i+(minD-i)*lda], lda, - &AsB.Ainv[2*ndAsB+minD-i], lda); - } - - } - else { - - // Subtracting the main diagonal of B. - - axpy(n, negsig, &B->A[0], ndB+1, &AsB.Ainv[2*ndAsB], lda); - - // Subtracting the subdiagonals. - - for (i = 1; i <= minD; i++) { - axpy(n, negsig, &B->A[i], ndB+1, &AsB.Ainv[2*ndAsB+i], lda); - copy(n-i, &AsB.Ainv[2*ndAsB+i], lda, - &AsB.Ainv[2*ndAsB-i+i*lda], lda); - } - - } - -} // SubtractAsB (ARTYPE shift). - - -template -void ARbdSymPencil::FactorAsB(ARTYPE sigma) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARbdSymPencil::FactorAsB"); - } - - // Copying A to AsB if sigma = 0. - - if (sigma == (ARTYPE)0) { - - AsB = *A; - if (!AsB.IsFactored()) AsB.FactorA(); - return; - - } - - // Defining matrix AsB. - - if (!AsB.IsDefined()) { - AsB.DefineMatrix(A->ncols(), max(A->nsdiag, B->nsdiag), A->A); - } - - // Reserving memory for some vectors used in matrix decomposition. - - AsB.CreateStructure(); - - // Subtracting sigma*B from A and storing the result on AsB. - - SubtractAsB(sigma); - - // Decomposing AsB. - - gbtrf(AsB.n, AsB.n, AsB.nsdiag, AsB.nsdiag, - AsB.Ainv, AsB.lda, AsB.ipiv, AsB.info); - - // Handling errors. - - AsB.ThrowError(); - - AsB.factored = true; - -} // FactorAsB (ARTYPE shift). - - -template -void ARbdSymPencil::MultInvBAv(ARTYPE* v, ARTYPE* w) -{ - - if (!B->IsFactored()) B->FactorA(); - - A->MultMv(v, w); - copy(A->ncols(), w, 1, v, 1); - B->MultInvv(w, w); - -} // MultInvBAv. - - -template -inline void ARbdSymPencil:: -DefineMatrices(ARbdSymMatrix& Ap, ARbdSymMatrix& Bp) -{ - - A = &Ap; - B = &Bp; - -} // DefineMatrices. - - -template -inline ARbdSymPencil:: -ARbdSymPencil(ARbdSymMatrix& Ap, ARbdSymMatrix& Bp) -{ - - AsB.factored = false; - DefineMatrices(Ap, Bp); - -} // Long constructor. - - -template -ARbdSymPencil& ARbdSymPencil:: -operator=(const ARbdSymPencil& other) -{ - - if (this != &other) { // Stroustrup suggestion. - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARBSPEN_H diff --git a/src/external/arpack++/include/arbssym.h b/src/external/arpack++/include/arbssym.h deleted file mode 100644 index 94d70f68..00000000 --- a/src/external/arpack++/include/arbssym.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARBSSym.h. - Arpack++ class ARluSymStdEig definition - (band matrix version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARBSSYM_H -#define ARBSSYM_H - -#include -#include -#include "arch.h" -#include "arssym.h" -#include "arbsmat.h" - - -template -class ARluSymStdEig: - public virtual ARSymStdEig > { - - public: - - // a) Public functions: - - // a.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - // a.2) Constructors and destructor. - - ARluSymStdEig() { } - // Short constructor. - - ARluSymStdEig(int nevp, ARbdSymMatrix& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluSymStdEig(int nevp, ARbdSymMatrix& A, - ARFLOAT sigma, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluSymStdEig(const ARluSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluSymStdEig() { } - // Destructor. - - // b) Operators. - - ARluSymStdEig& operator=(const ARluSymStdEig& other); - // Assignment operator. - -}; // class ARluSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARluSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluSymStdEig:: -ChangeShift(ARFLOAT sigmaRp) -{ - - this->sigmaR = sigmaRp; - this->sigmaI = 0.0; - this->mode = 3; - this->iparam[7] = this->mode; - - this->objOP->FactorAsI(this->sigmaR); - this->Restart(); - -} // ChangeShift. - - -template -inline void ARluSymStdEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(this->objOP, &ARbdSymMatrix::MultMv); - -} // SetRegularMode. - - -template -inline void ARluSymStdEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARStdEig >:: - SetShiftInvertMode(sigmap, this->objOP, &ARbdSymMatrix::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluSymStdEig:: -ARluSymStdEig(int nevp, ARbdSymMatrix& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) -{ - - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &A, &ARbdSymMatrix::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluSymStdEig:: -ARluSymStdEig(int nevp, ARbdSymMatrix& A, - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->DefineParameters(A.ncols(), nevp, &A, &ARbdSymMatrix::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluSymStdEig& ARluSymStdEig:: -operator=(const ARluSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARBSSYM_H diff --git a/src/external/arpack++/include/arcgsym.h b/src/external/arpack++/include/arcgsym.h deleted file mode 100644 index 45c14f83..00000000 --- a/src/external/arpack++/include/arcgsym.h +++ /dev/null @@ -1,242 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARCGSym.h. - Arpack++ class ARluSymGenEig definition - (CHOLMOD version). - - Author of this class: - Martin Reuter - Date 11/05/2012 - - Arpack++ Author: - Francisco Gomes - - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Kristi Maschhoff - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARCGSYM_H -#define ARCGSYM_H - -#include -#include -#include "arch.h" -#include "arcsmat.h" -#include "arcspen.h" -#include "argsym.h" - - -template -class ARluSymGenEig: - public virtual ARSymGenEig, - ARchSymPencil > { - - private: - - // a) Data structure used to store matrices. - - ARchSymPencil Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmap); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - virtual void SetBucklingMode(ARFLOAT sigmap); - - virtual void SetCayleyMode(ARFLOAT sigmap); - - // c.2) Constructors and destructor. - - ARluSymGenEig() { } - // Short constructor. - - ARluSymGenEig(int nevp, ARchSymMatrix& A, - ARchSymMatrix& B, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluSymGenEig(char InvertModep, int nevp, ARchSymMatrix& A, - ARchSymMatrix& B, ARFLOAT sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert, buckling and Cayley modes). - - ARluSymGenEig(const ARluSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluSymGenEig() { } - // Destructor. - - // d) Operators. - - ARluSymGenEig& operator=(const ARluSymGenEig& other); - // Assignment operator. - -}; // class ARluSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARluSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluSymGenEig:: -Copy(const ARluSymGenEig& other) -{ - - ARSymGenEig, - ARchSymPencil >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - this->objA = &Pencil; - -} // Copy. - - -template -inline void ARluSymGenEig::ChangeShift(ARFLOAT sigmap) -{ - - this->objOP->FactorAsB(sigmap); - ARrcSymGenEig::ChangeShift(sigmap); - -} // ChangeShift. - - -template -inline void ARluSymGenEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(&Pencil, &ARchSymPencil::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluSymGenEig:: -SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARchSymPencil >:: - SetShiftInvertMode(sigmap, &Pencil, &ARchSymPencil::MultInvAsBv); - this->ChangeMultBx(&Pencil, &ARchSymPencil::MultBv); - -} // SetShiftInvertMode. - - -template -inline void ARluSymGenEig:: -SetBucklingMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARchSymPencil >:: - SetBucklingMode(sigmap, &Pencil, &ARchSymPencil::MultInvAsBv); - this->ChangeMultBx(&Pencil, &ARchSymPencil::MultAv); - -} // SetBucklingMode. - - -template -inline void ARluSymGenEig:: -SetCayleyMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARchSymPencil >:: - SetCayleyMode(sigmap, &Pencil, &ARchSymPencil::MultInvAsBv, - &Pencil, &ARchSymPencil::MultAv); - this->ChangeMultBx(&Pencil, &ARchSymPencil::MultBv); - -} // SetCayleyMode. - - -template -inline ARluSymGenEig:: -ARluSymGenEig(int nevp, ARchSymMatrix& A, - ARchSymMatrix& B, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->InvertMode = 'S'; - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARchSymPencil::MultInvBAv, &Pencil, - &ARchSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluSymGenEig:: -ARluSymGenEig(char InvertModep, int nevp, ARchSymMatrix& A, - ARchSymMatrix& B, ARFLOAT sigmap, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARchSymPencil::MultInvAsBv, &Pencil, - &ARchSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - this->InvertMode = this->CheckInvertMode(InvertModep); - switch (this->InvertMode) { - case 'B': // Buckling mode. - this->ChangeMultBx(&Pencil, &ARchSymPencil::MultAv); - case 'S': // Shift and invert mode. - ChangeShift(sigmap); - break; - case 'C': // Cayley mode. - SetCayleyMode(sigmap); - } - -} // Long constructor (shift and invert, buckling and Cayley modes). - - -template -ARluSymGenEig& ARluSymGenEig:: -operator=(const ARluSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUGSYM_H diff --git a/src/external/arpack++/include/arch.h b/src/external/arpack++/include/arch.h deleted file mode 100644 index 13515730..00000000 --- a/src/external/arpack++/include/arch.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE arch.h - Modified version of arch.h (from LAPACK++ 1.1). - Machine dependent functions and variable types. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - - -#ifndef ARCH_H -#define ARCH_H - -// ARPACK++ arcomplex type definition. -// If you are not using g++ (or CC) and also are not intending -// use complex variables, comment out the following line. - -#include "arcomp.h" - -// STL vector class. -// If the Standard Template Library is not available at your system -// and you do not want to install it, comment out the following line. - -#include - -// If your STL vector class defines a variable other than -// __SGI_STL_VECTOR_H, please change this variable name -// in the ifdef command below. - -#ifdef __SGI_STL_VECTOR_H - #define STL_VECTOR_H -#endif - -// UMFPACK parameters. -// These parameters are used by UMFPACK library functions. Normally -// they are not modified by the user. To use the default value, set -// the parameter to zero. For a complete description of all UMFPACK -// parameters, see the library documentation. - -#define UICNTL7 0 // icntl(7). Block size for the blas (machine-dependent). -#define UICNTL5 0 // icntl(5). Number of columns to examine during pivot search. -#define UCNTL2 0 // cntl(2). Amalgamation parameter. -#define UKEEP7 0 // keep(7). Absolute number of elements a column must have - // to be considered "dense". -#define UKEEP8 0 // keep(8). Relative number of elements a column must have - // to be considered "dense". Dense columns have more - // than max{0,UMFABDEN,UMFREDEN*sqrt(n)} elements. - -// Line length used when reading a dense matrix from a file. - -#define LINELEN 256 - -// Linkage names between C, C++, and Fortran (platform dependent) - -#if defined(RIOS) && !defined(CLAPACK) -#define F77NAME(x) x -#else -// #include -// #define F77NAME(x) name2(x,_) -#define F77NAME(x) x ## _ -#endif - -#if defined(SGI) && !defined(SGI_DEC) -#define SGI_DEC - -extern "C" { - void mkidxname() {} - void mkdatname() {} -} -#endif - - -// Type conversion. - -typedef int ARint; -typedef int ARlogical; - -#ifdef __SUNPRO_CC - - typedef int bool; - int true = 1; - int false = 0; - -#endif - - -#endif // ARCH_H diff --git a/src/external/arpack++/include/arcomp.h b/src/external/arpack++/include/arcomp.h deleted file mode 100644 index 6a391d02..00000000 --- a/src/external/arpack++/include/arcomp.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE arcomp.h - arcomplex complex type definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARCOMP_H -#define ARCOMP_H - -#include - -#ifdef __GNUG__ - -#define arcomplex std::complex - -#endif - -#if defined(__SUNPRO_CC) || defined(__sgi) - - template - class arcomplex: public complex - { - public: - - arcomplex(ARFLOAT x, ARFLOAT y): complex(x,y) { } - arcomplex(): complex() { } - arcomplex(complex x): complex(x) { } - - }; - -#endif - -#endif // ARCOMP_H - - - diff --git a/src/external/arpack++/include/arcsmat.h b/src/external/arpack++/include/arcsmat.h deleted file mode 100644 index a97e9fad..00000000 --- a/src/external/arpack++/include/arcsmat.h +++ /dev/null @@ -1,473 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARCSMat.h. - Arpack++ class ARchSymMatrix definition. - (CHOLMOD wrapper) - - Author of this class: - Martin Reuter - Date 11/05/2012 - - Arpack++ Author: - Francisco Gomes - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - - -#include "arcspen.h" - -#ifndef ARCSMAT_H -#define ARCSMAT_H - -#include -#include -#include "arch.h" -#include "armat.h" -#include "arhbmat.h" -#include "arerror.h" -#include "cholmodc.h" -//#include "blas1c.h" -//#include "superluc.h" -//#include "arlspdef.h" -//#include "arlutil.h" -#include - -template class ARchSymPencil; - -template -class ARchSymMatrix: public ARMatrix { - - friend class ARchSymPencil; - - protected: - - bool factored; - char uplo; - int nnz; - int* irow; - int* pcol; - double threshold; - ARTYPE* a; - ARhbMatrix mat; - cholmod_common c ; - cholmod_sparse *A ; - cholmod_factor *L ; - - bool DataOK(); - - virtual void Copy(const ARchSymMatrix& other); - - void ClearMem(); - - public: - - int nzeros() { return nnz; } - - bool IsFactored() { return factored; } - - void FactorA(); - - void FactorAsI(ARTYPE sigma); - - void MultMv(ARTYPE* v, ARTYPE* w); - - void MultInvv(ARTYPE* v, ARTYPE* w); - - void DefineMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, char uplop = 'L', double thresholdp = 0.1, - bool check = true); - - ARchSymMatrix(): ARMatrix() { factored = false; cholmod_start (&c) ;} - // Short constructor that does nothing. - - ARchSymMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, char uplop = 'L', double thresholdp = 0.1, - bool check = true); - // Long constructor. - - ARchSymMatrix(const std::string& name, double thresholdp = 0.1, - bool check = true); - // Long constructor (Harwell-Boeing file). - - ARchSymMatrix(const ARchSymMatrix& other) { cholmod_start (&c) ; Copy(other); } - // Copy constructor. - - virtual ~ARchSymMatrix() { ClearMem(); cholmod_finish (&c) ;} - // Destructor. - - ARchSymMatrix& operator=(const ARchSymMatrix& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARchSymMatrix member functions definition. // -// ------------------------------------------------------------------------ // - - -template -bool ARchSymMatrix::DataOK() -{ - - int i, j, k; - - // Checking if pcol is in ascending order. - - i = 0; - while ((i!=this->n)&&(pcol[i]<=pcol[i+1])) i++; - if (i!=this->n) return false; - - // Checking if irow components are in order and within bounds. - - for (i=0; i!=this->n; i++) { - j = pcol[i]; - k = pcol[i+1]-1; - if (j<=k) { - if (uplo == 'U') { - if ((irow[j]<0)||(irow[k]>i)) return false; - } - else { // uplo == 'L'. - if ((irow[j]=this->n)) return false; - } - while ((j!=k)&&(irow[j] -void ARchSymMatrix::ClearMem() -{ - - if (factored) { - cholmod_free_factor (&L, &c) ; - } - if (this->defined) { - //cholmod_free_sparse (&A, &c); - //delete[] permc; - //delete[] permr; - //permc = NULL; - //permr = NULL; - - free(A); // don't delete data in A as it came from external - A = NULL; - } - -} // ClearMem. - - - -template -inline void ARchSymMatrix::Copy(const ARchSymMatrix& other) -{ - - // Copying very fundamental variables. - ClearMem(); - - this->defined = other.defined; - // Returning from here if "other" was not initialized. - if (!this->defined) return; - - this->n = other.n; - factored = other.factored; - uplo = other.uplo; - nnz = other.nnz; - irow = other.irow; - pcol = other.pcol; - threshold = other.threshold; - a = other.a; - //c = other.c; - - A = cholmod_copy_sparse(other.A,&c); - - if (L) cholmod_free_factor(&L,&c); - if (factored) - L = cholmod_copy_factor(other.L,&c); - -} // Copy. - - - -template -void ARchSymMatrix::FactorA() -{ - int info; - - //std::cout << "ARchSymMatrix::FactorA" << std::endl; - - // Quitting the function if A was not defined. - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARchSymMatrix::FactorA"); - } - - // Deleting previous versions of L. - if (factored) { - cholmod_free_factor (&L, &c) ; - } - - L = cholmod_analyze (A, &c) ; - info = cholmod_factorize (A, L, &c) ; - - - factored = (info != 0); - - if (c.status != CHOLMOD_OK) - { - throw ArpackError(ArpackError::INCONSISTENT_DATA, - "ARchSymMatrix::FactorA"); - - factored = false; - } - -// -// // Handling errors. -// -// if (info < 0) { // Illegal argument. -// throw ArpackError(ArpackError::PARAMETER_ERROR, -// "ARchSymMatrix::FactorA"); -// } -// else if (info > this->n) { // Memory is not sufficient. -// throw ArpackError(ArpackError::MEMORY_OVERFLOW, -// "ARchSymMatrix::FactorA"); -// } -// else if (info > 0) { // Matrix is singular. -// throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, -// "ARchSymMatrix::FactorA"); -// } - -} // FactorA. - - -template -void ARchSymMatrix::FactorAsI(ARTYPE sigma) -{ - - //std::cout <<"ARchSymMatrix::FactorAsI " << std::endl; - - // Quitting the function if A was not defined. - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARchSymMatrix::FactorAsI"); - } - - - // Deleting previous versions of L. - if (factored) { - cholmod_free_factor (&L, &c) ; - } - -// FILE *fp ; -// fp = fopen ("A.mat", "w" ) ; -// cholmod_write_sparse(fp,A,NULL,NULL,&c); - - // Factorizing A-sigma*I - double sigma2[2]; - sigma2[0] = -sigma; - sigma2[1] = 0.0; - L = cholmod_analyze (A, &c) ; - int info = cholmod_factorize_p (A,sigma2,NULL,0,L,&c) ; - - factored = (info != 0); - - if (c.status != CHOLMOD_OK) - { - throw ArpackError(ArpackError::INCONSISTENT_DATA, - "ARchSymMatrix::FactorAsI"); - - factored = false; - } - - -} // FactorAsI. - - -template -void ARchSymMatrix::MultMv(ARTYPE* v, ARTYPE* w) -{ - //std::cout << "ARchSymMatrix::MultMv " << std::endl; - - int i, j, k; - ARTYPE t; - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARchSymMatrix::MultMv"); - } - - // Determining w = M.v. - - for (i=0; i!=this->m; i++) w[i]=(ARTYPE)0; - - if (uplo == 'U') { - - for (i=0; i!=this->n; i++) { - t = v[i]; - k = pcol[i+1]; - if ((k!=pcol[i])&&(irow[k-1]==i)) { - w[i] += t*a[k-1]; - k--; - } - for (j=pcol[i]; jn; i++) { - t = v[i]; - k = pcol[i]; - if ((k!=pcol[i+1])&&(irow[k]==i)) { - w[i] += t*a[k]; - k++; - } - for (j=k; j -void ARchSymMatrix::MultInvv(ARTYPE* v, ARTYPE* w) -{ - //std::cout << "ARchSymMatrix::MultInvv " << std::endl; - - // Quitting the function if A (or AsI) was not factored. - - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARchSymMatrix::MultInvv"); - } - - // Solving A.w = v (or AsI.w = v). - - //std::cout<< " b = [ " << v[0]; - //for(int i=1;in;i++) - // std::cout << " , " << v[i]; - //std::cout<< " ]" <n,1,v,&c); - - cholmod_dense *x = cholmod_solve (CHOLMOD_A, L, b, &c) ; - - Get_Cholmod_Dense_Data(x, this->n, w); - - //std::cout<< " x = [ " << w[0]; - //for(int i=1;in;i++) - // std::cout << " , " << w[i]; - //std::cout<< " ]" < -inline void ARchSymMatrix:: -DefineMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, int* pcolp, - char uplop, double thresholdp, bool check) -{ - - this->m = np; - this->n = np; - nnz = nnzp; - a = ap; - irow = irowp; - pcol = pcolp; - pcol[this->n] = nnz; - uplo = uplop; - threshold = thresholdp; - - // Checking data. - if ((check)&&(!DataOK())) { - throw ArpackError(ArpackError::INCONSISTENT_DATA, - "ARchSymMatrix::DefineMatrix"); - } - - // Creating SuperMatrix A. - A = Create_Cholmod_Sparse_Matrix(this->n, this->n, nnz, a, irow, pcol, uplo, &c); - - this->defined = true; - -} // DefineMatrix. - - -template -inline ARchSymMatrix:: -ARchSymMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, char uplop, double thresholdp, - bool check) : ARMatrix(np) -{ - cholmod_start (&c) ; - - factored = false; - DefineMatrix(np, nnzp, ap, irowp, pcolp, uplop, thresholdp, check); - -} // Long constructor. - - -template -ARchSymMatrix:: -ARchSymMatrix(const std::string& file, double thresholdp, bool check) -{ - cholmod_start (&c) ; - - factored = false; - - try { - mat.Define(file); - } - catch (ArpackError) { // Returning from here if an error has occurred. - throw ArpackError(ArpackError::CANNOT_READ_FILE, "ARchSymMatrix"); - } - - if ((mat.NCols() == mat.NRows()) && (mat.IsSymmetric())) { - - DefineMatrix(mat.NCols(), mat.NonZeros(), (ARTYPE*)mat.Entries(), - mat.RowInd(), mat.ColPtr(), 'L', thresholdp, check); - } - else { - throw ArpackError(ArpackError::INCONSISTENT_DATA, - "ARchSymMatrix::ARchSymMatrix"); - } -} // Long constructor (Harwell-Boeing file). - - -template -ARchSymMatrix& ARchSymMatrix:: -operator=(const ARchSymMatrix& other) -{ - - if (this != &other) { // Stroustrup suggestion. - ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARCSMAT_H diff --git a/src/external/arpack++/include/arcspen.h b/src/external/arpack++/include/arcspen.h deleted file mode 100644 index 424535fa..00000000 --- a/src/external/arpack++/include/arcspen.h +++ /dev/null @@ -1,434 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARCSPen.h. - Arpack++ class ARchSymMPencil definition. - (CHOLMOD wrapper) - - Author of this class: - Martin Reuter - Date 11/05/2012 - - Arpack++ Author: - Francisco Gomes - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARCSPEN_H -#define ARCSPEN_H - -//#include "arch.h" -//#include "arerror.h" -#include "blas1c.h" -//#include "lapackc.h" -#include "arcsmat.h" - - -template -class ARchSymPencil -{ - - protected: - - ARchSymMatrix* A; - ARchSymMatrix* B; - cholmod_factor *LAsB ; - bool factoredAsB; - cholmod_common c ; - - virtual void Copy(const ARchSymPencil& other); - -// void SparseSaxpy(ARTYPE a, ARTYPE x[], int xind[], int nx, ARTYPE y[], -// int yind[], int ny, ARTYPE z[], int zind[], int& nz); - -// void ExpandAsB(); - -// void SubtractAsB(ARTYPE sigma); - - public: - - bool IsFactored() { return factoredAsB; } - - void FactorAsB(ARTYPE sigma); - - void MultAv(ARTYPE* v, ARTYPE* w) { A->MultMv(v,w); } - - void MultBv(ARTYPE* v, ARTYPE* w) { B->MultMv(v,w); } - - void MultInvBAv(ARTYPE* v, ARTYPE* w); - - void MultInvAsBv(ARTYPE* v, ARTYPE* w); - - void DefineMatrices(ARchSymMatrix& Ap, ARchSymMatrix& Bp); - - ARchSymPencil() { factoredAsB = false; A=NULL; B=NULL; LAsB=NULL; cholmod_start (&c) ; } - // Short constructor that does nothing. - - ARchSymPencil(ARchSymMatrix& Ap, ARchSymMatrix& Bp); - // Long constructor. - - ARchSymPencil(const ARchSymPencil& other) { cholmod_start (&c) ; Copy(other); } - // Copy constructor. - - virtual ~ARchSymPencil() { if (LAsB) cholmod_free_factor(&LAsB,&c); cholmod_finish (&c) ;} - // Destructor. - - ARchSymPencil& operator=(const ARchSymPencil& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARchSymPencil member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARchSymPencil::Copy(const ARchSymPencil& other) -{ - if (LAsB) cholmod_free_factor(&LAsB,&c); - A = other.A; - B = other.B; - factoredAsB = other.factoredAsB; - if (factoredAsB) - LAsB = cholmod_copy_factor(other.LAsB,&c); - -} // Copy. - -/* -template -void ARchSymPencil:: -SparseSaxpy(ARTYPE a, ARTYPE x[], int xind[], int nx, ARTYPE y[], - int yind[], int ny, ARTYPE z[], int zind[], int& nz) -// A strongly sequential (and inefficient) sparse saxpy algorithm. -{ - - int ix, iy; - - nz = 0; - if ((nx == 0) || (a == (ARTYPE)0)) { - copy(ny,y,1,z,1); - for (iy=0; iy!=ny; iy++) zind[iy] = yind[iy]; - nz = ny; - return; - } - if (ny == 0) { - copy(nx,x,1,z,1); - scal(nx,a,z,1); - for (ix=0; ix!=nx; ix++) zind[ix] = xind[ix]; - nz = nx; - return; - } - ix = 0; - iy = 0; - while (true) { - if (xind[ix] == yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]+y[iy++]; - if ((ix == nx)||(iy == ny)) break; - } - else if (xind[ix] < yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]; - if (ix == nx) break; - } - else { - zind[nz] = yind[iy]; - z[nz++] = y[iy++]; - if (iy == ny) break; - } - } - while (iy < ny) { - zind[nz] = yind[iy]; - z[nz++] = y[iy++]; - } - while (ix < nx) { - zind[nz] = xind[ix]; - z[nz++] = x[ix++]; - } - -} // SparseSaxpy. - - -template -void ARchSymPencil::ExpandAsB() -{ - - int i, j, k, n; - int *pcol, *irow, *index, *pos; - ARTYPE *value; - - // Initializing variables. - - n = AsB.n; - index = AsB.index; - value = AsB.value; - irow = &index[n+1]; - pcol = new int[AsB.n+1]; - pos = new int[AsB.n+1]; - for (i=0; i<=n; i++) pcol[i] = index[i]; - for (i=0; i<=n; i++) pos[i] = 0; - - // Counting the elements in each column of AsB. - - if (AsB.uplo == 'U') { - - for (i=0; i!=n; i++) { - k = pcol[i+1]; - if ((k!=pcol[i])&&(irow[k-1]==i)) k--; - for (j=pcol[i]; j0; i--) index[i] += pos[i-1]; - - // Expanding A. - - if (AsB.uplo == 'U') { - - for (i=n-1; i>=0; i--) { - pos[i] = index[i]+pcol[i+1]-pcol[i]; - k = pos[i]-1; - for (j=pcol[i+1]-1; j>=pcol[i]; j--) { - value[k] = value[j]; - irow[k--] = irow[j]; - } - } - for (i=1; iindex[i])&&(irow[k-1]==i)) k--; - for (j=index[i]; j=0; i--) { - k = index[i+1]-1; - for (j=pcol[i+1]-1; j>=pcol[i]; j--) { - value[k] = value[j]; - irow[k--] = irow[j]; - } - pos[i] = index[i]; - } - for (i=0; i<(n-1); i++) { - k = index[i+1]-pcol[i+1]+pcol[i]; - if ((k -void ARchSymPencil::SubtractAsB(ARTYPE sigma) -{ - - int i, acol, bcol, asbcol, scol; - - // Quitting function if A->uplo is not equal to B->uplo. - - if ((A->uplo != B->uplo)&&(sigma != (ARTYPE)0)) { - throw ArpackError(ArpackError::DIFFERENT_TRIANGLES, - "ARchSymPencil::SubtractAsB"); - } - AsB.uplo = A->uplo; - - // Subtracting sigma*B from A. - - AsB.index[0] = 0; - asbcol = 0; - - for (i=0; i!=AsB.n; i++) { - bcol = B->pcol[i]; - acol = A->pcol[i]; - SparseSaxpy(-sigma, &B->a[bcol], &B->irow[bcol], B->pcol[i+1]-bcol, - &A->a[acol], &A->irow[acol], A->pcol[i+1]-acol, - &AsB.value[asbcol], &AsB.index[asbcol+AsB.n+1], scol); - asbcol += scol; - AsB.index[i+1] = asbcol; - } - - // Expanding AsB. - - ExpandAsB(); - - // Adding one to all elements of vector index - // because the decomposition function was written in FORTRAN. - - for (i=0; i<=AsB.n+AsB.nnz; i++) AsB.index[i]++; - -} // SubtractAsB. - -*/ - -template -void ARchSymPencil::FactorAsB(ARTYPE sigma) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARchSymPencil::FactorAsB"); - } - - - if (LAsB) cholmod_free_factor(&LAsB,&c); - - cholmod_sparse* AsB; - if (sigma != 0.0) - { - std::cout << " Subtracting sigma B (sigma="<A,B->A,alpha,beta,1,0,&c); - } - else - AsB = A->A; - -//FILE *fp; -//fp=fopen("AsB.asc", "w"); -//cholmod_write_sparse(fp,AsB,NULL,NULL,&c); -//FILE *fpa; -//fpa=fopen("As.asc", "w"); -//cholmod_write_sparse(fpa,B->A,NULL,NULL,&c); -//FILE *fpb; -//fpb=fopen("Bs.asc", "w"); -//cholmod_write_sparse(fpb,A->A,NULL,NULL,&c); - - LAsB = cholmod_analyze (AsB, &c) ; - int info = cholmod_factorize (AsB, LAsB, &c) ; - - factoredAsB = (info != 0); - if (c.status != CHOLMOD_OK) - { - //std::cout << " sigma : " << sigma << std::endl; - - Write_Cholmod_Sparse_Matrix("AsB-error.asc",AsB,&c); - - throw ArpackError(ArpackError::INCONSISTENT_DATA, - "ARchSymPencil::FactorAsB"); - - factoredAsB = false; - } - - if (sigma != 0.0) - cholmod_free_sparse(&AsB,&c); - - -} // FactorAsB (ARTYPE shift). - - -template -void ARchSymPencil::MultInvBAv(ARTYPE* v, ARTYPE* w) -{ - - if (!B->IsFactored()) B->FactorA(); - - A->MultMv(v, w); - ::copy(A->ncols(), w, 1, v, 1); - B->MultInvv(w, w); - -} // MultInvBAv. - -template -void ARchSymPencil::MultInvAsBv(ARTYPE* v, ARTYPE* w) -{ - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARchSymPencil::MultInvAsBv"); - } - - // Solving A.w = v (or AsI.w = v). - - //create b from v (data is not copied!!) - cholmod_dense * b = Create_Cholmod_Dense_Matrix(A->n,1,v,&c); - - cholmod_dense *x = cholmod_solve (CHOLMOD_A, LAsB, b, &c) ; - - Get_Cholmod_Dense_Data(x, A->n, w); - - free(b); - cholmod_free_dense(&x,&c); - - -} // MultInvAsBv - -template -inline void ARchSymPencil:: -DefineMatrices(ARchSymMatrix& Ap, ARchSymMatrix& Bp) -{ - - A = &Ap; - B = &Bp; - - if (A->n != B->n) { - throw ArpackError(ArpackError::INCOMPATIBLE_SIZES, - "ARchSymMatrix::DefineMatrices"); - } - -} // DefineMatrices. - - -template -inline ARchSymPencil:: -ARchSymPencil(ARchSymMatrix& Ap, ARchSymMatrix& Bp) -{ - cholmod_start (&c) ; - LAsB=NULL; - DefineMatrices(Ap, Bp); - -} // Long constructor. - - -template -ARchSymPencil& ARchSymPencil:: -operator=(const ARchSymPencil& other) -{ - - if (this != &other) { // Stroustrup suggestion. - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUSPEN_H diff --git a/src/external/arpack++/include/arcssym.h b/src/external/arpack++/include/arcssym.h deleted file mode 100644 index 26094e93..00000000 --- a/src/external/arpack++/include/arcssym.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARUSSym.h. - Arpack++ class ARluSymStdEig definition - (CHOLMOD version). - - Author of this class: - Martin Reuter - Date 11/05/2012 - - Arpack++ Author: - Francisco Gomes - - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARCSSYM_H -#define ARCSSYM_H - -#include -#include -#include "arch.h" -#include "arssym.h" -#include "arcsmat.h" - - -template -class ARluSymStdEig: - public virtual ARSymStdEig > { - - public: - - // a) Public functions: - - // a.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - // a.2) Constructors and destructor. - - ARluSymStdEig() { } - // Short constructor. - - ARluSymStdEig(int nevp, ARchSymMatrix& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluSymStdEig(int nevp, ARchSymMatrix& A, - ARFLOAT sigma, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluSymStdEig(const ARluSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluSymStdEig() { } - // Destructor. - - // b) Operators. - - ARluSymStdEig& operator=(const ARluSymStdEig& other); - // Assignment operator. - -}; // class ARluSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARluSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluSymStdEig::ChangeShift(ARFLOAT sigmaRp) -{ - - this->sigmaR = sigmaRp; - this->sigmaI = 0.0; - this->mode = 3; - this->iparam[7] = this->mode; - - this->objOP->FactorAsI(this->sigmaR); - this->Restart(); - -} // ChangeShift. - - -template -inline void ARluSymStdEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(this->objOP, &ARchSymMatrix::MultMv); - -} // SetRegularMode. - - -template -inline void ARluSymStdEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARStdEig >:: - SetShiftInvertMode(sigmap, this->objOP, &ARchSymMatrix::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluSymStdEig:: -ARluSymStdEig(int nevp, ARchSymMatrix& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) -{ - - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &A, &ARchSymMatrix::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluSymStdEig:: -ARluSymStdEig(int nevp, ARchSymMatrix& A, - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->DefineParameters(A.ncols(), nevp, &A, &ARchSymMatrix::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - this->ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluSymStdEig& ARluSymStdEig:: -operator=(const ARluSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUSSYM_H diff --git a/src/external/arpack++/include/ardfmat.h b/src/external/arpack++/include/ardfmat.h deleted file mode 100644 index cacf6b4c..00000000 --- a/src/external/arpack++/include/ardfmat.h +++ /dev/null @@ -1,453 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARDFMat.h - Matrix template that generates a dense matrix from a file. - - ARPACK authors: - Richard Lehoucq - Kristyn Maschhoff - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - - -#ifndef ARDFMAT_H -#define ARDFMAT_H - -#include -#include -#include -#include -#include -#include -#include "arch.h" -#include "arerror.h" - - -template -class ARdfMatrix { - - private: - - // const int linelength = 256; - - std::string datafile; // Filename. - std::ifstream file; // File handler. - int m; // Number of rows. - int n; // Number of columns. - int blksize; // Size of each matrix block that is read at once. - int block; // Index of the matrix block that is to be read. - int nblocks; // Number of blocks the matrix contain. - int first; // First row/column stored in val. - int strows; // Number of rows actually stored in val. - int stcols; // Number of columns actually stored in val. - int headsize; // Number of lines in the heading part of the file - // (including the line that contains the matrix size). - bool roword; // A variable that indicates if the data will be read - // using a row-major or a column-major ordering. - ARTYPE* val; // Numerical values of matrix entries. - - void ConvertDouble(char* num); - - void SetComplexPointers(char* num, char* &realp, char* &imagp); - - bool ReadEntry(std::ifstream& file, double& val); - - bool ReadEntry(std::ifstream& file, float& val); - - bool ReadEntry(std::ifstream& file, arcomplex& val); - - bool ReadEntry(std::ifstream& file, arcomplex& val); - - public: - - bool IsDefined() const { return (m!=0); } - - bool IsOutOfCore() const { - return ((m!=0) && ((roword && (blksize -inline void ARdfMatrix::ConvertDouble(char* num) -{ - - char* pd; - - pd = strchr((char*)num,'D'); - if (pd) *pd = 'E'; - pd = strchr((char*)num,'d'); - if (pd) *pd = 'E'; - -} // ConvertDouble. - - -template -inline void ARdfMatrix:: -SetComplexPointers(char* num, char* &realp, char* &imagp) -{ - - realp = num; - while (*realp == ' ') realp++; - imagp = realp; - while (*imagp != ' ') imagp++; - -} // SetComplexPointers. - - -template -inline bool ARdfMatrix::ReadEntry(std::ifstream& file, double& val) -{ - - char num[LINELEN]; - char c; - - if (file.get((char*)num,LINELEN,'\n')) { - file.get(c); - ConvertDouble((char*)num); - val = atof((char*)num); - return true; - } - else { - return false; - } - -} // ReadEntry (double). - - -template -inline bool ARdfMatrix::ReadEntry(std::ifstream& file, float& val) -{ - - double dval; - bool ret; - - ret = ReadEntry(file, dval); - val = (float)dval; - return ret; - -} // ReadEntry (float). - - -template -inline bool ARdfMatrix:: -ReadEntry(std::ifstream& file, arcomplex& val) -{ - - char num[LINELEN]; - char c; - char *realp, *imagp; - - if (file.get((char*)num,LINELEN,'\n')) { - file.get(c); - SetComplexPointers((char*)num, realp, imagp); - ConvertDouble((char*)realp); - ConvertDouble((char*)imagp); - val = arcomplex(atof((char*)realp), atof((char*)imagp)); - return true; - } - else { - return false; - } - -} // ReadEntry (arcomplex). - - -template -inline bool ARdfMatrix:: -ReadEntry(std::ifstream& file, arcomplex& val) -{ - - char num[LINELEN]; - char c; - char *realp, *imagp; - - if (file.get((char*)num,LINELEN,'\n')) { - file.get(c); - SetComplexPointers((char*)num, realp, imagp); - ConvertDouble((char*)realp); - ConvertDouble((char*)imagp); - val = arcomplex(atof((char*)realp), atof((char*)imagp)); - return true; - } - else { - return false; - } - -} // ReadEntry (arcomplex). - - -template -void ARdfMatrix::Rewind() -{ - - char data[LINELEN]; - char c; - - file.seekg(0); - block = 0; - first = 0; - strows = 0; - stcols = 0; - - // Skipping the header. - - for (int i=0; i -void ARdfMatrix::ReadBlock() -{ - - int i, j, last; - ARTYPE value; - - // Repositioning the file pointer if block == 0. - - if (block == 0) Rewind(); - - // Reading a block. - - first = (block++)*blksize; // First row/column to be read. - last = first+blksize; // First row/column of the next block. - - if (roword) { - - // Adjusting last if we are going to read the last block. - - if (last > m) { - last = m; - block = 0; - } - last -= first; - strows = last; - stcols = n; - - // Reading matrix data. - - for (i=0; i n) { - last = n; - block = 0; - } - last -= first; - strows = m; - stcols = last; - - // Reading matrix data. - - j = 0; - while ((j < m*last) && (ReadEntry(file, value))) { - val[j++] = value; - } - - // Exiting if the file is corrupted. - - if (j < m*last) { - throw ArpackError(ArpackError::UNEXPECTED_EOF, "ARdfMatrix"); - } - - } - -} // ReadBlock. - - -template -void ARdfMatrix::Define(const std::string& filename, int blksizep) -{ - - // Declaring variables. - - char c; - char data[LINELEN]; - - // Opening the file. - - datafile = filename; - file.open(datafile.c_str()); - - if (!file) { - throw ArpackError(ArpackError::CANNOT_OPEN_FILE, "ARdfMatrix"); - } - - // Setting initial values. - - blksize = blksizep; - block = 0; - headsize = 0; - first = 0; - strows = 0; - stcols = 0; - - // Reading the file heading. - - do { - file.get((char*)data,LINELEN,'\n'); - file.get(c); - headsize++; - } - while (data[0] == '%'); - - // Reading m and n or returning if a problem was detected. - - if (sscanf(data, "%d %d", &m, &n) != 2) { - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARdfMatrix"); - } - if ((m<1) || (n<1)) { - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARdfMatrix"); - } - - // Defining roword. - - roword = ((blksize != 0) && (m > n)); - - // (Re)Dimensioning val. - - if (val != NULL) delete[] val; - - if (blksize == 0) { - - // Redefining blksize and reading the entire matrix. - - blksize = n; - nblocks = 1; - val = new ARTYPE[m*blksize]; - ReadBlock(); - - } - else if (roword) { - - // m >> n, so we will read only blksize rows (but not now). - - if (blksize > m) blksize = m; - nblocks = (m+blksize-1)/blksize; - val = new ARTYPE[blksize*n]; - if (blksize == m) ReadBlock(); - - } - else { - - // n >> m, so we will read only blksize columns (but not now). - - if (blksize > n) blksize = n; - nblocks = (n+blksize-1)/blksize; - val = new ARTYPE[m*blksize]; - if (blksize == n) ReadBlock(); - - } - -} // Define. - - -template -ARdfMatrix::ARdfMatrix() -{ - - m = 0; - n = 0; - block = 0; - blksize = 0; - headsize = 0; - first = 0; - strows = 0; - stcols = 0; - roword = false; - val = NULL; - -} // Short constructor. - - -template -ARdfMatrix::ARdfMatrix(const std::string& filename, int blksizep) -{ - - val = NULL; - Define(filename, blksizep); - -} // Long constructor. - - -template -ARdfMatrix::~ARdfMatrix() -{ - - if (val != NULL) delete[] val; - -} // Destructor. - - -#endif // ARDFMAT_H - diff --git a/src/external/arpack++/include/ardgcomp.h b/src/external/arpack++/include/ardgcomp.h deleted file mode 100644 index 41240dce..00000000 --- a/src/external/arpack++/include/ardgcomp.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARDGComp.h. - Arpack++ class ARluCompGenEig definition - (dense matrix version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARDGCOMP_H -#define ARDGCOMP_H - -#include -#include -#include "arch.h" -#include "ardnsmat.h" -#include "ardnspen.h" -#include "arrseig.h" -#include "argcomp.h" - - -template -class ARluCompGenEig: - public virtual - ARCompGenEig, ARFLOAT >, - ARdsNonSymPencil, ARFLOAT > > { - - private: - - // a) Data structure used to store matrices. - - ARdsNonSymPencil, ARFLOAT > Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluCompGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(arcomplex sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(arcomplex sigmap); - - // c.2) Constructors and destructor. - - ARluCompGenEig() { } - // Short constructor. - - ARluCompGenEig(int nevp, ARdsNonSymMatrix, ARFLOAT>& A, - ARdsNonSymMatrix, ARFLOAT>& B, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluCompGenEig(int nevp, ARdsNonSymMatrix, ARFLOAT>& A, - ARdsNonSymMatrix, ARFLOAT>& B, - arcomplex sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluCompGenEig(const ARluCompGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluCompGenEig() { } - - // d) Operators. - - ARluCompGenEig& operator=(const ARluCompGenEig& other); - // Assignment operator. - -}; // class ARluCompGenEig. - - -// ------------------------------------------------------------------------ // -// ARluCompGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluCompGenEig:: -Copy(const ARluCompGenEig& other) -{ - - ARCompGenEig, ARFLOAT >, - ARdsNonSymPencil, ARFLOAT> >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - -} // Copy. - - -template -inline void ARluCompGenEig:: -ChangeShift(arcomplex sigmaRp) -{ - - this->objOP->FactorAsB(sigmaRp); - ARrcStdEig >::ChangeShift(sigmaRp); - -} // ChangeShift. - - -template -inline void ARluCompGenEig::SetRegularMode() -{ - - ARStdEig, - ARdsNonSymPencil, ARFLOAT> >:: - SetRegularMode(&Pencil, - &ARdsNonSymPencil, ARFLOAT>::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluCompGenEig:: -SetShiftInvertMode(arcomplex sigmap) -{ - - ARCompGenEig, ARFLOAT>, - ARdsNonSymPencil, ARFLOAT> >:: - SetShiftInvertMode(sigmap, &Pencil, - &ARdsNonSymPencil,ARFLOAT>::MultInvAsBv); - -} // SetShiftInvertMode. - - -template -inline ARluCompGenEig:: -ARluCompGenEig(int nevp, ARdsNonSymMatrix, ARFLOAT>& A, - ARdsNonSymMatrix, ARFLOAT>& B, const std::string& whichp, - int ncvp, ARFLOAT tolp, int maxitp, - arcomplex* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARdsNonSymPencil, ARFLOAT>::MultInvBAv, - &Pencil, - &ARdsNonSymPencil, ARFLOAT>::MultBv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluCompGenEig:: -ARluCompGenEig(int nevp, ARdsNonSymMatrix, ARFLOAT>& A, - ARdsNonSymMatrix, ARFLOAT>& B, - arcomplex sigmap, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, arcomplex* residp, - bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARdsNonSymPencil, ARFLOAT>::MultInvAsBv, - &Pencil, - &ARdsNonSymPencil, ARFLOAT>::MultBv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - SetShiftInvertMode(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluCompGenEig& ARluCompGenEig:: -operator=(const ARluCompGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARDGCOMP_H diff --git a/src/external/arpack++/include/ardgnsym.h b/src/external/arpack++/include/ardgnsym.h deleted file mode 100644 index ec9c60bd..00000000 --- a/src/external/arpack++/include/ardgnsym.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARDGNSym.h. - Arpack++ class ARluNonSymGenEig definition - (dense matrix version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARDGNSYM_H -#define ARDGNSYM_H - -#include -#include -#include "arch.h" -#include "ardnsmat.h" -#include "ardnspen.h" -#include "argnsym.h" - - -template -class ARluNonSymGenEig: - public virtual ARNonSymGenEig, - ARdsNonSymPencil > { - - private: - - // a) Data structure used to store matrices. - - ARdsNonSymPencil Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluNonSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp = 0.0); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - virtual void SetComplexShiftMode(char partp, ARFLOAT sigmaRp,ARFLOAT sigmaIp); - - // c.2) Constructors and destructor. - - ARluNonSymGenEig() { } - // Short constructor. - - ARluNonSymGenEig(int nevp, ARdsNonSymMatrix& A, - ARdsNonSymMatrix& B, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluNonSymGenEig(int nevp, ARdsNonSymMatrix& A, - ARdsNonSymMatrix& B, ARFLOAT sigma, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (real shift and invert mode). - - ARluNonSymGenEig(int nevp, ARdsNonSymMatrix& A, - ARdsNonSymMatrix& B, char partp, - ARFLOAT sigmaRp, ARFLOAT sigmaIp, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (complex shift and invert mode). - - ARluNonSymGenEig(const ARluNonSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluNonSymGenEig() { } - // Destructor. - - // d) Operators. - - ARluNonSymGenEig& operator=(const ARluNonSymGenEig& other); - // Assignment operator. - -}; // class ARluNonSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARluNonSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluNonSymGenEig:: -Copy(const ARluNonSymGenEig& other) -{ - - ARNonSymGenEig, - ARdsNonSymPencil >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - this->objA = &Pencil; - -} // Copy. - - -template -inline void ARluNonSymGenEig:: -ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp) -{ - - if (sigmaIp == 0.0) { - this->objOP->FactorAsB(sigmaRp); - } - else { - this->objOP->FactorAsB(sigmaRp, sigmaIp, this->part); - } - ARrcNonSymGenEig::ChangeShift(sigmaRp, sigmaIp); - -} // ChangeShift. - - -template -inline void ARluNonSymGenEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(&Pencil, &ARdsNonSymPencil::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluNonSymGenEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARNonSymGenEig, - ARdsNonSymPencil >:: - SetShiftInvertMode(sigmap, &Pencil, - &ARdsNonSymPencil::MultInvAsBv); - -} // SetShiftInvertMode. - - -template -inline void ARluNonSymGenEig:: -SetComplexShiftMode(char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp) -{ - - ARNonSymGenEig, - ARdsNonSymPencil >:: - SetComplexShiftMode(partp, sigmaRp, sigmaIp, &Pencil, - &ARdsNonSymPencil::MultInvAsBv, - &Pencil, &ARdsNonSymPencil::MultAv); - -} // SetComplexShiftMode. - - -template -inline ARluNonSymGenEig:: -ARluNonSymGenEig(int nevp, ARdsNonSymMatrix& A, - ARdsNonSymMatrix& B, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARdsNonSymPencil::MultInvBAv, &Pencil, - &ARdsNonSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluNonSymGenEig:: -ARluNonSymGenEig(int nevp, ARdsNonSymMatrix& A, - ARdsNonSymMatrix& B, ARFLOAT sigmap, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARdsNonSymPencil::MultInvAsBv, &Pencil, - &ARdsNonSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - SetShiftInvertMode(sigmap); - -} // Long constructor (real shift and invert mode). - - -template -inline ARluNonSymGenEig:: -ARluNonSymGenEig(int nevp, ARdsNonSymMatrix& A, - ARdsNonSymMatrix& B, - char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp, const std::string& whichp, - int ncvp, ARFLOAT tolp, int maxitp, ARFLOAT* residp, - bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARdsNonSymPencil::MultInvAsBv, &Pencil, - &ARdsNonSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - SetComplexShiftMode(partp, sigmaRp, sigmaIp); - -} // Long constructor (complex shift and invert mode). - - -template -ARluNonSymGenEig& ARluNonSymGenEig:: -operator=(const ARluNonSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARDGNSYM_H diff --git a/src/external/arpack++/include/ardgsym.h b/src/external/arpack++/include/ardgsym.h deleted file mode 100644 index 31600802..00000000 --- a/src/external/arpack++/include/ardgsym.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARDGSym.h. - Arpack++ class ARluSymGenEig definition - (dense matrix version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARDGSYM_H -#define ARDGSYM_H - -#include -#include -#include "arch.h" -#include "ardsmat.h" -#include "ardspen.h" -#include "argsym.h" - - -template -class ARluSymGenEig: - public virtual ARSymGenEig, - ARdsSymPencil > { - - private: - - // a) Data structure used to store matrices. - - ARdsSymPencil Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmap); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - virtual void SetBucklingMode(ARFLOAT sigmap); - - virtual void SetCayleyMode(ARFLOAT sigmap); - - // c.2) Constructors and destructor. - - ARluSymGenEig() { } - // Short constructor. - - ARluSymGenEig(int nevp, ARdsSymMatrix& A, - ARdsSymMatrix& B, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluSymGenEig(char InvertModep, int nevp, ARdsSymMatrix& A, - ARdsSymMatrix& B, ARFLOAT sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert, buckling and Cayley modes). - - ARluSymGenEig(const ARluSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluSymGenEig() { } - // Destructor. - - // d) Operators. - - ARluSymGenEig& operator=(const ARluSymGenEig& other); - // Assignment operator. - -}; // class ARluSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARluSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluSymGenEig:: -Copy(const ARluSymGenEig& other) -{ - - ARSymGenEig, - ARdsSymPencil >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - this->objA = &Pencil; - -} // Copy. - - -template -inline void ARluSymGenEig::ChangeShift(ARFLOAT sigmap) -{ - - this->objOP->FactorAsB(sigmap); - ARrcSymGenEig::ChangeShift(sigmap); - -} // ChangeShift. - - -template -inline void ARluSymGenEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(&Pencil, &ARdsSymPencil::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluSymGenEig:: -SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARdsSymPencil >:: - SetShiftInvertMode(sigmap, &Pencil, &ARdsSymPencil::MultInvAsBv); - this->ChangeMultBx(&Pencil, &ARdsSymPencil::MultBv); - -} // SetShiftInvertMode. - - -template -inline void ARluSymGenEig:: -SetBucklingMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARdsSymPencil >:: - SetBucklingMode(sigmap, &Pencil, &ARdsSymPencil::MultInvAsBv); - this->ChangeMultBx(&Pencil, &ARdsSymPencil::MultAv); - -} // SetBucklingMode. - - -template -inline void ARluSymGenEig:: -SetCayleyMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARdsSymPencil >:: - SetCayleyMode(sigmap, &Pencil, &ARdsSymPencil::MultInvAsBv, - &Pencil, &ARdsSymPencil::MultAv); - this->ChangeMultBx(&Pencil, &ARdsSymPencil::MultBv); - -} // SetCayleyMode. - - -template -inline ARluSymGenEig:: -ARluSymGenEig(int nevp, ARdsSymMatrix& A, - ARdsSymMatrix& B, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->InvertMode = 'S'; - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARdsSymPencil::MultInvBAv, &Pencil, - &ARdsSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluSymGenEig:: -ARluSymGenEig(char InvertModep, int nevp, ARdsSymMatrix& A, - ARdsSymMatrix& B, ARFLOAT sigmap, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARdsSymPencil::MultInvAsBv, &Pencil, - &ARdsSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - this->InvertMode = this->CheckInvertMode(InvertModep); - switch (this->InvertMode) { - case 'B': - this->ChangeMultBx(&Pencil, &ARdsSymPencil::MultAv); - case 'S': - ChangeShift(sigmap); - break; - case 'C': - SetCayleyMode(sigmap); - } - -} // Long constructor (shift and invert, buckling and Cayley modes). - - -template -ARluSymGenEig& ARluSymGenEig:: -operator=(const ARluSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARDGSYM_H diff --git a/src/external/arpack++/include/ardnsmat.h b/src/external/arpack++/include/ardnsmat.h deleted file mode 100644 index a2436b93..00000000 --- a/src/external/arpack++/include/ardnsmat.h +++ /dev/null @@ -1,622 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARDNSMat.h. - Arpack++ class ARdsNonSymMatrix definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - - -#include "ardnspen.h" - -#ifndef ARDNSMAT_H -#define ARDNSMAT_H - -#include -#include -#include "arch.h" -#include "armat.h" -#include "arerror.h" -#include "blas1c.h" -#include "lapackc.h" -#include "ardfmat.h" - -template class ARdsNonSymPencil; - -template -class ARdsNonSymMatrix: public ARMatrix { - - friend class ARdsNonSymPencil; - friend class ARdsNonSymPencil; - - protected: - - bool factored; - int info; - int* ipiv; - ARTYPE* A; - ARTYPE* Ainv; - ARdfMatrix mat; - - void ClearMem(); - - virtual void Copy(const ARdsNonSymMatrix& other); - - void CreateStructure(); - - void ThrowError(); - - public: - - bool IsFactored() { return factored; } - - void FactorA(); - - void FactorAsI(ARTYPE sigma); - - void MultMv(ARTYPE* v, ARTYPE* w); - - void MultMtv(ARTYPE* v, ARTYPE* w); - - void MultMtMv(ARTYPE* v, ARTYPE* w); - - void MultMMtv(ARTYPE* v, ARTYPE* w); - - void Mult0MMt0v(ARTYPE* v, ARTYPE* w); - - void MultInvv(ARTYPE* v, ARTYPE* w); - - void DefineMatrix(int np, ARTYPE* Ap); - - void DefineMatrix(int mp, int np, ARTYPE* Ap); - - ARdsNonSymMatrix(): ARMatrix() { factored = false; } - // Short constructor that does nothing. - - ARdsNonSymMatrix(int np, ARTYPE* Ap); - // Long constructor (square matrix). - - ARdsNonSymMatrix(int mp, int np, ARTYPE* Ap); - // Long constructor (rectangular matrix). - - ARdsNonSymMatrix(const std::string& file, int blksizep = 0); - // Long constructor (Matrix stored in a file). - - ARdsNonSymMatrix(const ARdsNonSymMatrix& other) { Copy(other); } - // Copy constructor. - - virtual ~ARdsNonSymMatrix() { ClearMem(); } - // Destructor. - - ARdsNonSymMatrix& operator=(const ARdsNonSymMatrix& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARdsNonSymMatrix member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARdsNonSymMatrix::ClearMem() -{ - - if (factored) { - delete[] Ainv; - delete[] ipiv; - Ainv = NULL; - ipiv = NULL; - } - -} // ClearMem. - - -template -inline void ARdsNonSymMatrix:: -Copy(const ARdsNonSymMatrix& other) -{ - - // Copying very fundamental variables and user-defined parameters. - - this->m = other.m; - this->n = other.n; - this->defined = other.defined; - factored = other.factored; - info = other.info; - A = other.A; - - // Copying mat. - - if (other.mat.IsDefined()) { - mat.Define(other.mat.Filename(),other.mat.BlockSize()); - } - - // Returning from here if "other" was not factored. - - if (!factored) return; - - // Copying vectors. - - Ainv = new ARTYPE[this->m*this->n]; - ipiv = new int[this->n]; - - copy(this->m*this->n, other.Ainv, 1, Ainv, 1); - for (int i=0; in; i++) ipiv[i] = other.ipiv[i]; - -} // Copy. - - -template -inline void ARdsNonSymMatrix::CreateStructure() -{ - - ClearMem(); - Ainv = new ARTYPE[this->m*this->n]; - ipiv = new int[this->n]; - -} // CreateStructure. - - -template -inline void ARdsNonSymMatrix::ThrowError() -{ - - if (info < 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARdsNonSymMatrix::FactorA"); - } - else if (info) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARdsNonSymMatrix::FactorA"); - } - -} // ThrowError. - - -template -void ARdsNonSymMatrix::FactorA() -{ - - // Quitting the function if A was not defined or is rectangular. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARdsNonSymMatrix::FactorA"); - } - - if (this->m!=this->n) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARdsNonSymMatrix::FactorA"); - } - - if (mat.IsOutOfCore()) { - throw ArpackError(ArpackError::INSUFICIENT_MEMORY, - "ARdsNonSymMatrix::FactorA"); - } - - // Reserving memory for some vectors used in matrix decomposition. - - CreateStructure(); - - // Copying A to Ainv; - - ::copy(this->m*this->n, A, 1, Ainv, 1); - - // Decomposing A. - - getrf(this->m, this->n, Ainv, this->m, ipiv, info); - - // Handling errors. - - ThrowError(); - - factored = true; - -} // FactorA. - - -template -void ARdsNonSymMatrix::FactorAsI(ARTYPE sigma) -{ - - // Quitting the function if A was not defined or is rectangular. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARdsNonSymMatrix::FactorAsI"); - } - - if (this->m!=this->n) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARdsNonSymMatrix::FactorAsI"); - } - - if (mat.IsOutOfCore()) { - throw ArpackError(ArpackError::INSUFICIENT_MEMORY, - "ARdsNonSymMatrix::FactorAsI"); - } - - // Reserving memory for some vectors used in matrix decomposition. - - CreateStructure(); - - // Subtracting sigma*I from A. - - ::copy(this->m*this->n,A,1,Ainv,1); - for (int i=0; i<(this->m*this->n); i+=this->m+1) Ainv[i]-=sigma; - - // Decomposing AsI. - - getrf(this->m, this->n, Ainv, this->m, ipiv, info); - - // Handling errors. - - ThrowError(); - - factored = true; - -} // FactorAsI. - - -template -void ARdsNonSymMatrix::MultMv(ARTYPE* v, ARTYPE* w) -{ - - int i; - ARTYPE* t; - ARTYPE one; - ARTYPE zero; - - one = (ARTYPE)0 + 1.0; - zero = (ARTYPE)0; - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARdsNonSymMatrix::MultMv"); - } - - // Determining w = M.v. - - if (mat.IsOutOfCore()) { - - if (this->m>this->n) { - - // Matrix is "tall". - - mat.Rewind(); - for (i=0; in, one, mat.Entries(), - mat.RowsInMemory(), v, 1, zero, &w[mat.FirstIndex()], 1); - } - - } - else { - - // Matrix is "fat". - - mat.Rewind(); - t = new ARTYPE[mat.ColsInMemory()]; - for (i=0; im; i++) w[i] = zero; - for (i=0; im, mat.ColsInMemory(), one, mat.Entries(), - this->m, &v[mat.FirstIndex()], 1, zero, t, 1); - axpy(this->m, one, t, 1, w, 1); - } - delete[] t; - - } - - } - else { - - gemv("N", this->m, this->n, one, A, this->m, v, 1, zero, w, 1); - - } - -} // MultMv. - - -template -void ARdsNonSymMatrix::MultMtv(ARTYPE* v, ARTYPE* w) -{ - - int i; - ARTYPE* t; - ARTYPE one; - ARTYPE zero; - - one = (ARTYPE)0 + 1.0; - zero = (ARTYPE)0; - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARdsNonSymMatrix::MultMtv"); - } - - // Determining w = M'.v. - - if (mat.IsOutOfCore()) { - - if (this->m<=this->n) { - - // Matrix is "fat". - - mat.Rewind(); - for (i=0; im, mat.ColsInMemory(), one, mat.Entries(), - this->m, v, 1, zero, &w[mat.FirstIndex()], 1); - } - - } - else { - - // Matrix is "tall". - - mat.Rewind(); - t = new ARTYPE[mat.ColsInMemory()]; - for (i=0; im; i++) w[i] = zero; - for (i=0; in, one, mat.Entries(), - mat.RowsInMemory(), &v[mat.FirstIndex()], 1, zero, t, 1); - axpy(mat.RowsInMemory(), one, t, 1, w, 1); - } - delete[] t; - - } - - } - else { - - gemv("T", this->m, this->n, one, A, this->m, v, 1, zero, w, 1); - - } - - -} // MultMtv. - - -template -void ARdsNonSymMatrix::MultMtMv(ARTYPE* v, ARTYPE* w) -{ - - int i; - ARTYPE *t, *s; - ARTYPE one; - ARTYPE zero; - - one = (ARTYPE)0 + 1.0; - zero = (ARTYPE)0; - - if (mat.IsOutOfCore() && (this->m>this->n)) { - - // Special code for "tall" matrices. - - t = new ARTYPE[mat.BlockSize()]; - s = new ARTYPE[this->n]; - - mat.Rewind(); - for (i=0; in; i++) w[i] = zero; - for (i=0; in, one, mat.Entries(), - mat.RowsInMemory(), v, 1, zero, t, 1); - gemv("T", mat.RowsInMemory(), this->n, one, mat.Entries(), - mat.RowsInMemory(), t, 1, zero, s, 1); - axpy(this->n, one, s, 1, w, 1); - - } - - delete[] t; - delete[] s; - - } - else { - - t = new ARTYPE[this->m]; - - MultMv(v,t); - MultMtv(t,w); - - delete[] t; - - } - - -} // MultMtMv. - - -template -void ARdsNonSymMatrix::MultMMtv(ARTYPE* v, ARTYPE* w) -{ - - int i; - ARTYPE *t, *s; - ARTYPE one; - ARTYPE zero; - - one = (ARTYPE)0 + 1.0; - zero = (ARTYPE)0; - - if (mat.IsOutOfCore() && (this->m<=this->n)) { - - // Special code for "fat" matrices. - - t = new ARTYPE[mat.BlockSize()]; - s = new ARTYPE[this->m]; - - mat.Rewind(); - for (i=0; im; i++) w[i] = zero; - for (i=0; im, mat.ColsInMemory(), one, mat.Entries(), - this->m, v, 1, zero, t, 1); - gemv("N", this->m, mat.ColsInMemory(), one, mat.Entries(), - this->m, t, 1, zero, s, 1); - axpy(this->m, one, s, 1, w, 1); - - } - - delete[] t; - delete[] s; - - } - else { - - t = new ARTYPE[this->n]; - - MultMtv(v,t); - MultMv(t,w); - - delete[] t; - - } - -} // MultMMtv. - - -template -void ARdsNonSymMatrix::Mult0MMt0v(ARTYPE* v, ARTYPE* w) -{ - - MultMv(&v[this->m],w); - MultMtv(v,&w[this->m]); - -} // Mult0MMt0v. - - -template -void ARdsNonSymMatrix::MultInvv(ARTYPE* v, ARTYPE* w) -{ - - // Quitting the function if A (or AsI) was not factored. - - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARdsNonSymMatrix::MultInvv"); - } - - // Overwritting w with v. - - copy(this->n, v, 1, w, 1); - - // Solving A.w = v (or AsI.w = v). - - getrs("N", this->n, 1, Ainv, this->m, ipiv, w, this->m, info); - - // Handling errors. - - ThrowError(); - -} // MultInvv. - - -template -inline void ARdsNonSymMatrix:: -DefineMatrix(int np, ARTYPE* Ap) -{ - - // Defining member variables. - - this->n = np; - this->m = np; - A = Ap; - this->defined = true; - Ainv = NULL; - ipiv = NULL; - info = 0; - -} // DefineMatrix (square). - - -template -inline void ARdsNonSymMatrix:: -DefineMatrix(int mp, int np, ARTYPE* Ap) -{ - - // Defining member variables. - - this->m = mp; - this->n = np; - A = Ap; - this->defined = true; - Ainv = NULL; - ipiv = NULL; - info = 0; - -} // DefineMatrix (rectangular). - - -template -inline ARdsNonSymMatrix:: -ARdsNonSymMatrix(int np, ARTYPE* Ap) : ARMatrix(np) -{ - - factored = false; - DefineMatrix(np, Ap); - -} // Long constructor (square matrix). - - -template -inline ARdsNonSymMatrix:: -ARdsNonSymMatrix(int mp, int np, ARTYPE* Ap) : ARMatrix(mp, np) -{ - - factored = false; - DefineMatrix(mp, np, Ap); - -} // Long constructor (rectangular matrix). - - -template -ARdsNonSymMatrix::ARdsNonSymMatrix(const std::string& file, int blksizep) -{ - - factored = false; - - try { - mat.Define(file, blksizep); - } - catch (ArpackError) { // Returning from here if an error has occurred. - throw ArpackError(ArpackError::CANNOT_READ_FILE, "ARdsNonSymMatrix"); - } - - if (mat.NCols() == mat.NRows()) { - DefineMatrix(mat.NCols(), (ARTYPE*)mat.Entries()); - } - else { - DefineMatrix(mat.NRows(), mat.NCols(), (ARTYPE*)mat.Entries()); - } - -} // Long constructor (Matrix stored in a file). - - -template -ARdsNonSymMatrix& ARdsNonSymMatrix:: -operator=(const ARdsNonSymMatrix& other) -{ - - if (this != &other) { // Stroustrup suggestion. - ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARDNSMAT_H diff --git a/src/external/arpack++/include/ardnspen.h b/src/external/arpack++/include/ardnspen.h deleted file mode 100644 index 04d2bd41..00000000 --- a/src/external/arpack++/include/ardnspen.h +++ /dev/null @@ -1,324 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARDNSPen.h. - Arpack++ class ARdsNonSymPencil definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARDNSPEN_H -#define ARDNSPEN_H - -#include "arch.h" -#include "arerror.h" -#include "blas1c.h" -#include "lapackc.h" -#include "ardnsmat.h" - - -template -class ARdsNonSymPencil -{ - - protected: - - char part; - ARdsNonSymMatrix* A; - ARdsNonSymMatrix* B; - ARdsNonSymMatrix AsB; -#ifdef ARCOMP_H - ARdsNonSymMatrix, ARFLOAT> AsBc; -#endif - - virtual void Copy(const ARdsNonSymPencil& other); - - public: - -#ifdef ARCOMP_H - bool IsFactored() { return (AsB.IsFactored()||AsBc.IsFactored()); } -#else - bool IsFactored() { return AsB.IsFactored(); } -#endif - - void FactorAsB(ARTYPE sigma); - -#ifdef ARCOMP_H - void FactorAsB(ARFLOAT sigmaR, ARFLOAT sigmaI, char partp = 'R'); -#endif - - void MultAv(ARTYPE* v, ARTYPE* w) { A->MultMv(v,w); } - - void MultBv(ARTYPE* v, ARTYPE* w) { B->MultMv(v,w); } - - void MultInvBAv(ARTYPE* v, ARTYPE* w); - -#ifdef ARCOMP_H - void MultInvAsBv(arcomplex* v, arcomplex* w); -#endif - - void MultInvAsBv(ARFLOAT* v, ARFLOAT* w); - - void DefineMatrices(ARdsNonSymMatrix& Ap, - ARdsNonSymMatrix& Bp); - - ARdsNonSymPencil() { part = 'N'; } - // Short constructor that does nothing. - - ARdsNonSymPencil(ARdsNonSymMatrix& Ap, - ARdsNonSymMatrix& Bp); - // Long constructor. - - ARdsNonSymPencil(const ARdsNonSymPencil& other) { Copy(other); } - // Copy constructor. - - virtual ~ARdsNonSymPencil() { } - // Destructor. - - ARdsNonSymPencil& operator=(const ARdsNonSymPencil& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARdsNonSymPencil member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARdsNonSymPencil:: -Copy(const ARdsNonSymPencil& other) -{ - - part = other.part; - A = other.A; - B = other.B; - AsB = other.AsB; -#ifdef ARCOMP_H - AsBc = other.AsBc; -#endif - -} // Copy. - - -template -void ARdsNonSymPencil::FactorAsB(ARTYPE sigma) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARdsNonSymPencil::FactorAsB"); - } - - // Quitting the function if A and B are not square. - - if ((A->nrows() != A->ncols()) || (B->nrows() != B->ncols())) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARdsNonSymPencil::FactorAsB"); - } - - // Copying A to AsB if sigma = 0. - - if (sigma == (ARTYPE)0) { - - AsB = *A; - if (!AsB.IsFactored()) AsB.FactorA(); - return; - - } - - // Defining matrix AsB. - - if (!AsB.IsDefined()) { - AsB.DefineMatrix(A->ncols(), A->A); - } - - // Reserving memory for some vectors used in matrix decomposition. - - AsB.CreateStructure(); - - // Subtracting sigma*B from A and storing the result on AsB. - - ::copy(A->m*A->n, A->A, 1, AsB.Ainv, 1); - axpy(A->m*A->n, -sigma, B->A, 1, AsB.Ainv, 1); - - // Decomposing AsB. - - getrf(AsB.m, AsB.n, AsB.Ainv, AsB.m, AsB.ipiv, AsB.info); - - // Handling errors. - - AsB.ThrowError(); - - AsB.factored = true; - -} // FactorAsB (ARTYPE shift). - - -#ifdef ARCOMP_H -template -void ARdsNonSymPencil:: -FactorAsB(ARFLOAT sigmaR, ARFLOAT sigmaI, char partp) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARdsNonSymPencil::FactorAsB"); - } - - // Quitting the function if A and B are not square. - - if ((A->nrows() != A->ncols()) || (B->nrows() != B->ncols())) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARdsNonSymPencil::FactorAsB"); - } - - // Defining matrix AsB. - - if (!AsBc.IsDefined()) { - part = partp; - AsBc.DefineMatrix(A->ncols(), 0); - } - - // Reserving memory for some vectors used in matrix decomposition. - - AsBc.CreateStructure(); - - // Subtracting sigma*B from A and storing the result on AsBc. - - arcomplex sigma(sigmaR, sigmaI); - for (int i=0; i<(A->m*A->n); i++) AsBc.Ainv[i] = A->A[i]-sigma*B->A[i]; - - // Decomposing AsBc. - - getrf(AsBc.m, AsBc.n, AsBc.Ainv, AsBc.m, AsBc.ipiv, AsBc.info); - - // Handling errors. - - AsBc.ThrowError(); - - AsBc.factored = true; - -} // FactorAsB (arcomplex shift). -#endif // ARCOMP_H. - - -template -void ARdsNonSymPencil::MultInvBAv(ARTYPE* v, ARTYPE* w) -{ - - if (!B->IsFactored()) B->FactorA(); - - A->MultMv(v, w); - B->MultInvv(w, w); - -} // MultInvBAv. - - -#ifdef ARCOMP_H - -template -void ARdsNonSymPencil:: -MultInvAsBv(arcomplex* v, arcomplex* w) -{ - - AsB.MultInvv((ARTYPE*)v,(ARTYPE*)w); - -} // MultInvAsBv (arcomplex). - -#endif // ARCOMP_H. - - -template -void ARdsNonSymPencil::MultInvAsBv(ARFLOAT* v, ARFLOAT* w) -{ - - if (part == 'N') { // shift is real. - - AsB.MultInvv((ARTYPE*)v,(ARTYPE*)w); - - } - else { // shift is complex. - -#ifdef ARCOMP_H - - int i; - arcomplex *tv, *tw; - - tv = new arcomplex[AsBc.ncols()]; - tw = new arcomplex[AsBc.ncols()]; - - for (i=0; i!=AsBc.ncols(); i++) tv[i] = arcomplex(v[i], 0.0); - - AsBc.MultInvv(tv, tw); - - if (part=='I') { - for (i=0; i!=AsBc.ncols(); i++) w[i] = imag(tw[i]); - } - else { - for (i=0; i!=AsBc.ncols(); i++) w[i] = real(tw[i]); - } - - delete[] tv; - delete[] tw; - -#endif // ARCOMP_H. - - } - -} // MultInvAsBv (ARFLOAT). - - -template -inline void ARdsNonSymPencil:: -DefineMatrices(ARdsNonSymMatrix& Ap, - ARdsNonSymMatrix& Bp) -{ - - A = &Ap; - B = &Bp; - - if ((A->n != B->n)||(A->m != B->m)) { - throw ArpackError(ArpackError::INCOMPATIBLE_SIZES, - "ARdsNonSymMatrix::DefineMatrices"); - } - -} // DefineMatrices. - - -template -inline ARdsNonSymPencil:: -ARdsNonSymPencil(ARdsNonSymMatrix& Ap, - ARdsNonSymMatrix& Bp) -{ - - DefineMatrices(Ap, Bp); - -} // Long constructor. - - -template -ARdsNonSymPencil& ARdsNonSymPencil:: -operator=(const ARdsNonSymPencil& other) -{ - - if (this != &other) { // Stroustrup suggestion. - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARDNSPEN_H diff --git a/src/external/arpack++/include/ardscomp.h b/src/external/arpack++/include/ardscomp.h deleted file mode 100644 index 094f5840..00000000 --- a/src/external/arpack++/include/ardscomp.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARDSComp.h. - Arpack++ class ARluCompStdEig definition - (dense matrix version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARDSCOMP_H -#define ARDSCOMP_H - -#include -#include -#include "arch.h" -#include "arscomp.h" -#include "ardnsmat.h" -#include "arrseig.h" - - -template -class ARluCompStdEig: - public virtual ARCompStdEig, ARFLOAT> > { - - public: - - // a) Public functions: - - // a.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(arcomplex sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(arcomplex sigmap); - - // a.2) Constructors and destructor. - - ARluCompStdEig() { } - // Short constructor. - - ARluCompStdEig(int nevp, ARdsNonSymMatrix, ARFLOAT>& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluCompStdEig(int nevp, ARdsNonSymMatrix, ARFLOAT>& A, - arcomplex sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluCompStdEig(const ARluCompStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluCompStdEig() { } - // Destructor. - - - // b) Operators. - - ARluCompStdEig& operator=(const ARluCompStdEig& other); - // Assignment operator. - -}; // class ARluCompStdEig. - - -// ------------------------------------------------------------------------ // -// ARluCompStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluCompStdEig:: -ChangeShift(arcomplex sigmaRp) -{ - - this->objOP->FactorAsI(sigmaRp); - ARrcStdEig >::ChangeShift(sigmaRp); - -} // ChangeShift. - - -template -inline void ARluCompStdEig::SetRegularMode() -{ - - ARStdEig, - ARdsNonSymMatrix, ARFLOAT> >:: - SetRegularMode(this->objOP, - &ARdsNonSymMatrix, ARFLOAT>::MultMv); - -} // SetRegularMode. - - -template -inline void ARluCompStdEig:: -SetShiftInvertMode(arcomplex sigmap) -{ - - ARStdEig, - ARdsNonSymMatrix, ARFLOAT> >:: - SetShiftInvertMode(sigmap, this->objOP, - &ARdsNonSymMatrix,ARFLOAT>::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluCompStdEig:: -ARluCompStdEig(int nevp, ARdsNonSymMatrix, ARFLOAT>& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, arcomplex* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &A, - &ARdsNonSymMatrix, ARFLOAT>::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluCompStdEig:: -ARluCompStdEig(int nevp, ARdsNonSymMatrix, ARFLOAT>& A, - arcomplex sigmap, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, arcomplex* residp, - bool ishiftp) - -{ - - this->DefineParameters(A.ncols(), nevp, &A, - &ARdsNonSymMatrix, ARFLOAT>::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluCompStdEig& ARluCompStdEig:: -operator=(const ARluCompStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARDSCOMP_H diff --git a/src/external/arpack++/include/ardsmat.h b/src/external/arpack++/include/ardsmat.h deleted file mode 100644 index 1b16ae23..00000000 --- a/src/external/arpack++/include/ardsmat.h +++ /dev/null @@ -1,357 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARDSMat.h. - Arpack++ class ARdsSymMatrix definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - - -#include "ardspen.h" - -#ifndef ARDSMAT_H -#define ARDSMAT_H - -#include - -#include "arch.h" -#include "armat.h" -#include "arerror.h" -#include "blas1c.h" -#include "lapackc.h" - -template class ARdsSymPencil; - -template -class ARdsSymMatrix: public ARMatrix { - - friend class ARdsSymPencil; - - protected: - - bool factored; - char uplo; - int info; - int* ipiv; - ARTYPE* A; - ARTYPE* Ainv; - - void ClearMem(); - - virtual void Copy(const ARdsSymMatrix& other); - - void SubtractAsI(ARTYPE sigma); - - void CreateStructure(); - - void ThrowError(); - - public: - - bool IsFactored() { return factored; } - - void FactorA(); - - void FactorAsI(ARTYPE sigma); - - void MultMv(ARTYPE* v, ARTYPE* w); - - void MultInvv(ARTYPE* v, ARTYPE* w); - - void DefineMatrix(int np, ARTYPE* Ap, char uplop = 'L'); - - ARdsSymMatrix(): ARMatrix() { factored = false; } - // Short constructor that does nothing. - - ARdsSymMatrix(int np, ARTYPE* Ap, char uplop = 'L'); - // Long constructor. - - ARdsSymMatrix(const ARdsSymMatrix& other) { Copy(other); } - // Copy constructor. - - virtual ~ARdsSymMatrix() { ClearMem(); } - // Destructor. - - ARdsSymMatrix& operator=(const ARdsSymMatrix& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARdsSymMatrix member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARdsSymMatrix::ClearMem() -{ - - if (factored) { - delete[] Ainv; - delete[] ipiv; - Ainv = NULL; - ipiv = NULL; - } - -} // ClearMem. - - -template -inline void ARdsSymMatrix:: -Copy(const ARdsSymMatrix& other) -{ - - // Copying very fundamental variables and user-defined parameters. - - this->m = other.m; - this->n = other.n; - this->defined = other.defined; - factored = other.factored; - uplo = other.uplo; - info = other.info; - A = other.A; - - // Returning from here if "other" was not factored. - - if (!factored) return; - - // Copying vectors. - - Ainv = new ARTYPE[(this->n*this->n+this->n)/2]; - ipiv = new int[this->n]; - - copy((this->n*this->n+this->n)/2, other.Ainv, 1, Ainv, 1); - for (int i=0; in; i++) ipiv[i] = other.ipiv[i]; - -} // Copy. - - -template -void ARdsSymMatrix::SubtractAsI(ARTYPE sigma) -{ - - int i,j; - - // Copying A to Ainv. - - ::copy((this->n*this->n+this->n)/2 ,A, 1, Ainv, 1); - - // Subtracting sigma from diagonal elements. - - if (uplo=='L') { - for (i=0, j=0; in; j+=(this->n-(i++))) Ainv[j] -= sigma; - } - else { - for (i=0, j=0; in; j+=(++i)) Ainv[j] -= sigma; - } - -} // SubtractAsI. - - -template -inline void ARdsSymMatrix::CreateStructure() -{ - - ClearMem(); - Ainv = new ARTYPE[(this->n*this->n+this->n)/2]; - ipiv = new int[this->n]; - -} // CreateStructure. - - -template -inline void ARdsSymMatrix::ThrowError() -{ - - if (info < 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARdsSymMatrix::FactorA"); - } - else if (info) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARdsSymMatrix::FactorA"); - } - -} // ThrowError. - - -template -void ARdsSymMatrix::FactorA() -{ - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARdsSymMatrix::FactorA"); - } - - // Reserving memory for some vectors used in matrix decomposition. - - CreateStructure(); - - // Copying A to Ainv; - - ::copy((this->n*this->n+this->n)/2 ,A, 1, Ainv, 1); - - // Decomposing A. - - sptrf(&uplo, this->n, Ainv, ipiv, info); - - // Handling errors. - - ThrowError(); - - factored = true; - -} // FactorA. - - -template -void ARdsSymMatrix::FactorAsI(ARTYPE sigma) -{ - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARdsSymMatrix::FactorAsI"); - } - - // Reserving memory for some vectors used in matrix decomposition. - - CreateStructure(); - - // Subtracting sigma*I from A. - - SubtractAsI(sigma); - - // Decomposing AsI. - - sptrf(&uplo, this->n, Ainv, ipiv, info); - - // Handling errors. - - ThrowError(); - - factored = true; - -} // FactorAsI. - - -template -void ARdsSymMatrix::MultMv(ARTYPE* v, ARTYPE* w) -{ - - int i, j; - - ARTYPE zero = (ARTYPE)0; - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARdsSymMatrix::MultMv"); - } - - // Determining w = M.v (unfortunately, the BLAS does not - // have a routine that works with packed matrices). - - for (i=0; in; i++) w[i] = zero; - - if (uplo=='L') { - - for (i=0, j=0; in; j+=(this->n-(i++))) { - w[i] += dot(this->n-i, &A[j], 1, &v[i], 1); - axpy(this->n-i-1, v[i], &A[j+1], 1, &w[i+1], 1); - } - - } - else { // uplo = 'U' - - for (i=0, j=0; in; j+=(++i)) { - w[i] += dot(i+1, &A[j], 1, v, 1); - axpy(i, v[i], &A[j], 1, w, 1); - } - - } - -} // MultMv. - - -template -void ARdsSymMatrix::MultInvv(ARTYPE* v, ARTYPE* w) -{ - - // Quitting the function if A (or AsI) was not factored. - - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARdsSymMatrix::MultInvv"); - } - - // Overwritting w with v. - - copy(this->n, v, 1, w, 1); - - // Solving A.w = v (or AsI.w = v). - - sptrs(&uplo, this->n, 1, Ainv, ipiv, w, this->n, info); - - // Handling errors. - - ThrowError(); - -} // MultInvv. - - -template -inline void ARdsSymMatrix:: -DefineMatrix(int np, ARTYPE* Ap, char uplop) -{ - - // Defining member variables. - - this->m = np; - this->n = np; - uplo = uplop; - A = Ap; - this->defined = true; - Ainv = NULL; - ipiv = NULL; - info = 0; - -} // DefineMatrix. - - -template -inline ARdsSymMatrix:: -ARdsSymMatrix(int np, ARTYPE* Ap, char uplop) : ARMatrix(np) -{ - - factored = false; - DefineMatrix(np, Ap, uplop); - -} // Long constructor. - - -template -ARdsSymMatrix& ARdsSymMatrix:: -operator=(const ARdsSymMatrix& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARDSMAT_H diff --git a/src/external/arpack++/include/ardsnsym.h b/src/external/arpack++/include/ardsnsym.h deleted file mode 100644 index fc2afe26..00000000 --- a/src/external/arpack++/include/ardsnsym.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARDSNSym.h. - Arpack++ class ARluNonSymStdEig definition - (dense matrix version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARDSNSYM_H -#define ARDSNSYM_H - -#include -#include -#include "arch.h" -#include "arsnsym.h" -#include "ardnsmat.h" - - -template -class ARluNonSymStdEig: - public virtual ARNonSymStdEig > { - - public: - - // a) Public functions: - - // a.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - // a.2) Constructors and destructor. - - ARluNonSymStdEig() { } - // Short constructor. - - ARluNonSymStdEig(int nevp, ARdsNonSymMatrix& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluNonSymStdEig(int nevp, ARdsNonSymMatrix& A, - ARFLOAT sigma, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluNonSymStdEig(const ARluNonSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluNonSymStdEig() { } - // Destructor. - - // b) Operators. - - ARluNonSymStdEig& operator=(const ARluNonSymStdEig& other); - // Assignment operator. - -}; // class ARluNonSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARluNonSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluNonSymStdEig:: -ChangeShift(ARFLOAT sigmaRp) -{ - - this->sigmaR = sigmaRp; - this->sigmaI = 0.0; - this->mode = 3; - this->iparam[7] = this->mode; - - this->objOP->FactorAsI(this->sigmaR); - this->Restart(); - -} // ChangeShift. - - -template -inline void ARluNonSymStdEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(this->objOP, &ARdsNonSymMatrix::MultMv); - -} // SetRegularMode. - - -template -inline void ARluNonSymStdEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARStdEig >:: - SetShiftInvertMode(sigmap, this->objOP, - &ARdsNonSymMatrix::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluNonSymStdEig:: -ARluNonSymStdEig(int nevp, ARdsNonSymMatrix& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &A, - &ARdsNonSymMatrix::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluNonSymStdEig:: -ARluNonSymStdEig(int nevp, ARdsNonSymMatrix& A, - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->DefineParameters(A.ncols(), nevp, &A, - &ARdsNonSymMatrix::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluNonSymStdEig& ARluNonSymStdEig:: -operator=(const ARluNonSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARDSNSYM_H diff --git a/src/external/arpack++/include/ardspen.h b/src/external/arpack++/include/ardspen.h deleted file mode 100644 index 4e16b82b..00000000 --- a/src/external/arpack++/include/ardspen.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARDSPen.h. - Arpack++ class ARdsSymPencil definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARDSPEN_H -#define ARDSPEN_H - -#include "arch.h" -#include "arerror.h" -#include "blas1c.h" -#include "lapackc.h" -#include "ardsmat.h" - - -template -class ARdsSymPencil -{ - - protected: - - ARdsSymMatrix* A; - ARdsSymMatrix* B; - ARdsSymMatrix AsB; - - virtual void Copy(const ARdsSymPencil& other); - - void SubtractAsB(ARTYPE sigma); - - public: - - bool IsFactored() { return AsB.IsFactored(); } - - void FactorAsB(ARTYPE sigma); - - void MultAv(ARTYPE* v, ARTYPE* w) { A->MultMv(v,w); } - - void MultBv(ARTYPE* v, ARTYPE* w) { B->MultMv(v,w); } - - void MultInvBAv(ARTYPE* v, ARTYPE* w); - - void MultInvAsBv(ARTYPE* v, ARTYPE* w) { AsB.MultInvv(v,w); } - - void DefineMatrices(ARdsSymMatrix& Ap, ARdsSymMatrix& Bp); - - ARdsSymPencil() { AsB.factored = false; } - // Short constructor that does nothing. - - ARdsSymPencil(ARdsSymMatrix& Ap, ARdsSymMatrix& Bp); - // Long constructor. - - ARdsSymPencil(const ARdsSymPencil& other) { Copy(other); } - // Copy constructor. - - virtual ~ARdsSymPencil() { } - // Destructor. - - ARdsSymPencil& operator=(const ARdsSymPencil& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARdsSymPencil member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARdsSymPencil::Copy(const ARdsSymPencil& other) -{ - - A = other.A; - B = other.B; - AsB = other.AsB; - -} // Copy. - - -template -void ARdsSymPencil::SubtractAsB(ARTYPE sigma) -{ - - int sizeA, i, j, k, l; - - // Copying A into AsB. - - sizeA = (A->ncols()*A->ncols()+A->ncols())/2; - ::copy(sizeA, A->A, 1, AsB.Ainv, 1); - - // Returning if sigma == 0. - - if (sigma == (ARTYPE)0) return; - - // Subtracting sigma*B. - - if (A->uplo == B->uplo) { - - axpy(sizeA, -sigma, B->A, 1, AsB.Ainv, 1); - - } - else if (A->uplo == 'L') { // B->uplo == 'U' - - j = 0; - for (i=0; in; i++) { - for (l=i+1, k=(l*l+l)/2-1; l<=A->n; k+=(l++)) { - AsB.Ainv[j++]-=sigma*B->A[k]; - } - } - - } - else { // A->uplo == 'U' && B->uplo == 'L' - - j = 0; - for (i=0; in; i++) { - for (l=i+1, k=(l*l+l)/2-1; l<=A->n; k+=(l++)) { - AsB.Ainv[k]-=sigma*B->A[j++]; - } - } - - } - -} // SubtractAsB (ARTYPE shift). - - -template -void ARdsSymPencil::FactorAsB(ARTYPE sigma) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARdsSymPencil::FactorAsB"); - } - - // Copying A to AsB if sigma = 0. - - if (sigma == (ARTYPE)0) { - - AsB = *A; - if (!AsB.IsFactored()) AsB.FactorA(); - return; - - } - - // Defining matrix AsB. - - if (!AsB.IsDefined()) { - AsB.DefineMatrix(A->ncols(), A->A, A->uplo); - } - - // Reserving memory for some vectors used in matrix decomposition. - - AsB.CreateStructure(); - - // Subtracting sigma*B from A and storing the result on AsB. - - SubtractAsB(sigma); - - // Decomposing AsB. - - sptrf(&AsB.uplo, AsB.n, AsB.Ainv, AsB.ipiv, AsB.info); - - // Handling errors. - - AsB.ThrowError(); - - AsB.factored = true; - -} // FactorAsB (ARTYPE shift). - - -template -void ARdsSymPencil::MultInvBAv(ARTYPE* v, ARTYPE* w) -{ - - if (!B->IsFactored()) B->FactorA(); - - A->MultMv(v, w); - copy(A->ncols(), w, 1, v, 1); - B->MultInvv(w, w); - -} // MultInvBAv. - - -template -inline void ARdsSymPencil:: -DefineMatrices(ARdsSymMatrix& Ap, ARdsSymMatrix& Bp) -{ - - A = &Ap; - B = &Bp; - - if ((A->n != B->n)||(A->m != B->m)) { - throw ArpackError(ArpackError::INCOMPATIBLE_SIZES, - "ARdsNonSymMatrix::DefineMatrices"); - } - -} // DefineMatrices. - - -template -inline ARdsSymPencil:: -ARdsSymPencil(ARdsSymMatrix& Ap, ARdsSymMatrix& Bp) -{ - - AsB.factored = false; - DefineMatrices(Ap, Bp); - -} // Long constructor. - - -template -ARdsSymPencil& ARdsSymPencil:: -operator=(const ARdsSymPencil& other) -{ - - if (this != &other) { // Stroustrup suggestion. - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARDSPEN_H diff --git a/src/external/arpack++/include/ardssym.h b/src/external/arpack++/include/ardssym.h deleted file mode 100644 index faee7855..00000000 --- a/src/external/arpack++/include/ardssym.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARDSSym.h. - Arpack++ class ARluSymStdEig definition - (dense matrix version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARDSSYM_H -#define ARDSSYM_H - -#include -#include -#include "arch.h" -#include "arssym.h" -#include "ardsmat.h" - - -template -class ARluSymStdEig: - public virtual ARSymStdEig > { - - public: - - // a) Public functions: - - // a.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - // a.2) Constructors and destructor. - - ARluSymStdEig() { } - // Short constructor. - - ARluSymStdEig(int nevp, ARdsSymMatrix& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluSymStdEig(int nevp, ARdsSymMatrix& A, - ARFLOAT sigma, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluSymStdEig(const ARluSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluSymStdEig() { } - // Destructor. - - // b) Operators. - - ARluSymStdEig& operator=(const ARluSymStdEig& other); - // Assignment operator. - -}; // class ARluSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARluSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluSymStdEig:: -ChangeShift(ARFLOAT sigmaRp) -{ - - this->sigmaR = sigmaRp; - this->sigmaI = 0.0; - this->mode = 3; - this->iparam[7] = this->mode; - - this->objOP->FactorAsI(this->sigmaR); - this->Restart(); - -} // ChangeShift. - - -template -inline void ARluSymStdEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(this->objOP, &ARdsSymMatrix::MultMv); - -} // SetRegularMode. - - -template -inline void ARluSymStdEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARStdEig >:: - SetShiftInvertMode(sigmap, this->objOP, &ARdsSymMatrix::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluSymStdEig:: -ARluSymStdEig(int nevp, ARdsSymMatrix& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) -{ - - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &A, &ARdsSymMatrix::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluSymStdEig:: -ARluSymStdEig(int nevp, ARdsSymMatrix& A, - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->DefineParameters(A.ncols(), nevp, &A, &ARdsSymMatrix::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluSymStdEig& ARluSymStdEig:: -operator=(const ARluSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARDSSYM_H diff --git a/src/external/arpack++/include/arerror.h b/src/external/arpack++/include/arerror.h deleted file mode 100644 index 6f96b479..00000000 --- a/src/external/arpack++/include/arerror.h +++ /dev/null @@ -1,348 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARError.h. - Definition of ArpackError, a class that handles errors - occurred during Arpack execution. - - There are three ways of handling an error: - a) Declaring a variable of type ArpackError and calling - function Set with the correct ErrorCode (see codes below). - b) Calling the constructor ArpackError(ErrorCode) to define - a variable. - c) Calling ArpackError::Set(ErrorCode) directly. - - If an error occurs, a brief description of the error is - displayed on the "cerr" stream, unless the variable - ARPACK_SILENT_MODE is defined. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARERROR_H -#define ARERROR_H - -#include -#include -#include - -//#include "arch.h" - -template< typename T > -struct ArpackError_static -{ - public: - - enum ErrorCode { // Listing all kinds of errors. - - // Innocuous error type. - - NO_ERRORS = 0, - - // Errors in parameter definitions. - - PARAMETER_ERROR = -101, - N_SMALLER_THAN_2 = -102, - NEV_OUT_OF_BOUNDS = -103, - WHICH_UNDEFINED = -104, - PART_UNDEFINED = -105, - INVMODE_UNDEFINED = -106, - RANGE_ERROR = -107, - - // Errors in Aupp and Eupp functions. - - LAPACK_ERROR = -201, - START_RESID_ZERO = -202, - NOT_ACCURATE_EIG = -203, - REORDERING_ERROR = -204, - ARNOLDI_NOT_BUILD = -205, - AUPP_ERROR = -291, - EUPP_ERROR = -292, - - // Errors in main functions. - - CANNOT_PREPARE = -301, - CANNOT_FIND_BASIS = -302, - CANNOT_FIND_VALUES = -303, - CANNOT_FIND_VECTORS = -304, - CANNOT_FIND_SCHUR = -305, - SCHUR_UNDEFINED = -306, - - // Errors due to incorrect function calling sequence. - - CANNOT_GET_VECTOR = -401, - CANNOT_GET_PROD = -402, - CANNOT_PUT_VECTOR = -403, - PREPARE_NOT_OK = -404, - BASIS_NOT_OK = -405, - VALUES_NOT_OK = -406, - VECTORS_NOT_OK = -407, - SCHUR_NOT_OK = -408, - RESID_NOT_OK = -409, - - // Errors in classes that perform LU decompositions. - - MATRIX_IS_SINGULAR = -501, - DATA_UNDEFINED = -502, - INSUFICIENT_MEMORY = -503, - NOT_SQUARE_MATRIX = -504, - NOT_FACTORED_MATRIX = -505, - INCOMPATIBLE_SIZES = -506, - DIFFERENT_TRIANGLES = -507, - INCONSISTENT_DATA = -508, - CANNOT_READ_FILE = -509, - - // Errors in matrix files. - - CANNOT_OPEN_FILE = -551, - WRONG_MATRIX_TYPE = -552, - WRONG_DATA_TYPE = -553, - RHS_IGNORED = -554, - UNEXPECTED_EOF = -555, - - // Other severe errors. - - NOT_IMPLEMENTED = -901, - MEMORY_OVERFLOW = -902, - GENERIC_SEVERE = -999, - - // Warnings. - - NCV_OUT_OF_BOUNDS = 101, - MAXIT_NON_POSITIVE = 102, - MAX_ITERATIONS = 201, - NO_SHIFTS_APPLIED = 202, - CHANGING_AUTOSHIFT = 301, - DISCARDING_FACTORS = 401, - GENERIC_WARNING = 999 - - }; - - protected: - - static ErrorCode code; - -}; -// trick to initialize static member code, which is allowed in template - -template< typename T > -enum ArpackError_static::ErrorCode ArpackError_static::code = NO_ERRORS; -// "code" initialization. - -class ArpackError: public ArpackError_static { - - private: - - static void Print(const std::string& where, const std::string& message); - // Writes error messages on cerr stream. - - public: - - static void Set(ErrorCode error, const std::string& where="AREigenProblem"); - // Set error code and write error messages. - - static int Status() { return (int) code; } - // Returns current value of error code. - - ArpackError(ErrorCode error, const std::string& where="AREigenProblem") { - Set(error,where); - } - // Constructor that set error code. - - ArpackError() { code = NO_ERRORS; }; - // Constructor that does nothing. - -}; - -inline void ArpackError::Print(const std::string& where, const std::string& message) -{ - -#ifndef ARPACK_SILENT_MODE - std::cerr << "Arpack error in " << where << "." << std::endl; - std::cerr << "-> " << message << "." << std::endl; -#endif - -} // Print - -inline void ArpackError::Set(ErrorCode error, const std::string& where) -{ - - code = error; - switch (code) { - case NO_ERRORS : - return; - case NOT_IMPLEMENTED : - Print(where, "This function was not implemented yet"); - return; - case MEMORY_OVERFLOW : - Print(where, "Memory overflow"); - return; - case GENERIC_SEVERE : - Print(where, "Severe error"); - return; - case PARAMETER_ERROR : - Print(where, "Some parameters were not correctly defined"); - return; - case N_SMALLER_THAN_2 : - Print(where, "'n' must be greater than one"); - return; - case NEV_OUT_OF_BOUNDS : - Print(where, "'nev' is out of bounds"); - return; - case WHICH_UNDEFINED : - Print(where, "'which' was not correctly defined"); - return; - case PART_UNDEFINED : - Print(where, "'part' must be one of 'R' or 'I'"); - return; - case INVMODE_UNDEFINED : - Print(where, "'InvertMode' must be one of 'S' or 'B'"); - return; - case RANGE_ERROR : - Print(where, "Range error"); - return; - case LAPACK_ERROR : - Print(where, "Could not perform LAPACK eigenvalue calculation"); - return; - case START_RESID_ZERO : - Print(where, "Starting vector is zero"); - return; - case NOT_ACCURATE_EIG : - Print(where, "Could not find any eigenvalue to sufficient accuracy"); - return; - case REORDERING_ERROR : - Print(where, "Reordering of Schur form was not possible"); - return; - case ARNOLDI_NOT_BUILD : - Print(where, "Could not build an Arnoldi factorization"); - return; - case AUPP_ERROR : - Print(where, "Error in ARPACK Aupd fortran code"); - return; - case EUPP_ERROR : - Print(where, "Error in ARPACK Eupd fortran code"); - return; - case CANNOT_PREPARE : - Print(where, "Could not correctly define internal variables"); - return; - case CANNOT_FIND_BASIS : - Print(where, "Could not find an Arnoldi basis"); - return; - case CANNOT_FIND_VALUES : - Print(where, "Could not find any eigenvalue"); - return; - case CANNOT_FIND_VECTORS: - Print(where, "Could not find any eigenvector"); - return; - case CANNOT_FIND_SCHUR : - Print(where, "Could not find any Schur vector"); - return; - case SCHUR_UNDEFINED : - Print(where, "FindEigenvectors must be used instead of FindSchurVectors"); - return; - case CANNOT_GET_VECTOR : - Print(where, "Vector is not already available"); - return; - case CANNOT_GET_PROD : - Print(where, "Matrix-vector product is not already available"); - return; - case CANNOT_PUT_VECTOR : - Print(where, "Could not store vector"); - return; - case PREPARE_NOT_OK : - Print(where, "DefineParameters must be called prior to this function"); - return; - case BASIS_NOT_OK : - Print(where, "An Arnoldi basis is not available"); - return; - case VALUES_NOT_OK : - Print(where, "Eigenvalues are not available"); - return; - case VECTORS_NOT_OK : - Print(where, "Eigenvectors are not available"); - return; - case SCHUR_NOT_OK : - Print(where, "Schur vectors are not available"); - return; - case RESID_NOT_OK : - Print(where, "Residual vector is not available"); - return; - case MATRIX_IS_SINGULAR : - Print(where, "Matrix is singular and could not be factored"); - return; - case DATA_UNDEFINED : - Print(where, "Matrix data was not defined"); - return; - case INSUFICIENT_MEMORY : - Print(where, "fill-in factor must be increased"); - return; - case NOT_SQUARE_MATRIX : - Print(where, "Matrix must be square to be factored"); - return; - case NOT_FACTORED_MATRIX: - Print(where, "Matrix must be factored before solving a system"); - return; - case INCOMPATIBLE_SIZES : - Print(where, "Matrix dimensions must agree"); - return; - case DIFFERENT_TRIANGLES: - Print(where, "A.uplo and B.uplo must be equal"); - return; - case INCONSISTENT_DATA : - Print(where, "Matrix data contain inconsistencies"); - return; - case CANNOT_READ_FILE : - Print(where, "Data file could not be read"); - return; - case CANNOT_OPEN_FILE : - Print(where, "Invalid path or filename"); - return; - case WRONG_MATRIX_TYPE : - Print(where, "Wrong matrix type"); - return; - case WRONG_DATA_TYPE : - Print(where, "Wrong data type"); - return; - case RHS_IGNORED : - Print(where, "RHS vector will be ignored"); - return; - case UNEXPECTED_EOF : - Print(where, "Unexpected end of file"); - return; - case NCV_OUT_OF_BOUNDS : - Print(where, "'ncv' is out of bounds"); - return; - case MAXIT_NON_POSITIVE : - Print(where, "'maxit' must be greater than zero"); - return; - case MAX_ITERATIONS : - Print(where, "Maximum number of iterations taken"); - return; - case NO_SHIFTS_APPLIED : - Print(where, "No shifts could be applied during a cycle of IRAM iteration"); - return; - case CHANGING_AUTOSHIFT : - Print(where, "Turning to automatic selection of implicit shifts"); - return; - case DISCARDING_FACTORS : - Print(where, "Factors L and U were not copied. Matrix must be factored"); - return; - case GENERIC_WARNING : - default: ; - Print(where, "There is something wrong"); - return; - } - -} // Set. - -//ArpackError::ErrorCode ArpackError::code = NO_ERRORS; -// "code" initialization. - -#endif // ARERROR_H diff --git a/src/external/arpack++/include/argcomp.h b/src/external/arpack++/include/argcomp.h deleted file mode 100644 index bce04ea9..00000000 --- a/src/external/arpack++/include/argcomp.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARGComp.h. - Arpack++ class ARCompGenEig definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARGCOMP_H -#define ARGCOMP_H - -#include -#include -#include "arch.h" -#include "arscomp.h" -#include "argeig.h" - -template -class ARCompGenEig: - virtual public ARGenEig, ARFOP, ARFB>, - virtual public ARCompStdEig { - - public: - - // a) Constructors and destructor. - - ARCompGenEig() { } - // Short constructor (Does nothing but calling base classes constructors). - - ARCompGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(arcomplex[],arcomplex[]), - ARFB* objBp, - void (ARFB::* MultBxp)(arcomplex[],arcomplex[]), - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARCompGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(arcomplex[],arcomplex[]), - ARFB* objBp, - void (ARFB::* MultBxp)(arcomplex[],arcomplex[]), - arcomplex sigmap, - const std::string& whichp = "LM", int ncvp = 0, ARFLOAT tolp = 0.0, - int maxitp = 0, arcomplex* residp = NULL, - bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARCompGenEig(const ARCompGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARCompGenEig() { } - // Destructor. - - // b) Operators. - - ARCompGenEig& operator=(const ARCompGenEig& other); - // Assignment operator. - -}; // class ARCompGenEig. - - -// ------------------------------------------------------------------------ // -// ARCompGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline ARCompGenEig:: -ARCompGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(arcomplex[],arcomplex[]), - ARFB* objBp, - void (ARFB::* MultBxp)(arcomplex[], arcomplex[]), - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, arcomplex* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(np, nevp, objOPp, MultOPxp, objBp, MultBxp, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARCompGenEig:: -ARCompGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(arcomplex[],arcomplex[]), - ARFB* objBp, - void (ARFB::* MultBxp)(arcomplex[], arcomplex[]), - arcomplex sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, arcomplex* residp, bool ishiftp) - -{ - - this->ChangeShift(sigmap); - this->DefineParameters(np, nevp, objOPp, MultOPxp, objBp, MultBxp, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (shift and invert mode). - - -template -ARCompGenEig& ARCompGenEig:: -operator=(const ARCompGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARGCOMP_H diff --git a/src/external/arpack++/include/argeig.h b/src/external/arpack++/include/argeig.h deleted file mode 100644 index 74ccc07f..00000000 --- a/src/external/arpack++/include/argeig.h +++ /dev/null @@ -1,233 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARGEig.h. - Arpack++ class ARGenEig definition. - Derived from ARStdEig, this class is the - base class for all generalized eigenvalue problems definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARGEIG_H -#define ARGEIG_H - -#include -#include -#include "arch.h" -#include "arerror.h" -#include "arrgeig.h" -#include "arseig.h" - -// ARGenEig class definition. - -template -class ARGenEig: - virtual public ARrcGenEig, - virtual public ARStdEig { - - public: - - // a) Notation. - - typedef void (ARFB::* TypeBx)(ARTYPE[], ARTYPE[]); - typedef void (ARFOP::* TypeOPx)(ARTYPE[], ARTYPE[]); - - - protected: - - // b) Protected variables: - - ARFB *objB; // Object that has MultBx as a member function. - TypeBx MultBx; // Function that evaluates the product B*x. - - // c) Protected functions: - - virtual void Copy(const ARGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // d) Public functions: - - // d.1) Function that stores user defined parameters. - - virtual void DefineParameters(int np, int nevp, ARFOP* objOPp, - TypeOPx MultOPxp, ARFB* objBp, - TypeBx MultBxp, const std::string& whichp="LM", - int ncvp=0, ARFLOAT tolp=0.0, - int maxitp=0, ARTYPE* residp=NULL, - bool ishiftp=true); - // Set values of problem parameters (also called by constructors). - - - // d.2) Function that allow changes in problem parameters. - - void ChangeMultBx(ARFB* objBp, TypeBx MultBxp); - // Changes the matrix-vector function that performs B*x. - - - // d.3) Functions that perform all calculations in one step. - - virtual int FindArnoldiBasis(); - // Determines the Arnoldi basis related to the given problem. - - - // d.4) Constructors and destructor. - - ARGenEig() { } - // Constructor that does nothing but calling base classes constructors. - - ARGenEig(const ARGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARGenEig() { } - // Destructor (presently meaningless). - - // e) Operators. - - ARGenEig& operator=(const ARGenEig& other); - // Assignment operator. - -}; // class ARGenEig. - - -// ------------------------------------------------------------------------ // -// ARGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARGenEig:: -Copy(const ARGenEig& other) -{ - - ARStdEig::Copy(other); - objB = other.objB; - MultBx = other.MultBx; - -} // Copy. - - -template -void ARGenEig:: -DefineParameters(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARTYPE[], ARTYPE[]), ARFB* objBp, - void (ARFB::* MultBxp)(ARTYPE[], ARTYPE[]), const std::string& whichp, - int ncvp, ARFLOAT tolp, int maxitp, ARTYPE* residp, - bool ishiftp) - -{ - - // Setting parameters of generalized problems. - - objB = objBp; - MultBx = MultBxp; - - // Setting common eigen-problem parameters. - - ARStdEig:: - DefineParameters(np, nevp, objOPp, MultOPxp, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // DefineParameters. - - -template -inline void ARGenEig:: -ChangeMultBx(ARFB* objBp, void (ARFB::* MultBxp)(ARTYPE[], ARTYPE[])) -{ - - objB = objBp; - MultBx = MultBxp; - this->Restart(); - -} // ChangeMultBx. - - -template -int ARGenEig::FindArnoldiBasis() -{ - - if (!this->BasisOK) this->Restart(); - - // Changing to auto shift mode. - - if (!this->AutoShift) { - ArpackError::Set(ArpackError::CHANGING_AUTOSHIFT, "FindArnoldiBasis"); - this->AutoShift=true; - } - - // ARPACK main loop. - - while (!this->BasisOK) { - - // Calling Aupp. - - try { this->TakeStep(); } - catch (ArpackError) { - ArpackError(ArpackError::CANNOT_FIND_BASIS, "FindArnoldiBasis"); - return 0; - } - - switch (this->ido) { - case -1: - - // Performing y <- OP*B*x for the first time when mode != 2. - - if (this->mode != 2) { - this->ipntr[3] = this->ipntr[2]+this->n; // not a clever idea, but... - (this->objB->*MultBx)(&this->workd[this->ipntr[1]],&this->workd[this->ipntr[3]]); - } - - case 1: - - // Performing y <- OP*w. - - if (this->mode == 2) { // w = x if mode = 2. - (this->objOP->*(this->MultOPx))(&this->workd[this->ipntr[1]],&this->workd[this->ipntr[2]]); - } - else { // w = B*x otherwise. - (this->objOP->*(this->MultOPx))(&this->workd[this->ipntr[3]],&this->workd[this->ipntr[2]]); - } - break; - - case 2: - - // Performing y <- B*x. - - (this->objB->*MultBx)(&this->workd[this->ipntr[1]],&this->workd[this->ipntr[2]]); - - } - } - return this->nconv; - -} // FindArnoldiBasis. - - -template -ARGenEig& ARGenEig:: -operator=(const ARGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARGEIG_H - diff --git a/src/external/arpack++/include/argnsym.h b/src/external/arpack++/include/argnsym.h deleted file mode 100644 index 9590cb7b..00000000 --- a/src/external/arpack++/include/argnsym.h +++ /dev/null @@ -1,362 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARGNSym.h. - Arpack++ class ARNonSymGenEig definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARGNSYM_H -#define ARGNSYM_H - -#include -#include -#include "arch.h" -#include "blas1c.h" -#include "lapackc.h" -#include "arsnsym.h" -#include "argeig.h" -#include "arrgnsym.h" - -template -class ARNonSymGenEig: - virtual public ARGenEig, - virtual public ARNonSymStdEig, - virtual public ARrcNonSymGenEig { - - public: - - // a) Notation. - - typedef void (ARFB::* TypeBx)(ARFLOAT[], ARFLOAT[]); - - - protected: - - // b) Protected variables: - - ARFB *objA; // Object that has MultAx as a member function. - TypeBx MultAx; // Function that evaluates the product A*x. - - - // c) Protected functions: - - void RecoverEigenvalues(); - // Uses Rayleigh quotient to recover eigenvalues of the original - // problem when shift is complex. - - virtual void Copy(const ARNonSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // d) Public functions: - - // d.1) Functions that allow changes in problem parameters. - - virtual void SetShiftInvertMode(ARFLOAT sigmaRp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[],ARFLOAT[])); - // Turns the problem to real shift-and-invert mode with sigmaRp as shift. - - virtual void SetComplexShiftMode(char partp, ARFLOAT sigmaRp, - ARFLOAT sigmaIp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[],ARFLOAT[]), - ARFB* objAp, - void (ARFB::* MultAxp)(ARFLOAT[],ARFLOAT[])); - // Turns the problem to complex shift-and-invert mode with shift - // defined by sigmaRp and sigmaIp. MultAx is used to obtain eigenvalues. - - - // d.2) Functions that perform all calculations in one step. - - virtual int FindEigenvalues(); - // Determines nev approximated eigenvalues of the given eigen-problem. - - virtual int FindEigenvectors(bool schurp = false); - // Determines nev approximated eigenvectors of the given eigen-problem - // Optionally also determines nev Schur vectors that span the desired - // invariant subspace. - - virtual int FindSchurVectors(); - // Determines nev Schur vectors that span the desired invariant subspace. - // Redefined in ARSymEig. - - - // d.3) Constructors and destructor. - - ARNonSymGenEig() { this->part = 'R'; } - // Short constructor (Does nothing but calling base classes constructors). - - ARNonSymGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objBp, void (ARFB::* MultBxp)(ARFLOAT[], ARFLOAT[]), - const std::string& whichp = "LM", int ncvp = 0, ARFLOAT tolp = 0.0, - int maxitp = 0, ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARNonSymGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objBp, void (ARFB::* MultBxp)(ARFLOAT[], ARFLOAT[]), - ARFLOAT sigmap, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, ARFLOAT* residp = NULL, - bool ishiftp = true); - // Long constructor (real shift and invert mode). - - ARNonSymGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), ARFB* objAp, - void (ARFB::* MultAxp)(ARFLOAT[], ARFLOAT[]), ARFB* objBp, - void (ARFB::* MultBxp)(ARFLOAT[], ARFLOAT[]), char partp, - ARFLOAT sigmaRp, ARFLOAT sigmaIp, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (complex shift and invert mode). - - ARNonSymGenEig(const ARNonSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARNonSymGenEig() { } - // Destructor. - - // e) Operators. - - ARNonSymGenEig& operator=(const ARNonSymGenEig& other); - // Assignment operator. - -}; // class ARNonSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARNonSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARNonSymGenEig:: -Copy(const ARNonSymGenEig& other) -{ - - ARGenEig::Copy(other); - objA = other.objA; - MultAx = other.MultAx; - this->part = other.part; - -} // Copy. - - -template -void ARNonSymGenEig::RecoverEigenvalues() -{ - - int j, ColJ, ColJp1; - ARFLOAT numr, numi, denr, deni; - ARFLOAT* Ax; - - Ax = new ARFLOAT[this->n]; - - for (j=0; jnconv; j++) { - - ColJ = j*this->n; - ColJp1 = ColJ+this->n; - - if (this->EigValI[j] == (ARFLOAT)0.0) { - - // Eigenvalue is real. Computing EigVal = x'(Ax)/x'(Mx). - - (this->objB->*MultAx)(&this->EigVec[ColJ], Ax); - numr = dot(this->n, &this->EigVec[ColJ], 1, Ax, 1); - (this->objB->*(this->MultBx))(&this->EigVec[ColJ], Ax); - denr = dot(this->n, &this->EigVec[ColJ], 1, Ax, 1); - this->EigValR[j] = numr / denr; - - } - else { - - // Eigenvalue is complex. - - // Computing x'(Ax). - - (this->objB->*MultAx)(&this->EigVec[ColJ], Ax); - numr = dot(this->n, &this->EigVec[ColJ], 1, Ax, 1); - numi = dot(this->n, &this->EigVec[ColJp1], 1, Ax, 1); - (this->objB->*MultAx)(&this->EigVec[ColJp1], Ax); - numr = numr + dot(this->n, &this->EigVec[ColJp1], 1, Ax, 1); - numi = -numi + dot(this->n, &this->EigVec[ColJ], 1, Ax, 1); - - // Computing x'(Mx). - - (this->objB->*(this->MultBx))(&this->EigVec[ColJ], Ax); - denr = dot(this->n, &this->EigVec[ColJ], 1, Ax, 1); - deni = dot(this->n, &this->EigVec[ColJp1], 1, Ax, 1); - (this->objB->*(this->MultBx))(&this->EigVec[ColJp1], Ax); - denr = denr + dot(this->n, &this->EigVec[ColJp1], 1, Ax, 1); - deni = -deni + dot(this->n, &this->EigVec[ColJ], 1, Ax, 1); - - // Computing the first eigenvalue of the conjugate pair. - - this->EigValR[j] = (numr*denr+numi*deni) / lapy2(denr, deni); - this->EigValI[j] = (numi*denr-numr*deni) / lapy2(denr, deni); - - // Getting the second eigenvalue of the conjugate pair by taking - // the conjugate of the first. - - this->EigValR[j+1] = this->EigValR[j]; - this->EigValI[j+1] = -this->EigValI[j]; - j++; - - } - - } - - delete[] Ax; - -} // RecoverEigenvalues. - - -template -inline void ARNonSymGenEig:: -SetShiftInvertMode(ARFLOAT sigmaRp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[])) -{ - - this->part = 'R'; - this->objOP = objOPp; - this->MultOPx = MultOPxp; - this->ChangeShift(sigmaRp); - -} // SetShiftInvertMode. - - -template -inline void ARNonSymGenEig:: -SetComplexShiftMode(char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp, - ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objAp, void (ARFB::* MultAxp)(ARFLOAT[], ARFLOAT[])) -{ - - this->objOP = objOPp; - this->MultOPx = MultOPxp; - objA = objAp; - MultAx = MultAxp; - this->part = this->CheckPart(partp); - this->ChangeShift(sigmaRp, sigmaIp); - -} // SetComplexShiftMode. - - -template -inline int ARNonSymGenEig::FindEigenvalues() -{ - - this->nconv = ARStdEig::FindEigenvalues(); - if (this->sigmaI != 0.0) RecoverEigenvalues(); - return this->nconv; - -} // FindEigenvalues. - - -template -inline int ARNonSymGenEig::FindEigenvectors(bool schurp) -{ - - this->nconv = ARStdEig::FindEigenvectors(schurp); - if (this->sigmaI != 0.0) RecoverEigenvalues(); - return this->nconv; - -} // FindEigenvectors. - - -template -int ARNonSymGenEig::FindSchurVectors() -{ - - this->nconv = ARStdEig::FindSchurVectors(); - if (this->sigmaI != 0.0) RecoverEigenvalues(); - return this->nconv; - -} // FindSchurVectors. - - -template -inline ARNonSymGenEig:: -ARNonSymGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objBp, void (ARFB::* MultBxp)(ARFLOAT[], ARFLOAT[]), - const std::string& whichp, int ncvp, ARFLOAT tolp, int maxitp, - ARFLOAT* residp, bool ishiftp) - -{ - - this->part = 'R'; // Considering mode = 3 in ChangeShift. - this->NoShift(); - this->DefineParameters(np, nevp, objOPp, MultOPxp, objBp, MultBxp, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARNonSymGenEig:: -ARNonSymGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objBp, void (ARFB::* MultBxp)(ARFLOAT[], ARFLOAT[]), - ARFLOAT sigmap, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - SetShiftInvertMode(sigmap, objOPp, MultOPxp); - this->DefineParameters(np, nevp, objOPp, MultOPxp, objBp, MultBxp, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - - -} // Long constructor (real shift and invert mode). - - -template -inline ARNonSymGenEig:: -ARNonSymGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objAp, void (ARFB::* MultAxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objBp, void (ARFB::* MultBxp)(ARFLOAT[], ARFLOAT[]), - char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp, - const std::string& whichp, int ncvp, ARFLOAT tolp, int maxitp, - ARFLOAT* residp, bool ishiftp) - -{ - - SetComplexShiftMode(partp, sigmaRp, sigmaIp, objOPp, - MultOPxp, objAp, MultAxp); - this->DefineParameters(np, nevp, objOPp, MultOPxp, objBp, MultBxp, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (shift and invert mode). - - -template -ARNonSymGenEig& ARNonSymGenEig:: -operator=(const ARNonSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARGNSYM_H - diff --git a/src/external/arpack++/include/argsym.h b/src/external/arpack++/include/argsym.h deleted file mode 100644 index 8191ba0a..00000000 --- a/src/external/arpack++/include/argsym.h +++ /dev/null @@ -1,326 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARGSym.h. - Arpack++ class ARSymGenEig definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARGSYM_H -#define ARGSYM_H - -#include -#include -#include "arch.h" -#include "arssym.h" -#include "arrgsym.h" -#include "argeig.h" - -template -class ARSymGenEig: - virtual public ARGenEig, - virtual public ARSymStdEig, - virtual public ARrcSymGenEig { - - public: - - // a) Notation. - - typedef void (ARFB::* TypeBx)(ARFLOAT[], ARFLOAT[]); - - - protected: - - // b) Protected variables: - - ARFB *objA; // Object that has MultAx as a member function. - TypeBx MultAx; // Function that evaluates the product A*x. - - // c) Protected functions: - - virtual void Copy(const ARSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // d) Public functions: - - // d.1) Functions that allow changes in problem parameters. - - void SetShiftInvertMode(ARFLOAT sigmap, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[])); - // Turns problem to shift and invert mode with shift defined by sigmap. - - void SetBucklingMode(ARFLOAT sigmap, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[])); - // Turns problem to buckling mode with shift defined by sigmap. - - void SetCayleyMode(ARFLOAT sigmap, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objAp, void (ARFB::* MultAxp)(ARFLOAT[], ARFLOAT[])); - // Turns problem to Cayley mode with shift defined by sigmap. - - - // d.2) Functions that perform all calculations in one step. - - int FindArnoldiBasis(); - // Determines the Arnoldi basis related to the given problem. - - - // d.3) Constructors and destructor. - - ARSymGenEig() { this->InvertMode = 'S'; } - // Short constructor that does almost nothing. - - ARSymGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), ARFB* objBp, - void (ARFB::* MultBxp)(ARFLOAT[], ARFLOAT[]), - const std::string& whichp = "LM", int ncvp = 0, ARFLOAT tolp = 0.0, - int maxitp = 0, ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARSymGenEig(char invertmodep, int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objBp, void (ARFB::* MultBxp)(ARFLOAT[], ARFLOAT[]), - ARFLOAT sigmap, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, ARFLOAT* residp = NULL, - bool ishiftp = true); - // Long constructor (shift-and-invert and buckling mode). - - ARSymGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), ARFB* objAp, - void (ARFB::* MultAxp)(ARFLOAT[], ARFLOAT[]), ARFB* objBp, - void (ARFB::* MultBxp)(ARFLOAT[], ARFLOAT[]), ARFLOAT sigmap, - const std::string& whichp = "LM", int ncvp = 0, ARFLOAT tolp = 0.0, - int maxitp = 0, ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (cayley mode). - - ARSymGenEig(const ARSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARSymGenEig() { } - // Destructor. - - // e) Operators. - - ARSymGenEig& operator=(const ARSymGenEig& other); - // Assignment operator. - -}; // class ARSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARSymGenEig:: -Copy(const ARSymGenEig& other) -{ - - ARGenEig::Copy(other); - objA = other.objA; - MultAx = other.MultAx; - this->InvertMode = other.InvertMode; - -} // Copy. - - -template -void ARSymGenEig:: -SetShiftInvertMode(ARFLOAT sigmap, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[])) -{ - - this->InvertMode = 'S'; - this->objOP = objOPp; - this->MultOPx = MultOPxp; - this->ChangeShift(sigmap); - -} // SetShiftInvertMode. - - -template -void ARSymGenEig:: -SetBucklingMode(ARFLOAT sigmap, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[])) - -{ - - this->InvertMode = 'B'; - this->objOP = objOPp; - this->MultOPx = MultOPxp; - this->ChangeShift(sigmap); - -} // SetBucklingMode. - - -template -void ARSymGenEig:: -SetCayleyMode(ARFLOAT sigmap, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), ARFB* objAp, - void (ARFB::* MultAxp)(ARFLOAT[], ARFLOAT[])) - -{ - - this->InvertMode = 'C'; - this->objOP = objOPp; - this->MultOPx = MultOPxp; - objA = objAp; - MultAx = MultAxp; - this->ChangeShift(sigmap); - -} // SetCayleyMode. - - -template -int ARSymGenEig::FindArnoldiBasis() -{ - - ARFLOAT* temp; - - if (this->mode != 5) { // Using base function if not in Cayley mode. - return ARGenEig::FindArnoldiBasis(); - } - else { - - temp = new ARFLOAT[this->n+1]; - - if (!this->BasisOK) this->Restart(); - - // Changing to auto shift mode. - - if (!this->AutoShift) { - ArpackError::Set(ArpackError::CHANGING_AUTOSHIFT, "FindArnoldiBasis"); - this->AutoShift=true; - } - - // ARPACK main loop. - - while (!this->BasisOK) { - - // Calling Aupp. - - try { this->TakeStep(); } - catch (ArpackError) { - ArpackError(ArpackError::CANNOT_FIND_BASIS, "FindArnoldiBasis"); - delete[] temp; - return 0; - } - - switch (this->ido) { - case -1: - - // Performing y <- B*x for the first time. - - this->ipntr[3] = this->ipntr[2]+this->n; // not a clever idea, but... - (this->objB->*(this->MultBx))(&this->workd[this->ipntr[1]],&this->workd[this->ipntr[3]]); - - case 1: - - // Performing y <- OP*(A+sigma*B)*x, B*x is already available. - - (this->objB->*MultAx)(&this->workd[this->ipntr[1]], temp); - axpy(this->n, this->sigmaR, &this->workd[this->ipntr[3]], 1, temp, 1); - (this->objOP->*(this->MultOPx))(temp, &this->workd[this->ipntr[2]]); - break; - - case 2: - - // Performing y <- B*x. - - (this->objB->*(this->MultBx))(&this->workd[this->ipntr[1]],&this->workd[this->ipntr[2]]); - - } - } - - delete[] temp; - - return this->nconv; - } - -} // FindArnoldiBasis. - - -template -inline ARSymGenEig:: -ARSymGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objBp, void (ARFB::* MultBxp)(ARFLOAT[], ARFLOAT[]), - const std::string& whichp, int ncvp, ARFLOAT tolp, int maxitp, - ARFLOAT* residp, bool ishiftp) - -{ - - this->InvertMode = 'S'; - this->NoShift(); - this->DefineParameters(np, nevp, objOPp, MultOPxp, objBp, MultBxp, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARSymGenEig:: -ARSymGenEig(char InvertModep, int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objBp, void (ARFB::* MultBxp)(ARFLOAT[], ARFLOAT[]), - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->InvertMode = this->CheckInvertMode(InvertModep); // InvertMode = 'S' or 'B'. - this->ChangeShift(sigmap); - this->DefineParameters(np, nevp, objOPp, MultOPxp, objBp, MultBxp, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (shift-and-invert and buckling mode). - - -template -inline ARSymGenEig:: -ARSymGenEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objAp, void (ARFB::* MultAxp)(ARFLOAT[], ARFLOAT[]), - ARFB* objBp, void (ARFB::* MultBxp)(ARFLOAT[], ARFLOAT[]), - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - SetCayleyMode(sigmap, objOPp, this->MultOPx, objAp, MultAxp); - this->DefineParameters(np, nevp, objOPp, MultOPxp, objBp, MultBxp, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (cayley mode). - - -template -ARSymGenEig& ARSymGenEig:: -operator=(const ARSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARGSYM_H - diff --git a/src/external/arpack++/include/arhbmat.h b/src/external/arpack++/include/arhbmat.h deleted file mode 100644 index 97c4db40..00000000 --- a/src/external/arpack++/include/arhbmat.h +++ /dev/null @@ -1,407 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARHBMat.h - Matrix template that generates a matrix in CSC format - from a Harwell-Boing matrix file. - - ARPACK authors: - Richard Lehoucq - Kristyn Maschhoff - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - - -#ifndef ARHBMAT_H -#define ARHBMAT_H - -#include -#include -#include -#include -#include -#include "arch.h" -#include "arerror.h" - - -template -class ARhbMatrix { - - private: - - std::string datafile; // Filename. - std::string title; // Title. - std::string name; // Name. - std::string type; // Matrix type. - int m; // Number of rows. - int n; // Number of columns. - int nnz; // Number of nonzero variables. - ARINT* irow; // Row indices. - ARINT* pcol; // Column pointers. - ARTYPE* val; // Numerical values of matrix entries. - - void ConvertDouble(char* num); - - bool ReadEntry(std::ifstream& file, int nval, int fval, int& j, double& val); - - bool ReadEntry(std::ifstream& file, int nval, int fval, int& j, float& val); - - bool ReadEntry(std::ifstream& file, int nval, int fval, - int& j, arcomplex& val); - - bool ReadEntry(std::ifstream& file, int nval, int fval, - int& j, arcomplex& val); - - void ReadFormat(std::ifstream& file, int& n, int& fmt); - - public: - - bool IsDefined() { return (m!=0); } - - bool IsReal() { return (type.size() > 0 && type[0]=='R'); } - - bool IsComplex() { return (type.size() > 0 && type[0]=='C'); } - - bool IsSymmetric() { return (type.size() > 1 && type[1]=='S'); } - - bool IsUnsymmetric() { return (type.size() > 1 && type[1]=='U'); } - - bool IsHermitian() { return (type.size() > 1 && type[1]=='H'); } - - bool IsSkewSymmetric() { return (type.size() > 1 && type[1]=='Z'); } - - const std::string& Filename() { return datafile; } - - const std::string& Title() { return title; } - - const std::string& Name() { return name; } - - const std::string& Type() { return type; } - - int NRows() { return m; } - - int NCols() { return n; } - - int NonZeros() { return nnz; } - - ARINT* RowInd() { return irow; } - - ARINT* ColPtr() { return pcol; } - - ARTYPE* Entries() { return val; } - - void Define(const std::string& filename); - // Function that reads the matrix file. - - ARhbMatrix(); - // Short constructor. - - ARhbMatrix(const std::string& filename) { Define(filename); } - // Long constructor. - - ~ARhbMatrix(); - // Destructor. - -}; // Class ARhbMatrix. - - -// ------------------------------------------------------------------------ // -// ARhbMatrix member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARhbMatrix::ConvertDouble(char* num) -{ - - char* pd; - - pd = strchr((char*)num,'D'); - if (pd) *pd = 'E'; - pd = strchr((char*)num,'d'); - if (pd) *pd = 'E'; - - -} // ConvertDouble. - - -template -inline bool ARhbMatrix:: -ReadEntry(std::ifstream& file, int nval, int fval, int& j, double& val) -{ - - char num[81]; - char c; - - if (file.get((char*)num,fval,'\n')) { - ConvertDouble((char*)num); - val = atof((char*)num); - if (!((++j)%nval)) do file.get(c); while (c!='\n'); - return true; - } - else { - return false; - } - -} // ReadEntry (double). - - -template -inline bool ARhbMatrix:: -ReadEntry(std::ifstream& file, int nval, int fval, int& j, float& val) -{ - - double dval; - bool ret; - - ret = ReadEntry(file, nval, fval, j, dval); - val = (float)dval; - return ret; - -} // ReadEntry (float). - - -template -inline bool ARhbMatrix:: -ReadEntry(std::ifstream& file, int nval, int fval, - int& j, arcomplex& val) -{ - - char num[81], img[81]; - char c; - - if (file.get((char*)num,fval,'\n')) { - ConvertDouble((char*)num); - if (!((++j)%nval)) do file.get(c); while (c!='\n'); - if (file.get((char*)img,fval,'\n')) { - ConvertDouble((char*)img); - if (!((++j)%nval)) do file.get(c); while (c!='\n'); - val = arcomplex(atof((char*)num), atof((char*)img)); - return true; - } - else { - return false; - } - } - else { - return false; - } - -} // ReadEntry (arcomplex). - - -template -inline bool ARhbMatrix:: -ReadEntry(std::ifstream& file, int nval, int fval, - int& j, arcomplex& val) -{ - - // I hope one day c++ will have a standard complex - // class, so functions like this can be suppressed. - - char num[81], img[81]; - char c; - - if (file.get((char*)num,fval,'\n')) { - ConvertDouble((char*)num); - if (!((++j)%nval)) do file.get(c); while (c!='\n'); - if (file.get((char*)img,fval,'\n')) { - ConvertDouble((char*)img); - if (!((++j)%nval)) do file.get(c); while (c!='\n'); - val = arcomplex(atof((char*)num), atof((char*)img)); - return true; - } - else { - return false; - } - } - else { - return false; - } - -} // ReadEntry (arcomplex). - - -template -void ARhbMatrix::ReadFormat(std::ifstream& file, int& n, int& fmt) -{ - - char c; - - do file.get(c); while ((c != '(') && (c!='\n')); - file >> n; - file.get(c); - while ((c!='I') && (c!='i') && (c!='E') && (c!='e') && - (c!='D') && (c!='d') && (c!='\n')) { - do file.get(c); while ((c != ',') && (c!='\n')); - file >> n; - file.get(c); - } - if ((c==')')||(c=='\n')) { // Reading error! - fmt = 0; - } - else { - file >> fmt; - } - -} // ReadFormat. - - -template -void ARhbMatrix::Define(const std::string& filename) -{ - - // Declaring variables. - - int i, j; - int lintot, linptr, linind, linval, linrhs; - int npcol, fpcol, nirow, firow, nval, fval; - char c; - char num[81]; - char titlechar[73]; - char namechar[9]; - char typechar[4]; - ARTYPE value; - - // Opening file. - - datafile = filename; - std::ifstream file(datafile.c_str()); - - if (!file) { - throw ArpackError(ArpackError::CANNOT_OPEN_FILE, "ARhbMatrix"); - } - - // Reading the first line. - - file.get((char*)titlechar,73,'\n'); - title = std::string(titlechar); - file.get((char*)namechar,9,'\n'); - name = std::string(namechar); - do file.get(c); while (c!='\n'); - - // Reading the second line. - - file >> lintot >> linptr >> linind >> linval >> linrhs; - do file.get(c); while (c!='\n'); - - if ((linptr < 1) || (linind < 1)) { - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARhbMatrix"); - } - - // Reading the third line. - - file.get((char*)typechar,4,'\n'); - type = std::string(typechar); - file >> m >> n >> nnz; - do file.get(c); while (c!='\n'); - - if ( (type.size()<3) || ((type[0] != 'R') && (type[0] != 'C')) || (type[2] != 'A')) { - throw ArpackError(ArpackError::WRONG_MATRIX_TYPE, "ARhbMatrix"); - } - else if ((m < 1) || (n < 1) || (nnz < 1)) { - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARhbMatrix"); - } - - // Reading the fourth line. - - ReadFormat(file, npcol, fpcol); - ReadFormat(file, nirow, firow); - ReadFormat(file, nval, fval); - do file.get(c); while (c!='\n'); - if ((fpcol<1) || (firow<1) || (fval<1)) { - throw ArpackError(ArpackError::WRONG_DATA_TYPE, "ARhbMatrix"); - } - - // Skipping the fifth line. - - if (linrhs) { - do file.get(c); while (c!='\n'); - ArpackError(ArpackError::RHS_IGNORED, "ARhbMatrix"); - } - - // Reading column pointers. - - pcol = new ARINT[n+1]; - fpcol++; - i = 0; - while ((i <= n) && (file.get((char*)num,fpcol,'\n'))) { - pcol[i++] = atoi((char*)num)-1; - if (!(i%npcol)) do file.get(c); while (c!='\n'); - } - if (i%npcol) do file.get(c); while (c!='\n'); - - if (i <= n) { - throw ArpackError(ArpackError::UNEXPECTED_EOF, "ARhbMatrix"); - } - - // Reading row indices. - - irow = new ARINT[nnz]; - firow++; - i = 0; - while ((i < nnz) && (file.get((char*)num,firow,'\n'))) { - irow[i++] = atoi((char*)num)-1; - if (!(i%nirow)) do file.get(c); while (c!='\n'); - } - if (i%nirow) do file.get(c); while (c!='\n'); - - if (i < nnz) { - throw ArpackError(ArpackError::UNEXPECTED_EOF, "ARhbMatrix"); - } - - // Reading matrix elements. - - fval++; - val = new ARTYPE[nnz]; - i = 0; - j = 0; - while ((i < nnz) && (ReadEntry(file, nval, fval, j, value))) { - val[i++] = value; - } - if (j%nval) do file.get(c); while (c!='\n'); - - if (i < nnz) { - throw ArpackError(ArpackError::UNEXPECTED_EOF, "ARhbMatrix"); - } - - // Closing file and reporting success. - - file.close(); - -} // Define. - - -template -ARhbMatrix::ARhbMatrix() -{ - - m = n = nnz = 0; - title[0]= '\0'; - name[0] = '\0'; - type[0] = '\0'; - pcol = NULL; - irow = NULL; - val = NULL; - -} // Short constructor. - - -template -ARhbMatrix::~ARhbMatrix() -{ - - if (irow != NULL) delete[] irow; - if (pcol != NULL) delete[] pcol; - if (val != NULL) delete[] val; - -} // Destructor. - - -#endif // ARHBMAT_H - diff --git a/src/external/arpack++/include/arlcomp.h b/src/external/arpack++/include/arlcomp.h deleted file mode 100644 index 8b9b5fbc..00000000 --- a/src/external/arpack++/include/arlcomp.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLComp.h. - ALTERED copy of dcomplex.h and scomplex.h (from SuperLU package). - Structure complex was renamed to lscomplex. - Structure doublecomplex was renamed to ldcomplex. -*/ - -/* - * -- SuperLU routine (version 2.0) -- - * Univ. of California Berkeley, Xerox Palo Alto Research Center, - * and Lawrence Berkeley National Lab. - * November 15, 1997 - * - * - */ -#ifndef __SUPERLU_DCOMPLEX /* allow multiple inclusions */ -#define __SUPERLU_DCOMPLEX - -/* - * This header file is to be included in source files z*.c - */ -#ifndef DCOMPLEX_INCLUDE -#define DCOMPLEX_INCLUDE - -typedef struct { double r, i; } ldcomplex; - - -/* Macro definitions */ - -/*! \brief Complex Addition c = a + b */ -#define z_add(c, a, b) { (c)->r = (a)->r + (b)->r; \ - (c)->i = (a)->i + (b)->i; } - -/*! \brief Complex Subtraction c = a - b */ -#define z_sub(c, a, b) { (c)->r = (a)->r - (b)->r; \ - (c)->i = (a)->i - (b)->i; } - -/*! \brief Complex-Double Multiplication */ -#define zd_mult(c, a, b) { (c)->r = (a)->r * (b); \ - (c)->i = (a)->i * (b); } - -/*! \brief Complex-Complex Multiplication */ -#define zz_mult(c, a, b) { \ - double cr, ci; \ - cr = (a)->r * (b)->r - (a)->i * (b)->i; \ - ci = (a)->i * (b)->r + (a)->r * (b)->i; \ - (c)->r = cr; \ - (c)->i = ci; \ - } - -#define zz_conj(a, b) { \ - (a)->r = (b)->r; \ - (a)->i = -((b)->i); \ - } - -/*! \brief Complex equality testing */ -#define z_eq(a, b) ( (a)->r == (b)->r && (a)->i == (b)->i ) - - -#ifdef __cplusplus -extern "C" { -#endif - -/* Prototypes for functions in dcomplex.c */ -void z_div(ldcomplex *, ldcomplex *, ldcomplex *); -double z_abs(ldcomplex *); /* exact */ -double z_abs1(ldcomplex *); /* approximate */ -void z_exp(ldcomplex *, ldcomplex *); -void d_cnjg(ldcomplex *r, ldcomplex *z); -double d_imag(ldcomplex *); -ldcomplex z_sgn(ldcomplex *); -ldcomplex z_sqrt(ldcomplex *); - - -#ifdef __cplusplus - } -#endif - -#endif - -#endif /* __SUPERLU_DCOMPLEX */ - - -#ifndef __SUPERLU_SCOMPLEX /* allow multiple inclusions */ -#define __SUPERLU_SCOMPLEX - -/* - * This header file is to be included in source files c*.c - */ -#ifndef SCOMPLEX_INCLUDE -#define SCOMPLEX_INCLUDE - -typedef struct { float r, i; } lscomplex; - - -/* Macro definitions */ - -/*! \brief Complex Addition c = a + b */ -#define c_add(c, a, b) { (c)->r = (a)->r + (b)->r; \ - (c)->i = (a)->i + (b)->i; } - -/*! \brief Complex Subtraction c = a - b */ -#define c_sub(c, a, b) { (c)->r = (a)->r - (b)->r; \ - (c)->i = (a)->i - (b)->i; } - -/*! \brief Complex-Double Multiplication */ -#define cs_mult(c, a, b) { (c)->r = (a)->r * (b); \ - (c)->i = (a)->i * (b); } - -/*! \brief Complex-Complex Multiplication */ -#define cc_mult(c, a, b) { \ - float cr, ci; \ - cr = (a)->r * (b)->r - (a)->i * (b)->i; \ - ci = (a)->i * (b)->r + (a)->r * (b)->i; \ - (c)->r = cr; \ - (c)->i = ci; \ - } - -#define cc_conj(a, b) { \ - (a)->r = (b)->r; \ - (a)->i = -((b)->i); \ - } - -/*! \brief Complex equality testing */ -#define c_eq(a, b) ( (a)->r == (b)->r && (a)->i == (b)->i ) - - -#ifdef __cplusplus -extern "C" { -#endif - -/* Prototypes for functions in scomplex.c */ -void c_div(lscomplex *, lscomplex *, lscomplex *); -double c_abs(lscomplex *); /* exact */ -double c_abs1(lscomplex *); /* approximate */ -void c_exp(lscomplex *, lscomplex *); -void r_cnjg(lscomplex *, lscomplex *); -double r_imag(lscomplex *); -lscomplex c_sgn(lscomplex *); -lscomplex c_sqrt(lscomplex *); - - -#ifdef __cplusplus - } -#endif - -#endif - -#endif /* __SUPERLU_SCOMPLEX */ - diff --git a/src/external/arpack++/include/arlgcomp.h b/src/external/arpack++/include/arlgcomp.h deleted file mode 100644 index b4692164..00000000 --- a/src/external/arpack++/include/arlgcomp.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLGComp.h. - Arpack++ class ARluCompGenEig definition - (superlu version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARLGCOMP_H -#define ARLGCOMP_H - -#include -#include -#include "arch.h" -#include "arlnsmat.h" -#include "arlnspen.h" -#include "arrseig.h" -#include "argcomp.h" - - -template -class ARluCompGenEig: - public virtual - ARCompGenEig, ARFLOAT >, - ARluNonSymPencil, ARFLOAT > > { - - private: - - // a) Data structure used to store matrices. - - ARluNonSymPencil, ARFLOAT > Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluCompGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(arcomplex sigmap); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(arcomplex sigmap); - - // c.2) Constructors and destructor. - - ARluCompGenEig() { } - // Short constructor. - - ARluCompGenEig(int nevp, ARluNonSymMatrix, ARFLOAT>& A, - ARluNonSymMatrix, ARFLOAT>& B, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluCompGenEig(int nevp, ARluNonSymMatrix, ARFLOAT>& A, - ARluNonSymMatrix, ARFLOAT>& B, - arcomplex sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluCompGenEig(const ARluCompGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluCompGenEig() { } - - // d) Operators. - - ARluCompGenEig& operator=(const ARluCompGenEig& other); - // Assignment operator. - -}; // class ARluCompGenEig. - - -// ------------------------------------------------------------------------ // -// ARluCompGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluCompGenEig:: -Copy(const ARluCompGenEig& other) -{ - - ARCompGenEig, ARFLOAT >, - ARluNonSymPencil, ARFLOAT> >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - if (this->mode > 2) this->objOP->FactorAsB(this->sigmaR); - -} // Copy. - - -template -inline void ARluCompGenEig::ChangeShift(arcomplex sigmap) -{ - - this->objOP->FactorAsB(sigmap); - ARrcStdEig >::ChangeShift(sigmap); - -} // ChangeShift. - - -template -inline void ARluCompGenEig::SetRegularMode() -{ - - ARStdEig, - ARluNonSymPencil, ARFLOAT> >:: - SetRegularMode(&Pencil, - &ARluNonSymPencil, ARFLOAT>::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluCompGenEig:: -SetShiftInvertMode(arcomplex sigmap) -{ - - ARCompGenEig, ARFLOAT>, - ARluNonSymPencil, ARFLOAT> >:: - SetShiftInvertMode(sigmap, &Pencil, - &ARluNonSymPencil,ARFLOAT>::MultInvAsBv); - -} // SetShiftInvertMode. - - -template -inline ARluCompGenEig:: -ARluCompGenEig(int nevp, ARluNonSymMatrix, ARFLOAT>& A, - ARluNonSymMatrix, ARFLOAT>& B, const std::string& whichp, - int ncvp, ARFLOAT tolp, int maxitp, - arcomplex* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARluNonSymPencil, ARFLOAT>::MultInvBAv, - &Pencil, - &ARluNonSymPencil, ARFLOAT>::MultBv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluCompGenEig:: -ARluCompGenEig(int nevp, ARluNonSymMatrix, ARFLOAT>& A, - ARluNonSymMatrix, ARFLOAT>& B, - arcomplex sigmap, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, arcomplex* residp, - bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARluNonSymPencil, ARFLOAT>::MultInvAsBv, - &Pencil, - &ARluNonSymPencil, ARFLOAT>::MultBv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - SetShiftInvertMode(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluCompGenEig& ARluCompGenEig:: -operator=(const ARluCompGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARLGCOMP_H diff --git a/src/external/arpack++/include/arlgnsym.h b/src/external/arpack++/include/arlgnsym.h deleted file mode 100644 index ea9b53e2..00000000 --- a/src/external/arpack++/include/arlgnsym.h +++ /dev/null @@ -1,252 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLGNSym.h. - Arpack++ class ARluNonSymGenEig definition - (SuperLU version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARLGNSYM_H -#define ARLGNSYM_H - -#include -#include -#include "arch.h" -#include "arlnsmat.h" -#include "arlnspen.h" -#include "argnsym.h" - - -template -class ARluNonSymGenEig: - public virtual ARNonSymGenEig, - ARluNonSymPencil > { - - protected: - - // a) Data structure used to store matrices. - - ARluNonSymPencil Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluNonSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp = 0.0); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - virtual void SetComplexShiftMode(char partp,ARFLOAT sigmaRp,ARFLOAT sigmaIp); - - // c.2) Constructors and destructor. - - ARluNonSymGenEig() { } - // Short constructor. - - ARluNonSymGenEig(int nevp, ARluNonSymMatrix& A, - ARluNonSymMatrix& B, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluNonSymGenEig(int nevp, ARluNonSymMatrix& A, - ARluNonSymMatrix& B, ARFLOAT sigma, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (real shift and invert mode). - - ARluNonSymGenEig(int nevp, ARluNonSymMatrix& A, - ARluNonSymMatrix& B, char partp, - ARFLOAT sigmaRp, ARFLOAT sigmaIp, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (complex shift and invert mode). - - ARluNonSymGenEig(const ARluNonSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluNonSymGenEig() { } - // Destructor. - - // d) Operators. - - ARluNonSymGenEig& operator=(const ARluNonSymGenEig& other); - // Assignment operator. - -}; // class ARluNonSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARluNonSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluNonSymGenEig:: -Copy(const ARluNonSymGenEig& other) -{ - - ARNonSymGenEig, - ARluNonSymPencil >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - this->objA = &Pencil; - if (this->mode > 2) { - if (this->sigmaI == 0.0) { - this->objOP->FactorAsB(this->sigmaR); - } - else { - this->objOP->FactorAsB(this->sigmaR, this->sigmaI, this->part); - } - } - -} // Copy. - - -template -inline void ARluNonSymGenEig:: -ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp) -{ - - if (sigmaIp == 0.0) { - this->objOP->FactorAsB(sigmaRp); - } - else { - this->objOP->FactorAsB(sigmaRp, sigmaIp, this->part); - } - ARrcNonSymGenEig::ChangeShift(sigmaRp, sigmaIp); - -} // ChangeShift. - - -template -inline void ARluNonSymGenEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(&Pencil, &ARluNonSymPencil::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluNonSymGenEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARNonSymGenEig, - ARluNonSymPencil >:: - SetShiftInvertMode(sigmap, &Pencil, - &ARluNonSymPencil::MultInvAsBv); - -} // SetShiftInvertMode. - - -template -inline void ARluNonSymGenEig:: -SetComplexShiftMode(char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp) -{ - - ARNonSymGenEig, - ARluNonSymPencil >:: - SetComplexShiftMode(partp, sigmaRp, sigmaIp, &Pencil, - &ARluNonSymPencil::MultInvAsBv, - &Pencil, &ARluNonSymPencil::MultAv); - -} // SetComplexShiftMode. - - -template -inline ARluNonSymGenEig:: -ARluNonSymGenEig(int nevp, ARluNonSymMatrix& A, - ARluNonSymMatrix& B, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARluNonSymPencil::MultInvBAv, &Pencil, - &ARluNonSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluNonSymGenEig:: -ARluNonSymGenEig(int nevp, ARluNonSymMatrix& A, - ARluNonSymMatrix& B, ARFLOAT sigmap, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARluNonSymPencil::MultInvAsBv, &Pencil, - &ARluNonSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - SetShiftInvertMode(sigmap); - -} // Long constructor (real shift and invert mode). - - -template -inline ARluNonSymGenEig:: -ARluNonSymGenEig(int nevp, ARluNonSymMatrix& A, - ARluNonSymMatrix& B, - char partp, ARFLOAT sigmaRp, - ARFLOAT sigmaIp, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARluNonSymPencil::MultInvAsBv, &Pencil, - &ARluNonSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - SetComplexShiftMode(partp, sigmaRp, sigmaIp); - -} // Long constructor (complex shift and invert mode). - - -template -ARluNonSymGenEig& ARluNonSymGenEig:: -operator=(const ARluNonSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARLGNSYM_H diff --git a/src/external/arpack++/include/arlgsym.h b/src/external/arpack++/include/arlgsym.h deleted file mode 100644 index 00f4a73c..00000000 --- a/src/external/arpack++/include/arlgsym.h +++ /dev/null @@ -1,235 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLGSym.h. - Arpack++ class ARluSymGenEig definition - (SuperLU version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Kristi Maschhoff - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARLGSYM_H -#define ARLGSYM_H - -#include -#include -#include "arch.h" -#include "arlsmat.h" -#include "arlspen.h" -#include "argsym.h" - - -template -class ARluSymGenEig: - public virtual ARSymGenEig, - ARluSymPencil > { - - private: - - // a) Data structure used to store matrices. - - ARluSymPencil Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmap); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - virtual void SetBucklingMode(ARFLOAT sigmap); - - virtual void SetCayleyMode(ARFLOAT sigmap); - - // c.2) Constructors and destructor. - - ARluSymGenEig() { } - // Short constructor. - - ARluSymGenEig(int nevp, ARluSymMatrix& A, - ARluSymMatrix& B, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluSymGenEig(char InvertModep, int nevp, ARluSymMatrix& A, - ARluSymMatrix& B, ARFLOAT sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert, buckling and Cayley modes). - - ARluSymGenEig(const ARluSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluSymGenEig() { } - // Destructor. - - // d) Operators. - - ARluSymGenEig& operator=(const ARluSymGenEig& other); - // Assignment operator. - -}; // class ARluSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARluSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluSymGenEig:: -Copy(const ARluSymGenEig& other) -{ - - ARSymGenEig, - ARluSymPencil >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - this->objA = &Pencil; - if (this->mode > 2) this->objOP->FactorAsB(this->sigmaR); - -} // Copy. - - -template -inline void ARluSymGenEig::ChangeShift(ARFLOAT sigmap) -{ - - this->objOP->FactorAsB(sigmap); - ARrcSymGenEig::ChangeShift(sigmap); - -} // ChangeShift. - - -template -inline void ARluSymGenEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(&Pencil, &ARluSymPencil::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluSymGenEig:: -SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARluSymPencil >:: - SetShiftInvertMode(sigmap, &Pencil, &ARluSymPencil::MultInvAsBv); - this->ChangeMultBx(&Pencil, &ARluSymPencil::MultBv); - -} // SetShiftInvertMode. - - -template -inline void ARluSymGenEig:: -SetBucklingMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARluSymPencil >:: - SetBucklingMode(sigmap, &Pencil, &ARluSymPencil::MultInvAsBv); - this->ChangeMultBx(&Pencil, &ARluSymPencil::MultAv); - -} // SetBucklingMode. - - -template -inline void ARluSymGenEig:: -SetCayleyMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARluSymPencil >:: - SetCayleyMode(sigmap, &Pencil, &ARluSymPencil::MultInvAsBv, - &Pencil, &ARluSymPencil::MultAv); - this->ChangeMultBx(&Pencil, &ARluSymPencil::MultBv); - -} // SetCayleyMode. - - -template -inline ARluSymGenEig:: -ARluSymGenEig(int nevp, ARluSymMatrix& A, - ARluSymMatrix& B, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->InvertMode = 'S'; - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARluSymPencil::MultInvBAv, &Pencil, - &ARluSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluSymGenEig:: -ARluSymGenEig(char InvertModep, int nevp, ARluSymMatrix& A, - ARluSymMatrix& B, ARFLOAT sigmap, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARluSymPencil::MultInvAsBv, &Pencil, - &ARluSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - this->InvertMode = this->CheckInvertMode(InvertModep); - switch (this->InvertMode) { - case 'B': // Buckling mode. - this->ChangeMultBx(&Pencil, &ARluSymPencil::MultAv); - case 'S': // Shift and invert mode. - ChangeShift(sigmap); - break; - case 'C': // Cayley mode. - SetCayleyMode(sigmap); - } - -} // Long constructor (shift and invert, buckling and Cayley modes). - - -template -ARluSymGenEig& ARluSymGenEig:: -operator=(const ARluSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARLGSYM_H diff --git a/src/external/arpack++/include/arlnames.h b/src/external/arpack++/include/arlnames.h deleted file mode 100644 index 1664f173..00000000 --- a/src/external/arpack++/include/arlnames.h +++ /dev/null @@ -1,464 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLNames.h. - Unaltered copy of Cnames.h (from SuperLU package). -*/ - -/* - * -- SuperLU routine (version 2.0) -- - * Univ. of California Berkeley, Xerox Palo Alto Research Center, - * and Lawrence Berkeley National Lab. - * November 1, 1997 - * - */ -#ifndef __SUPERLU_CNAMES /* allow multiple inclusions */ -#define __SUPERLU_CNAMES - -/* - * These macros define how C routines will be called. ADD_ assumes that - * they will be called by fortran, which expects C routines to have an - * underscore postfixed to the name (Suns, and the Intel expect this). - * NOCHANGE indicates that fortran will be calling, and that it expects - * the name called by fortran to be identical to that compiled by the C - * (RS6K's do this). UPCASE says it expects C routines called by fortran - * to be in all upcase (CRAY wants this). - */ - -#define ADD_ 0 -#define ADD__ 1 -#define NOCHANGE 2 -#define UPCASE 3 -#define OLD_CRAY 4 -#define C_CALL 5 - -#ifdef UpCase -#define F77_CALL_C UPCASE -#endif - -#ifdef NoChange -#define F77_CALL_C NOCHANGE -#endif - -#ifdef Add_ -#define F77_CALL_C ADD_ -#endif - -#ifdef Add__ -#define F77_CALL_C ADD__ -#endif - -#ifdef _CRAY -#define F77_CALL_C OLD_CRAY -#endif - -/* Default */ -#ifndef F77_CALL_C -#define F77_CALL_C ADD_ -#endif - - -#if (F77_CALL_C == ADD_) -/* - * These defines set up the naming scheme required to have a fortran 77 - * routine call a C routine - * No redefinition necessary to have following Fortran to C interface: - * FORTRAN CALL C DECLARATION - * call dgemm(...) void dgemm_(...) - * - * This is the default. - */ - -#endif - -#if (F77_CALL_C == ADD__) -/* - * These defines set up the naming scheme required to have a fortran 77 - * routine call a C routine - * for following Fortran to C interface: - * FORTRAN CALL C DECLARATION - * call dgemm(...) void dgemm__(...) - */ -/* BLAS */ -#define sswap_ sswap__ -#define saxpy_ saxpy__ -#define sasum_ sasum__ -#define isamax_ isamax__ -#define scopy_ scopy__ -#define sscal_ sscal__ -#define sger_ sger__ -#define snrm2_ snrm2__ -#define ssymv_ ssymv__ -#define sdot_ sdot__ -#define saxpy_ saxpy__ -#define ssyr2_ ssyr2__ -#define srot_ srot__ -#define sgemv_ sgemv__ -#define strsv_ strsv__ -#define sgemm_ sgemm__ -#define strsm_ strsm__ - -#define dswap_ dswap__ -#define daxpy_ daxpy__ -#define dasum_ dasum__ -#define idamax_ idamax__ -#define dcopy_ dcopy__ -#define dscal_ dscal__ -#define dger_ dger__ -#define dnrm2_ dnrm2__ -#define dsymv_ dsymv__ -#define ddot_ ddot__ -#define dsyr2_ dsyr2__ -#define drot_ drot__ -#define dgemv_ dgemv__ -#define dtrsv_ dtrsv__ -#define dgemm_ dgemm__ -#define dtrsm_ dtrsm__ - -#define cswap_ cswap__ -#define caxpy_ caxpy__ -#define scasum_ scasum__ -#define icamax_ icamax__ -#define ccopy_ ccopy__ -#define cscal_ cscal__ -#define scnrm2_ scnrm2__ -#define caxpy_ caxpy__ -#define cgemv_ cgemv__ -#define ctrsv_ ctrsv__ -#define cgemm_ cgemm__ -#define ctrsm_ ctrsm__ -#define cgerc_ cgerc__ -#define chemv_ chemv__ -#define cher2_ cher2__ - -#define zswap_ zswap__ -#define zaxpy_ zaxpy__ -#define dzasum_ dzasum__ -#define izamax_ izamax__ -#define zcopy_ zcopy__ -#define zscal_ zscal__ -#define dznrm2_ dznrm2__ -#define zaxpy_ zaxpy__ -#define zgemv_ zgemv__ -#define ztrsv_ ztrsv__ -#define zgemm_ zgemm__ -#define ztrsm_ ztrsm__ -#define zgerc_ zgerc__ -#define zhemv_ zhemv__ -#define zher2_ zher2__ - -/* LAPACK */ -#define dlamch_ dlamch__ -#define slamch_ slamch__ -#define xerbla_ xerbla__ -#define lsame_ lsame__ -#define dlacon_ dlacon__ -#define slacon_ slacon__ -#define icmax1_ icmax1__ -#define scsum1_ scsum1__ -#define clacon_ clacon__ -#define dzsum1_ dzsum1__ -#define izmax1_ izmax1__ -#define zlacon_ zlacon__ - -/* Fortran interface */ -#define c_bridge_dgssv_ c_bridge_dgssv__ -#define c_fortran_sgssv_ c_fortran_sgssv__ -#define c_fortran_dgssv_ c_fortran_dgssv__ -#define c_fortran_cgssv_ c_fortran_cgssv__ -#define c_fortran_zgssv_ c_fortran_zgssv__ -#endif - -#if (F77_CALL_C == UPCASE) -/* - * These defines set up the naming scheme required to have a fortran 77 - * routine call a C routine - * following Fortran to C interface: - * FORTRAN CALL C DECLARATION - * call dgemm(...) void DGEMM(...) - */ -/* BLAS */ -#define sswap_ SSWAP -#define saxpy_ SAXPY -#define sasum_ SASUM -#define isamax_ ISAMAX -#define scopy_ SCOPY -#define sscal_ SSCAL -#define sger_ SGER -#define snrm2_ SNRM2 -#define ssymv_ SSYMV -#define sdot_ SDOT -#define saxpy_ SAXPY -#define ssyr2_ SSYR2 -#define srot_ SROT -#define sgemv_ SGEMV -#define strsv_ STRSV -#define sgemm_ SGEMM -#define strsm_ STRSM - -#define dswap_ DSWAP -#define daxpy_ DAXPY -#define dasum_ DASUM -#define idamax_ IDAMAX -#define dcopy_ DCOPY -#define dscal_ DSCAL -#define dger_ DGER -#define dnrm2_ DNRM2 -#define dsymv_ DSYMV -#define ddot_ DDOT -#define dsyr2_ DSYR2 -#define drot_ DROT -#define dgemv_ DGEMV -#define dtrsv_ DTRSV -#define dgemm_ DGEMM -#define dtrsm_ DTRSM - -#define cswap_ CSWAP -#define caxpy_ CAXPY -#define scasum_ SCASUM -#define icamax_ ICAMAX -#define ccopy_ CCOPY -#define cscal_ CSCAL -#define scnrm2_ SCNRM2 -#define cgemv_ CGEMV -#define ctrsv_ CTRSV -#define cgemm_ CGEMM -#define ctrsm_ CTRSM -#define cgerc_ CGERC -#define chemv_ CHEMV -#define cher2_ CHER2 - -#define zswap_ ZSWAP -#define zaxpy_ ZAXPY -#define dzasum_ DZASUM -#define izamax_ IZAMAX -#define zcopy_ ZCOPY -#define zscal_ ZSCAL -#define dznrm2_ DZNRM2 -#define zgemv_ ZGEMV -#define ztrsv_ ZTRSV -#define zgemm_ ZGEMM -#define ztrsm_ ZTRSM -#define zgerc_ ZGERC -#define zhemv_ ZHEMV -#define zher2_ ZHER2 - -/* LAPACK */ -#define dlamch_ DLAMCH -#define slamch_ SLAMCH -#define xerbla_ XERBLA -#define lsame_ LSAME -#define dlacon_ DLACON -#define slacon_ SLACON -#define icmax1_ ICMAX1 -#define scsum1_ SCSUM1 -#define clacon_ CLACON -#define dzsum1_ DZSUM1 -#define izmax1_ IZMAX1 -#define zlacon_ ZLACON - -/* Fortran interface */ -#define c_bridge_dgssv_ C_BRIDGE_DGSSV -#define c_fortran_sgssv_ C_FORTRAN_SGSSV -#define c_fortran_dgssv_ C_FORTRAN_DGSSV -#define c_fortran_cgssv_ C_FORTRAN_CGSSV -#define c_fortran_zgssv_ C_FORTRAN_ZGSSV -#endif - - -#if (F77_CALL_C == OLD_CRAY) -/* - * These defines set up the naming scheme required to have a fortran 77 - * routine call a C routine - * following Fortran to C interface: - * FORTRAN CALL C DECLARATION - * call dgemm(...) void SGEMM(...) - */ -/* BLAS */ -#define sswap_ SSWAP -#define saxpy_ SAXPY -#define sasum_ SASUM -#define isamax_ ISAMAX -#define scopy_ SCOPY -#define sscal_ SSCAL -#define sger_ SGER -#define snrm2_ SNRM2 -#define ssymv_ SSYMV -#define sdot_ SDOT -#define ssyr2_ SSYR2 -#define srot_ SROT -#define sgemv_ SGEMV -#define strsv_ STRSV -#define sgemm_ SGEMM -#define strsm_ STRSM - -#define dswap_ SSWAP -#define daxpy_ SAXPY -#define dasum_ SASUM -#define idamax_ ISAMAX -#define dcopy_ SCOPY -#define dscal_ SSCAL -#define dger_ SGER -#define dnrm2_ SNRM2 -#define dsymv_ SSYMV -#define ddot_ SDOT -#define dsyr2_ SSYR2 -#define drot_ SROT -#define dgemv_ SGEMV -#define dtrsv_ STRSV -#define dgemm_ SGEMM -#define dtrsm_ STRSM - -#define cswap_ CSWAP -#define caxpy_ CAXPY -#define scasum_ SCASUM -#define icamax_ ICAMAX -#define ccopy_ CCOPY -#define cscal_ CSCAL -#define scnrm2_ SCNRM2 -#define caxpy_ CAXPY -#define cgemv_ CGEMV -#define ctrsv_ CTRSV -#define cgemm_ CGEMM -#define ctrsm_ CTRSM -#define cgerc_ CGERC -#define chemv_ CHEMV -#define cher2_ CHER2 - -#define zswap_ ZSWAP -#define zaxpy_ ZAXPY -#define dzasum_ DZASUM -#define izamax_ IZAMAX -#define zcopy_ ZCOPY -#define zscal_ ZSCAL -#define dznrm2_ DZNRM2 -#define zgemv_ ZGEMV -#define ztrsv_ ZTRSV -#define zgemm_ ZGEMM -#define ztrsm_ ZTRSM -#define zgerc_ ZGERC -#define zhemv_ ZHEMV -#define zher2_ ZHER2 - -/* LAPACK */ -#define dlamch_ DLAMCH -#define slamch_ SLAMCH -#define xerbla_ XERBLA -#define lsame_ LSAME -#define dlacon_ DLACON -#define slacon_ SLACON -#define icmax1_ ICMAX1 -#define scsum1_ SCSUM1 -#define clacon_ CLACON -#define dzsum1_ DZSUM1 -#define izmax1_ IZMAX1 -#define zlacon_ ZLACON - -/* Fortran interface */ -#define c_bridge_dgssv_ C_BRIDGE_DGSSV -#define c_fortran_sgssv_ C_FORTRAN_SGSSV -#define c_fortran_dgssv_ C_FORTRAN_DGSSV -#define c_fortran_cgssv_ C_FORTRAN_CGSSV -#define c_fortran_zgssv_ C_FORTRAN_ZGSSV -#endif - - -#if (F77_CALL_C == NOCHANGE) -/* - * These defines set up the naming scheme required to have a fortran 77 - * routine call a C routine - * for following Fortran to C interface: - * FORTRAN CALL C DECLARATION - * call dgemm(...) void dgemm(...) - */ -/* BLAS */ -#define sswap_ sswap -#define saxpy_ saxpy -#define sasum_ sasum -#define isamax_ isamax -#define scopy_ scopy -#define sscal_ sscal -#define sger_ sger -#define snrm2_ snrm2 -#define ssymv_ ssymv -#define sdot_ sdot -#define saxpy_ saxpy -#define ssyr2_ ssyr2 -#define srot_ srot -#define sgemv_ sgemv -#define strsv_ strsv -#define sgemm_ sgemm -#define strsm_ strsm - -#define dswap_ dswap -#define daxpy_ daxpy -#define dasum_ dasum -#define idamax_ idamax -#define dcopy_ dcopy -#define dscal_ dscal -#define dger_ dger -#define dnrm2_ dnrm2 -#define dsymv_ dsymv -#define ddot_ ddot -#define dsyr2_ dsyr2 -#define drot_ drot -#define dgemv_ dgemv -#define dtrsv_ dtrsv -#define dgemm_ dgemm -#define dtrsm_ dtrsm - -#define cswap_ cswap -#define caxpy_ caxpy -#define scasum_ scasum -#define icamax_ icamax -#define ccopy_ ccopy -#define cscal_ cscal -#define scnrm2_ scnrm2 -#define cgemv_ cgemv -#define ctrsv_ ctrsv -#define cgemm_ cgemm -#define ctrsm_ ctrsm -#define cgerc_ cgerc -#define chemv_ chemv -#define cher2_ cher2 - -#define zswap_ zswap -#define zaxpy_ zaxpy -#define dzasum_ dzasum -#define izamax_ izamax -#define zcopy_ zcopy -#define zscal_ zscal -#define dznrm2_ dznrm2 -#define zgemv_ zgemv -#define ztrsv_ ztrsv -#define zgemm_ zgemm -#define ztrsm_ ztrsm -#define zgerc_ zgerc -#define zhemv_ zhemv -#define zher2_ zher2 - -/* LAPACK */ -#define dlamch_ dlamch -#define slamch_ slamch -#define xerbla_ xerbla -#define lsame_ lsame -#define dlacon_ dlacon -#define slacon_ slacon -#define icmax1_ icmax1 -#define scsum1_ scsum1 -#define clacon_ clacon -#define dzsum1_ dzsum1 -#define izmax1_ izmax1 -#define zlacon_ zlacon - -/* Fortran interface */ -#define c_bridge_dgssv_ c_bridge_dgssv -#define c_fortran_sgssv_ c_fortran_sgssv -#define c_fortran_dgssv_ c_fortran_dgssv -#define c_fortran_cgssv_ c_fortran_cgssv -#define c_fortran_zgssv_ c_fortran_zgssv -#endif - - -#endif /* __SUPERLU_CNAMES */ diff --git a/src/external/arpack++/include/arlnsmat.h b/src/external/arpack++/include/arlnsmat.h deleted file mode 100644 index 07a547f9..00000000 --- a/src/external/arpack++/include/arlnsmat.h +++ /dev/null @@ -1,753 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLNSMat.h. - Arpack++ class ARluNonSymMatrix definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - - -#include "arlnspen.h" - -#ifndef ARLNSMAT_H -#define ARLNSMAT_H - -#include -#include -#include "arch.h" -#include "armat.h" -#include "arhbmat.h" -#include "arerror.h" -#include "blas1c.h" -#include "superluc.h" -#include "arlspdef.h" -#include "arlutil.h" - -template class ARluNonSymPencil; - -template -class ARluNonSymMatrix: public ARMatrix { - - friend class ARluNonSymPencil; - friend class ARluNonSymPencil; - - protected: - - bool factored; - int order; - int nnz; - int* irow; - int* pcol; - int* permc; - int* permr; - double threshold; - ARTYPE* a; - SuperMatrix A; - SuperMatrix L; - SuperMatrix U; - ARhbMatrix mat; - SuperLUStat_t stat; - - bool DataOK(); - - virtual void Copy(const ARluNonSymMatrix& other); - - void ClearMem(); - - void SubtractAsI(ARTYPE sigma, NCformat& A, NCformat& AsI); - - public: - - int nzeros() { return nnz; } - - bool IsFactored() { return factored; } - - void FactorA(); - - void FactorAsI(ARTYPE sigma); - - void MultMv(ARTYPE* v, ARTYPE* w); - - void MultMtv(ARTYPE* v, ARTYPE* w); - - void MultMtMv(ARTYPE* v, ARTYPE* w); - - void MultMMtv(ARTYPE* v, ARTYPE* w); - - void Mult0MMt0v(ARTYPE* v, ARTYPE* w); - - void MultInvv(ARTYPE* v, ARTYPE* w); - - void DefineMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, double thresholdp = 0.1, - int orderp = 1, bool check = true); // Square matrix. - - void DefineMatrix(int mp, int np, int nnzp, ARTYPE* ap, - int* irowp, int* pcolp); // Rectangular matrix. - - ARluNonSymMatrix(); - // Short constructor that does nothing. - - ARluNonSymMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, int* pcolp, - double thresholdp = 0.1, int orderp = 1, bool check = true); - // Long constructor (square matrix). - - ARluNonSymMatrix(int mp, int np, int nnzp, ARTYPE* ap, int* irowp,int* pcolp); - // Long constructor (rectangular matrix). - - ARluNonSymMatrix(const std::string& name, double thresholdp = 0.1, - int orderp = 1, bool check = true); - // Long constructor (Harwell-Boeing file). - - ARluNonSymMatrix(const ARluNonSymMatrix& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluNonSymMatrix() { ClearMem(); } - // Destructor. - - ARluNonSymMatrix& operator=(const ARluNonSymMatrix& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARluNonSymMatrix member functions definition. // -// ------------------------------------------------------------------------ // - - -template -bool ARluNonSymMatrix::DataOK() -{ - - int i, j, k; - - // Checking if pcol is in ascending order. - - i = 0; - while ((i!=this->n)&&(pcol[i]<=pcol[i+1])) i++; - if (i!=this->n) return false; - - // Checking if irow components are in order and within bounds. - - for (i=0; i!=this->n; i++) { - j = pcol[i]; - k = pcol[i+1]-1; - if (j<=k) { - if ((irow[j]<0)||(irow[k]>=this->n)) return false; - while ((j!=k)&&(irow[j] -inline void ARluNonSymMatrix:: -Copy(const ARluNonSymMatrix& other) -{ - - // Copying very fundamental variables. - - this->defined = other.defined; - factored = other.factored; - - // Returning from here if "other" was not initialized. - - if (!this->defined) return; - - // Copying user-defined parameters. - - if (other.n == other.m) { - DefineMatrix(other.n, other.nnz, other.a, other.irow, - other.pcol, other.threshold, other.order); - } - else { - DefineMatrix(other.m, other.n, other.nnz, - other.a, other.irow, other.pcol); - } - - // Throwing the original factorization away (this procedure - // is really awkward, but it is necessary because there - // is no copy function for matrices L and U in the SuperLU - // library and it is not a good idea to do this kind of deep - // copy here). - - if (factored) { - ArpackError(ArpackError::LAPACK_ERROR, "ARluNonSymMatrix"); - factored = false; - } - -} // Copy. - - -template -void ARluNonSymMatrix::ClearMem() -{ - - if (factored) { - Destroy_SuperNode_Matrix(&L); - Destroy_CompCol_Matrix(&U); - StatFree(&stat); - } - if (this->defined) { - Destroy_SuperMatrix_Store(&A); // delete A.Store; - delete[] permc; - delete[] permr; - permc = NULL; - permr = NULL; - A.Store = NULL; - } - -} // ClearMem. - - -template -void ARluNonSymMatrix:: -SubtractAsI(ARTYPE sigma, NCformat& A, NCformat& AsI) -{ - - // Defining local variables. - - int i, j, k, end; - ARTYPE* anzval; - ARTYPE* inzval; - - // Telling the compiler that nzval must be viewed as a vector of ARTYPE. - - anzval = (ARTYPE*)A.nzval; - inzval = (ARTYPE*)AsI.nzval; - - // Subtracting sigma from diagonal elements. - - k = 0; - AsI.colptr[0] = 0; - - for (i=0; i!=this->n; i++) { - - j = A.colptr[i]; - end = A.colptr[i+1]; - - // Copying superdiagonal elements of column i. - - while ((A.rowind[j] < i)&&(j < end)) { - inzval[k] = anzval[j]; - AsI.rowind[k++] = A.rowind[j++]; - } - - // Verifying if A(i,i) exists. - - if ((A.rowind[j] == i)&&(j < end)) { // A(i,i) exists, subtracting sigma. - inzval[k] = anzval[j++] - sigma; - } - else { // A(i,i) does not exist. - inzval[k] = -sigma; - } - AsI.rowind[k++] = i; - - // Copying subdiagonal elements of column i. - - while (j < end ) { - inzval[k] = anzval[j]; - AsI.rowind[k++] = A.rowind[j++]; - } - - AsI.colptr[i+1] = k; - - } - - AsI.nnz = AsI.colptr[this->n]; - -} // SubtractAsI. - - -template -void ARluNonSymMatrix::FactorA() -{ - - // Defining local variables. - - int info; - int* etree; - SuperMatrix AC; - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARluNonSymMatrix::FactorA"); - } - - // Quitting the function if A is not square. - - if (this->m != this->n) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARluNonSymMatrix::FactorA"); - } - - // Deleting previous versions of L and U. - - if (factored) { - Destroy_SuperNode_Matrix(&L); - Destroy_CompCol_Matrix(&U); - StatFree(&stat); - } - - // Setting default values for gstrf parameters. - - int panel_size = sp_ienv(1); - int relax = sp_ienv(2); - superlu_options_t options; - - /* Set the default input options: - options.Fact = DOFACT; - options.Equil = YES; - options.ColPerm = COLAMD; - options.DiagPivotThresh = 1.0; - options.Trans = NOTRANS; - options.IterRefine = NOREFINE; - options.SymmetricMode = NO; - options.PivotGrowth = NO; - options.ConditionNumber = NO; - options.PrintStat = YES; - */ - set_default_options(&options); - options.DiagPivotThresh = threshold; - - // Reserving memory for etree (used in matrix decomposition). - - etree = new int[this->n]; - - // Defining LUStat. - - //StatInit(panel_size, relax); - StatInit(&stat); - - // Defining the column permutation of matrix A - // (using minimum degree ordering on A'*A). - - get_perm_c(order, &A, permc); - - // Permuting columns of A and - // creating the elimination tree of A'*A. - -// sp_preorder("N", &A, permc, etree, &AC); - sp_preorder(&options, &A, permc, etree, &AC); - - // Decomposing A. - -// gstrf("N",&AC, threshold, drop_tol, relax, panel_size, etree, -// NULL, 0, permr, permc, &L, &U, &info); - gstrf(&options,&AC, relax, panel_size, etree, - NULL, 0, permc, permr, &L, &U, &stat, &info); - - // Deleting AC and etree. - - Destroy_CompCol_Permuted(&AC); - delete[] etree; - - factored = (info == 0); - - // Handling errors. - - if (info < 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARluNonSymMatrix::FactorA"); - } - else if (info > this->n) { // Memory is not sufficient. - throw ArpackError(ArpackError::MEMORY_OVERFLOW, - "ARluNonSymMatrix::FactorA"); - } - else if (info > 0) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARluNonSymMatrix::FactorA"); - } - -} // FactorA. - - -template -void ARluNonSymMatrix::FactorAsI(ARTYPE sigma) -{ - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARluNonSymMatrix::FactorAsI"); - } - - // Quitting the function if A is not square. - - if (this->m != this->n) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARluNonSymMatrix::FactorAsI"); - } - - // Defining local variables. - - int info; - int* etree; - int* irowi; - int* pcoli; - ARTYPE* asi; - SuperMatrix AsI; - SuperMatrix AC; - NCformat* Astore; - NCformat* AsIstore; - - // Deleting previous versions of L and U. - - if (factored) { - Destroy_SuperNode_Matrix(&L); - Destroy_CompCol_Matrix(&U); - StatFree(&stat); - } - - // Setting default values for gstrf parameters. - - int panel_size = sp_ienv(1); - int relax = sp_ienv(2); - superlu_options_t options; - - /* Set the default input options: - options.Fact = DOFACT; - options.Equil = YES; - options.ColPerm = COLAMD; - options.DiagPivotThresh = 1.0; - options.Trans = NOTRANS; - options.IterRefine = NOREFINE; - options.SymmetricMode = NO; - options.PivotGrowth = NO; - options.ConditionNumber = NO; - options.PrintStat = YES; - */ - set_default_options(&options); - options.DiagPivotThresh = threshold; - - // Creating a temporary matrix AsI. - - irowi = (int*)SUPERLU_MALLOC(sizeof(int) * (nnz+this->n)); - pcoli = (int*)SUPERLU_MALLOC(sizeof(int) * (this->n+1)); - asi = (ARTYPE*)SUPERLU_MALLOC(sizeof(ARTYPE) * (nnz+this->n)); - Create_CompCol_Matrix(&AsI, this->n, this->n, nnz, asi, irowi, pcoli, SLU_NC, SLU_GE); - - // Subtracting sigma*I from A and storing the result on AsI. - - Astore = (NCformat*)A.Store; - AsIstore = (NCformat*)AsI.Store; - SubtractAsI(sigma, *Astore, *AsIstore); - - // Reserving memory for etree (used in matrix decomposition). - - etree = new int[this->n]; - - // Defining LUStat. - - //StatInit(panel_size, relax); - StatInit(&stat); - - // Defining the column permutation of matrix AsI - // (using minimum degree ordering on AsI'*AsI). - - get_perm_c(order, &AsI, permc); - - // Permuting columns of AsI and - // creating the elimination tree of AsI'*AsI. - - //sp_preorder("N", &AsI, permc, etree, &AC); - sp_preorder(&options, &AsI, permc, etree, &AC); - - // Decomposing AsI. - -// gstrf("N",&AC, threshold, drop_tol, relax, panel_size, etree, -// NULL, 0, permr, permc, &L, &U, &info); - gstrf(&options,&AC, relax, panel_size, etree, - NULL, 0, permc, permr, &L, &U, &stat, &info); - - // Deleting AC, AsI and etree. - - Destroy_CompCol_Permuted(&AC); - Destroy_CompCol_Matrix(&AsI); - delete[] etree; - - factored = (info == 0); - - // Handling errors. - - if (info < 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARluNonSymMatrix::FactorAsI"); - } - else if (info > this->n) { // Memory is not sufficient. - throw ArpackError(ArpackError::MEMORY_OVERFLOW, - "ARluNonSymMatrix::FactorAsI"); - } - else if (info > 0) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARluNonSymMatrix::FactorAsI"); - } - -} // FactorAsI. - - -template -void ARluNonSymMatrix::MultMv(ARTYPE* v, ARTYPE* w) -{ - - int i,j; - ARTYPE t; - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARluNonSymMatrix::MultMv"); - } - - // Determining w = M.v. - - for (i=0; i!=this->m; i++) w[i]=(ARTYPE)0; - - for (i=0; i!=this->n; i++) { - t = v[i]; - for (j=pcol[i]; j!=pcol[i+1]; j++) { - w[irow[j]] += t*a[j]; - } - } - -} // MultMv. - - -template -void ARluNonSymMatrix::MultMtv(ARTYPE* v, ARTYPE* w) -{ - - int i,j; - ARTYPE t; - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARluNonSymMatrix::MultMtv"); - } - - // Determining w = M'.v. - - for (i=0; i!=this->n; i++) { - t = (ARTYPE)0; - for (j=pcol[i]; j!=pcol[i+1]; j++) { - t += v[irow[j]]*a[j]; - } - w[i] = t; - } - -} // MultMtv. - - -template -void ARluNonSymMatrix::MultMtMv(ARTYPE* v, ARTYPE* w) -{ - - ARTYPE* t = new ARTYPE[this->m]; - - MultMv(v,t); - MultMtv(t,w); - - delete[] t; - -} // MultMtMv. - - -template -void ARluNonSymMatrix::MultMMtv(ARTYPE* v, ARTYPE* w) -{ - - ARTYPE* t = new ARTYPE[this->n]; - - MultMtv(v,t); - MultMv(t,w); - - delete[] t; - -} // MultMMtv. - - -template -void ARluNonSymMatrix::Mult0MMt0v(ARTYPE* v, ARTYPE* w) -{ - - MultMv(&v[this->m],w); - MultMtv(v,&w[this->m]); - -} // Mult0MMt0v. - - -template -void ARluNonSymMatrix::MultInvv(ARTYPE* v, ARTYPE* w) -{ - - // Quitting the function if A (or AsI) was not factored. - - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARluNonSymMatrix::MultInvv"); - } - - // Solving A.w = v (or AsI.w = v). - - int info; - SuperMatrix B; - - if (&v != &w) copy(this->n, v, 1, w, 1); - Create_Dense_Matrix(&B, this->n, 1, w, this->n, SLU_DN, SLU_GE); -// gstrs("N", &L, &U, permr, permc, &B, &info); - StatInit(&stat); - trans_t trans = NOTRANS; - gstrs(trans, &L, &U, permc, permr, &B, &stat, &info); - Destroy_SuperMatrix_Store(&B); // delete B.Store; - -} // MultInvv. - - -template -inline void ARluNonSymMatrix:: -DefineMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, int* pcolp, - double thresholdp, int orderp, bool check) -{ - - this->m = np; - this->n = np; - nnz = nnzp; - a = ap; - irow = irowp; - pcol = pcolp; - pcol[this->n] = nnz; - threshold = thresholdp; - order = orderp; - - // Checking data. - - if ((check)&&(!DataOK())) { - throw ArpackError(ArpackError::INCONSISTENT_DATA, - "ARluSymMatrix::DefineMatrix"); - } - - // Creating SuperMatrix A. - - Create_CompCol_Matrix(&A, this->n, this->n, nnz, a, irow, pcol, SLU_NC, SLU_GE); - - // Reserving memory for vectors used in matrix decomposition. - - permc = new int[this->n]; - permr = new int[this->n]; - - this->defined = true; - -} // DefineMatrix (square). - - -template -inline void ARluNonSymMatrix:: -DefineMatrix(int mp, int np, int nnzp, ARTYPE* ap, int* irowp, int* pcolp) -{ - - this->m = mp; - this->n = np; - nnz = nnzp; - a = ap; - irow = irowp; - pcol = pcolp; - pcol[this->n] = nnz; - this->defined = true; - permc = NULL; - permr = NULL; - -} // DefineMatrix (rectangular). - - -template -inline ARluNonSymMatrix::ARluNonSymMatrix(): ARMatrix() -{ - - factored = false; - permc = NULL; - permr = NULL; - -} // Short constructor. - - -template -inline ARluNonSymMatrix:: -ARluNonSymMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, double thresholdp, - int orderp, bool check) : ARMatrix(np) -{ - - factored = false; - DefineMatrix(np, nnzp, ap, irowp, pcolp, thresholdp, orderp, check); - -} // Long constructor (square matrix). - - -template -inline ARluNonSymMatrix:: -ARluNonSymMatrix(int mp, int np, int nnzp, ARTYPE* ap, - int* irowp, int* pcolp) : ARMatrix(mp, np) -{ - - factored = false; - DefineMatrix(mp, np, nnzp, ap, irowp, pcolp); - -} // Long constructor (retangular matrix). - - -template -ARluNonSymMatrix:: -ARluNonSymMatrix(const std::string& file, double thresholdp, int orderp, bool check) -{ - - factored = false; - - try { - mat.Define(file); - } - catch (ArpackError) { // Returning from here if an error has occurred. - throw ArpackError(ArpackError::CANNOT_READ_FILE, "ARluNonSymMatrix"); - } - - if (mat.NCols()==mat.NRows()) { - DefineMatrix(mat.NCols(), mat.NonZeros(), (ARTYPE*)mat.Entries(), - mat.RowInd(), mat.ColPtr(), thresholdp, orderp, check); - } - else { - DefineMatrix(mat.NRows(), mat.NCols(), mat.NonZeros(), - (ARTYPE*)mat.Entries(), mat.RowInd(), mat.ColPtr()); - } - -} // Long constructor (Harwell-Boeing file). - - -template -ARluNonSymMatrix& ARluNonSymMatrix:: -operator=(const ARluNonSymMatrix& other) -{ - - if (this != &other) { // Stroustrup suggestion. - ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARLNSMAT_H diff --git a/src/external/arpack++/include/arlnspen.h b/src/external/arpack++/include/arlnspen.h deleted file mode 100644 index b479ac65..00000000 --- a/src/external/arpack++/include/arlnspen.h +++ /dev/null @@ -1,774 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLNSPen.h. - Arpack++ class ARluNonSymPencil definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARLNSPEN_H -#define ARLNSPEN_H - -#include - -#include "arch.h" -#include "arerror.h" -#include "blas1c.h" -#include "superluc.h" -#include "arlspdef.h" -#include "arlutil.h" -#include "arlnsmat.h" - - -template -class ARluNonSymPencil -{ - - protected: - - bool factored; - int* permc; - int* permr; - char part; - ARluNonSymMatrix* A; - ARluNonSymMatrix* B; - SuperMatrix L; - SuperMatrix U; - SuperLUStat_t stat; - - virtual void Copy(const ARluNonSymPencil& other); - - void ClearMem(); - - void SparseSaxpy(ARTYPE a, ARTYPE x[], int xind[], int nx, ARTYPE y[], - int yind[], int ny, ARTYPE z[], int zind[], int& nz); - -#ifdef ARCOMP_H - void SparseSaxpy(arcomplex a, ARFLOAT x[], int xind[], int nx, - ARFLOAT y[], int yind[], int ny, arcomplex z[], - int zind[], int& nz); -#endif - - void SubtractAsB(int n, ARTYPE sigma, NCformat& A, - NCformat& B, NCformat& AsB); - -#ifdef ARCOMP_H - void SubtractAsB(int n, ARFLOAT sigmaR, ARFLOAT sigmaI, - NCformat& A, NCformat& B, NCformat& AsB); -#endif - - public: - - bool IsFactored() { return factored; } - - void FactorAsB(ARTYPE sigma); - -#ifdef ARCOMP_H - void FactorAsB(ARFLOAT sigmaR, ARFLOAT sigmaI, char partp = 'R'); -#endif - - void MultAv(ARTYPE* v, ARTYPE* w) { A->MultMv(v,w); } - - void MultBv(ARTYPE* v, ARTYPE* w) { B->MultMv(v,w); } - - void MultInvBAv(ARTYPE* v, ARTYPE* w); - -#ifdef ARCOMP_H - void MultInvAsBv(arcomplex* v, arcomplex* w); -#endif - - void MultInvAsBv(ARFLOAT* v, ARFLOAT* w); - - void DefineMatrices(ARluNonSymMatrix& Ap, - ARluNonSymMatrix& Bp); - - ARluNonSymPencil(); - // Short constructor that does nothing. - - ARluNonSymPencil(ARluNonSymMatrix& Ap, - ARluNonSymMatrix& Bp); - // Long constructor. - - ARluNonSymPencil(const ARluNonSymPencil& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluNonSymPencil() { ClearMem(); } - // Destructor. - - ARluNonSymPencil& operator=(const ARluNonSymPencil& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARluNonSymPencil member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluNonSymPencil:: -Copy(const ARluNonSymPencil& other) -{ - - factored = other.factored; - part = other.part; - A = other.A; - B = other.B; - - // Throwing the original factorization away (this procedure - // is really awkward, but it is necessary because there - // is no copy function for matrices L and U in the SuperLU - // library and it is not a good idea to do this kind of deep - // copy here). - - if (factored) { - ArpackError(ArpackError::DISCARDING_FACTORS, "ARluNonSymPencil"); - factored = false; - } - -} // Copy. - - -template -void ARluNonSymPencil::ClearMem() -{ - - if (factored) { - Destroy_SuperNode_Matrix(&L); - Destroy_CompCol_Matrix(&U); - StatFree(&stat); - delete[] permc; - delete[] permr; - permc = NULL; - permr = NULL; - } - -} // ClearMem. - - -template -void ARluNonSymPencil:: -SparseSaxpy(ARTYPE a, ARTYPE x[], int xind[], int nx, ARTYPE y[], - int yind[], int ny, ARTYPE z[], int zind[], int& nz) -// A strongly sequential (and inefficient) sparse saxpy algorithm. -{ - - int ix, iy; - - nz = 0; - if ((nx == 0) || (a == (ARTYPE)0)) { - copy(ny,y,1,z,1); - for (iy=0; iy!=ny; iy++) zind[iy] = yind[iy]; - nz = ny; - return; - } - if (ny == 0) { - copy(nx,x,1,z,1); - scal(nx,a,z,1); - for (ix=0; ix!=nx; ix++) zind[ix] = xind[ix]; - nz = nx; - return; - } - ix = 0; - iy = 0; - while (true) { - if (xind[ix] == yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]+y[iy++]; - if ((ix == nx)||(iy == ny)) break; - } - else if (xind[ix] < yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]; - if (ix == nx) break; - } - else { - zind[nz] = yind[iy]; - z[nz++] = y[iy++]; - if (iy == ny) break; - } - } - while (iy < ny) { - zind[nz] = yind[iy]; - z[nz++] = y[iy++]; - } - while (ix < nx) { - zind[nz] = xind[ix]; - z[nz++] = x[ix++]; - } - -} // SparseSaxpy (ARTYPE). - - -#ifdef ARCOMP_H -template -void ARluNonSymPencil:: -SparseSaxpy(arcomplex a, ARFLOAT x[], int xind[], int nx, ARFLOAT y[], - int yind[], int ny, arcomplex z[], int zind[], int& nz) -// A strongly sequential (and inefficient) sparse saxpy algorithm. -{ - - int ix, iy; - - nz = 0; - if ((nx == 0) || (a == arcomplex(0.0,0.0))) { - for (iy=0; iy!=ny; iy++) { - z[iy] = arcomplex(y[iy],0.0); - zind[iy] = yind[iy]; - } - nz = ny; - return; - } - if (ny == 0) { - for (ix=0; ix!=ny; ix++) { - z[ix] = a*arcomplex(x[ix],0.0); - zind[ix] = xind[ix]; - } - nz = nx; - return; - } - ix = 0; - iy = 0; - while (true) { - if (xind[ix] == yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]+y[iy++]; - if ((ix == nx)||(iy == ny)) break; - } - else if (xind[ix] < yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]; - if (ix == nx) break; - } - else { - zind[nz] = yind[iy]; - z[nz++] = arcomplex(y[iy++],0.0); - if (iy == ny) break; - } - } - while (iy < ny) { - zind[nz] = yind[iy]; - z[nz++] = arcomplex(y[iy++],0.0); - } - while (ix < nx) { - zind[nz] = xind[ix]; - z[nz++] = arcomplex(x[ix++],0.0); - } - -} // SparseSaxpy (arcomplex). -#endif // ARCOMP_H. - - -template -void ARluNonSymPencil:: -SubtractAsB(int n, ARTYPE sigma, NCformat& A, NCformat& B, NCformat& AsB) -{ - - int i, acol, bcol, asbcol, scol; - ARTYPE* anzval; - ARTYPE* bnzval; - ARTYPE* asbnzval; - - // Telling the compiler that nzval must ve viewed as a vector of ARTYPE. - - anzval = (ARTYPE*)A.nzval; - bnzval = (ARTYPE*)B.nzval; - asbnzval = (ARTYPE*)AsB.nzval; - - // Subtracting sigma*B from A. - - AsB.colptr[0] = 0; - asbcol = 0; - - for (i=0; i!=n; i++) { - bcol = B.colptr[i]; - acol = A.colptr[i]; - SparseSaxpy(-sigma, &bnzval[bcol], &B.rowind[bcol], B.colptr[i+1]-bcol, - &anzval[acol], &A.rowind[acol], A.colptr[i+1]-acol, - &asbnzval[asbcol], &AsB.rowind[asbcol], scol); - asbcol += scol; - AsB.colptr[i+1] = asbcol; - } - - AsB.nnz = AsB.colptr[n]; - -} // SubtractAsB (ARTYPE shift). - - -#ifdef ARCOMP_H -template -void ARluNonSymPencil:: -SubtractAsB(int n, ARFLOAT sigmaR, ARFLOAT sigmaI, - NCformat& A, NCformat& B, NCformat& AsB) -{ - - int i, acol, bcol, asbcol, scol; - ARTYPE* anzval; - ARTYPE* bnzval; - arcomplex* asbnzval; - arcomplex sigma; - - // Telling the compiler that nzval must ve viewed as a vector of ARTYPE. - - anzval = (ARTYPE*)A.nzval; - bnzval = (ARTYPE*)B.nzval; - asbnzval = (arcomplex*)AsB.nzval; - - // Subtracting sigma*B from A. - - sigma = arcomplex(sigmaR, sigmaI); - AsB.colptr[0] = 0; - asbcol = 0; - - for (i=0; i!=n; i++) { - bcol = B.colptr[i]; - acol = A.colptr[i]; - SparseSaxpy(-sigma, &bnzval[bcol], &B.rowind[bcol], B.colptr[i+1]-bcol, - &anzval[acol], &A.rowind[acol], A.colptr[i+1]-acol, - &asbnzval[asbcol], &AsB.rowind[asbcol], scol); - asbcol += scol; - AsB.colptr[i+1] = asbcol; - } - - AsB.nnz = AsB.colptr[n]; - -} // SubtractAsB (arcomplex shift). -#endif // ARCOMP_H. - - -template -void ARluNonSymPencil::FactorAsB(ARTYPE sigma) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARluNonSymPencil::FactorAsB"); - } - - // Quitting the function if A and B are not square. - - if ((A->nrows() != A->ncols()) || (B->nrows() != B->ncols())) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARluNonSymPencil::FactorAsB"); - } - - // Defining local variables. - - int nnzi, info; - int* etree; - int* irowi; - int* pcoli; - ARTYPE* asb; - SuperMatrix AsB; - SuperMatrix AC; - NCformat* Astore; - NCformat* Bstore; - NCformat* AsBstore; - - // Deleting old versions of L, U, perm_r and perm_c. - - ClearMem(); - - // Setting default values for gstrf parameters. - - int panel_size = sp_ienv(1); - int relax = sp_ienv(2); - superlu_options_t options; - /* Set the default input options: - options.Fact = DOFACT; - options.Equil = YES; - options.ColPerm = COLAMD; - options.DiagPivotThresh = 1.0; - options.Trans = NOTRANS; - options.IterRefine = NOREFINE; - options.SymmetricMode = NO; - options.PivotGrowth = NO; - options.ConditionNumber = NO; - options.PrintStat = YES; - */ - set_default_options(&options); - options.DiagPivotThresh = A->threshold; - - // Defining A and B format. - - Astore = (NCformat*)A->A.Store; - Bstore = (NCformat*)B->A.Store; - - // Creating a temporary matrix AsB. - - nnzi = Astore->nnz+Bstore->nnz; - irowi = new int[nnzi]; - pcoli = new int[A->ncols()+1]; - asb = new ARTYPE[nnzi]; - Create_CompCol_Matrix(&AsB, A->nrows(), A->ncols(), nnzi, asb, - irowi, pcoli, SLU_NC, SLU_GE); - - // Subtracting sigma*B from A and storing the result on AsB. - - AsBstore = (NCformat*)AsB.Store; - SubtractAsB(A->ncols(), sigma, *Astore, *Bstore, *AsBstore); - - // Reserving memory for some vectors used in matrix decomposition. - - etree = new int[A->ncols()]; - if (permc == NULL) permc = new int[A->ncols()]; - if (permr == NULL) permr = new int[A->ncols()]; - - // Defining LUStat. - -// StatInit(panel_size, relax); - SuperLUStat_t stat; - StatInit(&stat); - - // Defining the column permutation of matrix AsB - // (using minimum degree ordering on AsB'*AsB). - - get_perm_c(A->order, &AsB, permc); - - // Permuting columns of AsB and - // creating the elimination tree of AsB'*AsB. - -// sp_preorder("N", &AsB, permc, etree, &AC); - sp_preorder(&options, &AsB, permc, etree, &AC); - - // Decomposing AsB. - -// gstrf("N",&AC, A->threshold, drop_tol, relax, panel_size, etree, -// NULL, 0, permr, permc, &L, &U, &info); - gstrf(&options, &AC, relax, panel_size, etree, - NULL, 0, permc, permr, &L, &U, &stat, &info); - - // Deleting AC, AsB and etree. - - Destroy_CompCol_Permuted(&AC); - Destroy_CompCol_Matrix(&AsB); - delete[] etree; - - factored = (info == 0); - - // Handling errors. - - if (info < 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARluNonSymPencil::FactorAsB"); - } - else if (info > A->ncols()) { // Memory is not sufficient. - throw ArpackError(ArpackError::MEMORY_OVERFLOW, - "ARluNonSymPencil::FactorAsB"); - } - else if (info > 0) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARluNonSymPencil::FactorAsB"); - } - -} // FactorAsB (ARTYPE shift). - - -#ifdef ARCOMP_H -template -void ARluNonSymPencil:: -FactorAsB(ARFLOAT sigmaR, ARFLOAT sigmaI, char partp) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARluNonSymPencil::FactorAsB"); - } - - // Quitting the function if A and B are not square. - - if ((A->nrows() != A->ncols()) || (B->nrows() != B->ncols())) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARluNonSymPencil::FactorAsB"); - } - - // Defining local variables. - - int nnzi, info; - int* etree; - int* irowi; - int* pcoli; - arcomplex* asb; - SuperMatrix AsB; - SuperMatrix AC; - NCformat* Astore; - NCformat* Bstore; - NCformat* AsBstore; - - // Deleting old versions of L, U, perm_r and perm_c. - - ClearMem(); - - // Setting default values for gstrf parameters. - - int panel_size = sp_ienv(1); - int relax = sp_ienv(2); - superlu_options_t options; - /* Set the default input options: - options.Fact = DOFACT; - options.Equil = YES; - options.ColPerm = COLAMD; - options.DiagPivotThresh = 1.0; - options.Trans = NOTRANS; - options.IterRefine = NOREFINE; - options.SymmetricMode = NO; - options.PivotGrowth = NO; - options.ConditionNumber = NO; - options.PrintStat = YES; - */ - set_default_options(&options); - options.DiagPivotThresh = A->threshold; - - - // Defining A and B format. - - Astore = (NCformat*)A->A.Store; - Bstore = (NCformat*)B->A.Store; - - // Creating a temporary matrix AsB. - - part = partp; - nnzi = Astore->nnz+Bstore->nnz; - irowi = new int[nnzi]; - pcoli = new int[A->ncols()+1]; - asb = new arcomplex[nnzi]; - Create_CompCol_Matrix(&AsB, A->nrows(), A->ncols(), nnzi, asb, - irowi, pcoli, SLU_NC, SLU_GE); - - // Subtracting sigma*B from A and storing the result on AsB. - - AsBstore = (NCformat*)AsB.Store; - SubtractAsB(A->ncols(), sigmaR, sigmaI, *Astore, *Bstore, *AsBstore); - - // Reserving memory for some vectors used in matrix decomposition. - - etree = new int[A->ncols()]; - if (permc == NULL) permc = new int[A->ncols()]; - if (permr == NULL) permr = new int[A->ncols()]; - - // Defining LUStat. - -// StatInit(panel_size, relax); - SuperLUStat_t stat; - StatInit(&stat); - - // Defining the column permutation of matrix AsB - // (using minimum degree ordering on AsB'*AsB). - - get_perm_c(A->order, &AsB, permc); - - // Permuting columns of AsB and - // creating the elimination tree of AsB'*AsB. - - //sp_preorder("N", &AsB, permc, etree, &AC); - sp_preorder(&options, &AsB, permc, etree, &AC); - - // Decomposing AsB. - -// gstrf("N",&AC, A->threshold, drop_tol, relax, panel_size, etree, NULL, -// 0, permr, permc, &L, &U, &info); - gstrf(&options, &AC, relax, panel_size, etree, - NULL, 0, permc, permr, &L, &U, &stat, &info); - - // Deleting AC, AsB and etree. - - Destroy_CompCol_Permuted(&AC); - Destroy_CompCol_Matrix(&AsB); - delete[] etree; - - factored = (info == 0); - - // Handling errors. - - if (info < 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARluNonSymPencil::FactorAsB"); - } - else if (info > A->ncols()) { // Memory is not sufficient. - throw ArpackError(ArpackError::MEMORY_OVERFLOW, - "ARluNonSymPencil::FactorAsB"); - } - else if (info > 0) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARluNonSymPencil::FactorAsB"); - } - -} // FactorAsB (arcomplex shift). -#endif // ARCOMP_H. - - -template -void ARluNonSymPencil::MultInvBAv(ARTYPE* v, ARTYPE* w) -{ - - if (!B->IsFactored()) B->FactorA(); - - A->MultMv(v, w); - B->MultInvv(w, w); - -} // MultInvBAv. - - -#ifdef ARCOMP_H - -template -void ARluNonSymPencil:: -MultInvAsBv(arcomplex* v, arcomplex* w) -{ - - // Quitting the function if AsB was not factored. - - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARluNonSymPencil::MultInvAsBv"); - } - - // Solving AsB.w = v. - - int info; - SuperMatrix RHS; - - copy(A->nrows(), v, 1, w, 1); - Create_Dense_Matrix(&RHS, A->nrows(), 1, w, A->nrows(), SLU_DN, SLU_GE); -// gstrs("N", &L, &U, permr, permc, &RHS, &info); - trans_t trans = NOTRANS; - StatInit(&stat); - - gstrs(trans, &L, &U, permc, permr, &RHS, &stat, &info); - - Destroy_SuperMatrix_Store(&RHS); // delete RHS.Store; - -} // MultInvAsBv (arcomplex). - -#endif - - -template -void ARluNonSymPencil::MultInvAsBv(ARFLOAT* v, ARFLOAT* w) -{ - - // Quitting the function if AsB was not factored. - - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARluNonSymPencil::MultInvAsBv"); - } - - // Solving AsB.w = v. - - int info; - SuperMatrix RHS; - - if (part == 'N') { // shift is real. - - copy(A->nrows(), v, 1, w, 1); - Create_Dense_Matrix(&RHS, A->nrows(), 1, w, A->nrows(), SLU_DN, SLU_GE); - //gstrs("N", &L, &U, permr, permc, &RHS, &info); - trans_t trans = NOTRANS; - StatInit(&stat); - gstrs(trans, &L, &U, permc, permr, &RHS, &stat, &info); - - } - else { // shift is complex. - -#ifdef ARCOMP_H - - int i; - arcomplex *tv = new arcomplex[A->ncols()]; - - for (i=0; i!=A->ncols(); i++) tv[i] = arcomplex(v[i],0.0); - Create_Dense_Matrix(&RHS, A->ncols(), 1, tv, A->ncols(), SLU_DN, SLU_GE); - //gstrs("N", &L, &U, permr, permc, &RHS, &info); - trans_t trans = NOTRANS; - StatInit(&stat); - gstrs(trans, &L, &U, permc, permr, &RHS, &stat, &info); - - - if (part=='I') { - for (i=0; i!=A->ncols(); i++) w[i] = imag(tv[i]); - } - else { - for (i=0; i!=A->ncols(); i++) w[i] = real(tv[i]); - } - - delete[] tv; - -#endif - - } - - Destroy_SuperMatrix_Store(&RHS); // delete RHS.Store; - -} // MultInvAsBv (ARFLOAT). - - -template -inline void ARluNonSymPencil:: -DefineMatrices(ARluNonSymMatrix& Ap, - ARluNonSymMatrix& Bp) -{ - - A = &Ap; - B = &Bp; - permc = NULL; - permr = NULL; - - if ((A->n != B->n)||(A->m != B->m)) { - throw ArpackError(ArpackError::INCOMPATIBLE_SIZES, - "ARluNonSymMatrix::DefineMatrices"); - } - -} // DefineMatrices. - - -template -inline ARluNonSymPencil::ARluNonSymPencil() -{ - - factored = false; - part = 'N'; - permr = NULL; - permc = NULL; - -} // Short constructor. - - -template -inline ARluNonSymPencil:: -ARluNonSymPencil(ARluNonSymMatrix& Ap, - ARluNonSymMatrix& Bp) -{ - - factored = false; - DefineMatrices(Ap, Bp); - -} // Long constructor. - - -template -ARluNonSymPencil& ARluNonSymPencil:: -operator=(const ARluNonSymPencil& other) -{ - - if (this != &other) { // Stroustrup suggestion. - ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARLNSPEN_H diff --git a/src/external/arpack++/include/arlscomp.h b/src/external/arpack++/include/arlscomp.h deleted file mode 100644 index ed3b42dc..00000000 --- a/src/external/arpack++/include/arlscomp.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLSComp.h. - Arpack++ class ARluCompStdEig definition - (superlu version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARLSCOMP_H -#define ARLSCOMP_H - -#include -#include -#include "arch.h" -#include "arscomp.h" -#include "arlnsmat.h" -#include "arrseig.h" - - -template -class ARluCompStdEig: - public virtual ARCompStdEig, ARFLOAT> > { - - protected: - - // a) Protected function: - - virtual void Copy(const ARluCompStdEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // b) Public functions: - - // b.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(arcomplex sigmap); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(arcomplex sigmap); - - // b.2) Constructors and destructor. - - ARluCompStdEig() { } - // Short constructor. - - ARluCompStdEig(int nevp, ARluNonSymMatrix, ARFLOAT>& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluCompStdEig(int nevp, ARluNonSymMatrix, ARFLOAT>& A, - arcomplex sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluCompStdEig(const ARluCompStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluCompStdEig() { } - // Destructor. - - - // c) Operators. - - ARluCompStdEig& operator=(const ARluCompStdEig& other); - // Assignment operator. - -}; // class ARluCompStdEig. - - -// ------------------------------------------------------------------------ // -// ARluCompStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluCompStdEig:: -Copy(const ARluCompStdEig& other) -{ - - ARStdEig, - ARluNonSymMatrix, ARFLOAT> >:: - Copy(other); - if (this->mode > 2) this->objOP->FactorAsI(this->sigmaR); - -} // Copy. - - -template -inline void ARluCompStdEig::ChangeShift(arcomplex sigmap) -{ - - this->objOP->FactorAsI(sigmap); - ARrcStdEig >::ChangeShift(sigmap); - -} // ChangeShift. - - -template -inline void ARluCompStdEig::SetRegularMode() -{ - - ARStdEig, - ARluNonSymMatrix, ARFLOAT> >:: - SetRegularMode(this->objOP, - &ARluNonSymMatrix, ARFLOAT>::MultMv); - -} // SetRegularMode. - - -template -inline void ARluCompStdEig:: -SetShiftInvertMode(arcomplex sigmap) -{ - - ARStdEig, - ARluNonSymMatrix, ARFLOAT> >:: - SetShiftInvertMode(sigmap, this->objOP, - &ARluNonSymMatrix,ARFLOAT>::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluCompStdEig:: -ARluCompStdEig(int nevp, ARluNonSymMatrix, ARFLOAT>& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, arcomplex* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &A, - &ARluNonSymMatrix, ARFLOAT>::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluCompStdEig:: -ARluCompStdEig(int nevp, ARluNonSymMatrix, ARFLOAT>& A, - arcomplex sigmap, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, arcomplex* residp, - bool ishiftp) - -{ - - this->DefineParameters(A.ncols(), nevp, &A, - &ARluNonSymMatrix, ARFLOAT>::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluCompStdEig& ARluCompStdEig:: -operator=(const ARluCompStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARLSCOMP_H diff --git a/src/external/arpack++/include/arlsmat.h b/src/external/arpack++/include/arlsmat.h deleted file mode 100644 index 3c0ce079..00000000 --- a/src/external/arpack++/include/arlsmat.h +++ /dev/null @@ -1,765 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLSMat.h. - Arpack++ class ARluSymMatrix definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - - -#include "arlspen.h" - -#ifndef ARLSMAT_H -#define ARLSMAT_H - -#include -#include -#include "arch.h" -#include "armat.h" -#include "arhbmat.h" -#include "arerror.h" -#include "blas1c.h" -#include "superluc.h" -#include "arlspdef.h" -#include "arlutil.h" - -template class ARluSymPencil; - -template -class ARluSymMatrix: public ARMatrix { - - friend class ARluSymPencil; - - protected: - - bool factored; - char uplo; - int order; - int nnz; - int* irow; - int* pcol; - int* permc; - int* permr; - double threshold; - ARTYPE* a; - SuperMatrix A; - SuperMatrix L; - SuperMatrix U; - ARhbMatrix mat; - SuperLUStat_t stat; - - bool DataOK(); - - virtual void Copy(const ARluSymMatrix& other); - - void ClearMem(); - - void ExpandA(NCformat& A, NCformat& Aexp, ARTYPE sigma = (ARTYPE)0); - - public: - - int nzeros() { return nnz; } - - bool IsFactored() { return factored; } - - void FactorA(); - - void FactorAsI(ARTYPE sigma); - - void MultMv(ARTYPE* v, ARTYPE* w); - - void MultInvv(ARTYPE* v, ARTYPE* w); - - void DefineMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, int* pcolp, - char uplop = 'L', double thresholdp = 0.1, - int orderp = 2, bool check = true); - - ARluSymMatrix(); - // Short constructor that does nothing. - - ARluSymMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, int* pcolp, - char uplop = 'L', double thresholdp = 0.1, - int orderp = 2, bool check = true); - // Long constructor. - - ARluSymMatrix(const std::string& name, double thresholdp = 0.1, - int orderp = 2, bool check = true); - // Long constructor (Harwell-Boeing file). - - ARluSymMatrix(const ARluSymMatrix& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluSymMatrix() { ClearMem(); } - // Destructor. - - ARluSymMatrix& operator=(const ARluSymMatrix& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARluSymMatrix member functions definition. // -// ------------------------------------------------------------------------ // - - -template -bool ARluSymMatrix::DataOK() -{ - - int i, j, k; - - // Checking if pcol is in ascending order. - - i = 0; - while ((i!=this->n)&&(pcol[i]<=pcol[i+1])) i++; - if (i!=this->n) return false; - - // Checking if irow components are in order and within bounds. - - for (i=0; i!=this->n; i++) { - j = pcol[i]; - k = pcol[i+1]-1; - if (j<=k) { - if (uplo == 'U') { - if ((irow[j]<0)||(irow[k]>i)) return false; - } - else { // uplo == 'L'. - if ((irow[j]=this->n)) return false; - } - while ((j!=k)&&(irow[j] -inline void ARluSymMatrix::Copy(const ARluSymMatrix& other) -{ - - // Copying very fundamental variables. - - this->defined = other.defined; - factored = other.factored; - - // Returning from here if "other" was not initialized. - - if (!this->defined) return; - - // Copying user-defined parameters. - - DefineMatrix(other.n, other.nnz, other.a, other.irow, other.pcol, - other.uplo, other.threshold, other.order); - - // Throwing the original factorization away (this procedure - // is really awkward, but it is necessary because there - // is no copy function for matrices L and U in the SuperLU - // library and it is not a good idea to do this kind of deep - // copy here). - - if (factored) { - ArpackError(ArpackError::LAPACK_ERROR, "ARluSymMatrix"); - factored = false; - } - -} // Copy. - - -template -void ARluSymMatrix::ClearMem() -{ - - if (factored) { - Destroy_SuperNode_Matrix(&L); - Destroy_CompCol_Matrix(&U); - StatFree(&stat); - } - if (this->defined) { - Destroy_SuperMatrix_Store(&A); // delete A.Store; - delete[] permc; - delete[] permr; - permc = NULL; - permr = NULL; - A.Store = NULL; - } - -} // ClearMem. - - -template -void ARluSymMatrix:: -ExpandA(NCformat& A, NCformat& Aexp, ARTYPE sigma) -{ - - // Defining local variables. - - bool subtract; - int i, j, k; - int *colA, *colE; - int *indA, *indE; - ARTYPE *valA, *valE; - - // Checking if sigma is zero. - - subtract = (sigma != (ARTYPE)0); - - // Simplifying the notation. - - valA = (ARTYPE*)A.nzval; - valE = (ARTYPE*)Aexp.nzval; - indA = (int*)A.rowind; - indE = (int*)Aexp.rowind; - colA = (int*)A.colptr; - colE = (int*)Aexp.colptr; - - // Filling colE with zeros. - - for (i=0; i<=this->n; i++) colE[i] = 0; - - // Counting the elements in each column of A. - - if (uplo == 'U') { - - for (i=0; i!=this->n; i++) { - k = colA[i+1]; - if ((k!=colA[i])&&(indA[k-1]==i)) { - k--; - } - else { - if (subtract) colE[i]++; - } - for (j=colA[i]; jn; i++) { - k = colA[i]; - if ((k!=colA[i+1])&&(indA[k]==i)) { - k++; - } - else { - if (subtract) colE[i]++; - } - for (j=k; jn; i++) colE[i+1]+=colE[i]; - - // Adding colA to colE. - - for (i=this->n; i>0; i--) colE[i] = colE[i-1]+colA[i]; - colE[0] = colA[0]; - - // Expanding A. - - if (uplo == 'U') { - - for (i=0; in; i++) { - for (j=colA[i]; j<(colA[i+1]-1); j++) { - indE[colE[i]] = indA[j]; - indE[colE[indA[j]]] = i; - valE[colE[i]++] = valA[j]; - valE[colE[indA[j]]++] = valA[j]; - } - if ((colA[i]!=colA[i+1])&&(indA[j]==i)) { - indE[colE[i]] = i; - if (subtract) { - valE[colE[i]++] = valA[j]-sigma; - } - else { - valE[colE[i]++] = valA[j]; - } - } - else { - if (subtract) { - indE[colE[i]] = i; - valE[colE[i]++] = -sigma; - } - } - } - - } - else { // uplo == 'L' - - for (i=0; in; i++) { - k=colA[i]; - if ((k!=colA[i+1])&&(indA[k]==i)) { - indE[colE[i]] = i; - if (subtract) { - valE[colE[i]++] = valA[k]-sigma; - } - else { - valE[colE[i]++] = valA[k]; - } - k++; - } - else { - if (subtract) { - indE[colE[i]] = i; - valE[colE[i]++] = -sigma; - } - } - for (j=k; jn; i>0; i--) { - colE[i] = colE[i-1]; - } - colE[0] = 0; - - Aexp.nnz = colE[this->n]; - -} // ExpandA. - - -template -void ARluSymMatrix::FactorA() -{ - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARluSymMatrix::FactorA"); - } - - // Defining local variables. - - int info; - int* etree; - int* irowi; - int* pcoli; - ARTYPE* aexp; - SuperMatrix Aexp; - SuperMatrix AC; - NCformat* Astore; - NCformat* Aexpstore; - - // Deleting previous versions of L and U. - - if (factored) { - Destroy_SuperNode_Matrix(&L); - Destroy_CompCol_Matrix(&U); - StatFree(&stat); - } - - // Setting default values for gstrf parameters. - - int panel_size = sp_ienv(1); - int relax = sp_ienv(2); - superlu_options_t options; - - /* Set the default input options: - options.Fact = DOFACT; - options.Equil = YES; - options.ColPerm = COLAMD; - options.DiagPivotThresh = 1.0; - options.Trans = NOTRANS; - options.IterRefine = NOREFINE; - options.SymmetricMode = NO; - options.PivotGrowth = NO; - options.ConditionNumber = NO; - options.PrintStat = YES; - */ - set_default_options(&options); - - /* Now we modify the default options to use the symmetric mode. */ - options.SymmetricMode = YES; - options.ColPerm = MMD_AT_PLUS_A; - // options.DiagPivotThresh = 0.001; - options.DiagPivotThresh = threshold; - - // Creating a temporary matrix Aexp. - - irowi = (int*)SUPERLU_MALLOC(sizeof(int) * (nnz*2)); - pcoli = (int*)SUPERLU_MALLOC(sizeof(int) * (this->n+1)); - aexp = (ARTYPE*)SUPERLU_MALLOC(sizeof(ARTYPE) * (nnz*2)); - Create_CompCol_Matrix(&Aexp, this->n, this->n, nnz, aexp, irowi, pcoli, SLU_NC, SLU_GE); - - // Expanding A. - - Astore = (NCformat*)A.Store; - Aexpstore = (NCformat*)Aexp.Store; - ExpandA(*Astore, *Aexpstore); - - // Reserving memory for etree (used in matrix decomposition). - - etree = new int[this->n]; - - // Defining LUStat. - - //StatInit(panel_size, relax); - StatInit(&stat); - - // Defining the column permutation of matrix A - // (using minimum degree ordering). - - get_perm_c(order, &Aexp, permc); - - // Permuting columns of A and creating the elimination tree. - - //sp_preorder("N", &Aexp, permc, etree, &AC); - sp_preorder(&options, &Aexp, permc, etree, &AC); - - // Decomposing A. - -// gstrf("N",&AC, threshold, drop_tol, relax, panel_size, etree, -// NULL, 0, permr, permc, &L, &U, &info); - gstrf(&options,&AC, relax, panel_size, etree, - NULL, 0, permc, permr, &L, &U, &stat, &info); - - // Deleting AC, Aexp and etree. - - Destroy_CompCol_Permuted(&AC); - Destroy_CompCol_Matrix(&Aexp); - delete[] etree; - - factored = (info == 0); - - // Handling errors. - - if (info < 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARluSymMatrix::FactorA"); - } - else if (info > this->n) { // Memory is not sufficient. - throw ArpackError(ArpackError::MEMORY_OVERFLOW, - "ARluSymMatrix::FactorA"); - } - else if (info > 0) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARluSymMatrix::FactorA"); - } - -} // FactorA. - - -template -void ARluSymMatrix::FactorAsI(ARTYPE sigma) -{ - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARluSymMatrix::FactorAsI"); - } - - // Defining local variables. - - int info; - int* etree; - int* irowi; - int* pcoli; - ARTYPE* asi; - SuperMatrix AsI; - SuperMatrix AC; - NCformat* Astore; - NCformat* AsIstore; - - // Deleting previous versions of L and U. - - if (factored) { - Destroy_SuperNode_Matrix(&L); - Destroy_CompCol_Matrix(&U); - StatFree(&stat); - } - - // Setting default values for gstrf parameters. - - int panel_size = sp_ienv(1); - int relax = sp_ienv(2); - superlu_options_t options; - - /* Set the default input options: - options.Fact = DOFACT; - options.Equil = YES; - options.ColPerm = COLAMD; - options.DiagPivotThresh = 1.0; - options.Trans = NOTRANS; - options.IterRefine = NOREFINE; - options.SymmetricMode = NO; - options.PivotGrowth = NO; - options.ConditionNumber = NO; - options.PrintStat = YES; - */ - set_default_options(&options); - - /* Now we modify the default options to use the symmetric mode. */ - options.SymmetricMode = YES; - options.ColPerm = MMD_AT_PLUS_A; - // options.DiagPivotThresh = 0.001; - options.DiagPivotThresh = threshold; - - // Creating a temporary matrix AsI. - - irowi = (int*)SUPERLU_MALLOC(sizeof(int) * (nnz*2+this->n)); - pcoli = (int*)SUPERLU_MALLOC(sizeof(int) * (this->n+1)); - asi = (ARTYPE*)SUPERLU_MALLOC(sizeof(ARTYPE) * (nnz*2+this->n)); - Create_CompCol_Matrix(&AsI, this->n, this->n, nnz, asi, irowi, pcoli, SLU_NC, SLU_GE); - - // Subtracting sigma*I from A and storing the result on AsI. - - Astore = (NCformat*)A.Store; - AsIstore = (NCformat*)AsI.Store; - ExpandA(*Astore, *AsIstore, sigma); - - // Reserving memory for etree (used in matrix decomposition). - - etree = new int[this->n]; - - // Defining LUStat. - - //StatInit(panel_size, relax); - StatInit(&stat); - - // Defining the column permutation of matrix AsI - // (using minimum degree ordering). - - get_perm_c(order, &AsI, permc); - - // Permuting columns of AsI and creating the elimination tree. - - sp_preorder(&options, &AsI, permc, etree, &AC); - - // Decomposing AsI. - -// gstrf("N",&AC, threshold, drop_tol, relax, panel_size, etree, -// NULL, 0, permr, permc, &L, &U, &info); - gstrf(&options,&AC, relax, panel_size, etree, - NULL, 0, permc, permr, &L, &U, &stat, &info); - - // Deleting AC, AsI and etree. - - Destroy_CompCol_Permuted(&AC); - Destroy_CompCol_Matrix(&AsI); - delete[] etree; - - factored = (info == 0); - - // Handling errors. - - if (info < 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARluSymMatrix::FactorAsI"); - } - else if (info > this->n) { // Memory is not sufficient. - throw ArpackError(ArpackError::MEMORY_OVERFLOW, - "ARluSymMatrix::FactorAsI"); - } - else if (info > 0) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARluSymMatrix::FactorAsI"); - } - -} // FactorAsI. - - -template -void ARluSymMatrix::MultMv(ARTYPE* v, ARTYPE* w) -{ - - int i, j, k; - ARTYPE t; - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARluSymMatrix::MultMv"); - } - - // Determining w = M.v. - - for (i=0; i!=this->m; i++) w[i]=(ARTYPE)0; - - if (uplo == 'U') { - - for (i=0; i!=this->n; i++) { - t = v[i]; - k = pcol[i+1]; - if ((k!=pcol[i])&&(irow[k-1]==i)) { - w[i] += t*a[k-1]; - k--; - } - for (j=pcol[i]; jn; i++) { - t = v[i]; - k = pcol[i]; - if ((k!=pcol[i+1])&&(irow[k]==i)) { - w[i] += t*a[k]; - k++; - } - for (j=k; j -void ARluSymMatrix::MultInvv(ARTYPE* v, ARTYPE* w) -{ - - // Quitting the function if A (or AsI) was not factored. - - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARluSymMatrix::MultInvv"); - } - - // Solving A.w = v (or AsI.w = v). - - int info; - SuperMatrix B; - - if (&v != &w) copy(this->n, v, 1, w, 1); - Create_Dense_Matrix(&B, this->n, 1, w, this->n, SLU_DN, SLU_GE); -// gstrs("N", &L, &U, permr, permc, &B, &info); - StatInit(&stat); - trans_t trans = NOTRANS; - gstrs(trans, &L, &U, permc, permr, &B, &stat, &info); - Destroy_SuperMatrix_Store(&B); // delete B.Store; - -} // MultInvv. - - -template -inline void ARluSymMatrix:: -DefineMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, int* pcolp, - char uplop, double thresholdp, int orderp, bool check) -{ - - this->m = np; - this->n = np; - nnz = nnzp; - a = ap; - irow = irowp; - pcol = pcolp; - pcol[this->n] = nnz; - uplo = uplop; - threshold = thresholdp; - order = orderp; - - // Checking data. - - if ((check)&&(!DataOK())) { - throw ArpackError(ArpackError::INCONSISTENT_DATA, - "ARluSymMatrix::DefineMatrix"); - } - - // Creating SuperMatrix A. - - Create_CompCol_Matrix(&A, this->n, this->n, nnz, a, irow, pcol, SLU_NC, SLU_GE); - - // Reserving memory for vectors used in matrix decomposition. - - permc = new int[this->n]; - permr = new int[this->n]; - - this->defined = true; - -} // DefineMatrix. - - -template -inline ARluSymMatrix::ARluSymMatrix(): ARMatrix() -{ - - factored = false; - permc = NULL; - permr = NULL; - -} // Short constructor. - - -template -inline ARluSymMatrix:: -ARluSymMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, char uplop, double thresholdp, - int orderp, bool check) : ARMatrix(np) -{ - - factored = false; - DefineMatrix(np, nnzp, ap, irowp, pcolp, uplop, thresholdp, orderp, check); - -} // Long constructor. - - -template -ARluSymMatrix:: -ARluSymMatrix(const std::string& file, double thresholdp, int orderp, bool check) -{ - - factored = false; - - try { - mat.Define(file); - } - catch (ArpackError) { // Returning from here if an error has occurred. - throw ArpackError(ArpackError::CANNOT_READ_FILE, "ARluSymMatrix"); - } - - if ((mat.NCols() == mat.NRows()) && (mat.IsSymmetric())) { - - DefineMatrix(mat.NCols(), mat.NonZeros(), (ARTYPE*)mat.Entries(), - mat.RowInd(), mat.ColPtr(), 'L', thresholdp, orderp, check); - } - else { - throw ArpackError(ArpackError::INCONSISTENT_DATA, - "ARluSymMatrix::ARluSymMatrix"); - } - -} // Long constructor (Harwell-Boeing file). - - -template -ARluSymMatrix& ARluSymMatrix:: -operator=(const ARluSymMatrix& other) -{ - - if (this != &other) { // Stroustrup suggestion. - ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARLSMAT_H diff --git a/src/external/arpack++/include/arlsnsym.h b/src/external/arpack++/include/arlsnsym.h deleted file mode 100644 index e6369ada..00000000 --- a/src/external/arpack++/include/arlsnsym.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLSNSym.h. - Arpack++ class ARluNonSymStdEig definition - (SuperLU version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARLSNSYM_H -#define ARLSNSYM_H - -#include -#include -#include "arch.h" -#include "arsnsym.h" -#include "arlnsmat.h" - -template -class ARluNonSymStdEig: - public virtual ARNonSymStdEig > { - - protected: - - // a) Protected function: - - virtual void Copy(const ARluNonSymStdEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // b) Public functions: - - // b.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - // b.2) Constructors and destructor. - - ARluNonSymStdEig() { } - // Short constructor. - - ARluNonSymStdEig(int nevp, ARluNonSymMatrix& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluNonSymStdEig(int nevp, ARluNonSymMatrix& A, - ARFLOAT sigma, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluNonSymStdEig(const ARluNonSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluNonSymStdEig() { } - // Destructor. - - // c) Operators. - - ARluNonSymStdEig& operator=(const ARluNonSymStdEig& other); - // Assignment operator. - -}; // class ARluNonSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARluNonSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluNonSymStdEig:: -Copy(const ARluNonSymStdEig& other) -{ - - ARStdEig >:: Copy(other); - if (this->mode > 2) this->objOP->FactorAsI(this->sigmaR); - -} // Copy. - - -template -inline void ARluNonSymStdEig::ChangeShift(ARFLOAT sigmaRp) -{ - - this->sigmaR = sigmaRp; - this->sigmaI = 0.0; - this->mode = 3; - this->iparam[7] = this->mode; - - this->objOP->FactorAsI(this->sigmaR); - this->Restart(); - -} // ChangeShift. - - -template -inline void ARluNonSymStdEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(this->objOP, &ARluNonSymMatrix::MultMv); - -} // SetRegularMode. - - -template -inline void ARluNonSymStdEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARStdEig >:: - SetShiftInvertMode(sigmap, this->objOP, - &ARluNonSymMatrix::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluNonSymStdEig:: -ARluNonSymStdEig(int nevp, ARluNonSymMatrix& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &A, - &ARluNonSymMatrix::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluNonSymStdEig:: -ARluNonSymStdEig(int nevp, ARluNonSymMatrix& A, - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->DefineParameters(A.ncols(), nevp, &A, - &ARluNonSymMatrix::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluNonSymStdEig& ARluNonSymStdEig:: -operator=(const ARluNonSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARLSNSYM_H diff --git a/src/external/arpack++/include/arlspdef.h b/src/external/arpack++/include/arlspdef.h deleted file mode 100644 index 3dec1cc7..00000000 --- a/src/external/arpack++/include/arlspdef.h +++ /dev/null @@ -1,610 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLSpDef.h. - ALTERED version of slu_sdefs.h slu_ddefs.h slu_cdefs.h slu_zdefs.h - (from SuperLU 3.0 package). -*/ - - -#ifndef __SUPERLU_SP_DEFS /* allow multiple inclusions */ -#define __SUPERLU_SP_DEFS - -/* - * File name: sp_defs.h - * Purpose: Sparse matrix types and function prototypes - * History: - */ -#include "arlnames.h" -#include "arlsupm.h" -#include "arlcomp.h" -#include "arlutil.h" -#ifdef _CRAY -#include -#include -#endif - -/* Define my integer type int_t */ -typedef int int_t; /* default */ - -// /* No of marker arrays used in the symbolic factorization, -// each of size n */ -// #define NO_MARKER 3 -// #define NUM_TEMPV(m,w,t,b) ( MAX(m, (t + b)*w) ) -// -// typedef enum {LUSUP, UCOL, LSUB, USUB} MemType; -// typedef enum {HEAD, TAIL} stack_end_t; -// typedef enum {SYSTEM, USER} LU_space_t; - -/* - * Global data structures used in LU factorization - - * - * nsuper: #supernodes = nsuper + 1, numbered [0, nsuper]. - * (xsup,supno): supno[i] is the supernode no to which i belongs; - * xsup(s) points to the beginning of the s-th supernode. - * e.g. supno 0 1 2 2 3 3 3 4 4 4 4 4 (n=12) - * xsup 0 1 2 4 7 12 - * Note: dfs will be performed on supernode rep. relative to the new - * row pivoting ordering - * - * (xlsub,lsub): lsub[*] contains the compressed subscript of - * rectangular supernodes; xlsub[j] points to the starting - * location of the j-th column in lsub[*]. Note that xlsub - * is indexed by column. - * Storage: original row subscripts - * - * During the course of sparse LU factorization, we also use - * (xlsub,lsub) for the purpose of symmetric pruning. For each - * supernode {s,s+1,...,t=s+r} with first column s and last - * column t, the subscript set - * lsub[j], j=xlsub[s], .., xlsub[s+1]-1 - * is the structure of column s (i.e. structure of this supernode). - * It is used for the storage of numerical values. - * Furthermore, - * lsub[j], j=xlsub[t], .., xlsub[t+1]-1 - * is the structure of the last column t of this supernode. - * It is for the purpose of symmetric pruning. Therefore, the - * structural subscripts can be rearranged without making physical - * interchanges among the numerical values. - * - * However, if the supernode has only one column, then we - * only keep one set of subscripts. For any subscript interchange - * performed, similar interchange must be done on the numerical - * values. - * - * The last column structures (for pruning) will be removed - * after the numercial LU factorization phase. - * - * (xlusup,lusup): lusup[*] contains the numerical values of the - * rectangular supernodes; xlusup[j] points to the starting - * location of the j-th column in storage vector lusup[*] - * Note: xlusup is indexed by column. - * Each rectangular supernode is stored by column-major - * scheme, consistent with Fortran 2-dim array storage. - * - * (xusub,ucol,usub): ucol[*] stores the numerical values of - * U-columns outside the rectangular supernodes. The row - * subscript of nonzero ucol[k] is stored in usub[k]. - * xusub[i] points to the starting location of column i in ucol. - * Storage: new row subscripts; that is subscripts of PA. - */ - -typedef struct { - int *xsup; /* supernode and column mapping */ - int *supno; - int *lsub; /* compressed L subscripts */ - int *xlsub; - float *lusup; /* L supernodes */ - int *xlusup; - float *ucol; /* U columns */ - int *usub; - int *xusub; - int nzlmax; /* current max size of lsub */ - int nzumax; /* " " " ucol */ - int nzlumax; /* " " " lusup */ - int n; /* number of columns in the matrix */ - LU_space_t MemModel; /* 0 - system malloc'd; 1 - user provided */ - int num_expansions; - ExpHeader *expanders; /* Array of pointers to 4 types of memory */ - LU_stack_t stack; /* use user supplied memory */ -} sGlobalLU_t; - -typedef struct { - int *xsup; /* supernode and column mapping */ - int *supno; - int *lsub; /* compressed L subscripts */ - int *xlsub; - double *lusup; /* L supernodes */ - int *xlusup; - double *ucol; /* U columns */ - int *usub; - int *xusub; - int nzlmax; /* current max size of lsub */ - int nzumax; /* " " " ucol */ - int nzlumax; /* " " " lusup */ - int n; /* number of columns in the matrix */ - LU_space_t MemModel; /* 0 - system malloc'd; 1 - user provided */ - int num_expansions; - ExpHeader *expanders; /* Array of pointers to 4 types of memory */ - LU_stack_t stack; /* use user supplied memory */ -} dGlobalLU_t; - -typedef struct { - int *xsup; /* supernode and column mapping */ - int *supno; - int *lsub; /* compressed L subscripts */ - int *xlsub; - lscomplex *lusup; /* L supernodes */ - int *xlusup; - lscomplex *ucol; /* U columns */ - int *usub; - int *xusub; - int nzlmax; /* current max size of lsub */ - int nzumax; /* " " " ucol */ - int nzlumax; /* " " " lusup */ - int n; /* number of columns in the matrix */ - LU_space_t MemModel; /* 0 - system malloc'd; 1 - user provided */ - int num_expansions; - ExpHeader *expanders; /* Array of pointers to 4 types of memory */ - LU_stack_t stack; /* use user supplied memory */ -} cGlobalLU_t; - -typedef struct { - int *xsup; /* supernode and column mapping */ - int *supno; - int *lsub; /* compressed L subscripts */ - int *xlsub; - ldcomplex *lusup; /* L supernodes */ - int *xlusup; - ldcomplex *ucol; /* U columns */ - int *usub; - int *xusub; - int nzlmax; /* current max size of lsub */ - int nzumax; /* " " " ucol */ - int nzlumax; /* " " " lusup */ - int n; /* number of columns in the matrix */ - LU_space_t MemModel; /* 0 - system malloc'd; 1 - user provided */ - int num_expansions; - ExpHeader *expanders; /* Array of pointers to 4 types of memory */ - LU_stack_t stack; /* use user supplied memory */ -} zGlobalLU_t; - -// typedef struct { -// int panel_size; -// int relax; -// float diag_pivot_thresh; -// float drop_tol; -// } sfactor_param_t; -// -// typedef struct { -// int panel_size; -// int relax; -// double diag_pivot_thresh; -// double drop_tol; -// } dfactor_param_t; -// -//typedef struct { -// float for_lu; -// float total_needed; -// int expansions; -//} mem_usage_t; - -#ifdef __cplusplus -extern "C" { -#endif - -/* Driver routines */ -extern void -sgssv(superlu_options_t *, SuperMatrix *, int *, int *, SuperMatrix *, - SuperMatrix *, SuperMatrix *, SuperLUStat_t *, int *); -extern void -dgssv(superlu_options_t *, SuperMatrix *, int *, int *, SuperMatrix *, - SuperMatrix *, SuperMatrix *, SuperLUStat_t *, int *); -extern void -cgssv(superlu_options_t *, SuperMatrix *, int *, int *, SuperMatrix *, - SuperMatrix *, SuperMatrix *, SuperLUStat_t *, int *); -extern void -zgssv(superlu_options_t *, SuperMatrix *, int *, int *, SuperMatrix *, - SuperMatrix *, SuperMatrix *, SuperLUStat_t *, int *); -extern void -sgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, - char *, float *, float *, SuperMatrix *, SuperMatrix *, - void *, int, SuperMatrix *, SuperMatrix *, - float *, float *, float *, float *, - sGlobalLU_t *, mem_usage_t *, SuperLUStat_t *, int *); -extern void -dgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, - char *, double *, double *, SuperMatrix *, SuperMatrix *, - void *, int, SuperMatrix *, SuperMatrix *, - double *, double *, double *, double *, - dGlobalLU_t *, mem_usage_t *, SuperLUStat_t *, int *); -extern void -cgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, - char *, float *, float *, SuperMatrix *, SuperMatrix *, - void *, int, SuperMatrix *, SuperMatrix *, - float *, float *, float *, float *, - cGlobalLU_t *, mem_usage_t *, SuperLUStat_t *, int *); -extern void -zgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *, - char *, double *, double *, SuperMatrix *, SuperMatrix *, - void *, int, SuperMatrix *, SuperMatrix *, - double *, double *, double *, double *, - zGlobalLU_t *, mem_usage_t *, SuperLUStat_t *, int *); - -/* Supernodal LU factor related */ -extern void -sCreate_CompCol_Matrix(SuperMatrix *, int, int, int, float *, - int *, int *, Stype_t, Dtype_t, Mtype_t); -extern void -dCreate_CompCol_Matrix(SuperMatrix *, int, int, int, double *, - int *, int *, Stype_t, Dtype_t, Mtype_t); -extern void -cCreate_CompCol_Matrix(SuperMatrix *, int, int, int, lscomplex *, - int *, int *, Stype_t, Dtype_t, Mtype_t); -extern void -zCreate_CompCol_Matrix(SuperMatrix *, int, int, int, ldcomplex *, - int *, int *, Stype_t, Dtype_t, Mtype_t); -extern void -sCreate_CompRow_Matrix(SuperMatrix *, int, int, int, float *, - int *, int *, Stype_t, Dtype_t, Mtype_t); -extern void -dCreate_CompRow_Matrix(SuperMatrix *, int, int, int, double *, - int *, int *, Stype_t, Dtype_t, Mtype_t); -extern void -cCreate_CompRow_Matrix(SuperMatrix *, int, int, int, lscomplex *, - int *, int *, Stype_t, Dtype_t, Mtype_t); -extern void -zCreate_CompRow_Matrix(SuperMatrix *, int, int, int, ldcomplex *, - int *, int *, Stype_t, Dtype_t, Mtype_t); -extern void -sCopy_CompCol_Matrix(SuperMatrix *, SuperMatrix *); -extern void -dCopy_CompCol_Matrix(SuperMatrix *, SuperMatrix *); -extern void -cCopy_CompCol_Matrix(SuperMatrix *, SuperMatrix *); -extern void -zCopy_CompCol_Matrix(SuperMatrix *, SuperMatrix *); -extern void -sCreate_Dense_Matrix(SuperMatrix *, int, int, float *, int, - Stype_t, Dtype_t, Mtype_t); -extern void -dCreate_Dense_Matrix(SuperMatrix *, int, int, double *, int, - Stype_t, Dtype_t, Mtype_t); -extern void -cCreate_Dense_Matrix(SuperMatrix *, int, int, lscomplex *, int, - Stype_t, Dtype_t, Mtype_t); -extern void -zCreate_Dense_Matrix(SuperMatrix *, int, int, ldcomplex *, int, - Stype_t, Dtype_t, Mtype_t); -extern void -sCreate_SuperNode_Matrix(SuperMatrix *, int, int, int, float *, - int *, int *, int *, int *, int *, - Stype_t, Dtype_t, Mtype_t); -extern void -dCreate_SuperNode_Matrix(SuperMatrix *, int, int, int, double *, - int *, int *, int *, int *, int *, - Stype_t, Dtype_t, Mtype_t); -extern void -cCreate_SuperNode_Matrix(SuperMatrix *, int, int, int, lscomplex *, - int *, int *, int *, int *, int *, - Stype_t, Dtype_t, Mtype_t); -extern void -zCreate_SuperNode_Matrix(SuperMatrix *, int, int, int, ldcomplex *, - int *, int *, int *, int *, int *, - Stype_t, Dtype_t, Mtype_t); -extern void -sCopy_Dense_Matrix(int, int, float *, int, float *, int); -extern void -dCopy_Dense_Matrix(int, int, double *, int, double *, int); -extern void -cCopy_Dense_Matrix(int, int, lscomplex *, int, lscomplex *, int); -extern void -zCopy_Dense_Matrix(int, int, ldcomplex *, int, ldcomplex *, int); - -// extern void Destroy_SuperMatrix_Store(SuperMatrix *); -// extern void Destroy_CompCol_Matrix(SuperMatrix *); -// extern void Destroy_SuperNode_Matrix(SuperMatrix *); -// extern void Destroy_CompCol_Permuted(SuperMatrix *); -// extern void Destroy_Dense_Matrix(SuperMatrix *); -// extern void get_perm_c(int, SuperMatrix *, int *); -// extern void sp_preorder (char*, SuperMatrix*, int*, int*, SuperMatrix*); -// // extern void countnz (const int, int *, int *, int *, sGlobalLU_t *); -// // extern void fixupL (const int, const int *, sGlobalLU_t *); - -extern void sallocateA (int, int, float **, int **, int **); -extern void dallocateA (int, int, double **, int **, int **); -extern void callocateA (int, int, lscomplex **, int **, int **); -extern void zallocateA (int, int, ldcomplex **, int **, int **); -extern void sgstrf (superlu_options_t*, SuperMatrix*, - int, int, int*, void *, int, int *, int *, - SuperMatrix *, SuperMatrix *, sGlobalLU_t *, SuperLUStat_t*, int *); -extern void dgstrf (superlu_options_t*, SuperMatrix*, - int, int, int*, void *, int, int *, int *, - SuperMatrix *, SuperMatrix *, dGlobalLU_t *, SuperLUStat_t*, int *); -extern void cgstrf (superlu_options_t*, SuperMatrix*, - int, int, int*, void *, int, int *, int *, - SuperMatrix *, SuperMatrix *, cGlobalLU_t *, SuperLUStat_t*, int *); -extern void zgstrf (superlu_options_t*, SuperMatrix*, - int, int, int*, void *, int, int *, int *, - SuperMatrix *, SuperMatrix *, zGlobalLU_t *, SuperLUStat_t*, int *); -extern int ssnode_dfs (const int, const int, const int *, const int *, - const int *, int *, int *, sGlobalLU_t *); -extern int dsnode_dfs (const int, const int, const int *, const int *, - const int *, int *, int *, dGlobalLU_t *); -extern int csnode_dfs (const int, const int, const int *, const int *, - const int *, int *, int *, cGlobalLU_t *); -extern int zsnode_dfs (const int, const int, const int *, const int *, - const int *, int *, int *, zGlobalLU_t *); -extern int ssnode_bmod (const int, const int, const int, float *, - float *, sGlobalLU_t *, SuperLUStat_t*); -extern int dsnode_bmod (const int, const int, const int, double *, - double *, dGlobalLU_t *, SuperLUStat_t*); -extern int csnode_bmod (const int, const int, const int, lscomplex *, - lscomplex *, cGlobalLU_t *, SuperLUStat_t*); -extern int zsnode_bmod (const int, const int, const int, ldcomplex *, - ldcomplex *, zGlobalLU_t *, SuperLUStat_t*); -extern void spanel_dfs (const int, const int, const int, SuperMatrix *, - int *, int *, float *, int *, int *, int *, - int *, int *, int *, int *, sGlobalLU_t *); -extern void dpanel_dfs (const int, const int, const int, SuperMatrix *, - int *, int *, double *, int *, int *, int *, - int *, int *, int *, int *, dGlobalLU_t *); -extern void cpanel_dfs (const int, const int, const int, SuperMatrix *, - int *, int *, lscomplex *, int *, int *, int *, - int *, int *, int *, int *, cGlobalLU_t *); -extern void zpanel_dfs (const int, const int, const int, SuperMatrix *, - int *, int *, ldcomplex *, int *, int *, int *, - int *, int *, int *, int *, zGlobalLU_t *); -extern void spanel_bmod (const int, const int, const int, const int, - float *, float *, int *, int *, - sGlobalLU_t *, SuperLUStat_t*); -extern void dpanel_bmod (const int, const int, const int, const int, - double *, double *, int *, int *, - dGlobalLU_t *, SuperLUStat_t*); -extern void cpanel_bmod (const int, const int, const int, const int, - lscomplex *, lscomplex *, int *, int *, - cGlobalLU_t *, SuperLUStat_t*); -extern void zpanel_bmod (const int, const int, const int, const int, - ldcomplex *, ldcomplex *, int *, int *, - zGlobalLU_t *, SuperLUStat_t*); -extern int scolumn_dfs (const int, const int, int *, int *, int *, int *, - int *, int *, int *, int *, int *, sGlobalLU_t *); -extern int dcolumn_dfs (const int, const int, int *, int *, int *, int *, - int *, int *, int *, int *, int *, dGlobalLU_t *); -extern int ccolumn_dfs (const int, const int, int *, int *, int *, int *, - int *, int *, int *, int *, int *, cGlobalLU_t *); -extern int zcolumn_dfs (const int, const int, int *, int *, int *, int *, - int *, int *, int *, int *, int *, zGlobalLU_t *); -extern int scolumn_bmod (const int, const int, float *, - float *, int *, int *, int, sGlobalLU_t *, SuperLUStat_t*); -extern int dcolumn_bmod (const int, const int, double *, - double *, int *, int *, int, dGlobalLU_t *, SuperLUStat_t*); -extern int ccolumn_bmod (const int, const int, lscomplex *, - lscomplex *, int *, int *, int, cGlobalLU_t *, SuperLUStat_t*); -extern int zcolumn_bmod (const int, const int, ldcomplex *, - ldcomplex *, int *, int *, int, zGlobalLU_t *, SuperLUStat_t*); -extern int scopy_to_ucol (int, int, int *, int *, int *, - float *, sGlobalLU_t *); -extern int dcopy_to_ucol (int, int, int *, int *, int *, - double *, dGlobalLU_t *); -extern int ccopy_to_ucol (int, int, int *, int *, int *, - lscomplex *, cGlobalLU_t *); -extern int zcopy_to_ucol (int, int, int *, int *, int *, - ldcomplex *, zGlobalLU_t *); -extern int spivotL (const int, const float, int *, int *, - int *, int *, int *, sGlobalLU_t *, SuperLUStat_t*); -extern int dpivotL (const int, const double, int *, int *, - int *, int *, int *, dGlobalLU_t *, SuperLUStat_t*); -extern int cpivotL (const int, const float, int *, int *, - int *, int *, int *, cGlobalLU_t *, SuperLUStat_t*); -extern int zpivotL (const int, const double, int *, int *, - int *, int *, int *, zGlobalLU_t *, SuperLUStat_t*); -extern void spruneL (const int, const int *, const int, const int, - const int *, const int *, int *, sGlobalLU_t *); -extern void dpruneL (const int, const int *, const int, const int, - const int *, const int *, int *, dGlobalLU_t *); -extern void cpruneL (const int, const int *, const int, const int, - const int *, const int *, int *, cGlobalLU_t *); -extern void zpruneL (const int, const int *, const int, const int, - const int *, const int *, int *, zGlobalLU_t *); -extern void sreadmt (int *, int *, int *, float **, int **, int **); -extern void dreadmt (int *, int *, int *, double **, int **, int **); -extern void creadmt (int *, int *, int *, lscomplex **, int **, int **); -extern void zreadmt (int *, int *, int *, ldcomplex **, int **, int **); -extern void sGenXtrue (int, int, float *, int); -extern void dGenXtrue (int, int, double *, int); -extern void cGenXtrue (int, int, lscomplex *, int); -extern void zGenXtrue (int, int, ldcomplex *, int); -extern void sFillRHS (trans_t, int, float *, int, SuperMatrix *, - SuperMatrix *); -extern void dFillRHS (trans_t, int, double *, int, SuperMatrix *, - SuperMatrix *); -extern void cFillRHS (trans_t, int, lscomplex *, int, SuperMatrix *, - SuperMatrix *); -extern void zFillRHS (trans_t, int, ldcomplex *, int, SuperMatrix *, - SuperMatrix *); -extern void sgstrs (trans_t, SuperMatrix *, SuperMatrix *, int *, int *, - SuperMatrix *, SuperLUStat_t*, int *); -extern void dgstrs (trans_t, SuperMatrix *, SuperMatrix *, int *, int *, - SuperMatrix *, SuperLUStat_t*, int *); -extern void cgstrs (trans_t, SuperMatrix *, SuperMatrix *, int *, int *, - SuperMatrix *, SuperLUStat_t*, int *); -extern void zgstrs (trans_t, SuperMatrix *, SuperMatrix *, int *, int *, - SuperMatrix *, SuperLUStat_t*, int *); - - -/* Driver related */ - -extern void sgsequ (SuperMatrix *, float *, float *, float *, - float *, float *, int *); -extern void dgsequ (SuperMatrix *, double *, double *, double *, - double *, double *, int *); -extern void cgsequ (SuperMatrix *, float *, float *, float *, - float *, float *, int *); -extern void zgsequ (SuperMatrix *, double *, double *, double *, - double *, double *, int *); -extern void slaqgs (SuperMatrix *, float *, float *, float, - float, float, char *); -extern void dlaqgs (SuperMatrix *, double *, double *, double, - double, double, char *); -extern void claqgs (SuperMatrix *, float *, float *, float, - float, float, char *); -extern void zlaqgs (SuperMatrix *, double *, double *, double, - double, double, char *); -extern void sgscon (char *, SuperMatrix *, SuperMatrix *, - float, float *, SuperLUStat_t*, int *); -extern void dgscon (char *, SuperMatrix *, SuperMatrix *, - double, double *, SuperLUStat_t*, int *); -extern void cgscon (char *, SuperMatrix *, SuperMatrix *, - float, float *, SuperLUStat_t*, int *); -extern void zgscon (char *, SuperMatrix *, SuperMatrix *, - double, double *, SuperLUStat_t*, int *); - -extern float sPivotGrowth(int, SuperMatrix *, int *, - SuperMatrix *, SuperMatrix *); -extern double dPivotGrowth(int, SuperMatrix *, int *, - SuperMatrix *, SuperMatrix *); -extern float cPivotGrowth(int, SuperMatrix *, int *, - SuperMatrix *, SuperMatrix *); -extern double zPivotGrowth(int, SuperMatrix *, int *, - SuperMatrix *, SuperMatrix *); -extern void sgsrfs (trans_t, SuperMatrix *, SuperMatrix *, - SuperMatrix *, int *, int *, char *, float *, - float *, SuperMatrix *, SuperMatrix *, - float *, float *, SuperLUStat_t*, int *); -extern void dgsrfs (trans_t, SuperMatrix *, SuperMatrix *, - SuperMatrix *, int *, int *, char *, double *, - double *, SuperMatrix *, SuperMatrix *, - double *, double *, SuperLUStat_t*, int *); -extern void cgsrfs (trans_t, SuperMatrix *, SuperMatrix *, - SuperMatrix *, int *, int *, char *, float *, - float *, SuperMatrix *, SuperMatrix *, - float *, float *, SuperLUStat_t*, int *); -extern void zgsrfs (trans_t, SuperMatrix *, SuperMatrix *, - SuperMatrix *, int *, int *, char *, double *, - double *, SuperMatrix *, SuperMatrix *, - double *, double *, SuperLUStat_t*, int *); - -extern int sp_strsv (char *, char *, char *, SuperMatrix *, - SuperMatrix *, float *, SuperLUStat_t*, int *); -extern int sp_dtrsv (char *, char *, char *, SuperMatrix *, - SuperMatrix *, double *, SuperLUStat_t*, int *); -extern int sp_ctrsv (char *, char *, char *, SuperMatrix *, - SuperMatrix *, lscomplex *, SuperLUStat_t*, int *); -extern int sp_ztrsv (char *, char *, char *, SuperMatrix *, - SuperMatrix *, ldcomplex *, SuperLUStat_t*, int *); -extern int sp_sgemv (char *, float, SuperMatrix *, float *, - int, float, float *, int); -extern int sp_dgemv (char *, double, SuperMatrix *, double *, - int, double, double *, int); -extern int sp_cgemv (char *, lscomplex, SuperMatrix *, lscomplex *, - int, lscomplex, lscomplex *, int); -extern int sp_zgemv (char *, ldcomplex, SuperMatrix *, ldcomplex *, - int, ldcomplex, ldcomplex *, int); - -extern int sp_sgemm (char *, char *, int, int, int, float, - SuperMatrix *, float *, int, float, - float *, int); -extern int sp_dgemm (char *, char *, int, int, int, double, - SuperMatrix *, double *, int, double, - double *, int); -extern int sp_cgemm (char *, char *, int, int, int, lscomplex, - SuperMatrix *, lscomplex *, int, lscomplex, - lscomplex *, int); -extern int sp_zgemm (char *, char *, int, int, int, ldcomplex, - SuperMatrix *, ldcomplex *, int, ldcomplex, - ldcomplex *, int); - -/* Memory-related */ -extern int sLUMemInit (fact_t, void *, int, int, int, int, int, - float, SuperMatrix *, SuperMatrix *, - sGlobalLU_t *, int **, float **); -extern int dLUMemInit (fact_t, void *, int, int, int, int, int, - double, SuperMatrix *, SuperMatrix *, - dGlobalLU_t *, int **, double **); -extern int cLUMemInit (fact_t, void *, int, int, int, int, int, - float, SuperMatrix *, SuperMatrix *, - cGlobalLU_t *, int **, lscomplex **); -extern int zLUMemInit (fact_t, void *, int, int, int, int, int, - double, SuperMatrix *, SuperMatrix *, - zGlobalLU_t *, int **, ldcomplex **); -extern void sSetRWork (int, int, float *, float **, float **); -extern void dSetRWork (int, int, double *, double **, double **); -extern void cSetRWork (int, int, lscomplex *, lscomplex **, lscomplex **); -extern void zSetRWork (int, int, ldcomplex *, ldcomplex **, ldcomplex **); -extern void sLUWorkFree (int *, float *, sGlobalLU_t *); -extern void dLUWorkFree (int *, double *, dGlobalLU_t *); -extern void cLUWorkFree (int *, lscomplex *, cGlobalLU_t *); -extern void zLUWorkFree (int *, ldcomplex *, zGlobalLU_t *); -extern int sLUMemXpand (int, int, MemType, int *, sGlobalLU_t *); -extern int dLUMemXpand (int, int, MemType, int *, dGlobalLU_t *); -extern int cLUMemXpand (int, int, MemType, int *, cGlobalLU_t *); -extern int zLUMemXpand (int, int, MemType, int *, zGlobalLU_t *); - -extern float *floatMalloc(int); -extern double *doubleMalloc(int); -extern lscomplex *complexMalloc(int); -extern ldcomplex *doublecomplexMalloc(int); -extern float *floatCalloc(int); -extern double *doubleCalloc(int); -extern lscomplex *complexCalloc(int); -extern ldcomplex *doublecomplexCalloc(int); -extern int smemory_usage(const int, const int, const int, const int); -extern int dmemory_usage(const int, const int, const int, const int); -extern int cmemory_usage(const int, const int, const int, const int); -extern int zmemory_usage(const int, const int, const int, const int); -extern int sQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *); -extern int dQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *); -extern int cQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *); -extern int zQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *); - -/* Auxiliary routines */ -extern void sreadhb(FILE *, int *, int *, int *, float **, int **, int **); -extern void dreadhb(FILE *, int *, int *, int *, double **, int **, int **); -extern void creadhb(FILE *, int *, int *, int *, lscomplex **, int **, int **); -extern void zreadhb(FILE *, int *, int *, int *, ldcomplex **, int **, int **); -extern void sCompRow_to_CompCol(int, int, int, float*, int*, int*, - float **, int **, int **); -extern void dCompRow_to_CompCol(int, int, int, double*, int*, int*, - double **, int **, int **); -extern void cCompRow_to_CompCol(int, int, int, lscomplex*, int*, int*, - lscomplex **, int **, int **); -extern void zCompRow_to_CompCol(int, int, int, ldcomplex*, int*, int*, - ldcomplex **, int **, int **); -extern void sfill (float *, int, float); -extern void dfill (double *, int, double); -extern void cfill (lscomplex *, int, lscomplex); -extern void zfill (ldcomplex *, int, ldcomplex); -extern void sinf_norm_error (int, SuperMatrix *, float *); -extern void dinf_norm_error (int, SuperMatrix *, double *); -extern void cinf_norm_error (int, SuperMatrix *, lscomplex *); -extern void zinf_norm_error (int, SuperMatrix *, ldcomplex *); -// extern void PrintPerf (SuperMatrix *, SuperMatrix *, mem_usage_t *, -// float, float, float *, float *, char *); - -/* Routines for debugging */ -extern void sPrint_CompCol_Matrix(char *, SuperMatrix *); -extern void dPrint_CompCol_Matrix(char *, SuperMatrix *); -extern void cPrint_CompCol_Matrix(char *, SuperMatrix *); -extern void zPrint_CompCol_Matrix(char *, SuperMatrix *); -extern void sPrint_SuperNode_Matrix(char *, SuperMatrix *); -extern void dPrint_SuperNode_Matrix(char *, SuperMatrix *); -extern void cPrint_SuperNode_Matrix(char *, SuperMatrix *); -extern void zPrint_SuperNode_Matrix(char *, SuperMatrix *); -extern void sPrint_Dense_Matrix(char *, SuperMatrix *); -extern void dPrint_Dense_Matrix(char *, SuperMatrix *); -extern void cPrint_Dense_Matrix(char *, SuperMatrix *); -extern void zPrint_Dense_Matrix(char *, SuperMatrix *); -// extern void print_lu_col(char *, int, int, int *, sGlobalLU_t *); -// extern void check_tempv(int, float *); - -/* Reordering routine */ - - -#ifdef __cplusplus - } -#endif - -#endif /* __SUPERLU_SP_DEFS */ - diff --git a/src/external/arpack++/include/arlspen.h b/src/external/arpack++/include/arlspen.h deleted file mode 100644 index 52e2bb1a..00000000 --- a/src/external/arpack++/include/arlspen.h +++ /dev/null @@ -1,679 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLSPen.h. - Arpack++ class ARluSymPencil definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARLSPEN_H -#define ARLSPEN_H - -#include - -#include "arch.h" -#include "arerror.h" -#include "blas1c.h" -#include "superluc.h" -#include "arlspdef.h" -#include "arlutil.h" -#include "arlsmat.h" - - -template -class ARluSymPencil -{ - - protected: - - bool factored; - int* permc; - int* permr; - char part; - char uplo; - ARluSymMatrix* A; - ARluSymMatrix* B; - SuperMatrix L; - SuperMatrix U; - SuperLUStat_t stat; - - virtual void Copy(const ARluSymPencil& other); - - void ClearMem(); - - void SparseSaxpy(ARTYPE a, ARTYPE x[], int xind[], int nx, ARTYPE y[], - int yind[], int ny, ARTYPE z[], int zind[], int& nz); - - void ExpandAsB(int n, NCformat& AsB); - - void SubtractAsB(int n, ARTYPE sigma, NCformat& A, - NCformat& B, NCformat& AsB); - - public: - - bool IsFactored() { return factored; } - - void FactorAsB(ARTYPE sigma); - - void MultAv(ARTYPE* v, ARTYPE* w) { A->MultMv(v,w); } - - void MultBv(ARTYPE* v, ARTYPE* w) { B->MultMv(v,w); } - - void MultInvBAv(ARTYPE* v, ARTYPE* w); - - void MultInvAsBv(ARTYPE* v, ARTYPE* w); - - void DefineMatrices(ARluSymMatrix& Ap, ARluSymMatrix& Bp); - - ARluSymPencil(); - // Short constructor that does nothing. - - ARluSymPencil(ARluSymMatrix& Ap, ARluSymMatrix& Bp); - // Long constructor. - - ARluSymPencil(const ARluSymPencil& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluSymPencil() { ClearMem(); } - // Destructor. - - ARluSymPencil& operator=(const ARluSymPencil& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARluSymPencil member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluSymPencil:: -Copy(const ARluSymPencil& other) -{ - - factored = other.factored; - part = other.part; - uplo = other.uplo; - A = other.A; - B = other.B; - - // Throwing the original factorization away (this procedure - // is really awkward, but it is necessary because there - // is no copy function for matrices L and U in the SuperLU - // library and it is not a good idea to do this kind of deep - // copy here). - - if (factored) { - ArpackError(ArpackError::DISCARDING_FACTORS, "ARluSymPencil"); - factored = false; - } - -} // Copy. - - -template -void ARluSymPencil::ClearMem() -{ - - if (factored) { - Destroy_SuperNode_Matrix(&L); - Destroy_CompCol_Matrix(&U); - StatFree(&stat); - delete[] permc; - delete[] permr; - permc = NULL; - permr = NULL; - } - -} // ClearMem. - - -template -void ARluSymPencil:: -SparseSaxpy(ARTYPE a, ARTYPE x[], int xind[], int nx, ARTYPE y[], - int yind[], int ny, ARTYPE z[], int zind[], int& nz) -// A strongly sequential (and inefficient) sparse saxpy algorithm. -{ - - int ix, iy; - - nz = 0; - if ((nx == 0) || (a == (ARTYPE)0)) { - copy(ny,y,1,z,1); - for (iy=0; iy!=ny; iy++) zind[iy] = yind[iy]; - nz = ny; - return; - } - if (ny == 0) { - copy(nx,x,1,z,1); - scal(nx,a,z,1); - for (ix=0; ix!=nx; ix++) zind[ix] = xind[ix]; - nz = nx; - return; - } - ix = 0; - iy = 0; - while (true) { - if (xind[ix] == yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]+y[iy++]; - if ((ix == nx)||(iy == ny)) break; - } - else if (xind[ix] < yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]; - if (ix == nx) break; - } - else { - zind[nz] = yind[iy]; - z[nz++] = y[iy++]; - if (iy == ny) break; - } - } - while (iy < ny) { - zind[nz] = yind[iy]; - z[nz++] = y[iy++]; - } - while (ix < nx) { - zind[nz] = xind[ix]; - z[nz++] = x[ix++]; - } - -} // SparseSaxpy. - - -template -void ARluSymPencil::ExpandAsB(int n, NCformat& AsB) -{ - - int i, j, k; - int *pcol, *pos, *col, *ind; - ARTYPE *val; - - // simplifying the notation. - - val = (ARTYPE*)AsB.nzval; - ind = AsB.rowind; - col = AsB.colptr; - - // Initializing vectors. - - pcol = new int[n+1]; - pos = new int[n+1]; - for (i=0; i<=n; i++) pcol[i] = col[i]; - for (i=0; i<=n; i++) pos[i] = 0; - - // Counting the elements in each column of AsB. - - if (uplo == 'U') { - - for (i=0; i!=n; i++) { - k = pcol[i+1]; - if ((k!=pcol[i])&&(ind[k-1]==i)) k--; - for (j=pcol[i]; j0; i--) col[i] += pos[i-1]; - - // Expanding A. - - if (uplo == 'U') { - - for (i=n-1; i>=0; i--) { - pos[i] = col[i]+pcol[i+1]-pcol[i]; - k = pos[i]-1; - for (j=pcol[i+1]-1; j>=pcol[i]; j--) { - val[k] = val[j]; - ind[k--] = ind[j]; - } - } - for (i=1; icol[i])&&(ind[k-1]==i)) k--; - for (j=col[i]; j=0; i--) { - k = col[i+1]-1; - for (j=pcol[i+1]-1; j>=pcol[i]; j--) { - val[k] = val[j]; - ind[k--] = ind[j]; - } - pos[i] = col[i]; - } - for (i=0; i<(n-1); i++) { - k = col[i+1]-pcol[i+1]+pcol[i]; - if ((k -void ARluSymPencil:: -SubtractAsB(int n, ARTYPE sigma, NCformat& matA, NCformat& matB, NCformat& AsB) -{ - - int i, acol, bcol, asbcol, scol; - ARTYPE* anzval; - ARTYPE* bnzval; - ARTYPE* asbnzval; - - // Quitting function if A->uplo is not equal to B->uplo. - - if ((A->uplo != B->uplo)&&(sigma != (ARTYPE)0)) { - throw ArpackError(ArpackError::DIFFERENT_TRIANGLES, - "ARluSymPencil::SubtractAsB"); - } - uplo = A->uplo; - - // Telling the compiler that nzval must ve viewed as a vector of ARTYPE. - - anzval = (ARTYPE*)matA.nzval; - bnzval = (ARTYPE*)matB.nzval; - asbnzval = (ARTYPE*)AsB.nzval; - - // Subtracting sigma*B from A. - - AsB.colptr[0] = 0; - asbcol = 0; - - for (i=0; i!=n; i++) { - bcol = matB.colptr[i]; - acol = matA.colptr[i]; - SparseSaxpy(-sigma, &bnzval[bcol], &matB.rowind[bcol], - matB.colptr[i+1]-bcol, &anzval[acol], &matA.rowind[acol], - matA.colptr[i+1]-acol, &asbnzval[asbcol], - &AsB.rowind[asbcol], scol); - asbcol += scol; - AsB.colptr[i+1] = asbcol; - } - - // Expanding AsB. - - ExpandAsB(n, AsB); - -} // SubtractAsB. - - -// template -// void ARluSymPencil::FactorAsB(ARTYPE sigma) -// { -// -// // Quitting the function if A and B were not defined. -// -// if (!(A->IsDefined()&&B->IsDefined())) { -// throw ArpackError(ArpackError::DATA_UNDEFINED, -// "ARluSymPencil::FactorAsB"); -// } -// -// // Quitting the function if A and B are not square. -// -// if ((A->nrows() != A->ncols()) || (B->nrows() != B->ncols())) { -// throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, -// "ARluSymPencil::FactorAsB"); -// } -// -// // Defining local variables. -// -// int nnzi, info; -// int* etree; -// int* irowi; -// int* pcoli; -// ARTYPE* asb; -// SuperMatrix AsB; -// SuperMatrix AC; -// NCformat* Astore; -// NCformat* Bstore; -// NCformat* AsBstore; -// -// // Deleting old versions of L, U, perm_r and perm_c. -// -// ClearMem(); -// -// // Setting default values for gstrf parameters. -// -// ARTYPE drop_tol = (ARTYPE)0; -// int panel_size = sp_ienv(1); -// int relax = sp_ienv(2); -// -// // Defining A and B format. -// -// Astore = (NCformat*)A->A.Store; -// Bstore = (NCformat*)B->A.Store; -// -// // Creating a temporary matrix AsB. -// -// nnzi = (Astore->nnz+Bstore->nnz)*2; -// irowi = new int[nnzi]; -// pcoli = new int[A->ncols()+1]; -// asb = new ARTYPE[nnzi]; -// Create_CompCol_Matrix(&AsB, A->nrows(), A->ncols(), nnzi, asb, -// irowi, pcoli, NC, GE); -// -// // Subtracting sigma*B from A and storing the result on AsB. -// -// AsBstore = (NCformat*)AsB.Store; -// SubtractAsB(A->ncols(), sigma, *Astore, *Bstore, *AsBstore); -// -// // Reserving memory for some vectors used in matrix decomposition. -// -// etree = new int[A->ncols()]; -// if (permc == NULL) permc = new int[A->ncols()]; -// if (permr == NULL) permr = new int[A->ncols()]; -// -// // Defining LUStat. -// -// StatInit(panel_size, relax); -// -// // Defining the column permutation of matrix AsB -// // (using minimum degree ordering on AsB'*AsB). -// -// get_perm_c(A->order, &AsB, permc); -// -// // Permuting columns of AsB and -// // creating the elimination tree of AsB'*AsB. -// -// sp_preorder("N", &AsB, permc, etree, &AC); -// -// // Decomposing AsB. -// -// gstrf("N",&AC, A->threshold, drop_tol, relax, panel_size, etree, -// NULL, 0, permr, permc, &L, &U, &info); -// -// // Deleting AC, AsB and etree. -// -// Destroy_CompCol_Permuted(&AC); -// Destroy_CompCol_Matrix(&AsB); -// delete[] etree; -// -// factored = (info == 0); -// -// // Handling errors. -// -// if (info < 0) { // Illegal argument. -// throw ArpackError(ArpackError::PARAMETER_ERROR, -// "ARluSymPencil::FactorAsB"); -// } -// else if (info > A->ncols()) { // Memory is not sufficient. -// throw ArpackError(ArpackError::MEMORY_OVERFLOW, -// "ARluSymPencil::FactorAsB"); -// } -// else if (info > 0) { // Matrix is singular. -// throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, -// "ARluSymPencil::FactorAsB"); -// } -// -// } // FactorAsB. - -template -void ARluSymPencil::FactorAsB(ARTYPE sigma) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARluSymPencil::FactorAsB"); - } - - // Quitting the function if A and B are not square. - - if ((A->nrows() != A->ncols()) || (B->nrows() != B->ncols())) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARluSymPencil::FactorAsB"); - } - - // Defining local variables. - - int nnzi, info; - int* etree; - int* irowi; - int* pcoli; - ARTYPE* asb; - SuperMatrix AsB; - SuperMatrix AC; - NCformat* Astore; - NCformat* Bstore; - NCformat* AsBstore; - - // Deleting old versions of L, U, perm_r and perm_c. - - ClearMem(); - - // Setting default values for gstrf parameters. - - int panel_size = sp_ienv(1); - int relax = sp_ienv(2); - superlu_options_t options; - /* Set the default input options: - options.Fact = DOFACT; - options.Equil = YES; - options.ColPerm = COLAMD; - options.DiagPivotThresh = 1.0; - options.Trans = NOTRANS; - options.IterRefine = NOREFINE; - options.SymmetricMode = NO; - options.PivotGrowth = NO; - options.ConditionNumber = NO; - options.PrintStat = YES; - */ - set_default_options(&options); - - /* Now we modify the default options to use the symmetric mode. */ - options.SymmetricMode = YES; - options.ColPerm = MMD_AT_PLUS_A; - options.DiagPivotThresh = A->threshold; - - // Defining A and B format. - - Astore = (NCformat*)A->A.Store; - Bstore = (NCformat*)B->A.Store; - - // Creating a temporary matrix AsB. - - nnzi = (Astore->nnz+Bstore->nnz)*2; - irowi = new int[nnzi]; - pcoli = new int[A->ncols()+1]; - asb = new ARTYPE[nnzi]; - Create_CompCol_Matrix(&AsB, A->nrows(), A->ncols(), nnzi, asb, - irowi, pcoli, SLU_NC, SLU_GE); - - // Subtracting sigma*B from A and storing the result on AsB. - - AsBstore = (NCformat*)AsB.Store; - SubtractAsB(A->ncols(), sigma, *Astore, *Bstore, *AsBstore); - - // Reserving memory for some vectors used in matrix decomposition. - - etree = new int[A->ncols()]; - if (permc == NULL) permc = new int[A->ncols()]; - if (permr == NULL) permr = new int[A->ncols()]; - - // Defining LUStat. - -// StatInit(panel_size, relax); - SuperLUStat_t stat; - StatInit(&stat); - - // Defining the column permutation of matrix AsB - // (using minimum degree ordering on AsB'*AsB). - - get_perm_c(A->order, &AsB, permc); - - // Permuting columns of AsB and - // creating the elimination tree of AsB'*AsB. - - sp_preorder(&options, &AsB, permc, etree, &AC); - - // Decomposing AsB. - -// gstrf("N",&AC, A->threshold, drop_tol, relax, panel_size, etree, -// NULL, 0, permr, permc, &L, &U, &info); - gstrf(&options, &AC, relax, panel_size, etree, - NULL, 0, permc, permr, &L, &U, &stat, &info); - - // Deleting AC, AsB and etree. - - Destroy_CompCol_Permuted(&AC); - Destroy_CompCol_Matrix(&AsB); - delete[] etree; - - factored = (info == 0); - - // Handling errors. - - if (info < 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARluSymPencil::FactorAsB"); - } - else if (info > A->ncols()) { // Memory is not sufficient. - throw ArpackError(ArpackError::MEMORY_OVERFLOW, - "ARluSymPencil::FactorAsB"); - } - else if (info > 0) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARluSymPencil::FactorAsB"); - } - -} // FactorAsB. - -template -void ARluSymPencil::MultInvBAv(ARTYPE* v, ARTYPE* w) -{ - if (!B->IsFactored()) B->FactorA(); - - A->MultMv(v, w); - copy(A->ncols(), w, 1, v, 1); - B->MultInvv(w, w); - -} // MultInvBAv. - - -template -void ARluSymPencil::MultInvAsBv(ARTYPE* v, ARTYPE* w) -{ - - // Quitting the function if AsB was not factored. - - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARluSymPencil::MultInvAsBv"); - } - - // Solving AsB.w = v. - - int info; - SuperMatrix RHS; - - copy(A->nrows(), v, 1, w, 1); - Create_Dense_Matrix(&RHS, A->nrows(), 1, w, A->nrows(), SLU_DN, SLU_GE); -// gstrs("N", &L, &U, permr, permc, &RHS, &info); - trans_t trans = NOTRANS; - StatInit(&stat); - - gstrs(trans, &L, &U, permc, permr, &RHS, &stat, &info); - - Destroy_SuperMatrix_Store(&RHS); // delete RHS.Store; - -} // MultInvAsBv. - - -template -inline void ARluSymPencil:: -DefineMatrices(ARluSymMatrix& Ap, ARluSymMatrix& Bp) -{ - - A = &Ap; - B = &Bp; - permc = NULL; - permr = NULL; - - if ((A->n != B->n)||(A->m != B->m)) { - throw ArpackError(ArpackError::INCOMPATIBLE_SIZES, - "ARluSymMatrix::DefineMatrices"); - } - -} // DefineMatrices. - - -template -inline ARluSymPencil::ARluSymPencil() -{ - - factored = false; - part = 'N'; - permr = NULL; - permc = NULL; - -} // Short constructor. - - -template -inline ARluSymPencil:: -ARluSymPencil(ARluSymMatrix& Ap, ARluSymMatrix& Bp) -{ - - factored = false; - DefineMatrices(Ap, Bp); - -} // Long constructor. - - -template -ARluSymPencil& ARluSymPencil:: -operator=(const ARluSymPencil& other) -{ - - if (this != &other) { // Stroustrup suggestion. - ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARLSPEN_H diff --git a/src/external/arpack++/include/arlssym.h b/src/external/arpack++/include/arlssym.h deleted file mode 100644 index fdab7e6b..00000000 --- a/src/external/arpack++/include/arlssym.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLSSym.h. - Arpack++ class ARluSymStdEig definition - (SuperLU version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Kristi Maschhoff - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARLSSYM_H -#define ARLSSYM_H - -#include -#include -#include "arch.h" -#include "arssym.h" -#include "arlsmat.h" - - -template -class ARluSymStdEig: - public virtual ARSymStdEig > { - - protected: - - // a) Protected function: - - virtual void Copy(const ARluSymStdEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // b) Public functions: - - // b.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - // b.2) Constructors and destructor. - - ARluSymStdEig() { } - // Short constructor. - - ARluSymStdEig(int nevp, ARluSymMatrix& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluSymStdEig(int nevp, ARluSymMatrix& A, - ARFLOAT sigma, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluSymStdEig(const ARluSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluSymStdEig() { } - // Destructor. - - // c) Operators. - - ARluSymStdEig& operator=(const ARluSymStdEig& other); - // Assignment operator. - -}; // class ARluSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARluSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluSymStdEig::Copy(const ARluSymStdEig& other) -{ - - ARStdEig >:: Copy(other); - if (this->mode > 2) this->objOP->FactorAsI(this->sigmaR); - -} // Copy. - - -template -inline void ARluSymStdEig::ChangeShift(ARFLOAT sigmaRp) -{ - - this->sigmaR = sigmaRp; - this->sigmaI = 0.0; - this->mode = 3; - this->iparam[7] = this->mode; - - this->objOP->FactorAsI(this->sigmaR); - this->Restart(); - -} // ChangeShift. - - -template -inline void ARluSymStdEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(this->objOP, &ARluSymMatrix::MultMv); - -} // SetRegularMode. - - -template -inline void ARluSymStdEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARStdEig >:: - SetShiftInvertMode(sigmap, this->objOP, &ARluSymMatrix::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluSymStdEig:: -ARluSymStdEig(int nevp, ARluSymMatrix& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) -{ - - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &A, &ARluSymMatrix::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluSymStdEig:: -ARluSymStdEig(int nevp, ARluSymMatrix& A, - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->DefineParameters(A.ncols(), nevp, &A, &ARluSymMatrix::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluSymStdEig& ARluSymStdEig:: -operator=(const ARluSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARLSSYM_H diff --git a/src/external/arpack++/include/arlsupm.h b/src/external/arpack++/include/arlsupm.h deleted file mode 100644 index 7c8d2e8a..00000000 --- a/src/external/arpack++/include/arlsupm.h +++ /dev/null @@ -1,185 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLSupM.h. - Unaltered copy of supermatrix.h (from SuperLU package). -*/ - -#ifndef __SUPERLU_SUPERMATRIX /* allow multiple inclusions */ -#define __SUPERLU_SUPERMATRIX - - -/******************************************** - * The matrix types are defined as follows. * - ********************************************/ -typedef enum { - SLU_NC, /* column-wise, no supernode */ - SLU_NCP, /* column-wise, column-permuted, no supernode - (The consecutive columns of nonzeros, after permutation, - may not be stored contiguously.) */ - SLU_NR, /* row-wize, no supernode */ - SLU_SC, /* column-wise, supernode */ - SLU_SCP, /* supernode, column-wise, permuted */ - SLU_SR, /* row-wise, supernode */ - SLU_DN, /* Fortran style column-wise storage for dense matrix */ - SLU_NR_loc /* distributed compressed row format */ -} Stype_t; - -typedef enum { - SLU_S, /* single */ - SLU_D, /* double */ - SLU_C, /* single complex */ - SLU_Z /* double complex */ -} Dtype_t; - -typedef enum { - SLU_GE, /* general */ - SLU_TRLU, /* lower triangular, unit diagonal */ - SLU_TRUU, /* upper triangular, unit diagonal */ - SLU_TRL, /* lower triangular */ - SLU_TRU, /* upper triangular */ - SLU_SYL, /* symmetric, store lower half */ - SLU_SYU, /* symmetric, store upper half */ - SLU_HEL, /* Hermitian, store lower half */ - SLU_HEU /* Hermitian, store upper half */ -} Mtype_t; - -typedef struct { - Stype_t Stype; /* Storage type: interprets the storage structure - pointed to by *Store. */ - Dtype_t Dtype; /* Data type. */ - Mtype_t Mtype; /* Matrix type: describes the mathematical property of - the matrix. */ - int nrow; /* number of rows */ - int ncol; /* number of columns */ - void *Store; /* pointer to the actual storage of the matrix */ -} SuperMatrix; - -/*********************************************** - * The storage schemes are defined as follows. * - ***********************************************/ - -/* Stype == SLU_NC (Also known as Harwell-Boeing sparse matrix format) */ -typedef struct { - int nnz; /* number of nonzeros in the matrix */ - void *nzval; /* pointer to array of nonzero values, packed by column */ - int *rowind; /* pointer to array of row indices of the nonzeros */ - int *colptr; /* pointer to array of beginning of columns in nzval[] - and rowind[] */ - /* Note: - Zero-based indexing is used; - colptr[] has ncol+1 entries, the last one pointing - beyond the last column, so that colptr[ncol] = nnz. */ -} NCformat; - -/* Stype == SLU_NR */ -typedef struct { - int nnz; /* number of nonzeros in the matrix */ - void *nzval; /* pointer to array of nonzero values, packed by raw */ - int *colind; /* pointer to array of columns indices of the nonzeros */ - int *rowptr; /* pointer to array of beginning of rows in nzval[] - and colind[] */ - /* Note: - Zero-based indexing is used; - rowptr[] has nrow+1 entries, the last one pointing - beyond the last row, so that rowptr[nrow] = nnz. */ -} NRformat; - -/* Stype == SLU_SC */ -typedef struct { - int nnz; /* number of nonzeros in the matrix */ - int nsuper; /* number of supernodes, minus 1 */ - void *nzval; /* pointer to array of nonzero values, packed by column */ - int *nzval_colptr;/* pointer to array of beginning of columns in nzval[] */ - int *rowind; /* pointer to array of compressed row indices of - rectangular supernodes */ - int *rowind_colptr;/* pointer to array of beginning of columns in rowind[] */ - int *col_to_sup; /* col_to_sup[j] is the supernode number to which column - j belongs; mapping from column to supernode number. */ - int *sup_to_col; /* sup_to_col[s] points to the start of the s-th - supernode; mapping from supernode number to column. - e.g.: col_to_sup: 0 1 2 2 3 3 3 4 4 4 4 4 4 (ncol=12) - sup_to_col: 0 1 2 4 7 12 (nsuper=4) */ - /* Note: - Zero-based indexing is used; - nzval_colptr[], rowind_colptr[], col_to_sup and - sup_to_col[] have ncol+1 entries, the last one - pointing beyond the last column. - For col_to_sup[], only the first ncol entries are - defined. For sup_to_col[], only the first nsuper+2 - entries are defined. */ -} SCformat; - -/* Stype == SLU_SCP */ -typedef struct { - int nnz; /* number of nonzeros in the matrix */ - int nsuper; /* number of supernodes */ - void *nzval; /* pointer to array of nonzero values, packed by column */ - int *nzval_colbeg;/* nzval_colbeg[j] points to beginning of column j - in nzval[] */ - int *nzval_colend;/* nzval_colend[j] points to one past the last element - of column j in nzval[] */ - int *rowind; /* pointer to array of compressed row indices of - rectangular supernodes */ - int *rowind_colbeg;/* rowind_colbeg[j] points to beginning of column j - in rowind[] */ - int *rowind_colend;/* rowind_colend[j] points to one past the last element - of column j in rowind[] */ - int *col_to_sup; /* col_to_sup[j] is the supernode number to which column - j belongs; mapping from column to supernode. */ - int *sup_to_colbeg; /* sup_to_colbeg[s] points to the start of the s-th - supernode; mapping from supernode to column.*/ - int *sup_to_colend; /* sup_to_colend[s] points to one past the end of the - s-th supernode; mapping from supernode number to - column. - e.g.: col_to_sup: 0 1 2 2 3 3 3 4 4 4 4 4 4 (ncol=12) - sup_to_colbeg: 0 1 2 4 7 (nsuper=4) - sup_to_colend: 1 2 4 7 12 */ - /* Note: - Zero-based indexing is used; - nzval_colptr[], rowind_colptr[], col_to_sup and - sup_to_col[] have ncol+1 entries, the last one - pointing beyond the last column. */ -} SCPformat; - -/* Stype == SLU_NCP */ -typedef struct { - int nnz; /* number of nonzeros in the matrix */ - void *nzval; /* pointer to array of nonzero values, packed by column */ - int *rowind;/* pointer to array of row indices of the nonzeros */ - /* Note: nzval[]/rowind[] always have the same length */ - int *colbeg;/* colbeg[j] points to the beginning of column j in nzval[] - and rowind[] */ - int *colend;/* colend[j] points to one past the last element of column - j in nzval[] and rowind[] */ - /* Note: - Zero-based indexing is used; - The consecutive columns of the nonzeros may not be - contiguous in storage, because the matrix has been - postmultiplied by a column permutation matrix. */ -} NCPformat; - -/* Stype == SLU_DN */ -typedef struct { - int lda; /* leading dimension */ - void *nzval; /* array of size lda*ncol to represent a dense matrix */ -} DNformat; - -/* Stype == SLU_NR_loc (Distributed Compressed Row Format) */ -typedef struct { - int nnz_loc; /* number of nonzeros in the local submatrix */ - int m_loc; /* number of rows local to this processor */ - int fst_row; /* global index of the first row */ - void *nzval; /* pointer to array of nonzero values, packed by row */ - int *rowptr; /* pointer to array of beginning of rows in nzval[] - and colind[] */ - int *colind; /* pointer to array of column indices of the nonzeros */ - /* Note: - Zero-based indexing is used; - rowptr[] has n_loc + 1 entries, the last one pointing - beyond the last row, so that rowptr[n_loc] = nnz_loc.*/ -} NRformat_loc; - - -#endif /* __SUPERLU_SUPERMATRIX */ diff --git a/src/external/arpack++/include/arlutil.h b/src/external/arpack++/include/arlutil.h deleted file mode 100644 index 664ca61b..00000000 --- a/src/external/arpack++/include/arlutil.h +++ /dev/null @@ -1,432 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARLUtil.h. - Unaltered copy of util.h (from SuperLU package) - and superlu_enum_consts.h -*/ - - - -#ifndef __SUPERLU_ENUM_CONSTS /* allow multiple inclusions */ -#define __SUPERLU_ENUM_CONSTS - -/*********************************************************************** - * Enumerate types - ***********************************************************************/ -typedef enum {NO, YES} yes_no_t; -typedef enum {DOFACT, SamePattern, SamePattern_SameRowPerm, FACTORED} fact_t; -typedef enum {NOROWPERM, LargeDiag, MY_PERMR} rowperm_t; -typedef enum {NATURAL, MMD_ATA, MMD_AT_PLUS_A, COLAMD, - METIS_AT_PLUS_A, PARMETIS, ZOLTAN, MY_PERMC} colperm_t; -typedef enum {NOTRANS, TRANS, CONJ} trans_t; -typedef enum {NOEQUIL, ROW, COL, BOTH} DiagScale_t; -typedef enum {NOREFINE, SLU_SINGLE=1, SLU_DOUBLE, SLU_EXTRA} IterRefine_t; -typedef enum {LUSUP, UCOL, LSUB, USUB, LLVL, ULVL} MemType; -typedef enum {HEAD, TAIL} stack_end_t; -typedef enum {SYSTEM, USER} LU_space_t; -typedef enum {ONE_NORM, TWO_NORM, INF_NORM} norm_t; -typedef enum {SILU, SMILU_1, SMILU_2, SMILU_3} milu_t; -#if 0 -typedef enum {NODROP = 0x0000, - DROP_BASIC = 0x0001, /* ILU(tau) */ - DROP_PROWS = 0x0002, /* ILUTP: keep p maximum rows */ - DROP_COLUMN = 0x0004, /* ILUTP: for j-th column, - p = gamma * nnz(A(:,j)) */ - DROP_AREA = 0x0008, /* ILUTP: for j-th column, use - nnz(F(:,1:j)) / nnz(A(:,1:j)) - to limit memory growth */ - DROP_SECONDARY = 0x000E, /* PROWS | COLUMN | AREA */ - DROP_DYNAMIC = 0x0010, - DROP_INTERP = 0x0100} rule_t; -#endif - - -/* - * The following enumerate type is used by the statistics variable - * to keep track of flop count and time spent at various stages. - * - * Note that not all of the fields are disjoint. - */ -typedef enum { - COLPERM, /* find a column ordering that minimizes fills */ - ROWPERM, /* find a row ordering maximizes diagonal. */ - RELAX, /* find artificial supernodes */ - ETREE, /* compute column etree */ - EQUIL, /* equilibrate the original matrix */ - SYMBFAC, /* symbolic factorization. */ - DIST, /* distribute matrix. */ - FACT, /* perform LU factorization */ - COMM, /* communication for factorization */ - SOL_COMM,/* communication for solve */ - RCOND, /* estimate reciprocal condition number */ - SOLVE, /* forward and back solves */ - REFINE, /* perform iterative refinement */ - TRSV, /* fraction of FACT spent in xTRSV */ - GEMV, /* fraction of FACT spent in xGEMV */ - FERR, /* estimate error bounds after iterative refinement */ - NPHASES /* total number of phases */ -} PhaseType; - - -#endif /* __SUPERLU_ENUM_CONSTS */ - - - -#ifndef __SUPERLU_UTIL /* allow multiple inclusions */ -#define __SUPERLU_UTIL - -#include -#include -#include -/* -#ifndef __STDC__ -#include -#endif -*/ -#include - -/*********************************************************************** - * Macros - ***********************************************************************/ -#define FIRSTCOL_OF_SNODE(i) (xsup[i]) -/* No of marker arrays used in the symbolic factorization, - each of size n */ -#define NO_MARKER 3 -#define NUM_TEMPV(m,w,t,b) ( SUPERLU_MAX(m, (t + b)*w) ) - -#ifndef USER_ABORT -#define USER_ABORT(msg) superlu_abort_and_exit(msg) -#endif - -#define ABORT(err_msg) \ - { char msg[256];\ - sprintf(msg,"%s at line %d in file %s\n",err_msg,__LINE__, __FILE__);\ - USER_ABORT(msg); } - - -#ifndef USER_MALLOC -#if 1 -#define USER_MALLOC(size) superlu_malloc(size) -#else -/* The following may check out some uninitialized data */ -#define USER_MALLOC(size) memset (superlu_malloc(size), '\x0F', size) -#endif -#endif - -#define SUPERLU_MALLOC(size) USER_MALLOC(size) - -#ifndef USER_FREE -#define USER_FREE(addr) superlu_free(addr) -#endif - -#define SUPERLU_FREE(addr) USER_FREE(addr) - -#define CHECK_MALLOC(where) { \ - extern int superlu_malloc_total; \ - printf("%s: malloc_total %d Bytes\n", \ - where, superlu_malloc_total); \ -} - -#define SUPERLU_MAX(x, y) ( (x) > (y) ? (x) : (y) ) -#define SUPERLU_MIN(x, y) ( (x) < (y) ? (x) : (y) ) - -/********************************************************* - * Macros used for easy access of sparse matrix entries. * - *********************************************************/ -#define L_SUB_START(col) ( Lstore->rowind_colptr[col] ) -#define L_SUB(ptr) ( Lstore->rowind[ptr] ) -#define L_NZ_START(col) ( Lstore->nzval_colptr[col] ) -#define L_FST_SUPC(superno) ( Lstore->sup_to_col[superno] ) -#define U_NZ_START(col) ( Ustore->colptr[col] ) -#define U_SUB(ptr) ( Ustore->rowind[ptr] ) - - -/*********************************************************************** - * Constants - ***********************************************************************/ -#define EMPTY (-1) -/*#define NO (-1)*/ -#define FALSE 0 -#define TRUE 1 - -#define NO_MEMTYPE 4 /* 0: lusup; - 1: ucol; - 2: lsub; - 3: usub */ - -#define GluIntArray(n) (5 * (n) + 5) - -/* Dropping rules */ -#define NODROP ( 0x0000 ) -#define DROP_BASIC ( 0x0001 ) /* ILU(tau) */ -#define DROP_PROWS ( 0x0002 ) /* ILUTP: keep p maximum rows */ -#define DROP_COLUMN ( 0x0004 ) /* ILUTP: for j-th column, - p = gamma * nnz(A(:,j)) */ -#define DROP_AREA ( 0x0008 ) /* ILUTP: for j-th column, use - nnz(F(:,1:j)) / nnz(A(:,1:j)) - to limit memory growth */ -#define DROP_SECONDARY ( 0x000E ) /* PROWS | COLUMN | AREA */ -#define DROP_DYNAMIC ( 0x0010 ) /* adaptive tau */ -#define DROP_INTERP ( 0x0100 ) /* use interpolation */ - - -#if 1 -#define MILU_ALPHA (1.0e-2) /* multiple of drop_sum to be added to diagonal */ -#else -#define MILU_ALPHA 1.0 /* multiple of drop_sum to be added to diagonal */ -#endif - - -/*********************************************************************** - * Type definitions - ***********************************************************************/ -typedef float flops_t; -typedef unsigned char Logical; - -/* - *-- This contains the options used to control the solution process. - * - * Fact (fact_t) - * Specifies whether or not the factored form of the matrix - * A is supplied on entry, and if not, how the matrix A should - * be factorizaed. - * = DOFACT: The matrix A will be factorized from scratch, and the - * factors will be stored in L and U. - * = SamePattern: The matrix A will be factorized assuming - * that a factorization of a matrix with the same sparsity - * pattern was performed prior to this one. Therefore, this - * factorization will reuse column permutation vector - * ScalePermstruct->perm_c and the column elimination tree - * LUstruct->etree. - * = SamePattern_SameRowPerm: The matrix A will be factorized - * assuming that a factorization of a matrix with the same - * sparsity pattern and similar numerical values was performed - * prior to this one. Therefore, this factorization will reuse - * both row and column scaling factors R and C, both row and - * column permutation vectors perm_r and perm_c, and the - * data structure set up from the previous symbolic factorization. - * = FACTORED: On entry, L, U, perm_r and perm_c contain the - * factored form of A. If DiagScale is not NOEQUIL, the matrix - * A has been equilibrated with scaling factors R and C. - * - * Equil (yes_no_t) - * Specifies whether to equilibrate the system (scale A's row and - * columns to have unit norm). - * - * ColPerm (colperm_t) - * Specifies what type of column permutation to use to reduce fill. - * = NATURAL: use the natural ordering - * = MMD_ATA: use minimum degree ordering on structure of A'*A - * = MMD_AT_PLUS_A: use minimum degree ordering on structure of A'+A - * = COLAMD: use approximate minimum degree column ordering - * = MY_PERMC: use the ordering specified by the user - * - * Trans (trans_t) - * Specifies the form of the system of equations: - * = NOTRANS: A * X = B (No transpose) - * = TRANS: A**T * X = B (Transpose) - * = CONJ: A**H * X = B (Transpose) - * - * IterRefine (IterRefine_t) - * Specifies whether to perform iterative refinement. - * = NO: no iterative refinement - * = SLU_SINGLE: perform iterative refinement in single precision - * = SLU_DOUBLE: perform iterative refinement in double precision - * = SLU_EXTRA: perform iterative refinement in extra precision - * - * DiagPivotThresh (double, in [0.0, 1.0]) (only for sequential SuperLU) - * Specifies the threshold used for a diagonal entry to be an - * acceptable pivot. - * - * SymmetricMode (yest_no_t) - * Specifies whether to use symmetric mode. Symmetric mode gives - * preference to diagonal pivots, and uses an (A'+A)-based column - * permutation algorithm. - * - * PivotGrowth (yes_no_t) - * Specifies whether to compute the reciprocal pivot growth. - * - * ConditionNumber (ues_no_t) - * Specifies whether to compute the reciprocal condition number. - * - * RowPerm (rowperm_t) (only for SuperLU_DIST or ILU) - * Specifies whether to permute rows of the original matrix. - * = NO: not to permute the rows - * = LargeDiag: make the diagonal large relative to the off-diagonal - * = MY_PERMR: use the permutation given by the user - * - * ILU_DropRule (int) - * Specifies the dropping rule: - * = DROP_BASIC: Basic dropping rule, supernodal based ILUTP(tau). - * = DROP_PROWS: Supernodal based ILUTP(p,tau), p = gamma * nnz(A)/n. - * = DROP_COLUMN: Variant of ILUTP(p,tau), for j-th column, - * p = gamma * nnz(A(:,j)). - * = DROP_AREA: Variation of ILUTP, for j-th column, use - * nnz(F(:,1:j)) / nnz(A(:,1:j)) to control memory. - * = DROP_DYNAMIC: Modify the threshold tau during factorizaion: - * If nnz(L(:,1:j)) / nnz(A(:,1:j)) > gamma - * tau_L(j) := MIN(tau_0, tau_L(j-1) * 2); - * Otherwise - * tau_L(j) := MAX(tau_0, tau_L(j-1) / 2); - * tau_U(j) uses the similar rule. - * NOTE: the thresholds used by L and U are separate. - * = DROP_INTERP: Compute the second dropping threshold by - * interpolation instead of sorting (default). - * In this case, the actual fill ratio is not - * guaranteed to be smaller than gamma. - * Note: DROP_PROWS, DROP_COLUMN and DROP_AREA are mutually exclusive. - * ( Default: DROP_BASIC | DROP_AREA ) - * - * ILU_DropTol (double) - * numerical threshold for dropping. - * - * ILU_FillFactor (double) - * Gamma in the secondary dropping. - * - * ILU_Norm (norm_t) - * Specify which norm to use to measure the row size in a - * supernode: infinity-norm, 1-norm, or 2-norm. - * - * ILU_FillTol (double) - * numerical threshold for zero pivot perturbation. - * - * ILU_MILU (milu_t) - * Specifies which version of MILU to use. - * - * ILU_MILU_Dim (double) - * Dimension of the PDE if available. - * - * ReplaceTinyPivot (yes_no_t) (only for SuperLU_DIST) - * Specifies whether to replace the tiny diagonals by - * sqrt(epsilon)*||A|| during LU factorization. - * - * SolveInitialized (yes_no_t) (only for SuperLU_DIST) - * Specifies whether the initialization has been performed to the - * triangular solve. - * - * RefineInitialized (yes_no_t) (only for SuperLU_DIST) - * Specifies whether the initialization has been performed to the - * sparse matrix-vector multiplication routine needed in iterative - * refinement. - * - * PrintStat (yes_no_t) - * Specifies whether to print the solver's statistics. - */ -typedef struct { - fact_t Fact; - yes_no_t Equil; - colperm_t ColPerm; - trans_t Trans; - IterRefine_t IterRefine; - double DiagPivotThresh; - yes_no_t SymmetricMode; - yes_no_t PivotGrowth; - yes_no_t ConditionNumber; - rowperm_t RowPerm; - int ILU_DropRule; - double ILU_DropTol; /* threshold for dropping */ - double ILU_FillFactor; /* gamma in the secondary dropping */ - norm_t ILU_Norm; /* infinity-norm, 1-norm, or 2-norm */ - double ILU_FillTol; /* threshold for zero pivot perturbation */ - milu_t ILU_MILU; - double ILU_MILU_Dim; /* Dimension of PDE (if available) */ - yes_no_t ParSymbFact; - yes_no_t ReplaceTinyPivot; /* used in SuperLU_DIST */ - yes_no_t SolveInitialized; - yes_no_t RefineInitialized; - yes_no_t PrintStat; - int nnzL, nnzU; /* used to store nnzs for now */ - int num_lookaheads; /* num of levels in look-ahead */ - yes_no_t lookahead_etree; /* use etree computed from the - serial symbolic factorization */ - yes_no_t SymPattern; /* symmetric factorization */ -} superlu_options_t; - -/*! \brief Headers for 4 types of dynamatically managed memory */ -typedef struct e_node { - int size; /* length of the memory that has been used */ - void *mem; /* pointer to the new malloc'd store */ -} ExpHeader; - -typedef struct { - int size; - int used; - int top1; /* grow upward, relative to &array[0] */ - int top2; /* grow downward */ - void *array; -} LU_stack_t; - -typedef struct { - int *panel_histo; /* histogram of panel size distribution */ - double *utime; /* running time at various phases */ - flops_t *ops; /* operation count at various phases */ - int TinyPivots; /* number of tiny pivots */ - int RefineSteps; /* number of iterative refinement steps */ - int expansions; /* number of memory expansions */ -} SuperLUStat_t; - -typedef struct { - float for_lu; - float total_needed; -} mem_usage_t; - - -/*********************************************************************** - * Prototypes - ***********************************************************************/ -#ifdef __cplusplus -extern "C" { -#endif - -extern void Destroy_SuperMatrix_Store(SuperMatrix *); -extern void Destroy_CompCol_Matrix(SuperMatrix *); -extern void Destroy_CompRow_Matrix(SuperMatrix *); -extern void Destroy_SuperNode_Matrix(SuperMatrix *); -extern void Destroy_CompCol_Permuted(SuperMatrix *); -extern void Destroy_Dense_Matrix(SuperMatrix *); -extern void get_perm_c(int, SuperMatrix *, int *); -extern void set_default_options(superlu_options_t *options); -extern void ilu_set_default_options(superlu_options_t *options); -extern void sp_preorder (superlu_options_t *, SuperMatrix*, int*, int*, - SuperMatrix*); -extern void superlu_abort_and_exit(char*); -extern void *superlu_malloc (size_t); -extern int *intMalloc (int); -extern int *intCalloc (int); -extern void superlu_free (void*); -extern void SetIWork (int, int, int, int *, int **, int **, int **, - int **, int **, int **, int **); -extern int sp_coletree (int *, int *, int *, int, int, int *); -extern void relax_snode (const int, int *, const int, int *, int *); -extern void heap_relax_snode (const int, int *, const int, int *, int *); -extern int mark_relax(int, int *, int *, int *, int *, int *, int *); -extern void ilu_relax_snode (const int, int *, const int, int *, - int *, int *); -extern void ilu_heap_relax_snode (const int, int *, const int, int *, - int *, int*); -extern void resetrep_col (const int, const int *, int *); -extern int spcoletree (int *, int *, int *, int, int, int *); -extern int *TreePostorder (int, int *); -extern double SuperLU_timer_ (); -extern int sp_ienv (int); -extern int lsame_ (char *, char *); -extern int xerbla_ (char *, int *); -extern void ifill (int *, int, int); -extern void snode_profile (int, int *); -extern void super_stats (int, int *); -extern void check_repfnz(int, int, int, int *); -extern void PrintSumm (char *, int, int, int); -extern void StatInit(SuperLUStat_t *); -extern void StatPrint (SuperLUStat_t *); -extern void StatFree(SuperLUStat_t *); -extern void print_panel_seg(int, int, int, int, int *, int *); -extern int print_int_vec(char *,int, int *); -extern int slu_PrintInt10(char *, int, int *); - -#ifdef __cplusplus - } -#endif - -#endif /* __SUPERLU_UTIL */ diff --git a/src/external/arpack++/include/armat.h b/src/external/arpack++/include/armat.h deleted file mode 100644 index 52df53e3..00000000 --- a/src/external/arpack++/include/armat.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARMat.h - Generic matrix template with a matrix-vector product. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARMAT_H -#define ARMAT_H - -template -class ARMatrix { - - protected: - - int m, n; // Number of rows and columns. - bool defined; - - public: - - ARMatrix() { defined = false; } - // Short constructor. - - ARMatrix(int nrows, int ncols = 0) - // Long constructor. - { - m = nrows; - n = (ncols?ncols:nrows); - defined = false; - } // Constructor. - - virtual ~ARMatrix() { } - // Destructor. - - int nrows() { return m; } - - int ncols() { return n; } - - bool IsDefined() { return defined; } - - virtual void MultMv(ARTYPE* v, ARTYPE* w) = 0; - // Matrix-vector product: w = A*v. - -}; // ARMatrix. - -#endif // ARMAT_H - diff --git a/src/external/arpack++/include/arpackf.h b/src/external/arpack++/include/arpackf.h deleted file mode 100644 index 6445b469..00000000 --- a/src/external/arpack++/include/arpackf.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE arpackf.h - ARPACK FORTRAN routines. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARPACKF_H -#define ARPACKF_H - -#include "arch.h" - -extern "C" -{ - -// debug "common" statement. - - extern struct { - ARint logfil, ndigit, mgetv0; - ARint msaupd, msaup2, msaitr, mseigt, msapps, msgets, mseupd; - ARint mnaupd, mnaup2, mnaitr, mneigt, mnapps, mngets, mneupd; - ARint mcaupd, mcaup2, mcaitr, mceigt, mcapps, mcgets, mceupd; - } F77NAME(debug); - - -// double precision symmetric routines. - - void F77NAME(dsaupd)(ARint *ido, char *bmat, ARint *n, const char *which, - ARint *nev, double *tol, double *resid, - ARint *ncv, double *V, ARint *ldv, - ARint *iparam, ARint *ipntr, double *workd, - double *workl, ARint *lworkl, ARint *info); - - void F77NAME(dseupd)(ARlogical *rvec, char *HowMny, ARlogical *select, - double *d, double *Z, ARint *ldz, - double *sigma, char *bmat, ARint *n, - const char *which, ARint *nev, double *tol, - double *resid, ARint *ncv, double *V, - ARint *ldv, ARint *iparam, ARint *ipntr, - double *workd, double *workl, - ARint *lworkl, ARint *info); - -// double precision nonsymmetric routines. - - void F77NAME(dnaupd)(ARint *ido, char *bmat, ARint *n, const char *which, - ARint *nev, double *tol, double *resid, - ARint *ncv, double *V, ARint *ldv, - ARint *iparam, ARint *ipntr, double *workd, - double *workl, ARint *lworkl, ARint *info); - - void F77NAME(dneupd)(ARlogical *rvec, char *HowMny, ARlogical *select, - double *dr, double *di, double *Z, - ARint *ldz, double *sigmar, - double *sigmai, double *workev, - char *bmat, ARint *n, const char *which, - ARint *nev, double *tol, double *resid, - ARint *ncv, double *V, ARint *ldv, - ARint *iparam, ARint *ipntr, - double *workd, double *workl, - ARint *lworkl, ARint *info); - -// single precision symmetric routines. - - void F77NAME(ssaupd)(ARint *ido, char *bmat, ARint *n, const char *which, - ARint *nev, float *tol, float *resid, - ARint *ncv, float *V, ARint *ldv, - ARint *iparam, ARint *ipntr, float *workd, - float *workl, ARint *lworkl, ARint *info); - - void F77NAME(sseupd)(ARlogical *rvec, char *HowMny, ARlogical *select, - float *d, float *Z, ARint *ldz, - float *sigma, char *bmat, ARint *n, - const char *which, ARint *nev, float *tol, - float *resid, ARint *ncv, float *V, - ARint *ldv, ARint *iparam, ARint *ipntr, - float *workd, float *workl, - ARint *lworkl, ARint *info); - -// single precision nonsymmetric routines. - - void F77NAME(snaupd)(ARint *ido, char *bmat, ARint *n, const char *which, - ARint *nev, float *tol, float *resid, - ARint *ncv, float *V, ARint *ldv, - ARint *iparam, ARint *ipntr, float *workd, - float *workl, ARint *lworkl, ARint *info); - - void F77NAME(sneupd)(ARlogical *rvec, char *HowMny, ARlogical *select, - float *dr, float *di, float *Z, - ARint *ldz, float *sigmar, - float *sigmai, float *workev, char *bmat, - ARint *n, const char *which, ARint *nev, - float *tol, float *resid, ARint *ncv, - float *V, ARint *ldv, ARint *iparam, - ARint *ipntr, float *workd, float *workl, - ARint *lworkl, ARint *info); - -#ifdef ARCOMP_H - -// single precision complex routines. - - void F77NAME(cnaupd)(ARint *ido, char *bmat, ARint *n, const char *which, - ARint *nev, float *tol, arcomplex *resid, - ARint *ncv, arcomplex *V, ARint *ldv, - ARint *iparam, ARint *ipntr, arcomplex *workd, - arcomplex *workl, ARint *lworkl, - float *rwork, ARint *info); - - void F77NAME(cneupd)(ARlogical *rvec, char *HowMny, ARlogical *select, - arcomplex *d, arcomplex *Z, ARint *ldz, - arcomplex *sigma, arcomplex *workev, - char *bmat, ARint *n, const char *which, ARint *nev, - float *tol, arcomplex *resid, ARint *ncv, - arcomplex *V, ARint *ldv, ARint *iparam, - ARint *ipntr, arcomplex *workd, - arcomplex *workl, ARint *lworkl, - float *rwork, ARint *info); - -// double precision complex routines. - - void F77NAME(znaupd)(ARint *ido, char *bmat, ARint *n, const char *which, - ARint *nev, double *tol, arcomplex *resid, - ARint *ncv, arcomplex *V, ARint *ldv, - ARint *iparam, ARint *ipntr, arcomplex *workd, - arcomplex *workl, ARint *lworkl, - double *rwork, ARint *info); - - void F77NAME(zneupd)(ARlogical *rvec, char *HowMny, ARlogical *select, - arcomplex *d, arcomplex *Z, ARint *ldz, - arcomplex *sigma, arcomplex *workev, - char *bmat, ARint *n, const char *which, ARint *nev, - double *tol, arcomplex *resid, ARint *ncv, - arcomplex *V, ARint *ldv, ARint *iparam, - ARint *ipntr, arcomplex *workd, - arcomplex *workl, ARint *lworkl, - double *rwork, ARint *info); - -} - -#endif // ARCOMP_H - -#endif // ARPACKF_H diff --git a/src/external/arpack++/include/arrgcomp.h b/src/external/arpack++/include/arrgcomp.h deleted file mode 100644 index d3b2e3d0..00000000 --- a/src/external/arpack++/include/arrgcomp.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARRGComp.h. - Arpack++ class ARrcCompGenEig definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARRGCOMP_H -#define ARRGCOMP_H - -#include -#include -#include "arch.h" -#include "arrscomp.h" -#include "arrgeig.h" - -template -class ARrcCompGenEig: - virtual public ARrcGenEig >, - virtual public ARrcCompStdEig { - - public: - - // a) Constructors and destructor. - - ARrcCompGenEig() { } - // Short constructor (Does nothing but calling base classes constructors). - - ARrcCompGenEig(int np, int nevp, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARrcCompGenEig(int np, int nevp, arcomplex sigmap, - const std::string& whichp = "LM", int ncvp = 0, ARFLOAT tolp = 0.0, - int maxitp = 0, arcomplex* residp = NULL, - bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARrcCompGenEig(const ARrcCompGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARrcCompGenEig() { } - // Destructor. - - // b) Operators. - - ARrcCompGenEig& operator=(const ARrcCompGenEig& other); - // Assignment operator. - -}; // class ARrcCompGenEig. - - -// ------------------------------------------------------------------------ // -// ARrcCompGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline ARrcCompGenEig:: -ARrcCompGenEig(int np, int nevp, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, arcomplex* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARrcCompGenEig:: -ARrcCompGenEig(int np, int nevp, arcomplex sigmap, const std::string& whichp, - int ncvp, ARFLOAT tolp, int maxitp, arcomplex* residp, - bool ishiftp) - -{ - - this->ChangeShift(sigmap); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (shif and invert mode). - - -template -ARrcCompGenEig& ARrcCompGenEig:: -operator=(const ARrcCompGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARRGCOMP_H - diff --git a/src/external/arpack++/include/arrgeig.h b/src/external/arpack++/include/arrgeig.h deleted file mode 100644 index d9c709ec..00000000 --- a/src/external/arpack++/include/arrgeig.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARRGEig.h. - Arpack++ class ARrcGenEig definition. - Derived from ARrcStdEig, this class implements the - reverse communication interface for generalized problems. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARRGEIG_H -#define ARRGEIG_H - -#include "arch.h" -#include "arerror.h" -#include "arrseig.h" - -// ARrcGenEig class definition. - -template -class ARrcGenEig: virtual public ARrcStdEig { - - public: - - // a) Public functions: - - // a.1) Functions that allow changes in problem parameters. - - void NoShift(); - // Turns the problem to regular mode. - - - // a.2) Constructors and destructor. - - ARrcGenEig(); - // Short constructor that does almost nothing. - - ARrcGenEig(const ARrcGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARrcGenEig() { } - // Destructor (presently meaningless). - - // b) Operators. - - ARrcGenEig& operator=(const ARrcGenEig& other); - // Assignment operator. - -}; // class ARrcGenEig. - - -// ------------------------------------------------------------------------ // -// ARrcGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARrcGenEig::NoShift() -{ - - this->sigmaR = (ARTYPE)0; - this->sigmaI = 0.0; - this->mode = 2; - this->iparam[7] = this->mode; - this->Restart(); - -} // NoShift. - - -template -inline ARrcGenEig::ARrcGenEig() -{ - - this->bmat = 'G'; // This is a generalized problem. - this->NoShift(); - -} // Short constructor. - - -template -ARrcGenEig& ARrcGenEig:: -operator=(const ARrcGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARRGEIG_H - diff --git a/src/external/arpack++/include/arrgnsym.h b/src/external/arpack++/include/arrgnsym.h deleted file mode 100644 index 1dbd3be7..00000000 --- a/src/external/arpack++/include/arrgnsym.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARRGNSym.h. - Arpack++ class ARrcNonSymGenEig definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARRGNSYM_H -#define ARRGNSYM_H - -#include -#include -#include "arch.h" -#include "arrsnsym.h" -#include "arrgeig.h" - -template -class ARrcNonSymGenEig: - virtual public ARrcGenEig, - virtual public ARrcNonSymStdEig { - - protected: - - // a) Protected variables: - - char part; - - - // b) Protected functions: - - char CheckPart(char partp); - - virtual void Copy(const ARrcNonSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that provides access to internal variables' values. - - ARFLOAT GetShiftImag() { return this->sigmaI; } - // Returns the imaginary part of the shift (when in shift and invert mode). - - - // c.2) Functions that allow changes in problem parameters. - - void ChangePart(char partp); - // Changes "part" to 'R' (real) or 'I' (imaginary). - - virtual void ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp = 0.0); - // Turns the problem to shift-and-invert mode - // with shift defined by sigmaRp and sigmaIp. - - virtual void SetShiftInvertMode(ARFLOAT sigmaRp); - // Turns the problem to real shift-and-invert mode with sigmaRp as shift. - - virtual void SetComplexShiftMode(char partp, ARFLOAT sigmaRp, - ARFLOAT sigmaIp); - // Turns the problem to complex shift-and-invert mode with shift - // defined by sigmaRp and sigmaIp. - - - // c.3) Constructors and destructor. - - ARrcNonSymGenEig() { part = 'R'; } - // Short constructor that does almost nothing. - - ARrcNonSymGenEig(int np, int nevp, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARrcNonSymGenEig(int np, int nevp, ARFLOAT sigmap, - const std::string& whichp = "LM", int ncvp = 0, ARFLOAT tolp = 0.0, - int maxitp = 0, ARFLOAT* residp = NULL, - bool ishiftp = true); - // Long constructor (real shift and invert mode). - - ARrcNonSymGenEig(int np, int nevp, - char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp, - const std::string& whichp = "LM", int ncvp = 0, ARFLOAT tolp = 0.0, - int maxitp = 0, ARFLOAT* residp = NULL, - bool ishiftp = true); - // Long constructor (complex shift and invert mode). - - ARrcNonSymGenEig(const ARrcNonSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARrcNonSymGenEig() { } - // Destructor. - - // d) Operators. - - ARrcNonSymGenEig& operator=(const ARrcNonSymGenEig& other); - // Assignment operator. - -}; // class ARrcNonSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARrcNonSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline char ARrcNonSymGenEig::CheckPart(char partp) -{ - if ((partp != 'R') && (partp != 'I')) { - throw ArpackError(ArpackError::PART_UNDEFINED); - } - return partp; -} // CheckPart. - - -template -inline void ARrcNonSymGenEig:: -Copy(const ARrcNonSymGenEig& other) -{ - - ARrcStdEig::Copy(other); - part = other.part; - -} // Copy. - - -template -inline void ARrcNonSymGenEig::ChangePart(char partp) -{ - - part = CheckPart(partp); - if (part == 'R') { - this->mode = 3; // Real part. - } - else { - this->mode = 4; // Imaginary part. - } - this->iparam[7] = this->mode; - this->Restart(); - -} // ChangePart. - - -template -inline void ARrcNonSymGenEig:: -ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp) -{ - - this->sigmaR = sigmaRp; - this->sigmaI = sigmaIp; - ChangePart(part); - -} // ChangeShift. - - -template -inline void ARrcNonSymGenEig:: -SetShiftInvertMode(ARFLOAT sigmaRp) -{ - - part = 'R'; - ChangeShift(sigmaRp); - -} // SetShiftInvertMode. - - -template -inline void ARrcNonSymGenEig:: -SetComplexShiftMode(char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp) -{ - - part = CheckPart(partp); - ChangeShift(sigmaRp, sigmaIp); - -} // SetComplexShiftMode. - - -template -inline ARrcNonSymGenEig:: -ARrcNonSymGenEig(int np, int nevp, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) -{ - - part = 'R'; // Considering mode = 3 in ChangeShift. - this->NoShift(); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARrcNonSymGenEig:: -ARrcNonSymGenEig(int np, int nevp, ARFLOAT sigmap, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) -{ - - SetShiftInvertMode(sigmap); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - - -} // Long constructor (real shift and invert mode). - - -template -inline ARrcNonSymGenEig:: -ARrcNonSymGenEig(int np, int nevp, char partp, ARFLOAT sigmaRp, - ARFLOAT sigmaIp, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) -{ - - SetComplexShiftMode(partp, sigmaRp, sigmaIp); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (shift and invert mode). - - -template -ARrcNonSymGenEig& ARrcNonSymGenEig:: -operator=(const ARrcNonSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARRGNSYM_H - diff --git a/src/external/arpack++/include/arrgsym.h b/src/external/arpack++/include/arrgsym.h deleted file mode 100644 index 86f110d8..00000000 --- a/src/external/arpack++/include/arrgsym.h +++ /dev/null @@ -1,236 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARRGSym.h. - Arpack++ class ARrcSymGenEig definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARRGSYM_H -#define ARRGSYM_H - -#include -#include -#include "arch.h" -#include "arrssym.h" -#include "arrgeig.h" - -template -class ARrcSymGenEig: - virtual public ARrcGenEig, - virtual public ARrcSymStdEig { - - protected: - - // a) Protected variable: - - char InvertMode; - - - // b) Protected functions: - - char CheckInvertMode(char InvertModep); - - virtual void Copy(const ARrcSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - void ChangeInvertMode(char InvertModep); - // Changes "InvertMode" to 'S' (shift-and-invert), - // 'B' (buckling) or 'C' (cayley) mode. - - virtual void ChangeShift(ARFLOAT sigmap); - // Changes shift value. - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - // Turns problem to shift and invert mode with shift defined by sigmap. - - virtual void SetBucklingMode(ARFLOAT sigmap); - // Turns problem to buckling mode with shift defined by sigmap. - - virtual void SetCayleyMode(ARFLOAT sigmap); - // Turns problem to Cayley mode with shift defined by sigmap. - - - // c.2) Constructors and destructor. - - ARrcSymGenEig() { InvertMode = 'S'; } - // Short constructor that does almost nothing. - - ARrcSymGenEig(int np, int nevp, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARrcSymGenEig(char invertmodep, int np, int nevp, ARFLOAT sigmap, - const std::string& whichp = "LM", int ncvp = 0, ARFLOAT tolp = 0.0, - int maxitp = 0, ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift-and-invert, buckling and Cayley modes). - - ARrcSymGenEig(const ARrcSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARrcSymGenEig() { } - // Destructor. - - // d) Operators. - - ARrcSymGenEig& operator=(const ARrcSymGenEig& other); - // Assignment operator. - -}; // class ARrcSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARrcSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline char ARrcSymGenEig::CheckInvertMode(char InvertModep) -{ - if ((InvertModep != 'S') && (InvertModep != 'B') && (InvertModep != 'C')) { - throw ArpackError(ArpackError::INVMODE_UNDEFINED); - } - return InvertModep; - -} // CheckInvertMode. - - -template -inline void ARrcSymGenEig::Copy(const ARrcSymGenEig& other) -{ - - ARrcStdEig::Copy(other); - InvertMode = other.InvertMode; - -} // Copy. - - -template -inline void ARrcSymGenEig::ChangeInvertMode(char InvertModep) -{ - - InvertMode = CheckInvertMode(InvertModep); - switch (InvertMode) { - case 'S': - this->mode = 3; // Shift and invert mode. - break; - case 'B': - this->mode = 4; // Buckling mode. - break; - case 'C': - this->mode = 5; // Cayley mode. - break; - } - this->iparam[7] = this->mode; - this->Restart(); - -} // ChangeInvertMode. - - -template -inline void ARrcSymGenEig::ChangeShift(ARFLOAT sigmap) -{ - - this->sigmaR = sigmap; - this->sigmaI = 0.0; - ChangeInvertMode(InvertMode); - -} // ChangeShift. - - -template -void ARrcSymGenEig::SetShiftInvertMode(ARFLOAT sigmap) - -{ - - InvertMode = 'S'; - ChangeShift(sigmap); - -} // SetShiftInvertMode. - - -template -void ARrcSymGenEig::SetBucklingMode(ARFLOAT sigmap) - -{ - - InvertMode = 'B'; - ChangeShift(sigmap); - -} // SetBucklingMode. - - -template -void ARrcSymGenEig::SetCayleyMode(ARFLOAT sigmap) - -{ - - InvertMode = 'C'; - ChangeShift(sigmap); - -} // SetCayleyMode. - - -template -inline ARrcSymGenEig:: -ARrcSymGenEig(int np, int nevp, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - InvertMode = 'S'; // Considering mode = 3 in ChangeShift. - this->NoShift(); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARrcSymGenEig:: -ARrcSymGenEig(char InvertModep, int np, int nevp, - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - InvertMode = CheckInvertMode(InvertModep); // InvertMode = 'S', 'B', 'C'. - ChangeShift(sigmap); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (shift-and-invert, buckling and Cayley modes). - - -template -ARrcSymGenEig& ARrcSymGenEig:: -operator=(const ARrcSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARRGSYM_H - diff --git a/src/external/arpack++/include/arrscomp.h b/src/external/arpack++/include/arrscomp.h deleted file mode 100644 index 40977551..00000000 --- a/src/external/arpack++/include/arrscomp.h +++ /dev/null @@ -1,375 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARRSComp.h. - Arpack++ class ARrcCompStdEig definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARRSCOMP_H -#define ARRSCOMP_H - -#include -#include -#include "arch.h" -#include "arerror.h" -#include "debug.h" -#include "arrseig.h" -#include "caupp.h" -#include "ceupp.h" - -template -class ARrcCompStdEig: virtual public ARrcStdEig > { - - protected: - - // a) Protected functions: - - // a.1) Memory control functions. - - void WorkspaceAllocate(); - // Allocates workspace for complex problems. - - - // a.2) Functions that handle original FORTRAN ARPACK code. - - void Aupp(); - // Interface to FORTRAN subroutines CNAUPD and ZNAUPD. - - void Eupp(); - // Interface to FORTRAN subroutines CNEUPD and ZNEUPD. - - public: - - // b) Public functions: - - // b.1) Trace functions. - - void Trace(const int digit = -5, const int getv0 = 0, const int aupd = 1, - const int aup2 = 0, const int aitr = 0, const int eigt = 0, - const int apps = 0, const int gets = 0, const int eupd = 0) - { - cTraceOn(digit, getv0, aupd, aup2, aitr, eigt, apps, gets, eupd); - } - // Turns on trace mode. - - - // b.2) Functions that perform all calculations in one step. - - int Eigenvalues(arcomplex* &EigValp, bool ivec = false, - bool ischur = false); - // Overrides array EigValp with the eigenvalues of the problem. - // Also calculates eigenvectors and Schur vectors if requested. - - int EigenValVectors(arcomplex* &EigVecp, - arcomplex* &EigValp, bool ischur = false); - // Overrides array EigVecp sequentially with the eigenvectors of the - // given eigen-problem. Also stores the eigenvalues in EigValp. - // Calculates Schur vectors if requested. - - - // b.3) Functions that return elements of vectors and matrices. - - arcomplex Eigenvalue(int i); - // Provides i-eth eigenvalue. - - arcomplex Eigenvector(int i, int j); - // Provides element j of the i-eth eigenvector. - - - // b.4) Functions that use STL vector class. - -#ifdef STL_VECTOR_H - - vector >* StlEigenvalues(bool ivec = false, - bool ischur = false); - // Calculates the eigenvalues and stores them in a single STL vector. - // Also calculates eigenvectors and Schur vectors if requested. - - vector >* StlEigenvector(int i); - // Returns the i-th eigenvector in a STL vector. - -#endif // #ifdef STL_VECTOR_H. - - - // b.5) Constructors and destructor. - - ARrcCompStdEig() { } - // Short constructor. - - ARrcCompStdEig(int np, int nevp, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARrcCompStdEig(int np, int nevp, arcomplex sigma, - const std::string& whichp = "LM", int ncvp = 0, ARFLOAT tolp = 0.0, - int maxitp = 0, arcomplex* residp = NULL, - bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARrcCompStdEig(const ARrcCompStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARrcCompStdEig() { } - // Destructor. - - // c) Operators. - - ARrcCompStdEig& operator=(const ARrcCompStdEig& other); - // Assignment operator. - -}; // class ARrcCompStdEig. - - -// ------------------------------------------------------------------------ // -// ARrcCompStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARrcCompStdEig::WorkspaceAllocate() -{ - - this->lworkl = this->ncv*(3*this->ncv+6); - this->lworkv = 2*this->ncv; - this->lrwork = this->ncv; - this->workl = new arcomplex[this->lworkl+1]; - this->workv = new arcomplex[this->lworkv+1]; - this->rwork = new ARFLOAT[this->lrwork+1]; - -} // WorkspaceAllocate. - - -template -inline void ARrcCompStdEig::Aupp() -{ - - caupp(this->ido, this->bmat, this->n, this->which, this->nev, this->tol, this->resid, this->ncv, this->V, this->n, - this->iparam, this->ipntr, this->workd, this->workl, this->lworkl, this->rwork, this->info); - -} // Aupp. - - -template -inline void ARrcCompStdEig::Eupp() -{ - - ceupp(this->rvec, this->HowMny, this->EigValR, this->EigVec, this->n, this->sigmaR, this->workv, - this->bmat, this->n, this->which, this->nev, this->tol, this->resid, this->ncv, this->V, this->n, this->iparam, - this->ipntr, this->workd, this->workl, this->lworkl, this->rwork, this->info); - -} // Eupp. - - -template -int ARrcCompStdEig:: -Eigenvalues(arcomplex* &EigValp, bool ivec, bool ischur) -{ - - if (this->ValuesOK) { // Eigenvalues are available . - if (EigValp == NULL) { // Moving eigenvalues. - EigValp = this->EigValR; - this->EigValR = NULL; - this->newVal = false; - this->ValuesOK = false; - } - else { // Copying eigenvalues. - copy(this->nconv,this->EigValR,1,EigValp,1); - } - } - else { - if (this->newVal) { - delete[] this->EigValR; - this->newVal = false; - } - if (EigValp == NULL) { - try { EigValp = new arcomplex[this->ValSize()]; } - catch (ArpackError) { return 0; } - } - this->EigValR = EigValp; - if (ivec) { // Finding eigenvalues and eigenvectors. - this->nconv = this->FindEigenvectors(ischur); - } - else { // Finding eigenvalues only. - this->nconv = this->FindEigenvalues(); - } - this->EigValR = NULL; - } - return this->nconv; - -} // Eigenvalues(EigValp, ivec, ischur). - - -template -int ARrcCompStdEig:: -EigenValVectors(arcomplex* &EigVecp, arcomplex* &EigValp, - bool ischur) -{ - - if (this->ValuesOK) { // Eigenvalues are already available. - this->nconv = Eigenvalues(EigValp, false); - this->nconv = this->Eigenvectors(EigVecp, ischur); - } - else { // Eigenvalues and vectors are not available. - if (this->newVec) { - delete[] this->EigVec; - this->newVec = false; - } - if (this->newVal) { - delete[] this->EigValR; - this->newVal = false; - } - try { - if (EigVecp == NULL) EigVecp = new arcomplex[this->ValSize()*this->n]; - if (EigValp == NULL) EigValp = new arcomplex[this->ValSize()]; - } - catch (ArpackError) { return 0; } - this->EigVec = EigVecp; - this->EigValR = EigValp; - this->nconv = this->FindEigenvectors(ischur); - this->EigVec = NULL; - this->EigValR = NULL; - } - return this->nconv; - -} // EigenValVectors(EigVecp, EigValp, ischur). - - -template -inline arcomplex ARrcCompStdEig::Eigenvalue(int i) -// calcula e retorna um autovalor. - -{ - - // Returning i-eth eigenvalue. - - if (!this->ValuesOK) { - throw ArpackError(ArpackError::VALUES_NOT_OK, "Eigenvalue(i)"); - } - else if ((i>=this->nconv)||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "Eigenvalue(i)"); - } - return this->EigValR[i]; - -} // Eigenvalue(i). - - -template -inline arcomplex ARrcCompStdEig:: -Eigenvector(int i, int j) -{ - - // Returning element j of i-eth eigenvector. - - if (!this->VectorsOK) { - throw ArpackError(ArpackError::VECTORS_NOT_OK, "Eigenvector(i,j)"); - } - else if ((i>=this->nconv)||(i<0)||(j>=this->n)||(j<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "Eigenvector(i,j)"); - } - return this->EigVec[i*this->n+j]; - -} // Eigenvector(i,j). - - -#ifdef STL_VECTOR_H - -template -inline vector >* ARrcCompStdEig:: -StlEigenvalues(bool ivec, bool ischur) -{ - - // Returning the eigenvalues in a STL vector. - - vector >* ValR; - arcomplex* ValPtr; - - try { - ValR = new vector >(ValSize()); - } - catch (ArpackError) { return NULL; } - ValPtr = ValR->begin(); - nconv = Eigenvalues(ValPtr, ivec, ischur); - return ValR; - -} // StlEigenvalues. - - -template -inline vector >* ARrcCompStdEig:: -StlEigenvector(int i) -{ - - // Returning the i-th eigenvector in a STL vector. - - vector >* Vec; - - if (!VectorsOK) { - throw ArpackError(ArpackError::VECTORS_NOT_OK, "StlEigenvector(i)"); - } - else if ((i>=ValSize())||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "StlEigenvector(i)"); - } - try { - Vec = new vector >(&EigVec[i*n], &EigVec[(i+1)*n]); - } - catch (ArpackError) { return NULL; } - return Vec; - -} // StlEigenvector(i). - -#endif // #ifdef STL_VECTOR_H. - - -template -inline ARrcCompStdEig:: -ARrcCompStdEig(int np, int nevp, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, arcomplex* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARrcCompStdEig:: -ARrcCompStdEig(int np, int nevp, arcomplex sigmap, - const std::string& whichp, int ncvp, ARFLOAT tolp, int maxitp, - arcomplex* residp, bool ishiftp) - -{ - - this->ChangeShift(sigmap); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (shift and invert mode). - - -template -ARrcCompStdEig& ARrcCompStdEig:: -operator=(const ARrcCompStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARRSCOMP_H - diff --git a/src/external/arpack++/include/arrseig.h b/src/external/arpack++/include/arrseig.h deleted file mode 100644 index 57cba476..00000000 --- a/src/external/arpack++/include/arrseig.h +++ /dev/null @@ -1,1515 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARRSEig.h. - Arpack++ base class ARrcStdEig definition. - This class implements c++ version of the reverse - communication interface for standard problems. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARRSEIG_H -#define ARRSEIG_H - -#include -#include -#include -#include "arch.h" -#include "arerror.h" -#include "debug.h" -#include "blas1c.h" - - -// ARrcStdEig class definition. - -template -class ARrcStdEig { - - protected: - - // a) Protected variables: - - // a.1) User defined parameters. - - int n; // Dimension of the eigenproblem. - int nev; // Number of eigenvalues to be computed. 0 < nev < n-1. - int ncv; // Number of Arnoldi vectors generated at each iteration. - int maxit; // Maximum number of Arnoldi update iterations allowed. - std::string which; // Specify which of the Ritz values of OP to compute. - ARFLOAT tol; // Stopping criterion (relative accuracy of Ritz values). - ARFLOAT sigmaI; // Imaginary part of shift (for nonsymmetric problems). - ARTYPE sigmaR; // Shift (real part only if problem is nonsymmetric). - ARTYPE *resid; // Initial residual vector. - - - // a.2) Internal variables. - - bool rvec; // Indicates if eigenvectors/Schur vectors were - // requested (or only eigenvalues will be determined). - bool newRes; // Indicates if a new "resid" vector was created. - bool newVal; // Indicates if a new "EigValR" vector was created. - bool newVec; // Indicates if a new "EigVec" vector was created. - bool PrepareOK; // Indicates if internal variables were correctly set. - bool BasisOK; // Indicates if an Arnoldi basis was found. - bool ValuesOK; // Indicates if eigenvalues were calculated. - bool VectorsOK; // Indicates if eigenvectors were determined. - bool SchurOK; // Indicates if Schur vectors were determined. - bool AutoShift; // Indicates if implicit shifts will be generated - // internally (or will be supplied by the user). - char bmat; // Indicates if the problem is a standard ('I') or - // generalized ('G") eigenproblem. - char HowMny; // Indicates if eigenvectors ('A') or Schur vectors ('P') - // were requested (not referenced if rvec = false). - int ido; // Original ARPACK reverse communication flag. - int info; // Original ARPACK error flag. - int mode; // Indicates the type of the eigenproblem (regular, - // shift and invert, etc). - int lworkl; // Dimension of array workl. - int lworkv; // Dimension of array workv. - int lrwork; // Dimension of array rwork. - int iparam[12]; // Vector that handles original ARPACK parameters. - int ipntr[15]; // Vector that handles original ARPACK pointers. - ARFLOAT *rwork; // Original ARPACK internal vector. - ARTYPE *workl; // Original ARPACK internal vector. - ARTYPE *workd; // Original ARPACK internal vector. - ARTYPE *workv; // Original ARPACK internal vector. - ARTYPE *V; // Arnoldi basis / Schur vectors. - - - // a.3) Pure output variables. - - int nconv; // Number of "converged" Ritz values. - ARFLOAT *EigValI; // Imaginary part of eigenvalues (nonsymmetric problems). - ARTYPE *EigValR; // Eigenvalues (real part only if problem is nonsymmetric). - ARTYPE *EigVec; // Eigenvectors. - - - // b) Protected functions: - - // b.1) Memory control functions. - - bool OverV() { return (EigVec == &V[1]); } - // Indicates whether EigVec overrides V or no. - - virtual int ValSize() { return nev; } - // Provides the size of array EigVal. - // Redefined in ARrcNonSymStdEig. - - void ClearFirst(); - // Clears some boolean variables in order to define a entire new problem. - - void ClearBasis(); - // Clear some boolean variables in order to recalculate the arnoldi basis. - - void ClearMem(); - // Clears workspace. - - virtual void ValAllocate(); - // Creates arrays EigValR and EigValI. - // Redefined in ARrcNonSymStdEig. - - virtual void VecAllocate(bool newV = true); - // Creates array EigVec. - - virtual void WorkspaceAllocate(); - // Function that must be defined by a derived class. - // Redefined in ARrc[Sym|NonSym|Complex]StdEig. - - - // b.2) Functions that call the original ARPACK FORTRAN code. - - virtual void Aupp() { - throw ArpackError(ArpackError::NOT_IMPLEMENTED, "Aupp"); - } - // Interface to FORTRAN subroutines __AUPD. - // Must be defined by a derived class. - // Redefined in ARrc[Sym|NonSym|Complex]StdEig. - - void AuppError(); - // Handles errors occurred in function Aupp. - - virtual void Eupp() { - throw ArpackError(ArpackError::NOT_IMPLEMENTED, "Eupp"); - } - // Interface to FORTRAN subroutines __EUPD. - // Must be defined by a derived class. - // Redefined in ARrc[Sym|NonSym|Complex]Eig. - - void EuppError(); - // Handles errors occurred in function Eupp. - - - // b.3) Functions that check user defined parameters. - - int CheckN(int np); - // Does range checking on ncv. - - int CheckNcv(int ncvp); - // Forces ncv to conform to its ranges. - - virtual int CheckNev(int nevp); - // Does range checking on nev. - // Redefined in ARrcNonSymStdEig. - - int CheckMaxit(int maxitp); - // Forces maxit to be greater than zero. - - virtual std::string CheckWhich(const std::string& whichp); - // Determines if the value of variable "which" is valid. - // Redefined in ARrcSymStdEig. - - - // b.4) Functions that set internal variables. - - void Restart(); - - virtual void Prepare(); - // Defines internal variables and allocates working arrays. - - virtual void Copy(const ARrcStdEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - public: - - // c) Public functions: - - // c.1) Function that stores user defined parameters. - - virtual void DefineParameters(int np, int nevp, const std::string& whichp="LM", - int ncvp=0, ARFLOAT tolp=0.0, int maxitp=0, - ARTYPE* residp=NULL, bool ishiftp=true); - // Set values of problem parameters (also called by constructors). - // Redefined in ARrcStdEig and ARrcGenEig. - - - // c.2) Functions that detect if output data is ready. - - bool ParametersDefined() { return PrepareOK; } - // Indicates if all internal variables and arrays were defined. - - bool ArnoldiBasisFound() { return BasisOK; } - // Indicates if an Arnoldi basis is available. - - bool EigenvaluesFound() { return ValuesOK; } - // Indicates if the requested eigenvalues are available. - - bool EigenvectorsFound() { return VectorsOK; } - // Indicates if the requested eigenvectors are available. - - bool SchurVectorsFound() { return SchurOK; } - // Indicates if the Schur vectors are available. - - - // c.3) Functions that provides access to internal variables' values. - - int ConvergedEigenvalues() { return nconv; } - // Provides the number of "converged" eigenvalues found so far. - - int GetMaxit() { return maxit; } - // Returns the maximum number of Arnoldi update iterations allowed. - - int GetIter(); - // Returns the actual number of Arnoldi iterations taken. - - ARFLOAT GetTol() { return tol; } - // Returns the stopping criterion. - - int GetN() { return n; } - // Returns the dimension of the problem. - - int GetNev() { return nev; } - // Returns the number of eigenvalues to be computed. - - int GetNcv() { return ncv; } - // Returns the number of Arnoldi vectors generated at each iteration.. - - const std::string& GetWhich() { return which; } - // Returns "which". - - ARTYPE GetShift() { return sigmaR; } - // Returns the shift (when in shift and invert mode). - - bool GetAutoShift() { return AutoShift; } - // Returns "AutoShift". - - int GetMode() { return mode; } - // Returns the type of problem (regular, shift and invert, etc). - - - // c.4) Functions that allow changes in problem parameters. - - void ChangeMaxit(int maxitp); - // Changes the maximum number of Arnoldi update iterations allowed. - - void ChangeTol(ARFLOAT tolp); - // Changes the stopping criterion. - - virtual void ChangeNev(int nevp); - // Changes the number of eigenvalues to be computed. - - virtual void ChangeNcv(int ncvp); - // Changes the number of Arnoldi vectors generated at each iteration.. - - virtual void ChangeWhich(const std::string& whichp); - // Changes "which". - - virtual void ChangeShift(ARTYPE sigmaRp); - // Turns the problem to shift-and-invert mode with shift defined by sigmaRp. - // Redefined in many derived classes. - - virtual void NoShift(); - // Turns the problem to regular mode. - // Redefined in ARrcGenEig. - - void InvertAutoShift(); - // Inverts "AutoShift". - - virtual void SetRegularMode() { NoShift(); } - // Turns problem to regular mode. - - virtual void SetShiftInvertMode(ARTYPE sigmaRp) { ChangeShift(sigmaRp); } - // Turns problem to regular mode. - - // c.5) Trace functions. - - virtual void Trace() { - throw ArpackError(ArpackError::NOT_IMPLEMENTED, "Trace"); - } - // Turns on trace mode. - // Must be defined by a derived class. - // Redefined in ARrc[Sym|NonSym|Complex]StdEig. - - void NoTrace() { TraceOff(); } - // Turns off trace mode. - - - // c.6) Functions that permit step by step execution of ARPACK. - - int GetNp() { return iparam[8]; } - // Returns the number of shifts that must be supplied after a call to - // TakeStep() when shifts are provided by the user (AutoShift = false). - - int GetIdo() { return ido; } - // Indicates the type of operation the user must perform between two - // successive calls to function TakeStep(). - // ido = -1: compute y = OP*x, where GetVector() gives a pointer to the - // vector x, and PutVector() indicates where to store y. - // ido = 1: compute y = OP*x, where GetVector() gives a pointer to the - // vector x, and PutVector() indicates where to store y. - // When solving generalized problems, a pointer to the product - // B*x is also available by using GetProd(). - // ido = 2: compute y = B*x, where GetVector() gives a pointer to the - // vector x, and PutVector() indicates where to store y. - // ido = 3: compute shifts, where PutVector() indicates where to store them. - - virtual ARTYPE* GetVector(); - // When ido = -1, 1 or 2 and the user must perform a product in the form - // y <- M*x, this function indicates where x is stored. When ido = 3, this - // function indicates where the eigenvalues of the current Hessenberg - // matrix are located. - - ARTYPE* GetProd(); - // When ido = 1 and the user must perform a product in the form - // y <- M*B*x, this function indicates where B*x is stored. - - virtual ARTYPE* PutVector(); - // When ido = -1, 1 or 2 and the user must perform a product in the form - // y <- M*x, this function indicates where to store y. When ido = 3, this - // function indicates where to store the shifts. - // Redefined in ARrcSymStdEig. - - virtual int TakeStep(); - // Calls Aupp once if there is no Arnoldi basis available. - - - // c.7) Functions that perform final calculations. - - virtual int FindArnoldiBasis(); - // Determines the Arnoldi basis related to the given problem. - // This function has no meaning for this class. It is maintained - // here for compatibility with all derived classes. - // Redefined in ARStdEig, ARGenEig and ARSymGenEig. - - virtual int FindEigenvalues(); - // Determines nev approximated eigenvalues of the given eigen-problem. - // Redefined in ARNonSymGenEig. - - virtual int FindEigenvectors(bool schurp = false); - // Determines nev approximated eigenvectors of the given eigen-problem - // Optionally also determines nev Schur vectors that span the desired - // invariant subspace. - // Redefined in ARNonSymGenEig. - - virtual int FindSchurVectors(); - // Determines nev Schur vectors that span the desired invariant subspace. - // Redefined in ARrcSymStdEig and ARNonSymGenEig. - - - // c.8) Function that perform calculations using user supplied data structure. - - virtual int Eigenvectors(ARTYPE* &EigVecp, bool ischur = false); - // Overrides array EigVecp sequentially with the eigenvectors of the - // given eigen-problem. Also calculates Schur vectors if requested. - - - // c.9) Functions that return elements of vectors and matrices. - - ARTYPE ArnoldiBasisVector(int i, int j); - // Furnishes element j of the i-eth Arnoldi basis vector. - - ARTYPE SchurVector(int i, int j); - // Furnishes element j of the i-eth Schur vector. - - ARTYPE ResidualVector(int i); - // Furnishes element j of the residual vector. - - - // c.10) Functions that provide raw access to internal vectors and matrices. - - ARTYPE* RawArnoldiBasisVectors(); - // Provides raw access to Arnoldi basis vectors elements. - - ARTYPE* RawArnoldiBasisVector(int i); - // Provides raw access to Arnoldi basis vector i. - - ARTYPE* RawEigenvalues(); - // Provides raw access to eigenvalues. - - ARTYPE* RawEigenvectors(); - // Provides raw access to eigenvectors elements. - - ARTYPE* RawEigenvector(int i); - // Provides raw access to eigenvector i. - - ARTYPE* RawSchurVectors(); - // Provides raw access to Schur vectors elements. - - ARTYPE* RawSchurVector(int i); - // Provides raw access to Schur vector i. - - ARTYPE* RawResidualVector(); - // Provides raw access to residual vector elements. - - - // c.11) Functions that use STL vector class. - -#ifdef STL_VECTOR_H - - vector* StlArnoldiBasisVectors(); - // Returns a copy of the Arnoldi basis in a single STL vector. - - vector* StlArnoldiBasisVector(int i); - // Returns the i-th Arnoldi basis vector in a STL vector. - - vector* StlEigenvectors(bool ischur = false); - // Calculates the eigenvectors and stores them sequentially in a - // single STL vector. Also calculates Schur vectors if requested. - - vector* StlSchurVectors(); - // Returns a copy of the Schur vectors in a single STL vector. - - vector* StlSchurVector(int i); - // Returns the i-th Schur vector in a STL vector. - - vector* StlResidualVector(); - // Returns the residual vector in a STL vector. - -#endif // #ifdef STL_VECTOR_H. - - - // c.12) Constructors and destructor. - - ARrcStdEig(); - // Short constructor that does almost nothing. - - ARrcStdEig(const ARrcStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARrcStdEig() { ClearMem(); } - // Very simple destructor. - - // d) Operators: - - ARrcStdEig& operator=(const ARrcStdEig& other); - // Assignment operator. - -}; // class ARrcStdEig. - - -// ------------------------------------------------------------------------ // -// ARrcStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARrcStdEig::ClearFirst() -{ - - PrepareOK = newVal = newVec = newRes = false; - -} // ClearFirst. - - -template -inline void ARrcStdEig::ClearBasis() -{ - - BasisOK = ValuesOK = VectorsOK = SchurOK = false; - -} // ClearBasis. - - -template -void ARrcStdEig::ClearMem() -{ - - // Deleting working arrays. - - if (workl) delete[] workl; - if (workd) delete[] workd; - if (workv) delete[] workv; - if (rwork) delete[] rwork; - if (V) delete[] V; - - workl = NULL; - workd = NULL; - workv = NULL; - rwork = NULL; - V = NULL; - - // Deleting input and output arrays. - - if (newRes) { - delete[] resid; - newRes = false; - resid = NULL; // Salwen. Mar 3, 2000. - } - - if (newVal) { - delete[] EigValR; - delete[] EigValI; - newVal = false; - } - EigValR=NULL; - EigValI=NULL; - - if (newVec) { - delete[] EigVec; - newVec = false; - } - EigVec=NULL; - - // Adjusting boolean variables. - - ClearFirst(); - -} // ClearMem. - - -template -inline void ARrcStdEig::ValAllocate() -{ - - if (EigValR == NULL) { // Creating a new array EigValR. - EigValR = new ARTYPE[ValSize()]; - newVal = true; - } - -} // ValAllocate. - -template -inline void ARrcStdEig::VecAllocate(bool newV) -{ - - if (EigVec == NULL) { - if (newV) { // Creating a new array EigVec. - EigVec = new ARTYPE[ValSize()*n]; - newVec = true; - } - else { // Using V to store EigVec. - EigVec = &V[1]; - } - } - -} // VecAllocate. - - -template -void ARrcStdEig::WorkspaceAllocate() -{ - - lworkl = 0; - lworkv = 0; - lrwork = 0; - -} // WorkspaceAllocate. - - -template -void ARrcStdEig::AuppError() -{ - - switch (info) { - case 0: - return; - case -8: - throw ArpackError(ArpackError::LAPACK_ERROR, "Aupp"); - case -9: - throw ArpackError(ArpackError::START_RESID_ZERO, "Aupp"); - case -9999: - throw ArpackError(ArpackError::ARNOLDI_NOT_BUILD, "Aupp"); - case 1: - ArpackError(ArpackError::MAX_ITERATIONS, "Aupp"); - return; - case 3: - ArpackError(ArpackError::NO_SHIFTS_APPLIED, "Aupp"); - return; - default : - throw ArpackError(ArpackError::AUPP_ERROR, "Aupp"); - } - -} // AuppError. - - -template -void ARrcStdEig::EuppError() -{ - - switch (info) { - case 0: - return; - case -8: - case -9: - throw ArpackError(ArpackError::LAPACK_ERROR, "Eupp"); - case -14: - throw ArpackError(ArpackError::NOT_ACCURATE_EIG, "Eupp"); - case 1: - throw ArpackError(ArpackError::REORDERING_ERROR, "Eupp"); - default : - throw ArpackError(ArpackError::EUPP_ERROR, "Eupp"); - } - -} // EuppError. - - -template -inline int ARrcStdEig::CheckN(int np) -{ - - if (np < 2) { - throw ArpackError(ArpackError::N_SMALLER_THAN_2); - } - return np; - -} // CheckN. - - -template -inline int ARrcStdEig::CheckNcv(int ncvp) -{ - - // Adjusting ncv if ncv <= nev or ncv > n. - - if (ncvp < nev+1) { - if (ncvp) ArpackError::Set(ArpackError::NCV_OUT_OF_BOUNDS); - return ((2*nev+1)>n)?n:(2*nev+1); - } - else if (ncvp > n) { - ArpackError::Set(ArpackError::NCV_OUT_OF_BOUNDS); - return n; - } - else { - return ncvp; - } - -} // CheckNcv. - - -template -inline int ARrcStdEig::CheckNev(int nevp) -{ - - if ((nevp<1)||(nevp>=n)) { - throw ArpackError(ArpackError::NEV_OUT_OF_BOUNDS); - } - return nevp; - -} // CheckNev. - - -template -inline int ARrcStdEig::CheckMaxit(int maxitp) -{ - - if (maxitp >= 1) return maxitp; - if (maxitp < 0) ArpackError::Set(ArpackError::MAXIT_NON_POSITIVE); - return 100*nev; - -} // CheckMaxit. - -template -std::string ARrcStdEig::CheckWhich(const std::string& whichp) -{ - - switch (whichp[0]) { // The first ought to be S or L. - case 'S': - case 'L': - switch (whichp[1]) { // The second must be M, R or I. - case 'M': - case 'R': - case 'I': - return whichp; - } - default : - throw ArpackError(ArpackError::WHICH_UNDEFINED); - } - -} // CheckWhich. - - -template -void ARrcStdEig::Restart() -{ - - nconv=0; // No eigenvalues found yet. - ido =0; // First call to AUPP. - iparam[1]=(int)AutoShift; // Shift strategy used. - iparam[3]=maxit; // Maximum number of Arnoldi iterations allowed. - iparam[4]=1; // Blocksize must be 1. - info =(int)(!newRes); // Starting vector used. - ClearBasis(); - -} // Restart. - - -template -void ARrcStdEig::Prepare() -{ - - // Deleting old stuff. - - ClearMem(); - - // Defining internal variables. - - try { - - if (resid == NULL) { // Using a random starting vector. - resid = new ARTYPE[n]; - newRes = true; - } - - // Setting dimensions of working arrays. - - workd = new ARTYPE[3*n+1]; - V = new ARTYPE[n*ncv+1]; - WorkspaceAllocate(); - - } - catch (ArpackError) { // Returning from here if an error has occurred. - ArpackError(ArpackError::CANNOT_PREPARE, "Prepare"); - return; - } - - Restart(); - - // That's all. - - PrepareOK = true; - -} // Prepare. - - -template -void ARrcStdEig::Copy(const ARrcStdEig& other) -{ - - // Defining local variables. - - int i; - - // Copying variables that belong to fundamental types. - - n = other.n; - nev = other.nev; - ncv = other.ncv; - maxit = other.maxit; - which = other.which; - tol = other.tol; - sigmaI = other.sigmaI; - sigmaR = other.sigmaR; - rvec = other.rvec; - newRes = other.newRes; - newVal = other.newVal; - newVec = other.newVec; - PrepareOK = other.PrepareOK; - BasisOK = other.BasisOK; - ValuesOK = other.ValuesOK; - VectorsOK = other.VectorsOK; - SchurOK = other.SchurOK; - AutoShift = other.AutoShift; - bmat = other.bmat; - HowMny = other.HowMny; - ido = other.ido; - info = other.info; - mode = other.mode; - nconv = other.nconv; - - // Copying arrays with static dimension. - - for (i=0; i<12; i++) iparam[i] = other.iparam[i]; - for (i=0; i<15; i++) ipntr[i] = other.ipntr[i]; - - // Returning from here if "other" was not initialized. - - if (!PrepareOK) return; - - // Copying dynamic variables. - - workd = new ARTYPE[3*n+1]; // workd. - copy(3*n+1,other.workd,1,workd,1); - - V = new ARTYPE[n*ncv+1]; // V. - copy(n*ncv+1,other.V,1,V,1); - - if (newRes) { // resid. - resid = new ARTYPE[n]; - copy(n,other.resid,1,resid,1); - } - else { - resid = other.resid; - } - - if (newVec) { // EigVec. - EigVec = new ARTYPE[ValSize()*n]; - copy(ValSize()*n,other.EigVec,1,EigVec,1); - } - else if (other.EigVec == (&other.V[1])) { - EigVec = &V[1]; - } - else { - EigVec = other.EigVec; - } - - if (newVal) { // EigValR and EigValI. - EigValR = new ARTYPE[ValSize()]; - copy(ValSize(),other.EigValR,1,EigValR,1); - if (other.EigValI != NULL) { - EigValI = new ARFLOAT[ValSize()]; - copy(ValSize(),other.EigValI,1,EigValI,1); - } - else { - EigValI = NULL; - } - } - else { - EigValR = other.EigValR; - EigValI = other.EigValI; - } - - WorkspaceAllocate(); // lworkl, workl, workv and rwork. - if (lworkl) copy(lworkl+1,other.workl,1,workl,1); - if (lworkv) copy(lworkv+1,other.workv,1,workv,1); - if (lrwork) copy(lrwork+1,other.rwork,1,rwork,1); - -} // Copy. - - -template -void ARrcStdEig:: -DefineParameters(int np, int nevp, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARTYPE* residp, bool ishiftp) - -{ - - // Setting user defined parameters. - - try { - n = CheckN(np); - nev = ARrcStdEig::CheckNev(nevp); - ncv = ARrcStdEig::CheckNcv(ncvp); - which = ARrcStdEig::CheckWhich(whichp); - maxit = ARrcStdEig::CheckMaxit(maxitp); - tol = tolp; - resid = residp; - AutoShift = ishiftp; - } - - // Returning from here if an error has occurred. - - catch (ArpackError) { - ArpackError(ArpackError::PARAMETER_ERROR, "DefineParameter"); - return; - } - - // Setting internal variables. - - ClearFirst(); - Prepare(); - -} // DefineParameters. - - -template -int ARrcStdEig::GetIter() -{ - - if (BasisOK || ValuesOK || VectorsOK || SchurOK) { - return iparam[3]; - } - else { - return 0; - } - -} // GetIter. - - -template -inline void ARrcStdEig::ChangeMaxit(int maxitp) -{ - - maxit = CheckMaxit(maxitp); - Restart(); - -} // ChangeMaxit. - - -template -inline void ARrcStdEig::ChangeTol(ARFLOAT tolp) -{ - - if (tolp < tol) Restart(); - tol = tolp; - -} // ChangeTol. - - -template -void ARrcStdEig::ChangeNev(int nevp) -{ - - try { - nev = CheckNev(nevp); - ncv = CheckNcv(ncv); - } - catch (ArpackError) { return; } - if (PrepareOK) Prepare(); - -} // ChangeNev. - - -template -inline void ARrcStdEig::ChangeNcv(int ncvp) -{ - - ncv = CheckNcv(ncvp); - if (PrepareOK) Prepare(); - -} // ChangeNcv. - - -template -void ARrcStdEig::ChangeWhich(const std::string& whichp) -{ - - try { which = CheckWhich(whichp); } - catch (ArpackError) { return; } - Restart(); - -} // ChangeWhich. - - -template -inline void ARrcStdEig::ChangeShift(ARTYPE sigmaRp) -{ - - sigmaR = sigmaRp; - sigmaI = 0.0; - mode = 3; - iparam[7] = mode; - Restart(); - -} // ChangeShift. - - -template -inline void ARrcStdEig::NoShift() -{ - - sigmaR = (ARTYPE)0; - sigmaI = 0.0; - mode = 1; - iparam[7] = mode; - Restart(); - -} // NoShift. - - -template -void ARrcStdEig::InvertAutoShift() -{ - - AutoShift = !AutoShift; - Restart(); - -} // InvertAutoShift. - - -template -ARTYPE* ARrcStdEig::GetVector() -{ - - switch (ido) { - case -1: - case 1: - case 2: - return &workd[ipntr[1]]; - case 3: - return &workl[ipntr[6]]; - default: - throw ArpackError(ArpackError::CANNOT_GET_VECTOR, "GetVector"); - } - -} // GetVector. - - -template -ARTYPE* ARrcStdEig::GetProd() -{ - - if (ido != 1) { - throw ArpackError(ArpackError::CANNOT_GET_PROD, "GetProd"); - } - return &workd[ipntr[3]]; - -} // GetProd. - - -template -ARTYPE* ARrcStdEig::PutVector() -{ - - switch (ido) { - case -1: - case 1: - case 2: - return &workd[ipntr[2]]; - case 3: - return &workl[ipntr[14]]; - default: - throw ArpackError(ArpackError::CANNOT_PUT_VECTOR, "PutVector"); - } - -} // PutVector. - - -template -int ARrcStdEig::TakeStep() -{ - - // Requiring the definition of all internal variables. - - if (!PrepareOK) { - - throw ArpackError(ArpackError::PREPARE_NOT_OK, "TakeStep"); - - } - else if (!BasisOK) { - - // Taking a step if the Arnoldi basis is not available. - - Aupp(); - - // Checking if convergence was obtained. - - if (ido==99) { - nconv = iparam[5]; - AuppError(); - if (info >= 0) BasisOK = true; - } - } - - return ido; - -} // TakeStep. - - -template -inline int ARrcStdEig::FindArnoldiBasis() -{ - - if (!BasisOK) { - throw ArpackError(ArpackError::CANNOT_FIND_BASIS, "FindArnoldiBasis"); - } - return nconv; - -} // FindArnoldiBasis. - - -template -int ARrcStdEig::FindEigenvalues() -{ - - // Determining eigenvalues if they are not available. - - if (!ValuesOK) { - try { - ValAllocate(); - nconv = FindArnoldiBasis(); - rvec = false; - HowMny = 'A'; - if (nconv>0) { - Eupp(); - EuppError(); - } - } - catch (ArpackError) { - ArpackError(ArpackError::CANNOT_FIND_VALUES, "FindEigenvalues"); - return 0; - } - if (newVal) ValuesOK = true; - } - return nconv; - -} // FindEigenvalues. - - -template -int ARrcStdEig::FindEigenvectors(bool schurp) -{ - - // Determining eigenvectors if they are not available. - - if (!VectorsOK) { - try { - ValAllocate(); - VecAllocate(schurp); - nconv = FindArnoldiBasis(); - rvec = true; - HowMny = 'A'; - if (nconv>0) { - Eupp(); - EuppError(); - } - } - catch (ArpackError) { - ArpackError(ArpackError::CANNOT_FIND_VECTORS, "FindEigenvectors"); - return 0; - } - BasisOK = false; - if (newVal) ValuesOK = true; - if (newVec || OverV()) VectorsOK = true; - if (!OverV()) SchurOK = true; - } - return nconv; - -} // FindEigenvectors. - - -template -int ARrcStdEig::FindSchurVectors() -{ - - // Determining Schur vectors if they are not available. - - if (!SchurOK) { - try { - ValAllocate(); - nconv = FindArnoldiBasis(); - rvec = true; - HowMny = 'P'; - if (nconv>0) { - Eupp(); - EuppError(); - } - } - catch (ArpackError) { - ArpackError(ArpackError::CANNOT_FIND_SCHUR, "FindSchurVectors"); - return 0; - } - BasisOK = false; - if (newVal) ValuesOK = true; - SchurOK =true; - } - return nconv; - -} // FindSchurVectors. - - -template -int ARrcStdEig:: -Eigenvectors(ARTYPE* &EigVecp, bool ischur) -{ - - // Overriding EigVecp with the converged eigenvectors. - - if (VectorsOK) { // Eigenvectors are available. - if ((EigVecp == NULL) && (newVec)) { // Moving eigenvectors. - EigVecp = EigVec; - EigVec = NULL; - newVec = false; - VectorsOK = false; - } - else { // Copying eigenvectors. - if (EigVecp == NULL) { - try { EigVecp = new ARTYPE[ValSize()*n]; } - catch (ArpackError) { return 0; } - } - copy(ValSize()*n,EigVec,1,EigVecp,1); - } - } - else { // Eigenvectors are not available. - if (newVec) { - delete[] EigVec; - newVec = false; - } - if (EigVecp == NULL) { - try { EigVecp = new ARTYPE[ValSize()*n]; } - catch (ArpackError) { return 0; } - } - EigVec = EigVecp; - nconv = FindEigenvectors(ischur); - EigVec = NULL; - } - return nconv; - -} // Eigenvectors(EigVecp, ischur). - - -template -inline ARTYPE ARrcStdEig::ArnoldiBasisVector(int i, int j) -{ - - // Returning element j of Arnoldi basis vector i. - - if (!BasisOK) { - throw ArpackError(ArpackError::BASIS_NOT_OK, "ArnoldiBasisVector(i,j)"); - } - else if ((i>=ncv)||(i<0)||(j>=n)||(j<0)) { - throw ArpackError(ArpackError::RANGE_ERROR,"ArnoldiBasisVector(i,j)"); - } - return V[i*n+j+1]; - -} // ArnoldiBasisVector(i,j). - - -template -inline ARTYPE ARrcStdEig::SchurVector(int i, int j) -{ - - // Returning element j of Schur vector i. - - if (!SchurOK) { - throw ArpackError(ArpackError::SCHUR_NOT_OK, "SchurVector(i,j)"); - } - else if ((i>=nconv)||(i<0)||(j>=n)||(j<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "SchurVector(i,j)"); - } - return V[i*n+j+1]; - -} // SchurVector(i,j). - - -template -inline ARTYPE ARrcStdEig::ResidualVector(int i) -{ - - // Returning element i of the residual vector. - - if ((!newRes)||(!(BasisOK||ValuesOK||VectorsOK||SchurOK))) { - throw ArpackError(ArpackError::RESID_NOT_OK, "ResidualVector(i)"); - } - else if ((i>=n)||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "ResidualVector(i)"); - } - return resid[i]; - -} // ResidualVector(i). - - -template -inline ARTYPE* ARrcStdEig::RawArnoldiBasisVectors() -{ - - // Returning a constant pointer to Arnoldi basis. - - if (!BasisOK) { - throw ArpackError(ArpackError::BASIS_NOT_OK, "RawArnoldiBasisVectors"); - } - return &V[1]; - -} // RawArnoldiBasisVectors. - - -template -inline ARTYPE* ARrcStdEig::RawArnoldiBasisVector(int i) -{ - - // Returning a constant pointer to Arnoldi basis vector i. - - if (!BasisOK) { - throw ArpackError(ArpackError::BASIS_NOT_OK, "RawArnoldiBasisVector(i)"); - } - else if ((i>=ncv)||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR,"RawArnoldiBasisVector(i)"); - } - return &V[i*n+1]; - -} // RawArnoldiBasisVector(i). - - -template -inline ARTYPE* ARrcStdEig::RawEigenvalues() -{ - - if (!ValuesOK) { - throw ArpackError(ArpackError::VALUES_NOT_OK, "RawEigenvalues"); - } - return EigValR; - -} // RawEigenvalues. - - -template -inline ARTYPE* ARrcStdEig::RawEigenvectors() -{ - - if (!VectorsOK) { - throw ArpackError(ArpackError::VECTORS_NOT_OK, "RawEigenvectors"); - } - return EigVec; - -} // RawEigenvectors. - - -template -inline ARTYPE* ARrcStdEig::RawEigenvector(int i) -{ - - // Returning a constant pointer to eigenvector i. - - if (!VectorsOK) { - throw ArpackError(ArpackError::VECTORS_NOT_OK, "RawEigenvector(i)"); - } - else if ((i>=ValSize())||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "RawEigenvector(i)"); - } - return &EigVec[i*n]; - -} // RawEigenvector(i). - - -template -inline ARTYPE* ARrcStdEig::RawSchurVectors() -{ - - if (!SchurOK) { - throw ArpackError(ArpackError::SCHUR_NOT_OK, "RawSchurVectors"); - } - return &V[1]; - -} // RawSchurVectors. - - -template -inline ARTYPE* ARrcStdEig::RawSchurVector(int i) -{ - - // Returning a constant pointer to Schur vector i. - - if (!SchurOK) { - throw ArpackError(ArpackError::SCHUR_NOT_OK, "RawSchurVector(i)"); - } - else if ((i>=nev)||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "RawSchurVector(i)"); - } - return &V[i*n+1]; - -} // RawSchurVector(i). - - -template -inline ARTYPE* ARrcStdEig::RawResidualVector() -{ - - if (!newRes) { - throw ArpackError(ArpackError::RESID_NOT_OK, "RawResidualVector"); - } - return resid; - -} // RawResidualVector. - - -#ifdef STL_VECTOR_H // Defining some functions that use STL vector class. - -template -inline vector* ARrcStdEig::StlArnoldiBasisVectors() -{ - - // Returning the Arnoldi basis in a single STL vector. - - vector* StlBasis; - - if (!BasisOK) { - nconv = FindArnoldiBasis(); - } - try { - StlBasis = new vector(&V[1], &V[n*ncv+1]); - } - catch (ArpackError) { return NULL; } - return StlBasis; - -} // StlArnoldiBasisVectors. - - -template -inline vector* ARrcStdEig::StlArnoldiBasisVector(int i) -{ - - // Returning the i-th Arnoldi basis vector in a STL vector. - - vector* StlBasis; - - if (!BasisOK) { - throw ArpackError(ArpackError::BASIS_NOT_OK, "StlArnoldiBasisVector(i)"); - } - else if ((i>=ncv)||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR,"StlArnoldiBasisVector(i)"); - } - try { - StlBasis = new vector(&V[i*n+1], &V[(i+1)*n+1]); - } - catch (ArpackError) { return NULL; } - return StlBasis; - -} // StlArnoldiBasisVector(i). - - -template -inline vector* ARrcStdEig::StlEigenvectors(bool ischur) -{ - - // Returning the eigenvector in a single STL vector. - - vector* StlEigVec; - ARTYPE* VecPtr; - - try { StlEigVec = new vector(ValSize()*n); } - catch (ArpackError) { return NULL; } - VecPtr = StlEigVec->begin(); - nconv = Eigenvectors(VecPtr, ischur); - return StlEigVec; - -} // StlEigenvectors. - - -template -inline vector* ARrcStdEig::StlSchurVectors() -{ - - vector* StlSchurVec; - - if (!SchurOK) { - nconv = FindSchurVectors(); - } - try { - StlSchurVec = new vector(&V[1], &V[nev*n+1]); - } - catch (ArpackError) { return NULL; } - return StlSchurVec; - -} // StlSchurVectors. - - -template -inline vector* ARrcStdEig::StlSchurVector(int i) -{ - - // Returning the i-th Schur vector in a STL vector. - - vector* StlSchurVec; - - if (!SchurOK) { - throw ArpackError(ArpackError::SCHUR_NOT_OK, "StlSchurVector(i)"); - } - else if ((i>=nev)||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "StlSchurVector(i)"); - } - try { - StlSchurVec = new vector(&V[i*n+1], &V[(i+1)*n+1]); - } - catch (ArpackError) { return NULL; } - return StlSchurVec; - -} // StlSchurVector(i). - - -template -inline vector* ARrcStdEig::StlResidualVector() -{ - - // Returning the residual vector in a STL vector. - - vector* StlResid; - - if (!newRes) { - throw ArpackError(ArpackError::RESID_NOT_OK, "StlResidualVector"); - } - try { - StlResid = new vector(resid, &resid[n]); - } - catch (ArpackError) { return NULL; } - return StlResid; - -} // StlResidualVector. - -#endif // #ifdef STL_VECTOR_H. - - -template -inline ARrcStdEig::ARrcStdEig() -{ - - resid = NULL; - rwork = NULL; - workl = NULL; - workd = NULL; - workv = NULL; - V = NULL; - EigValR = NULL; - EigValI = NULL; - EigVec = NULL; - bmat = 'I'; // This is a standard problem. - ClearFirst(); - NoShift(); - NoTrace(); - -} // Short constructor. - - -template -ARrcStdEig& ARrcStdEig:: -operator=(const ARrcStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARRSEIG_H - diff --git a/src/external/arpack++/include/arrsnsym.h b/src/external/arpack++/include/arrsnsym.h deleted file mode 100644 index 106b10df..00000000 --- a/src/external/arpack++/include/arrsnsym.h +++ /dev/null @@ -1,861 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARRSNSym.h. - Arpack++ class ARrcNonSymStdEig definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARRSNSYM_H -#define ARRSNSYM_H - -#include - -#include "arch.h" -#include "arerror.h" -#include "debug.h" -#include "arrseig.h" -#include "naupp.h" -#include "neupp.h" - - -template -class ARrcNonSymStdEig: public virtual ARrcStdEig { - - protected: - - // a) Protected functions: - - // a.1) Memory control functions. - - int ValSize() { return this->nev+1; } - // Provides the size of array EigVal. - - void ValAllocate(); - // Creates arrays EigValR and EigValI. - - void WorkspaceAllocate(); - // Allocates workspace for nonsymmetric problems. - - - // a.2) Functions that handle original FORTRAN ARPACK code. - - void Aupp(); - // Interface to FORTRAN subroutines SNAUPD and DNAUPD. - - void Eupp(); - // Interface to FORTRAN subroutines SNEUPD and DNEUPD. - - - // a.3) Functions that check user defined parameters. - - int CheckNev(int nevp); - // Does Range checking on nev. - - - // a.4) Auxiliary functions required when using STL vector class. - - bool ConjEigVec(int i); - // Indicates if EigVec[i] is the second eigenvector in - // a complex conjugate pair. - -#ifdef ARCOMP_H -#ifdef STL_VECTOR_H - - vector >* GenComplex(vector* RealPart, - vector* ImagPart, - bool conj = false); - // Generates a complex vector Complex = RealPart + I*ImagPart - // (or Complex = RealPart - I*ImagPart, if conj = true). - - vector >* GenComplex(int dim, ARFLOAT* RealPart, - ARFLOAT* ImagPart, - bool conj = false); - // Generates a complex vector Complex = RealPart + I*ImagPart - // (or Complex = RealPart - I*ImagPart, if conj = true). dim - // is the length of RealPart and ImagPart. - - vector >* GenComplex(int dim, ARFLOAT* RealPart); - // Generates a complex vector from a real vector. dim is the - // length of RealPart. - -#endif // STL_VECTOR_H. -#endif // ARCOMP_H. - - public: - - // b) Public functions: - - // b.1) Trace functions. - - void Trace(const int digit = -5, const int getv0 = 0, const int aupd = 1, - const int aup2 = 0, const int aitr = 0, const int eigt = 0, - const int apps = 0, const int gets = 0, const int eupd = 0) - { - nTraceOn(digit, getv0, aupd, aup2, aitr, eigt, apps, gets, eupd); - } - // Turns on trace mode. - - - // b.2) Functions that permit step by step execution of ARPACK. - - ARFLOAT* GetVectorImag(); - // When ido = 3, this function indicates where the imaginary part - // of the eigenvalues of the current Hessenberg matrix are located. - - - // b.3) Functions that perform all calculations in one step. - - int Eigenvalues(ARFLOAT* &EigValRp, ARFLOAT* &EigValIp, - bool ivec = false, bool ischur = false); - // Overrides arrays EigValRp with the real part and EigValIp - // with the imaginary part of the eigenvalues of the problem. - // Calculates eigenvectors and Schur vectors if requested. - - int EigenValVectors(ARFLOAT* &EigVecp, ARFLOAT* &EigValRp, - ARFLOAT* &EigValIp, bool ischur = false); - // Overrides array EigVecp sequentially with the eigenvectors of the - // given eigen-problem. Also stores the eigenvalues in EigValRp and - // EigValIp. Calculates Schur vectors if requested. - - - // b.4) Functions that return elements of vectors and matrices. - -#ifdef ARCOMP_H - arcomplex Eigenvalue(int i); - // Furnishes i-eth eigenvalue. -#endif // ARCOMP_H. - - ARFLOAT EigenvalueReal(int i); - // Provides the real part of the i-eth eigenvalue. - - ARFLOAT EigenvalueImag(int i); - // Provides the imaginary part of the i-eth eigenvalue. - -#ifdef ARCOMP_H - arcomplex Eigenvector(int i, int j); - // Furnishes element j of the i-eth eigenvector. -#endif // ARCOMP_H. - - ARFLOAT EigenvectorReal(int i, int j); - // Provides the real part of element j of the i-eth eigenvector. - - ARFLOAT EigenvectorImag(int i, int j); - // Provides the imaginary part of element j of the i-eth eigenvector. - - - // b.5) Functions that provide raw access to internal vectors and matrices. - - ARFLOAT* RawEigenvaluesImag(); - // Provides raw access to the imaginary part of eigenvalues. - - - // b.6) Functions that use STL vector class. - -#ifdef STL_VECTOR_H - -#ifdef ARCOMP_H - vector >* StlEigenvalues(bool ivec = false, - bool ischur = false); - // Calculates the eigenvalues and stores them in a single STL vector. - // Also calculates eigenvectors and Schur vectors if requested. -#endif // ARCOMP_H. - - vector* StlEigenvaluesReal(); - // Returns the real part of the eigenvalues. - - vector* StlEigenvaluesImag(); - // Returns the imaginary part of the eigenvalues. - -#ifdef ARCOMP_H - vector >* StlEigenvector(int i); - // Returns the i-th eigenvector. -#endif // ARCOMP_H. - - vector* StlEigenvectorReal(int i); - // Returns the real part of the i-th eigenvector. - - vector* StlEigenvectorImag(int i); - // Returns the imaginary part of the i-th eigenvector. - -#endif // STL_VECTOR_H. - - - // b.7) Constructors and destructor. - - ARrcNonSymStdEig() { } - // Short constructor. - - ARrcNonSymStdEig(int np, int nevp, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, ARFLOAT* residp = NULL, - bool ishiftp = true); - // Long constructor (regular mode). - - ARrcNonSymStdEig(int np, int nevp, ARFLOAT sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARrcNonSymStdEig(const ARrcNonSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARrcNonSymStdEig() { } - // Destructor. - - // c) Operators. - - ARrcNonSymStdEig& operator=(const ARrcNonSymStdEig& other); - // Assignment operator. - -}; // class ARrcNonSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARrcNonSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARrcNonSymStdEig::ValAllocate() -{ - - if (this->EigValR == NULL) { - this->EigValR = new ARFLOAT[ValSize()]; - this->EigValI = new ARFLOAT[ValSize()]; - this->newVal = true; - } - -} // ValAllocate. - - -template -inline void ARrcNonSymStdEig::WorkspaceAllocate() -{ - - this->lworkl = 3*this->ncv*(this->ncv+2); - this->lworkv = 3*this->ncv; - this->lrwork = 0; - this->workl = new ARFLOAT[this->lworkl+1]; - this->workv = new ARFLOAT[this->lworkv+1]; - -} // WorkspaceAllocate. - - -template -inline void ARrcNonSymStdEig::Aupp() -{ - - naupp(this->ido,this-> bmat, this->n, this->which, this->nev, this->tol, this->resid, this->ncv, this->V, this->n, - this->iparam, this->ipntr, this->workd, this->workl, this->lworkl, this->info); - -} // Aupp. - - -template -inline void ARrcNonSymStdEig::Eupp() -{ - - neupp(this->rvec, this->HowMny, this->EigValR, this->EigValI, this->EigVec, this->n, this->sigmaR, - this->sigmaI, this->workv, this->bmat, this->n, this->which, this->nev, this->tol, this->resid, this->ncv, this->V, - this->n, this->iparam, this->ipntr, this->workd, this->workl, this->lworkl, this->info); - -} // Eupp. - - -template -inline int ARrcNonSymStdEig::CheckNev(int nevp) -{ - std::cout << nevp << "ddddd22g\n";fflush(stdout); - if ((nevp<=1)||(nevp>=(this->n-1))) { // nev must satisfy 1 < nev < n-1. - std::cout << nevp << "dddd21d22g\n";fflush(stdout); - throw ArpackError(ArpackError::NEV_OUT_OF_BOUNDS); - } - return nevp; - -} // CheckNev. - - -template -bool ARrcNonSymStdEig::ConjEigVec(int i) -{ - - if (this->EigValI[i] == (ARFLOAT)0.0) return false; - int j = i-1; - while ((j >= 0) && (this->EigValI[j] != (ARFLOAT)0.0)) j--; - if (((i-j)%2) == 0) { - return true; - } - else { - return false; - } - -} // ConjEigVec. - - -#ifdef STL_VECTOR_H // Defining functions that use STL vector class. -#ifdef ARCOMP_H - -template -vector >* ARrcNonSymStdEig:: -GenComplex(vector* RealPart, vector* ImagPart, bool conj) -{ - - // Defining variables. - - vector >* Result; - try { - Result = new vector >(ValSize()); - } - catch (ArpackError) { return NULL; } - ARFLOAT* rp = RealPart->begin(); - ARFLOAT* ip = ImagPart->begin(); - ARFLOAT* end = RealPart->end(); - arcomplex* s = Result->begin(); - - // Creating a complex vector. - - if (!conj) { - while (rp != end) *s++ = arcomplex(*rp++, *ip++); - } - else { - while (rp != end) *s++ = arcomplex(*rp++, -(*ip++)); - } - - return Result; - -} // GenComplex (vector version). - - -template -vector >* ARrcNonSymStdEig:: -GenComplex(int dim, ARFLOAT* RealPart, ARFLOAT* ImagPart, bool conj) -{ - - // Defining variables. - - vector >* Result; - try { - Result = new vector >(dim); - } - catch (ArpackError) { return NULL; } - ARFLOAT* rp = RealPart; - ARFLOAT* ip = ImagPart; - ARFLOAT* end = &RealPart[dim]; - arcomplex* s = Result->begin(); - - // Creating a complex vector. - - if (!conj) { - while (rp != end) *s++ = arcomplex(*rp++, *ip++); - } - else { - while (rp != end) *s++ = arcomplex(*rp++, -(*ip++)); - } - - return Result; - -} // GenComplex (ARFLOAT* version). - - -template -vector >* ARrcNonSymStdEig:: -GenComplex(int dim, ARFLOAT* RealPart) -{ - - // Defining variables. - - vector >* Result; - try { - Result = new vector >(dim); - } - catch (ArpackError) { return NULL; } - ARFLOAT* rp = RealPart; - ARFLOAT* end = &RealPart[dim]; - arcomplex* s = Result->begin(); - - // Copying a real vector into a complex vector. - - while (rp != end) *s++ = *rp++; - - return Result; - -} // GenComplex. - -#endif // ARCOMP_H. -#endif // STL_VECTOR_H. - - -template -ARFLOAT* ARrcNonSymStdEig::GetVectorImag() -{ - - if (this->ido != 3) { - throw ArpackError(ArpackError::CANNOT_GET_VECTOR, "GetVectorImag"); - } - return &this->workl[this->ipntr[6]]; - -} // GetVectorImag. - - -template -int ARrcNonSymStdEig:: -Eigenvalues(ARFLOAT* &EigValRp, ARFLOAT* &EigValIp, bool ivec, bool ischur) -{ - - if (this->ValuesOK) { // Eigenvalues are available. - if ((EigValRp == NULL)&&(EigValIp == NULL)) { // Moving eigenvalues. - EigValRp = this->EigValR; - EigValIp = this->EigValI; - this->EigValR = NULL; - this->EigValI = NULL; - this->newVal = false; - this->ValuesOK = false; - } - else { // Copying eigenvalues. - try { - if (EigValRp == NULL) EigValRp = new ARFLOAT[ValSize()]; - if (EigValIp == NULL) EigValIp = new ARFLOAT[ValSize()]; - } - catch (ArpackError) { return 0; } - copy(this->nconv,this->EigValR,1,EigValRp,1); - copy(this->nconv,this->EigValI,1,EigValIp,1); - } - } - else { - if (this->newVal) { - delete[] this->EigValR; - delete[] this->EigValI; - this->newVal = false; - } - try { - if (EigValRp == NULL) EigValRp = new ARFLOAT[ValSize()]; - if (EigValIp == NULL) EigValIp = new ARFLOAT[ValSize()]; - } - catch (ArpackError) { return 0; } - this->EigValR = EigValRp; - this->EigValI = EigValIp; - if (ivec) { // Finding eigenvalues and vectors. - this->nconv = this->FindEigenvectors(ischur); - } - else { // Finding eigenvalues only. - this->nconv = this->FindEigenvalues(); - } - this->EigValR = NULL; - this->EigValI = NULL; - } - return this->nconv; - -} // Eigenvalues(EigValRp, EigValIp, ivec, ischur). - - -template -int ARrcNonSymStdEig:: -EigenValVectors(ARFLOAT* &EigVecp, ARFLOAT* &EigValRp, - ARFLOAT* &EigValIp, bool ischur) -{ - - if (this->ValuesOK) { // Eigenvalues are already available . - this->nconv = Eigenvalues(EigValRp, EigValIp, false); - this->nconv = this->Eigenvectors(EigVecp, ischur); - } - else { // Eigenvalues ans vectors are not available. - if (this->newVec) { - delete[] this->EigVec; - this->newVec = false; - } - if (this->newVal) { - delete[] this->EigValR; - delete[] this->EigValI; - this->newVal = false; - } - try { - if (EigVecp == NULL) EigVecp = new ARFLOAT[ValSize()*this->n]; - if (EigValRp == NULL) EigValRp = new ARFLOAT[ValSize()]; - if (EigValIp == NULL) EigValIp = new ARFLOAT[ValSize()]; - } - catch (ArpackError) { return 0; } - this->EigVec = EigVecp; - this->EigValR = EigValRp; - this->EigValI = EigValIp; - this->nconv = this->FindEigenvectors(ischur); - this->EigVec = NULL; - this->EigValR = NULL; - this->EigValI = NULL; - } - return this->nconv; - -} // EigenValVectors(EigVecp, EigValRp, EigValIp, ischur). - - -#ifdef ARCOMP_H -template -inline arcomplex ARrcNonSymStdEig::Eigenvalue(int i) -{ - - // Returning i-eth eigenvalue. - - if (!this->ValuesOK) { - throw ArpackError(ArpackError::VALUES_NOT_OK, "Eigenvalue(i)"); - } - else if ((i>=this->nconv)||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "Eigenvalue(i)"); - } - return arcomplex(this->EigValR[i],this->EigValI[i]); - -} // Eigenvalue(i). -#endif // ARCOMP_H - - -template -inline ARFLOAT ARrcNonSymStdEig::EigenvalueReal(int i) -{ - - // Returning the real part of i-eth eigenvalue. - - if (!this->ValuesOK) { - throw ArpackError(ArpackError::VALUES_NOT_OK, "EigenvalueReal(i)"); - } - else if ((i>=this->nconv)||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "EigenvalueReal(i)"); - } - return this->EigValR[i]; - -} // EigenvalueReal(i). - - -template -inline ARFLOAT ARrcNonSymStdEig::EigenvalueImag(int i) -{ - - // Returning the imaginary part of i-eth eigenvalue. - - if (!this->ValuesOK) { - throw ArpackError(ArpackError::VALUES_NOT_OK, "EigenvalueImag(i)"); - } - else if ((i>=this->nconv)||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "EigenvalueImag(i)"); - } - return this->EigValI[i]; - -} // EigenvalueImag(i). - - -#ifdef ARCOMP_H -template -inline arcomplex ARrcNonSymStdEig:: -Eigenvector(int i, int j) -{ - - // Returning element j of i-eth eigenvector. - - if ((!this->VectorsOK)||(!this->ValuesOK)) { - throw ArpackError(ArpackError::VECTORS_NOT_OK, "Eigenvector(i,j)"); - } - else if ((i>=this->nconv)||(i<0)||(j>=this->n)||(j<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "Eigenvector(i,j)"); - } - if (this->EigValI[i]==(ARFLOAT)0.0) { // Real eigenvalue. - return arcomplex(this->EigVec[i*this->n+j],(ARFLOAT)0.0); - } - else { // Complex eigenvalue. - if (this->EigValI[i]>(ARFLOAT)0.0) { // with positive imaginary part. - return arcomplex(this->EigVec[i*this->n+j], this->EigVec[(i+1)*this->n+j]); - } - else { // with negative imaginary part. - return arcomplex(this->EigVec[(i-1)*this->n+j], -this->EigVec[i*this->n+j]); - } - } - -} // Eigenvector(i,j). -#endif // ARCOMP_H - - -template -inline ARFLOAT ARrcNonSymStdEig::EigenvectorReal(int i, int j) -{ - - // Returning the real part of element j of i-eth eigenvector. - - if (!this->VectorsOK) { - throw ArpackError(ArpackError::VECTORS_NOT_OK, "EigenvectorReal(i,j)"); - } - else if ((i>=this->nconv)||(i<0)||(j>=this->n)||(j<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "EigenvectorReal(i,j)"); - } - return this->EigVec[i*this->n+j]; - -} // EigenvectorReal(i,j). - - -template -inline ARFLOAT ARrcNonSymStdEig::EigenvectorImag(int i, int j) -{ - - // Returning the imaginary part of element j of i-eth eigenvector. - - if ((!this->VectorsOK)||(!this->ValuesOK)) { - throw ArpackError(ArpackError::VECTORS_NOT_OK, "EigenvectorImag(i,j)"); - } - else if ((i>=this->nconv)||(i<0)||(j>=this->n)||(j<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "EigenvectorImag(i,j)"); - } - if (this->EigValI[i]==(ARFLOAT)0.0) { // Real eigenvalue. - return (ARFLOAT)0.0; - } - else { // Complex eigenvalue. - if (this->EigValI[i]>(ARFLOAT)0.0) { // with positive imaginary part. - return this->EigVec[(i+1)*this->n+j]; - } - else { // with negative imaginary part. - return -this->EigVec[i*this->n+j]; - } - } - -} // EigenvectorImag(i,j). - - -template -inline ARFLOAT* ARrcNonSymStdEig::RawEigenvaluesImag() -{ - - if (!this->ValuesOK) { - throw ArpackError(ArpackError::VALUES_NOT_OK, "RawEigenvaluesImag"); - } - return this->EigValI; - -} // RawEigenvaluesImag. - - -#ifdef STL_VECTOR_H // Defining some functions that use STL vector class. - -#ifdef ARCOMP_H -template -inline vector >* ARrcNonSymStdEig:: -StlEigenvalues(bool ivec, bool ischur) -{ - - // Returning the eigenvalues in a STL vector. - - // Defining temporary variables. - - vector* StlEigValR; - vector* StlEigValI; - ARFLOAT* ValRPtr; - ARFLOAT* ValIPtr; - - try { - StlEigValR = new vector(ValSize()); - StlEigValI = new vector(ValSize()); - } - catch (ArpackError) { return NULL; } - - // Finding Eigenvalues. - - ValRPtr = StlEigValR->begin(); - ValIPtr = StlEigValI->begin(); - nconv = Eigenvalues(ValRPtr, ValIPtr, ivec, ischur); - vector >* Val = GenComplex(StlEigValR, StlEigValI); - - // Deleting temporary variables. - - delete StlEigValR; - delete StlEigValI; - - return Val; - -} // StlEigenvalues. -#endif // ARCOMP_H. - - -template -inline vector* ARrcNonSymStdEig::StlEigenvaluesReal() -{ - - // Returning the real part of the eigenvalues in a STL vector. - - vector* StlEigValR; - - if (!ValuesOK) { - throw ArpackError(ArpackError::VALUES_NOT_OK, "StlEigenvaluesReal"); - } - try { - StlEigValR = new vector(EigValR, &EigValR[ValSize()]); - } - catch (ArpackError) { return NULL; } - return StlEigValR; - -} // StlEigenvaluesReal. - - -template -inline vector* ARrcNonSymStdEig::StlEigenvaluesImag() -{ - - // Returning the imaginary part of the eigenvalues in a STL vector. - - vector* StlEigValI; - - if (!ValuesOK) { - throw ArpackError(ArpackError::VALUES_NOT_OK, "StlEigenvaluesImag"); - } - try { - StlEigValI = new vector(EigValI, &EigValI[ValSize()]); - } - catch (ArpackError) { return NULL; } - return StlEigValI; - -} // StlEigenvaluesImag. - - -#ifdef ARCOMP_H -template -inline vector >* ARrcNonSymStdEig:: -StlEigenvector(int i) -{ - - // Returning the i-th eigenvector in a STL vector. - - if (!VectorsOK) { - throw ArpackError(ArpackError::VECTORS_NOT_OK, "StlEigenvector(i)"); - } - else if ((i>=ValSize())||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "StlEigenvector(i)"); - } - if (EigValI[i] == (ARFLOAT)0.0) { // Real eigenvector. - return GenComplex(n, &EigVec[i*n]); - } - else if (!ConjEigVec(i)) { // First eigenvector in a conjugate pair. - return GenComplex(n, &EigVec[i*n], &EigVec[(i+1)*n]); - } - else { // Second eigenvector in a conjugate pair. - return GenComplex(n, &EigVec[(i-1)*n], &EigVec[i*n], true); - } - -} // StlEigenvector(i). -#endif // ARCOMP_H. - - -template -inline vector* ARrcNonSymStdEig::StlEigenvectorReal(int i) -{ - - // Returning the real part of the i-th eigenvector in a STL vector. - - vector* Vec; - - if (!VectorsOK) { - throw ArpackError(ArpackError::VECTORS_NOT_OK, "StlEigenvectorReal(i)"); - } - else if ((i>=ValSize())||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "StlEigenvectorReal(i)"); - } - if (!ConjEigVec(i)) { // Real eigenvector or first in a conj. pair. - try { - Vec = new vector(&EigVec[i*n], &EigVec[(i+1)*n]); - } - catch (ArpackError) { return NULL; } - return Vec; - } - else { // Second eigenvector in a conjugate pair. - try { - Vec = new vector(&EigVec[(i-1)*n], &EigVec[i*n]); - } - catch (ArpackError) { return NULL; } - return Vec; - } - -} // StlEigenvectorReal(i). - - -template -inline vector* ARrcNonSymStdEig::StlEigenvectorImag(int i) -{ - - // Returning the imaginary part of the i-th eigenvector in a STL vector. - - vector* Vec; - - if (!VectorsOK) { - throw ArpackError(ArpackError::VECTORS_NOT_OK, "StlEigenvectorImag(i)"); - } - else if ((i>=ValSize())||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "StlEigenvectorImag(i)"); - } - if (EigValI[i] == (ARFLOAT)0.0) { // Real eigenvector. - try { - Vec = new vector(ValSize(), (ARFLOAT)0.0); - } - catch (ArpackError) { return NULL; } - return Vec; - } - else if (!ConjEigVec(i)) { // First eigenvector in a conjugate pair. - try { - Vec = new vector(&EigVec[(i+1)*n], &EigVec[(i+2)*n]); - } - catch (ArpackError) { return NULL; } - return Vec; - } - else { // Second eigenvector in a conjugate pair. - try { - Vec = new vector(&EigVec[i*n], &EigVec[(i+1)*n]); - } - catch (ArpackError) { return NULL; } - for (ARFLOAT* s = Vec->begin(); s != Vec->end(); s++) *s = -(*s); - return Vec; - } - -} // StlEigenvectorImag(i). - -#endif // STL_VECTOR_H. - - -template -inline ARrcNonSymStdEig:: -ARrcNonSymStdEig(int np, int nevp, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARrcNonSymStdEig:: -ARrcNonSymStdEig(int np, int nevp, ARFLOAT sigmap, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->ChangeShift(sigmap); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (shift and invert mode). - - -template -ARrcNonSymStdEig& ARrcNonSymStdEig:: -operator=(const ARrcNonSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARRSNSYM_H - diff --git a/src/external/arpack++/include/arrssym.h b/src/external/arpack++/include/arrssym.h deleted file mode 100644 index 1a38fdd1..00000000 --- a/src/external/arpack++/include/arrssym.h +++ /dev/null @@ -1,424 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARRSSym.h. - Arpack++ class ARrcSymStdEig definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARRSSYM_H -#define ARRSSYM_H - -#include -#include -#include "arch.h" -#include "arerror.h" -#include "debug.h" -#include "arrseig.h" -#include "saupp.h" -#include "seupp.h" - - -template -class ARrcSymStdEig: public virtual ARrcStdEig { - - protected: - - // a) Protected functions: - - // a.1) Memory control functions. - - void WorkspaceAllocate(); - // Allocates workspace for symmetric problems. - - - // a.2) Functions that handle original FORTRAN ARPACK code. - - void Aupp(); - // Interface to FORTRAN subroutines SSAUPD and DSAUPD. - - void Eupp(); - // Interface to FORTRAN subroutines SSEUPD and DSEUPD. - - - // a.3) Functions that check user defined parameters. - - std::string CheckWhich(const std::string& whichp); - // Determines if the value of variable "which" is valid. - - - public: - - // b) Public functions: - - // b.1) Trace functions. - - void Trace(const int digit = -5, const int getv0 = 0, const int aupd = 1, - const int aup2 = 0, const int aitr = 0, const int eigt = 0, - const int apps = 0, const int gets = 0, const int eupd = 0) - { - sTraceOn(digit, getv0, aupd, aup2, aitr, eigt, apps, gets, eupd); - } - // Turns on trace mode. - - - // b.2) Functions that permit step by step execution of ARPACK. - - ARFLOAT* PutVector(); - // When ido = -1, 1 or 2 and the user must perform a product in the form - // y <- M*x, this function indicates where to store y. When ido = 3, this - // function indicates where to store the shifts. - - - // b.3) Functions that perform all calculations in one step. - - int FindSchurVectors() { - throw ArpackError(ArpackError::SCHUR_UNDEFINED, "FindSchurVectors"); - return 0; // Only to avoid warning messages emitted by some compilers. - } - // For symmetric problems, Schur vectors are eigenvectors. - - int Eigenvalues(ARFLOAT* &EigValp, bool ivec = false, bool ischur = false); - // Overrides array EigValp with the eigenvalues of the problem. - // Also calculates eigenvectors and Schur vectors if requested. - - int EigenValVectors(ARFLOAT* &EigVecp, ARFLOAT* &EigValp, - bool ischur = false); - // Overrides array EigVecp sequentially with the eigenvectors of the - // given eigen-problem. Also stores the eigenvalues in EigValp. - // Calculates Schur vectors if requested. - - - // b.4) Functions that return elements of vectors and matrices. - - ARFLOAT Eigenvalue(int i); - // Provides i-eth eigenvalue. - - ARFLOAT Eigenvector(int i, int j); - // Provides element j of the i-eth eigenvector. - - - // b.5) Functions that use STL vector class. - -#ifdef STL_VECTOR_H - - vector* StlEigenvalues(bool ivec = false, bool ischur = false); - // Calculates the eigenvalues and stores them in a single STL vector. - // Also calculates eigenvectors and Schur vectors if requested. - - vector* StlEigenvector(int i); - // Returns the i-th eigenvector in a STL vector. - -#endif // #ifdef STL_VECTOR_H. - - - // b.6) Constructors and destructor. - - ARrcSymStdEig() { } - // Short constructor. - - ARrcSymStdEig(int np, int nevp, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, ARFLOAT* residp = NULL, - bool ishiftp = true); - // Long constructor (regular mode). - - ARrcSymStdEig(int np, int nevp, ARFLOAT sigmap, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARrcSymStdEig(const ARrcSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARrcSymStdEig() { } - // Destructor. - - // c) Operators. - - ARrcSymStdEig& operator=(const ARrcSymStdEig& other); - // Assignment operator. - -}; // class ARrcSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARrcSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARrcSymStdEig::WorkspaceAllocate() -{ - - this->lworkl = this->ncv*(this->ncv+9); - this->lworkv = 0; - this->lrwork = 0; - this->workl = new ARFLOAT[this->lworkl+1]; - -} // WorkspaceAllocate. - - -template -inline void ARrcSymStdEig::Aupp() -{ - - saupp(this->ido, this->bmat, this->n, this->which, this->nev, this->tol, this->resid, this->ncv, this->V, this->n, - this->iparam, this->ipntr, this->workd, this->workl, this->lworkl, this->info); - -} // Aupp. - - -template -inline void ARrcSymStdEig::Eupp() -{ - - seupp(this->rvec, this->HowMny, this->EigValR, this->EigVec, this->n, this->sigmaR, this->bmat, - this->n, this->which, this->nev, this->tol, this->resid, this->ncv, this->V, this->n, this->iparam, - this->ipntr, this->workd, this->workl, this->lworkl, this->info); - -} // Eupp. - - -template -std::string ARrcSymStdEig::CheckWhich(const std::string& whichp) -{ - - switch (whichp[0]) { - case 'B': // The options are: BE, ... - return "BE"; - case 'L': // LA, LM, ... - case 'S': // SA, SM. - switch (whichp[1]){ - case 'A': - case 'M': - return whichp; - } - default: - throw ArpackError(ArpackError::WHICH_UNDEFINED); - } - -} // CheckWhich. - - -template -ARFLOAT* ARrcSymStdEig::PutVector() -{ - - switch (this->ido) { - case -1: - case 1: // Returning OP*x. - case 2: - return &this->workd[this->ipntr[2]]; // Returning B*x. - case 3: - return &this->workl[this->ipntr[11]]; // Returning shifts. - default: - throw ArpackError(ArpackError::CANNOT_PUT_VECTOR, "PutVector"); - } - -} // PutVector. - - -template -int ARrcSymStdEig:: -Eigenvalues(ARFLOAT* &EigValp, bool ivec, bool ischur) -{ - - if (this->ValuesOK) { // Eigenvalues are available. - if (EigValp == NULL) { // Moving eigenvalues. - EigValp = this->EigValR; - this->EigValR = NULL; - this->newVal = false; - this->ValuesOK = false; - } - else { // Copying eigenvalues. - copy(this->nconv,this->EigValR,1,EigValp,1); - } - } - else { // Eigenvalues are not available. - if (this->newVal) { - delete[] this->EigValR; - this->newVal = false; - } - if (EigValp == NULL) { - try { EigValp = new ARFLOAT[this->ValSize()]; } - catch (ArpackError) { return 0; } - } - this->EigValR = EigValp; - if (ivec) { // Finding eigenvalues and eigenvectors. - this->nconv = this->FindEigenvectors(ischur); - } - else { // Finding eigenvalues only. - this->nconv = this->FindEigenvalues(); - } - this->EigValR = NULL; - } - return this->nconv; - -} // Eigenvalues(EigValp, ivec, ischur). - - -template -int ARrcSymStdEig:: -EigenValVectors(ARFLOAT* &EigVecp, ARFLOAT* &EigValp, bool ischur) -{ - - if (this->ValuesOK) { // Eigenvalues are already available . - this->nconv = Eigenvalues(EigValp, false); - this->nconv = this->Eigenvectors(EigVecp, ischur); - } - else { // Eigenvalues and vectors are not available. - try { - if (EigVecp == NULL) EigVecp = new ARFLOAT[this->ValSize()*this->n]; - if (EigValp == NULL) EigValp = new ARFLOAT[this->ValSize()]; - } - catch (ArpackError) { return 0; } - if (this->newVec) { - delete[] this->EigVec; - this->newVec = false; - } - if (this->newVal) { - delete[] this->EigValR; - this->newVal = false; - } - this->EigVec = EigVecp; - this->EigValR = EigValp; - this->nconv = this->FindEigenvectors(ischur); - this->EigVec = NULL; - this->EigValR = NULL; - } - return this->nconv; - -} // EigenValVectors(EigVecp, EigValp, ischur). - - -template -inline ARFLOAT ARrcSymStdEig::Eigenvalue(int i) -{ - - // Returning i-eth eigenvalue. - - if (!this->ValuesOK) { - throw ArpackError(ArpackError::VALUES_NOT_OK, "Eigenvalue(i)"); - } - else if ((i>=this->nconv)||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "Eigenvalue(i)"); - } - return this->EigValR[i]; - -} // Eigenvalue(i). - - -template -inline ARFLOAT ARrcSymStdEig::Eigenvector(int i, int j) -{ - - // Returning element j of i-eth eigenvector. - - if (!this->VectorsOK) { - throw ArpackError(ArpackError::VECTORS_NOT_OK, "Eigenvector(i,j)"); - } - else if ((i>=this->nconv)||(i<0)||(j>=this->n)||(j<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "Eigenvector(i,j)"); - } - return this->EigVec[i*this->n+j]; - -} // Eigenvector(i,j). - - -#ifdef STL_VECTOR_H - -template -inline vector* ARrcSymStdEig:: -StlEigenvalues(bool ivec, bool ischur) -{ - - // Returning the eigenvalues in a STL vector. - - vector* StlEigValR; - ARFLOAT* ValPtr; - - try { StlEigValR = new vector(ValSize()); } - catch (ArpackError) { return NULL; } - ValPtr = StlEigValR->begin(); - nconv = Eigenvalues(ValPtr, ivec, ischur); - return StlEigValR; - -} // StlEigenvalues. - - -template -inline vector* ARrcSymStdEig::StlEigenvector(int i) -{ - - // Returning the i-th eigenvector in a STL vector. - - vector* Vec; - - if (!VectorsOK) { - throw ArpackError(ArpackError::VECTORS_NOT_OK, "StlEigenvector(i)"); - } - else if ((i>=ValSize())||(i<0)) { - throw ArpackError(ArpackError::RANGE_ERROR, "StlEigenvector(i)"); - } - try { - Vec = new vector(&EigVec[i*n], &EigVec[(i+1)*n]); - } - catch (ArpackError) { return NULL; } - return Vec; - -} // StlEigenvector(i). - -#endif // #ifdef STL_VECTOR_H. - - -template -inline ARrcSymStdEig:: -ARrcSymStdEig(int np, int nevp, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARrcSymStdEig:: -ARrcSymStdEig(int np, int nevp, ARFLOAT sigmap, const std::string& whichp, - int ncvp, ARFLOAT tolp, int maxitp, ARFLOAT* residp, - bool ishiftp) - -{ - - this->ChangeShift(sigmap); - this->DefineParameters(np, nevp, whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (shift and invert mode). - - -template -ARrcSymStdEig& ARrcSymStdEig:: -operator=(const ARrcSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARRSSYM_H - diff --git a/src/external/arpack++/include/arscomp.h b/src/external/arpack++/include/arscomp.h deleted file mode 100644 index 709833d7..00000000 --- a/src/external/arpack++/include/arscomp.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARSComp.h. - Arpack++ class ARCompStdEig definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARSCOMP_H -#define ARSCOMP_H - -#include - -#include "arch.h" -#include "arseig.h" -#include "arrscomp.h" - -template -class ARCompStdEig: - virtual public ARStdEig, ARFOP>, - virtual public ARrcCompStdEig { - - public: - - // a) Constructors and destructor. - - ARCompStdEig() { } - // Short constructor. - - ARCompStdEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(arcomplex[],arcomplex[]), - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARCompStdEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(arcomplex[],arcomplex[]), - arcomplex sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARCompStdEig(const ARCompStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARCompStdEig() { } - // Destructor. - - // b) Operators. - - ARCompStdEig& operator=(const ARCompStdEig& other); - // Assignment operator. - -}; // class ARCompStdEig. - - -// ------------------------------------------------------------------------ // -// ARCompStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline ARCompStdEig:: -ARCompStdEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(arcomplex[],arcomplex[]), - const std::string& whichp, int ncvp, ARFLOAT tolp, int maxitp, - arcomplex* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(np, nevp, objOPp, MultOPxp, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARCompStdEig:: -ARCompStdEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(arcomplex[],arcomplex[]), - arcomplex sigmap, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, arcomplex* residp, - bool ishiftp) - -{ - - this->ChangeShift(sigmap); - this->DefineParameters(np, nevp, objOPp, MultOPxp, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (shift and invert mode). - - -template -ARCompStdEig& ARCompStdEig:: -operator=(const ARCompStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARSCOMP_H diff --git a/src/external/arpack++/include/arseig.h b/src/external/arpack++/include/arseig.h deleted file mode 100644 index edac9661..00000000 --- a/src/external/arpack++/include/arseig.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARSEig.h. - Arpack++ class ARStdEig definition. - This class is the base class for all - standard and generalized problem templates. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARSEIG_H -#define ARSEIG_H - -#include -#include "arch.h" -#include "arerror.h" -#include "arrseig.h" - -// ARStdEig class definition. - -template -class ARStdEig: virtual public ARrcStdEig { - - public: - - // a) Notation. - - typedef void (ARFOP::* TypeOPx)(ARTYPE[], ARTYPE[]); - - - protected: - - // b) User defined parameters. - - ARFOP *objOP; // Object that has MultOPx as a member function. - TypeOPx MultOPx; // Function that evaluates the product OP*x. - - // c) Protected functions. - - virtual void Copy(const ARStdEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // d) Public functions: - - // d.1) Function that stores user defined parameters. - - virtual void DefineParameters(int np, int nevp, ARFOP* objOPp, - TypeOPx MultOPxp, const std::string& whichp="LM", - int ncvp=0, ARFLOAT tolp=0.0, int maxitp=0, - ARTYPE* residp=NULL, bool ishiftp=true); - // Set values of problem parameters (also called by constructors). - // Redefined in ARGenEigenProblem. - - // d.2) Function that allow changes in problem parameters. - - void ChangeMultOPx(ARFOP* objOPp, TypeOPx MultOPxp); - // Changes the matrix-vector function that performs OP*x. - - virtual void SetRegularMode(ARFOP* objOPp, TypeOPx MultOPxp); - // Turns problem to regular mode. - - virtual void SetShiftInvertMode(ARTYPE sigmap, ARFOP* objOPp, - TypeOPx MultOPxp); - // Turns problem to shift and invert mode with shift defined by sigmap. - - // d.3) Function that permits step by step execution of ARPACK. - - virtual void Iterate() { - throw ArpackError(ArpackError::NOT_IMPLEMENTED, "Iterate"); - } - // Takes one iteration of IRA method. - - - // d.4) Function that performs all calculations in one step. - - virtual int FindArnoldiBasis(); - // Determines the Arnoldi basis related to the given problem. - // Redefined in ARGenEigenProblem and ARSymGenEigenProblem. - - - // d.5) Constructor and destructor. - - ARStdEig() { } - // Constructor that does nothing but calling base class constructor. - - ARStdEig(const ARStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARStdEig() { } - // Very simple destructor. - - // e) Operators. - - ARStdEig& operator=(const ARStdEig& other); - // Assignment operator. - -}; // class ARStdEig. - - -// ------------------------------------------------------------------------ // -// ARStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARStdEig:: -Copy(const ARStdEig& other) -{ - - ARrcStdEig::Copy(other); - objOP = other.objOP; - MultOPx = other.MultOPx; - -} // Copy. - - -template -void ARStdEig:: -DefineParameters(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARTYPE[], ARTYPE[]), const std::string& whichp, - int ncvp, ARFLOAT tolp, int maxitp, ARTYPE* residp, - bool ishiftp) - - -{ - - ARrcStdEig::DefineParameters(np, nevp, whichp, ncvp, tolp, - maxitp, residp, ishiftp); - objOP = objOPp; - MultOPx = MultOPxp; - -} // DefineParameters. - - -template -inline void ARStdEig:: -ChangeMultOPx(ARFOP* objOPp, void (ARFOP::* MultOPxp)(ARTYPE[], ARTYPE[])) -{ - - objOP = objOPp; - MultOPx = MultOPxp; - this->Restart(); - -} // ChangeMultOPx. - - -template -inline void ARStdEig:: -SetRegularMode(ARFOP* objOPp, void (ARFOP::* MultOPxp)(ARTYPE[], ARTYPE[])) -{ - - ChangeMultOPx(objOPp, MultOPxp); - this->NoShift(); - -} // SetRegularMode. - - -template -inline void ARStdEig:: -SetShiftInvertMode(ARTYPE sigmap, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARTYPE[], ARTYPE[])) -{ - - ChangeMultOPx(objOPp, MultOPxp); - this->ChangeShift(sigmap); - -} // SetShiftInvertMode. - - -template -int ARStdEig::FindArnoldiBasis() -{ - - if (!this->BasisOK) this->Restart(); - - // Changing to auto shift mode. - - if (!this->AutoShift) { - ArpackError::Set(ArpackError::CHANGING_AUTOSHIFT, "FindArnoldiBasis"); - this->AutoShift=true; - } - - // ARPACK main loop. - - while (!this->BasisOK) { - - // Calling Aupp. - - try { this->TakeStep(); } - catch (ArpackError) { - ArpackError(ArpackError::CANNOT_FIND_BASIS, "FindArnoldiBasis"); - return 0; - } - - if ((this->ido == -1) || (this->ido == 1)) { - - // Performing Matrix vector multiplication: y <- OP*x. - - (objOP->*MultOPx)(&this->workd[this->ipntr[1]],&this->workd[this->ipntr[2]]); - - } - - } - return this->nconv; - -} // FindArnoldiBasis. - - -template -ARStdEig& ARStdEig:: -operator=(const ARStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARSEIG_H - diff --git a/src/external/arpack++/include/arsnsym.h b/src/external/arpack++/include/arsnsym.h deleted file mode 100644 index 4bb9d512..00000000 --- a/src/external/arpack++/include/arsnsym.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARSNSym.h. - Arpack++ class ARNonSymStdEig definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARSNSYM_H -#define ARSNSYM_H - -#include -#include -#include "arch.h" -#include "arseig.h" -#include "arrsnsym.h" - - -template -class ARNonSymStdEig: - public virtual ARStdEig, - public virtual ARrcNonSymStdEig { - - public: - - // a) Constructors and destructor. - - ARNonSymStdEig() { } - // Short constructor. - - ARNonSymStdEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - const std::string& whichp = "LM", int ncvp = 0, ARFLOAT tolp = 0.0, - int maxitp = 0, ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARNonSymStdEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFLOAT sigma, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, ARFLOAT* residp = NULL, - bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARNonSymStdEig(const ARNonSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARNonSymStdEig() { } - // Destructor. - - // b) Operators. - - ARNonSymStdEig& operator=(const ARNonSymStdEig& other); - // Assignment operator. - -}; // class ARNonSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARNonSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline ARNonSymStdEig:: -ARNonSymStdEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - const std::string& whichp, int ncvp, ARFLOAT tolp, int maxitp, - ARFLOAT* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(np, nevp, objOPp, MultOPxp, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARNonSymStdEig:: -ARNonSymStdEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->ChangeShift(sigmap); - this->DefineParameters(np, nevp, objOPp, MultOPxp, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (shift and invert mode). - - -template -ARNonSymStdEig& ARNonSymStdEig:: -operator=(const ARNonSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARSNSYM_H diff --git a/src/external/arpack++/include/arssym.h b/src/external/arpack++/include/arssym.h deleted file mode 100644 index 41c46e8c..00000000 --- a/src/external/arpack++/include/arssym.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARSSym.h. - Arpack++ class ARSymStdEig definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARSSYM_H -#define ARSSYM_H - -#include -#include -#include "arch.h" -#include "arseig.h" -#include "arrssym.h" - - -template -class ARSymStdEig: - public virtual ARStdEig, - public virtual ARrcSymStdEig { - - public: - - // a) Constructors and destructor. - - ARSymStdEig() { } - // Short constructor. - - ARSymStdEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - const std::string& whichp = "LM", int ncvp = 0, ARFLOAT tolp = 0.0, - int maxitp = 0, ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARSymStdEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFLOAT sigmap, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, ARFLOAT* residp = NULL, - bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARSymStdEig(const ARSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARSymStdEig() { } - // Destructor. - - // b) Operators. - - ARSymStdEig& operator=(const ARSymStdEig& other); - // Assignment operator. - -}; // class ARSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline ARSymStdEig:: -ARSymStdEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->NoShift(); - this->DefineParameters(np, nevp, objOPp, MultOPxp, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARSymStdEig:: -ARSymStdEig(int np, int nevp, ARFOP* objOPp, - void (ARFOP::* MultOPxp)(ARFLOAT[], ARFLOAT[]), - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->ChangeShift(sigmap); - this->DefineParameters(np, nevp, objOPp, MultOPxp, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (shift and invert mode). - - -template -ARSymStdEig& ARSymStdEig:: -operator=(const ARSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARSSYM_H - diff --git a/src/external/arpack++/include/arugcomp.h b/src/external/arpack++/include/arugcomp.h deleted file mode 100644 index 7f34ca0d..00000000 --- a/src/external/arpack++/include/arugcomp.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARUGComp.h. - Arpack++ class ARluCompGenEig definition - (umfpack version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARUGCOMP_H -#define ARUGCOMP_H - -#include -#include -#include "arch.h" -#include "arunsmat.h" -#include "arunspen.h" -#include "arrseig.h" -#include "argcomp.h" - - -template -class ARluCompGenEig: - public virtual - ARCompGenEig, ARFLOAT >, - ARumNonSymPencil, ARFLOAT > > { - - private: - - // a) Data structure used to store matrices. - - ARumNonSymPencil, ARFLOAT > Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluCompGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(arcomplex sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(arcomplex sigmap); - - // c.2) Constructors and destructor. - - ARluCompGenEig() { } - // Short constructor. - - ARluCompGenEig(int nevp, ARumNonSymMatrix, ARFLOAT>& A, - ARumNonSymMatrix, ARFLOAT>& B, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluCompGenEig(int nevp, ARumNonSymMatrix, ARFLOAT>& A, - ARumNonSymMatrix, ARFLOAT>& B, - arcomplex sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluCompGenEig(const ARluCompGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluCompGenEig() { } - - // d) Operators. - - ARluCompGenEig& operator=(const ARluCompGenEig& other); - // Assignment operator. - -}; // class ARluCompGenEig. - - -// ------------------------------------------------------------------------ // -// ARluCompGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluCompGenEig:: -Copy(const ARluCompGenEig& other) -{ - - ARCompGenEig, ARFLOAT >, - ARumNonSymPencil, ARFLOAT> >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - -} // Copy. - - -template -inline void ARluCompGenEig:: -ChangeShift(arcomplex sigmaRp) -{ - - this->objOP->FactorAsB(sigmaRp); - ARrcStdEig >::ChangeShift(sigmaRp); - -} // ChangeShift. - - -template -inline void ARluCompGenEig::SetRegularMode() -{ - - ARStdEig, - ARumNonSymPencil, ARFLOAT> >:: - SetRegularMode(&Pencil, - &ARumNonSymPencil, ARFLOAT>::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluCompGenEig:: -SetShiftInvertMode(arcomplex sigmap) -{ - - ARCompGenEig, ARFLOAT>, - ARumNonSymPencil, ARFLOAT> >:: - SetShiftInvertMode(sigmap, &Pencil, - &ARumNonSymPencil,ARFLOAT>::MultInvAsBv); - -} // SetShiftInvertMode. - - -template -inline ARluCompGenEig:: -ARluCompGenEig(int nevp, ARumNonSymMatrix, ARFLOAT>& A, - ARumNonSymMatrix, ARFLOAT>& B, const std::string& whichp, - int ncvp, ARFLOAT tolp, int maxitp, - arcomplex* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->NoShift(); - DefineParameters(A.ncols(), nevp, &Pencil, - &ARumNonSymPencil, ARFLOAT>::MultInvBAv, - &Pencil, - &ARumNonSymPencil, ARFLOAT>::MultBv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluCompGenEig:: -ARluCompGenEig(int nevp, ARumNonSymMatrix, ARFLOAT>& A, - ARumNonSymMatrix, ARFLOAT>& B, - arcomplex sigmap, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, arcomplex* residp, - bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - DefineParameters(A.ncols(), nevp, &Pencil, - &ARumNonSymPencil, ARFLOAT>::MultInvAsBv, - &Pencil, - &ARumNonSymPencil, ARFLOAT>::MultBv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - SetShiftInvertMode(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluCompGenEig& ARluCompGenEig:: -operator=(const ARluCompGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUGCOMP_H diff --git a/src/external/arpack++/include/arugnsym.h b/src/external/arpack++/include/arugnsym.h deleted file mode 100644 index 3061e68b..00000000 --- a/src/external/arpack++/include/arugnsym.h +++ /dev/null @@ -1,245 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARUGNSym.h. - Arpack++ class ARluNonSymGenEig definition - (umfpack version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARUGNSYM_H -#define ARUGNSYM_H - -#include -#include -#include "arch.h" -#include "arunsmat.h" -#include "arunspen.h" -#include "argnsym.h" - - -template -class ARluNonSymGenEig: - public virtual ARNonSymGenEig, - ARumNonSymPencil > { - - protected: - - // a) Data structure used to store matrices. - - ARumNonSymPencil Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluNonSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp = 0.0); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - virtual void SetComplexShiftMode(char partp, ARFLOAT sigmaRp, - ARFLOAT sigmaIp); - - // c.2) Constructors and destructor. - - ARluNonSymGenEig() { } - // Short constructor. - - ARluNonSymGenEig(int nevp, ARumNonSymMatrix& A, - ARumNonSymMatrix& B, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluNonSymGenEig(int nevp, ARumNonSymMatrix& A, - ARumNonSymMatrix& B, ARFLOAT sigma, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (real shift and invert mode). - - ARluNonSymGenEig(int nevp, ARumNonSymMatrix& A, - ARumNonSymMatrix& B, char partp, - ARFLOAT sigmaRp, ARFLOAT sigmaIp, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (complex shift and invert mode). - - ARluNonSymGenEig(const ARluNonSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluNonSymGenEig() { } - // Destructor. - - // d) Operators. - - ARluNonSymGenEig& operator=(const ARluNonSymGenEig& other); - // Assignment operator. - -}; // class ARluNonSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARluNonSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluNonSymGenEig:: -Copy(const ARluNonSymGenEig& other) -{ - - ARNonSymGenEig, - ARumNonSymPencil >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - this->objA = &Pencil; - -} // Copy. - - -template -inline void ARluNonSymGenEig:: -ChangeShift(ARFLOAT sigmaRp, ARFLOAT sigmaIp) -{ - - if (sigmaIp == 0.0) { - this->objOP->FactorAsB(sigmaRp); - } - else { - this->objOP->FactorAsB(sigmaRp, sigmaIp, this->part); - } - ARrcNonSymGenEig::ChangeShift(sigmaRp, sigmaIp); - -} // ChangeShift. - - -template -inline void ARluNonSymGenEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(&Pencil, &ARumNonSymPencil::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluNonSymGenEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARNonSymGenEig, - ARumNonSymPencil >:: - SetShiftInvertMode(sigmap, &Pencil, - &ARumNonSymPencil::MultInvAsBv); - -} // SetShiftInvertMode. - - -template -inline void ARluNonSymGenEig:: -SetComplexShiftMode(char partp, ARFLOAT sigmaRp, ARFLOAT sigmaIp) -{ - - ARNonSymGenEig, - ARumNonSymPencil >:: - SetComplexShiftMode(partp, sigmaRp, sigmaIp, &Pencil, - &ARumNonSymPencil::MultInvAsBv, - &Pencil, &ARumNonSymPencil::MultAv); - -} // SetComplexShiftMode. - - -template -inline ARluNonSymGenEig:: -ARluNonSymGenEig(int nevp, ARumNonSymMatrix& A, - ARumNonSymMatrix& B, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->NoShift(); - DefineParameters(A.ncols(), nevp, &Pencil, - &ARumNonSymPencil::MultInvBAv, &Pencil, - &ARumNonSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluNonSymGenEig:: -ARluNonSymGenEig(int nevp, ARumNonSymMatrix& A, - ARumNonSymMatrix& B, ARFLOAT sigmap, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - DefineParameters(A.ncols(), nevp, &Pencil, - &ARumNonSymPencil::MultInvAsBv, &Pencil, - &ARumNonSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - SetShiftInvertMode(sigmap); - -} // Long constructor (real shift and invert mode). - - -template -inline ARluNonSymGenEig:: -ARluNonSymGenEig(int nevp, ARumNonSymMatrix& A, - ARumNonSymMatrix& B, - char partp, ARFLOAT sigmaRp, - ARFLOAT sigmaIp, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - DefineParameters(A.ncols(), nevp, &Pencil, - &ARumNonSymPencil::MultInvAsBv, &Pencil, - &ARumNonSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - SetComplexShiftMode(partp, sigmaRp, sigmaIp); - -} // Long constructor (complex shift and invert mode). - - -template -ARluNonSymGenEig& ARluNonSymGenEig:: -operator=(const ARluNonSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUGNSYM_H diff --git a/src/external/arpack++/include/arugsym.h b/src/external/arpack++/include/arugsym.h deleted file mode 100644 index d57dc451..00000000 --- a/src/external/arpack++/include/arugsym.h +++ /dev/null @@ -1,234 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARUGSym.h. - Arpack++ class ARluSymGenEig definition - (UMFPACK version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Kristi Maschhoff - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARUGSYM_H -#define ARUGSYM_H - -#include -#include -#include "arch.h" -#include "arusmat.h" -#include "aruspen.h" -#include "argsym.h" - - -template -class ARluSymGenEig: - public virtual ARSymGenEig, - ARumSymPencil > { - - private: - - // a) Data structure used to store matrices. - - ARumSymPencil Pencil; - - // b) Protected functions: - - virtual void Copy(const ARluSymGenEig& other); - // Makes a deep copy of "other" over "this" object. - // Old values are not deleted (this function is to be used - // by the copy constructor and the assignment operator only). - - - public: - - // c) Public functions: - - // c.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmap); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - virtual void SetBucklingMode(ARFLOAT sigmap); - - virtual void SetCayleyMode(ARFLOAT sigmap); - - // c.2) Constructors and destructor. - - ARluSymGenEig() { } - // Short constructor. - - ARluSymGenEig(int nevp, ARumSymMatrix& A, - ARumSymMatrix& B, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluSymGenEig(char InvertModep, int nevp, ARumSymMatrix& A, - ARumSymMatrix& B, ARFLOAT sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert, buckling and Cayley modes). - - ARluSymGenEig(const ARluSymGenEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluSymGenEig() { } - // Destructor. - - // d) Operators. - - ARluSymGenEig& operator=(const ARluSymGenEig& other); - // Assignment operator. - -}; // class ARluSymGenEig. - - -// ------------------------------------------------------------------------ // -// ARluSymGenEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluSymGenEig:: -Copy(const ARluSymGenEig& other) -{ - - ARSymGenEig, - ARumSymPencil >:: Copy(other); - Pencil = other.Pencil; - this->objOP = &Pencil; - this->objB = &Pencil; - this->objA = &Pencil; - -} // Copy. - - -template -inline void ARluSymGenEig::ChangeShift(ARFLOAT sigmap) -{ - - this->objOP->FactorAsB(sigmap); - ARrcSymGenEig::ChangeShift(sigmap); - -} // ChangeShift. - - -template -inline void ARluSymGenEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(&Pencil, &ARumSymPencil::MultInvBAv); - -} // SetRegularMode. - - -template -inline void ARluSymGenEig:: -SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARumSymPencil >:: - SetShiftInvertMode(sigmap, &Pencil, &ARumSymPencil::MultInvAsBv); - this->ChangeMultBx(&Pencil, &ARumSymPencil::MultBv); - -} // SetShiftInvertMode. - - -template -inline void ARluSymGenEig:: -SetBucklingMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARumSymPencil >:: - SetBucklingMode(sigmap, &Pencil, &ARumSymPencil::MultInvAsBv); - this->ChangeMultBx(&Pencil, &ARumSymPencil::MultAv); - -} // SetBucklingMode. - - -template -inline void ARluSymGenEig:: -SetCayleyMode(ARFLOAT sigmap) -{ - - ARSymGenEig, ARumSymPencil >:: - SetCayleyMode(sigmap, &Pencil, &ARumSymPencil::MultInvAsBv, - &Pencil, &ARumSymPencil::MultAv); - this->ChangeMultBx(&Pencil, &ARumSymPencil::MultBv); - -} // SetCayleyMode. - - -template -inline ARluSymGenEig:: -ARluSymGenEig(int nevp, ARumSymMatrix& A, - ARumSymMatrix& B, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->InvertMode = 'S'; - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARumSymPencil::MultInvBAv, &Pencil, - &ARumSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluSymGenEig:: -ARluSymGenEig(char InvertModep, int nevp, ARumSymMatrix& A, - ARumSymMatrix& B, ARFLOAT sigmap, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - Pencil.DefineMatrices(A, B); - this->DefineParameters(A.ncols(), nevp, &Pencil, - &ARumSymPencil::MultInvAsBv, &Pencil, - &ARumSymPencil::MultBv, whichp, - ncvp, tolp, maxitp, residp, ishiftp); - this->InvertMode = this->CheckInvertMode(InvertModep); - switch (this->InvertMode) { - case 'B': // Buckling mode. - this->ChangeMultBx(&Pencil, &ARumSymPencil::MultAv); - case 'S': // Shift and invert mode. - this->ChangeShift(sigmap); - break; - case 'C': // Cayley mode. - this->SetCayleyMode(sigmap); - } - -} // Long constructor (shift and invert, buckling and Cayley modes). - - -template -ARluSymGenEig& ARluSymGenEig:: -operator=(const ARluSymGenEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUGSYM_H diff --git a/src/external/arpack++/include/arunsmat.h b/src/external/arpack++/include/arunsmat.h deleted file mode 100644 index 801b02e3..00000000 --- a/src/external/arpack++/include/arunsmat.h +++ /dev/null @@ -1,646 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARUNSMat.h. - Arpack++ class ARumNonSymMatrix definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - - -#include "arunspen.h" - -#ifndef ARUNSMAT_H -#define ARUNSMAT_H - -#include -#include -#include "arch.h" -#include "armat.h" -#include "arhbmat.h" -#include "arerror.h" -#include "blas1c.h" -#include "umfpackc.h" - -template class ARumNonSymPencil; - -template -class ARumNonSymMatrix: public ARMatrix { - - friend class ARumNonSymPencil; - friend class ARumNonSymPencil; - - protected: - - bool factored; - int fillin; - int nnz; - int lvalue; - int lindex; - int keep[20]; - int icntl[20]; - int info[40]; - int* irow; - int* pcol; - int* index; - double threshold; - ARTYPE cntl[10]; - ARTYPE rinfo[20]; - ARTYPE* a; - ARTYPE* value; - ARhbMatrix mat; - - bool DataOK(); - - void ClearMem(); - - virtual void Copy(const ARumNonSymMatrix& other); - - void SubtractAsI(ARTYPE sigma); - - void CreateStructure(); - - void ThrowError(); - - public: - - int nzeros() { return nnz; } - - int FillFact() { return fillin; } - - bool IsSymmetric() { return bool(icntl[5]); } - - bool IsFactored() { return factored; } - - void FactorA(); - - void FactorAsI(ARTYPE sigma); - - void MultMv(ARTYPE* v, ARTYPE* w); - - void MultMtv(ARTYPE* v, ARTYPE* w); - - void MultMtMv(ARTYPE* v, ARTYPE* w); - - void MultMMtv(ARTYPE* v, ARTYPE* w); - - void Mult0MMt0v(ARTYPE* v, ARTYPE* w); - - void MultInvv(ARTYPE* v, ARTYPE* w); - - void DefineMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, double thresholdp = 0.1, - int fillinp = 9, bool simest = false, - bool reducible = true, bool check = true); // Square. - - void DefineMatrix(int mp, int np, int nnzp, ARTYPE* ap, - int* irowp, int* pcolp); // Rectangular. - - ARumNonSymMatrix(): ARMatrix() { factored = false; } - // Short constructor that does nothing. - - ARumNonSymMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, double thresholdp = 0.1, - int fillinp = 9, bool simest = false, - bool reducible = true, bool check = true); - // Long constructor (square matrix). - - ARumNonSymMatrix(int mp, int np, int nnzp, ARTYPE* ap, - int* irowp, int* pcolp); - // Long constructor (rectangular matrix). - - ARumNonSymMatrix(const std::string& name, double thresholdp = 0.1, - int fillinp = 9, bool simest = false, - bool reducible = true, bool check = true); - // Long constructor (Harwell-Boeing file). - - ARumNonSymMatrix(const ARumNonSymMatrix& other) { Copy(other); } - // Copy constructor. - - virtual ~ARumNonSymMatrix() { ClearMem(); } - // Destructor. - - ARumNonSymMatrix& operator=(const ARumNonSymMatrix& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARumNonSymMatrix member functions definition. // -// ------------------------------------------------------------------------ // - - -template -bool ARumNonSymMatrix::DataOK() -{ - - int i, j, k; - - // Checking if pcol is in ascending order. - - i = 0; - while ((i!=this->n)&&(pcol[i]<=pcol[i+1])) i++; - if (i!=this->n) return false; - - // Checking if irow components are in order and within bounds. - - for (i=0; i!=this->n; i++) { - j = pcol[i]; - k = pcol[i+1]-1; - if (j<=k) { - if ((irow[j]<0)||(irow[k]>=this->n)) return false; - while ((j!=k)&&(irow[j] -inline void ARumNonSymMatrix::ClearMem() -{ - - if (factored) { - delete[] value; - delete[] index; - value = NULL; - index = NULL; - } - -} // ClearMem. - - -template -inline void ARumNonSymMatrix:: -Copy(const ARumNonSymMatrix& other) -{ - - // Local variable. - - int i; - - // Copying very fundamental variables and user-defined parameters. - - this->m = other.m; - this->n = other.n; - this->defined = other.defined; - factored = other.factored; - fillin = other.fillin; - nnz = other.nnz; - lvalue = other.lvalue; - lindex = other.lindex; - irow = other.irow; - pcol = other.pcol; - a = other.a; - threshold = other.threshold; - - // Returning from here if "other" was not initialized. - - if (!this->defined) return; - - // Copying arrays with static dimension. - - for (i=0; i<20; i++) keep[i] = other.keep[i]; - for (i=0; i<20; i++) icntl[i] = other.icntl[i]; - for (i=0; i<40; i++) info[i] = other.info[i]; - for (i=0; i<10; i++) cntl[i] = other.cntl[i]; - for (i=0; i<20; i++) rinfo[i] = other.rinfo[i]; - - // Returning from here if "other" was not factored. - - if (!factored) return; - - value = new ARTYPE[lvalue]; - index = new int[lindex]; - - for (i=0; i -void ARumNonSymMatrix::SubtractAsI(ARTYPE sigma) -{ - - int i, j, k, ki, end; - - // Subtracting sigma from diagonal elements. - - k = 0; - ki = this->n+1; - index[0] = 1; - - for (i=0; i!=this->n; i++) { - - j = pcol[i]; - end = pcol[i+1]; - - // Copying superdiagonal elements of column i. - - while ((irow[j] < i)&&(j < end)) { - value[k++] = a[j]; - index[ki++] = irow[j++]+1; - } - - // Verifying if A(i,i) exists. - - if ((irow[j] == i)&&(j < end)) { // A(i,i) exists, subtracting sigma. - value[k++] = a[j++] - sigma; - } - else { // A(i,i) does not exist. - value[k++] = -sigma; - } - index[ki++] = i+1; - - // Copying subdiagonal elements of column i. - - while (j < end ) { - value[k++] = a[j]; - index[ki++] = irow[j++]+1; - } - - index[i+1] = k+1; - - } - -} // SubtractAsI. - - -template -inline void ARumNonSymMatrix::CreateStructure() -{ - - int dimfact = (((fillin+1)*nnz)<(this->n*this->n)) ? (fillin+1)*nnz : this->n*this->n; - - this->ClearMem(); - - lindex = 30*this->n+dimfact; // ????? - lvalue = dimfact; - - value = new ARTYPE[lvalue]; - index = new int[lindex]; - -} // CreateStructure. - - -template -inline void ARumNonSymMatrix::ThrowError() -{ - - if (info[0] < -2) { // Memory is not suficient. - throw ArpackError(ArpackError::INSUFICIENT_MEMORY, - "ARumNonSymMatrix::FactorA"); - } - else if (info[0] > 3) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARumNonSymMatrix::FactorA"); - } - else if (info[0] != 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARumNonSymMatrix::FactorA"); - } - -} // ThrowError. - - -template -void ARumNonSymMatrix::FactorA() -{ - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED,"ARumNonSymMatrix::FactorA"); - } - - // Quitting the function if A is not square. - - if (this->m != this->n) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARumNonSymMatrix::FactorA"); - } - - // Defining local variables. - - int i; - int *pi, *pj; - - // Reserving memory for some vectors used in matrix decomposition. - - CreateStructure(); - - // Copying A to (value, index); - - copy(nnz, a, 1, value, 1); - pi=pcol; - pj=index; - for (i=0; i<=this->n; i++) *pj++ = (*pi++)+1; - pi=irow; - for (i=0; in, nnz, 0, false, lvalue, lindex, value, - index, keep, cntl, icntl, info, rinfo); - - // Handling errors. - - ThrowError(); - - factored = true; - -} // FactorA. - - -template -void ARumNonSymMatrix::FactorAsI(ARTYPE sigma) -{ - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARumNonSymMatrix::FactorAsI"); - } - - // Quitting the function if A is not square. - - if (this->m != this->n) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARumNonSymMatrix::FactorAsI"); - } - - // Reserving memory for some vectors used in matrix decomposition. - - CreateStructure(); - - // Subtracting sigma*I from A. - - SubtractAsI(sigma); - - // Decomposing AsI. - - um2fa(this->n, nnz, 0, false, lvalue, lindex, value, - index, keep, cntl, icntl, info, rinfo); - - // Handling errors. - - ThrowError(); - - factored = true; - -} // FactorAsI. - - -template -void ARumNonSymMatrix::MultMv(ARTYPE* v, ARTYPE* w) -{ - - int i,j; - ARTYPE t; - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARumNonSymMatrix::MultMv"); - } - - // Determining w = M.v. - - for (i=0; i!=this->m; i++) w[i]=(ARTYPE)0; - - for (i=0; i!=this->n; i++) { - t = v[i]; - for (j=pcol[i]; j!=pcol[i+1]; j++) { - w[irow[j]] += t*a[j]; - } - } - -} // MultMv. - - -template -void ARumNonSymMatrix::MultMtv(ARTYPE* v, ARTYPE* w) -{ - - int i,j; - ARTYPE t; - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED,"ARumNonSymMatrix::MultMtv"); - } - - // Determining w = M'.v. - - for (i=0; i!=this->n; i++) { - t = (ARTYPE)0; - for (j=pcol[i]; j!=pcol[i+1]; j++) { - t += v[irow[j]]*a[j]; - } - w[i] = t; - } - -} // MultMtv. - - -template -void ARumNonSymMatrix::MultMtMv(ARTYPE* v, ARTYPE* w) -{ - - ARTYPE* t = new ARTYPE[this->m]; - - MultMv(v,t); - MultMtv(t,w); - - delete[] t; - -} // MultMtMv. - - -template -void ARumNonSymMatrix::MultMMtv(ARTYPE* v, ARTYPE* w) -{ - - ARTYPE* t = new ARTYPE[this->n]; - - MultMtv(v,t); - MultMv(t,w); - - delete[] t; - -} // MultMMtv. - - -template -void ARumNonSymMatrix::Mult0MMt0v(ARTYPE* v, ARTYPE* w) -{ - - MultMv(&v[this->m],w); - MultMtv(v,&w[this->m]); - -} // Mult0MMt0v. - - -template -void ARumNonSymMatrix::MultInvv(ARTYPE* v, ARTYPE* w) -{ - - // Quitting the function if A (or AsI) was not factored. - - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARumNonSymMatrix::MultInvv"); - } - - // Solving A.w = v (or AsI.w = v). - - ARTYPE* space = new ARTYPE[2*this->n]; - - um2so(this->n, 0, false, lvalue, lindex, value, index, - keep, v, w, space, cntl, icntl, info, rinfo); - - delete[] space; - -} // MultInvv. - - -template -inline void ARumNonSymMatrix:: -DefineMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, double thresholdp, int fillinp, - bool simest, bool reducible, bool check) -{ - - // Defining member variables. - - this->m = np; - this->n = np; - nnz = nnzp; - a = ap; - irow = irowp; - pcol = pcolp; - pcol[this->n] = nnz; - fillin = (fillinp>2) ? fillinp : 2; - threshold = thresholdp; - value = NULL; - index = NULL; - - // Preparing umfpack. - - um21i(keep, cntl, icntl, threshold, simest, reducible); - - // Checking data. - - if ((check)&&(!DataOK())) { - throw ArpackError(ArpackError::INCONSISTENT_DATA, - "ARumNonSymMatrix::DefineMatrix"); - } - else { - this->defined = true; - } - -} // DefineMatrix (square). - - -template -inline void ARumNonSymMatrix:: -DefineMatrix(int mp, int np, int nnzp, ARTYPE* ap, int* irowp, int* pcolp) -{ - - // Defining member variables. - - this->m = mp; - this->n = np; - nnz = nnzp; - a = ap; - irow = irowp; - pcol = pcolp; - pcol[this->n] = nnz; - fillin = 0; - this->defined = true; - -} // DefineMatrix (rectangular). - - -template -inline ARumNonSymMatrix:: -ARumNonSymMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, double thresholdp, int fillinp, - bool simest, bool reducible, bool check): ARMatrix(np) -{ - - factored = false; - DefineMatrix(np, nnzp, ap, irowp, pcolp, thresholdp, - fillinp, simest, reducible, check); - -} // Long constructor (square matrix). - - -template -inline ARumNonSymMatrix:: -ARumNonSymMatrix(int mp, int np, int nnzp, ARTYPE* ap, - int* irowp, int* pcolp) : ARMatrix(mp, np) -{ - - factored = false; - DefineMatrix(mp, np, nnzp, ap, irowp, pcolp); - -} // Long constructor (rectangular matrix). - - -template -ARumNonSymMatrix:: -ARumNonSymMatrix(const std::string& name, double thresholdp, int fillinp, - bool simest, bool reducible, bool check) -{ - - factored = false; - - try { - mat.Define(name); - } - catch (ArpackError) { // Returning from here if an error has occurred. - throw ArpackError(ArpackError::CANNOT_READ_FILE, "ARumNonSymMatrix"); - } - - if (mat.NCols()==mat.NRows()) { - DefineMatrix(mat.NCols(), mat.NonZeros(), (ARTYPE*)mat.Entries(), - mat.RowInd(), mat.ColPtr(), thresholdp, - fillinp, simest, reducible, check); - } - else { - DefineMatrix(mat.NRows(), mat.NCols(), mat.NonZeros(), - (ARTYPE*)mat.Entries(), mat.RowInd(), mat.ColPtr()); - } - -} // Long constructor (Harwell-Boeing file). - - -template -ARumNonSymMatrix& ARumNonSymMatrix:: -operator=(const ARumNonSymMatrix& other) -{ - - if (this != &other) { // Stroustrup suggestion. - ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUNSMAT_H diff --git a/src/external/arpack++/include/arunspen.h b/src/external/arpack++/include/arunspen.h deleted file mode 100644 index 771b3746..00000000 --- a/src/external/arpack++/include/arunspen.h +++ /dev/null @@ -1,527 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARUNSPen.h. - Arpack++ class ARumNonSymPencil definition. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARUNSPEN_H -#define ARUNSPEN_H - -#include "arch.h" -#include "arerror.h" -#include "blas1c.h" -#include "umfpackc.h" -#include "arunsmat.h" - - -template -class ARumNonSymPencil -{ - - protected: - - char part; - ARumNonSymMatrix* A; - ARumNonSymMatrix* B; - ARumNonSymMatrix AsB; -#ifdef ARCOMP_H - ARumNonSymMatrix, ARFLOAT> AsBc; -#endif - - virtual void Copy(const ARumNonSymPencil& other); - - void SparseSaxpy(ARTYPE a, ARTYPE x[], int xind[], int nx, ARTYPE y[], - int yind[], int ny, ARTYPE z[], int zind[], int& nz); - -#ifdef ARCOMP_H - void SparseSaxpy(arcomplex a, ARFLOAT x[], int xind[], int nx, - ARFLOAT y[], int yind[], int ny, - arcomplex z[], int zind[], int& nz); -#endif - - void SubtractAsB(ARTYPE sigma); - -#ifdef ARCOMP_H - void SubtractAsB(ARFLOAT sigmaR, ARFLOAT sigmaI); -#endif - - public: - -#ifdef ARCOMP_H - bool IsFactored() { return (AsB.IsFactored()||AsBc.IsFactored()); } -#else - bool IsFactored() { return AsB.IsFactored(); } -#endif - - bool IsSymmetric() { return AsB.IsSymmetric(); } - - void FactorAsB(ARTYPE sigma); - -#ifdef ARCOMP_H - void FactorAsB(ARFLOAT sigmaR, ARFLOAT sigmaI, char partp = 'R'); -#endif - - void MultAv(ARTYPE* v, ARTYPE* w) { A->MultMv(v,w); } - - void MultBv(ARTYPE* v, ARTYPE* w) { B->MultMv(v,w); } - - void MultInvBAv(ARTYPE* v, ARTYPE* w); - -#ifdef ARCOMP_H - void MultInvAsBv(arcomplex* v, arcomplex* w); -#endif - - void MultInvAsBv(ARFLOAT* v, ARFLOAT* w); - - void DefineMatrices(ARumNonSymMatrix& Ap, - ARumNonSymMatrix& Bp); - - ARumNonSymPencil() { part = 'N'; } - // Short constructor that does nothing. - - ARumNonSymPencil(ARumNonSymMatrix& Ap, - ARumNonSymMatrix& Bp); - // Long constructor. - - ARumNonSymPencil(const ARumNonSymPencil& other) { Copy(other); } - // Copy constructor. - - virtual ~ARumNonSymPencil() { } - // Destructor. - - ARumNonSymPencil& operator=(const ARumNonSymPencil& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARumNonSymPencil member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARumNonSymPencil:: -Copy(const ARumNonSymPencil& other) -{ - - part = other.part; - A = other.A; - B = other.B; - AsB = other.AsB; -#ifdef ARCOMP_H - AsBc = other.AsBc; -#endif - -} // Copy. - - -template -void ARumNonSymPencil:: -SparseSaxpy(ARTYPE a, ARTYPE x[], int xind[], int nx, ARTYPE y[], - int yind[], int ny, ARTYPE z[], int zind[], int& nz) -// A strongly sequential (and inefficient) sparse saxpy algorithm. -{ - - int ix, iy; - - nz = 0; - if ((nx == 0) || (a == (ARTYPE)0)) { - copy(ny,y,1,z,1); - for (iy=0; iy!=ny; iy++) zind[iy] = yind[iy]; - nz = ny; - return; - } - if (ny == 0) { - copy(nx,x,1,z,1); - scal(nx,a,z,1); - for (ix=0; ix!=nx; ix++) zind[ix] = xind[ix]; - nz = nx; - return; - } - ix = 0; - iy = 0; - while (true) { - if (xind[ix] == yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]+y[iy++]; - if ((ix == nx)||(iy == ny)) break; - } - else if (xind[ix] < yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]; - if (ix == nx) break; - } - else { - zind[nz] = yind[iy]; - z[nz++] = y[iy++]; - if (iy == ny) break; - } - } - while (iy < ny) { - zind[nz] = yind[iy]; - z[nz++] = y[iy++]; - } - while (ix < nx) { - zind[nz] = xind[ix]; - z[nz++] = x[ix++]; - } - -} // SparseSaxpy (ARTYPE). - - -#ifdef ARCOMP_H -template -void ARumNonSymPencil:: -SparseSaxpy(arcomplex a, ARFLOAT x[], int xind[], int nx, - ARFLOAT y[], int yind[], int ny, - arcomplex z[], int zind[], int& nz) -// A strongly sequential (and inefficient) sparse saxpy algorithm. -{ - - int ix, iy; - - nz = 0; - if ((nx == 0) || (a == arcomplex(0.0,0.0))) { - for (iy=0; iy!=ny; iy++) { - z[iy] = arcomplex(y[iy],0.0); - zind[iy] = yind[iy]; - } - nz = ny; - return; - } - if (ny == 0) { - for (ix=0; ix!=ny; ix++) { - z[ix] = a*arcomplex(x[ix],0.0); - zind[ix] = xind[ix]; - } - nz = nx; - return; - } - ix = 0; - iy = 0; - while (true) { - if (xind[ix] == yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]+y[iy++]; - if ((ix == nx)||(iy == ny)) break; - } - else if (xind[ix] < yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]; - if (ix == nx) break; - } - else { - zind[nz] = yind[iy]; - z[nz++] = arcomplex(y[iy++], 0.0); - if (iy == ny) break; - } - } - while (iy < ny) { - zind[nz] = yind[iy]; - z[nz++] = arcomplex(y[iy++], 0.0); - } - while (ix < nx) { - zind[nz] = xind[ix]; - z[nz++] = arcomplex(x[ix++], 0.0); - } - -} // SparseSaxpy (arcomplex). -#endif // ARCOMP_H. - - -template -void ARumNonSymPencil::SubtractAsB(ARTYPE sigma) -{ - - int i, acol, bcol, asbcol, scol; - - // Subtracting sigma*B from A. - - AsB.index[0] = 0; - asbcol = 0; - - for (i=0; i!=AsB.n; i++) { - bcol = B->pcol[i]; - acol = A->pcol[i]; - SparseSaxpy(-sigma, &B->a[bcol], &B->irow[bcol], B->pcol[i+1]-bcol, - &A->a[acol], &A->irow[acol], A->pcol[i+1]-acol, - &AsB.value[asbcol], &AsB.index[asbcol+AsB.n+1], scol); - asbcol += scol; - AsB.index[i+1] = asbcol; - } - - AsB.nnz = asbcol; - - // Adding one to all elements of vector index - // because the decomposition function was written in FORTRAN. - - for (i=0; i<=AsB.n+AsB.nnz; i++) AsB.index[i]++; - -} // SubtractAsB (ARTYPE shift). - - -#ifdef ARCOMP_H -template -void ARumNonSymPencil:: -SubtractAsB(ARFLOAT sigmaR, ARFLOAT sigmaI) -{ - - int i, acol, bcol, asbcol, scol; - arcomplex sigma; - - // Subtracting sigma*B from A. - - sigma = arcomplex(sigmaR, sigmaI); - AsBc.index[0] = 0; - asbcol = 0; - - for (i=0; i!=AsBc.n; i++) { - bcol = B->pcol[i]; - acol = A->pcol[i]; - SparseSaxpy(-sigma, &B->a[bcol], &B->irow[bcol], B->pcol[i+1]-bcol, - &A->a[acol], &A->irow[acol], A->pcol[i+1]-acol, - &AsBc.value[asbcol], &AsBc.index[asbcol+AsBc.n+1], scol); - asbcol += scol; - AsBc.index[i+1] = asbcol; - } - - AsBc.nnz = asbcol; - - // Adding one to all elements of vector index - // because the decomposition function was written in FORTRAN. - - for (i=0; i<=AsBc.n+AsBc.nnz; i++) AsBc.index[i]++; - -} // SubtractAsB (arcomplex shift). -#endif // ARCOMP_H - - -template -void ARumNonSymPencil::FactorAsB(ARTYPE sigma) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARumNonSymPencil::FactorAsB"); - } - - // Quitting the function if A and B are not square. - - if ((A->nrows() != A->ncols()) || (B->nrows() != B->ncols())) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARumNonSymPencil::FactorAsB"); - } - - // Defining matrix AsB. - - if (!AsB.IsDefined()) { - - int fillin = A->fillin > B->fillin ? A->fillin : B->fillin; - AsB.DefineMatrix(A->ncols(), A->nzeros(), A->a, A->irow, - A->pcol, A->threshold, fillin, - (A->IsSymmetric() && B->IsSymmetric()), - A->icntl[3], false); - AsB.nnz = A->nzeros()+B->nzeros(); // temporary value. - - } - - // Reserving memory for some vectors used in matrix decomposition. - - AsB.CreateStructure(); // AsB.nnz must be set to A->nzeros()+B->nzeros(). - - // Subtracting sigma*B from A and storing the result on AsB. - - SubtractAsB(sigma); - - // Decomposing AsB. - - um2fa(AsB.n, AsB.index[AsB.n], 0, false, AsB.lvalue, AsB.lindex, AsB.value, - AsB.index, AsB.keep, AsB.cntl, AsB.icntl, AsB.info, AsB.rinfo); - - // Handling errors. - - AsB.ThrowError(); - - AsB.factored = true; - -} // FactorAsB (ARTYPE shift). - - -#ifdef ARCOMP_H -template -void ARumNonSymPencil:: -FactorAsB(ARFLOAT sigmaR, ARFLOAT sigmaI, char partp) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARumNonSymPencil::FactorAsB"); - } - - // Quitting the function if A and B are not square. - - if ((A->nrows() != A->ncols()) || (B->nrows() != B->ncols())) { - throw ArpackError(ArpackError::NOT_SQUARE_MATRIX, - "ARumNonSymPencil::FactorAsB"); - } - - // Defining matrix AsB. - - if (!AsBc.IsDefined()) { - - part = partp; - int fillin = A->fillin > B->fillin ? A->fillin : B->fillin; - AsBc.DefineMatrix(A->ncols(), A->nzeros(), 0, 0, - A->pcol, A->threshold, fillin, - (A->IsSymmetric() && B->IsSymmetric()), - A->icntl[3], false); - AsBc.nnz = A->nzeros()+B->nzeros(); // temporary value. - - } - - // Reserving memory for some vectors used in matrix decomposition. - - AsBc.CreateStructure(); // AsBc.nnz must be set to A->nzeros()+B->nzeros(). - - // Subtracting sigma*B from A and storing the result on AsBc. - - SubtractAsB(sigmaR, sigmaI); - - // Decomposing AsB. - - um2fa(AsBc.n, AsBc.index[AsBc.n], 0, false, AsBc.lvalue, AsBc.lindex, - AsBc.value, AsBc.index, AsBc.keep, AsBc.cntl, AsBc.icntl, - AsBc.info, AsBc.rinfo); - - // Handling errors. - - AsBc.ThrowError(); - - AsBc.factored = true; - -} // FactorAsB (arcomplex shift). -#endif // ARCOMP_H. - - -template -void ARumNonSymPencil::MultInvBAv(ARTYPE* v, ARTYPE* w) -{ - - if (!B->IsFactored()) B->FactorA(); - - A->MultMv(v, w); - B->MultInvv(w, w); - -} // MultInvBAv. - - -#ifdef ARCOMP_H - -template -void ARumNonSymPencil:: -MultInvAsBv(arcomplex* v, arcomplex* w) -{ - - AsB.MultInvv((ARTYPE*)v,(ARTYPE*)w); - -} // MultInvAsBv (arcomplex). - -#endif // ARCOMP_H. - - -template -void ARumNonSymPencil::MultInvAsBv(ARFLOAT* v, ARFLOAT* w) -{ - - if (part == 'N') { // shift is real. - - AsB.MultInvv((ARTYPE*)v,(ARTYPE*)w); - - } - else { // shift is complex. - -#ifdef ARCOMP_H - - int i; - arcomplex *tv, *tw; - - tv = new arcomplex[AsBc.ncols()]; - tw = new arcomplex[AsBc.ncols()]; - - for (i=0; i!=AsBc.ncols(); i++) tv[i] = arcomplex(v[i], 0.0); - - AsBc.MultInvv(tv, tw); - - if (part=='I') { - for (i=0; i!=AsBc.ncols(); i++) w[i] = imag(tw[i]); - } - else { - for (i=0; i!=AsBc.ncols(); i++) w[i] = real(tw[i]); - } - - delete[] tv; - delete[] tw; - -#endif // ARCOMP_H. - - } - -} // MultInvAsBv (ARFLOAT). - - -template -inline void ARumNonSymPencil:: -DefineMatrices(ARumNonSymMatrix& Ap, - ARumNonSymMatrix& Bp) -{ - - A = &Ap; - B = &Bp; - - if ((A->n != B->n)||(A->m != B->m)) { - throw ArpackError(ArpackError::INCOMPATIBLE_SIZES, - "ARumNonSymMatrix::DefineMatrices"); - } - -} // DefineMatrices. - - -template -inline ARumNonSymPencil:: -ARumNonSymPencil(ARumNonSymMatrix& Ap, - ARumNonSymMatrix& Bp) -{ - - DefineMatrices(Ap, Bp); - -} // Long constructor. - - -template -ARumNonSymPencil& ARumNonSymPencil:: -operator=(const ARumNonSymPencil& other) -{ - - if (this != &other) { // Stroustrup suggestion. - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUNSPEN_H diff --git a/src/external/arpack++/include/aruscomp.h b/src/external/arpack++/include/aruscomp.h deleted file mode 100644 index 13ddff71..00000000 --- a/src/external/arpack++/include/aruscomp.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARUSComp.h. - Arpack++ class ARluCompStdEig definition - (umfpack version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARUSCOMP_H -#define ARUSCOMP_H - -#include -#include -#include "arch.h" -#include "arscomp.h" -#include "arunsmat.h" -#include "arrseig.h" - - -template -class ARluCompStdEig: - public virtual ARCompStdEig, ARFLOAT> > { - - public: - - // a) Public functions: - - // a.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(arcomplex sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(arcomplex sigmap); - - // a.2) Constructors and destructor. - - ARluCompStdEig() { } - // Short constructor. - - ARluCompStdEig(int nevp, ARumNonSymMatrix, ARFLOAT>& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluCompStdEig(int nevp, ARumNonSymMatrix, ARFLOAT>& A, - arcomplex sigma, const std::string& whichp = "LM", - int ncvp = 0, ARFLOAT tolp = 0.0, int maxitp = 0, - arcomplex* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluCompStdEig(const ARluCompStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluCompStdEig() { } - // Destructor. - - - // b) Operators. - - ARluCompStdEig& operator=(const ARluCompStdEig& other); - // Assignment operator. - -}; // class ARluCompStdEig. - - -// ------------------------------------------------------------------------ // -// ARluCompStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluCompStdEig:: -ChangeShift(arcomplex sigmaRp) -{ - - this->objOP->FactorAsI(sigmaRp); - ARrcStdEig >::ChangeShift(sigmaRp); - -} // ChangeShift. - - -template -inline void ARluCompStdEig::SetRegularMode() -{ - - ARStdEig, - ARumNonSymMatrix, ARFLOAT> >:: - SetRegularMode(this->objOP, - &ARumNonSymMatrix, ARFLOAT>::MultMv); - -} // SetRegularMode. - - -template -inline void ARluCompStdEig:: -SetShiftInvertMode(arcomplex sigmap) -{ - - ARStdEig, - ARumNonSymMatrix, ARFLOAT> >:: - SetShiftInvertMode(sigmap, this->objOP, - &ARumNonSymMatrix,ARFLOAT>::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluCompStdEig:: -ARluCompStdEig(int nevp, ARumNonSymMatrix, ARFLOAT>& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, arcomplex* residp, bool ishiftp) - -{ - - this->NoShift(); - DefineParameters(A.ncols(), nevp, &A, - &ARumNonSymMatrix, ARFLOAT>::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluCompStdEig:: -ARluCompStdEig(int nevp, ARumNonSymMatrix, ARFLOAT>& A, - arcomplex sigmap, const std::string& whichp, int ncvp, - ARFLOAT tolp, int maxitp, arcomplex* residp, - bool ishiftp) - -{ - - DefineParameters(A.ncols(), nevp, &A, - &ARumNonSymMatrix, ARFLOAT>::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluCompStdEig& ARluCompStdEig:: -operator=(const ARluCompStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUSCOMP_H diff --git a/src/external/arpack++/include/arusmat.h b/src/external/arpack++/include/arusmat.h deleted file mode 100644 index f5dae63a..00000000 --- a/src/external/arpack++/include/arusmat.h +++ /dev/null @@ -1,743 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARUSMat.h. - Arpack++ class ARumSymMatrix definition. - - Modified to work with Umfpack v5.?? - Martin Reuter - Date 02/28/2013 - - Arpack++ Author: - Francisco Gomes - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - - -#include "aruspen.h" - -#ifndef ARUSMAT_H -#define ARUSMAT_H - -#include -#include -#include "arch.h" -#include "armat.h" -#include "arhbmat.h" -#include "arerror.h" -//#include "blas1c.h" -#include "umfpackc.h" - -template class ARumSymPencil; - -template -class ARumSymMatrix: public ARMatrix { - - friend class ARumSymPencil; - - protected: - - bool factored; - char uplo; - int nnz; - /* int fillin; - int lvalue; - int lindex; - int keep[20]; - int icntl[20]; - int info[40]; - ARTYPE cntl[10]; - ARTYPE rinfo[20]; - int* index; - ARTYPE* value;*/ - int* irow; - int* pcol; - int status; - double threshold; - ARTYPE* a; - ARhbMatrix mat; - void* Numeric; - int* Ap; - int* Ai; - ARTYPE* Ax; - - bool DataOK(); - - virtual void Copy(const ARumSymMatrix& other); - - void ClearMem(); - - void ExpandA(ARTYPE sigma = (ARTYPE)0); - -// void CreateStructure(); - - void ThrowError(); - - public: - - int nzeros() { return nnz; } - -// int FillFact() { return fillin; } - - bool IsFactored() { return factored; } - - void FactorA(); - - void FactorAsI(ARTYPE sigma); - - void MultMv(ARTYPE* v, ARTYPE* w); - - void MultInvv(ARTYPE* v, ARTYPE* w); - - void DefineMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, char uplop = 'L', double thresholdp = 0.1, - int fillinp = 9, bool reducible = true, bool check = true); - - ARumSymMatrix(): ARMatrix() - { - factored = false; - Numeric = NULL; - Ap = NULL; - Ai = NULL; - Ax = NULL; - } - // Short constructor that does nothing. - - ARumSymMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, char uplop = 'L', double thresholdp = 0.1, - int fillinp = 9, bool reducible = true, bool check = true); - // Long constructor. - - ARumSymMatrix(const std::string& name, double thresholdp = 0.1, int fillinp = 9, - bool reducible = true, bool check = true); - // Long constructor (Harwell-Boeing file). - - ARumSymMatrix(const ARumSymMatrix& other) { Copy(other); } - // Copy constructor. - - virtual ~ARumSymMatrix() { ClearMem(); } - // Destructor. - - ARumSymMatrix& operator=(const ARumSymMatrix& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARumSymMatrix member functions definition. // -// ------------------------------------------------------------------------ // - - -template -bool ARumSymMatrix::DataOK() -{ - - int i, j, k; - - // Checking if pcol is in ascending order. - - i = 0; - while ((i!=this->n)&&(pcol[i]<=pcol[i+1])) i++; - if (i!=this->n) return false; - - // Checking if irow components are in order and within bounds. - - for (i=0; i!=this->n; i++) { - j = pcol[i]; - k = pcol[i+1]-1; - if (j<=k) { - if (uplo == 'U') { - if ((irow[j]<0)||(irow[k]>i)) return false; - } - else { // uplo == 'L'. - if ((irow[j]=this->n)) return false; - } - while ((j!=k)&&(irow[j] -inline void ARumSymMatrix::ClearMem() -{ - - if (factored) - { - if (Numeric) umfpack_di_free_numeric (&Numeric); - //if (value) delete[] value; - //if (index) delete[] index; - //value = NULL; - //index = NULL; - if (Ai) delete [] Ai; - Ai = NULL; - if (Ap) delete [] Ap; - Ap = NULL; - if (Ax) delete [] Ax; - Ax = NULL; - } - -} // ClearMem. - - - -template -void ARumSymMatrix::Copy(const ARumSymMatrix& other) -{ - - // Copying very fundamental variables. - ClearMem(); - - // Copying very fundamental variables and user-defined parameters. - - this->m = other.m; - this->n = other.n; - this->defined = other.defined; - factored = other.factored; - //fillin = other.fillin; - nnz = other.nnz; - //lvalue = other.lvalue; - //lindex = other.lindex; - irow = other.irow; - pcol = other.pcol; - a = other.a; - threshold = other.threshold; - uplo = other.uplo; - - // Returning from here if "other" was not initialized. - - if (!this->defined) return; - - // Returning from here if "other" was not factored. - - if (!factored) return; - - factored = false; - -} // Copy. - -template -void ARumSymMatrix::ExpandA(ARTYPE sigma) -{ -std::cout <<"ARumSymMatrix::ExpandA(" << sigma << ") ..." << std::flush; - - ClearMem(); - - // Checking if sigma is zero. - bool subtract = (sigma != (ARTYPE)0); - - int mynnz = 2*nnz; - if (subtract) mynnz = 2*nnz + this->n; // some space for the diag entries just in case - - // create triples (i,j,value) - int * tripi = new int[mynnz]; - int * tripj = new int[mynnz]; - ARTYPE* tripx = new ARTYPE[mynnz]; - int count = 0; - int i,j; -// if (uplo == 'U') - { - for (i=0; i != this->n; i++) - { - bool founddiag = false; - for (j=pcol[i]; j<(pcol[i+1]); j++) - { - - if (i == irow[j]) // on diag - { - tripi[count] = i; - tripj[count] = irow[j]; - if (subtract) - { - tripx[count] = a[j]-sigma; - founddiag = true; - } - else tripx[count] = a[j]; - count++; - } - else - { - - tripi[count] = i; - tripj[count] = irow[j]; - tripx[count] = a[j]; - count++; - tripj[count] = i; - tripi[count] = irow[j]; - tripx[count] = a[j]; - count++; - } - } - if (subtract && ! founddiag) - { - tripi[count] = i; - tripj[count] = i; - tripx[count] = -sigma; - count++; - } - } - } - - // convert triples to Ax Ap Ai - Ap = new int[this->n+1]; - Ai = new int[count]; - Ax = new ARTYPE[count]; - status = umfpack_di_triplet_to_col (this->n, this->n, count, tripi, tripj, tripx, Ap, Ai, Ax, (int *)NULL) ; - if (status != UMFPACK_OK) - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARumSymMatrix::ExpandA"); - if (Ap[this->n] != count) - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARumSymMatrix::ExpandA"); - - - // cleanup - delete [] tripi; - delete [] tripj; - delete [] tripx; - - //std::cout << std::endl << std::endl; - //double Control [UMFPACK_CONTROL]; - //Control [UMFPACK_PRL] = 3; - //status = umfpack_di_report_matrix(this->n, this->n,Ap, Ai, Ax,0,Control); - //std::cout << " status: " << status << std::endl; - //std::cout << std::endl << std::endl; - - std::cout <<" done!" << std::endl; - -} - -/*template -void ARumSymMatrix::ExpandA(ARTYPE sigma) -{ - - bool subtract; - int i, j, k, ki; - - // Checking if sigma is zero. - - subtract = (sigma != (ARTYPE)0); - - // Filling index with zeros. - - for (i=0; i<=this->n; i++) index[i] = 0; - - // Counting the elements in each column of A. - - if (uplo == 'U') { - - for (i=0; i!=this->n; i++) { - k = pcol[i+1]; - if ((k!=pcol[i])&&(irow[k-1]==i)) { - k--; - } - else { - if (subtract) index[i]++; - } - for (j=pcol[i]; jn; i++) { - k = pcol[i]; - if ((k!=pcol[i+1])&&(irow[k]==i)) { - k++; - } - else { - if (subtract) index[i]++; - } - for (j=k; jn; i++) index[i+1]+=index[i]; - - // Adding pcol to index. - - for (i=this->n; i>0; i--) index[i] = index[i-1]+pcol[i]; - index[0] = pcol[0]; - - // Expanding A. - - ki = this->n+1; - - if (uplo == 'U') { - - for (i=0; in; i++) { - for (j=pcol[i]; j<(pcol[i+1]-1); j++) { - index[ki+index[i]] = irow[j]+1; - index[ki+index[irow[j]]] = i+1; - value[index[i]++] = a[j]; - value[index[irow[j]]++] = a[j]; - } - if ((pcol[i]!=pcol[i+1])&&(irow[j]==i)) { - index[ki+index[i]] = i+1; - if (subtract) { - value[index[i]++] = a[j]-sigma; - } - else { - value[index[i]++] = a[j]; - } - } - else { - if (subtract) { - index[ki+index[i]] = i+1; - value[index[i]++] = -sigma; - } - } - } - - } - else { // uplo == 'L' - - for (i=0; in; i++) { - k=pcol[i]; - if ((k!=pcol[i+1])&&(irow[k]==i)) { - index[ki+index[i]] = i+1; - if (subtract) { - value[index[i]++] = a[k]-sigma; - } - else { - value[index[i]++] = a[k]; - } - k++; - } - else { - if (subtract) { - index[ki+index[i]] = i+1; - value[index[i]++] = -sigma; - } - } - for (j=k; jn; i>0; i--) { - index[i] = index[i-1]+1; - } - index[0] = 1; - -} // ExpandA.*/ - - -/*template -inline void ARumSymMatrix::CreateStructure() -{ - - int dimfact = (((fillin+1)*nnz*2)<(this->n*this->n)) ? (fillin+1)*nnz*2 : this->n*this->n; - - ClearMem(); - - lindex = 30*this->n+dimfact; // ????? - lvalue = dimfact; - - value = new ARTYPE[lvalue]; - index = new int[lindex]; - -} // CreateStructure. -*/ - -template -inline void ARumSymMatrix::ThrowError() -{ - - if (status== -1) { // Memory is not suficient. - throw ArpackError(ArpackError::INSUFICIENT_MEMORY, - "ARumSymMatrix::FactorA"); - } - else if (status == 1) { // Matrix is singular. - throw ArpackError(ArpackError::MATRIX_IS_SINGULAR, - "ARumSymMatrix::FactorA"); - } - else if (status != 0) { // Illegal argument. - throw ArpackError(ArpackError::PARAMETER_ERROR, - "ARumSymMatrix::FactorA"); - } - -} // ThrowError. - - -template -void ARumSymMatrix::FactorA() -{ - -std::cout <<"ARumSymMatrix::FactorA " << std::endl; - - // Quitting the function if A was not defined. - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARumSymMatrix::FactorA"); - } - - ExpandA(); // create Ap Ai Ax - - void *Symbolic ; - status = umfpack_di_symbolic (this->n, this->n, Ap, Ai, Ax, &Symbolic, NULL, NULL) ; - ThrowError(); - status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, NULL, NULL) ; - ThrowError(); - umfpack_di_free_symbolic (&Symbolic) ; - -/* - - // Reserving memory for some vectors used in matrix decomposition. - - CreateStructure(); - - // Copying A to (value, index); - - ExpandA(); - - // Decomposing A. - - um2fa(this->n, index[this->n], 0, false, lvalue, lindex, value, - index, keep, cntl, icntl, info, rinfo); -*/ - - factored = true; - -} // FactorA. - - -template -void ARumSymMatrix::FactorAsI(ARTYPE sigma) -{ -std::cout <<"ARumSymMatrix::FactorAsI " << sigma << std::endl; - - // Quitting the function if A was not defined. - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARumSymMatrix::FactorAsI"); - } - - // Reserving memory for some vectors used in matrix decomposition. - //CreateStructure(); - - // Subtracting sigma*I from A. - ExpandA(sigma); - - // Decomposing AsI. - double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL]; - umfpack_di_defaults (Control) ; - //std::cout << " Ap[n] = " << Ap[this->n] << std::flush; - - void *Symbolic ; - status = umfpack_di_symbolic (this->n, this->n, Ap, Ai, Ax, &Symbolic, Control, Info) ; - //std::cout << " symbolic status: " << status << std::endl; - ThrowError(); - status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, NULL, NULL) ; - //std::cout << " numeric status: " << status << std::endl; - ThrowError(); - umfpack_di_free_symbolic (&Symbolic) ; - -// // Decomposing AsI. -// um2fa(this->n, index[this->n], 0, false, lvalue, lindex, value, -// index, keep, cntl, icntl, info, rinfo); - - - factored = true; - -} // FactorAsI. - - -template -void ARumSymMatrix::MultMv(ARTYPE* v, ARTYPE* w) -{ -//std::cout <<"ARumSymMatrix::MultMv ..." << std::flush; - - int i,j,k; - ARTYPE t; - - // Quitting the function if A was not defined. - - if (!this->IsDefined()) { - throw ArpackError(ArpackError::DATA_UNDEFINED, "ARumSymMatrix::MultMv"); - } - - // Determining w = M.v. - - for (i=0; i!=this->m; i++) w[i]=(ARTYPE)0; - - if (uplo == 'U') { - - for (i=0; i!=this->n; i++) { - t = v[i]; - k = pcol[i+1]; - if ((k!=pcol[i])&&(irow[k-1]==i)) { - w[i] += t*a[k-1]; - k--; - } - for (j=pcol[i]; jn; i++) { - t = v[i]; - k = pcol[i]; - if ((k!=pcol[i+1])&&(irow[k]==i)) { - w[i] += t*a[k]; - k++; - } - for (j=k; j -void ARumSymMatrix::MultInvv(ARTYPE* v, ARTYPE* w) -{ -//std::cout <<"ARumSymMatrix::MultInvv ..." << std::flush; - - // Quitting the function if A (or AsI) was not factored. - - if (!IsFactored()) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARumSymMatrix::MultInvv"); - } - - // Solving A.w = v (or AsI.w = v). - -// ARTYPE* space = new ARTYPE[2*this->n]; -// um2so(this->n, 0, false, lvalue, lindex, value, index, -// keep, v, w, space, cntl, icntl, info, rinfo); -// delete[] space; - - status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, w, v, Numeric, NULL, NULL) ; - if (status != UMFPACK_OK) - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARumSymMatrix::MultInvv"); - -} // MultInvv. - - -template -inline void ARumSymMatrix:: -DefineMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, char uplop, double thresholdp, - int fillinp, bool reducible, bool check) -{ - - this->m = np; - this->n = np; - nnz = nnzp; - a = ap; - irow = irowp; - pcol = pcolp; - pcol[this->n] = nnz; - uplo = uplop; -// fillin = (fillinp>2) ? fillinp : 2; - threshold = thresholdp; -// value = NULL; -// index = NULL; - -// // Preparing umfpack. -// -// um21i(keep, cntl, icntl, threshold, true, reducible); - - // Checking data. - if ((check)&&(!DataOK())) { - throw ArpackError(ArpackError::INCONSISTENT_DATA, - "ARumSymMatrix::DefineMatrix"); - } - - this->defined = true; - -} // DefineMatrix. - - -template -inline ARumSymMatrix:: -ARumSymMatrix(int np, int nnzp, ARTYPE* ap, int* irowp, - int* pcolp, char uplop, double thresholdp, - int fillinp, bool reducible, bool check) : ARMatrix(np) -{ - Numeric = NULL; - Ap = NULL; - Ai = NULL; - Ax = NULL; - factored = false; - DefineMatrix(np, nnzp, ap, irowp, pcolp, uplop, - thresholdp, fillinp, reducible, check); - -} // Long constructor. - - -template -ARumSymMatrix:: -ARumSymMatrix(const std::string& file, double thresholdp, int fillinp, - bool reducible, bool check) -{ - Numeric = NULL; - Ap = NULL; - Ai = NULL; - Ax = NULL; - - factored = false; - - try { - mat.Define(file); - } - catch (ArpackError) { // Returning from here if an error has occurred. - throw ArpackError(ArpackError::CANNOT_READ_FILE, "ARumSymMatrix"); - } - - if ((mat.NCols() == mat.NRows()) && (mat.IsSymmetric())) { - - DefineMatrix(mat.NCols(), mat.NonZeros(), (ARTYPE*)mat.Entries(), - mat.RowInd(), mat.ColPtr(), 'L', thresholdp, - fillinp, reducible, check); - } - else { - throw ArpackError(ArpackError::INCONSISTENT_DATA, - "ARumSymMatrix::ARluSymMatrix"); - } - -} // Long constructor (Harwell-Boeing file). - - -template -ARumSymMatrix& ARumSymMatrix:: -operator=(const ARumSymMatrix& other) -{ - - if (this != &other) { // Stroustrup suggestion. - ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUSMAT_H diff --git a/src/external/arpack++/include/arusnsym.h b/src/external/arpack++/include/arusnsym.h deleted file mode 100644 index 644ee27d..00000000 --- a/src/external/arpack++/include/arusnsym.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARUSNSym.h. - Arpack++ class ARluNonSymStdEig definition - (umfpack version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARUSNSYM_H -#define ARUSNSYM_H - -#include -#include -#include "arch.h" -#include "arsnsym.h" -#include "arunsmat.h" - - -template -class ARluNonSymStdEig: - public virtual ARNonSymStdEig > { - - public: - - // a) Public functions: - - // a.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - // a.2) Constructors and destructor. - - ARluNonSymStdEig() { } - // Short constructor. - - ARluNonSymStdEig(int nevp, ARumNonSymMatrix& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluNonSymStdEig(int nevp, ARumNonSymMatrix& A, - ARFLOAT sigma, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluNonSymStdEig(const ARluNonSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluNonSymStdEig() { } - // Destructor. - - // b) Operators. - - ARluNonSymStdEig& operator=(const ARluNonSymStdEig& other); - // Assignment operator. - -}; // class ARluNonSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARluNonSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluNonSymStdEig::ChangeShift(ARFLOAT sigmaRp) -{ - - this->sigmaR = sigmaRp; - this->sigmaI = 0.0; - this->mode = 3; - this->iparam[7] = this->mode; - - this->objOP->FactorAsI(this->sigmaR); - this->Restart(); - -} // ChangeShift. - - -template -inline void ARluNonSymStdEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(this->objOP, &ARumNonSymMatrix::MultMv); - -} // SetRegularMode. - - -template -inline void ARluNonSymStdEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARStdEig >:: - SetShiftInvertMode(sigmap, this->objOP, - &ARumNonSymMatrix::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluNonSymStdEig:: -ARluNonSymStdEig(int nevp, ARumNonSymMatrix& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->NoShift(); - DefineParameters(A.ncols(), nevp, &A, - &ARumNonSymMatrix::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluNonSymStdEig:: -ARluNonSymStdEig(int nevp, ARumNonSymMatrix& A, - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - DefineParameters(A.ncols(), nevp, &A, - &ARumNonSymMatrix::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluNonSymStdEig& ARluNonSymStdEig:: -operator=(const ARluNonSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUSNSYM_H diff --git a/src/external/arpack++/include/aruspen.h b/src/external/arpack++/include/aruspen.h deleted file mode 100644 index bd2a5994..00000000 --- a/src/external/arpack++/include/aruspen.h +++ /dev/null @@ -1,543 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARUSPen.h. - Arpack++ class ARumSymPencil definition. - - Modified to work with Umfpack v5.?? - Martin Reuter - Date 02/28/2013 - - Arpack++ Author: - Francisco Gomes - - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARUSPEN_H -#define ARUSPEN_H - -//#include "arch.h" -//#include "arerror.h" -//#include "lapackc.h" -#include "arusmat.h" -#include "blas1c.h" - - -template -class ARumSymPencil -{ - - protected: - - ARumSymMatrix* A; - ARumSymMatrix* B; - //ARumSymMatrix AsB; - void* Numeric; - int* Ap; - int* Ai; - ARTYPE* Ax; - - virtual void Copy(const ARumSymPencil& other); - -// void SparseSaxpy(ARTYPE a, ARTYPE x[], int xind[], int nx, ARTYPE y[], -// int yind[], int ny, ARTYPE z[], int zind[], int& nz); - - void ExpandAsB(ARTYPE sigma); - -// void SubtractAsB(ARTYPE sigma); - void ClearMem(); - - public: - - bool IsFactored() { return (Numeric != NULL); } - - void FactorAsB(ARTYPE sigma); - - void MultAv(ARTYPE* v, ARTYPE* w) { A->MultMv(v,w); } - - void MultBv(ARTYPE* v, ARTYPE* w) { B->MultMv(v,w); } - - void MultInvBAv(ARTYPE* v, ARTYPE* w); - - //void MultInvAsBv(ARTYPE* v, ARTYPE* w) { AsB.MultInvv(v,w); } - void MultInvAsBv(ARTYPE* v, ARTYPE* w); - - void DefineMatrices(ARumSymMatrix& Ap, ARumSymMatrix& Bp); - - //ARumSymPencil() { AsB.factored = false; } - ARumSymPencil() { Numeric = NULL; Ap = NULL; Ai = NULL; Ax = NULL; } - // Short constructor that does nothing. - - ARumSymPencil(ARumSymMatrix& Ap, ARumSymMatrix& Bp); - // Long constructor. - - ARumSymPencil(const ARumSymPencil& other) { Copy(other); } - // Copy constructor. - - virtual ~ARumSymPencil() { } - // Destructor. - - ARumSymPencil& operator=(const ARumSymPencil& other); - // Assignment operator. - -}; - -// ------------------------------------------------------------------------ // -// ARumSymPencil member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARumSymPencil::ClearMem() -{ - - if (Numeric) umfpack_di_free_numeric (&Numeric); - if (Ai) delete [] Ai; - Ai = NULL; - if (Ap) delete [] Ap; - Ap = NULL; - if (Ax) delete [] Ax; - Ax = NULL; - -} // ClearMem. - - - -template -inline void ARumSymPencil::Copy(const ARumSymPencil& other) -{ - ClearMem(); - A = other.A; - B = other.B; -// AsB = other.AsB; - -} // Copy. - - -/*template -void ARumSymPencil:: -SparseSaxpy(ARTYPE a, ARTYPE x[], int xind[], int nx, ARTYPE y[], - int yind[], int ny, ARTYPE z[], int zind[], int& nz) -// A strongly sequential (and inefficient) sparse saxpy algorithm. -{ - - int ix, iy; - - nz = 0; - if ((nx == 0) || (a == (ARTYPE)0)) { - copy(ny,y,1,z,1); - for (iy=0; iy!=ny; iy++) zind[iy] = yind[iy]; - nz = ny; - return; - } - if (ny == 0) { - copy(nx,x,1,z,1); - scal(nx,a,z,1); - for (ix=0; ix!=nx; ix++) zind[ix] = xind[ix]; - nz = nx; - return; - } - ix = 0; - iy = 0; - while (true) { - if (xind[ix] == yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]+y[iy++]; - if ((ix == nx)||(iy == ny)) break; - } - else if (xind[ix] < yind[iy]) { - zind[nz] = xind[ix]; - z[nz++] = a*x[ix++]; - if (ix == nx) break; - } - else { - zind[nz] = yind[iy]; - z[nz++] = y[iy++]; - if (iy == ny) break; - } - } - while (iy < ny) { - zind[nz] = yind[iy]; - z[nz++] = y[iy++]; - } - while (ix < nx) { - zind[nz] = xind[ix]; - z[nz++] = x[ix++]; - } - -} // SparseSaxpy. - - -template -void ARumSymPencil::ExpandAsB() -{ - - int i, j, k, n; - int *pcol, *irow, *index, *pos; - ARTYPE *value; - - // Initializing variables. - - n = AsB.n; - index = AsB.index; - value = AsB.value; - irow = &index[n+1]; - pcol = new int[AsB.n+1]; - pos = new int[AsB.n+1]; - for (i=0; i<=n; i++) pcol[i] = index[i]; - for (i=0; i<=n; i++) pos[i] = 0; - - // Counting the elements in each column of AsB. - - if (AsB.uplo == 'U') { - - for (i=0; i!=n; i++) { - k = pcol[i+1]; - if ((k!=pcol[i])&&(irow[k-1]==i)) k--; - for (j=pcol[i]; j0; i--) index[i] += pos[i-1]; - - // Expanding A. - - if (AsB.uplo == 'U') { - - for (i=n-1; i>=0; i--) { - pos[i] = index[i]+pcol[i+1]-pcol[i]; - k = pos[i]-1; - for (j=pcol[i+1]-1; j>=pcol[i]; j--) { - value[k] = value[j]; - irow[k--] = irow[j]; - } - } - for (i=1; iindex[i])&&(irow[k-1]==i)) k--; - for (j=index[i]; j=0; i--) { - k = index[i+1]-1; - for (j=pcol[i+1]-1; j>=pcol[i]; j--) { - value[k] = value[j]; - irow[k--] = irow[j]; - } - pos[i] = index[i]; - } - for (i=0; i<(n-1); i++) { - k = index[i+1]-pcol[i+1]+pcol[i]; - if ((k -void ARumSymPencil::SubtractAsB(ARTYPE sigma) -{ - - int i, acol, bcol, asbcol, scol; - - // Quitting function if A->uplo is not equal to B->uplo. - - if ((A->uplo != B->uplo)&&(sigma != (ARTYPE)0)) { - throw ArpackError(ArpackError::DIFFERENT_TRIANGLES, - "ARumSymPencil::SubtractAsB"); - } - AsB.uplo = A->uplo; - - // Subtracting sigma*B from A. - - AsB.index[0] = 0; - asbcol = 0; - - for (i=0; i!=AsB.n; i++) { - bcol = B->pcol[i]; - acol = A->pcol[i]; - SparseSaxpy(-sigma, &B->a[bcol], &B->irow[bcol], B->pcol[i+1]-bcol, - &A->a[acol], &A->irow[acol], A->pcol[i+1]-acol, - &AsB.value[asbcol], &AsB.index[asbcol+AsB.n+1], scol); - asbcol += scol; - AsB.index[i+1] = asbcol; - } - - // Expanding AsB. - - ExpandAsB(); - - // Adding one to all elements of vector index - // because the decomposition function was written in FORTRAN. - - for (i=0; i<=AsB.n+AsB.nnz; i++) AsB.index[i]++; - -} // SubtractAsB. */ - - -template -void ARumSymPencil::ExpandAsB(ARTYPE sigma) -{ -std::cout <<"ARumSymPencil::ExpandAsB(" << sigma << ") ..." << std::flush; - - ClearMem(); - - int mynnz = 2*A->nnz+2*B->nnz; - if (sigma == 0.0) - mynnz = 2*A->nnz; - - // create triples (i,j,value) - int * tripi = new int[mynnz]; - int * tripj = new int[mynnz]; - ARTYPE* tripx = new ARTYPE[mynnz]; - if (tripi == NULL || tripj == NULL || tripx ==NULL) - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARumSymPencil::ExpandAsB out of memory (1)"); - - int count = 0; - int i,j; - for (i=0; i < A->n; i++) - { - // create triplets from A - for (j=A->pcol[i]; j<(A->pcol[i+1]); j++) - { - tripi[count] = i; - tripj[count] = A->irow[j]; - tripx[count] = A->a[j]; - count++; - if (i != A->irow[j]) // not on diag - { - tripj[count] = i; - tripi[count] = A->irow[j]; - tripx[count] = A->a[j]; - count++; - } - } - - if (sigma != 0.0) - { - // create triplets from -sigma B - for (j=B->pcol[i]; j<(B->pcol[i+1]); j++) - { - tripi[count] = i; - tripj[count] = B->irow[j]; - tripx[count] = -sigma * B->a[j]; - count++; - if (i != B->irow[j]) // not on diag - { - tripj[count] = i; - tripi[count] = B->irow[j]; - tripx[count] = tripx[count-1]; - count++; - } - } - } - - } - - //Write_Triplet_Matrix("A-aruspen.asc",tripi,tripj,tripx,count); - - std::cout<< " ( N = " << A->n << " NNZ = " << count << " )" << std::flush; - //std::cout<< " size double " << sizeof(double) << " size ARTYPE " << sizeof(ARTYPE) << std::endl; - // convert triples (A-sigma B) to Ax Ap Ai - Ap = new int[A->n + 1]; - Ai = new int[count]; - Ax = new ARTYPE[count]; - if (!Ap || !Ai || !Ax ) - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARumSymPencil::ExpandAsB out of memory (2)"); - - int status = umfpack_di_triplet_to_col (A->n, A->n, count, tripi, tripj, tripx, Ap, Ai, Ax, (int *)NULL) ; - if (status != UMFPACK_OK) - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARumSymPencil::ExpandAsB triplet to col"); - - // cleanup - delete [] tripi; - delete [] tripj; - delete [] tripx; - - //std::cout << std::endl << std::endl; - //double Control [UMFPACK_CONTROL]; - //Control [UMFPACK_PRL] = 3; - //status = umfpack_di_report_matrix(A->n, A->n,Ap, Ai, Ax,0,Control); - //std::cout << " status: " << status << std::endl; - //std::cout << std::endl << std::endl; - - std::cout <<" done!" << std::endl; -} - -template -void ARumSymPencil::FactorAsB(ARTYPE sigma) -{ - - // Quitting the function if A and B were not defined. - - if (!(A->IsDefined()&&B->IsDefined())) { - throw ArpackError(ArpackError::DATA_UNDEFINED, - "ARumSymPencil::FactorAsB"); - } - - - // Subtracting sigma*B from A and storing the result - ExpandAsB(sigma); - - // Decomposing AsB. - double Info [UMFPACK_INFO], Control [UMFPACK_CONTROL]; - umfpack_di_defaults (Control) ; - //std::cout <<" loaded defaults" << std::endl; - void *Symbolic ; - int status = umfpack_di_symbolic (A->n, A->n, Ap, Ai, Ax, &Symbolic, Control, Info) ; - std::cout << " symbolic status: " << status << std::endl; - if (status != UMFPACK_OK) - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARumSymPencil::FactorAsB symbolic"); - status = umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, Control, Info) ; - std::cout << " numeric status: " << status << std::endl; - if (status == 1) - { - std::cout << " WARNING: MATRIX IS SINGULAR " << std::endl; - //throw ArpackError(ArpackError::PARAMETER_ERROR, "ARumSymPencil::FactorAsB numeric (matrix singular)"); - } - if (status < UMFPACK_OK) - { - std::cout << " ERROR CODE: " << status << std::endl; - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARumSymPencil::FactorAsB numeric"); - } - umfpack_di_free_symbolic (&Symbolic) ; - -//exit(0); - - // Decomposing AsB. - - //um2fa(AsB.n, AsB.index[AsB.n], 0, false, AsB.lvalue, AsB.lindex, AsB.value, - // AsB.index, AsB.keep, AsB.cntl, AsB.icntl, AsB.info, AsB.rinfo); - - // Handling errors. - - // AsB.ThrowError(); - - // AsB.factored = true; - -} // FactorAsB (ARTYPE shift). - - -template -void ARumSymPencil::MultInvBAv(ARTYPE* v, ARTYPE* w) -{ - - if (!B->IsFactored()) B->FactorA(); - - A->MultMv(v, w); - copy(A->ncols(), w, 1, v, 1); - B->MultInvv(w, w); - -} // MultInvBAv. - -template -void ARumSymPencil::MultInvAsBv(ARTYPE* v, ARTYPE* w) -{ - if (!Numeric) { - throw ArpackError(ArpackError::NOT_FACTORED_MATRIX, - "ARchSymPencil::MultInvAsBv"); - } - - // Solving A.w = v (or AsI.w = v). - int status = umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, w, v, Numeric, NULL, NULL) ; - if (status == 1) - { - std::cout << " WARNING: MATRIX IS SINGULAR " << std::endl; - //throw ArpackError(ArpackError::PARAMETER_ERROR, "ARumSymPencil::FactorAsB numeric (matrix singular)"); - } - if (status < UMFPACK_OK) - { - std::cout << " ERROR CODE: " << status << std::endl; - throw ArpackError(ArpackError::PARAMETER_ERROR, "ARumSymPencil::MultInvAsBv"); - - } - -} // MultInvAsBv - -template -inline void ARumSymPencil:: -DefineMatrices(ARumSymMatrix& Ap, ARumSymMatrix& Bp) -{ - - A = &Ap; - B = &Bp; - - if (A->n != B->n) { - throw ArpackError(ArpackError::INCOMPATIBLE_SIZES, - "ARumSymMatrix::DefineMatrices"); - } - -} // DefineMatrices. - - -template -inline ARumSymPencil:: -ARumSymPencil(ARumSymMatrix& Ap, ARumSymMatrix& Bp) -{ - Numeric = NULL; - Ap = NULL; - Ai = NULL; - Ax = NULL; - - //AsB.factored = false; - DefineMatrices(Ap, Bp); - - -} // Long constructor. - - -template -ARumSymPencil& ARumSymPencil:: -operator=(const ARumSymPencil& other) -{ - - if (this != &other) { // Stroustrup suggestion. - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUSPEN_H diff --git a/src/external/arpack++/include/arussym.h b/src/external/arpack++/include/arussym.h deleted file mode 100644 index f1a53cf8..00000000 --- a/src/external/arpack++/include/arussym.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ARUSSym.h. - Arpack++ class ARluSymStdEig definition - (UMFPACK version). - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef ARUSSYM_H -#define ARUSSYM_H - -#include -#include -#include "arch.h" -#include "arssym.h" -#include "arusmat.h" - - -template -class ARluSymStdEig: - public virtual ARSymStdEig > { - - public: - - // a) Public functions: - - // a.1) Functions that allow changes in problem parameters. - - virtual void ChangeShift(ARFLOAT sigmaRp); - - virtual void SetRegularMode(); - - virtual void SetShiftInvertMode(ARFLOAT sigmap); - - // a.2) Constructors and destructor. - - ARluSymStdEig() { } - // Short constructor. - - ARluSymStdEig(int nevp, ARumSymMatrix& A, - const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (regular mode). - - ARluSymStdEig(int nevp, ARumSymMatrix& A, - ARFLOAT sigma, const std::string& whichp = "LM", int ncvp = 0, - ARFLOAT tolp = 0.0, int maxitp = 0, - ARFLOAT* residp = NULL, bool ishiftp = true); - // Long constructor (shift and invert mode). - - ARluSymStdEig(const ARluSymStdEig& other) { Copy(other); } - // Copy constructor. - - virtual ~ARluSymStdEig() { } - // Destructor. - - // b) Operators. - - ARluSymStdEig& operator=(const ARluSymStdEig& other); - // Assignment operator. - -}; // class ARluSymStdEig. - - -// ------------------------------------------------------------------------ // -// ARluSymStdEig member functions definition. // -// ------------------------------------------------------------------------ // - - -template -inline void ARluSymStdEig::ChangeShift(ARFLOAT sigmaRp) -{ - - this->sigmaR = sigmaRp; - this->sigmaI = 0.0; - this->mode = 3; - this->iparam[7] = this->mode; - - this->objOP->FactorAsI(this->sigmaR); - this->Restart(); - -} // ChangeShift. - - -template -inline void ARluSymStdEig::SetRegularMode() -{ - - ARStdEig >:: - SetRegularMode(this->objOP, &ARumSymMatrix::MultMv); - -} // SetRegularMode. - - -template -inline void ARluSymStdEig::SetShiftInvertMode(ARFLOAT sigmap) -{ - - ARStdEig >:: - SetShiftInvertMode(sigmap, this->objOP, &ARumSymMatrix::MultInvv); - -} // SetShiftInvertMode. - - -template -inline ARluSymStdEig:: -ARluSymStdEig(int nevp, ARumSymMatrix& A, - const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) -{ - - this->NoShift(); - this->DefineParameters(A.ncols(), nevp, &A, &ARumSymMatrix::MultMv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - -} // Long constructor (regular mode). - - -template -inline ARluSymStdEig:: -ARluSymStdEig(int nevp, ARumSymMatrix& A, - ARFLOAT sigmap, const std::string& whichp, int ncvp, ARFLOAT tolp, - int maxitp, ARFLOAT* residp, bool ishiftp) - -{ - - this->DefineParameters(A.ncols(), nevp, &A, &ARumSymMatrix::MultInvv, - whichp, ncvp, tolp, maxitp, residp, ishiftp); - ChangeShift(sigmap); - -} // Long constructor (shift and invert mode). - - -template -ARluSymStdEig& ARluSymStdEig:: -operator=(const ARluSymStdEig& other) -{ - - if (this != &other) { // Stroustrup suggestion. - this->ClearMem(); - Copy(other); - } - return *this; - -} // operator=. - - -#endif // ARUSSYM_H diff --git a/src/external/arpack++/include/blas1c.h b/src/external/arpack++/include/blas1c.h deleted file mode 100644 index b24fca52..00000000 --- a/src/external/arpack++/include/blas1c.h +++ /dev/null @@ -1,367 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE blas1c.h. - Interface to blas 1 and blas 2 FORTRAN routines. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#include "arch.h" -#include "blas1f.h" - -#ifndef BLAS1C_H -#define BLAS1C_H - -// ASSUM - -inline float assum(const ARint &n, const float dx[], const ARint &incx) { - return F77NAME(sasum)(&n, dx, &incx); -} // assum (float) - -inline double assum(const ARint &n, const double dx[], const ARint &incx) { - return F77NAME(dasum)(&n, dx, &incx); -} // assum (double) - -#ifdef ARCOMP_H -inline float assum(const ARint &n, const arcomplex dx[], - const ARint &incx) { - return F77NAME(scasum)(&n, dx, &incx); -} // assum (arcomplex) - -inline double assum(const ARint &n, const arcomplex dx[], - const ARint &incx) { - return F77NAME(dzasum)(&n, dx, &incx); -} // assum (arcomplex) -#endif - -// AXPY - -inline void axpy(const ARint &n, const float &da, const float dx[], - const ARint &incx, float dy[], const ARint &incy) { - F77NAME(saxpy)(&n, &da, dx, &incx, dy, &incy); -} // axpy (float) - -inline void axpy(const ARint &n, const double &da, const double dx[], - const ARint &incx, double dy[], const ARint &incy) { - F77NAME(daxpy)(&n, &da, dx, &incx, dy, &incy); -} // axpy (double) - -#ifdef ARCOMP_H -inline void axpy(const ARint &n, const arcomplex &da, - const arcomplex dx[], const ARint &incx, - arcomplex dy[], const ARint &incy) { - F77NAME(caxpy)(&n, &da, dx, &incx, dy, &incy); -} // axpy (arcomplex) - -inline void axpy(const ARint &n, const arcomplex &da, - const arcomplex dx[], const ARint &incx, - arcomplex dy[], const ARint &incy) { - F77NAME(zaxpy)(&n, &da, dx, &incx, dy, &incy); -} // axpy (arcomplex) -#endif - -// COPY - -inline void copy(const ARint &n, const float dx[], const ARint &incx, - float dy[], const ARint &incy) { - if (dx != dy) F77NAME(scopy)(&n, dx, &incx, dy, &incy); -} // copy (float) - -inline void copy(const ARint &n, const double dx[], const ARint &incx, - double dy[], const ARint &incy) { - if (dx != dy) F77NAME(dcopy)(&n, dx, &incx, dy, &incy); -} // copy (double) - -#ifdef ARCOMP_H -inline void copy(const ARint &n, const arcomplex dx[], - const ARint &incx, arcomplex dy[], - const ARint &incy) { - if (dx != dy) F77NAME(ccopy)(&n, dx, &incx, dy, &incy); -} // copy (arcomplex) - -inline void copy(const ARint &n, const arcomplex dx[], - const ARint &incx, arcomplex dy[], - const ARint &incy) { - if (dx != dy) F77NAME(zcopy)(&n, dx, &incx, dy, &incy); -} // copy (arcomplex) -#endif - -// DOT - -inline float dot(const ARint &n, const float dx[], const ARint &incx, - const float dy[], const ARint &incy) { - return F77NAME(sdot)(&n, dx, &incx, dy, &incy); -} // dot (float) - -inline double dot(const ARint &n, const double dx[], const ARint &incx, - const double dy[], const ARint &incy) { - return F77NAME(ddot)(&n, dx, &incx, dy, &incy); -} // dot (double) - -#ifdef ARCOMP_H -inline arcomplex dotc(const ARint &n, const arcomplex dx[], - const ARint &incx,const arcomplex dy[], - const ARint &incy) { - arcomplex tmp; - F77NAME(cdotc)(&tmp, &n, dx, &incx, dy, &incy); - return tmp; -} // dotc (arcomplex) - -inline arcomplex dotc(const ARint &n, const arcomplex dx[], - const ARint &incx, const arcomplex dy[], - const ARint &incy) { - arcomplex tmp; - F77NAME(zdotc)(&tmp, &n, dx, &incx, dy, &incy); - return tmp; -} // dotc (arcomplex) - -inline arcomplex dotu(const ARint &n, const arcomplex dx[], - const ARint &incx, const arcomplex dy[], - const ARint &incy) { - arcomplex tmp; - F77NAME(cdotu)(&tmp, &n, dx, &incx, dy, &incy); - return tmp; -} // dotu (arcomplex) - -inline arcomplex dotu(const ARint &n, const arcomplex dx[], - const ARint &incx, const arcomplex dy[], - const ARint &incy) { - arcomplex tmp; - F77NAME(zdotu)(&tmp, &n, dx, &incx, dy, &incy); - return tmp; -} // dotu (arcomplex) -#endif - -// NRM2 - -inline float nrm2(const ARint &n, const float dx[], const ARint &incx) { - return F77NAME(snrm2)(&n, dx, &incx); -} // nrm2 (float) - -inline double nrm2(const ARint &n, const double dx[], const ARint &incx) { - return F77NAME(dnrm2)(&n, dx, &incx); -} // nrm2 (double) - -#ifdef ARCOMP_H -inline float nrm2(const ARint &n, const arcomplex dx[], - const ARint &incx) { - return F77NAME(scnrm2)(&n, dx, &incx); -} // nrm2 (complex ) - -inline double nrm2(const ARint &n, const arcomplex dx[], - const ARint &incx) { - return F77NAME(dznrm2)(&n, dx, &incx); -} // nrm2 (complex ) -#endif - -// ROT - -inline void rot(const ARint &n, float dx[], const ARint &incx, float dy[], - const ARint &incy, const float &c, const float &s) { - F77NAME(srot)(&n, dx, &incx, dy, &incy, &c, &s); -} // rot (float) - -inline void rot(const ARint &n, double dx[], const ARint &incx, - double dy[], const ARint &incy, const double &c, - const double &s) { - F77NAME(drot)(&n, dx, &incx, dy, &incy, &c, &s); -} // rot (double) - -// ROTG - -inline void rotg(float &da, float &db, float &c, float &s) { - F77NAME(srotg)(&da, &db, &c, &s); -} // rotg (float) - -inline void rotg(double &da, double &db, double &c, double &s) { - F77NAME(drotg)(&da, &db, &c, &s); -} // rotg (double) - -// SCAL - -inline void scal(const ARint &n, float &da, float dx[], const ARint &incx) { - F77NAME(sscal)(&n, &da, dx, &incx); -} // scal (float) - -inline void scal(const ARint &n, double &da, double dx[], const ARint &incx) { - F77NAME(dscal)(&n, &da, dx, &incx); -} // scal (double) - -#ifdef ARCOMP_H -inline void scal(const ARint &n, const arcomplex &da, - arcomplex dx[], const ARint &incx) { - F77NAME(cscal)(&n, &da, dx, &incx); -} // scal (arcomplex) - -inline void scal(const ARint &n, const arcomplex &da, - arcomplex dx[], const ARint &incx) { - F77NAME(zscal)(&n, &da, dx, &incx); -} // scal (arcomplex) - -inline void sscal(const ARint &n, const float &da, arcomplex dx[], - const ARint &incx) { - F77NAME(csscal)(&n, &da, dx, &incx); -} // sscal (arcomplex) - -inline void sscal(const ARint &n, const double &da, arcomplex dx[], - const ARint &incx) { - F77NAME(zdscal)(&n, &da, dx, &incx); -} // sscal (arcomplex) -#endif - -// SWAP - -inline void swap(const ARint &n, float dx[], const ARint &incx, - float dy[], const ARint &incy) { - F77NAME(sswap)(&n, dx, &incx, dy, &incy); -} // swap (float) - -inline void swap(const ARint &n, double dx[], const ARint &incx, - double dy[], const ARint &incy) { - F77NAME(dswap)(&n, dx, &incx, dy, &incy); -} // swap (double) - -#ifdef ARCOMP_H -inline void swap(const ARint &n, arcomplex dx[], const ARint &incx, - arcomplex dy[], const ARint &incy) { - F77NAME(cswap)(&n, dx, &incx, dy, &incy); -} // swap (arcomplex) - -inline void swap(const ARint &n, arcomplex dx[], const ARint &incx, - arcomplex dy[], const ARint &incy) { - F77NAME(zswap)(&n, dx, &incx, dy, &incy); -} // swap (arcomplex) -#endif - -// AMAX - -inline ARint amax(const ARint &n, const float dx[], const ARint &incx) { - return F77NAME(isamax)(&n, dx, &incx); -} // amax (float) - -inline ARint amax(const ARint &n, const double dx[], const ARint &incx) { - return F77NAME(idamax)(&n, dx, &incx); -} // amax (double) - -#ifdef ARCOMP_H -inline ARint amax(const ARint &n, const arcomplex dx[], - const ARint &incx) { - return F77NAME(icamax)(&n, dx, &incx); -} // amax (arcomplex) - -inline ARint amax(const ARint &n, const arcomplex dx[], - const ARint &incx) { - return F77NAME(izamax)(&n, dx, &incx); -} // amax (arcomplex) -#endif - -// GEMV - -inline void gemv(const char* trans, const ARint &m, const ARint &n, - const float &alpha, const float a[], const ARint &lda, - const float x[], const ARint &incx, const float &beta, - float y[], const ARint &incy) { - F77NAME(sgemv)(trans, &m, &n, &alpha, a, &lda, - x, &incx, &beta, y, &incy); -} // gemv (float) - -inline void gemv(const char* trans, const ARint &m, const ARint &n, - const double &alpha, const double a[], const ARint &lda, - const double x[], const ARint &incx, const double &beta, - double y[], const ARint &incy) { - F77NAME(dgemv)(trans, &m, &n, &alpha, a, &lda, - x, &incx, &beta, y, &incy); -} // gemv (double) - -#ifdef ARCOMP_H -inline void gemv(const char* trans, const ARint &m, - const ARint &n, const arcomplex &alpha, - const arcomplex a[], const ARint &lda, - const arcomplex x[], const ARint &incx, - const arcomplex &beta, arcomplex y[], - const ARint &incy) { - F77NAME(cgemv)(trans, &m, &n, &alpha, a, &lda, - x, &incx, &beta, y, &incy); -} // gemv (arcomplex) - -inline void gemv(const char* trans, const ARint &m, - const ARint &n, const arcomplex &alpha, - const arcomplex a[], const ARint &lda, - const arcomplex x[], const ARint &incx, - const arcomplex &beta, arcomplex y[], - const ARint &incy) { - F77NAME(zgemv)(trans, &m, &n, &alpha, a, &lda, - x, &incx, &beta, y, &incy); -} // gemv (arcomplex) -#endif - -// GBMV - -inline void gbmv(const char* trans, const ARint &m, const ARint &n, - const ARint &kl, const ARint &ku, const float &alpha, - const float a[], const ARint &lda, const float x[], - const ARint &incx, const float &beta, float y[], - const ARint &incy) { - F77NAME(sgbmv)(trans, &m, &n, &kl, &ku, &alpha, a, &lda, - x, &incx, &beta, y, &incy); -} // gbmv (float) - -inline void gbmv(const char* trans, const ARint &m, const ARint &n, - const ARint &kl, const ARint &ku, const double &alpha, - const double a[], const ARint &lda, const double x[], - const ARint &incx, const double &beta, double y[], - const ARint &incy) { - F77NAME(dgbmv)(trans, &m, &n, &kl, &ku, &alpha, a, &lda, - x, &incx, &beta, y, &incy); -} // gbmv (double) - -#ifdef ARCOMP_H -inline void gbmv(const char* trans, const ARint &m, - const ARint &n, const ARint &kl, - const ARint &ku, const arcomplex &alpha, - const arcomplex a[], const ARint &lda, - const arcomplex x[], const ARint &incx, - const arcomplex &beta, arcomplex y[], - const ARint &incy) { - F77NAME(cgbmv)(trans, &m, &n, &kl, &ku, &alpha, a, &lda, - x, &incx, &beta, y, &incy); -} // gbmv (arcomplex) - -inline void gbmv(const char* trans, const ARint &m, - const ARint &n, const ARint &kl, - const ARint &ku, const arcomplex &alpha, - const arcomplex a[], const ARint &lda, - const arcomplex x[], const ARint &incx, - const arcomplex &beta, arcomplex y[], - const ARint &incy) { - F77NAME(zgbmv)(trans, &m, &n, &kl, &ku, &alpha, a, &lda, - x, &incx, &beta, y, &incy); -} // gbmv (arcomplex) -#endif - -// SBMV - -inline void sbmv(const char* uplo, const ARint &n, const ARint &k, - const float &alpha, const float a[], const ARint &lda, - const float x[], const ARint &incx, const float &beta, - float y[], const ARint &incy) { - F77NAME(ssbmv)(uplo, &n, &k, &alpha, a, &lda, x, &incx, &beta, y, &incy); -} // sbmv (float) - -inline void sbmv(const char* uplo, const ARint &n, const ARint &k, - const double &alpha, const double a[], const ARint &lda, - const double x[], const ARint &incx, const double &beta, - double y[], const ARint &incy) { - F77NAME(dsbmv)(uplo, &n, &k, &alpha, a, &lda, x, &incx, &beta, y, &incy); -} // sbmv (double) - - -#endif // BLAS1C_H diff --git a/src/external/arpack++/include/blas1f.h b/src/external/arpack++/include/blas1f.h deleted file mode 100644 index ad0dcaeb..00000000 --- a/src/external/arpack++/include/blas1f.h +++ /dev/null @@ -1,221 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE blas1f.h - BLAS 1 and BLAS 2 FORTRAN routines. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef BLAS1F_H -#define BLAS1F_H - -#include "arch.h" - -extern "C" -{ - - // Single precision real routines. - - float F77NAME(sasum)(const ARint *n, const float *dx, const ARint *incx); - - void F77NAME(saxpy)(const ARint *n, const float *da, const float *dx, - const ARint *incx, float *dy, const ARint *incy); - - void F77NAME(scopy)(const ARint *n, const float *dx, const ARint *incx, - float *dy, const ARint *incy); - - float F77NAME(sdot)(const ARint *n, const float *dx, const ARint *incx, - const float *dy, const ARint *incy); - - float F77NAME(snrm2)(const ARint *n, const float *dx, const ARint *incx); - - void F77NAME(srot)(const ARint *n, float *dx, const ARint *incx, float *dy, - const ARint *incy, const float *c, const float *s); - - void F77NAME(srotg)(float *da, float *db, float *c, float *s); - - void F77NAME(sscal)(const ARint *n, float *da, float *dx, const ARint *incx); - - void F77NAME(sswap)(const ARint *n, float *dx, const ARint *incx, - float *dy, const ARint *incy); - - ARint F77NAME(isamax)(const ARint *n, const float *dx, const ARint *incx); - - void F77NAME(sgemv)(const char* trans, const ARint *m, const ARint *n, - const float *alpha, const float *a, const ARint *lda, - const float *x, const ARint *incx, const float *beta, - float *y, const ARint *incy); - - void F77NAME(sgbmv)(const char* trans, const ARint *m, const ARint *n, - const ARint *kl, const ARint *ku, const float *alpha, - const float *a, const ARint *lda, const float *x, - const ARint *incx, const float *beta, float *y, - const ARint *incy); - - void F77NAME(ssbmv)(const char* uplo, const ARint *n, const ARint *k, - const float *alpha, const float *a, const ARint *lda, - const float *x, const ARint *incx, const float *beta, - float *y, const ARint *incy); - -// Double precision real routines. - - double F77NAME(dasum)(const ARint *n, const double *dx, const ARint *incx); - - void F77NAME(daxpy)(const ARint *n, const double *da, const double *dx, - const ARint *incx, double *dy, const ARint *incy); - - void F77NAME(dcopy)(const ARint *n, const double *dx, const ARint *incx, - double *dy, const ARint *incy); - - double F77NAME(ddot)(const ARint *n, const double *dx, const ARint *incx, - const double *dy, const ARint *incy); - - double F77NAME(dnrm2)(const ARint *n, const double *dx, const ARint *incx); - - void F77NAME(drot)(const ARint *n, double *dx, const ARint *incx, double *dy, - const ARint *incy, const double *c, const double *s); - - void F77NAME(drotg)(double *da, double *db, double *c, double *s); - - void F77NAME(dscal)(const ARint *n, double *da, double *dx, const ARint *incx); - - void F77NAME(dswap)(const ARint *n, double *dx, const ARint *incx, - double *dy, const ARint *incy); - - ARint F77NAME(idamax)(const ARint *n, const double *dx, const ARint *incx); - - void F77NAME(dgemv)(const char* trans, const ARint *m, const ARint *n, - const double *alpha, const double *a, const ARint *lda, - const double *x, const ARint *incx, const double *beta, - double *y, const ARint *incy); - - void F77NAME(dgbmv)(const char* trans, const ARint *m, const ARint *n, - const ARint *kl, const ARint *ku, const double *alpha, - const double *a, const ARint *lda, const double *x, - const ARint *incx, const double *beta, double *y, - const ARint *incy); - - void F77NAME(dsbmv)(const char* uplo, const ARint *n, const ARint *k, - const double *alpha, const double *a, const ARint *lda, - const double *x, const ARint *incx, const double *beta, - double *y, const ARint *incy); - - // Single precision complex routines. - -#ifdef ARCOMP_H - - void F77NAME(cdotc)(arcomplex *c, const ARint *n, - const arcomplex *cx, const ARint *incx, - const arcomplex *cy, const ARint *incy); - - void F77NAME(cdotu)(arcomplex *c, const ARint *n, - const arcomplex *cx, const ARint *incx, - const arcomplex *cy, const ARint *incy); - - void F77NAME(caxpy)(const ARint *n, const arcomplex *da, - const arcomplex *dx, const ARint *incx, - arcomplex *dy, const ARint *incy); - - void F77NAME(ccopy)(const ARint *n, const arcomplex *dx, - const ARint *incx, arcomplex *dy, - const ARint *incy); - - float F77NAME(scasum)(const ARint *n, const arcomplex *dx, - const ARint *incx); - - float F77NAME(scnrm2)(const ARint *n, const arcomplex *dx, - const ARint *incx); - - void F77NAME(csscal)(const ARint *n, const float *da, arcomplex *dx, - const ARint *incx); - - void F77NAME(cscal)(const ARint *n, const arcomplex *da, - arcomplex *dx, const ARint *incx); - - ARint F77NAME(icamax)(const ARint *n, const arcomplex *dx, - const ARint *incx); - - void F77NAME(cswap)(const ARint *n, arcomplex *dx, - const ARint *incx, arcomplex *dy, - const ARint *incy); - - void F77NAME(cgemv)(const char* trans, const ARint *m, - const ARint *n, const arcomplex *alpha, - const arcomplex *a, const ARint *lda, - const arcomplex *x, const ARint *incx, - const arcomplex *beta, arcomplex *y, - const ARint *incy); - - void F77NAME(cgbmv)(const char* trans, const ARint *m, - const ARint *n, const ARint *kl, - const ARint *ku, const arcomplex *alpha, - const arcomplex *a, const ARint *lda, - const arcomplex *x, const ARint *incx, - const arcomplex *beta, arcomplex *y, - const ARint *incy); - - // Double precision complex routines. - - void F77NAME(zdotc)(arcomplex *c, const ARint *n, - const arcomplex *cx, const ARint *incx, - const arcomplex *cy, const ARint *incy); - - void F77NAME(zdotu)(arcomplex *c, const ARint *n, - const arcomplex *cx, const ARint *incx, - const arcomplex *cy, const ARint *incy); - - void F77NAME(zaxpy)(const ARint *n, const arcomplex *da, - const arcomplex *dx, const ARint *incx, - arcomplex *dy, const ARint *incy); - - void F77NAME(zcopy)(const ARint *n, const arcomplex *dx, - const ARint *incx, arcomplex *dy, - const ARint *incy); - - double F77NAME(dzasum)(const ARint *n, const arcomplex *dx, - const ARint *incx); - - double F77NAME(dznrm2)(const ARint *n, const arcomplex *dx, - const ARint *incx); - - void F77NAME(zdscal)(const ARint *n, const double *da, arcomplex *dx, - const ARint *incx); - - void F77NAME(zscal)(const ARint *n, const arcomplex *da, - arcomplex *dx, const ARint *incx); - - ARint F77NAME(izamax)(const ARint *n, const arcomplex *dx, - const ARint *incx); - - void F77NAME(zswap)(const ARint *n, arcomplex *dx, - const ARint *incx, arcomplex *dy, - const ARint *incy); - - void F77NAME(zgemv)(const char* trans, const ARint *m, - const ARint *n, const arcomplex *alpha, - const arcomplex *a, const ARint *lda, - const arcomplex *x, const ARint *incx, - const arcomplex *beta, arcomplex *y, - const ARint *incy); - - void F77NAME(zgbmv)(const char* trans, const ARint *m, - const ARint *n, const ARint *kl, - const ARint *ku, const arcomplex *alpha, - const arcomplex *a, const ARint *lda, - const arcomplex *x, const ARint *incx, - const arcomplex *beta, arcomplex *y, - const ARint *incy); - -#endif // ARCOMP_H - -} -#endif // BLAS1F_H - diff --git a/src/external/arpack++/include/caupp.h b/src/external/arpack++/include/caupp.h deleted file mode 100644 index 3bc97c28..00000000 --- a/src/external/arpack++/include/caupp.h +++ /dev/null @@ -1,320 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE caupp.h. - Interface to ARPACK subroutines znaupd and cnaupd. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef CAUPP_H -#define CAUPP_H - -#include -#include "arch.h" -#include "arpackf.h" - -inline void caupp(ARint& ido, char bmat, ARint n, const std::string& which, ARint nev, - double& tol, arcomplex resid[], ARint ncv, - arcomplex V[], ARint ldv, ARint iparam[], - ARint ipntr[], arcomplex workd[], - arcomplex workl[], ARint lworkl, double rwork[], - ARint& info) - -/* - c++ version of ARPACK routine znaupd that implements the - Reverse communication interface for the Implicitly Restarted Arnoldi - iteration. This is intended to be used to find a few eigenpairs of a - complex linear operator OP with respect to a semi-inner product defined - by a hermitian positive semi-definite real matrix B. B may be the - identity matrix. NOTE: if both OP and B are real, then naupp should - be used. - - The computed approximate eigenvalues are called Ritz values and - the corresponding approximate eigenvectors are called Ritz vectors. - - caupp is usually called iteratively to solve one of the - following problems: - - Mode 1: A*x = lambda*x. - ===> OP = A and B = I. - - Mode 2: A*x = lambda*M*x, M symmetric positive definite - ===> OP = inv[M]*A and B = M. - ===> (If M can be factored see remark 3 below) - - Mode 3: A*x = lambda*M*x, M symmetric semi-definite - ===> OP = inv[A - sigma*M]*M and B = M. - ===> shift-and-invert mode - If OP*x = amu*x, then lambda = sigma + 1/amu. - - - NOTE: The action of w <- inv[A - sigma*M]*v or w <- inv[M]*v - should be accomplished either by a direct method - using a sparse matrix factorization and solving - - [A - sigma*M]*w = v or M*w = v, - - or through an iterative method for solving these systems. If - an iterative method is used, the convergence test must be more - stringent than the accuracy requirements for the eigenvalue - approximations. - - Parameters: - - ido (Input / Output) Reverse communication flag. ido must be - zero on the first call to caupp. ido will be set - internally to indicate the type of operation to be - performed. Control is then given back to the calling - routine which has the responsibility to carry out the - requested operation and call caupp with the result. The - operand is given in workd[ipntr[1]], the result must be - put in workd[ipntr[2]]. - ido = 0: first call to the reverse communication interface. - ido = -1: compute Y = OP * X where - ipntr[1] is the pointer into workd for X, - ipntr[2] is the pointer into workd for Y. - This is for the initialization phase to force the - starting vector into the range of OP. - ido = 1: compute Y = OP * X where - ipntr[1] is the pointer into workd for X, - ipntr[2] is the pointer into workd for Y. - In mode 3 and 4, the vector B * X is already - available in workd[ipntr[3]]. It does not - need to be recomputed in forming OP * X. - ido = 2: compute Y = B * X where - ipntr[1] is the pointer into workd for X, - ipntr[2] is the pointer into workd for Y. - ido = 3: compute the iparam[8] real and imaginary parts - of the shifts where inptr[14] is the pointer - into workl for placing the shifts. See Remark - 5 below. - ido = 99: done. - bmat (Input) bmat specifies the type of the matrix B that defines - the semi-inner product for the operator OP. - bmat = 'I' -> standard eigenvalue problem A*x = lambda*x; - bmat = 'G' -> generalized eigenvalue problem A*x = lambda*M*x. - n (Input) Dimension of the eigenproblem. - nev (Input) Number of eigenvalues to be computed. 0 < nev <= n-1. - which (Input) Specify which of the Ritz values of OP to compute. - 'LM' - compute the nev eigenvalues of largest magnitude. - 'SM' - compute the nev eigenvalues of smallest magnitude. - 'LR' - compute the nev eigenvalues of largest real part. - 'SR' - compute the nev eigenvalues of smallest real part. - 'LI' - compute the nev eigenvalues of largest imaginary part. - 'SI' - compute the nev eigenvalues of smallest imaginary part. - tol (Input) Stopping criterion: the relative accuracy of the - Ritz value is considered acceptable if BOUNDS[i] <= - tol*abs(RITZ[i]),where ABS(RITZ[i]) is the magnitude when - RITZ[i] is complex. If tol<=0.0 is passed, the machine - precision as computed by the LAPACK auxiliary subroutine - _LAMCH is used. - resid (Input / Output) Array of length n. - On input: - If info==0, a random initial residual vector is used. - If info!=0, resid contains the initial residual vector, - possibly from a previous run. - On output: - resid contains the final residual vector. - ncv (Input) Number of Arnoldi vectors that are generated at each - iteration. After the startup phase in which nev Arnoldi - vectors are generated, the algorithm generates ncv-nev - Arnoldi vectors at each subsequent update iteration. Most of - the cost in generating each Arnoldi vector is in the - matrix-vector product OP*x. - NOTE: ncv must satisfy nev+1 <= ncv <= n. - V (Output) Array of length ncv*n+1. V contains the ncv Arnoldi - basis vectors. The first element V[0] is never referenced. - ldv (Input) Dimension of the basis vectors contained in V. This - parameter MUST be set to n. - iparam (Input / Output) Array of length 12. - iparam[1] = ISHIFT: method for selecting the implicit shifts. - The shifts selected at each iteration are used to restart - the Arnoldi iteration in an implicit fashion. - ------------------------------------------------------------- - ISHIFT = 0: the shifts are to be provided by the user via - reverse communication. The ncv eigenvalues of - the Hessenberg matrix H are returned in the part - of workl array corresponding to RITZ. - ISHIFT = 1: exact shifts with respect to the current - Hessenberg matrix H. This is equivalent to - restarting the iteration from the beginning - after updating the starting vector with a linear - combination of Ritz vectors associated with the - "wanted" eigenvalues. - ISHIFT = 2: other choice of internal shift to be defined. - ------------------------------------------------------------- - iparam[2] is no longer referenced. - iparam[3] = MXITER - On INPUT: maximum number of Arnoldi update iterations allowed. - On OUTPUT: actual number of Arnoldi update iterations taken. - iparam[4] = NB: blocksize to be used in the recurrence. - The code currently works only for NB = 1. - iparam[5] = NCONV: number of "converged" Ritz values. - This represents the number of Ritz values that satisfy - the convergence criterion. - iparam[6] is no longer referenced. - iparam[7] = MODE. On input determines what type of - eigenproblem is being solved. Must be 1, 2 or 3. - iparam[8] = NP. When ido = 3 and the user provides shifts - through reverse communication (iparam[1]=0), caupp returns - NP, the number of shifts the user is to provide. - 0 < NP <=ncv-nev. See Remark 5 below. - iparam[9] = total number of OP*x operations. - iparam[10] = total number of B*x operations if bmat='G'. - iparam[11] = total number of steps of re-orthogonalization. - ipntr (Output) Array of length 15. Pointer to mark the starting - locations in the workd and workl arrays for matrices/vectors - used by the Arnoldi iteration. - ipntr[1] : pointer to the current operand vector X in workd. - ipntr[2] : pointer to the current result vector Y in workd. - ipntr[3] : pointer to the vector B * X in workd when used in - the shift-and-invert mode. - ipntr[4] : pointer to the next available location in workl - that is untouched by the program. - ipntr[5] : pointer to the ncv by ncv upper Hessenberg matrix - H in workl. - ipntr[6] : pointer to the ritz value array RITZ. - ipntr[7] : pointer to the (projected) ritz vector array Q. - ipntr[8] : pointer to the error BOUNDS array in workl. - ipntr[14]: pointer to the NP shifts in workl. See Remark 5. - Note: ipntr[9:13] is only referenced by ceupp. See Remark 2. - ipntr[9] : pointer to the ncv RITZ values of the - original system. - ipntr[10]: Not Used - ipntr[11]: pointer to the ncv corresponding error bounds. - ipntr[12]: pointer to the ncv by ncv upper triangular - Schur matrix for H. - ipntr[13]: pointer to the ncv by ncv matrix of eigenvectors - of the upper Hessenberg matrix H. Only referenced by - ceupp if RVEC = true. See Remark 2 below. - workd (Input / Output) Array of length 3*n+1. - Distributed array to be used in the basic Arnoldi iteration - for reverse communication. The user should not use workd as - temporary workspace during the iteration. - workl (Output) Array of length lworkl+1. Private (replicated) array - on each PE or array allocated on the front end. - lworkl (Input) lworkl must be at least 3*ncv*ncv+5*ncv. - RWORK (Workspace) Array of length ncv. Private (replicated) array on - each PE or array allocated on the front end. - info (Input / Output) On input, if info = 0, a randomly initial - residual vector is used, otherwise resid contains the initial - residual vector, possibly from a previous run. - On output, info works as a error flag: - = 0 : Normal exit. - = 1 : Maximum number of iterations taken. All possible - eigenvalues of OP has been found. iparam[5] - returns the number of wanted converged Ritz values. - = 3 : No shifts could be applied during a cycle of the - Implicitly restarted Arnoldi iteration. One - possibility is to increase the size of ncv relative - to nev. See remark 4 below. - = -1 : n must be positive. - = -2 : nev must be positive. - = -3 : ncv must satisfy nev+1 <= ncv <= n. - = -4 : The maximum number of Arnoldi update iterations - allowed must be greater than zero. - = -5 : which must be one of 'LM','SM','LR','SR','LI','SI'. - = -6 : bmat must be one of 'I' or 'G'. - = -7 : Length of private work array is not sufficient. - = -8 : Error return from LAPACK eigenvalue calculation. - = -9 : Starting vector is zero. - = -10 : iparam[7] must be 1, 2 or 3. - = -11 : iparam[7] = 1 and bmat = 'G' are incompatible. - = -12 : iparam[1] must be equal to 0 or 1. - = -13 : nev and which = 'BE' are incompatible. - = -9999: Could not build an Arnoldi factorization. iparam[5] - returns the size of the current Arnoldi factorization. - The user is advised to check that enough workspace - and array storage has been allocated. - - Remarks: - 1. The computed Ritz values are approximate eigenvalues of OP. The - selection of "which" should be made with this in mind when using - Mode = 3. When operating in Mode = 3 setting which = 'LM' will - compute the nev eigenvalues of the original problem that are - closest to the shift sigma . After convergence, approximate - eigenvalues of the original problem may be obtained with the - ARPACK subroutine ceupp. - 2. If a basis for the invariant subspace corresponding to the converged - Ritz values is needed, the user must call ceupp immediately following - completion of caupp. This is new starting with release 2 of ARPACK. - 3. If M can be factored into a Cholesky factorization M = LL' - then Mode = 2 should not be selected. Instead one should use - Mode = 1 with OP = inv(L)*A*inv(L'). Appropriate triangular - linear systems should be solved with L and L' rather - than computing inverses. After convergence, an approximate - eigenvector z of the original problem is recovered by solving - L'z = x where x is a Ritz vector of OP. - 4. At present there is no a-priori analysis to guide the selection - of ncv relative to nev. The only formal requrement is that ncv - >= nev + 1. However, it is recommended that ncv >= 2*nev. If many - problems of the same type are to be solved, one should experiment - with increasing ncv while keeping nev fixed for a given test - problem. This will usually decrease the required number of OP*x - operations but it also increases the work and storage required to - maintain the orthogonal basis vectors. The optimal "cross-over" - with respect to CPU time is problem dependent and must be - determined empirically. - 5. When iparam[1] = 0, and ido = 3, the user needs to provide the - NP = iparam[8] complex shifts in locations - workl[ipntr[14]], workl[ipntr[14]+1], ... , workl[ipntr[14]+NP]. - Eigenvalues of the current upper Hessenberg matrix are located in - workl[ipntr[6]] through workl[ipntr[6]+ncv-1]. They are ordered - according to the order defined by "which". The associated Ritz - estimates are located in workl[ipntr[8]], workl[ipntr[8]+1], ..., - workl[ipntr[8]+ncv-1]. - - References: - 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in - a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), - pp 357-385. - 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly - Restarted Arnoldi Iteration", Rice University Technical Report - TR95-13, Department of Computational and Applied Mathematics. - 3. B.N. Parlett & Y. Saad, "_Complex_ Shift and Invert Strategies for - Double precision Matrices", Linear Algebra and its Applications, - vol 88/89, pp 575-595, (1987). -*/ - -{ - - F77NAME(znaupd)(&ido, &bmat, &n, which.c_str(), &nev, &tol, resid, &ncv, - &V[1], &ldv, &iparam[1], &ipntr[1], &workd[1], - &workl[1], &lworkl, &rwork[1], &info); - -} // caupp (arcomplex). - -inline void caupp(ARint& ido, char bmat, ARint n, const std::string& which, ARint nev, - float& tol, arcomplex resid[], ARint ncv, - arcomplex V[], ARint ldv, ARint iparam[], - ARint ipntr[], arcomplex workd[], - arcomplex workl[], ARint lworkl, float rwork[], - ARint& info) - -/* - c++ version of ARPACK routine cnaupd. The only difference between - cnaupd and znaupd is that in the former function all vectors have - single precision elements and in the latter all vectors have double - precision elements. -*/ - -{ - - F77NAME(cnaupd)(&ido, &bmat, &n, which.c_str(), &nev, &tol, resid, &ncv, - &V[1], &ldv, &iparam[1], &ipntr[1], &workd[1], - &workl[1], &lworkl, &rwork[1], &info); - -} // caupp (arcomplex). - -#endif // CAUPP_H - - - diff --git a/src/external/arpack++/include/ceupp.h b/src/external/arpack++/include/ceupp.h deleted file mode 100644 index b8dc8865..00000000 --- a/src/external/arpack++/include/ceupp.h +++ /dev/null @@ -1,224 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE ceupp.h. - Interface to ARPACK subroutines zneupd and cneupd. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef CEUPP_H -#define CEUPP_H - -#include -#include -#include "arch.h" -#include "arpackf.h" - -inline void ceupp(bool rvec, char HowMny, arcomplex d[], - arcomplex Z[], ARint ldz, arcomplex sigma, - arcomplex workev[], char bmat, ARint n, const std::string& which, - ARint nev, double tol, arcomplex resid[], ARint ncv, - arcomplex V[], ARint ldv, ARint iparam[], - ARint ipntr[], arcomplex workd[], - arcomplex workl[], ARint lworkl, double rwork[], - ARint& info) - -/* - c++ version of ARPACK routine zneupd. - This subroutine returns the converged approximations to eigenvalues - of A*z = lambda*B*z and (optionally): - - (1) the corresponding approximate eigenvectors, - (2) an orthonormal basis for the associated approximate - invariant subspace, - - There is negligible additional cost to obtain eigenvectors. An - orthonormal basis is always computed. There is an additional storage cost - of n*nev if both are requested (in this case a separate array Z must be - supplied). - The approximate eigenvalues and eigenvectors of A*z = lambda*B*z - are derived from approximate eigenvalues and eigenvectors of - of the linear operator OP prescribed by the MODE selection in the - call to caupp. caupp must be called before this routine is called. - These approximate eigenvalues and vectors are commonly called Ritz - values and Ritz vectors respectively. They are referred to as such - in the comments that follow. The computed orthonormal basis for the - invariant subspace corresponding to these Ritz values is referred to - as a Schur basis. - See documentation in the header of the subroutine caupp for - definition of OP as well as other terms and the relation of computed - Ritz values and Ritz vectors of OP with respect to the given problem - A*z = lambda*B*z. For a brief description, see definitions of - iparam[7], MODE and which in the documentation of caupp. - - Parameters: - - rvec (Input) Specifies whether a basis for the invariant subspace - corresponding to the converged Ritz value approximations for - the eigenproblem A*z = lambda*B*z is computed. - rvec = false: Compute Ritz values only. - rvec = true : Compute the Ritz vectors or Schur vectors. - See Remarks below. - HowMny (Input) Specifies the form of the basis for the invariant - subspace corresponding to the converged Ritz values that - is to be computed. - = 'A': Compute nev Ritz vectors; - = 'P': Compute nev Schur vectors; - d (Output) Array of dimension nev+1. D contains the Ritz - approximations to the eigenvalues lambda for A*z = lambda*B*z. - Z (Output) Array of dimension nev*n. If rvec = TRUE. and - HowMny = 'A', then Z contains approximate eigenvectors (Ritz - vectors) corresponding to the NCONV=iparam[5] Ritz values for - eigensystem A*z = lambda*B*z. - If rvec = .FALSE. or HowMny = 'P', then Z is not referenced. - NOTE: If if rvec = .TRUE. and a Schur basis is not required, - the array Z may be set equal to first nev+1 columns of - the Arnoldi basis array V computed by caupp. In this - case the Arnoldi basis will be destroyed and overwritten - with the eigenvector basis. - ldz (Input) Dimension of the vectors contained in Z. This - parameter MUST be set to n. - sigma (Input) If iparam[7] = 3, sigma represents the shift. Not - referenced if iparam[7] = 1 or 2. - workv (Workspace) Array of dimension 2*ncv. - V (Input/Output) Array of dimension n*ncv+1. - Upon Input: V contains the ncv vectors of the Arnoldi basis - for OP as constructed by caupp. - Upon Output: If rvec = TRUE the first NCONV=iparam[5] columns - contain approximate Schur vectors that span the - desired invariant subspace. - NOTE: If the array Z has been set equal to first nev+1 columns - of the array V and rvec = TRUE. and HowMny = 'A', then - the Arnoldi basis held by V has been overwritten by the - desired Ritz vectors. If a separate array Z has been - passed then the first NCONV=iparam[5] columns of V will - contain approximate Schur vectors that span the desired - invariant subspace. - workl (Input / Output) Array of length lworkl+1. - workl[1:ncv*ncv+3*ncv] contains information obtained in - caupp. They are not changed by ceupp. - workl[ncv*ncv+3*ncv+1:3*ncv*ncv+4*ncv] holds the untransformed - Ritz values, the untransformed error estimates of the Ritz - values, the upper triangular matrix for H, and the associated - matrix representation of the invariant subspace for H. - ipntr (Input / Output) Array of length 14. Pointer to mark the - starting locations in the workl array for matrices/vectors - used by caupp and ceupp. - ipntr[9]: pointer to the ncv RITZ values of the original - system. - ipntr[11]: pointer to the ncv corresponding error estimates. - ipntr[12]: pointer to the ncv by ncv upper triangular - Schur matrix for H. - ipntr[13]: pointer to the ncv by ncv matrix of eigenvectors - of the upper Hessenberg matrix H. Only referenced - by ceupp if rvec = TRUE. See Remark 2 below. - info (Output) Error flag. - = 0 : Normal exit. - = 1 : The Schur form computed by LAPACK routine csheqr - could not be reordered by LAPACK routine ztrsen. - Re-enter subroutine ceupp with iparam[5] = ncv and - increase the size of the array D to have - dimension at least dimension ncv and allocate at least - ncv columns for Z. NOTE: Not necessary if Z and V share - the same space. Please notify the authors if this error - occurs. - = -1 : n must be positive. - = -2 : nev must be positive. - = -3 : ncv must satisfy nev+1 <= ncv <= n. - = -5 : which must be one of 'LM','SM','LR','SR','LI','SI'. - = -6 : bmat must be one of 'I' or 'G'. - = -7 : Length of private work workl array is not sufficient. - = -8 : Error return from LAPACK eigenvalue calculation. - This should never happened. - = -9 : Error return from calculation of eigenvectors. - Informational error from LAPACK routine ztrevc. - = -10: iparam[7] must be 1, 2 or 3. - = -11: iparam[7] = 1 and bmat = 'G' are incompatible. - = -12: HowMny = 'S' not yet implemented. - = -13: HowMny must be one of 'A' or 'P' if rvec = TRUE. - = -14: caupp did not find any eigenvalues to sufficient - accuracy. - - NOTE: The following arguments - - bmat, n, which, nev, tol, resid, ncv, V, ldv, iparam, - ipntr, workd, workl, lworkl, rwork, info - - must be passed directly to ceupp following the last call - to caupp. These arguments MUST NOT BE MODIFIED between - the the last call to caupp and the call to ceupp. - - Remarks - 1. Currently only HowMny = 'A' and 'P' are implemented. - 2. Schur vectors are an orthogonal representation for the basis of - Ritz vectors. Thus, their numerical properties are often superior. - Let X' denote the transpose of X. If rvec = .TRUE. then the - relationship A * V[:,1:iparam[5]] = V[:,1:iparam[5]] * T, and - V[:,1:iparam[5]]' * V[:,1:iparam[5]] = I are approximately satisfied. - Here T is the leading submatrix of order iparam[5] of the real - upper quasi-triangular matrix stored workl[ipntr[12]]. -*/ - -{ - - ARint irvec; - ARlogical* iselect; - arcomplex* iZ; - - irvec = (ARint) rvec; - iselect = new ARlogical[ncv]; - iZ = (Z == NULL) ? &V[1] : Z; - - F77NAME(zneupd)(&irvec, &HowMny, iselect, d, iZ, &ldz, &sigma, - &workev[1], &bmat, &n, which.c_str(), &nev, &tol, resid, - &ncv, &V[1], &ldv, &iparam[1], &ipntr[1], - &workd[1], &workl[1], &lworkl, &rwork[1], &info); - - delete[] iselect; - -} // ceupp (arcomplex). - -inline void ceupp(bool rvec, char HowMny, arcomplex d[], - arcomplex Z[], ARint ldz, arcomplex sigma, - arcomplex workev[], char bmat, ARint n, const std::string& which, - ARint nev, float tol, arcomplex resid[], ARint ncv, - arcomplex V[], ARint ldv, ARint iparam[], - ARint ipntr[], arcomplex workd[], - arcomplex workl[], ARint lworkl, float rwork[], - ARint& info) - -/* - c++ version of ARPACK routine cneupd. The only difference between - cneupd and zneupd is that in the former function all vectors have - single precision elements and in the latter all vectors have double - precision elements. -*/ - -{ - - ARint irvec; - ARlogical* iselect; - arcomplex* iZ; - - irvec = (ARint) rvec; - iselect = new ARlogical[ncv]; - iZ = (Z == NULL) ? &V[1] : Z; - - F77NAME(cneupd)(&irvec, &HowMny, iselect, d, iZ, &ldz, &sigma, - &workev[1], &bmat, &n, which.c_str(), &nev, &tol, resid, - &ncv, &V[1], &ldv, &iparam[1], &ipntr[1], - &workd[1], &workl[1], &lworkl, &rwork[1], &info); - - delete[] iselect; - -} // ceupp (arcomplex). - -#endif // CEUPP_H diff --git a/src/external/arpack++/include/cholmodc.h b/src/external/arpack++/include/cholmodc.h deleted file mode 100644 index f1300cbb..00000000 --- a/src/external/arpack++/include/cholmodc.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE CHOLMODc.h. - Interface to CHOLMOD routines. - - Author of this class: - Martin Reuter - Date 11/05/2012 - - Arpack++ Author: - Francisco Gomes - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef CHOLMODC_H -#define CHOLMODC_H - -#include "cholmod.h" -#include - -inline void Write_Cholmod_Sparse_Matrix(const std::string & fname, - cholmod_sparse* A, cholmod_common *c) -{ - std::ofstream myfile; - myfile.open ( fname.c_str() ); - cholmod_triplet * T = cholmod_sparse_to_triplet(A,c); - //std::cout << " [ " << std::endl; - myfile.precision(20); - for (unsigned int i=0;innz;i++) - { - myfile << ((int*)T->i)[i]+1 << " " << ((int*)T->j)[i]+1 << " " << ((double*)T->x)[i] << std::endl; - } - //std::cout << " ] " << std::endl; - myfile.close(); - - cholmod_free_triplet(&T,c); - -} - -// Create_Cholmod_Sparse_Matrix -inline cholmod_sparse* Create_Cholmod_Sparse_Matrix(int m, int n, int nnz, - double* a, int* irow, int* pcol, char uplo, cholmod_common *c) -{ - - cholmod_sparse* A = new cholmod_sparse; - A->nrow = m; - A->ncol = n; - A->nzmax = nnz; - A->p = pcol; - A->i = irow; - A->nz = NULL; - A->x = a; - A->z = NULL; - if (uplo == 'L') A->stype = -1; - else A->stype = 1; - A->itype = CHOLMOD_INT; - A->xtype = CHOLMOD_REAL; // real - A->dtype = CHOLMOD_DOUBLE; // double - A->sorted = 0; - A->packed = 1; - - return A; - - -/* double* hd = new double[nnz]; - int* hi = new int[nnz]; - int* hp = new int[n+1]; - - int col,j; - int counter=0; - int counter2=0; - for (col=0;col= col) ||(uplo == 'U' && row <= col)) - { - hd[counter2] = a[counter]; - hi[counter2] = irow[counter]; - counter2++; - //std::cout << " In : " << std::flush; - } - //else std::cout << " Out : " << std::flush; - - //std::cout << row+1 << " " << col+1 << " " << a[counter] << std::endl; - counter++; - } - - } - hp[n] = counter2; - - - cholmod_sparse* A = new cholmod_sparse; - A->nrow = m; - A->ncol = n; - A->nzmax = counter2; - A->p = hp; - A->i = hi; - A->nz = NULL; - A->x = hd; - A->z = NULL; - if (uplo == 'L') A->stype = -1; - else A->stype = 1; - A->itype = CHOLMOD_INT; - A->xtype = CHOLMOD_REAL; // real - A->dtype = CHOLMOD_DOUBLE; // double - A->sorted = 0; - A->packed = 1; - - //cholmod_sparse* As = cholmod_copy_sparse(A,c); - - return A;*/ - -} // Create_Cholmod_Sparse_Matrix (double). - -// Create_Cholmod_Dense_Matrix (from Triplet) -inline cholmod_dense* Create_Cholmod_Dense_Matrix(int m, int n, - double* a, cholmod_common *c) -{ - - - cholmod_dense* A = new cholmod_dense; - A->nrow = m; - A->ncol = n; - A->nzmax = m*n; - A->d = m; - A->x = a; - A->z = NULL; - A->xtype = CHOLMOD_REAL; // real - A->dtype = CHOLMOD_DOUBLE; // double - -// cholmod_dense* As = cholmod_copy_dense(A,c); - - return A; - -} // Create_Cholmod_Dense_Matrix (double). - -// Create_Cholmod_Dense_Matrix (from Triplet) -inline void Get_Cholmod_Dense_Data(cholmod_dense* A, int n, double* a) -{ - memcpy(a,A->x,n*sizeof(double)); - -// for (int i = 0;ix)[i]; - -} // Create_Cholmod_Dense_Matrix (double). - - - -#endif // CHOLMODC_H diff --git a/src/external/arpack++/include/debug.h b/src/external/arpack++/include/debug.h deleted file mode 100644 index 2ceab437..00000000 --- a/src/external/arpack++/include/debug.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE debug.h. - Interface to ARPACK FORTRAN debugging facilities. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef DEBUG_H -#define DEBUG_H - -#include "arch.h" -#include "arpackf.h" - - -inline void TraceOff() - -/* - This function sets all ARPACK FORTRAN debug variables to zero. -*/ - -{ - - F77NAME(debug).logfil = 6; - F77NAME(debug).ndigit = 0; - F77NAME(debug).mgetv0 = 0; - F77NAME(debug).msaupd = 0; - F77NAME(debug).msaup2 = 0; - F77NAME(debug).msaitr = 0; - F77NAME(debug).mseigt = 0; - F77NAME(debug).msapps = 0; - F77NAME(debug).msgets = 0; - F77NAME(debug).mseupd = 0; - F77NAME(debug).mnaupd = 0; - F77NAME(debug).mnaup2 = 0; - F77NAME(debug).mnaitr = 0; - F77NAME(debug).mneigt = 0; - F77NAME(debug).mnapps = 0; - F77NAME(debug).mngets = 0; - F77NAME(debug).mneupd = 0; - F77NAME(debug).mcaupd = 0; - F77NAME(debug).mcaup2 = 0; - F77NAME(debug).mcaitr = 0; - F77NAME(debug).mceigt = 0; - F77NAME(debug).mcapps = 0; - F77NAME(debug).mcgets = 0; - F77NAME(debug).mceupd = 0; - -} // TraceOff. - - -inline void sTraceOn(const ARint digit, const ARint getv0, const ARint aupd, - const ARint aup2, const ARint aitr, const ARint eigt, - const ARint apps, const ARint gets, const ARint eupd) - -/* - This function sets the values of all ARPACK FORTRAN debug - variables corresponding to real symmetric eigenvalue problems. -*/ - -{ - - F77NAME(debug).logfil = 6; - F77NAME(debug).ndigit = digit; - F77NAME(debug).mgetv0 = getv0; - F77NAME(debug).msaupd = aupd; - F77NAME(debug).msaup2 = aup2; - F77NAME(debug).msaitr = aitr; - F77NAME(debug).mseigt = eigt; - F77NAME(debug).msapps = apps; - F77NAME(debug).msgets = gets; - F77NAME(debug).mseupd = eupd; - -} // sTraceOn. - - -inline void nTraceOn(const ARint digit, const ARint getv0, const ARint aupd, - const ARint aup2, const ARint aitr, const ARint eigt, - const ARint apps, const ARint gets, const ARint eupd) - -/* - This function sets the values of all ARPACK FORTRAN debug - variables corresponding to real nonsymmetric eigenvalue problems. -*/ - -{ - - F77NAME(debug).logfil = 6; - F77NAME(debug).ndigit = digit; - F77NAME(debug).mgetv0 = getv0; - F77NAME(debug).mnaupd = aupd; - F77NAME(debug).mnaup2 = aup2; - F77NAME(debug).mnaitr = aitr; - F77NAME(debug).mneigt = eigt; - F77NAME(debug).mnapps = apps; - F77NAME(debug).mngets = gets; - F77NAME(debug).mneupd = eupd; - -} // nTraceOn. - - -inline void cTraceOn(const ARint digit, const ARint getv0, const ARint aupd, - const ARint aup2, const ARint aitr, const ARint eigt, - const ARint apps, const ARint gets, const ARint eupd) - -/* - This function sets the values of all ARPACK FORTRAN debug - variables corresponding to complex eigenvalue problems. -*/ - -{ - - F77NAME(debug).logfil = 6; - F77NAME(debug).ndigit = digit; - F77NAME(debug).mgetv0 = getv0; - F77NAME(debug).mcaupd = aupd; - F77NAME(debug).mcaup2 = aup2; - F77NAME(debug).mcaitr = aitr; - F77NAME(debug).mceigt = eigt; - F77NAME(debug).mcapps = apps; - F77NAME(debug).mcgets = gets; - F77NAME(debug).mceupd = eupd; - -} // cTraceOn. - - -#endif // DEBUG_H diff --git a/src/external/arpack++/include/lapackc.h b/src/external/arpack++/include/lapackc.h deleted file mode 100644 index 47dd05bc..00000000 --- a/src/external/arpack++/include/lapackc.h +++ /dev/null @@ -1,306 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE lapackc.h. - Interface to LAPACK FORTRAN routines. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#include "arch.h" -#include "lapackf.h" - -#ifndef LAPACKC_H -#define LAPACKC_H - - -// LAPY2 - -inline float lapy2(const float &x, const float &y) { - return F77NAME(slapy2)(&x, &y); -} // lapy2 (float) - -inline double lapy2(const double &x, const double &y) { - return F77NAME(dlapy2)(&x, &y); -} // lapy2 (double) - - -// LACPY - -inline void lacpy(const char* uplo, const ARint &m, const ARint &n, - const float a[], const ARint &lda, float b[], - const ARint &ldb) { - F77NAME(slacpy)(uplo, &m, &n, a, &lda, b, &ldb); -} // lacpy (float) - -inline void lacpy(const char* uplo, const ARint &m, const ARint &n, - const double a[], const ARint &lda, double b[], - const ARint &ldb) { - F77NAME(dlacpy)(uplo, &m, &n, a, &lda, b, &ldb); -} // lacpy (double) - -#ifdef ARCOMP_H -inline void lacpy(const char* uplo, const ARint &m, const ARint &n, - const arcomplex a[], const ARint &lda, - arcomplex b[], const ARint &ldb) { - F77NAME(clacpy)(uplo, &m, &n, a, &lda, b, &ldb); -} // lacpy (arcomplex) - -inline void lacpy(const char* uplo, const ARint &m, const ARint &n, - const arcomplex a[], const ARint &lda, - arcomplex b[], const ARint &ldb) { - F77NAME(zlacpy)(uplo, &m, &n, a, &lda, b, &ldb); -} // lacpy (arcomplex) -#endif - - -// GTTRF - -inline void gttrf(const ARint &n, float dl[], float d[], float du[], - float du2[], ARint ipiv[], ARint &info) { - F77NAME(sgttrf)(&n, dl, d, du, du2, ipiv, &info); -} // gttrf (float) - -inline void gttrf(const ARint &n, double dl[], double d[], double du[], - double du2[], ARint ipiv[], ARint &info) { - F77NAME(dgttrf)(&n, dl, d, du, du2, ipiv, &info); -} // gttrf (double) - -#ifdef ARCOMP_H -inline void gttrf(const ARint &n, arcomplex dl[], arcomplex d[], - arcomplex du[], arcomplex du2[], ARint ipiv[], - ARint &info) { - F77NAME(cgttrf)(&n, dl, d, du, du2, ipiv, &info); -} // gttrf (arcomplex) - -inline void gttrf(const ARint &n, arcomplex dl[], arcomplex d[], - arcomplex du[], arcomplex du2[], ARint ipiv[], - ARint &info) { - F77NAME(zgttrf)(&n, dl, d, du, du2, ipiv, &info); -} // gttrf (arcomplex) -#endif - - -// GTTRS - -inline void gttrs(const char* trans, const ARint &n, const ARint &nrhs, - const float dl[], const float d[], const float du[], - const float du2[], const ARint ipiv[], float b[], - const ARint &ldb, ARint &info) { - F77NAME(sgttrs)(trans, &n, &nrhs, dl, d, du, du2, ipiv, b, &ldb, &info); -} // gttrs (float) - -inline void gttrs(const char* trans, const ARint &n, const ARint &nrhs, - const double dl[], const double d[], const double du[], - const double du2[], const ARint ipiv[], double b[], - const ARint &ldb, ARint &info) { - F77NAME(dgttrs)(trans, &n, &nrhs, dl, d, du, du2, ipiv, b, &ldb, &info); -} // gttrs (double) - -#ifdef ARCOMP_H - -inline void gttrs(const char* trans, const ARint &n, const ARint &nrhs, - const arcomplex dl[], const arcomplex d[], - const arcomplex du[], const arcomplex du2[], - const ARint ipiv[], arcomplex b[], - const ARint &ldb, ARint &info) { - F77NAME(cgttrs)(trans, &n, &nrhs, dl, d, du, du2, ipiv, b, &ldb, &info); -} // gttrs (arcomplex) - -inline void gttrs(const char* trans, const ARint &n, const ARint &nrhs, - const arcomplex dl[], const arcomplex d[], - const arcomplex du[], const arcomplex du2[], - const ARint ipiv[], arcomplex b[], - const ARint &ldb, ARint &info) { - F77NAME(zgttrs)(trans, &n, &nrhs, dl, d, du, du2, ipiv, b, &ldb, &info); -} // gttrs (arcomplex) -#endif - - -// GBTRF - -inline void gbtrf(const ARint &m, const ARint &n, const ARint &kl, - const ARint &ku, float ab[], const ARint &ldab, - ARint ipiv[], ARint &info) { - F77NAME(sgbtrf)(&m, &n, &kl, &ku, ab, &ldab, ipiv, &info); -} // gbtrf (float) - -inline void gbtrf(const ARint &m, const ARint &n, const ARint &kl, - const ARint &ku, double ab[], const ARint &ldab, - ARint ipiv[], ARint &info) { - F77NAME(dgbtrf)(&m, &n, &kl, &ku, ab, &ldab, ipiv, &info); -} // gbtrf (double) - -#ifdef ARCOMP_H -inline void gbtrf(const ARint &m, const ARint &n, const ARint &kl, - const ARint &ku, arcomplex ab[], - const ARint &ldab, ARint ipiv[], ARint &info) { - F77NAME(cgbtrf)(&m, &n, &kl, &ku, ab, &ldab, ipiv, &info); -} // gbtrf (arcomplex) - -inline void gbtrf(const ARint &m, const ARint &n, const ARint &kl, - const ARint &ku, arcomplex ab[], - const ARint &ldab, ARint ipiv[], ARint &info) { - F77NAME(zgbtrf)(&m, &n, &kl, &ku, ab, &ldab, ipiv, &info); -} // gbtrf (arcomplex) -#endif - - -// GBTRS - -inline void gbtrs(const char* trans, const ARint &n, const ARint &kl, - const ARint &ku, const ARint &nrhs, const float ab[], - const ARint &ldab, const ARint ipiv[], float b[], - const ARint &ldb, ARint &info) { - F77NAME(sgbtrs)(trans, &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info); -} // gbtrs (float) - -inline void gbtrs(const char* trans, const ARint &n, const ARint &kl, - const ARint &ku, const ARint &nrhs, const double ab[], - const ARint &ldab, const ARint ipiv[], double b[], - const ARint &ldb, ARint &info) { - F77NAME(dgbtrs)(trans, &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info); -} // gbtrs (double) - -#ifdef ARCOMP_H -inline void gbtrs(const char* trans, const ARint &n, const ARint &kl, - const ARint &ku, const ARint &nrhs, - const arcomplex ab[], const ARint &ldab, - const ARint ipiv[], arcomplex b[], - const ARint &ldb, ARint &info) { - F77NAME(cgbtrs)(trans, &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info); -} // gbtrs (arcomplex) - -inline void gbtrs(const char* trans, const ARint &n, const ARint &kl, - const ARint &ku, const ARint &nrhs, - const arcomplex ab[], const ARint &ldab, - const ARint ipiv[], arcomplex b[], - const ARint &ldb, ARint &info) { - F77NAME(zgbtrs)(trans, &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info); -} // gbtrs (arcomplex) -#endif - - -// GETRF - -inline void getrf(const ARint &m, const ARint &n, float A[], - const ARint &lda, ARint ipiv[], ARint &info) { - F77NAME(sgetrf)(&m, &n, A, &lda, ipiv, &info); -} // getrf (float) - -inline void getrf(const ARint &m, const ARint &n, double A[], - const ARint &lda, ARint ipiv[], ARint &info) { - F77NAME(dgetrf)(&m, &n, A, &lda, ipiv, &info); -} // getrf (double) - -#ifdef ARCOMP_H -inline void getrf(const ARint &m, const ARint &n, arcomplex A[], - const ARint &lda, ARint ipiv[], ARint &info) { - F77NAME(cgetrf)(&m, &n, A, &lda, ipiv, &info); -} // getrf (arcomplex) - -inline void getrf(const ARint &m, const ARint &n, arcomplex A[], - const ARint &lda, ARint ipiv[], ARint &info) { - F77NAME(zgetrf)(&m, &n, A, &lda, ipiv, &info); -} // getrf (arcomplex) -#endif - -// GETRS - -inline void getrs(const char* trans, const ARint &n, const ARint &nrhs, - const float A[], const ARint &lda, const ARint ipiv[], - float b[], const ARint &ldb, ARint &info) { - F77NAME(sgetrs)(trans, &n, &nrhs, A, &lda, ipiv, b, &ldb, &info); -} // getrs (float) - -inline void getrs(const char* trans, const ARint &n, const ARint &nrhs, - const double A[], const ARint &lda, const ARint ipiv[], - double b[], const ARint &ldb, ARint &info) { - F77NAME(dgetrs)(trans, &n, &nrhs, A, &lda, ipiv, b, &ldb, &info); -} // getrs (double) - -#ifdef ARCOMP_H -inline void getrs(const char* trans, const ARint &n, const ARint &nrhs, - const arcomplex A[], const ARint &lda, - const ARint ipiv[], arcomplex b[], - const ARint &ldb, ARint &info) { - F77NAME(cgetrs)(trans, &n, &nrhs, A, &lda, ipiv, b, &ldb, &info); -} // getrs (arcomplex) - -inline void getrs(const char* trans, const ARint &n, const ARint &nrhs, - const arcomplex A[], const ARint &lda, - const ARint ipiv[], arcomplex b[], - const ARint &ldb, ARint &info) { - F77NAME(zgetrs)(trans, &n, &nrhs, A, &lda, ipiv, b, &ldb, &info); -} // getrs (arcomplex) -#endif - -// PTTRF - -inline void pttrf(const ARint &n, float d[], float e[], ARint &info) { - F77NAME(spttrf)(&n, d, e, &info); -} // pttrf (float) - -inline void pttrf(const ARint &n, double d[], double e[], ARint &info) { - F77NAME(dpttrf)(&n, d, e, &info); -} // pttrf (double) - -// PTTRS - -inline void pttrs(const ARint &n, const ARint &nrhs, - const float d[], const float e[], float b[], - const ARint &ldb, ARint &info) { - F77NAME(spttrs)(&n, &nrhs, d, e, b, &ldb, &info); -} // pttrs (float) - -inline void pttrs(const ARint &n, const ARint &nrhs, - const double d[], const double e[], double b[], - const ARint &ldb, ARint &info) { - F77NAME(dpttrs)(&n, &nrhs, d, e, b, &ldb, &info); -} // pttrs (double) - - -// SPTRF - -inline void sptrf(const char* trans, const ARint &n, float ap[], - ARint ipiv[], ARint &info) { - F77NAME(ssptrf)(trans, &n, ap, ipiv, &info); -} // sptrf (float) - -inline void sptrf(const char* trans, const ARint &n, double ap[], - ARint ipiv[], ARint &info) { - F77NAME(dsptrf)(trans, &n, ap, ipiv, &info); -} // sptrf (double) - - -// SPTRS - -inline void sptrs(const char* trans, const ARint &n, const ARint &nrhs, - float ap[], ARint ipiv[], float b[], - const ARint &ldb, ARint &info) { - F77NAME(ssptrs)(trans, &n, &nrhs, ap, ipiv, b, &ldb, &info); -} // sptrs (float) - -inline void sptrs(const char* trans, const ARint &n, const ARint &nrhs, - double ap[], ARint ipiv[], double b[], - const ARint &ldb, ARint &info) { - F77NAME(dsptrs)(trans, &n, &nrhs, ap, ipiv, b, &ldb, &info); -} // sptrs (double) - - -inline void second(const float &t) { - F77NAME(second)(&t); -} - -#endif // LAPACKC_H - - - - diff --git a/src/external/arpack++/include/lapackf.h b/src/external/arpack++/include/lapackf.h deleted file mode 100644 index 2d6209b0..00000000 --- a/src/external/arpack++/include/lapackf.h +++ /dev/null @@ -1,207 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE lapackf.h. - Interface to LAPACK FORTRAN routines. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef LAPACKF_H -#define LAPACKF_H - -#include "arch.h" - -extern "C" -{ - - // Single precision real routines. - - float F77NAME(slapy2)(const float *x, const float *y); - - void F77NAME(slacpy)(const char* uplo, const ARint *m, const ARint *n, - const float *a, const ARint *lda, float *b, - const ARint *ldb); - - void F77NAME(sgttrf)(const ARint *n, float *dl, float *d, float *du, - float *du2, ARint *ipiv, ARint *info); - - void F77NAME(sgbtrf)(const ARint *m, const ARint *n, const ARint *kl, - const ARint *ku, float *ab, const ARint *ldab, - ARint *ipiv, ARint *info); - - void F77NAME(sgetrf)(const ARint *m, const ARint *n, float *A, - const ARint *lda, ARint *ipiv, ARint *info); - - void F77NAME(sgttrs)(const char* trans, const ARint *n, - const ARint *nrhs, const float *dl, - const float *d, const float *du, - const float *du2, const ARint *ipiv, - float* b, const ARint *ldb, ARint *info); - - void F77NAME(sgbtrs)(const char* trans, const ARint *n, - const ARint *kl, const ARint *ku, - const ARint *nrhs, const float *ab, - const ARint *ldab, const ARint *ipiv, - float *b, const ARint *ldb, ARint *info); - - void F77NAME(sgetrs)(const char* trans, const ARint *n, - const ARint *nrhs, const float *A, - const ARint *lda, const ARint *ipiv, - float* b, const ARint *ldb, ARint *info); - - void F77NAME(spttrf)(const ARint *n, float *d, float *e, ARint *info); - - void F77NAME(spttrs)(const ARint *n, const ARint *nrhs, - const float *d, const float *e, float *b, - const ARint *ldb, ARint *info); - - void F77NAME(ssptrf)(const char* trans, const ARint *n, - float *ap, ARint *ipiv, ARint *info); - - void F77NAME(ssptrs)(const char* trans, const ARint *n, - const ARint *nrhs, float *ap, ARint *ipiv, - float *b, const ARint *ldb, ARint *info); - - // Double precision real routines. - - double F77NAME(dlapy2)(const double *x, const double *y); - - void F77NAME(dlacpy)(const char* uplo, const ARint *m, const ARint *n, - const double *a, const ARint *lda, double *b, - const ARint *ldb); - - void F77NAME(dgttrf)(const ARint *n, double *dl, double *d, double *du, - double *du2, ARint *ipiv, ARint *info); - - void F77NAME(dgbtrf)(const ARint *m, const ARint *n, const ARint *kl, - const ARint *ku, double *ab, const ARint *ldab, - ARint *ipiv, ARint *info); - - void F77NAME(dgetrf)(const ARint *m, const ARint *n, double *A, - const ARint *lda, ARint *ipiv, ARint *info); - - void F77NAME(dgttrs)(const char* trans, const ARint *n, - const ARint *nrhs, const double *dl, - const double *d, const double *du, - const double *du2, const ARint *ipiv, - double* b, const ARint *ldb, ARint *info); - - void F77NAME(dgbtrs)(const char* trans, const ARint *n, - const ARint *kl, const ARint *ku, - const ARint *nrhs, const double *ab, - const ARint *ldab, const ARint *ipiv, - double *b, const ARint *ldb, ARint *info); - - void F77NAME(dgetrs)(const char* trans, const ARint *n, - const ARint *nrhs, const double *A, - const ARint *lda, const ARint *ipiv, - double* b, const ARint *ldb, ARint *info); - - void F77NAME(dpttrf)(const ARint *n, double *d, double *e, ARint *info); - - void F77NAME(dpttrs)(const ARint *n, const ARint *nrhs, - const double *d, const double *e, double *b, - const ARint *ldb, ARint *info); - - void F77NAME(dsptrf)(const char* trans, const ARint *n, - double *ap, ARint *ipiv, ARint *info); - - void F77NAME(dsptrs)(const char* trans, const ARint *n, - const ARint *nrhs, double *ap, ARint *ipiv, - double *b, const ARint *ldb, ARint *info); - -#ifdef ARCOMP_H - - // Single precision complex routines. - - void F77NAME(clacpy)(const char* uplo, const ARint *m, const ARint *n, - const arcomplex *a, const ARint *lda, - arcomplex *b, const ARint *ldb); - - void F77NAME(cgttrf)(const ARint *n, arcomplex *dl, - arcomplex *d, arcomplex *du, - arcomplex *du2, ARint *ipiv, - ARint *info); - - void F77NAME(cgbtrf)(const ARint *m, const ARint *n, const ARint *kl, - const ARint *ku, arcomplex *ab, - const ARint *ldab, ARint *ipiv, ARint *info); - - void F77NAME(cgetrf)(const ARint *m, const ARint *n, arcomplex *A, - const ARint *lda, ARint *ipiv, ARint *info); - - void F77NAME(cgttrs)(const char *trans, const ARint *n, - const ARint *nrhs, const arcomplex *dl, - const arcomplex *d, const arcomplex *du, - const arcomplex *du2, const ARint *ipiv, - arcomplex* b, const ARint *ldb, - ARint *info); - - void F77NAME(cgbtrs)(const char* trans, const ARint *n, - const ARint *kl, const ARint *ku, - const ARint *nrhs, const arcomplex *ab, - const ARint *ldab, const ARint *ipiv, - arcomplex *b, const ARint *ldb, - ARint *info); - - void F77NAME(cgetrs)(const char* trans, const ARint *n, - const ARint *nrhs, const arcomplex *A, - const ARint *lda, const ARint *ipiv, - arcomplex* b, const ARint *ldb, ARint *info); - - // Double precision complex routines. - - void F77NAME(zlacpy)(const char* uplo, const ARint *m, const ARint *n, - const arcomplex *a, const ARint *lda, - arcomplex *b, const ARint *ldb); - - void F77NAME(zgttrf)(const ARint *n, arcomplex *dl, - arcomplex *d, arcomplex *du, - arcomplex *du2, ARint *ipiv, - ARint *info); - - void F77NAME(zgbtrf)(const ARint *m, const ARint *n, const ARint *kl, - const ARint *ku, arcomplex *ab, - const ARint *ldab, ARint *ipiv, ARint *info); - - void F77NAME(zgetrf)(const ARint *m, const ARint *n, arcomplex *A, - const ARint *lda, ARint *ipiv, ARint *info); - - void F77NAME(zgttrs)(const char *trans, const ARint *n, - const ARint *nrhs, const arcomplex *dl, - const arcomplex *d, const arcomplex *du, - const arcomplex *du2, const ARint *ipiv, - arcomplex* b, const ARint *ldb, - ARint *info); - - void F77NAME(zgbtrs)(const char* trans, const ARint *n, - const ARint *kl, const ARint *ku, - const ARint *nrhs, const arcomplex *ab, - const ARint *ldab, const ARint *ipiv, - arcomplex *b, const ARint *ldb, - ARint *info); - - void F77NAME(zgetrs)(const char* trans, const ARint *n, - const ARint *nrhs, const arcomplex *A, - const ARint *lda, const ARint *ipiv, - arcomplex* b, const ARint *ldb, ARint *info); - -#endif // ARCOMP_H - - void F77NAME(second)(const float *T); - -} -#endif // LAPACKF_H - - - - - diff --git a/src/external/arpack++/include/naupp.h b/src/external/arpack++/include/naupp.h deleted file mode 100644 index d29b258c..00000000 --- a/src/external/arpack++/include/naupp.h +++ /dev/null @@ -1,333 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE naupp.h. - Interface to ARPACK subroutines dnaupd and snaupd. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef NAUPP_H -#define NAUPP_H - -#include -#include "arch.h" -#include "arpackf.h" - -inline void naupp(ARint& ido, char bmat, ARint n, const std::string& which, ARint nev, - double& tol, double resid[], ARint ncv, double V[], - ARint ldv, ARint iparam[], ARint ipntr[], double workd[], - double workl[], ARint lworkl, ARint& info) - -/* - c++ version of ARPACK routine dnaupd that implements a variant of - the Arnoldi method. This routine computes approximations to a few - eigenpairs of a linear operator "OP" with respect to a semi-inner - product defined by a symmetric positive semi-definite real matrix - B. B may be the identity matrix. NOTE: If the linear operator "OP" - is real and symmetric with respect to the real positive semi-definite - symmetric matrix B, i.e. B*OP = (OP')*B, then subroutine saupp - should be used instead. - - The computed approximate eigenvalues are called Ritz values and - the corresponding approximate eigenvectors are called Ritz vectors. - - naupp is usually called iteratively to solve one of the - following problems: - - Mode 1: A*x = lambda*x. - ===> OP = A and B = I. - - Mode 2: A*x = lambda*M*x, M symmetric positive definite - ===> OP = inv[M]*A and B = M. - ===> (If M can be factored see remark 3 below) - - Mode 3: A*x = lambda*M*x, M symmetric semi-definite - ===> OP = Real_Part{ inv[A - sigma*M]*M } and B = M. - ===> shift-and-invert mode (in real arithmetic) - If OP*x = amu*x, then - amu = 1/2 * [ 1/(lambda-sigma) + 1/(lambda-conjg(sigma)) ]. - Note: If sigma is real, i.e. imaginary part of sigma is zero; - Real_Part{ inv[A - sigma*M]*M } == inv[A - sigma*M]*M - amu == 1/(lambda-sigma). - - Mode 4: A*x = lambda*M*x, M symmetric semi-definite - ===> OP = Imaginary_Part{ inv[A - sigma*M]*M } and B = M. - ===> shift-and-invert mode (in real arithmetic) - If OP*x = amu*x, then - amu = 1/2i * [ 1/(lambda-sigma) - 1/(lambda-conjg(sigma)) ]. - - Both mode 3 and 4 give the same enhancement to eigenvalues close to - the (complex) shift sigma. However, as lambda goes to infinity, - the operator OP in mode 4 dampens the eigenvalues more strongly than - does OP defined in mode 3. - - NOTE: The action of w <- inv[A - sigma*M]*v or w <- inv[M]*v should - be accomplished either by a direct method using a sparse matrix - factorization and solving - - [A - sigma*M]*w = v or M*w = v, - - or through an iterative method for solving these systems. If an - iterative method is used, the convergence test must be more - stringent than the accuracy requirements for the eigenvalue - approximations. - - Parameters: - - ido (Input / Output) Reverse communication flag. ido must be - zero on the first call to naupp. ido will be set - internally to indicate the type of operation to be - performed. Control is then given back to the calling - routine which has the responsibility to carry out the - requested operation and call naupp with the result. The - operand is given in workd[ipntr[1]], the result must be - put in workd[ipntr[2]]. - ido = 0: first call to the reverse communication interface. - ido = -1: compute Y = OP * X where - ipntr[1] is the pointer into workd for X, - ipntr[2] is the pointer into workd for Y. - This is for the initialization phase to force the - starting vector into the range of OP. - ido = 1: compute Y = OP * X where - ipntr[1] is the pointer into workd for X, - ipntr[2] is the pointer into workd for Y. - In mode 3 and 4, the vector B * X is already - available in workd[ipntr[3]]. It does not - need to be recomputed in forming OP * X. - ido = 2: compute Y = B * X where - ipntr[1] is the pointer into workd for X, - ipntr[2] is the pointer into workd for Y. - ido = 3: compute the iparam[8] real and imaginary parts - of the shifts where inptr[14] is the pointer - into workl for placing the shifts. See Remark - 5 below. - ido = 99: done. - bmat (Input) bmat specifies the type of the matrix B that defines - the semi-inner product for the operator OP. - bmat = 'I' -> standard eigenvalue problem A*x = lambda*x; - bmat = 'G' -> generalized eigenvalue problem A*x = lambda*M*x. - n (Input) Dimension of the eigenproblem. - nev (Input) Number of eigenvalues to be computed. 0 < nev < n-1. - which (Input) Specify which of the Ritz values of OP to compute. - 'LM' - compute the NEV eigenvalues of largest magnitude. - 'SM' - compute the NEV eigenvalues of smallest magnitude. - 'LR' - compute the NEV eigenvalues of largest real part. - 'SR' - compute the NEV eigenvalues of smallest real part. - 'LI' - compute the NEV eigenvalues of largest imaginary part. - 'SI' - compute the NEV eigenvalues of smallest imaginary part. - tol (Input) Stopping criterion: the relative accuracy of the - Ritz value is considered acceptable if BOUNDS[i] <= - tol*abs(RITZ[i]),where ABS(RITZ[i]) is the magnitude when - RITZ[i] is complex. If tol<=0.0 is passed, the machine - precision as computed by the LAPACK auxiliary subroutine - _LAMCH is used. - resid (Input / Output) Array of length n. - On input: - If info==0, a random initial residual vector is used. - If info!=0, resid contains the initial residual vector, - possibly from a previous run. - On output: - resid contains the final residual vector. - ncv (Input) Number of Arnoldi vectors that are generated at each - iteration. After the startup phase in which nev Arnoldi - vectors are generated, the algorithm generates ncv-nev - Arnoldi vectors at each subsequent update iteration. Most of - the cost in generating each Arnoldi vector is in the - matrix-vector product OP*x. - NOTE: 2 <= NCV-NEV in order that complex conjugate pairs of - Ritz values are kept together (see remark 4 below). - V (Output) Double precision array of length ncv*n+1. V contains - the ncv Arnoldi basis vectors. The first element V[0] is never - referenced. - ldv (Input) Dimension of the basis vectors contianed in V. This - parameter MUST be set to n. - iparam (Input / Output) Array of length 12. - iparam[1] = ISHIFT: method for selecting the implicit shifts. - The shifts selected at each iteration are used to restart - the Arnoldi iteration in an implicit fashion. - ------------------------------------------------------------- - ISHIFT = 0: the shifts are provided by the user via - reverse communication. The real and imaginary - parts of the NCV eigenvalues of the Hessenberg - matrix H are returned in the part of the WORKL - array corresponding to RITZR and RITZI. See remark - 5 below. - ISHIFT = 1: exact shifts with respect to the current - Hessenberg matrix H. This is equivalent to - restarting the iteration with a starting vector - that is a linear combination of approximate Schur - vectors associated with the "wanted" Ritz values. - ------------------------------------------------------------- - iparam[2] is no longer referenced. - iparam[3] = MXITER - On INPUT: maximum number of Arnoldi update iterations allowed. - On OUTPUT: actual number of Arnoldi update iterations taken. - iparam[4] = NB: blocksize to be used in the recurrence. - The code currently works only for NB = 1. - iparam[5] = NCONV: number of "converged" Ritz values. - This represents the number of Ritz values that satisfy - the convergence criterion. - iparam[6] is no longer referenced. - iparam[7] = MODE. On INPUT determines what type of - eigenproblem is being solved. Must be 1,2,3,4. - iparam[8] = NP. When ido = 3 and the user provides shifts - through reverse communication (iparam[1]=0), naupp returns - NP, the number of shifts the user is to provide. - 0 < NP <=ncv-nev. See Remark 5 below. - iparam[9] = total number of OP*x operations. - iparam[10] = total number of B*x operations if bmat='G'. - iparam[11] = total number of steps of re-orthogonalization. - ipntr (Output) Array of length 14. Pointer to mark the starting - locations in the workd and workl arrays for matrices/vectors - used by the Arnoldi iteration. - ipntr[1] : pointer to the current operand vector X in workd. - ipntr[2] : pointer to the current result vector Y in workd. - ipntr[3] : pointer to the vector B * X in workd when used in - the shift-and-invert mode. - ipntr[4] : pointer to the next available location in workl - that is untouched by the program. - ipntr[5] : pointer to the ncv by ncv upper Hessenberg matrix - H in workl. - ipntr[6] : pointer to the real part of the ritz value array - RITZR in workl. - ipntr[7] : pointer to the imaginary part of the ritz value - array RITZI in workl. - ipntr[8] : pointer to the Ritz estimates in array workl - associated with the Ritz values located in RITZR - and RITZI in workl. - ipntr[14]: pointer to the np shifts in workl. See Remark 6. - Note: ipntr[9:13] is only referenced by neupp. See Remark 2. - ipntr[9] : pointer to the real part of the ncv RITZ values of - the original system. - ipntr[10]: pointer to the imaginary part of the ncv RITZ values - of the original system. - ipntr[11]: pointer to the ncv corresponding error bounds. - ipntr[12]: pointer to the ncv by ncv upper quasi-triangular - Schur matrix for H. - ipntr[13]: pointer to the ncv by ncv matrix of eigenvectors - of the upper Hessenberg matrix H. Only referenced by - neupp if rvec == TRUE. See Remark 2 below. - workd (Input / Output) Array of length 3*N+1. - Distributed array to be used in the basic Arnoldi iteration - for reverse communication. The user should not use workd as - temporary workspace during the iteration. Upon termination - workd[1:n] contains B*resid[1:n]. If the Ritz vectors are - desired subroutine neupp uses this output. - workl (Output) Array of length lworkl+1. Private (replicated) array - on each PE or array allocated on the front end. - lworkl (Input) lworkl must be at least 3*ncv*(ncv+2). - info (Input / Output) On input, if info = 0, a randomly initial - residual vector is used, otherwise resid contains the initial - residual vector, possibly from a previous run. - On output, info works as a error flag: - = 0 : Normal exit. - = 1 : Maximum number of iterations taken. All possible - eigenvalues of OP has been found. iparam[5] - returns the number of wanted converged Ritz values. - = 3 : No shifts could be applied during a cycle of the - Implicitly restarted Arnoldi iteration. One - possibility is to increase the size of NCV relative - to nev. See remark 4 below. - = -1 : n must be positive. - = -2 : nev must be positive. - = -3 : ncv must satisfy nev+2 <= ncv <= n. - = -4 : The maximum number of Arnoldi update iterations - allowed must be greater than zero. - = -5 : which must be one of 'LM','SM','LR','SR','LI','SI'. - = -6 : bmat must be one of 'I' or 'G'. - = -7 : Length of private work array workl is not sufficient. - = -8 : Error return from LAPACK eigenvalue calculation. - = -9 : Starting vector is zero. - = -10 : iparam[7] must be 1,2,3,4. - = -11 : iparam[7] = 1 and bmat = 'G' are incompatible. - = -12 : iparam[1] must be equal to 0 or 1. - = -13 : nev and which = 'BE' are incompatible. - = -9999: Could not build an Arnoldi factorization. iparam[5] - returns the size of the current Arnoldi factorization. - The user is advised to check that enough workspace - and array storage has been allocated. - - Remarks: - 1. The computed Ritz values are approximate eigenvalues of OP. The - selection of "which" should be made with this in mind when - Mode = 3 and 4. After convergence, approximate eigenvalues of the - original problem may be obtained with the ARPACK subroutine neupp. - 2. If a basis for the invariant subspace corresponding to the converged - Ritz values is needed, the user must call neupp immediately following - completion of naupp. This is new starting with release 2 of ARPACK. - 3. If M can be factored into a Cholesky factorization M = LL' - then Mode = 2 should not be selected. Instead one should use - Mode = 1 with OP = inv(L)*A*inv(L'). Appropriate triangular - linear systems should be solved with L and L' rather - than computing inverses. After convergence, an approximate - eigenvector z of the original problem is recovered by solving - L'z = x where x is a Ritz vector of OP. - 4. At present there is no a-priori analysis to guide the selection - of ncv relative to nev. The only formal requrement is that ncv - >= nev+2. However, it is recommended that ncv >= 2*nev+1. If many - problems of the same type are to be solved, one should experiment - with increasing ncv while keeping ncv fixed for a given test - problem. This will usually decrease the required number of OP*x - operations but it also increases the work and storage required to - maintain the orthogonal basis vectors. The optimal "cross-over" - with respect to CPU time is problem dependent and must be - determined empirically. - 5. When iparam[1] = 0, and ido = 3, the user needs to provide the - NP = iparam[8] real and imaginary parts of the shifts in locations - real part imaginary part - ----------------------- -------------- - 1 workl[ipntr[14]] workl[ipntr[14]+NP] - 2 workl[ipntr[14]+1] workl[ipntr[14]+NP+1] - . . - . . - . . - NP workl[ipntr[14]+NP-1] workl[ipntr[14]+2*NP-1]. - - Only complex conjugate pairs of shifts may be applied and the pairs - must be placed in consecutive locations. The real part of the - eigenvalues of the current upper Hessenberg matrix are located in - workl[ipntr[6]] through workl[ipntr[6]+ncv-1] and the imaginary part - in workl[ipntr[7]] through workl[ipntr[7]+ncv-1]. They are ordered - according to the order defined by which. The complex conjugate pairs - are kept together and the associated Ritz estimates are located in - workl[ipntr[8]], workl[ipntr[8]+1], ... , workl[ipntr[8]+ncv-1]. -*/ - -{ - - F77NAME(dnaupd)(&ido, &bmat, &n, which.c_str(), &nev, &tol, resid, &ncv, - &V[1], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], - &lworkl, &info); - -} // naupp (double). - -inline void naupp(ARint& ido, char bmat, ARint n, const std::string& which, ARint nev, - float& tol, float resid[], ARint ncv, float V[], - ARint ldv, ARint iparam[], ARint ipntr[], float workd[], - float workl[], ARint lworkl, ARint& info) - -/* - c++ version of ARPACK routine snaupd. The only difference between - snaupd and dnaupd is that in the former function all vectors have - single precision elements and in the latter all vectors have double - precision elements. -*/ - -{ - - F77NAME(snaupd)(&ido, &bmat, &n, which.c_str(), &nev, &tol, resid, &ncv, - &V[1], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], - &lworkl, &info); - -} // naupp (float). - -#endif // NAUPP_H - diff --git a/src/external/arpack++/include/neupp.h b/src/external/arpack++/include/neupp.h deleted file mode 100644 index 2b102d77..00000000 --- a/src/external/arpack++/include/neupp.h +++ /dev/null @@ -1,270 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE neupp.h. - Interface to ARPACK subroutines dneupd and sneupd. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef NEUPP_H -#define NEUPP_H - -#include -#include -#include "arch.h" -#include "arpackf.h" - -inline void neupp(bool rvec, char HowMny, double dr[], - double di[], double Z[], ARint ldz, double sigmar, - double sigmai, double workv[], char bmat, ARint n, - const std::string& which, ARint nev, double tol, double resid[], - ARint ncv, double V[], ARint ldv, ARint iparam[], - ARint ipntr[], double workd[], double workl[], - ARint lworkl, ARint& info) - -/* - c++ version of ARPACK routine dneupd. - This subroutine returns the converged approximations to eigenvalues - of A*z = lambda*B*z and (optionally): - - (1) the corresponding approximate eigenvectors, - (2) an orthonormal basis for the associated approximate - invariant subspace, - - There is negligible additional cost to obtain eigenvectors. An - orthonormal basis is always computed. There is an additional storage cost - of n*nev if both are requested (in this case a separate array Z must be - supplied). - The approximate eigenvalues and eigenvectors of A*z = lambda*B*z - are derived from approximate eigenvalues and eigenvectors of - of the linear operator OP prescribed by the MODE selection in the - call to naupp. naupp must be called before this routine is called. - These approximate eigenvalues and vectors are commonly called Ritz - values and Ritz vectors respectively. They are referred to as such - in the comments that follow. The computed orthonormal basis for the - invariant subspace corresponding to these Ritz values is referred to - as a Schur basis. - See documentation in the header of the subroutine naupp for - definition of OP as well as other terms and the relation of computed - Ritz values and Ritz vectors of OP with respect to the given problem - A*z = lambda*B*z. For a brief description, see definitions of - iparam[7], MODE and which in the documentation of naupp. - - Parameters: - - rvec (Input) Specifies whether Ritz vectors corresponding to the - Ritz value approximations to the eigenproblem A*z = lambda*B*z - are computed. - rvec = false: Compute Ritz values only. - rvec = true : Compute the Ritz vectors or Schur vectors. - See Remarks below. - HowMny (Input) Specifies the form of the basis for the invariant - subspace corresponding to the converged Ritz values that - is to be computed. - = 'A': Compute nev Ritz vectors; - = 'P': Compute nev Schur vectors; - dr (Output) Array of dimension nev+1. - If iparam[7] = 1,2 or 3 and sigmai=0.0 then on exit: dr - contains the real part of the Ritz approximations to the - eigenvalues of A*z = lambda*B*z. - If iparam[7] = 3, 4 and sigmai is not equal to zero, then on - exit: dr contains the real part of the Ritz values of OP - computed by naupp. A further computation must be performed by - the user to transform the Ritz values computed for OP by naupp - to those of the original system A*z = lambda*B*z. See remark 3. - di (Output) Array of dimension nev+1. - On exit, di contains the imaginary part of the Ritz value - approximations to the eigenvalues of A*z = lambda*B*z - associated with dr. - NOTE: When Ritz values are complex, they will come in complex - conjugate pairs. If eigenvectors are requested, the - corresponding Ritz vectors will also come in conjugate - pairs and the real and imaginary parts of these are - represented in two consecutive columns of the array Z - (see below). - Z (Output) Array of dimension nev*n if rvec = TRUE and HowMny = - 'A'. if rvec = TRUE. and HowMny = 'A', then the contains - approximate eigenvectors (Ritz vectors) corresponding to the - NCONV=iparam[5] Ritz values for eigensystem A*z = lambda*B*z. - The complex Ritz vector associated with the Ritz value - with positive imaginary part is stored in two consecutive - columns. The first column holds the real part of the Ritz - vector and the second column holds the imaginary part. The - Ritz vector associated with the Ritz value with negative - imaginary part is simply the complex conjugate of the Ritz - vector associated with the positive imaginary part. - If rvec = .FALSE. or HowMny = 'P', then Z is not referenced. - NOTE: If if rvec = .TRUE. and a Schur basis is not required, - the array Z may be set equal to first nev+1 columns of - the Arnoldi basis array V computed by naupp. In this - case the Arnoldi basis will be destroyed and overwritten - with the eigenvector basis. - ldz (Input) Dimension of the vectors contained in Z. This - parameter MUST be set to n. - sigmar (Input) If iparam[7] = 3 or 4, represents the real part of - the shift. Not referenced if iparam[7] = 1 or 2. - sigmai (Input) If iparam[7] = 3 or 4, represents the imaginary part - of the shift. Not referenced if iparam[7] = 1 or 2. See - remark 3 below. - workv (Workspace) Array of dimension 3*ncv. - V (Input/Output) Array of dimension n*ncv+1. - Upon Input: V contains the ncv vectors of the Arnoldi basis - for OP as constructed by naupp. - Upon Output: If rvec = TRUE the first NCONV=iparam[5] columns - contain approximate Schur vectors that span the - desired invariant subspace. See Remark 2 below. - NOTE: If the array Z has been set equal to first nev+1 columns - of the array V and rvec = TRUE. and HowMny = 'A', then - the Arnoldi basis held by V has been overwritten by the - desired Ritz vectors. If a separate array Z has been - passed then the first NCONV=iparam[5] columns of V will - contain approximate Schur vectors that span the desired - invariant subspace. - workl (Input / Output) Array of length lworkl+1. - workl[1:ncv*ncv+3*ncv] contains information obtained in - naupp. They are not changed by neupp. - workl[ncv*ncv+3*ncv+1:3*ncv*ncv+6*ncv] holds the real and - imaginary part of the untransformed Ritz values, the upper - quasi-triangular matrix for H, and the associated matrix - representation of the invariant subspace for H. - ipntr (Input / Output) Array of length 14. Pointer to mark the - starting locations in the workl array for matrices/vectors - used by naupp and neupp. - ipntr[9]: pointer to the real part of the ncv RITZ values - of the original system. - ipntr[10]: pointer to the imaginary part of the ncv RITZ - values of the original system. - ipntr[11]: pointer to the ncv corresponding error bounds. - ipntr[12]: pointer to the ncv by ncv upper quasi-triangular - Schur matrix for H. - ipntr[13]: pointer to the ncv by ncv matrix of eigenvectors - of the upper Hessenberg matrix H. Only referenced - by neupp if rvec = TRUE. See Remark 2 below. - info (Output) Error flag. - = 0 : Normal exit. - = 1 : The Schur form computed by LAPACK routine dlahqr - could not be reordered by LAPACK routine dtrsen. - Re-enter subroutine neupp with iparam[5] = ncv and - increase the size of the arrays DR and DI to have - dimension at least dimension ncv and allocate at least - ncv columns for Z. NOTE: Not necessary if Z and V share - the same space. Please notify the authors if this error - occurs. - = -1 : n must be positive. - = -2 : nev must be positive. - = -3 : ncv must satisfy nev+2 <= ncv <= n. - = -5 : which must be one of 'LM','SM','LR','SR','LI','SI'. - = -6 : bmat must be one of 'I' or 'G'. - = -7 : Length of private work workl array is not sufficient. - = -8 : Error return from calculation of a real Schur form. - Informational error from LAPACK routine dlahqr. - = -9 : Error return from calculation of eigenvectors. - Informational error from LAPACK routine dtrevc. - = -10: iparam[7] must be 1,2,3,4. - = -11: iparam[7] = 1 and bmat = 'G' are incompatible. - = -12: HowMny = 'S' not yet implemented - = -13: HowMny must be one of 'A' or 'P' if rvec = TRUE. - = -14: naupp did not find any eigenvalues to sufficient - accuracy. - - NOTE: The following arguments - - bmat, n, which, nev, tol, resid, ncv, V, ldv, iparam, - ipntr, workd, workl, lworkl, info - - must be passed directly to neupp following the last call - to naupp. These arguments MUST NOT BE MODIFIED between - the the last call to naupp and the call to neupp. - - Remarks - 1. Currently only HowMny = 'A' and 'P' are implemented. - 2. Schur vectors are an orthogonal representation for the basis of - Ritz vectors. Thus, their numerical properties are often superior. - Let X' denote the transpose of X. If rvec = .TRUE. then the - relationship A * V[:,1:iparam[5]] = V[:,1:iparam[5]] * T, and - V[:,1:iparam[5]]' * V[:,1:iparam[5]] = I are approximately satisfied. - Here T is the leading submatrix of order iparam[5] of the real - upper quasi-triangular matrix stored workl[ipntr[12]]. That is, - T is block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; - each 2-by-2 diagonal block has its diagonal elements equal and its - off-diagonal elements of opposite sign. Corresponding to each - 2-by-2 diagonal block is a complex conjugate pair of Ritz values. - The real Ritz values are stored on the diagonal of T. - 3. If iparam[7] = 3 or 4 and sigmai is not equal zero, then the user - must form the iparam[5] Rayleigh quotients in order to transform the - Ritz values computed by naupp for OP to those of A*z = lambda*B*z. - Set rvec = TRUE. and HowMny = 'A', and compute - Z[:,I]' * A * Z[:,I] if di[I] = 0. - If di[I] is not equal to zero and di[I+1] = - D[I], - then the desired real and imaginary parts of the Ritz value are - Z[:,I]' * A * Z[:,I] + Z[:,I+1]' * A * Z[:,I+1], - Z[:,I]' * A * Z[:,I+1] - Z[:,I+1]' * A * Z[:,I], respectively. - Another possibility is to set rvec = .true. and HowMny = 'P' and - compute V[:,1:iparam[5]]' * A * V[:,1:iparam[5]] and then an upper - quasi-triangular matrix of order iparam[5] is computed. See remark - 2 above. -*/ - -{ - - ARint irvec; - ARlogical* iselect; - double* iZ; - - irvec = (ARint) rvec; - iselect = new ARlogical[ncv]; - iZ = (Z == NULL) ? &V[1] : Z; - - F77NAME(dneupd)(&irvec, &HowMny, iselect, dr, di, iZ, &ldz, &sigmar, - &sigmai, &workv[1], &bmat, &n, which.c_str(), &nev, &tol, - resid, &ncv, &V[1], &ldv, &iparam[1], &ipntr[1], - &workd[1], &workl[1], &lworkl, &info); - - delete[] iselect; - -} // neupp (double). - -inline void neupp(bool rvec, char HowMny, float dr[], - float di[], float Z[], ARint ldz, float sigmar, - float sigmai, float workv[], char bmat, ARint n, - const std::string& which, ARint nev, float tol, float resid[], - ARint ncv, float V[], ARint ldv, ARint iparam[], - ARint ipntr[], float workd[], float workl[], - ARint lworkl, ARint& info) - -/* - c++ version of ARPACK routine sneupd. The only difference between - sneupd and dneupd is that in the former function all vectors have - single precision elements and in the latter all vectors have double - precision elements. -*/ - -{ - - ARint irvec; - ARlogical* iselect; - float* iZ; - - irvec = (ARint) rvec; - iselect = new ARlogical[ncv]; - iZ = (Z == NULL) ? &V[1] : Z; - - F77NAME(sneupd)(&irvec, &HowMny, iselect, dr, di, iZ, &ldz, &sigmar, - &sigmai, &workv[1], &bmat, &n, which.c_str(), &nev, &tol, - resid, &ncv, &V[1], &ldv, &iparam[1], &ipntr[1], - &workd[1], &workl[1], &lworkl, &info ); - - delete[] iselect; - -} // neupp (float). - -#endif // NEUPP_H - diff --git a/src/external/arpack++/include/saupp.h b/src/external/arpack++/include/saupp.h deleted file mode 100644 index a0c256cb..00000000 --- a/src/external/arpack++/include/saupp.h +++ /dev/null @@ -1,321 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE saupp.h. - Interface to ARPACK subroutines dsaupd and ssaupd. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef SAUPP_H -#define SAUPP_H - -#include -#include "arch.h" -#include "arpackf.h" - -inline void saupp(ARint& ido, char bmat, ARint n, const std::string& which, ARint nev, - double& tol, double resid[], ARint ncv, double V[], - ARint ldv, ARint iparam[], ARint ipntr[], double workd[], - double workl[], ARint lworkl, ARint& info) - -/* - c++ version of ARPACK routine dsaupd that implements a variant of - the Lanczos method. This method has been designed to compute - approximations to a few eigenpairs of a linear operator OP that is - real and symmetric with respect to a real positive semi-definite - symmetric matrix B, i.e. - - B*OP = (OP')*B. - - where A' denotes transpose of A. In the standard eigenproblem B is - the identity matrix. Another way to express this condition is - - < x,OPy > = < OPx,y > where < z,w > = z'Bw. - - The computed approximate eigenvalues are called Ritz values and - the corresponding approximate eigenvectors are called Ritz vectors. - - saupp is usually called iteratively to solve one of the - following problems: - - Mode 1: A*x = lambda*x, A symmetric - ===> OP = A and B = I. - - Mode 2: A*x = lambda*M*x, A symmetric, M symmetric positive definite - ===> OP = inv[M]*A and B = M. - ===> (If M can be factored see remark 3 below) - - Mode 3: K*x = lambda*M*x, K symmetric, M symmetric positive semi-definite - ===> OP = (inv[K - sigma*M])*M and B = M. - ===> Shift-and-Invert mode - - Mode 4: K*x = lambda*KG*x, K symmetric positive semi-definite, - KG symmetric indefinite - ===> OP = (inv[K - sigma*KG])*K and B = K. - ===> Buckling mode - - Mode 5: A*x = lambda*M*x, A symmetric, M symmetric positive semi-definite - ===> OP = inv[A - sigma*M]*[A + sigma*M] and B = M. - ===> Cayley transformed mode - - NOTE: The action of w <- inv[A - sigma*M]*v or w <- inv[M]*v should be - accomplished either by a direct method using a sparse matrix - factorization and solving - - [A - sigma*M]*w = v or M*w = v, - - or through an iterative method for solving these systems. If an - iterative method is used, the convergence test must be more - stringent than the accuracy requirements for the eigenvalue - approximations. - - Parameters: - - ido (Input / Output) Reverse communication flag. ido must be - zero on the first call to saupp. ido will be set - internally to indicate the type of operation to be - performed. Control is then given back to the calling - routine which has the responsibility to carry out the - requested operation and call saupp with the result. The - operand is given in workd[ipntr[1]], the result must be - put in workd[ipntr[2]]. (If Mode = 2 see remark 5 below). - ido = 0: first call to the reverse communication interface. - ido = -1: compute Y = OP * X where - ipntr[1] is the pointer into workd for X, - ipntr[2] is the pointer into workd for Y. - This is for the initialization phase to force the - starting vector into the range of OP. - ido = 1: compute Y = OP * X where - ipntr[1] is the pointer into workd for X, - ipntr[2] is the pointer into workd for Y. - In mode 3,4 and 5, the vector B * X is already - available in workd[ipntr[3]]. It does not - need to be recomputed in forming OP * X. - ido = 2: compute Y = B * X where - ipntr[1] is the pointer into workd for X, - ipntr[2] is the pointer into workd for Y. - ido = 3: compute the iparam[8] shifts where - ipntr[11] is the pointer into workl for - placing the shifts. See remark 6 below. - ido = 99: done. - bmat (Input) bmat specifies the type of the matrix B that defines - the semi-inner product for the operator OP. - bmat = 'I' -> standard eigenvalue problem A*x = lambda*x; - bmat = 'G' -> generalized eigenvalue problem A*x = lambda*B*x. - n (Input) Dimension of the eigenproblem. - nev (Input) Number of eigenvalues to be computed. 0 < nev < n. - which (Input) Specify which of the Ritz values of OP to compute. - 'LA' - compute the nev largest (algebraic) eigenvalues. - 'SA' - compute the nev smallest (algebraic) eigenvalues. - 'LM' - compute the nev largest (in magnitude) eigenvalues. - 'SM' - compute the nev smallest (in magnitude) eigenvalues. - 'BE' - compute nev eigenvalues, half from each end of the - spectrum. When NEV is odd, compute one more from the - high end than from the low end. - (see remark 1 below) - tol (Input) Stopping criterion: the relative accuracy of the - Ritz value is considered acceptable if BOUNDS[i] <= - tol*abs(RITZ[i]). If tol<=0.0 is passed, the machine - precision as computed by the LAPACK auxiliary subroutine - _LAMCH is used. - resid (Input / Output) Array of length n. - On input: - If info==0, a random initial residual vector is used. - If info!=0, resid contains the initial residual vector, - possibly from a previous run. - On output: - resid contains the final residual vector. - ncv (Input) Number of Lanczos vectors that are generated at each - iteration. After the startup phase in which nev Lanczos - vectors are generated, the algorithm generates ncv-nev - Lanczos vectors at each subsequent update iteration. Most of - the cost in generating each Lanczos vector is in the - matrix-vector product OP*x. (See remark 4 below). - V (Output) Double precision array of length ncv*n+1. V contains - the ncv Lanczos basis vectors. The first element V[0] is never - referenced. - ldv (Input) Dimension of the basis vectors contianed in V. This - parameter MUST be set to n. - iparam (Input / Output) Array of length 12. - iparam[1] = ISHIFT: method for selecting the implicit shifts. - The shifts selected at each iteration are used to restart - the Arnoldi iteration in an implicit fashion. - ------------------------------------------------------------- - ISHIFT = 0: the shifts are provided by the user via - reverse communication. The NCV eigenvalues of - the current tridiagonal matrix T are returned in - the part of workl array corresponding to RITZ. - See remark 6 below. - ISHIFT = 1: exact shifts with respect to the reduced - tridiagonal matrix T. This is equivalent to - restarting the iteration with a starting vector - that is a linear combination of Ritz vectors - associated with the "wanted" Ritz values. - ------------------------------------------------------------- - iparam[2] is no longer referenced. - iparam[3] = MXITER - On INPUT: maximum number of Arnoldi update iterations allowed. - On OUTPUT: actual number of Arnoldi update iterations taken. - iparam[4] = NB: blocksize to be used in the recurrence. - The code currently works only for NB = 1. - iparam[5] = NCONV: number of "converged" Ritz values. - This represents the number of Ritz values that satisfy - the convergence criterion. - iparam[6] is no longer referenced. - iparam[7] = MODE. On INPUT determines what type of - eigenproblem is being solved. Must be 1,2,3,4,5. - iparam[8] = NP. When ido = 3 and the user provides shifts - through reverse communication (iparam[1]=0), saupp returns - NP, the number of shifts the user is to provide. - 0 < NP <=ncv-nev. See Remark 6 below. - iparam[9] = total number of OP*x operations. - iparam[10] = total number of B*x operations if bmat='G'. - iparam[11] = total number of steps of re-orthogonalization. - ipntr (Output) Array of length 12. Pointer to mark the starting - locations in the workd and workl arrays for matrices/vectors - used by the Lanczos iteration. - ipntr[1] : pointer to the current operand vector X in workd. - ipntr[2] : pointer to the current result vector Y in workd. - ipntr[3] : pointer to the vector B * X in workd when used in - the shift-and-invert mode. - ipntr[4] : pointer to the next available location in workl - that is untouched by the program. - ipntr[5] : pointer to the ncv by 2 tridiagonal matrix T in - workl. - ipntr[6] : pointer to the ncv RITZ values array in workl. - ipntr[7] : pointer to the Ritz estimates in array workl - associated with the Ritz values located in RITZ - in workl. - ipntr[11]: pointer to the np shifts in workl. See Remark 6. - Note: ipntr[8:10] is only referenced by seupp. See Remark 2. - ipntr[8] : pointer to the ncv RITZ values of the original - system. - ipntr[9] : pointer to the ncv corresponding error bounds. - ipntr[10]: pointer to the ncv by ncv matrix of eigenvectors - of the tridiagonal matrix T. Only referenced by - seupp if RVEC = TRUE. See Remarks. - workd (Input / Output) Array of length 3*N+1. - Distributed array to be used in the basic Arnoldi iteration - for reverse communication. The user should not use workd as - temporary workspace during the iteration. Upon termination - workd[1:n] contains B*resid[1:n]. If the Ritz vectors are - desired subroutine seupp uses this output. - workl (Output) Array of length lworkl+1. Private (replicated) array - on each PE or array allocated on the front end. - lworkl (Input) lworkl must be at least ncv*(ncv+8). - info (Input / Output) On input, if info = 0, a randomly initial - residual vector is used, otherwise resid contains the initial - residual vector, possibly from a previous run. - On output, info works as a error flag: - = 0 : Normal exit. - = 1 : Maximum number of iterations taken. All possible - eigenvalues of OP has been found. iparam[5] - returns the number of wanted converged Ritz values. - = 3 : No shifts could be applied during a cycle of the - Implicitly restarted Arnoldi iteration. One - possibility is to increase the size of NCV relative - to nev. See remark 4 below. - = -1 : n must be positive. - = -2 : nev must be positive. - = -3 : ncv must satisfy nev < ncv <= n. - = -4 : The maximum number of Arnoldi update iterations allowed - must be greater than zero. - = -5 : which must be one of 'LM', 'SM', 'LA', 'SA' or 'BE'. - = -6 : bmat must be one of 'I' or 'G'. - = -7 : Length of private work array workl is not sufficient. - = -8 : Error return from trid. eigenvalue calculation; - Informational error from LAPACK routine dsteqr. - = -9 : Starting vector is zero. - = -10 : iparam[7] must be 1,2,3,4,5. - = -11 : iparam[7] = 1 and bmat = 'G' are incompatible. - = -12 : iparam[1] must be equal to 0 or 1. - = -13 : nev and which = 'BE' are incompatible. - = -9999: Could not build an Arnoldi factorization. iparam[5] - returns the size of the current Arnoldi factorization. - The user is advised to check that enough workspace - and array storage has been allocated. - - Remarks: - 1. The converged Ritz values are always returned in ascending - algebraic order. The computed Ritz values are approximate - eigenvalues of OP. The selection of "which" should be made - with this in mind when Mode = 3,4,5. After convergence, - approximate eigenvalues of the original problem may be obtained - with the ARPACK subroutine seupp. - 2. If the Ritz vectors corresponding to the converged Ritz values are - needed, the user must call seupp immediately following completion - of saupp. This is new starting with version 2.1 of ARPACK. - 3. If M can be factored into a Cholesky factorization M = LL' - then Mode = 2 should not be selected. Instead one should use - Mode = 1 with OP = inv(L)*A*inv(L'). Appropriate triangular - linear systems should be solved with L and L' rather - than computing inverses. After convergence, an approximate - eigenvector z of the original problem is recovered by solving - L'z = x where x is a Ritz vector of OP. - 4. At present there is no a-priori analysis to guide the selection - of ncv relative to nev. The only formal requrement is that - ncv > nev. However, it is recommended that ncv >= 2*nev. If many - problems of the same type are to be solved, one should experiment - with increasing ncv while keeping nev fixed for a given test - problem. This will usually decrease the required number of OP*x - operations but it also increases the work and storage required to - maintain the orthogonal basis vectors. The optimal "cross-over" - with respect to CPU time is problem dependent and must be - determined empirically. - 5. If iparam[7] = 2 then in the Reverse commuication interface the - user must do the following. When ido = 1, Y = OP * X is to be - computed. When iparam[7] = 2 OP = inv(B)*A. After computing A*X - the user must overwrite X with A*X. Y is then the solution to the - linear set of equations B*Y = A*X. - 6. When iparam[1] = 0, and ido = 3, the user needs to provide the - NP = iparam[8] shifts in locations: - 1 workl[ipntr[11]] - 2 workl[ipntr[11]+1] - . - . - . - NP workl[ipntr[11]+NP-1]. - The eigenvalues of the current tridiagonal matrix are located in - workl[ipntr[6]] through workl[ipntr[6]+ncv]. They are in the - order defined by which. The associated Ritz estimates are located in - workl[ipntr[8]], workl[ipntr[8]+1], ... , workl[ipntr[8]+ncv-1]. -*/ - -{ - - F77NAME(dsaupd)(&ido, &bmat, &n, which.c_str(), &nev, &tol, resid, &ncv, - &V[1], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], - &lworkl, &info); - -} // saupp (double). - -inline void saupp(ARint& ido, char bmat, ARint n, const std::string& which, ARint nev, - float& tol, float resid[], ARint ncv, float V[], - ARint ldv, ARint iparam[], ARint ipntr[], float workd[], - float workl[], ARint lworkl, ARint& info) - -/* - c++ version of ARPACK routine ssaupd. The only difference between - ssaupd and dsaupd is that in the former function all vectors have - single precision elements and in the latter all vectors have double - precision elements. -*/ - -{ - - F77NAME(ssaupd)(&ido, &bmat, &n, which.c_str(), &nev, &tol, resid, &ncv, - &V[1], &ldv, &iparam[1], &ipntr[1], &workd[1], &workl[1], - &lworkl, &info); - -} // saupp (float). - -#endif // SAUPP_H - diff --git a/src/external/arpack++/include/seupp.h b/src/external/arpack++/include/seupp.h deleted file mode 100644 index 5e5c6051..00000000 --- a/src/external/arpack++/include/seupp.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE seupp.h. - Interface to ARPACK subroutines dseupd and sseupd. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef SEUPP_H -#define SEUPP_H - -#include -#include -#include "arch.h" -#include "arpackf.h" - -inline void seupp(bool rvec, char HowMny, double d[], double Z[], - ARint ldz, double sigma, char bmat, ARint n, - const std::string& which, ARint nev, double tol, double resid[], - ARint ncv, double V[], ARint ldv, ARint iparam[], - ARint ipntr[], double workd[], double workl[], - ARint lworkl, ARint& info) - -/* - c++ version of ARPACK routine dseupd. - This subroutine returns the converged approximations to eigenvalues - of A*z = lambda*B*z and (optionally): - - (1) the corresponding approximate eigenvectors, - (2) an orthonormal (Lanczos) basis for the associated approximate - invariant subspace, - - There is negligible additional cost to obtain eigenvectors. An orthonormal - (Lanczos) basis is always computed. There is an additional storage cost - of n*nev if both are requested (in this case a separate array Z must be - supplied). - These quantities are obtained from the Lanczos factorization computed - by saupp for the linear operator OP prescribed by the MODE selection - (see IPARAM[7] in saupp documentation). saupp must be called before - this routine is called. These approximate eigenvalues and vectors are - commonly called Ritz values and Ritz vectors respectively. They are - referred to as such in the comments that follow. The computed orthonormal - basis for the invariant subspace corresponding to these Ritz values is - referred to as a Lanczos basis. - See documentation in the header of the subroutine dsaupp for a definition - of OP as well as other terms and the relation of computed Ritz values - and vectors of OP with respect to the given problem A*z = lambda*B*z. - The approximate eigenvalues of the original problem are returned in - ascending algebraic order. The user may elect to call this routine - once for each desired Ritz vector and store it peripherally if desired. - There is also the option of computing a selected set of these vectors - with a single call. - - Parameters: - - rvec (Input) Specifies whether Ritz vectors corresponding to the - Ritz value approximations to the eigenproblem A*z = lambda*B*z - are computed. - rvec = false: Compute Ritz values only. - rvec = true : Compute Ritz vectors. - HowMny (Input) Specifies how many Ritz vectors are wanted and the - form of Z, the matrix of Ritz vectors. See remark 1 below. - The only option already implemented is HowMny = 'A'. - d (Output) Array of dimension nev. On exit, d contains the Ritz - value approximations to the eigenvalues of A*z = lambda*B*z. - The values are returned in ascending order. If iparam[7] = - 3, 4, 5 then d represents the Ritz values of OP computed by - dsaupp transformed to those of the original eigensystem A*z = - lambda*B*z. If iparam[7] = 1,2 then the Ritz values of OP are - the same as the those of A*z = lambda*B*z. - Z (Output) Array of dimension nev*n if HowMny = 'A'. On - exit, Z contains the B-orthonormal Ritz vectors of the - eigensystem A*z = lambda*B*z corresponding to the Ritz value - approximations. If rvec = false then Z is not referenced. - NOTE: The array Z may be set equal to first nev columns of - the Arnoldi/Lanczos basis array V computed by dsaupp. - ldz (Input) Dimension of the vectors contained in Z. This - parameter MUST be set to n. - sigma (Input) If iparam[7] = 3,4,5 represents the shift. Not - referenced if iparam[7] = 1 or 2. - workl (Input / Output) Array of length lworkl+1. - workl[1:4*ncv] contains information obtained in saupp. - They are not changed by seupp. workl[4*ncv+1:ncv*(ncv+8)] - holds the untransformed Ritz values, the computed error - estimates, and the associated eigenvector matrix of H. - Note: ipntr[8:10] contains the pointer into workl for - addresses of the above information computed by seupp. - ipntr (Input / Output) Array of length 12. Pointer to mark the - starting locations in the workl array for matrices/vectors - used by dsaupp and seupp. - ipntr[8] : pointer to the RITZ values of the original system. - ipntr[9] : pointer to the ncv corresponding error bounds. - ipntr[10]: pointer to the ncv by ncv matrix of eigenvectors - of the tridiagonal matrix T. Only referenced by - seupp if rvec = true. See Remarks. - info (Output) Error flag. - = 0 : Normal exit. - = -1 : n must be positive. - = -2 : nev must be positive. - = -3 : ncv must satisfy nev < ncv <= n. - = -5 : which must be one of 'LM', 'SM', 'LA', 'SA' or 'BE'. - = -6 : bmat must be one of 'I' or 'G'. - = -7 : Length of private work workl array is not sufficient. - = -8 : Error return from trid. eigenvalue calculation; - Information error from LAPACK routine dsteqr. - = -9 : Starting vector is zero. - = -10: iparam[7] must be 1,2,3,4,5. - = -11: iparam[7] = 1 and bmat = 'G' are incompatible. - = -12: nev and which = 'BE' are incompatible. - = -14: dsaupp did not find any eigenvalues to sufficient - accuracy. - = -15: HowMny must be one of 'A' or 'S' if rvec = true. - = -16: HowMny = 'S' not yet implemented. - - NOTE: The following arguments - - bmat, n, which, nev, tol, resid, ncv, V, ldv, iparam, - ipntr, workd, workl, lworkl, info - - must be passed directly to seupp following the last call - to saupp. These arguments MUST NOT BE MODIFIED between - the the last call to saupp and the call to seupp. - - Remarks - 1. The converged Ritz values are always returned in increasing - (algebraic) order. - 2. Currently only HowMny = 'A' is implemented. It is included at - this stage for the user who wants to incorporate it. -*/ - -{ - - ARint irvec; - ARlogical* iselect; - double* iZ; - - irvec = (ARint) rvec; - iselect = new ARlogical[ncv]; - iZ = (Z == NULL) ? &V[1] : Z; - - F77NAME(dseupd)(&irvec, &HowMny, iselect, d, iZ, &ldz, &sigma, &bmat, - &n, which.c_str(), &nev, &tol, resid, &ncv, &V[1], &ldv, &iparam[1], - &ipntr[1], &workd[1], &workl[1], &lworkl, &info ); - - delete[] iselect; - -} // seupp (double). - -inline void seupp(bool rvec, char HowMny, float d[], float Z[], - ARint ldz, float sigma, char bmat, ARint n, - const std::string& which, ARint nev, float tol, float resid[], - ARint ncv, float V[], ARint ldv, ARint iparam[], - ARint ipntr[], float workd[], float workl[], - ARint lworkl, ARint& info) - -/* - c++ version of ARPACK routine sseupd. The only difference between - sseupd and dseupd is that in the former function all vectors have - single precision elements and in the latter all vectors have double - precision elements. -*/ - -{ - - ARint irvec; - ARlogical* iselect; - float* iZ; - - irvec = (ARint) rvec; - iselect = new ARlogical[ncv]; - iZ = (Z == NULL) ? &V[1] : Z; - - F77NAME(sseupd)(&irvec, &HowMny, iselect, d, iZ, &ldz, &sigma, &bmat, - &n, which.c_str(), &nev, &tol, resid, &ncv, &V[1], &ldv, &iparam[1], - &ipntr[1], &workd[1], &workl[1], &lworkl, &info ); - - delete[] iselect; - -} // seupp (float). - -#endif // SEUPP_H - diff --git a/src/external/arpack++/include/superluc.h b/src/external/arpack++/include/superluc.h deleted file mode 100644 index cdc7085d..00000000 --- a/src/external/arpack++/include/superluc.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE SuperLUc.h. - Interface to SuperLU routines. - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef SUPERLUC_H -#define SUPERLUC_H - -#include "arch.h" -#include "arlspdef.h" -#include "arlsupm.h" -#include "arlcomp.h" - -// gstrf. - -inline void gstrf(superlu_options_t *options, SuperMatrix *A, - int relax, int panel_size, int *etree, void *work, int lwork, - int *perm_c, int *perm_r, SuperMatrix *L, SuperMatrix *U, - SuperLUStat_t *stat, int *info) -{ - if (A->Dtype == SLU_D) { // calling the double precision routine. - dGlobalLU_t Glu; - dgstrf(options,A,relax, - panel_size,etree,work,lwork,perm_c,perm_r,L,U,&Glu,stat,info); - } - else if (A->Dtype == SLU_S) { // calling the single precision routine. - sGlobalLU_t Glu; - sgstrf(options,A,relax, - panel_size,etree,work,lwork,perm_c,perm_r,L,U,&Glu,stat,info); - } - else if (A->Dtype == SLU_Z) { // calling the double precision complex routine. -#ifdef ARCOMP_H - zGlobalLU_t Glu; - zgstrf(options,A,relax, - panel_size,etree,work,lwork,perm_c,perm_r,L,U,&Glu,stat,info); -#endif - } - else { // calling the single precision complex routine. -#ifdef ARCOMP_H - cGlobalLU_t Glu; - cgstrf(options,A,relax, - panel_size,etree,work,lwork,perm_c,perm_r,L,U,&Glu,stat,info); -#endif - } - -} // gstrf. - - -inline void gstrs(trans_t trans, SuperMatrix *L, SuperMatrix *U, - int *perm_c, int *perm_r, SuperMatrix *B, SuperLUStat_t* stat, int *info) -{ - - if (L->Dtype == SLU_D) { // calling the double precision routine. - dgstrs(trans,L,U,perm_c,perm_r,B,stat,info); - } - else if (L->Dtype == SLU_S) { // calling the single precision routine. - sgstrs(trans,L,U,perm_c,perm_r,B,stat,info); - } - else if (L->Dtype == SLU_Z) { // calling the double precision complex routine. -#ifdef ARCOMP_H - zgstrs(trans,L,U,perm_c,perm_r,B,stat,info); -#endif - } - else { // calling the single precision complex routine. -#ifdef ARCOMP_H - cgstrs(trans,L,U,perm_c,perm_r,B,stat,info); -#endif - } - -} // gstrs. - - -// Create_CompCol_Matrix. - -inline void Create_CompCol_Matrix(SuperMatrix* A, int m, int n, int nnz, - double* a, int* irow, int* pcol, - Stype_t S, Mtype_t M) -{ - - dCreate_CompCol_Matrix(A,m,n,nnz,a,irow,pcol,S,SLU_D,M); - -} // Create_CompCol_Matrix (double). - -inline void Create_CompCol_Matrix(SuperMatrix* A, int m, int n, int nnz, - float* a, int* irow, int* pcol, - Stype_t S, Mtype_t M) -{ - - sCreate_CompCol_Matrix(A,m,n,nnz,a,irow,pcol,S,SLU_S,M); - -} // Create_CompCol_Matrix (float). - -#ifdef ARCOMP_H - -inline void Create_CompCol_Matrix(SuperMatrix* A, int m, int n, int nnz, - arcomplex* a, int* irow, int* pcol, - Stype_t S, Mtype_t M) -{ - - zCreate_CompCol_Matrix(A,m,n,nnz,(ldcomplex*)a,irow,pcol,S,SLU_Z,M); - -} // Create_CompCol_Matrix (complex). - -inline void Create_CompCol_Matrix(SuperMatrix* A, int m, int n, int nnz, - arcomplex* a, int* irow, int* pcol, - Stype_t S, Mtype_t M) -{ - - cCreate_CompCol_Matrix(A,m,n,nnz,(lscomplex*)a,irow,pcol,S,SLU_C,M); - -} // Create_CompCol_Matrix (complex). - -#endif // ARCOMP_H. - - -// Create_Dense_Matrix. - -inline void Create_Dense_Matrix(SuperMatrix* A, int m, int n, double* x, - int ldx, Stype_t S, Mtype_t M) -{ - - dCreate_Dense_Matrix(A,m,n,x,ldx,S,SLU_D,M); - -} // Create_Dense_Matrix (double). - -inline void Create_Dense_Matrix(SuperMatrix* A, int m, int n, float* x, - int ldx, Stype_t S, Mtype_t M) -{ - - sCreate_Dense_Matrix(A,m,n,x,ldx,S,SLU_S,M); - -} // Create_Dense_Matrix (float). - -#ifdef ARCOMP_H - -inline void Create_Dense_Matrix(SuperMatrix* A, int m, int n, arcomplex* x, - int ldx, Stype_t S, Mtype_t M) -{ - - zCreate_Dense_Matrix(A,m,n,(ldcomplex*)x,ldx,S,SLU_Z,M); - -} // Create_Dense_Matrix (complex). - -inline void Create_Dense_Matrix(SuperMatrix* A, int m, int n, arcomplex* x, - int ldx, Stype_t S, Mtype_t M) -{ - - cCreate_Dense_Matrix(A,m,n,(lscomplex*)x,ldx,S,SLU_C,M); - -} // Create_Dense_Matrix (complex). - -#endif // ARCOMP_H. - -#endif // SUPERLUC_H diff --git a/src/external/arpack++/include/umfpackc.h b/src/external/arpack++/include/umfpackc.h deleted file mode 100644 index 8c084ad0..00000000 --- a/src/external/arpack++/include/umfpackc.h +++ /dev/null @@ -1,216 +0,0 @@ -/* - ARPACK++ v1.2 2/20/2000 - c++ interface to ARPACK code. - - MODULE UMFPACKc.h. - Interface to UMFPACK routines. - - Author of this class: - Martin Reuter - Date 2/28/2013 - - Arpack++ Author: - Francisco Gomes - - ARPACK Authors - Richard Lehoucq - Danny Sorensen - Chao Yang - Dept. of Computational & Applied Mathematics - Rice University - Houston, Texas -*/ - -#ifndef UMFPACKC_H -#define UMFPACKC_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define UMFPACK_INFO 90 -#define UMFPACK_CONTROL 20 -#define UMFPACK_OK (0) -#define UMFPACK_A (0) /* Ax=b */ -#define UMFPACK_PRL 0 /* print level */ - -void umfpack_di_defaults -( - double Control [UMFPACK_CONTROL] -) ; - - -int umfpack_di_symbolic -( - int n_row, - int n_col, - const int Ap [ ], - const int Ai [ ], - const double Ax [ ], - void **Symbolic, - const double Control [UMFPACK_CONTROL], - double Info [UMFPACK_INFO] -) ; - -int umfpack_di_numeric -( - const int Ap [ ], - const int Ai [ ], - const double Ax [ ], - void *Symbolic, - void **Numeric, - const double Control [UMFPACK_CONTROL], - double Info [UMFPACK_INFO] -) ; - -void umfpack_di_free_symbolic -( - void **Symbolic -) ; - -void umfpack_di_free_numeric -( - void **Numeric -) ; - -int umfpack_di_triplet_to_col -( - int n_row, - int n_col, - int nz, - const int Ti [ ], - const int Tj [ ], - const double Tx [ ], - int Ap [ ], - int Ai [ ], - double Ax [ ], - int Map [ ] -) ; - -int umfpack_di_solve -( - int sys, - const int Ap [ ], - const int Ai [ ], - const double Ax [ ], - double X [ ], - const double B [ ], - void *Numeric, - const double Control [UMFPACK_CONTROL], - double Info [UMFPACK_INFO] -) ; - -int umfpack_di_report_matrix -( - int n_row, - int n_col, - const int Ap [ ], - const int Ai [ ], - const double Ax [ ], - int col_form, - const double Control [UMFPACK_CONTROL] -) ; - -#ifdef __cplusplus - } -#endif - -//#include "umfpack.h" -#include - -inline void Write_Triplet_Matrix(const std::string & fname, int * tripi, - int * tripj, double* tripx, unsigned int nnz) -{ - std::ofstream myfile; - myfile.open ( fname.c_str() ); - myfile.precision(20); - for (unsigned int i=0;innz;i++) - { - myfile << ((int*)T->i)[i]+1 << " " << ((int*)T->j)[i]+1 << " " << ((double*)T->x)[i] << std::endl; - } - //std::cout << " ] " << std::endl; - myfile.close(); - - cholmod_free_triplet(&T,c); - -} - -// Create_Cholmod_Sparse_Matrix -inline cholmod_sparse* Create_Cholmod_Sparse_Matrix(int m, int n, int nnz, - double* a, int* irow, int* pcol, char uplo, cholmod_common *c) -{ - - cholmod_sparse* A = new cholmod_sparse; - A->nrow = m; - A->ncol = n; - A->nzmax = nnz; - A->p = pcol; - A->i = irow; - A->nz = NULL; - A->x = a; - A->z = NULL; - if (uplo == 'L') A->stype = -1; - else A->stype = 1; - A->itype = CHOLMOD_INT; - A->xtype = CHOLMOD_REAL; // real - A->dtype = CHOLMOD_DOUBLE; // double - A->sorted = 0; - A->packed = 1; - - return A; - - - - -} // Create_Cholmod_Sparse_Matrix (double). - -// Create_Cholmod_Dense_Matrix (from Triplet) -inline cholmod_dense* Create_Cholmod_Dense_Matrix(int m, int n, - double* a, cholmod_common *c) -{ - - - cholmod_dense* A = new cholmod_dense; - A->nrow = m; - A->ncol = n; - A->nzmax = m*n; - A->d = m; - A->x = a; - A->z = NULL; - A->xtype = CHOLMOD_REAL; // real - A->dtype = CHOLMOD_DOUBLE; // double - -// cholmod_dense* As = cholmod_copy_dense(A,c); - - return A; - -} // Create_Cholmod_Dense_Matrix (double). - -// Create_Cholmod_Dense_Matrix (from Triplet) -inline void Get_Cholmod_Dense_Data(cholmod_dense* A, int n, double* a) -{ - memcpy(a,A->x,n*sizeof(double)); - -// for (int i = 0;ix)[i]; - -} // Create_Cholmod_Dense_Matrix (double). - -*/ - -#endif // UMFPACKC_H diff --git a/src/external/cmake-files/Boost.cmake b/src/external/cmake-files/Boost.cmake deleted file mode 100644 index 48dad5e6..00000000 --- a/src/external/cmake-files/Boost.cmake +++ /dev/null @@ -1,36 +0,0 @@ -set(BOOST_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR}) -function(GetBoost) - find_path(BOOST_DIR NAMES boost PATHS ${BOOST_CMAKE_DIR}/../_deps/boost-src) - - if (NOT BOOST_DIR) - - set(BOOST_URL "https://boostorg.jfrog.io/artifactory/main/release/1.76.0/source/boost_1_76_0.tar.bz2" CACHE STRING "Boost download URL") - set(BOOST_URL_SHA256 "f0397ba6e982c4450f27bf32a2a83292aba035b827a5623a14636ea583318c41" CACHE STRING "Boost download URL SHA256 checksum") - - include(FetchContent) - set(FETCHCONTENT_BASE_DIR "${BOOST_CMAKE_DIR}/../_deps") - FetchContent_Declare( - Boost - URL ${BOOST_URL} - URL_HASH SHA256=${BOOST_URL_SHA256} - ) - FetchContent_GetProperties(Boost) - - if(NOT Boost_POPULATED) - message(STATUS "Fetching Boost") - FetchContent_Populate(Boost) - message(STATUS "Fetching Boost - done") - set(BOOST_DIR ${boost_SOURCE_DIR}) - endif() - - message(STATUS "Using downloaded Boost library at ${BOOST_DIR}") - - else () - message(STATUS "Boost Library found: ${BOOST_DIR}") - - endif() - - include_directories(${BOOST_DIR}) - include_directories(${BOOST_DIR}/boost) - -endfunction() diff --git a/src/external/cmake-files/Eigen.cmake b/src/external/cmake-files/Eigen.cmake deleted file mode 100644 index 974a6f18..00000000 --- a/src/external/cmake-files/Eigen.cmake +++ /dev/null @@ -1,32 +0,0 @@ -set(EIGEN_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR}) -function(GetEigen) - find_path(EIGEN_DIR NAMES Eigen PATHS ${EIGEN_CMAKE_DIR}/../_deps/eigen-src) - - if (NOT EIGEN_DIR) - include(FetchContent) - set(FETCHCONTENT_BASE_DIR "${EIGEN_CMAKE_DIR}/../_deps") - FetchContent_Declare( - eigen - GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git - GIT_TAG 3.4.0 - ) - - FetchContent_GetProperties(eigen) - - if(NOT eigen_POPULATED) - message(STATUS "Eigen library not found locally, downloading it.") - FetchContent_Populate(eigen) - endif() - - set(EIGEN_DIR ${eigen_SOURCE_DIR}) - message(STATUS "Using downloaded Eigen library at: ${EIGEN_DIR}") - - else () - - message(STATUS "Eigen Library found: ${EIGEN_DIR}") - - endif() - - include_directories(${EIGEN_DIR}) - -endfunction() diff --git a/src/external/cmake-files/LPSolve.cmake b/src/external/cmake-files/LPSolve.cmake deleted file mode 100644 index b3f3cf98..00000000 --- a/src/external/cmake-files/LPSolve.cmake +++ /dev/null @@ -1,32 +0,0 @@ -set(LP_SOLVE_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR}) -function(GetLPSolve) - find_path(LP_SOLVE_DIR NAMES lpsolve.h PATHS ${LP_SOLVE_CMAKE_DIR}/../_deps/lpsolve-src) - - if (NOT LP_SOLVE_DIR) - include(FetchContent) - set(FETCHCONTENT_BASE_DIR "${LP_SOLVE_CMAKE_DIR}/../_deps") - FetchContent_Declare( - lpsolve - URL https://webwerks.dl.sourceforge.net/project/lpsolve/lpsolve/5.5.2.11/lp_solve_5.5.2.11_source.tar.gz - URL_HASH MD5=a829a8d9c60ff81dc72ff52363703886 - ) - - FetchContent_GetProperties(lpsolve) - - if(NOT lpsolve_POPULATED) - message(STATUS "lp_solve library not found locally, downloading it.") - FetchContent_Populate(lpsolve) - endif() - - set(LP_SOLVE_DIR "${lpsolve_SOURCE_DIR}") - message(STATUS "Using downloaded lp_solve at: ${LP_SOLVE_DIR}") - - else() - - message(STATUS "lp_solve library found: ${LP_SOLVE_DIR}") - - endif() - - include_directories(${LP_SOLVE_DIR}) - -endfunction() diff --git a/src/external/cmake-files/QD.cmake b/src/external/cmake-files/QD.cmake deleted file mode 100644 index b65e4f51..00000000 --- a/src/external/cmake-files/QD.cmake +++ /dev/null @@ -1,54 +0,0 @@ -set(QD_CMAKE_DIR ${CMAKE_CURRENT_LIST_DIR}) -function(GetQD) - find_path(QD_DIR NAMES config.h PATHS ${QD_CMAKE_DIR}/../_deps/qd-src/) - - if (NOT QD_DIR) - include(FetchContent) - set(FETCHCONTENT_BASE_DIR "${QD_CMAKE_DIR}/../_deps") - FetchContent_Declare( - qd - URL https://www.davidhbailey.com/dhbsoftware/qd-2.3.23.tar.gz - ) - - FetchContent_GetProperties(qd) - - if(NOT qd_POPULATED) - message(STATUS "QD library not found locally, downloading it.") - FetchContent_Populate(qd) - endif() - - set(QD_DIR "${qd_SOURCE_DIR}") - message(STATUS "Using downloaded QD at: ${QD_DIR}") - - else() - - message(STATUS "QD library found: ${QD_DIR}") - - endif() - - include_directories(BEFORE "${QD_DIR}/include/") - message(STATUS "configuring the QD library") - execute_process( - COMMAND ./configure - WORKING_DIRECTORY ${QD_DIR} - OUTPUT_FILE CMD_OUTPUT - RESULT_VARIABLE EXECUTE - ) - if(NOT ${EXECUTE} EQUAL "0") - message(FATAL_ERROR "./configure QD library failed") - endif() - - execute_process( - COMMAND make - WORKING_DIRECTORY ${QD_DIR} - OUTPUT_FILE qd_compilation.txt - RESULT_VARIABLE EXECUTE_MAKE - ) - - if(NOT ${EXECUTE_MAKE} EQUAL "0") - message(FATAL_ERROR "building the QD library failed") - endif() - - find_library(QD_LIB NAMES libqd.a PATHS "${QD_DIR}/src/.libs") - -endfunction() diff --git a/src/external/minimum_ellipsoid/bnmin_main.h b/src/external/minimum_ellipsoid/bnmin_main.h deleted file mode 100644 index fec751a2..00000000 --- a/src/external/minimum_ellipsoid/bnmin_main.h +++ /dev/null @@ -1,87 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis - -// This file is converted from BNMin1 (https://www.mrao.cam.ac.uk/~bn204/oof/bnmin1.html) by Apostolos Chalkis - -// Original copyright notice: - -/** - Bojan Nikolic - Initial version 2008 - - This file is part of BNMin1 and is licensed under GNU General - Public License version 2. - - \file bnmin_main.cxx - -*/ -#ifndef BNMIN_MAIN_H -#define BNMIN_MAIN_H - -#include -#include - -#include - -//#include "bnmin_main1.h" -//#include "config.h" - -//namespace Minim { - - inline const char * version(void) - { - //return PACKAGE_VERSION; - return "11"; - } - - class BaseErr: - public std::runtime_error - { - public: - BaseErr(const std::string &s): - std::runtime_error(s) - { - } - - }; - - class NParsErr: - public BaseErr - { - public: - NParsErr(const std::string &fname, - size_t expected, - size_t received): - BaseErr( (boost::format("In function %s expected %i but received %i pars ") - % fname - % expected - % received).str()) - { - } - - - }; - - /*BaseErr::BaseErr(const std::string &s): - std::runtime_error(s) - { - } - - NParsErr::NParsErr(const std::string &fname, - size_t expected, - size_t received): - BaseErr( (boost::format("In function %s expected %i but received %i pars ") - % fname - % expected - % received).str()) - { - }*/ - - -#endif - -//} - - diff --git a/src/external/minimum_ellipsoid/khach.h b/src/external/minimum_ellipsoid/khach.h deleted file mode 100644 index 7718673a..00000000 --- a/src/external/minimum_ellipsoid/khach.h +++ /dev/null @@ -1,220 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis - -// This file is converted from BNMin1 (https://www.mrao.cam.ac.uk/~bn204/oof/bnmin1.html) by Apostolos Chalkis - -// Original copyright notice: - -/** - Bojan Nikolic - Initial version 2010 - - This file is part of BNMin1 and is licensed under GNU General - Public License version 2 - - \file ellipsoids.cxx - - Computation and use of ellipsoids releated to sets of points -*/ -#ifndef KHACH_H -#define KHACH_H - -#include -#include -#include - -//#include "khach1.h" -//#include "mcpoint1.h" -#include "mcpoint.h" -//#include "bnmin_main1.h" -//#include "bnmin_main2.h" - -//#include "../bnmin_main.hxx" - -//namespace Minim { - - template - using MTT = Eigen::Matrix; - - template - using VTT = Eigen::Matrix; - - struct KhachiyanEllipsoid - { - Eigen::Matrix Q; - Eigen::Matrix c; - }; - - template - inline bool is_nan(const Eigen::MatrixBase& x) - { - return ((x.array() == x.array())).all(); - } - - template - bool InvertMatrix(const MTT &input, - MTT &inverse) - { - inverse = input.inverse(); - return !is_nan(inverse); - } - - - inline void InvertLP(const MTT &Lambdap, - MTT &LpInv) - { - bool res = InvertMatrix(Lambdap, LpInv); - if (not res) - { - // throw an error of your choice here! - // throw MatrixErr("Could not invert matrix: ", - // Lambdap); - } - } - - inline void Lift(const MTT &A, MTT &Ap) - { - Ap.resize(A.rows()+1, A.cols()); - Ap.topLeftCorner(A.rows(), A.cols()) = A; - Ap.row(Ap.rows()-1).setConstant(1.0); - } - - inline void genDiag(const VTT &p, MTT &res) - { - res.setZero(p.size(), p.size()); - - for(size_t i=0; i &Ap, - const VTT &p, - MTT &Lambdap) - { - - MTT dp(p.size(), p.size()); - genDiag(p, dp); - - dp = dp * Ap.transpose(); - Lambdap.noalias() = Ap * dp; - } - - inline double KhachiyanIter(const MTT &Ap, VTT &p) - { - /// Dimensionality of the problem - const size_t d = Ap.rows()-1; - - MTT Lp; - MTT M; - KaLambda(Ap, p, Lp); - MTT ILp(Lp.rows(), Lp.cols()); - InvertLP(Lp, ILp); - M.noalias() = ILp * Ap; - M = Ap.transpose() * M; - - double maxval=0; - size_t maxi=0; - for(size_t i=0; i maxval) - { - maxval=M(i,i); - maxi=i; - } - } - const double step_size=(maxval -d - 1)/((d+1)*(maxval-1)); - VTT newp = p*(1-step_size); - newp(maxi) += step_size; - - const double err= (newp-p).norm(); - p = newp; - return err; - - } - - inline void KaInvertDual(const MTT &A, - const VTT &p, - MTT &Q, - VTT &c) - { - const size_t d = A.rows(); - MTT dp(p.size(), p.size()); - genDiag(p, dp); - - MTT PN; - PN.noalias() = dp * A.transpose(); - PN = A * PN; - - VTT M2; - M2.noalias() = A * p; - - MTT M3; - M3.noalias() = M2 * M2.transpose(); - - MTT invert(PN.rows(), PN.cols()); - InvertLP(PN- M3, invert); - Q.noalias() = (invert/d); - c.noalias() = A * p; - - } - - inline double KhachiyanAlgo(const MTT &A, - double eps, - size_t maxiter, - MTT &Q, - VTT &c) - { - VTT p(A.cols()); - p.setConstant(1.0/A.cols()); - - MTT Ap; - Lift(A, Ap); - - double ceps=eps*2; - for (size_t i=0; ieps; ++i) - { - ceps=KhachiyanIter(Ap, p); - } - - KaInvertDual(A, p, Q, c); - - return ceps; - - - } - - inline double KhachiyanAlgo(const std::set &ss, - double eps, - size_t maxiter, - KhachiyanEllipsoid &res) - { - const size_t d=ss.begin()->p.size(); - MTT A(d, ss.size()); - - size_t j=0; - for (std::set::const_iterator i=ss.begin(); - i != ss.end(); - ++i) - { - for(size_t k=0; k p[k]; - ++j; - } - - MTT Q(d,d); - VTT c(d); - - const double ceps=KhachiyanAlgo(A, eps, maxiter, - Q, c); - res.Q=Q; - res.c=c; - return ceps; - } - -#endif - -//} diff --git a/src/external/minimum_ellipsoid/mcpoint.h b/src/external/minimum_ellipsoid/mcpoint.h deleted file mode 100644 index 0b9c7c5d..00000000 --- a/src/external/minimum_ellipsoid/mcpoint.h +++ /dev/null @@ -1,477 +0,0 @@ -// VolEsti (volume computation and sampling library) - -// Copyright (c) 2012-2018 Vissarion Fisikopoulos -// Copyright (c) 2018 Apostolos Chalkis - -// This file is converted from BNMin1 (https://www.mrao.cam.ac.uk/~bn204/oof/bnmin1.html) by Apostolos Chalkis - -// Original copyright notice: - -/** - Bojan Nikolic - Initial version 2009 - - This file is part of BNMin1 and is licensed under GNU General - Public License version 2 - - \file mcpoint.cxx -*/ -#ifndef MCPOINT_H -#define MCPOINT_H - -#include -#include -#include - -#include -#include - -//exclude gsl library Apostolos Chalkis -//#include -//#include - -//#include "mcpoint1.h" -//#include "mcpoint2.h" -#include "bnmin_main.h" -//#include "bnmin_main2.h" - -//namespace Minim { - struct MCPoint - { - /// The actual parameters - std::vector p; - /// Log-likelihood of this point - double ll; - /// A vector to store derived quantities at sample of the - /// distribution - std::vector fval; - - /// Default constructor allowed, fill in the data later - MCPoint(void): - p(0), - ll(-9999), - fval(0) - { - } - - /** \Construct with supplied position vector - */ - MCPoint(const std::vector &p): - p(p), - ll(-9999), - fval(0) - { - } - - /** \brief The parameter vector has n values - */ - MCPoint(size_t np): - p(np), - ll(-9999), - fval(0) - { - } - - MCPoint(const MCPoint &other): - p(other.p), - ll(other.ll), - fval(other.fval) - { - } - - MCPoint & operator=(const MCPoint &other) - { - p=other.p; - ll=other.ll; - fval=other.fval; - return *this; - } - - - }; - - inline bool operator< (const MCPoint &a, const MCPoint &b) - { - return a.ll < b.ll; - } - - struct WPPoint: - public MCPoint - { - /** \brief Weight factor - */ - double w; - - WPPoint(void): - w(0.0) - { - } - - WPPoint(const std::vector &p, - double w): - MCPoint(p), - w(w) - { - } - - /** \brief Construct from MCPoint and a supplied weight - */ - WPPoint(const MCPoint &mp, - double w): - MCPoint(mp), - w(w) - { - } - - }; - - /* - MCPoint::MCPoint(void): - p(0), - ll(-9999), - fval(0) - { - } - - MCPoint::MCPoint(const std::vector &p): - p(p), - ll(-9999), - fval(0) - { - } - - MCPoint::MCPoint(size_t np): - p(np), - ll(-9999), - fval(0) - { - } - - MCPoint::MCPoint(const MCPoint &other): - p(other.p), - ll(other.ll), - fval(other.fval) - { - } - - MCPoint &MCPoint::operator=(const MCPoint &other) - { - p=other.p; - ll=other.ll; - fval=other.fval; - return *this; - }*/ - - - inline void moment1(const std::list &l, - std::vector &res) - { - const size_t n=l.begin()->p.size(); - res=std::vector(n, 0.0); - for(std::list::const_iterator i=l.begin(); - i!= l.end(); - ++i) - { - for (size_t j=0; jp[j] * i->w * exp(- i->ll)); - } - } - } - - inline void moment1(const std::list &l, - double Z, - std::vector &res) - { - moment1(l,res); - for(size_t j=0; j &l, - const std::vector &m1, - std::vector &res) - { - const size_t n=m1.size(); - res=std::vector(n, 0.0); - for(std::list::const_iterator i=l.begin(); - i!= l.end(); - ++i) - { - for (size_t j=0; jp[j]-m1[j],2.0) * i->w * exp(- i->ll)); - } - } - } - - inline void moment2(const std::list &l, - const std::vector &m1, - double Z, - std::vector &res) - { - moment2(l, m1, res); - for(size_t j=0; j &s, - std::vector &res) - { - const size_t n=s.begin()->p.size(); - res=std::vector(n, 0.0); - - size_t N=0; - for(std::set::const_iterator i=s.begin(); - i!= s.end(); - ++i) - { - if(i->p.size() != n) - { - throw NParsErr("moment1", n, i->p.size()); - } - for (size_t j=0; jp[j]); - } - ++N; - } - - for(size_t j=0; j &s, - const std::vector &m1, - std::vector &res) - { - const size_t n=m1.size(); - res=std::vector(n, 0.0); - - size_t N=0; - for(std::set::const_iterator i=s.begin(); - i!= s.end(); - ++i) - { - for (size_t j=0; jp[j]-m1[j], 2); - } - ++N; - } - - for(size_t j=0; j &s, - const std::vector &m1, - std::vector &res) - { - const size_t n=m1.size(); - res=std::vector(n*n, 0.0); - - size_t N=0; - for(std::set::const_iterator i=s.begin(); - i!= s.end(); - ++i) - { - for (size_t j=0; jp[j]-m1[j])*(i->p[k]-m1[k]); - } - } - ++N; - } - - for(size_t j=0; j &s, - std::vector &res) - { - std::vector m1; - moment1(s, m1); - omoment2(s, m1, res); - } - - - inline void StdDev(const std::set &s, - std::vector &res) - { - std::vector m1, m2; - moment1(s, m1); - moment2(s, m1, m2); - res.resize(m2.size()); - for(size_t j=0; j &cv, - std::vector &eigvals, - std::vector &eigvects) - { - const size_t n=sqrt(cv.size()); - gsl_matrix_view m - = gsl_matrix_view_array (const_cast(&cv[0]), n, n); - - gsl_vector *eval = gsl_vector_alloc (n); - gsl_matrix *evec = gsl_matrix_alloc (n, n); - - gsl_eigen_symmv_workspace * w = - gsl_eigen_symmv_alloc (n); - - gsl_eigen_symmv (&m.matrix, - eval, - evec, - w); - - gsl_eigen_symmv_free (w); - - gsl_eigen_symmv_sort (eval, - evec, - GSL_EIGEN_SORT_ABS_ASC); - - eigvals.resize(n); - eigvects.resize(n*n); - for(size_t j=0; j &l, - double Z, - const std::vector &low, - const std::vector &high, - size_t nbins, - std::vector &res) - { - const size_t ndim=low.size(); - - //res.resize(pow(nbins, static_cast(ndim))); - res.resize( static_cast( pow(static_cast(nbins), static_cast(ndim)) ) ); - std::fill(res.begin(), res.end(), 0.0); - - - std::vector deltas(ndim); - for(size_t i=0; i::const_iterator i=l.begin(); - i!= l.end(); - ++i) - { - bool inside=true; - size_t k=0; - for (size_t j=0; jp[j]-low[j])/deltas[j]); - if (dimi >= 0 and dimi < (int)nbins) - { - k+= dimi * static_cast( pow(static_cast(nbins), static_cast(ndim-j-1)) ); - } - else - { - inside=false; - } - } - if (inside) - { - res[k]+= i->w * exp(- i->ll); - } - } - } - - - inline void marginHist(const std::list &l, - size_t pi, - double Z, - double low, - double high, - size_t nbins, - std::vector &res) - { - res.resize(nbins); - std::fill(res.begin(), res.end(), - 0.0); - - const double d=(high-low)/nbins; - for(std::list::const_iterator i=l.begin(); - i!= l.end(); - ++i) - { - int k=int((i->p[pi]-low)/d); - if (k > 0 and k < (int)nbins) - { - res[k]+= i->w * exp(- i->ll); - } - } - - for(size_t i=0; i &l, - double Z, - size_t i, - double ilow, - double ihigh, - size_t j, - double jlow, - double jhigh, - size_t nbins, - std::vector &res) - { - // Two dimensions only - res.resize( static_cast( pow(static_cast(nbins), static_cast(2)) ) ); - std::fill(res.begin(), res.end(), - 0.0); - const double idelta=(ihigh-ilow)/nbins; - const double jdelta=(jhigh-jlow)/nbins; - - for(std::list::const_iterator p=l.begin(); - p!= l.end(); - ++p) - { - - int dimi = int((p->p[i]-ilow)/idelta); - int dimj = int((p->p[j]-jlow)/jdelta); - - if (dimi >= 0 and dimi<((int)nbins) and dimj >= 0 and dimj < ((int)nbins)) - { - const size_t k= dimi*nbins + dimj; - res[k]+= p->w * exp(- p->ll); - } - - } - } -//} - -#endif diff --git a/src/include b/src/include deleted file mode 160000 index 5f9d5661..00000000 --- a/src/include +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5f9d5661fe4fa24ee818205fdbd700e3d41381eb diff --git a/src/external/lpsolve/build/lp_solve/Makefile b/src/lpsolve/build/lp_solve/Makefile similarity index 100% rename from src/external/lpsolve/build/lp_solve/Makefile rename to src/lpsolve/build/lp_solve/Makefile diff --git a/src/external/lpsolve/build/lp_solve/colamd.c b/src/lpsolve/build/lp_solve/colamd.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/colamd.c rename to src/lpsolve/build/lp_solve/colamd.c diff --git a/src/external/lpsolve/build/lp_solve/commonlib.c b/src/lpsolve/build/lp_solve/commonlib.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/commonlib.c rename to src/lpsolve/build/lp_solve/commonlib.c diff --git a/src/external/lpsolve/build/lp_solve/ini.c b/src/lpsolve/build/lp_solve/ini.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/ini.c rename to src/lpsolve/build/lp_solve/ini.c diff --git a/src/lpsolve/build/lp_solve/liblp_solve.a b/src/lpsolve/build/lp_solve/liblp_solve.a new file mode 100644 index 0000000000000000000000000000000000000000..f60b49d5cb1081eca48967823702824df34fbbd7 GIT binary patch literal 3553452 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�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�y&03SJSpyS0owC~+S$EBO;SddEX zemT8YQJ6a@q@R?xygVH1jWm@?ZO$xuA4A8Xv2@fJLq`MF=`@x`V`J#pz|*%I3+VVT zADTu-glzhoOVedE-#$8|(GqFYdd;Ty3Tu239Sv-?-|wQSxt82UrKsjyOJf}|pNy$Ji$6Dpy@`A+4d?_1&V*>DDzmrf09-u?EfVrbp@ zt+$@mvOQfKQLl6R^zG^9sG=st_VG^XKOpCtF1gV$QN6DJKcu|}d{jl$H+-kuyPIq> zH_0X;^w2{|2qh4D=m|T4WRsB4Lk}nrLXct$NJk*_qDa>WNKrskRKNm=1wj-=1r!m* z0w_fg_|BQxB~g5S&-=b#;LQBboHF&!o!e$DNQM909KcP7>2?n@BSwUEc(_Vh#qq=H zw4X43#DuJoef)W295P_k!3y@lxQ69x)jP=U-o1M;{$Pc>jp{Y)7WIf{!nt$jgsp<| z=gxuf+_~s#)objoxw}{S&S&ATqwI7yJ%gLsy#xCO29D^NKJvna3oTo*Qwn!*j{*+s!HtYRf+!#G-v zR;A4oTeNJ|gg0%SP(c{gV;eMzuTisBXyYo)+SZAw>o$^To2s=tcA)LUDNXN2siYa5 z(qQYf&PI>!a7KXLm9o0DOO2r3o-{q1){lZC*+}k6>(P|*y>v0)#KnUnZ`8O+06S02VV6pUAAmV-Lj?JmaTltpODyT zOMRaRBFlNbQk4JTG>m%|p)fjOEL90_&>^kgu<;R*Rm-_5R%+a~&FChTn>Mcv?cAbW zQu{6`IS&`6cJGs!mFMj-@FAW1zr*Tq*2U|!ig4z30gi?q59UtO)PUV0!7F z8@Mo7Jzy%{zd>2B3WFfTJ3J_j0E}0Vh$7Ug!|w<0(V$fO^vCEG|B%-{{2bml`rrOw zWZnP!pYVMJ0H{+|udM9<5B`_WBA>6KRV(rDwRW;|PIPClw}&^nWpu4^(YR;!=rPf? zh6EbJU|;HoqlY~_bYe8@$~}7Y(1K{#k9=ssXh~&54e$?pb|JKSM zSTJs=ZV>~wK399;N8=XiLx&hyqsNWU$4&gfJ8Y;PjhmE5$Hdpg?ZPz!TdPM8otO_h zpo2Q3)*51rn>4y`;6$HGUn35km^ToAhrqwHIJR>ws3lg&ms#`}XlUp^Ob6*OC;)V6 zAXWpnu^bH7@BasVI&`$M_BG$A5#z=|p4v|JdUR}=;gAm=Ypa`JKK(&Bkff9ha1N8%X3}`9PHlRa5p9B34bQh=` zybD?zC=RF@P-mb%K!bq_faU^i1bPJsUlo4`=qS*6pgTa3a5ujSP;H>rKv_VefgT51 z1@sEgK_L7=*zbY<28w_)OHH6QKoV#i&=#PhKqr9y0CK|_r8-a}pd_FkK!bor0?h&1 z4D0gVTO_kxV4ft~@{4D=e%0iYv5p8|aebREbI zXF~k(${IlRftmny0O|(h1?mkn2nc_$vH)l@&{Uu~K=@;otAJhv+6#0D=yRZNfi3`< z@N}gjPz|8^Kuv&J0d)lO0A&F60U8NZ05lnBD$pFDML?^7)&uPX+7EOX2sdUw1#}kZ zXP`iMa#Ifoe_(P7&|aV)fEYZ%i2$k$)BvazP&c4nKzTrufo21(0D1vv572u+p8;J0 z;_&pRGEg%h3Dh5G7SK8%-0gNR&>^5NfGz-8Fy~YSY6rxPJd(xpu9W8+NY)yDrTmTx z!0)Iqzo|+9d3BP>tG^jU2Jkn7z6qieV)!>fzXUf7pEtql@mV810PsAOfQ4k;@_>+7x-EJVZMxtZf33^556s zbD7W45w08^;kP(RhhU#u@%!8d+{DWdxMxHten!OH2xy+U5sNjyIASOAJ0qTsRPv`I z7eUDUna3>!-0gUcM~y8RRxaZUzn;;4p)7f6q2U@eTemf18Kp8zJ}Zu?i(yii(Vq z9T2SH@9=m3GyPqD+5~S!VK>7ddbRwK@+8gRv&?mHAqZwKm`6>h#r&`pVTxZ7wlT~s zG#XV~!#9R~8U~_I!BVFf{Hl4w40{Z2{8TF0jak1AL8D4*_ziQR75%eZ*z;^ioo9a=3ar6j16QhtmO3}O5E#5TXhRSSrEAoo%tFZ;{-u4(hI!zYJu?Jr zH8bSB5MbX6Ijz{!Ay0*pEQ9X|Iv4~kvod&fFhuLbE&gohP8F!Bw)I($<&7JZrTh&fw%W)+yZZpUn> zi-YN3?DfiXtEh%tRps?6&^pi6-B4HYB~5lUQD9e-lTA#xX$Z%_$tHK2fX*G5`g95$ z1GT2r#;UHWy;a2rYk#KVtF>p8i9>yy>9Ki!iMtNzd`ZI>8)EX&h8IG1>@ZpRZ&Ciu==OUephzH7RtshwYD0M>A>;foSJO27dR zotyAy0=W4z;hScpKmVrLxn@2$XA}NPfaCqIgtN_HK%UitOl1LrbP$|r27}~`7NmpV z?}XFMpeUyy1>32p`K!&r^Q+B&O9Z{&5-%tEJS#ya2!2T<{ZVgQbMUvV`Ok@9{j=6X ze>2Mp48ElK?}^wShnmkx#0L1J`Nif?z)Q_{CSp51-QvR*&<$U-*wPZB(=9JRWbnl; zzHLe1WcFc;vn`++(_5Zyi9Rm3oY@M>HnY`lt)bSxwZ78YS2iWc1i{a(u`pVIwZ4fK zeu2Taw_4X4{qAjziluQ;n`Ldl@v=5E+kySeb_?41D~*Co5X@@_tuapv(6O>e2f^%i zaPpn41z7!O+RSf$CtfTvAp5he^`$Byey%=`QNsO`6soxM}U@wMXy!lWrw} zlUqqowFkGbsCfzn(AqwMpS|U`ehRD&zP9}>^m42H>JGlrtnIL;1ElQfu(u-=b8pAj zI^Gw&(E)OJqr;w#ko_Jlz+$fLP(}b5c0AV+9GvTTwiD=`?R2q|&%wK81<Z%aB{vc~fVl&Np=~?uw16)L^lKY8hG$I!CKPH8*wMis@TB@97MM+XF^m zj-|TX2^>OiY0Y%h1eJ89f`j=r^gjT)rR(!uA>-$}9!!SrKA8M&vd;hAP@WF*-&3I2ziTQm0@StWzll|IBmNgA?Lq&oYU9EMJ#C zo6DXTCD^>EQ_$v$N`Z5R+#%6sZR)mEu-TUSek$bte(IrA-42IRKgRTrQ%_*}iPUpC z9WqIs)*S@Xy07jI6<^(bJ#y>2Z|<(`Hh15R>ASlh)Cp)XyE~L&HX6Wc01e<^)CSO? z${@pUfJOWha$s4DohlF39{?Ju6ja6(IQMjarn@=^`Ql^Uf53wL(0yS#H2cEzmFYAd ze4X?suYhD&ucRMI2dyLNH%8G3iTuW>d!vB8H)_#nWEYKIIvUueqj!w~7PY5)p{&!r zmosn;bUEW%22|}@#-BZr{j=x1Y+&bQ&lrmAjG=Rf0y}r;krBuq8F69+uqQ^KuNZ@W z1-?{|znS@VCQQpmGA}}8@b4g9D_tq4e)zmqr0QWAvKQ5dAQE z${2{IjF}4s3gL6dYzOwA`ET~ZiD9#MyO&Og=i9xPk$pGgOa`p!&Sb35!qoLyFJwXL z3t3M=1IF{GM$H%n?2J)!6gy`WqZV4H@cE zXG6x83~1slSlatnFlEc5xSepsa+RTznI6_xr!E*R~EJ2Ph ztB}L6ke%*bjII}F9Dz=Z=0`F<%7Eto2>KG)YZ)J8f%Jo{70{>Ad_~XIJ%L@_^E;?d zH2)604S@Q;Y=2u2v!{lqKdeNBYmszTd(Tf6eMlBt!0JekzXoEnP zP$fKo*~88u@xaH?5h3c8s-Lp#Ot zsYUz!Y*e$A$>s@chmuS>p%O32+=1h72Mj}G-_AUshvPix-%3!5g;^k7n1#c(lELqI zpUJ>e?=kPsdT>HN!R&SpS-671u?o}K{EWpJjwg*qHJiXfcX7tv49A3M#Ta}>=H*Nn z5|=Yo?Ow=w8;8%^S!;V@m9wAEhUnLvTR9Ld>3yRQL^J#D>I>0{zBBqk^nJgQ{t&&{ z|1d_k`k%^$XyL%)10lLS@W3F5E)Kee(dNOs2Sapz@bn=NEgkY9MstULHx!~R!?q2B zXvXl>!y!69{31qohtJQ0=t$mY7+oDPeI!JxtNTLN!odOs9P=zhFnhxoV-r3!_)6>~ zIBI`@@j`mRI5~jPfu4W%R5QV%Y~U7UZ_B0=INz52C9+>;@6ADWZ_Zmez`m99y<)%5 zxr*%7oLRk4I;+>tUcm0`wV*e$3wqz_1MHnXGy6hwsV3>gclAA?TV`KBknQVtupg=( z?DtB4U|;F~W`9t9v;TX@z1RPAe-xhXe-_!Z{ckDuR{xW^z@E%q2(t-?cKm)Iu-^~- zZ6Fl?w}C~2fh!t3cQ9~s2fvKm%P_UTtZ{zu+#$ft9kO%?WU_R~5#){xIX(p493S!( zvR@6E0uv$UQ-+=y3hbGo7ZrPP=%Qi3E*kbcOiG+TKkN%+zZiC7802ze*oNW2Z5Y01 zIQZQ&d_QvghkrC2RX-Yj9NFW;&ns4STQ7cP_>w$GU6Qvw4@|b_9l76$z4&K&za#g1 z-c?k&nl~G!V$NreSTO?F6WGJO`1FxGv7>j6ynx(=kyl5e&ef4Ok;OwBqHEawz0_O@ zl~<#n7n~|_!iUjNf-xKutFqT*!$Gh{^>+yL_h-m{mi;Yse+d6Jdu0w3aAnR0=`?KJ zK5wdcf1jy+Arn=3Fgt{7nr6XzPT!*_eL3%4D2c%rBAcdJ%)9S5z(U@Ae^T);eg9DL zAASE;@x8v^_k-3rG2-e7h<1*=^e{xv;yDN^Iinv4;gClm_6!L7Y9X}5g?@YcV}`$C z3^^RdAr0|y7}IEcr~jJ+pj>x{&rs!>HemAr6n`?{a}|F+;DU;O8gN;~mj_JCMfuF! z`6`~D`<#l`<(8-dPv_pu#caQWV+FHWGVtO+$VLr9NPcGEZAb?83JhGhf*!bL z5J=TX0qOKXz@}*y@>)OWMPOm=I_PB;?;dm!wck(!I|Rn*d>E%8d_Im-u-=DaJQ~j9 zL2)$?77~!fr9smNqx9;a&4ZEOJNU5T-yVEk@jnipIt1mvVGNnA7_vsiYlduA@k@A= zX2DVV%@CZycMXB%3b>g+bp22?TZ%E5Z5p~&#aoB&R`K4UZ>#w2p@&s`6c6VtI129$ zN3-KYpBn~+R4jPgHf#n=tp?wNG4Qj8FI8&A7=!m|qw$nQ;qXqFt|15yRmSN{Z7kaxv1o@lG{J#-WWI~-W&7nSU5z#)pA&W zD>om z+#54DAK1D13&+9=Zy`Db-Nj>H1tmCI3+5LYpF$QE^2Z9!6hIlzAPWni%LP-$f%24bGsdY)gMz!Le768t$mDXtU#R>S zu#gE}V_*Ka!avN5$E`+htH-S$hglbodj?|u46=9wX50#h`3hvAB*o*FLd=&U3nkex z?jyAQXx!97Xp5+jOu!g;|}_0xW}e`Y%^y^iP03EE6CH>{HAF4}(pG?-W7--$52S z@@(N1EZLR9nd70nGsn*wuL{U#jh{On52~|;cd(py3Y7o`y%IpXpDnyu2u*Vn<#0b* z%VE$fIdsI?!b>Q)gz_A}-0PEj4S3PIRxP*5Y88|VDOa&pXvHvVT)Dz>PZM}#M{63a zc3YPVo|3Yr2CJ3gZs}@eQh4ab3Bl)qW;J*$*c={0Tea2mK}RG+tQKg2i4&}AY3l%l zE*I{E6R1o8xbEwMeNd@;c$&+>xyz-!h!`-f1kW~YTV)aACg=(a0?!hI@0ThOT!tx` zsSVxtWiFJ3mtny&0z4X#_kDpvIXCg=8RZ7It>O7!`A7iTU4;lJR2@jGXsU8lDp#f) zmE(ZHBGoCM;%-+yx*9yUuVQLj6C0{3)(;hsi7wSvn$=4A6t_yLjvIj0@Fly@sYr+sLsuxGF?~|e?moKXb&pl0pR@X`B zsDWbd*CnL4`ksICSxO$n{(8#c@KaFYxl18RcDHs9#h&io}pb4bd z2%18Q(n-LqFr`_bu8A26&qbU28N*0)k*peq(ZZ#Q4v(=hyQ~`i%vv?|d29_$b-zq) zlF5_q$H7tC6v*cZ7|iXGji*QyCM7-C2=MtlxCt(`@8D}m=$6*y+rfb7m~3c=ogTDC zdFKa{v2D6wQ>u^Cp zzCRi|x1}HJn4aP$rC)H9)6coXNl$VIXUqdaHk;6O2G0R#PC{jP)vzB#j-eQ^h7QQY zuxJIxc!*6>*9krXoK6P|m<r8?CO7TyY5XeFdOc~^kS_EE!=EH-bNjGbA6p%>NC+`(JK9ENDm3Bru=_RgEQbI zP|o8-jUp;)7I9Il$SGJD!A1=En% zRWe^Y6G=qpNZ8l4!rOQGrXvC!R0I+GTK?ony8 z=&aCJ6`D<-4&AH#&85YLodflC289SW<-d) zX&$CTM!DN6QMt43b{brCCuwlm-Cl#6;T^s}AND1wB0G>RnQQloMtJoP)Ytr$hZ`)CwR!u#e!`p+$cNXRt80vKQ zR3I$Kovna7#GUgH>V!wRdnphRZP*PV#cm3LqcsGXfkBZO(Seq`2Ub4NX}HsrZGh9A zu1o?$++GD-uum5@vyEoC_&~K*K!3&rW4{eLjzbVE4t7K?I^}BQ9)fc;lk?q=E09v?ege0zb9I~OF1mmqwa7gcr$|@#sqUxnl}=ZWr`*%7BS@d+ zo^cOBuVVKs2Xv^b&kFY({FNkE-?i?iRTlk9-1Bfyx%%&L&&RpKHDIs1Sml+w-@Opu z4|NTC*Ra0;KT(ryY#9d*oF~Z&=M)F!*ayCmXWs^$^3z@QmBLK2(hdUasM$8|X&5!v zfum_bP+X}AY+o1$B1ba_o@X!Gtssuvl*B%FuTV4DDZ{-ITZVn*bgxq2bcp+z?V!cZ zM!EIe^+UA#IV>%^RMWjifvYj@wF=y9;9jS|t$6o(1#UMD-JpO$5<@pCMBzJC2iE&p z_Nk32E(~_EUc~+YQXR)37-2jc`E{-_*Zq1Ryuu0}*17j#lNs}!?l-ai#)1&{TN;GA z-_{_^yj`+x@F?t>acxZlwr(*3Rm<=pRS5aoVfgYxb}8dPu})}W&Mhz6D1A81h7 zeN=-g?hh3xuIm0sgJ}213M{PV{zQRA)!oMwSX{&XsRB!Cx{oWcw3hpX0?TT<)vRYM zk8yv72ZOP^p8F&=hq0o8`*Q_W#=F13o-kG=x=(44+Zx;D#*G!mFxmbb7sQ{*NFa+-L@e8w&hE|W2y9N7ugJW8AsX7FnzLFCd#V* z#AcgV%&I@LIT~DIbCq({U;N-#_Owc=UiCM&+lS7xeI^#V>hJ6=U(#jvjzW-8^{SWI z-zL@*>UV`brR#px53&IG8sRD32sK_e-oz5t{KI$?+o|TC#+z8In%8uCt?S0ySnFCh zjQ#I{+gdk`1FFHR{lywucnYs_%MaoK_$t|0H9*zdtcj&6`8P|jC@g%d-erv}W$(hJ z*d3NlYTvWV<6x*`5W76Sb#2(yA+&JB#SjuQlAwNF1CbKf3l;FLE6M(nvm}PH`o>=f zaV5}z!~?=Y#L^3_GsC8iwQjSH42u!xxW#=i)_IF{U|9aRz}uX4QjQu<1H-Uk;F9%Y zW<2RX5BNr~+FAy2JQ;xRt2bsP5H`$%APio=HkfckHAxx^tkLjg2;IDX zcoFqoB}9vGc*)#gB5H_yd3piDrDs|E29Wx=J z3YI3Jsw#}CDDLfPuzM!|S6@OEt+?uUIg2)N1hqT}c5uCAmP?2}3J|nEg9v&aKQd@s z?E-|Y$nOxspK=_n98Y?n8i~%hTK70>$Z=T5#$RW#91p(OMmJa-$HT8B4zU184o|3o zt<$)sZk!g?YNAE$>+C#33zbWCmCJb+{_oMyjS7nM(cK05zYlwFS@%qDHjJsfDxN!sgp|jTUizKoZ;dI%}tWHMzl(N=wyH*|qx*yLe^S^g2t`b_q9F_foq? z$}aUk>>4Y(X4hFCZP)w;>sxBqMA`NE54)y#VIP}#osH0TEpD)prFIF*Zo~t24eLPL zhkYk8eb(B4|zU=vHdB`R+d9`I(gXweJpT3=_=v|XDUYk+x}fgDqAzu}N3i64hI(k6J0~MGsoHXzj&Z+h1oJw1*Bi*v8Ua z+bFvY|6$iwjrNY$*>+{8a%rcuxBrKBlG5&Uo$W2vZm+cW{)cvlL@ZP1>+FCoQ2;D!T*!Vb@97b-m6$)ON`?*hi&yxH&9LsQ+QtMcJiXXJ2T$Za3JeQoF9o?u-Ah zOYVf_^jv4(X*+p?eP3#qqU^r=54&!y(Ju8m`%T%Yw(}_M-yYO%a}Vy6$+jemJ_*;T zBm!}K>eH6wkodN++YJQi7-Yi! zH*MYqQD4N3z!@YMN&Vh~h9cQtakkabpnE)oYR%H)0^9DuHA`HYX|io}18-gDzvl9;H%Oy$WqC0gcw%IsecMbC~ zMh8mFnicU>Rl3?YlAg3-QAo1C<*cov!O-&%;!?N4ucTctF@xad{4twO3`2 z9dUtmP_5STTo1f=*~vi@M*av;EuV@=0v0YGTcR&6pqi4tY6WGqVQKK46!CR%M>lX& ziP331eDn^5_=dA1R{a5%36aV>Hy)7crhymOQMJHT3&uxAqW@!7Fq~%pxnRst3&uhB z7mSbm*Mbp$<<_@g{AVxXf^nki_Xie?la!5GF#f|v*LZRx^!S-Y69%gV;}BI{b+|o> zmGyVVV`Y2haX*8H+Y>mn$Em{&54tS+81x?sCYK7HfJ{0UUWbrmf6ZC2x)|s}vf=?^ zE5Td27g(rjrr5r>n62co{cf`mbxDvI6x;uA7NxEV;DE@#tQ?)@tgBT&3(mt`)n!8c zp0Hx?stg)r#{*LBpL2nA(~f)HW+_VAVk}G|Mr`k&SeD{r`~1wZ6{>oPWh!547#FCP z8*Kgin9*Z(-2LGR>*NGIJja7ybsbt77#%nX4Xk()4r`r=i-%;x{t6OOzK38F54+iI zBi|b=`f-m*X2robt-0LrILKCn1G&=^Ku#hY#6vtTau?xX9_0xpjbODehVW>QO_C4} zwv?4_aALXY!ZO8(IkMXmfcH}vPkMoP3_T(jmPr#eV9mzg~Px70x zGdYT|h#N$9C0`+)!kt8>ke?7wxeh;7%CT% zBZ!~p@l-A*zaoBtCsMhTRD>B^l<*`fmy=G2U*ySDt|S?VH}f;I_wln-?kB$?ev@CM@*uf`_$_{!%6Can zbHH!&n^e9}Dk9#`4JHqhdWa8jCzBtL7Kjh>5GFq)$%xxv& zOa>!9&WoA+g%lt@!B;T(8<~RmGrpF|%cL0bNnXO_Rk8;0=X?i~f0Av8zucE zJcrAwbOPdEcrKUK=^KcD<#}Azq#q#ujpuV&hX%F+{5zk>Wj)#h@nv4bWdk}6@fALc z%Q(6S@l{^TWjx)F_z%8<%f|FP;y?LXE}POn5MSdZTsET=mjB{9-@#=f4Mlu|@8z;3 zjYfQv@8_~LZHV|UewfR)v@POW{1}%>bP(d({1lfR=vc&m^RrxbqD6@B@QYk_p$ib- z<(Iikrq3b1$8U1kjlP5!o~N5q(tU`D=`>|`dKNJ?Lrj@Q1KI#)W|S$tv?gM1Mw>E| zHbHEfF{bQEyCb&DcvI%keuy1rqA7dRxrm)+k}3Pr?T7=+WK;I1Zy^pe(@dF5KSJy> zb4)pievLTD%r)f@dI@o`nP*3D2(!eLkI(|dk>(ClPNY*1moxX8ax&e7 zILh2_%E#y~#O2MyrhI~agSdiu%#=m+7sM6KQ>L6sZzHZ`o;Bq(8VEOFL}l}$DQ8f; z86&EgmrXf~wm@9fylKigG#PO;Ypr=2~(i?SMGe%(LY4G#zoAnQzGwnv1xhInk1v>7$6_%_2)~ zrE?HBGG|$G8(oRGu~}@%9kc{-6LW0X~_@hEW}Bs;gBEF<%rwElVABUeI9WKGsGc}(cOqU zno$mUoPLYAlNs%hpV40tcQ#`j@^kt(;x1;qL!P3p4uHFwi4OS{t$;Y$OmfJtX@U9J30)pG;z`f124tYi6KITS; zysB|uv&13)(72zu)gk}XxWBo>A+KpXz})4K*EJqw?sdo;8V`p1x$>sQL(KgS`4`2< z6k@pfu0!6^IL~~~A#ZCu!hGK$|JHb^YDW6h5ol4)FEe(aE3<8kIE4r!`;`C`0z%pom}A2C03NQcG~%u^2O z)Oe!#wL=Cle6%7an`a#|kiCGH8IPJ59nz)oljdcI4AOXtdD9_-HJ%DP21%juG}Gyn zwtBiErkf#78KTo?m{Cp{s_{%S+9|^{o@K^3rCZ}UX1r5|Yy7mC=#&u}&o`5tGE(DW zGubK2X}rixbIK@<7n?awS)LumHP2Er*C{J#yv)pV%8D8m%BmW#HfK3yw8qbwPdjBbjn|mPPFY>!wdNA1tikY-U#v4%zz@o>uW(Fm zG}k(1Ev@ssS>lwnHGaX|>XdafE-`mFWsL5x7tLKxSy$sN=5D8~r}0*Ek5ksy_$BjI zr);46XuG-BDPy&t9p-+gjMI3h`L0to)c9rduv5ls{EGRZQ#R6gmwC)78*9AB{LCqv zFnrlUyk?$q%BC8>Zk~0@1h}II>2H`9owAw6`^?Ku*_@rhI=*e*bjl=+_nSt5Y_IG7 zj_C}L9av&V(0Shs36O(yUWd%606AFW56nsda)`!9&FBC*RO64#ngMc{?$eLWm;gCk zkELT~e1Oc;_){}6K#pKr;kKhVVI~F0C$#NJGdVy$sqyEg43I@y=L<6}Ku*!Nr_7uH zIaT{VZRQ5Zr*!()W?q1trqj=u`2lje#^=n50dj`cId2vP$eFrcKbo@w@Ml?wFSYfko$BUxpgx@ey@F+mJul5)O~7M&OrH=#ttha zP@dQNE-NZf{=o86pgciVbfEl0`wX^X0_C3?3#&n(yr!{j#Rtmk8i!a-1L0n=nseM% zVxYXKak!NfDF4zp!b%R5w=|Bl(gNjeZClRD36y_p9A)(lly`K!%3HaC@~*}etbu{@ zp2iieL4nfXYA&s04GxqWLk ziUOs@RhesAvjU|<<62g6pmb^+W33330UFn})&|Nzjq6z@fpUeeOMPocpmgc<2G-s{ z8KiNnwLefMYn?djaG(s<=?$%8fl_E3Z=DL1wl04Y>ujJ5(YUE~K2U~goM2rHlwle- zvwjJbZm#CW=GNsv8Lrb4t($=|LgNY>0$pt^qs@gNz zN_NRw8mCxkE?JwWpnnN(am%LsJmOR<*CktMoir=YC0lBoZsogVD~-L@M3-!>ah6r& zl5I5ZY0YxUwi;(!#V*-S;~Z;+OD1XD%UbJ_?bW+%qPJDzk{#63Bhk;=;gTIWzVsl5 zSbJTv6R+z5Jlxvvl3jQk#Cg_XmrUlv5Rb5qxnwuK0P#rcluJtf9O8$pvo6`4zl8W< z>!M4h@qLI#S(jbXtMO>-rb}jMoiUaXBs2L@)XBG;K@vV6LOj+A36j|w7g$k2GKc?# z>Eo>EAlaK&mw*ecm>}7gcR@VfiVu?gc^2YFti&LhtMLRYDM${~c%qdYBnR>Fs58k* z3z9>0875mfL2@WxgXxc2xj}NcF6U!bUXaYwI*(iVL2`t~PgoO!+~H~NwD0Y$NwwV zj$p%{7YC2smP23>k-#e8Y^v{Tm3{0PjDeWDo>3iRe_uo$8#5*t3THnBTfK5uKSm*U!cf z(S_No{A@iUx-$DkKihzaWM=P07KBg-!%jxA7lK40dXy=D$)f!>mcG-gltv#p6pXZ8|gu`+Fm@G^UYpG_hngV`_p*$zZxGW&p^?Ljf&{IFA)Qo{js0zPsAW*e}n9g5abduxU3s({5Og%c+@b6h#_UWREsNu zB()Xn&R;^^G*v~#p#6!$})X$D4 z;$ddb@w53vjAHgmWYJXt5u=%1;%5tq7{lyWk;TS;gou1*zmF^q@`*%@W%fxwJDG?A zW}ip)HwYdhVw`Wb(8r;gi*!u_;1P$a$rD5rGCRu877;O?*>(KvR3aW>b~9vg{7xfc z0?dDY=?o$!GCLF5{t(O}Vp7>-UmXEu4ui*0aV7+Fh?rbfaXF+JHfq}I{5nq)@hG!* z_}TeHJjU#|{cJH2k3;_>dkTU@L_G0thZVKgtElrg1WSl`@;`NyqE9vVw>y%+5g;51v&-Ol9_PKl>~ZPci!uWQ!npj)>`Hy^e=^`%Vt4PzPtG zwM0yV`43s_;`Kz#fcXzu93C5qm)ZuVL zV>1zR{!>SvP0_@#V?Z&rF$7zQnEO9#8+JM>VoA0U@ien@{p=1R<}rJWpM9B#`OJR8 z&+Z~(0kh{Ji*?*XL@~3UMfQ0J_7bs>RTu(`W8b8{2POLrIc0UBCiP%uKH^$@m!2s4jev@yA*vRak zko^OKGem4EYodmPUe*M|qo&ky5S%08g|a$Y+yKQ`#P5kHVRkEIv3frc@glRk`Pm|u5=Jlaw< zB2>J}>`KUDsTdW{GrK;r2@sf63@zI_dIIf+;!Fq}RP2RWR?V&d3=De=DouhQfQr|A zOS&?BHXp?+AaGIfx__qD-T5MlUV$K(iZ{yUj%OpoK8#{q&Dm7!WA+z*Hk67tnSH^} zx~X`J+1LDR1Ql;Ho5PA-C6$hE!2HCC zzb0N^sMn|ryC2GjLr@vM3oLsE#p_&H|DkvW1l6c`*KdxO4?go}QT{vx(Nx6$+uS$G z_oEK_s6oYh%>D$~FCnN+#ruAjcxB^r`8&%0f}j=^aeg_LMt$J{-+#abPHK4w>QZsY zFUPAM{bHEzil(U47J?Wm8v2!#6D`j~d4CA%Q*qeW$!g7@dRn*SMAVrIK`a$V{;gx! z%Tc@zf`(LlP*$w`lmgd?*1yQ&f#9Ly6s&)dJ&FMp zUzV-A%3U9tKcM(`2zpTQ)dM=}VnNSv0-lMcMnRBH#c6-fY9Dp|q6{j&W_BX79U#b} z;v2uFc9MZ2Jh^96@h!6lA^R`{y{I_zK<28HY6`}w!mx``dldwIs5tw8wjMjXPzPuK zepH-e_B+U8p$Aa$9kY)kizORK#rMoU=Vu2~ah}?kUJg8ARCJcf#&Vg5%JN5xnwF2VfoR~|>jFEIZji`_Jy zieF*=M;6OGfr{T?{ztYLf=N{T{y?pDvu;Km?Dt2hxXkR=kbMV&$EmpTfQf2WZTB52 z;z)mzimS}Nf-Dwu3Kf4a8-5#3OP`|RPiEW5mWN^Z*rZZYLqz4T5*580PO7)dzao$VE9GtM5?} z&h0VC;*dB*MFh8>Ko)Cogo;RR&qEeF{U{aXxcw}$xVrp^iYRVx@k>9UqCB@>NA_I^ zKBb}pFVpYp>`>+a_};I0f{KdVzUp^#l8Q>)Ch(|D<@p5_mAM^)EG}Wcq@oJ9t0IdB z&uJ>Eay!ni{0$Y++-`$xR|w8fQLStd^vLY%*FHx@b#6c8*Z!W08r+`jm;L}73vhe3 zU-}~zwYa?k+4T_oL`Chgu1n8-x`7Y)-CUxg4!4gXi>Jb0sfgh=>e%No?KcS8F;Ru} zXv<|tzjh=riQKI1=B3` zgeR;GN%Qp75WWTQWNX-t@+BOYHtW63yUK?JS;w}Ht}@P-eQR1>8fE}XcPS$Dy$wf zM2aqZeP{^XFJTR!A-ZYDu_VT@Uj(0NJ(#@{;*{4Rc$~Q_r$5Hx-Em%R0+%A*ku0<` zeD>JL>3u|bbTaH8_EzoK8620Rzs-I-o&td^KLGT<4eivm2_NnB z>UT}T#{_xxnv=pcwv-xzH%KtIoi8Gqeo-B#i|J5kHvcz>a-^k zy^A!OlH^^i(X?dm5{>4kd6#Nboa0@lZ5QQwmus{*&#Rw5hA++cu2dZzzHFj*l}5{p zyw9k1312bG`>aMQXB+lY@NhciX$aP_u)i|k+II;itcGAOi>RLdDl3i%fQB#WYT$1n zc{gYj5+qJ(6`Q9BqROsEQ zY8z2;qW5KuDoygfqEY3^zR?m<=30sz1=F;c!$RWfD^(NKMa&IyD03w2%C-wdZ3$O!9o9VI=9~Ip&ASo=^QydXD>H zn&*TcW_mtTy%AOpCcTq>nCtnR5d zU#SiVt3+P*Pe_%?D=_imxh1R$*=49lVQN^ph&I2!<2V&+H6%5`sm0e%H`u zF`mmT6rX2@uy{ECfgHAeho3fM;UfK477`xdy`+4F!}0WsMnPQfI1(Q0G;A!JT@f6l z)P$f44_}{NnMZ}M_D?@+3~xnM>+rQsZzc75L-@K7!|o2+sW}id;exXsjd_l^O8sZr zKVfXv(T@$U!Ptz^@H!3h)Yb3?4AXl0`TtEAru8-a8-{5E{dUA%8smx8@E(o##OZee z43_9=s3BoVo_Gx@OZGI^foy*ZDLbo*)ppAzY5Ix^C!H-CvN z7vxRg{R80nT2zR)nJPzQdDy}w4xWLhCPL7ei`G07*CKWYOp_3FagoYPADfjf{Czj0>wr#bBMAC%(Y>r9 zUKaUuJg9?r3Hou7!tLJ34uN0*7hU{I>M~cllTkhmg27yLeL$}7J?m@Yji`ywX@+sp ziQBIri%ZloT(sx*L1aIKU@R9McmmOvtK=33N*=2ja zbTO+C_K{&PMr~aBPT?Yl+v}0V?thBI=34enWZ!^b8f>)XZ#LDr=pxy$kE6oZ5X|7B zAusd5(WaDNV@HuPgN3#zplLzHAi7l%K&5A4iw{*w^MopTXtW5H=n)7((@J z>ogLJb-ZFx_ykyg+nQ1OvFCLBw3Tgu9d(VKGYGZ@$;OXLeeKa}GGHV7CC(NERJjTP z_7&`6vq0|*({m<)5ep`((;?^48!#NR6~e~(yCG~iCk>xAsy1$f-_~XoLxN78P0%xI z0^i||RjEeLIllbS%BS0FB^vacOCDF*;J3R81^C%6?EG;VqNXJCFNjn{pVk#sAMs}D zie~DMcstD_E0z5j&L%nPkK2Kf`f9i^9+3K8bo>SOsA_cOYrghX?D%)1b;J+S7Z4+R z8)vn#?`r$|uC~ALVszj2EG8u?(*rqB=tmAg*m%M*2peK!EhNz(WY1v+{juGkbFkr> zl8pN;x9GoHZn4@D5?c;Tb|^?tASx~?^=ne+R6AHRQo zkH@dgbglJV@AY15z1RJ^u4`{)oBA{1qS2}Ej5FY(?*!_5aeuhjUYBfhx3V0+dwxrZ zyWaMu-*a?e#dh=sSUWJwYxSSMQF8fwMw|bh#o_PM3yIEnQ}ZF2jW_cSi_X9JgDnJ!&l& zf|e-L9T?lkbTp9MsX}|~6Y31BfCZPr5U25%AkbU&`rT|Y*j>KC$alB)IcMGzx}D2N zg*awThzoFKh)QtGRiUYr=c`pg=Bk4HO%>#tpdibPg2aP@-1}b(a$idY;d0z>ltaB^ zo|JKSxz0Hc$q#6s)BC|tcP_{05%(;vM}FJyFbTz9=%X~ zL6~#a|3utdW4)fHf9d-&P`kIXLM$Z~Nk*T+_u`Yf?;~#OG%8V_1);Vc+!UeD&7pq~ z-;G3a@l1{9W~9;g#BzeqhT2hrUDEsn`%y!CE`-uL?qO;4Eoju_j=42NO>W@A5H~sJ ztiMOxg{_d6g?ehdO-+rx*M&~u$!2H7J%#hqcM+P%DZHr2xeZNZY#M#T3D1 zCZy4{re?~xnknP{O!)%02iIO>ylBjnr^`%9v+?@SBc$>)QW>X-8DGQY&&)4{4xvDv znOjQl<>u4-M>FZsx3g`)NhwtF%p6yw57m%H`3J=ETVn<~HWVtn6Bwnt05 zbKLo}TD8Mh&U@hs_HA`CJ?B&}1HRllLRp?Ogrnyy34P+^dq)z!Gt|Lz#qK@SNVt{ZQx-4`1BQd_^eRb8?jX;n1O;bGCB-96HQ%=;uxGNa*37bFuey zcyJHTdCB{Gc<>Q;T`9UcJore@=@4BL9({}=K<=$jHCWCgp`V>;+=X)<4gKPj z#{4fudy8jE1a|Bnp5K!fQ@HYKYUtaczalbzO7Ul>oFktcI`bE&f+IusJE6^_dnI&t zQ@S66?gIkd?{JesU^BYk4P8jO-T9lG-Oje)PQ8^?tXBD({ZbdCJ=SgVm(#kLV`$}8qR{Lhq8M-BOIOXLj#6DZa{vX8t zYY=;jihXvou|EhMM6sVn?Cnub`|pVTb<|J$0~LFFw7InZ8R|f>S0na(mG&CMzA;Gq zpDOnJX4C#KL)o*BgcP{qEax!6P6=RAvuKdOk&A>!^J;zugtkIhER z%2|hqt5j*9N5m(C(tfNWu4=ZlpKxQ&d4Xc9WM8D%L9(An?BZlV!wpg zr9tdZRqSca#U9cj=Ve6fr6T?V5qk#_x2lM}nu|E}v(VXOB{wRq3xr+T^bFqhX%-M*DZzxN@j)-ptmj0KD_(pS<=C2{z zrUZsX-F)7c}n}6&>j!8f1x6u*PQmDU-Fcivk9@+tJrTL_DezRFIDXI z&Bp#prTsQyU!_d)4q{&&nB*%J`>N(lGIYD@t?wdsPnGt2h}|nld%KF=v$?d{E?+Bw z!Ohv_-ys}yIysx6y-aC;AKEVnwEtU0E^AKvkWM*U5V1~0`~VTB2NAzf5$l?b*g5B) zi1@m)#)pXbMqrH{D&p(STH{;QCq6>#Ju2Cc5&PF5*>6?sJvV2VzfD zIsX>1PYZJXlZrjD*_{8ZVt{k`LU2_H- zmWOTXe`IG*hm`X-V)OrciR1hRsJ?FQWBB&^KKgdW-{G4S8mI+G{14JW>lcD`&_Qy4 z26BW*ZdMoqk@=bQ)sR2He+B%LS(QK%Y9OeU%@k#`0j)&mkg_ldkg6+vRfI-Swyz40 zqI_H(9+i$g*WB zx)7cl!ox^yW0Q2}D+x0zH%g>o*CWzRS_37%AUujncypMud0!xk}dVAOzxjN$YR$rD!$865IYa(7BTBHYGpy!;sHsbXS z7~jJpuXFA*5$~uVfbQ8Ex58Lt|(3kvU5}Uyiun@zFvrY`wpW z(bn5(M<*9&ZHTzf$9la&|I(obcF@o3-TaHPn_nF6#XIO-5vM+l?yL3rC4_I+Rqnof zLTllqwEFxS!jEIrr_pZ?^!ZQdP!gdW_xUaKeHd=aO77keekkh_R+IBPdg#SzwE7)- z2i@jyP7cq{{MorYZ3@=q{kGxm%^l(Pz|IwEo_v$%ESJB^vmYH)ED0Y)fpgM4J~~(u z-sh}>&kpVkLmT=9HnHyf%sbVA)p_c`>O4L@=tsvtOT#DvItlM})j`mC>LBPmJ_vG# zm6p+?k2vm(%#SUIq47oLM;1g>gGXON-qlyD-VK>4ZszY<)VI`EtfJ3`GtWmYz8dic z^P`#k57#GGWg~Q}T3ZU2)9z;ct8U%WKEY{sFZ`#fHh1DZ;TTZptREvzk`0Vwpr7F+ z$@9iy1-gv-32wBUfiJSWH>^%}c1N7aX?_2|@Hm+TbN+NK z*A{X6_q9m3>=5n9du=4w?H9oHI=SecTdy~K*PD@UhlZ9SG;dR++ube9A$= z1Cqa=BM$!_PvPwFyKs^~(VXyZXBC;U=*sX%AD7;cNQIZwAa=BjWh z{6~js@NfUnX)|#-=IZcOxE%kd{)8Ig#aYHf+@?Zj{St9*VT<&g8(s@1H}}7V(cEuQ z&HWlO&MnF~*OGB=35>JCGR|qrIAkMyLonG0r)6h89F8N!&{_Y+9{8Af;oWq(F8l{w zt`En`ak(L!h0DOkaCcmWk=Y-imc~QiB=jFWRDOs!k5Zap9AP`>z7^^EI5#x1q0{s2 zh;us^r5F0JxKK5>bAEfF6t{CJdZ7%8<-x{xa1(HPuMFpNCVPjS<*J3urxvoDBlo$H zjIdl8;U+SI;{B*dkA;sxOy|M0^kZ&Sg8Xz-%Dqs#F3DE?OC?eS^Q>@E1i~JVNEruPFA#-?8|k-w&IFzjN_NzYumQ{^sKECj8xlzsOzg8aMK? z`>7lG(tQx$>NnSW&5K;0wI>U|lIzXNitNeS&>`||hg&;E9_#dAXD4z`o6T(__hoF$ zh}_WbgLY2jg*NlsM($|4xvdj^A3b4+qZajyEbF_ncyFMsn-FFW}4@7K=3?<~Jk>O}V9SCsi@lKDrH`6rSc{3!Y}asK&Z{3tVi zm6(5%*opjxUnJ%qAa){;RC=MrEi6bT#95pu5m!YbRUppF`joh8YRePxqJqkJMM0{lG@hs`R{dG}SV@CC~s#KLi5DPrXR8=xa5h*zFQ%GF4N~GPRY+B1l1bWo?DZP@+CnQxF%kBw@fxBwAip znW#jLt172CXC`V2t56FU)K*l-3u{Zz5H6^w_8o#M3X&JbrxzsS$%48>F=Y6P%19y$ z@w$TYpq#7~0%g;Zi4+mxPsRKYX{x>@C0HaiRv+8dp{s zPbF$9;zd>H3C>AnHOW*Q-Jm$(=zpElC!9|8>zp#JvZ{uwIbNJ7DtEa0VI}30&}5>h ziNB;Kkx(F6l~j)L1@&bWWiY{*f@CQ&S?H*GuPmrYpfeOF>YYlMk^f1QCn}tHDFoT& zJCbD=Cme3gD&r-Tai_ch|B#GQ$oh+_DwC)ZpeC7sWKB|> z02Oi5qZ$q>0?o9fykJ@qO=?2CCQ(ovuTD|Z6;GlP4MBUj?BttXQv~*uCgvOJ&ns3XH zHK@as<|{$B<8e^|OSZ_bE@eu;Ts%J)Ckku*qNXs|`N0)5#L_4r>98M$QQmTlI9haC zZ7PX&iqyI7U>L%HL5-HjxOfRBCkJh}rnI247_DkdLGhWGuGOW#TnET?Ag;*~lj7s! z6DATG?j&8r3RN`&$%7`#c}QSFPwXslIYz<2?wi>LX1ACD%3x^bQ#)0 ziWdn8AWBU`=ZE6QtMxEinV6211Ljgr1ah2p>MM2C)eb~aZS_h5{^~ktPS%#|?w6{W z5kK{eadFJASXHQeVvw&%U{PRpmLlDai)bJiHD<&l5ytp*K|zI6kV2P@$15paxXT<` z3724|E{`W_YN~3m)W8~%8woW8T1f=;Ta&1!l`yqI8KnZJ>IH!xOAFIu2J2OV2xxC} zBEA+aM7gEzM!L~;k&jB#9R$*vf`o8YP~{jUi57i$#7As$3FKTTo7OBZc@*6~wgxE>{Jq#THbi z%FvOgVE}9D4MbEiD3o1RKv4~ra~zjL*=vXtLODk8ax5rQO3EZn1WU@Rs%q3akrOM# zFsn%uLE8FgUAztAy5%@nBo|}QrQrk1`hAh12YuzS~<|g{y>Q8o;I|#DeQnbQ%y)9n5a$` zayU7f;9`x7o8Uyb=4h6_(GeT7gASpI!VJRZE>&COrz75`B4u?|e*9|k1i@t$)ipF^ zQfb9)1Xh;Nx)VsjB#xO!h_=bFjKr&HVTvb$+#6bXy z1b#yZLuoJ}ieOXLRJh65r}RR+32hp|7&Wlm!E%8Hk)|S68GWr5ZyG6?z)>4^bY-a- z)Rg>47XPo2WL%1<0Pcn)aZmHXcLHpwRRbu@CD*N2?T4@Y+qAqqIl5D z5x^cJ7&{Nj7d2-;J$R%v>}nDa^n!hR0M_~CiC{SqcmoZ@bmJGd5!g&MShj3YSTbyh zo2EB|wAn3YXvc(xg*5L`$v(-zZwSdmu8z@I%q05?8nzKZCWaukcQ^!KRqV8bXuoR& z^Y+)Tw^Uh00tYJ`F76i4C#JjFMr0AXHl|^E5dE zjCL6>L^CT=jWO^x6`^h}8zRaDi3O;ssOr0xunG4O#|WL8!FC|M5M|Ir%;-&!Q9eUJ zPMSGu${hsKoeLVY{aJ@o+J~wLI8u#|JZT~wt1aVam8#>zGpkMLvSyOKy z66^{{!uRYos&X9yPE{^UP=Ok zy%YhxMljrdOdfT01M)phgLTbvFrUQe3QQ&{%23~27uxN|rJXnW3KdzLevof|cKEoq zk{5Bf3xhbmCkV#rJ}q369IQPm7)y9w2*u^rBAt3P0ZNQd#;|*qtAgn8Xh-H+WFKM* zavLtjJtaqp`TizC7_V^Wfi=@WCG)ca$bfd3ae@Ith5CL|h$}&BR-PuoGE+zbFad8K zn~31(Mk5x|LgK_L!*Se)+a(Mc!uKNa5$4q_A*#%U605{FD} zMl)oZL{xKvuN`6m2?WclrZv$Xln6PJz(Bep*;JbH;-?^i3Sguwj*pwDPI|}5FwAiL z#M2dp!;qz(&*6TrXCD^z1r0M3;|I&J5ws|m z3Lrsqwy^w$kUv8>EaQ6v5zZQQY!c8OD>w+V0@NXsAJaHwVrCvGDIF#;beTs=TF^dZ z5{*1C8ty;~jph{KPqZwhCd9xQ$n)rwRLQCHDQ-P1+Vs3?Uu0-Ojq`bxnpj!132H`E z9VayrWfX|29X97pIqe`Uc`3dM)GJ*fYME|&%-H@ZmniW4fsmTuNr5rLlb27Xv?GuQ zE@o}yXo7J-BI5dFO1$W-I>hg{5~R*mOivS)`rt|gnjBnd#s^oXC(z(eM4Y_u3k3AZ z7DaDzvc*6zV@!_`S4!2SNdBUPQ}lg7EIeR=#WZPTml2>&vQ&_HsztJNcqP{$hFb0@ zjD=5=06uS!DCT(-OXIw*LWPmbh$jbCN{A1wj6nZnN=5a(frvg^Vgc<5f@yK2j(R8o z-`7;2q>^J(Xi23VBppEonjHZoh(5Yq=kq^aq_5R;k&?vm5WL+S9nh6cSZ6nV8=@<%jTBH)xqg;NWKh!H4V80fXH=`rHsbV4Ofrv_%a!P$UP9Qcjc=7wL1nIsU@n|R7Z zlTADW-sSkNAQtb%i3fXe_USb>r-(b+YPlW6qwTS5)=56_HWg8Kebq!sGU7LcWWUTx z%>6O}T1v@PV(sHrH8v)Baqa^eq!C{t?G zV41+%R7AB}U&L(0R6}t*!&Hq2UGUIS;87az2p^q^(IY!_RZu-xge`-1m>5e`h4mU$ z`6_VQ>$^;OTD__OfBCAsbUQJKB|bAIp&+*SOaZDkrORIeE3aD08g4U|EM--w@~B`O z{7tK@!0l~*PLLlcQJonNMxdkf6K1$Smvj;rVUWXdEVhNRdqk5t59$lhm zK=^2s5&MveY+3zT+(}l~%lQK~HEJiU=76f{c+}IO78Xo6kfq!E^r#P-r#SVlPMsub zpBl?ByBPNjb(m9#XBcSsR<{yMYVlZ+?@JUW$)#xFWU@m27N3Llz~5N{Z8 z4fYd6`SeRI*;%|iQId)~BPUE4=eM)qK%4uoI#!X}p25)@J;vjo$!LeVL!+0bs?ewl zwJ_JMh#EdmVmJt-2QTR{h9-W57t+&v^n{4RE~SZ`m8e>F&;y3-pa-YQl2qlirKHlU$UTgkylQl)Q|xk6rSy2SS~Ox^uN)A?!-{1|UW(A!Y7w3Z zL?YTjBgr^=Kro5Zg+wtsPdk0Wq{$?eOeLzBaC>4G-;_HY{Z1aL!}B*a)b~l0cBAyT z6I}d!Dw>@_sPT|oeg{)&0S(Yh zB~e<2^D=f)dm&x8ompE=+LVK|r~<=*(kCg1OXKIZko)qPSdA*zDaG{;j}CNeh5yjj zxtMgLfod?R!g-~_|FF2)_^5xeof(0O#K8tXNkyH6eAFlK7?b#@#{@n#EKwNs0lLzI z+mPYC5nYMXl{muDJjhEIWJyIw>%i057zAfjs&%ZygAHhUz^nnFj2Rz4g4?lN$|~zd z;_=o~&!ozb3ymy%c7P|Z@CpO93S|d85D9k?kNg;@ib@>5p+dusaKucq*PQsetJr6(xHX@crybx6cE4;R4AG`_eeV0 zOw^TCq1-AWX=M%MV8yJiq6*K8V8+68t%&E38JIqZUDjdIEK#dK29j3O-4MyboG>M~wkPEq{{k6I>a)}zAE6@MI+I2sUc ze5i6NCzb^29I~tqt*QWr>P~#Z$b6KM3LUs;TA{@aU1>AILok{tEriq#h8s{t0R})! z1E?0ZoU}|nY*Vu&)(DkVmCF7#33@g{4Tq?$iM)*)g`4*dmZ??6RoonFtMP=l+^tpa zBt5Z%mj%#Yu(p7i)KqZBM7r-!oksOL{7b!nW(Y@L$4y`vJYZN=Sxk4I(0C^D2&J!n zKF;8Dv9v3s*&1Vmn!eRN0F#h}9KP_Xkwz8jwpjd$y$j2xjdvyv;0HlzBogOnI>x{< zi{=wr{lh8KFqu#0eFrayOvK}lHC084BsF*CmoDh9H3!moG>(^QG^ptvgmh?rhKZQ! zeB_chjF3b1_>(^GpwXtH03$+Wf}9vf@hAqlcp4=l4`adUcXPH8uNC1^-3<;H!FO{N z`95B2@u0%y)f-HHNC^>(aE4J;RnE_>23~G*B(NpVr(J&KC}ng>(bL= z1%*j^V2qr2Z-$(-<5W*cvy*!*yL{uZPiIMOQE5g*PnE+32M1<|M;nq-IzBHfkrPLF z`1Jw;MO78mxZO#2c7Y4gi0}X&vZem#IMm$t3G@}vqL4!A0a#K9o6(cgO_Xr})+Idq zV{9s>V5DHg;nx>}NGe7xMh$-B4OL5THbFfKOznkUgCmHnV<4aaO*m<#Ta|&zM1M+( z2SP0y#8%^^(n~hOC>A890x8c}bYnQy1|pA=qXWK4V@@X#kzh$*K#jkF97FH7lrXFbyR5r{h>M1}7D|7j|p

9QCSKvD`LSx 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

SE~~|^#ZBa;9RRt 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

K&R-zAt6oaPP>;-Uxd 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

>FbSrXVVN$>ITN;Os4<2grON zds%ouO7@cXcMro}%U$xzZo#vcY{_2oO7=@%Bxk=U^HLkxQJ-eN^hYvZe>Ho_mfR&j zdvm!f7ukA7?L{7j^ow zn4!n)UepkkJ-I1+$@g9cubmMXk8C05AL`E ziVA{?xZ#@b-m31I&Y+*~^StN$&;L8eoYOVGyVR}i)~)L5o{T@-g8dL~&Q3|rN#7e@ zTA7lD9Yd2xd6CgNq)hLh(0w7%N<#N+GSrF{eS*H*_Be?}=~Uv$NMXGa7T$y01xKLa z?Qrwt6mQtBU~co)C6iOq7Jgv2CcHE+B|V|L5^nJ)Z1^r=L;HuCCbTAO=oDV?94!2x zVPClAqLgG|Jhyqvl4Q(xoS?!jN-k!FNToKsiJ6zR$&9`G4K*&5*ZjF%zxv#8i>S>m z9JH49DT0kHK5%-@qP^5QTEpaLP40I6cH?kwGk(Tt8v5S7BagvT@ck2E}(NOvaI6Muf9XNwN zY7Wf7t`$WtxCjRz+)|j5jHdHiaF7~09TEUFy=z>iDAUais%c;`PzIkVO{uY`{XJt*!Iy>u}tdg^z z7uwU8MW!3hGb|}#;fL4-xy`Ky(xwZ48A~Ppn%C#R(oyK-N5oehMb_MABRuU*F^i<% zXD#Wz@PmYfH(`G4iDzh!DJw|cMMv4_2$IpFWF>4sA6PJ=X=cMKW1BzAUGRdMwPbRN zif(eHqa(`?Cp`1YkJ(`e)hA)5vjJ5B>x3@$+5Txb-i|i%M13Rr35&8(jCo2h&x_=f zd-o4SPVRz}m4<}yQt|GD$c-(D^vm;Y;?Fz^G|k_Io6%#U-HH*YMhJciH^0;TvaG?< zi&F9^6otb}3sbUbc4P`cHqOty?3O$d#A7F5ysAv85%UkdTy$spCTRkvTN*lq6GswG z-*h-3fU`Sqsdz6fCmo%8(}5G*6FL+94BZ>EP_Z?_P9Bz+Oij*R&>BiuNMB~jo%L?U z$d<_ilb6nFUGTe>aCx(+h^)^vc2^j-weBWM{%~_)ig#pd;XrRz^QHsmPG5FvOWr_l zc+pGs_X&|uYJELBVZ){ac?sP!l~Y@?NxrFmX;eP8d28#AvCW5M^$(;tHWC(=;{ZhU zT3^q_LUh5{nw?UkY+SLjwK^~1)+2co(DJa`GZHTAjPqpUjOofU5`>pdPN_*)FrDU( z-Jdw6yy2zH3NP3cYN@wUvoYzH*OIZ|4>jv)n$XSlDJj_rW51?wk&@d|Kfr5uznpt^ ze{F%W!wx1ajKdsx&7Xyz`;29^umRb_4n2-_Mn4+)T6T};u$|+YU;gQhMLQa{=QaP4 z{>FizdpIz@h8Jvx@Pe)W++lCm_sJdhR{hs4-G)7X$-d@YJzgC4V#99y{P(b34Lc7c zNdI2+Qp17+JiGbJ;e{zFvUQ89u|SMkHA=$5u?U^ohNT~fLEb+I1=RmIoOLNu16{C2 zIF#KpqG7gk9T>XcR~9CXhU0~{Tk&v$AKh#{2+J|;5j`K)SN4F)Jamu@8iZO4M=M`B zU}5~9j$t!@xMKS#Id?uSN#0Xi2BkgGp4`k{KyZ5JQ+zn>cW2V#9GS4}uhx(K$Dm$x z&S5B{IoH53kkPD+Ojsw7IqONA`CBZeDK2EcMlIp&%_lb2JB-!C`pL+S(@QL_m3T*p zkt*EWFGVbX&xTMbU2YU|n_mbo6*tdW&ycI8e{i5{On-$JJdfl5LPmJOuc7*2xaDG{ z`Q!9A@|yRH&dp7@_2b$Pv$cy;54@AtjEglbbGUN9X=idK30GO91~(O-AfUz6KHjmCg4BRYEfZY14)hpg?$qBeywsHKWl9e6@U zzLpUw`|ka@wUySqaMqGw%EAxwS}IeL>wC(^)4KmxN+qf*;{CarU`?U$EmmXd^q4me?8VEJ)4>#ii6(06p!s3ItK5WeboCmwY zE%hmB(cbT zdCqn-VbMjTjDakarLh5`QF7;T5O@CjkHulMo8K~7O

xb-@v>?u^{#cd1l#(ab04 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 xbyjf+O0B-i*}iI4 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

L$Xp2OiTaGl8A3gg zrjqIbn2ekmfDI!x1gxwZM~VZmS)^tFUL83r0Gmh74!~BCbGS1?C(&GUZUDB8oM#%~ z!BuFkIbWzJ>%Ng%0XR4!svD}RM@MR#tH67To)o!&+dp)wo*hgCr|CH~-@(raov!Dq z6QMus+&dYtRVP9>m`-qN0gyxcpCsD*4<%O_UCD&5G<9_-a04Rb23*Q-qI1X%XdqxN zxd9CYjFKBr#&y;)asw_i%Se!}Uc#+@)ycuP)fYx993oIAqkX09y+dNw6vjBes)Y@Vkol82LG{+i%A zaNk79c%!dz)BC;Y<(9v<{wx?fP%_czYcm<4Og_(W@F0LT+2||C{{=dak|{=C9xP-s zfSA1S*F+*oj|#U*E)|*qM?~jlLjL1^D6617$~nXEG(98+~D>FxEL1#)&ML)`I&JO1?DuqReJNwy&W- zf#)wuwi$gfy)GA*c8Zo#R%J?d7+uFN&UKOOvyqLGUmIQG+EPMu8c|Zoja`_Z=eCVi zkJF_$M2OW;wAPB$Bd9nW_gp+8Rx>Xi66mZd@vuN=7sMk1ol_jo5$N1n@mv=T6g#hO zJSx!n4dXF^YBh^j5U6(ZctsZ#i(Sx0+2yFr21=|OEy{P@D$&3ri=M6mOH|E`Yc3Kk z2*(|P3Zrqu4~{0tvZ1CnP8H8Nm68Jbv?jlr`)urD^1&{~i8tb zkh;>XpSzXbQQy#ke_HjVpF-82QaWx^l^LovWQJn?X;qtk3Uw)^s+!Y+Qr)_CbK1pm zN|BmINZqTE+8Zb>x;sgi7o4G6X_{rKZ!i^dcrR5fp$wgB?ky~);T9_7U4b;zlF~D6 zeWDkJZzWjOSV(fbqUDr^NSaft;0%3(^D^ZWC)}KOShaDERn?^bZ}Lc(ahNOFcBvLF zAy~J*l_Vx2_flH)H%W>>#*>tDR?a%kpX;ihQS|H_0#N*%+_PQv>$L{@5@J+RDJLIy#W{Irx#}V0o>S>JS3S&7{_g=4|094-I2b@D9`Z}n!rNCo zm87W0ZBe63sd3KGE%gPc_%pOm*1~z2K6|^9=#_kW3+F|mOKvOYr7Dt}fBf76>Wb=a zv<|;IH$9F(NJoRFiqCYT7pHS!88ULut>LQC$fYJ4jpDU`F={m4uXZs}7^vy9TtJO5 z7L*I9UB;nZRJHgDgZBJ|s-LL*H`0^b29#EbQCfI%WlAr6g~&9c+rp|-7&`YHSM~Fs z*)Mozzu=h+;0Xid2`9W1!V@4QaY{F&r}jm9+7P6tkEOJ*+FYas5Pu=6qSZ{BDCFuS zxH?5#oikF^aZsJ=QXO^Hi4#~U=DTVxs&)361fX6Q=~jRGv~y}u11)4-DE`Y;Z$jzM zsae-i3t%qKIqPrNht59is`+@AbIv&uKeK=RBUz_*igp1YFqT~C zDp^>TTm%SmOD+x|Rkx0-DzeX6haOhZ;AwT}X+Dj_RAdiQT~hfmZmIGo^Y7HrL$%Cna_6qd%#e^p=Ve44R*0Fw1qEMWV{%Fxe90Le1&^L~vpZbj{ zk-U79OT;#WU#gowL_dYeXDB5elt1}&fG1FSr@Sr;aLUg}NvK*0xg;Uc;M#^Hobn*3 zup!GS6FEiwE~8*6*-SG|x1v!_KP^+a$}DFH!x&EG2rBlr!kY z1%8fdaI?NR#I7(pO^gM)L^Zfo*U8R6XNq@IT;k>&WR#0B#8S9yaa}j(P*yH7c$ZER z=Brjn&K!+*bVK4Yw0)uxTE0NHm`pzn(S?Q^zcCs=(F9FTnRn4o;pN-|O{E9Q673vF zTIkZ*R6Mz~8EI+}YijZe8UWRqTJK6%ohj;hRmjqz1XLq=bvOlHLuSvXUK;@wLn(RP zR!0?U#ITahb5gu5X!QHMEolJw;Po`FeXvz-02ZxkOr3*1euaK9U!M_lQY(F7CcXM` z=$}#HGod~&`-N*9hv^4mDo!aBX_`Ez=5bg>x(|q* zS2Ztjb&oLjDHK2zm%7n5+~e>|#Um)L=SHq)7JNySp<2aBH`4le85h@g)o`{GmjQs} zI%Fh4DRb2*hSVkJp2!yKO_vV3HM#*QB$eJs25W{G ztkxuJ2FogKa~nX2D81?S6nHav2vnG;^$V!A&ZEYqMVzicHs&nC$(&rsKX=rppT?>w zrG>Y&Kzi#fluD`dxzwD0E2X*AZCvVhE>%?La=L1W)PW4h4b%@XC**Ej=IU3n-L10P z_p`#kMYD}4{2iq5^Tjl`r8k`~Z+d5xW*5=@yJ%7q-M^a##G6b^-ba(vA~DVP$7}%p zw}Mq~$>4anVn8jSJE(-nZE^uk_t@~Jul+OIBykTniM-ss{Br+EH_3(EB%6*Y^gu>C zKFEb0;zBjbn$gr;)SS|bF#^&C^j;#>IhynwkxImns-oV6)IB;M8}w%)2iU7Zt3jZ7JeHJi9P7UDJgUMeTV2CwT|vuQOicXg+1iN#Ib z=$)yjO5w80M)DwAMReXw!=r=-rx|%~E+ump5HlY6RgcSH}z8f$+N3NG&?0Iq{eDH-61F%VDt1386 zieN<>p&@BC!X~&ex*l_GD{;^R)7<0?-6q9!`7zl|k1eLknmyrS`gz+`CvY6I^hIio z6C8GwUOGLX)_d7iRUGs{@)c^0llgPaWIGBWsH$8n*7U~7jrE z_M`aWiP1XKog5=o8S7W2><*VZ>s^=je%YZMht3+vomG$i!;Ts(jX$2QVxbLRHf9qr zdVP2z`p}0bp$~m{GWt+pwnA;Q%n5uvjI2BHei&0nsPcE6q1*7>Cv#N`r<@`q$VQ92 zNH1P?cQvl=VpmP#x-@!&syKqM(I?#NyUeg)95A@^@db^I;!r&GhkE% z=BnIt)U&wO_Xf3Y;ZL4^h(qfBpLBu1sNR<@07ug|xipMbwfnE-o@;g&b=gea5OJ}?oU2#UkE(l(t2S}tV1>MiJH8H$QK6Mw>#C19SCu_< z1&dnZsvS%zod;Ff!6lOO=}I2;wKVbqjB$Y*;=wcvIyvM%;pvHm8c$d3@jP4u)BYps z-0NJ`1g}(^1U7-4s7-T)P?`ro3j#3Lsk>9TrEj7lHP|GTzD0NC5X?qp z5#5#J!^yYlNTRA~&_2m`FcrxbVDepEU;}tD-Juh}OX$8KbvDaMzK55SeZu7X&>$cF z0M^Ebm+FL7vVmA1Va&(qK}t0-mB}(7pn182fac}PJdS8C(+FwGwjdlzxaVxIwyLIr?8N z6)0Vyi!8w~E%jE?SZ!_CFIWXz-iEgTldI{hoVrO`dJQJ`o48k#YtgzsypBGr4B+*e z+$NuY0~`jQXCr#ahd06Y`|xJEsmX`Wd;!y2@+0)^i!xmmHN91-7tx}yLhx{35`=7y zKiPug<$wb{^NNo&MNT{IW2&sZuI-^oK5*4Go>NP=pjozscf=rer=xtA;^`8n+~sa-sGC%-_`?GABl=}TSR2K2A=nJIW1 zrn_A%KDnJoBa2V&K$CvWRY>kcQ~U7Ox<-n=3koju61rVhYS8c&dQ(sR7NQW-ZTAvP z5hC{y`c?H2_3wZ?hUv}2;lyr@_`sWa^J3@tyR&;LQnFr0Pr}LgHIJi+&pGMR@pry^MYo zvv$^vz#2`nekZJoS-%%nS;=4(B`E(g+lXM`SIZ|#uTo;{B*lWZYxGS(Tcuc=68dkLZvuKT|?11CY24>N)bR0x9GCEyg@?eKxvryk4 zf37M&${(eSA}HM{f1E&l2P|NMqNlo-5+#68NpaClpdt}$pZdEbUzuvyb$|S zQ_!Sh2mzRSf6-`+$Y}hVt}Ro!G8zxlwPgW(1f#KnjK+Vk8i~p%ZRgNx#E08EwXKQ? zy@PW>3hwC8Xp}{4vXeuj(T6)bWIroOb-Fk-lJjIFcXeoF`aIp73sZ7>I&}N8|Eyll z#Q|JWH>hRFB`Jt*P?oo7LKiYG2#ts|DY2??Xk?^*YwDJvn&t}nKqV9^Fy(vIZA2mm z`9Atdbax(S?5-E+r?7|9nSNx14b%6d&@-V^sL*!B!|_#zhog+K-cEWr4yS)sMt|)x znfqii_sw7)p~)d49S@z7c+FwC<-#h%yk7?ENMRkADYt(n^8jIP*oW#JRue;!#6V{N z!HGf6Nc;?TCeaUvd`8i~CZNA5xGN>DeA#gr{Xf5Gt1WqlvmLeW2)`?jqU~(ogEigHgeatV#CgBaS3{&K1s{BmTY>uXb zUtAkh6=q__(WGyvrZb5owZOQa#S9b+6B5kGY><3|6v&yAMf;5e%>~Vt_orKSgW`xw z&C6ni$oW|`RBb^P4YgTFw7cE%JZv(^0_85=b0Dik8yN)>U3-OnB@Ula^;FrLx(EA5 z%Uso0+|*GHnWetsBaL>*Ecx^?4&AxmSA3+gj;mf{AE{X+InE*DGF-f**B$bDMu?X* z-XX7Ngm_649P)I0cp?mk4^MK)tMd6L!?^hLHyrYke0T~BkPlCF$V(FV%(rkuxk^rR z$W2-#ZjzYZMbr>2cs)iPs)}IA-{$s`B^suvNLxDSb2M9mNbiD8*H*kmu$T}Do7ADK zB>~3n)O%orFQ$rHy3zZ1p_2}_*S+3VE%~VaWdQaP8@BUW^8F|3+*Yot6|5s_@j8MU zgellryZ{DXT}+|!hl1$)LlS)_8!MzbHzE_>YDsHXJMNzsQ9qhv!Fd2;HBO0X}9hxM3c$3pOfa`6hj;DX&Lr+eA zSUht0D1(+o;Tb zZeEEoyh7cDA^#oIWP=_~Ff7ma$D#dj9NK{_8oZewk3;+EIJBR$Xn5`~$D#e2MZ+_G zI}Yvl?9-(S5Qdef@Abp-iHTXt1WoILUcE!yUOEp-fpPY)moy_nbrPI@AoiL z$%%MdobhQmZ}_Gdag;0GM68xlTh%2jCzw zInSZRmk-Z(=zxpQzW~0L4=;2mbnu1YjnOxqvXsoX9Ewo;Jc}F(CJBs4{5kHZ2%EYO zNDKIM5yzI7LMLP@2RbmZccrM8cmDlYbenurEys(xsj(%Kv zhYEYX>->VM#w8?Xz2*V1frxxqtN1QA(v&qN6`fKw?{@Xz?A^ZNd)&x1DYZ~_?{(F3 zj!Hu5mrH1htg3tvK?=T-1Air?Cae4y)kgZR5jwNnRTqhUej7S-k=W;VV3RKr`}{7P z@{8EW)@cNYHEFSPSpe5tLYh=ZEb@EMo>CWwB$Mw$V@g?g@&jl|2@6avg_hKHSxc5d zGkp4o&O8}V_hu$+-VxX^}Zmb-!Dr4CESqj#0~k%X=Vd>n{!0~vw!~& zy)90B(CbR`z>RL_q~9KX2I39viFT7LJXnQ&I|tvTjZH#?4KK~( ztD8!9!AtYu-SE-`zRHx3rn|QZgAUdEh8io(PH1wEL;tNO!VgRCg@y3peQ3lSzSA%H ztwTo-e0aY@2M&DrJLl>Y{JnEc3jV<%-_Pgy*||1=d5zk|xsTpdRk0LU=TH^xU}24# zIN)SNtbUY*=1=|-6``}PP9GFJ-R1|OvtKfo$-g@5iK+0njHPuqhg6!>G+pBN%mw=& zQsSUrqJS#V-JyUs9q~w2E^$a|B~h_IrB;7s)T)Q`JW7<<6M|a(oms2H@{A)Hwd(2I zgc6sfYxPfNt=buWkM@Q`4?MT_B3(&G-st2S{K!``lnOyCc+b6w=10ZZhvr>YUgq|3 zBn~D&Za7`Yqbn!H_n#7H#ZkuCoNg z5)|F>Uy6)zEn!cuqVV28RE6!ecnz>_WrLiZEN~6YfH4@3(oPV#G6wao*V(vgbqt0t z*~QS*vnB@F^Tp(UV@RM}{!Vgwzw)>U^)hjm5!-Yp&0&5+5sTg*py z)7%maNu@nZixk|`JnRr1E=9dw)F1bXk$Ba#wCX=xG}+r+pMv|CR#x37Mxw8wHUIsV z!~5lif_y&xHFHA>?q_aH!Tn9^l$-&EEZYP8*yKRdCPg1)Zc4#}4Y?+M9flZs>;JOF zs}Ic`<4}c_>Sl2aRdo1P3G$C2{TS<(=Au-gqg3~%@t2K$S?pee@@H1$|P z(~c4}Jwp(jB}Bky5RH7GTK)3`pDB1AaLik?xJ>#zF-OfN8u?4L;9yZ%jv{58vqG^s z$0;`V|1JiPY#yJX`EyR4MAG^WpTy;n^bvQKmkZAA-sEJP>X(;r4h*hR^l(`x3 zmDI`g#*o(1W#|MZ$C^uBby&1^oVmpY@ayJQz`UdyZ)nQ%c_x_KtUAJ4m7Hj92aExd zoMi4u!IPoo%402`Vkm;;mz`#I|a`*G#mdd)9#ywqFEw` zH>GF^2Yq$CFl{JR!LC$dwBfH(-Y~p5#V0`)I;Vmw6$8S5d{-tjc zyu8F)CSxaTc9eI*78%|=X6Nf2Qh{TfuXkCUWQq0)hQOtC10m7mjJEG~iNjXDmGW`y zY01CjZ>Rir|555a%BRhuC2-cTY$a)?d;|UXTQM9Jq#aW}*1ebv!uwQ!+%mp#tYbyNOn)q;QSyoG=6x|e=bwUthcITK90;T-;HRfqFd`FTe2Vv=_f z^6Eb7s-_-CWN6$q^)NHzR7F#dUH-asUhuM1_GPK;%Ov}n$6Zz5!=kr-Dyu$c)%n^X z8q3`gK&ouDGnOZ;^{%>_Lo%grW4K?zDd~&rR zciM;77+P$%6#9BYJ77M%0YmmWu3B=Vp&+#nZ^Fdq^K3Tvq~MPX?PU3N*kWkc%a{ML zp-s&ofvz3F|Uqb;@gT4Zh0c z-6p)eFP5X$d!fX3Gk^wRVuwj>h;4Qn;BnXx+i7G&tR=59#Gn7#v>>OyaF<)Y?xRY`2G}=JVvm%No$M_%a?|d4D^+wdEzm#aAue$&xaZiv`h;ly{uSFWaR!hJ z4`M5qpqLkX>Ys{>{+axIE8|YlI4AQ+AygOy^?lYv% zKK)y`^FF*E9_CINu;0;u-6aF|dkmc2GSGf7o(bRsbS-lL|7h+_@%)52S@^k4cGCO! zU+G~jPYpyrv{Zr#{+i!kHY4E=!36Khq9M+>JBx;$wr`l0-X%haU{4keA%eX`^S32s zLSe7wCOQzpF#>MXa{77@6U;v5l}JK*ixj=`EhNMGm+g0&bK`EL<&m5L_!*76QqBha z0?X*re>Im`g4qK8Mh&_;#1`;(Sh_W`zyF6h*{Zd2dgdT3mk%F;10yiU^S+ZYzd3}p zIpTTbHSj^dKMjZV{xTfa<5Mr+JLhAdYzkE(-i)b!Q$?QY|MsVPoZp`lo|S?fQ6_ z9l(w*Igd}U$Ydv%oXtmBOtPCxZS2F{T^a{I+{68k4dnE6?@PhGT$-VLIepywQ}llB ze^YRO_kjTB&*FY_3eo;AhUp~m9RnJouhQSu{m!d;{xYkxEAAhEUsu@0W%sYE>$`sl zdi>#B14*63Szn42=uBJrs>`;rx0|+=2XSKt9U@K@O!Rd#VmRee;x)fS&xW|~hSypz zh8z2p=3~cyIwwL7KH?j|wJjVd)g0tkv*^%sw1GvPizq4etwigvX8M~|A|2DmPT^tD z#NoSv_bK?$&yg%n47Yzk!*FZxnZ6?1*D7mg8aVK^Hq)m@q8@`?Qkxl~HbY!e8=+sT zsO#r2OTA&FHM2x(hPye|CnrZhgXW3`jf4ix6Ac;zO_8F>vCtGB9_P{m*XMs7+A&+S zY!Wm==q02}0PLLY7reP}g`nw(p>y*VRj;i0}hwBqH!C~4@?enU5eKIEzo z(4#lXe0e>BbG|Ah#=A`kE1V!bJ5hS}%nk;Tx#VP*KFV6j?L`o<{ADz z`6E|-DLpm~J@%#a*mUmAX{7WE1mVU}7MqyUEA1 za#CUv@4G1>ekN9!AGoZQOGP1;Ws2xw*xpr6i&&W!(bJp``4F*+bt*ysOt>Lw>Kc)> zHd9hB69@Cjk&20RE`NxyJ}t@5grp53Vxx%Ilqup>gY(>~N~BU^vxxX8Euyz5I7Dob z%6u%6J`qV<14&ph_n{k$=u`=-5$%4JRL$&npk1+(6PRK5Zz|#47>~X1Wj2+VF9Z>>U%% z9)@g_Hz!|=IiD^ao+Sn*Wdzauhy(i^aPLND@xi?tl|{pxG8!~f{v+yd$`4Y-Pe-a?H#Hj4&{o{`S zfvWf^H+okJm4g#CpLTUuHiGGcA$%r7)qKX)U5=YmHr?FG(ZDUPdM1MCUg_ts=g&mg zar?r3+7it6{7aV(Rrv5%?lS>gZyVY6XCr&5XmUGj`*SQNxx@XRRnJFI$K+0zoMRvU z8q@TP5sv!pg3W&^!j9f<*nFSo8<(7BAKv4}Q}AB*Svs39W%s$yS@l8$|2L!Lc~Id| z@~*%P!*Tza+}h}gJsl|cN?5Q*Ae7lhQP7QZxZ$}+WE9b?$m%~Atl}4GoIB)ztz^yP zELm$}lTor%&HuUK)A%4w9{*<#PSA{U!-flj7Dlig zcBs5q;*ATB$tX}oWi;yEqzv9s;~spAups`2^$ZsMi!x|1jX!pxkSNh;_zA;1SqzcR zbifb{e*e*d7>WHONWPddDE>%sNe;vFujJOCVoS0_l@aYd&_Y;2y^I4eIGy@Fk)+V4 zS5VLr400BObWasO>qhVAy?ai0$YPkO24Q`AmOq?vZCcGubW3!0HpYx9e$I{F1_^8k zWaO7EHT#L8TYo}F+jEfF=n$z*CiGO4YZ)a03 z3H|R1svP?h?JYYJ9V~k_9c{aYt~!q!rco~%o99W}y=qCdgg04K{Wjoez&zOPwov)bHd$$pkBpil2_DVXWQ11$B2z&w+zCGFv3o57?_ zdaugXnL-Cu{FEZYEW31|r9Qok`?Pcro_U$nWw31&z;!5Q;ZuiLa>WI%HZabym5w>#*9%;!YG?5n?h06NyXiN4%;Oq2l>#5pp5NiueEXDw#GM2H0 zuz@)IBTAUm#1R``A!5KA|G=NX(;K3FBFr zkBO+VPtE=0mFm`?x$1Fg#W85b$E6j=q7@&PRvd>`^x@ZSmlQl6?I`qm6Q~`Zly;nG zyIS?Mw9zEnEd@`u-Ba)zmhAO2!ZXG8pxIN}eX8wg)pM*=$!WG%3Z4$-d0v!fhJBT$ zK!Io4-Zbsy;JUBmEZc`Bz8tpiv(YzCiTt_fGasI3X<+;Co0f*N55HymTJ>xWPs58a z;C=erwme0D$2uwc`<9kTKK}=nmPtOm)KXO6hnHE3>ih7AmX=RGyxhK)f;ZTHsdwCD zL#P`DQF5~lr{Irl|I~B0*a0c{6FV@FQ*vq0vL%D8`X3uH%suOK$41ydeI^E~M-Ddl z>WYQBkuB65n_i%OE?fiBT#5OXxfb|bSXzBS(Hj_&r zoO&;7v_d|-(ZAf|jFMFeSq_cpa5mVN&Sb+k|?5f%F> z?fCngm&w7yqOCn)!8UQGAI{5Muy;6$y(8Fd`3BA1#U49z&ZA0nqP+A>C6fi{otaMS zah}1bvsd72=NicB;_}u~SK^>;oW8!))M;C(7%2qRqZ{!^=K<@U!f-sK2VuSpLt+rI_}{GK#11we z21B|npUDmAPt3>z`;epAF?|mWNOUJ8VgejcIG3J24043#cT*7@@8LxD9dAg*MVcds zM5;#jq7_|51xE@>16&n9??&aK1op^B(<}1T%JeT@X|+`S1vlC><38cy7u}ro%m@cq zjtj#L6c+f~s`w>0=KyBqjI}pPsN$F1oFBO?a#iswZq6E%$V-dj+@t0BSIo6@bEc=C z%PR;@P*xSUccVA5C{$mSjdHJ}H`A>@ch&Y>&>MY9KFao7UIcswS7&=Juj)UCQ@cGE zf|Fm^!SrP~vnRiV&#^lf!joUYN!=+t+pM9mr@-6cXZY|AJA^`{x$Hyiv_n(y*Y?Vk z%w6z%L_Tj6j^;i{-Rb!J^Ut1;$IF|wV||*$fyQNVAm;OW77a&H#uH6clgsyCnsGmx@o#Cy@6e2grRl!6!|9BZG}jMyL<&A&N2cH(?Wh#|ldYJ7 zf3~A(VJ&5Uv10&3VUoYvu_>P4&^7+Eez)zNfd3HI9zOj~xPU(VmmL?BEqOhtJ)e7; z=#tT;U5Y4O_QqG&&{k5)-I;_dym{ePpqtCa*B!im`$JY;2Q!_X$u5N`A*o^FZ&|n< zPA}ZvaL+uxq$48fpFmOpO(j!Yj=o+R4JF!n*f&YE_hjFsdB%oV2amVVI(oMdhvL)F zQ>6+GqWOtVQm``@Omy+Mpqx|aDh0dw1@Xc2H1|$auX7Y1Jpbr_@O(X7i9~nrs1Ke! z`QRCarn|gnJ1vScAX4aZ#btVOnZ}A;kY0WfxR*2BQ}CR*(P-jTFZ-0)OczFkm&v`o z%u{B4JYFsL^)i;pv)og`JdY%mvn1XPn(gu)5!T1Av53NcQntTew&N5-9zCc4U}gI&QXkatRfOqqXI@`OcH1 z^vM30vq@LvO9KoI)*Jt7>`(qByFf~B{g>=wav3_gQNAHub`dW5)SbjG!&k1_6D=K# z*4-0bw~Ovt{fw_mPY&@YlyE>Af2c?Ei@>S|{3&uYuI}tstV+%oAE~eUE46>^E<`y5 zfR5BxQKQ`D(gaX}a2mf6EE&ZtaVERg!3jU3$XvAcHT zz~e^7w?T%u>$oy$Kan!uwyZOKRqoRiU$ppr znuE_K(Ov-Y{E*_oJaT|BHl{Sw{79IzC+3}>fVntDEH?D#6fa8tlESbf_iGBnn&CHK z60C<$*x(^u!biB+VyWV;ZqAhB`RcGm>XP5xb@ZcK)AwXg#7f6QNuP*qromI=RnnF} zT>d%e@=!S>KYz*(sdm}lZjp=9J6zR{6|r;zB(#$cbtclN=pdtFl1G8bj-v6Cy@^(J zVhv8dff3SKM#vOzl2u(|SQ{j#Li>IGY2M@%|8(z-6g zKK!z4<`t(FGH8#KV(wrE{g=JSnKo zY-gvF?MuGtO{04jr0L%Brdu_RKbw;1O?z8ZXEcQuEL1psW*(mvb@XX6ggOy+)DU`w z1_Ydn&RIpVZaM7hAaodf7=v9{0DrBWehxCaat8Yi=?o0DZk&O^iD;hGx4Y$yvmX9K zRng64rh9@>j+?T>BoD<9>y_ezz*jQ_Zt!Q*-j+jDeMD|w<|ogJFFq}|yrO%}CkAhW zqo4h3u6&j?#IjebU=o`|m0c%QIQ!ZKP|#@M3Ii8wZ3Df*GHafFf8 zQ8nDLw1~Auarzmb;=r^qfiUs=;M}k?4D!Td$#9=11!ehD=*hO_!XzC%u&TJ58@(I0 z%0D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%0Ath~*rYiu*Bo7yYu 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%0A{%=MWtFzKI)J!A()%Ur}_+#yeo7Pwgrf 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

x5!z`V@74N`I1?e=zLCgqW*l9 z*v1uZl!V;f#x-uVEJPU9=8us@5qK+aRV6R5(1HK6-u}+@_FzT5ohYf|PLN!4$M=W3Vt=c- zfBwDZcD@J~ys=@=5XU&nCSjHx<1CwuS$2$?cK#I1G7p}LS?0mhFv}RGA3^4}J-UP*3J%c`+itQT`Qy zH%Vc6@`cGhwIn7qN5YJYx#|*w8cK{rmFZZH1SAGm$m$Bf)iu;mN zf(ztiq%V}S(VHh1qqj(|0WW+4oYCqWX8YaA@$k>$-vgnoIFBNWrMeBztm47VULw=b zTPm~ATP-gGugmS=1jKhvT<}GCAHcz7awvMsAnr7KL zlXwa$g*W-Y`&^}ZV!7lw#yH}@i~)Boi8I>cJpGR_=e>E!c;e86rD7ixXEM)JFmR4T z8=<*4L7o7N$OL&JNzsg!C&&+iUYsCLiZFPBj0W{LCT2~6sVq*ECj*}*%1n$*m~kD; zaqWOyoq}=E2CX;k1@*M{ovLU;Jq`Ihp@y?w8mgbIh}hr1%|%sX|3wv9Ivp7O&566j z6u8yoP1|{{g=s-sXMn{2-`1J`76H!spF>8(NYVL86@X%wWh=yC>YjL?;xKhju&)N) z(_!kNTgnpXo)~U*eLuMF2Z}0Ygwe-d5CQB0!7Qn0p|~j-y8&F7-js~P9_~nZG}utS zDH%J4f^vkgxrw6rVj$hB!Vm)^AqKJ*2r-aCi0)4q;)LU?KH>PPJsJp}aD3G#98_I6 z%n)Bwh{E9!2>OVVw7pO`!Vq6M*pt;Qe9{oV5m-19j{G49$>N%CG1Vm+^*o{(qQA}`1$(LTzs_8xb! zszqV9h|VTXwXkSA6EFW&_!1vrPW%#2%Q?|MssQ@4mi9{(o>{<{FU7514&F*ED4QJE zQKlfG-FYc~q3dE8%P*-^iQ$;}msE_oaJ(VTr($e%3!gDW!?d%v1Mw*Z5VC;^H-vhn z$vY6S%E2ie0S=tR5fX!lE80vn#K;)bKQadOi#8{ucrFPE&+!)FBm*F>`B2N}@NS`K zGe(N_B(|Qf=k%Bi7ef_>JH#g>FlHa36Ow`{$UzN-px_fe5zTuMo`c0Ks017KoPV#$ z8VX=cQU2>P%ZEc-v2^Yxneb9b<1z&m7X~B~Z}_YOLI?3GxIM*Aa78!)61<%1g4jeN zl`#jxSAe@h)yF~XGgAk*$*X`6u3kZXDM<(6JqaKLx63BT#9?oRqRpG z!j}D}yc~t_5NRb_G&cz^o>Uwqtx|YcCSHglzUjsUYq?^yLE0MQd zJ(Pe|W`rqv(rXOdqx7V=O-0_D>dshXmq>9Bt-SJgW6imT7Ag5}OK3Uw&<%^wI}+N? zebiN!B$TO%LR&(nV*3g0kt` zm5S&F4}FKH@0&byk4i@F%O3i!s)6X1)C`fk5sZ3|vh#7ME?6n{s@&~B+=u1CTSF6p za}Y@HE4Y9E0hLJziyZE-mCDx4`%sa{e)bNq_Yr#s**nDE$LxK=-eLBRuy>TbPucs7 zy<_Zs&fanMzF_YJdtb8m6?8oebk%Lu%P(-2;w zQ)J}eOhM$0(~r@H`IDx&f-c-{o<5AMYI?v=s-y?I1n_ zS2R8g?gZT!zw?-=b2Gr3q_K;66nMFSP1dxom;yxF5l7D7I~u$%G4)b*MW2Jqg=v?v zdC>sXpOim)DI3=V+>2q4H9f*MCdN-OqFFN{EYGZpkZ9J-2s=6?CH6U;+ZK{H3nZwY zrRYT7Y<)A_nt^MDruZ>{1)cvX7SxXcEdKn@_WKg&OC^>1K$r9Z53kd_Xjjv&0Cj7=smt z#suszM9xwpul%aaLBGO{c&pF5?=M$HI3#emL=>2&hB-v17ey5bFhdHuZKl|lyT zLDMU9SN+m|@F#fum;Zym#N%)L5B^+_zv(~tCo6IMoBxA<2KdtCDMz! zVlCv6aV@k=$Dm4D3q9a}tP)uZ>E(JnaAnyeux<~YkR#ChQjSOOD>)s!?62hu;N{|i zV+A(iio@kx_hDF>0gZB`6)rzkkwnE*;7^cP?MsNxYjk%=jD*L$H`ADre-ek<%?UKr zej{PSW^)2o>(I9{))KFfOqYv~z<k-zy8F(E;OK`Kl zlkLG1WZ7DZ7YD<+KwAfxclo7RmOo04ABtC}{>JdrhvBf#*bvdu54xq70OP}YoPfTJ zLHSUgC!jcHcHRhg#4wRH#5DT+BL6fdavFVrk^jAf?YC+1l*k`2k<&>g`~WE5q-lMz zI38BQH#`Oen7)k$udSX0uAq!a7CYl1Bl<*V#F>A|h#$R-Kr=UAY9?r-JlTQ_>Z@}xXI=xW6z7nl-3miIN=1jA=c81(1uKz;on1jW(lGr6 zFf)2I0eis$I6?4eYY@5?$_sZg9w)g%xKhH9u=@fh;WltyG7@X2Z!p|M|1qk>>cW3~ zp@!kErF%VzS+={5p_=jTdIRSxiM5hM`%`8*P0mM|VoOZ^W({_3q0O26E&48msc(Hn zLqF@muWGPtOAJ~TdQC&Qy%vLwKlHjjX^7Wj@Slo8TQ%%!zDi+3+cenk!Eb1|g~D+7 z+qG~6>x5|Zy?GxHvbXCbz_Q=eRl$R@ z`5y@XU}DkHeF~_vlhl-g?!o+lVj29{68?olVhpb{fQ}_ z97`#_h$;5qzjRd#U`la0jv&)WCiH{>sbRRw!Ew+I#c#2J;4tHJgohiaz!P2Cf}11G z0%L^H85vI+-H}n!JT%g%Zi(~&mPKfk0aq^4c>pD4EkwsaAUK+pjfqm0D++-zmX$rl z%IKogEGr)LiopTMwLWzG9GbPFRXT zxw7z5ZX%qz9E50I1V(h!Xzel-rcS;jx@*ID(6Z&gzQnQ>Q6cF5OGWxdf-SRvO~(|R z`X1OxoK!E3Zt zrvfeeXE_&lF&ghHhns|2^nF7gu~4+8NV4+J;&7H^%?1J5Er#w1KvCa<1xeq3?iTMG z1{Vo+eH6LOf=ucA5fDW9b8vU?Or|N3PXVEW_yw6=nhl5NRzz#d>=F-9ia1m~F8HfV z133E^nFSswXb0X~x)H+dDC(<_eNOg3c9+TEriv>-LqCAh#Mc>d+2`eB$P;1wv~;J= zLHIrj8ue`{t%-N>(s;MdeFZ|ijRT#2Y;|RLIHT`7H0ohH#ogdNIO_3!Es$t^@-DAW z-Xabhq*9qR-UE8x)47Mi+so?CJA%-CjFu-uqX6#vj85>-4;UQ{ljYxm`yryVzz@Lb z!hU8ROB1=(0X-05HU#V=X6^$;h#q8gE1;JHdMF}`Dg2nQL68D`wBr*^8`+0-<4z!X zM2j|?46!{KNAvA;ASl|Mm7+x@97>Sbq7v4Hg0~UEBfq*hVz;b>BMOwwW<%_%PNG{7 zY6Q_0zG8^CtK+{$3LD)vuNvY&byRhrI;s-wUNc1Z44NbWv3mv*3txwJMl{iGD}>MR zqko&&1>1aD;Twi{F9ZKOvk*3H-X%HF?oD{^BBJp)2ibu%RD-%tu~JHbj} z<4P`Pr;(74f6$qNj_A0{sMa>+D`Ml{pmyACRJ%UqSHjyh2JyFzw4SKa+eUcDNGv3@ z3S_0QahtK@9-~SUvpc?P#I{dqK`i`3)13E=gk}|?uitC9wGh=uHRy&0h>a=uo1`YB zKh=1DUY21~3SN-dfP%kEY(b4a)1|=5hGP`8j5dpoK^gz!7U~-i_2XA)~>byx&bf;(@p*8n5F2Yj$ zOlO`TewRHnxf6GQdFiB z&dPkkc@5k|;?vBct|E!P(?Cm-_#2KkgQSR~=MCbBP%vBpjsuq{>L@}H@sKBerxeXe zyg7@1U;xhIMWRkbypAV+n-n!jyatPZXaLUQSBNGN@g|=5?Ghd|Me7=}_lNTA zB-(r`#UNr0V%BvEa8AWKah#WVVDxcX1d29a!AnL7n2MvkDm-WaM4F1O5>_NjEidAG zrI4guvi9W~aMoTQ{;bcpv#poFA}Lx?0$Xtc`zXL!`!!-rBw1rT?GH&Yg0zod?Y-e% zE+?y~5o`_l+HTnBq33B6Z})1FMfw-%qS^tA!BY~W7a9a z*_c=1-!buNX;hZziGM5Md3q$oviLC#5Ix>s)LB%GCEHWk_Cp$Q&Y7U# zN7qr={hsz~;J}u&-^1E_z@e>YOk;Rh+qeB$Py8wg_q8zmBo<$-0b<*m!j#7s-{Tq6 zRl;lv#doqXJrQE@Tj1m#%|h-iwB`gFb^p z6>oSkUMpeu0ST{ijE7-;O+un57bZS_j30U8*GrgIq4@hOe#8KXbE}mw__7dijmQNe zrir3CVr?Z~*;=0E!1m2rn%We?1)}xD6-D#J%}Ku8&5@zN# z%cC8IS9$mj)~5*JvRD*-BNin3J@SG?>X9MDf<(&Hc0;6?5MfV4{rKz=HMsRhLWHu26B7m_v4iM#CST!`=YK8XBV#U=yA~hsG+HNW5T`gQn0^ z3M^Z|GUF5s!}H0Y&?NYSI0%bH6Pm2R&^b(>q2TQikN&)ZNwh~_p&->>*i{PBJ)dpZ zs33^+mRoR7wL4wj z>VjLru6W6U-KoB~9}GJuxF4MTw8D*GzO?flZ#HkVQXm-LRb2th)2wZiRRhQ`1EGW1 zMq&1V`#oE*iB@|b5c3GQFbDdIWKh8mtYEWM-B%zh6r5oNn=2H^zbW_;6#PgFSU41b zZ`HeBAia39_>*pd$=pJT!ZSu#oJY~5jp(T5$fD#r9&Y4oIHFRkk9E@CgVal`U~_hez*;P zYJ}W3C|Btd?l6Ap{Tm%;0T~0)N8jVsBA|;feoYSllZ1h`Tktu3clxe8yaUL;>jWla zAo>#h8AYF>hw+ng_`f9NzDa@T` z7-`TM=PnB#XzET6e}wVvkWq%i(x{7H5h-2>bePAl0#AhTd->6==gA!%GbLo;ar zo(SX7_S2jZd#oy8d}|`(GYI32Sd3y11?ma}Q}Tld;Tr*YhGTk{0@3R#VSI&U0>|_& z1sY0$is?O;Fn$C-kpsO)Nu|%>!wZ2ti37byf%pshV)}wUycM{UInZ8;X*Uo=ct5yP zIM7}S^a&6kO(%%^1GrP!_ko$vk>l zCyX!fO!vuHiu@K&F}=kT#`hX#aPIB5;G6mG^m0QOpLm$b2JEMpq91z*=3dFCv6w|9NVSFWJHV691%7B>Yy_7J%tMWVt`iKJU00LwLy|5C- zFX`uSpo0{MzNru6$MXK#UWc;~_g|@mjf=-N{Fq}IcUiAi!X91r#6s&ypMb(=*bsEN(FOF2FDb)+0|K!1IE*q8 z+-l+nD>nF?N(VSNOVvbgwrYglOqC0s2;-5-3Zn@sIY)yuo|~BZaXE)hPP+63G(()X z5`uHo0DyyY)qUvAQ$xWM;ZfkOG`eE=3sy4NH~|P0ekK6fFQ^41whG);MhS}jNn#s) zu{Tg`zS=`#c(SwFpg~i{;Po;*-XU##!1F7hnL@?H1s5m*6Pe&b6+my1qR-a4)BvQq z2*e}?7psQISfZMvw_LSBZ>hQky%*Iz;AO8=4};eQzgw>%Mp)H@%M_pF;1$g^MkO?M zG;Y+E@~}+WvqVx%Y;X;0U(4Fpv-WkYeKl*}K-%fBXstmTFc1Z#s3MAWMzR-0@Fhi2 zl+?_AS&aar;6@DYkFV!?*)+zay|fK*CCxiHrK1=%5pJ;12N>R+iNEvld>jv2Cc@Fi zlXt*Q60p5p5?04z0uM2rU-_I>YF1N9;a`KU^hR9GcJEa81F;90zB_N z6yN1Qg?Om*Dlqu9MA|&Y_kx}z65YWBsV1`fG*S#&D8y^1iZ7+{aSk$0LyWIuIPVew zsxRy(#MUU9uV5P~!0hoZ5LT#p2j-ra6N`60jLflcV9UiO#q1sMCii?taM>N7e6rY z?$Y#%T%&U8E_gmAzR-z9%?hWFY_2J2XeRf1vLPqVCXq%462Q-=WF-%BX6f zAva0!Ivqgfzk(~s*J&Rh|5f-Ocz|(boBx_}Ob-t2R+TKVjpV!ZS_c1pBX%cc2Dhpk z0S>;d?gFpNL*UdA=i=bA3H2z_x2aL+ZC4Y)%YIWmhu#jg5WG&Sz=1G$k)*D8H^~aV zrSJ|(aHqmMB*9&ZE|Jh{245SMQTAvOd}-(nWxZ)ABkoBaY>y}5f`SJ+<~I7qxEX?l z-d6CL)E8haj5>J5=v&U7Q-Ay1!r+Z-5;(;IXW-IP#m;sT3FKl2_Z^gK^oI<1`Q$Vf zens8lT7@mSA4op|sT4xM zA;&MqaqwhW=@!VucU52X-ctk6+pF#akMitS&a=6daE%x}IiMNEIi69>iJDPhzMbcF z%gRd8*~0lo3HlAKsOUWKd5;S~qO1^k!_AOH!}d!N=4y8Ut6i9@-A7pM!d&eRsw4|w z9L=bD)DxviaA?w(s>dO!9^MtBT#RD`+#HGS;IY$x5@;o8N;CsAeIzjcHcVjOfQ(W9 z#z0l0|E^wio@kz@99}H;)6qcw7nqLybYPHw0@JZS9h*=1!xgabFrNWo@p*b&@Jn?B z2*Iz^SK#$Y8w8VK_*JTUOS=-30{KLwDmQ1EoORg_=r)LI_a!Wo^(UKcb zOa6>o@~7OAk8w->oLlno=$0H_xf~Xa=3SWFJ?XJfuQmdK6Y&%!;*vIiEomHOE|03% zF0ds%9Z4SbrQDLXgRb!?%!k(xf-I7rAyN>A0YD}I;y)F|moG5edg(zY9cUQy?75Ud z_-S=;l7$~s2Pa$fMfDU*-3HiHi$1BIX3;0r&s$kQ%${T6C)J%=fK$>X`&lcD#OYQa zBz8x5p4Az=FrKNsUPu`#i-uLz-QO? zW1^NIRm&g*cPags+e>Ijody37Ks(m?i!7+~wQ0{ff3XF7y&ipu1^d>uY2P}3sRcXN zwQ1)%^r8j3mUSs?Xqg4WMEztOCPM2h*x9T{pVNjmSg_;i$-HF2HgrAG6MET#HdUAP zY_#CZUr%O}1-ES&rdqMWhUy2GNs`Ur3ag@41eaTM(n_`B8o0?2A6&_`Vinhl)m$sq zaIIL&wPJlmtth5i0e@zJ#o|{B`i{Ruw1-CnJWg=4MOA`|V`c$j1|@<5LP!WC0XhLI`)(Hl zI_V?>0)bIHFp40+*q9{1*d{3FaHpJe&N=6tb2#O!Q_eZQUscWS?Ma8{Z+1FQ zb$4}jb#--hqUgS!Aqj6HZ-s@=deF9sxk$1cKIeJFhMOeckqaJd+9r#L=_=eh6pfqIex5ng@gy_2;5k(S?wZG(!g#}O) zwZdTjcyt;X0$+~v)6kqEi18j4&99P%>wy5rNQKh!1>SH8-yrBO@D@q` zJdfILn#gVHr%RkZnHKFM^xG&!-OLRG4%KPp4#@zm+#yorm3tzs3P$o*(SWa}qsd3X z7oBOTQE5UQeLuj6P;VZw9?c`VBuP{BlgtqOW~h<^Z41(CD=E;nGy!c%ffgqz$lU=2 zFn=~xdkMlwZf_ia=3)Mf2zw;k_9n4ne`A5>TQ03*Y9yEjS!d6 z$NU8^VM{g<4B6QdZr{xeTa<%QNz3(T3{?YcA(QA>g}V?~J^`yMf#qYc!re@8Dn151 znJCB#{Skqfr(iK)CQ%SzW{iZCjw2xmXByJoq@@P1hIo^e`de~8S`dO6mp37Ngt>4Xog$pdI!c_Kd0Edvm~JX> z(a?jzzq7S2G#eIsyZ zwjgEhXOWkYN*i-nJ=1m^#A~vhR+abT%mXY|gZ>Sw^yq*)@tb9bH@uT zTt0xOd2cqlL&Ahv6vPVrLgXlHcJ?r3j?qwyMN82ZNa&7-iR4`m5lJ3JW22aAj?={S z7^%coh3?5VNMn`pfcJkN7`%0)|+=GmW6 zFoDylvX?AhdD1I(m60!7zBg!sdW^$p0?ZoS;-X1TE@CZv#qy;vYH?!9rYi5!YZ#55 zQHgx~DLjJa)kLPYk&!0Wdl4_M_ePmm2ZoutMn;?EwR*+NGv*jNEg|7-AaA#R8s)0j z=qOZ{@!~x?ABDyn$YVL$ULBX;(C;azIj4_&&ALYGfc8{ zu&nBf36tea*%bFonR!xA&ziFu^ zJmoeK<3<&3S*ji524QJC4lF^FZdz>8?ZjvS;&t1~{R!8X&X}pPcdXo>#=Kk&m2^=< z=L{{|8pp)=qQ&qs!ngtsRW-caY))><6j@B|E;w(-EbTuIj!H!P-`iOL6RVtqIDe4(VZ0ELO-_u{R`d3&$HeAbI!4<-I9+ zTRI>l59Ylkv8^45Q6G%Gtng zV>_v}U6Cc!?X)^4*nX6-{hVO?F~at9g6)}v?cy#6Tt6qcew=V!az;*?MPS-R$jceR z^^4NmXK4(GJNa9H-NxoA>MF4Gg!x|th=irBO-mzn7tNHl114uX7)jbmyvOGaofhOi zCCFX6y&ZwPEOL&ps(>6hJWq>DaWh-i!S+$%#eIRe!d>wVZ3lL=^HTh)KHBb+bLCaz z&Xsc+odke)eDMIv79A$IG&?s6FjA?87(rYwGuBqi(5qOM;SO$ashCxd}2SVo|nQ?9}1lsjgfQ=Tk1 z#pjf3$~on-KApcBe>Q8*=kJvD>q2ZgQ&>K8p)C_A*@X&qv&b4$sJlhxph7(?vImvW z(>j3{ABbLLKSHo>_Y)f<%B7$oH=(-3fuXv-kuf-d^v<6=- zr0o8!+%-0@jB?t_Rj=l+MLL-@3}Ra~v|3un?SY^;Q4KAR)@Mtq-V5l*Uy07_;s_#y zFp_5WS7c`2V6S6FshgojN~QZzrAJDo`&$rajg(3cuzs`PCeAfH(1PLDkpbdrBZIBt zwi?ZOBg5#t{}@gm8BUEfmK!MrY?6dBJHF9oQ$M2vkAwzUq9{kZcAJD8%?s$zP%CbK zW{Ac6Gki(SX4EmNdJ=6EzKUjx&GB2a$HOQv*6vX*pKiI?mOX*6{}i!3hX^ithm@R= zJ^sOxcVm=Fmio1&SB}`ZFgY5jq(BpzVzKVbR4b-C6XqTF>6WZ!EMCpbuy{2y z)8f_4EdFr9Y>QVjtc-H>f$!5M`mwC<%T_pKu_`Ik{*0@dVJN@YdYMCA=NDTqb1g`S z{A}wbJdZ}5KS-mFyW+UboN&G%-CV?7G2iV9A`K_-HJUUNzgh_O8hAdW?OPnu6>K{d z1qRrLX(^ZXui?3X=gioA6?csR$MXD;blOg3karm>zks}eK+Z29FC>uj3&@LzXt?gh z1b%)7KfHv9M*biX4W8l8!~=U)fK_i3-kgKA-t#uTgf7abip%Gg(&viH=a$hYip%Gg z(jW>vntKG7RNJBT7HtnJMwLrk z^Vnu7;mPG_*Tgp5rID^s`2FgDH5cQc2qJRWU8NyLTdCI&Ey!LrxAxEE&dus(LZ|y> zedcu@)hGKk{U=e&`fMDglz-pDSZcoLpW^}l7K zg<$0&2-Wb~+!DLFC9uCtEfLydQA-H@yB%u^?DWUz9}UMl6muV)OQhDjiwMjhY%1P0 zVnP(so#=@gCf&2I;RP!jTKyz#u$S84CuxIy*7G*p#3x4fQ$7B}^VejP)UlwfNZHPh*Htvvg;hz$Y-eW@@tb*2u_AQKsI z=nXah{b<6>7KoN<*Ru?IVDNp&a$cfRxSi8`i>pn>yFPI6vCv_QY*vMiSZuuOs71!R zLdPsJ-WAHU*m~D-i>!AgoUq=*i|g2$Kk_SlWMirgd{KibpucQAr!B&wn}(E*%dY!Sp#Vg^g^gE-V|MzNQQ>w~LBex{gr@`v z&(lCWB?Iw-g+fnpw(vy@#h#LZc!^k#voa7bTQ6XZECcZh4aD;@5U&yfpW(cbYgXxK zcrvwY7w>dHr;J=+J?d~9U*|T)K;$;QA#Hq<+nAfTYh3fzkyQ^bL%LBr@hJ187tA(H zyK@T?j=Ss#;Rtm}S46~j358Ra^gwugm(XfMhO=}@PcD!KNLGQ$?By-W2y}v@RPsCc@8`uj9jye>8Bsy;*aB_m7Cf7BZ5cR4Kd$ z6%JV-7v4+?HwStva7y|JQgYGFx#&;}{RILOTIxo4siZ;P(wwr6p-PLINh{j>DlKXz zt!eM8w5XZ1(a^jq&6-z*EPiZB*Re8P%jG% zZ3%{#1%`G6!^;9gdkvPzb$1|mUKUNTjvAU^FS8~X!!|Sun+q0S_#x0$lQ|oL26LGA zdH(LY)oA%ndON++^Z~pQe?{XAMj)M!@STTf|H_s)~M9JBHG=1*HL2Z3asv zjr2av$Ocn0A4|>Bsb(Kb%{uEcHrycRIO(iGLO$g*k*@khTYbhwM7n8^kk2JecMU{r zCIA)WzdZ9{=p-Pf6cOunsY&2bT zAwdyDf5%b8eUrRO8t;`oy3SgSmg@DS>W!A__0q6qH=6AgvO&cOTt?Q68mC=1@xG|I ztDR^zorLJD*>o~|akFWqDNGBE)YXQ{%q2GYGX;X)`Xw7-%-dI*>UGc@Mrx{|&bi6X zaWY(b@iIuZB&$5l>*ZvBP?tDF3cSQARni46tqWK&etMdIxwacA5G*t7>>M+ea ztHU)PKx0+DdE6*Jx*as1ThP^eqSlH=EXXM$r9O@&Mf0nqMc&uAR@zYGrB)-TR^z2s zBWVDR=UOo?EJj9Je<^c`7hgeZ6n+W2c%yU)dO;J9Uf8v!*H~SVUgPw;cqNS2sd&BB z0Dr9Bvy?$-ges7F&ocPjesvGNuzC;iU93>a+C9s?DrtqcJb(5FLj^@|asq)H6urrb z1a6Q8UvHDT;7Tt;y($WI(rPd90!FG2i#*9biL&RH?2{>be$Jlq2h0JSg6aMmq3lKT z(5>0=6C0PmHd=n=b>7-s{uT9{6hDQEe@=>@O2t3N#dEgx(QHW@yd^yZR#&YmNxo^6 zuM+2rOxNJ`-xOd-O1ja@qV#w2&?=7QrBz>z%+P)i4j~sIh^pIhqY*ZSua28YIlsY#~EgBK806`YFwr4Mn4;+*&V?D`I8y4I?_HIIS zWk=O}jK{aR!$smmTrm@xr_0f6zJ3cYZs-gY%UGMV(~Hlep}XPcK9-8g5MRO#4Pt;r z{t{`c1sc-5Wt=9mP$${0o7J9QS1a?ts%Ey^nfW%BUBa5J&Vz%Yd`wCkpH!-fFS0_! zZs6}8FOhsBwYyeZ;sDqZ2f!8qU=abZO#oO-0En9bD5o-V24JrMuqS5#_IVkO{ea_u z_a~m6dT4b-Fm4H9+!4XlrJ7WD7>@8Vg5wCo!6$kSdRZ2Jo&cyDuc*&0aLAhv^-~uJ zfVy-a4Nlr~3vldVFAI09yx4AZV;gcTYs(&_ZsLh1YxQ=7P$hoyp`{GXN=I{uP)WzU zow!=i5XvWKf0k3V^2yns6;!Q!a`tB>RVyE#{o!h5O0|mQ#h`kyTE_+OvJU{x)jA=S zeu{3}$yRBuR%Q;>I++9XT&+_%M5s!qy_t+P+YR+?-ta1_(zjBj)fzH^Z}XD8BeI5u zcO$M|WUUU{>U%lbbgd?MPW9isIG@dTqhrL2?i`)9I>S?=`h||5{T4NY?VhzFq5D~e zp7q3NIC727Qg4{-+tIiEPxb*s8hI zXA|*1EhNoms#{a3+ZN(~B%JBYMQSsdD&jbt@D^MRj2Pi?2xTr)x_DdyhXXYQFYdDh zoGlDBA+L~w2@E6O&~(LH7O`qloLTZvmRa&ELW$!}QvmdFI$fBP0)(6WOhy!jzXUfQ#&* zuE@>hu%(=vfpZ z&|XbfG^@lRJ0J;T6r?GU&M)1AFM3>=_-kUu8bhX*B^cw=Gfm|5Ow(*JOdpzY5X(;} z|1yBt96{OiIU!9I8rcFd?&b?0V@3`xzNHl3iZcq|2+0c%6jk;~?Vm>&#+sALZ0-Dq zhcPu(=(M!b8EK`n(n{x~mCj2mUC`sH=`L|&m2TryLs1DA^(+MP)b)m1P2HdUh!@Aa z`QYI*hPJK4%4qGV=ALx0A2rD+aG3@fkYGtgI&eiWGpMpfw12^UvS9M6q>hdVCwgg> zoR7$k4E1Cl8<_cDgZ2<(s!HnQChe_N)wrZpqe&qMs_G_9bFQ%_MIWtdb5Qs)jkww} z;;zt$lkmt@{kpB{a+=6BT`uOnu9IW#8@jx$>PecLxy3%;g9*~)Q$||x;&k*ZIQQCw|w4E3!80=w6wEqi@c+{Bchef zgS)lOgS(B*gPTZ0XUB&Rs5m1cFbcuN3MzLYRAw=%D{-O`MdM3$KWS#7vCxe%fhApW zy0!jc&?9E_$vP@QBd-U-WNk^)Lr?xhoRo|{K@q)vFQPX`#EHQu2Nm205%Ih&mC`qd z#LDdFbVs#~R60f(YHRPIS38@IPlnptbbd0_!R7;$9pwOJCpkcwCI=|f`2Z#JFZ~@B zy6(InsPiNe(uN(Kh|Gs>?U8hUd_!%er#vaxR^^tShH6=h3Olx_nwPnY79$ z%YoGTk31flZ?kEc1vZ97*}EJvBM9W32Yo4J&JnZ1l& z%k2&HT4C?RE18O)^v7(uG9P|M`=Iwa?>~u+F}Tm#Xlz zR=>n9!~KOzBtwP2h&jjN6iX$Sdxl&ret%Z0#+*Y{TI6)(DP@3GlOGAMr#_u5eY(MZ z!-ktOL^jfC*r{@2b`zb3ohJSJ%sa4=;^amWHS3WwK=uR#fPny9)zkuMS(4&uruE~e5%7?GZhi}M-Z)SbCR{V$W z@P|Wp1=H@iA66AgYW0uv8Q{v&@sAXB+g6h@6-?m2St*oCHngrz)>B_`)cdBdZ= z<5=2>al@cu;JPkA13Etq-V!MRcU@usZ{m;qq#yYy&d5Wwet3) zS8MNJdbRP6#Vet$cRIb=c^A^Fy>~TURX<4R;5`8cN}-Yap?VLcboBD@?d0X*o95-= zo9^Y|+u6&*w~LpCZ$ejZZ2Ycsh-fPwzqPZ*Z>XDB#_y|#fj8?x#AN3^x-tAC@|YW( z;s!MhRV371>d-^#(39%`vy)thUQ&nNQind?eaMi|kE`<5R=7)Vbg-OI34OiyD5k&n z3cUt+eE?RK-sJp5kptZtSKjPg@z7@rsQ2X@+#u?Z_vL)tVDEc2+|&t?Azl!bYMdrA z)cY4(RTuX#FUEcim=8gk;a>E$8$QAdM0C@Sr;e&sfM<^hUW{coe4-cQy=DRG*vKR= z=s+#`)@1MdxVePOXWIyWRdotH5*q2{h2$tNEhIyuy}S|}m$ST8Rt$9ZGR%8wpg zvkovgZ?;dqfyg$hHo6T9Iof0sW~VC9|8dAy9&=heShKU_-s z7ncO)pel|k6y~8Y)mx3+#JWYM(HH*BUx-ZiVjo@HIRE6rR6*^{PbtGQsDJk|aS6}# zR=45i{+;WEtmgoyiOlns^QiqCUS)nN?!8o*`F){T-W70%W_x$jYmWCQUUDSLc^W0d zd?L2F;*La#(Tn&aQHn1o*z4q?Cz!@x2MrJS$Ie949U%(74 z@iG`o1&qaUU>p`O&@D%t=aCvaRjLRhrgTdY{v^7khV6!{%17OlpR0^wOyiaja2dsj zo+D*V8*b_fRr#1h5?dqn3pFdQ%vsSgYuO0@FH(e;d%>^I;;O#7EK{jWfCcpc_3A!& zj=LUJ_GNAJ9=r(TDW{0x%Z9Z541scgMCB7Mtp8Py#X;~`6oORS4Oiw#2V0SVl?(-h zR(RPwz)CNf2S`}uWlI37y<`c1kF%ZvNU|-PWuM4A?Ut}*97JgW4CWjL0o^`%92!_!#Lbv-j(Kz3`$}wB4!38h#6O?FqSY!O1Q8&CpK4$z6hz z8F4sy2_MGL0RCKdz!{_L4(bfwR}Lj=y2o2P>i&~at)+=@Cc1m6 z70x|Ht)MDjaWFffv~+b=Al*l$ofSy;6R9|xpH`NU14Js$a~dB1SDj+Ws4nLxQ(`xX zD$r)wHK|Md_-A5LSKS6NIVi;BkarW(hYkx(Ig&+FuIEToZsb5ym^$B-Hi=3Nh+N#F z{=u#oYId6`4mOBYZXQE2c5_Fu9ONQ*0bVm#zT>9srgm`sB;^in1GFf5YX`T1GVeM; z6m6uQKF5oWD|o5O_nccin;uoAgf1PWCM?At3Lo>5>ptVfqP>jFpl4~8O_22Gyx^YQH0QnbsT}&2 zh&A~rxojNJrcFwHrJCFq_DVe{;L(9{BO>yfX7I?>i5n2roTF$mB$1}7+`=b~aX~d? zw3lXUC?`59xAZ|2ho-uuPCibAkJ#IjkJA`YNv(WiISzc`N)8HN@OHwjOOG?%yXb9T zN8OjaAIIF6y*T9Rrn%z9ohvIJ=aGDs#}=29Oh!;!`)HM|wm9JEtUuI0aN{MlpQ^N}c$tM(V4E`p)GOzLWD`75;#QckEEuWDX>`%QOxn&VDLS@hLdLC9e8^)M`ax zm6YatpT(VT!n9r-*O1Ibgs*wQH6#nyaGkgYNfWt2*j7QfhMQh27hLx(?A zV|MX9kK&Bf*UDmRxUusFy_z`h<5h+(7whU%N!@(ac;UL-P=|Qt3^yes4u^O~4L5T@ z`wz)X+uQ-|KU9q8fff#Ezod_}bQ;>~2&aj(axf1ZEk+k&MOr(Jv9OWwHVzs?+*RwP zd}=F`=MARI-F*N+sYjlsO7o21NiRk`3zp{0v#2t3Pg)OOVjIwbp4`_zV`$NydN26g zLr9{c6piSeLxd`us0+VNbCgWgG+b~UrcdbnMnmlpLf@7eU{4&O-@}CdPexS`dU1!_ zIUw|VgwVIA%Iy+O%~M$N*+Mv6)r;2Xtr`tz`I!fVlR zI(>MAOgo(&&^Q4L&tD+(BiLL}IQB-x+qvOnND08T<6}JzW5eoHi$gm-s9~_3f?j8}* z(j^EV&Ow-;%O+{NC>aaMx{>`cvMJ(TnLXYo(zc=4wGeAZgQ@0K#R}38=NlVtLV(Cn z2V=83r-=-so)mX7nR%GN<41i|5C#D2uw`t!k;-QjA0WC(4(ledg40CbyVN>E)q;Y|M$K^ks?|b)bf)vY z4L4)vEC=hTg7>!q9f~^RC_7ycl0eOMPd!Lq}*;un;i-;l+qYzlvwuPm~vqJ`*^1~!Fn)MB$)%%Lu)3h=;++b5%)=M~gg5@Dq$bj>oC zyV6&c=k$@-7?s+srP?J+?bcE4-0=0zFPPIM%?9UJax<0O==_GIkhnKFjiYYZ1RH2{ z#lnbV;2UW)p*U(0_$C@nqrS*yrx_Ma(mq?9<}vqH2Rv(~LM-*!=CrU?MQOL~PRm%D z9S)>8Zr%(Bs@tynu+u7*{)p2$=057QiKRK_w2ivi8d-hyRiQv=r^AMJb~)Uv$+R`M z%2$aR{U3#JElVxhq=PEW12#@~J8a{0kHa=j_d0Cjbe|(OPN|gDQp!(-VB_?6OW7}_ z9FS5DN-2k=6yEV%gPs(QZ`x&?pQV140V-C|X#*3xeD03cIz+pe0Dh7!p{_^JhhqE` zrcgIhax*;xFV|eV%$i7Dh6GO=e4J_H|5v6>zC_=3s0|_$$|mFGRn7FJc)`|G-mXwl zc_pl!A_k46$JRU*{Uc=JLt83oi|=Db%28Tna+ilQ2`MufDI>>;WSAKI;M0iHhUvN6u>NF4O$Q36Y z>stxG;XqL7x^FsI2D$EAG+^!?nx1soK7|_-QXp~Whc#6 z2D|x;Qv;=+2!^gYe8%aT!)KhXJ7TGv_T{$;vzzyc7w)41ocm){;ECL!JCggh5Ku96b)aQCxIYj{cL;0F=7w6HKWa`?^3DE$${h za0xXyy-GUZOXVWQLklaeh>y64a8qAb8{yQ&DKG+8hh3^d1e_!O4WK&pAi98QsYGxs=)5*A43b65hhso!rd6we)3L>I)8!wDO@iaWg`E zqJDUySg5s+(W#A(@u&)&L~E#ieB#AWTVFo7rGpQ}I@s;UpAlmo_O;|{Ql3ydPL8e2 z!jvoN2$MAtcfZN{J1Dbx^au99wBsXJx2VW6r`f>VqaZk5uA+_k}>kVZ< zPM*@oR!upvs_=?d&6!i77HiI|RJj)9qN=C-Nvl@E$6yX^DO?U_P1l9FRAN=qQQvrO z*-2WZ^Y_A?sAbay)HDJ$oxdGU_w^+=(IhN)`jMNb^3J~gFwQ5icA@)lyGV7q`Ucpl zzohBr8;I-hIByl=9zRtxo+uRR?qe3RhmTpvo<3$Fd-<4m?CoPtvX75hNa(TpCbJ^n zWUb~2oP7z-c>-rYf^(k0+21#a+&mEvAedeEKp$Y9C-4mNfu1cCI0yUuFwoBK*GhpE zT`a*vd}yU5Tx4W8RcnESk03;H-6MTNZM9UYK8l(_+*Ln|4D}7R)j9?uGR!x`R_po0 zDc~>HbD7D6H<`YM=q$DC32cefA%w%SmNAHTD~_{pM_qgZhE{&bu84}eNx++(0Alj` zsfH(SDI!xe-$kb`n#d&C$!IcHGR!PvG=oYUdKY*5AqkzXQi=0n*WxsMRhi~tg@xtR zYudkpXQtS3Vr8E3ongEo(L`vpj|CEAe7)gI80%w!#5i9}Ah9i|lFs@rp{hpe6s>x( zq$E6^IMEBQo=QMn74gk9-*9Zr7pB|1 z!_$2u$jyxG4ByC@d!}zx)E${cmAEdD&GsGgs2hcOgv{|BiMi(z^lqAYKFE_?_k7=I zY~L4V(z?JmChBHHxa9K_nv{ML+g33|aE&R}QHHvVy2(0`d{?4ARrYnAyBd`!G7WOU zu$QkVUPkIPtzMSPtrt?2U*^lL!;1*)m!BlC!;1-QaYvTWrPqJp^emXUCW4vBlQF@J zQ6pY1!-=konD0+&$FQ&ryJ^pO?R8*j>W?w^#?>WgQS@keO( zY;ywt^SitZdUuolAH2}*AQ(GcVw;aDUbSu zKNDH!8)vJATuyR3!%%m8`KbQCK8X_mRnriF8{T^1B^wiWrJbAo-i6|f^!K7j?=lNa z2SjL0g0RMZ8WYSw{6_U@;>ST(V8Bd}{J3UIm+Q^f`^Lk*sx;3AYM!nF_eLLP5^<}B z6}0++h5|L$57FlOft$;0<^PI{uMfdoXq%7jTMupb@qOz%e68V2$nep%>wN2aYrrPA z^dz+? zxQY4S?$yfc)K`2Ig))D|2UN(sr-b1guvUR0(XsE`F|lS3g(3 zo1Y6CkX6_}awv>z-qTMD2lY;oM?x+9RP#_ve_YL*`?=<=rRHt2YTncT0_Dr9d8m~? zuKT3_die`dqQ4X&S=iV&;N%K?Ng<(jQi1kTfeuoEj#7b6Qh{Ds{nz_<`;VHqkAG6u zhyE{3+&!yR{+UCoFoa(*guMmAJ_2E1fv}%I*k2$Vm{r)f0g(Lp}Y3L7^V;?O25d<2UNxMeNWZKjjS#_H$;Y_KW2O>Y&gN>6W3~E#QiXJn=crDSl;6^{+tz5Cu@m zVKRV*^8gBs@H6cgDI;jKjG!@DBWRlcMP#KB6dL7cn#a8~-LH~n_#KcyBXyouzsZC& z){hD4H<^&e`7t5=#uHL_ynmhzH`O9C!Cx3h-(|9y=*J}Cx+nRuEOFga{NS6!%@Wmb zRSyis$$maRl2{c6-DaYxXraYOG7Fw+?%Ip>-F^h8L|8VP8`M3Uq!Ry*jB_Y0;Z6Kv z?S1VN+sIi~CW)I@WvgmmogCU;)MYAQr+02l05ewvFwkG0%L15k)uXX0X|Def>@^yx z^R*fwEj5)|YJ{}ZG-|04(o)m?^RZW0gqKe<{0qp<3%Hs7g|-?c)B7wxnDjA4c$qZY z4<_Ap&!N^FB`rJGkEwgCwD>$frtWd#Ug%#G3t!}49CI)BFNvjD;>YwpUeYi1FO9jE z`7zbIrVg?;+N} zbsr|yK-|O{NKJ?}5V%rm=%{N&G^`rb3)(-mJ;-dsJinLFb`Eg{@5iwXRayfFzEcN_ zOu(VjjA6n~Y&S9NjI0q7%Hd3352V@%T%GKGqt%bI5vX3aA=kduv37=j6Gk<4gR(h)z;XgtL)_AjJ*QScf5 zfK2i3q<%JQlK2--68DwN;Qhq8&kJ}L1iXs^-sPDb8|7pp8DJ%c4Ipv4O&q^YFY;lY>OJHb$R<*05#IFYJ zs$o8K<8D1-sMUyz`f1KuLupw}C~k($^QfWLBEr=rVmiu`aNIsCrCE1>8aBbfDkWC> z%TaLF(^KXO&%)agcs?FNthKATVkxE~`k+y+^X` zy)PTb?UT6uIp$VnYv|m6;R%UWsC<8pDqBY(|0(l;e-X+sQi+O&t_T6WDg^Wz6Hpe> z9`qB4YC*9#L)ZNzq7B{fvxqj45bY4ECW9D^6R&Yk@0*F<31s%Rg6Jt6n3x#j_ zS3+XW>*>gC|34vO;WUvuG|_dD@Vow1kfifEJY{vvwZ>N6S^0=9=^hdCFq()?9E1Ox zLP+SI46w!lUZFGz@Cv1AfLAEZ0=zy>wnBcn6MBg-in6P0+6ZLEGh}72Ow3kSy&S89DrQKb$1D@wc#dI z3wI4bcw)22B+@eg@rfhuUV(LX)ZII<9@n!KT?;u)$_88cIVZ1Nn!~l@fiZjv4R$@pLkxvA(#zW@Ya^*BwWe_*Sv8c3rJ z2w?N9zPJYlw!y-fxCaHc+v*c`tE4Ob(OjD)TJ`1PM2_57z#1IDiKxCVC{=gZaI<7; zNFc*jgQU2jft@k;u)r=`4HQs@2ljc8hS}Q@0gQABR~0_c>PBq$?nZ3)?gsDPm4mXA zxKgkOb&J!LAT88;vXKX+C&hd8B+mC2fU2#Lx>T!~410KF08KhmU>`+II#Zf%bl_b( z>K+q7^Uh@0!(#(zMmO)c!0woPeBh2&v!veGOfvT1R0P)?swx=<+9Vctz}OoXcih+) z^+hHG_G8aYx@ckm0`d7pc?mEnZ~#hK5$>E!NB;h zz#CR&^5P=W<^cq?hz2DVMNmul+{+Dh`f)aC5IwXfvKJ|*6_W9{aBlhKu6f-;QCjO* zX*4Ue;bh>vvXm)rp)Mc0nLcEhOmuTFTe7yu8BLZ==iG=U{LN_dG6t=*0cKFz1D z>TdN;2;s>U_j&}NF@z7K6s2`$pbEX#1ZvT1ZJ<703F`uXr`P(x_w?Ej_?2E80~6`B zDbSi;n**KcwI$G(URwjh@nWtfEl>zBtIwW>9$4Ich3O1YSxl*&1DAaC`Q=!hKONpi zbsHr|khTY~XFuv`YKzE@0Q6JFK27zHWCWlFHSuZIl-n7IK&wR3?4t2K=4oom$nF5> ztDAmL0CE~Pd~e`qJL=v?By<8Faf<8@V25Ztm%}3NE&%`qu!_UXRaHLA_+h9jbms%b zDA-%vVPja`0(=<4UmU{wkJ-4_hqTb^9>_(haup9&ZEZvj1kT#3KydS^^?J~2SMVSi<$Cd;yx9)7;~QvT(Z@hoHueNa5?5a8@K|S`V2$lT;OWV zeV)d}+r@cYG!8-v=B8;9e22>9anv-3G2(_d3tpqV%{nfR??(kq)F*KUk;Vw@@{dkp0#50<*)!BY2f*?mduw`i1>6c z)L)7h3|$ZsbWupqB_TnVg#=v@5_C;S&~>3bH-z@w6xwr(X-^dz6F3Y2x)Zt@VBwNV zrjHB{yiQ$=4*?{ib>$V2y7DGbx;jQfrgXQZ{5w+qT`B(_m(N6PcmNdBC2F1kJ}2B}@kOq*wwb zGGuOKGL3VwFweUsW_nLB8Wc0)ftWO$SE9QdrwHwsiUe7dX&RLsr&LKFpH5*}Dw;b+ zC^dsKk&J~B%!Kb_oxV^JLjlI37#UQG%RwY>78fiekMdC|v+oO|vgZ6>%Az!LktQ2e zivlu_BV?5uJNiyvpU+>)vfNZ=00b2Gg;B{1f3M_4zgP0&`%0mbm)sXdB`-x7_#(b( z2Thchnkue|D9N(8Bv>?3w?r$poJx!ZDRV^t*bJh1ElhjTHSgdR>JaosFfuBw4Af`7 zW2IIlo(Xphf|!6~JOispp?DQF0Dvic7B! z{1@Meqz8}Vy3uForbVo()&vUUWu&gss>QSPg>Yy3a*Jo_%aJa@TefP&C%(Zptwn93 zGN5&Ve{;UoxI9eqb)|f1oG;uhh{b5yv&^1#58jTsdj#*0o2Cm^Hd!An5zT~AgL`cV zzcx^--G|H@5r%$%P&D3lPqeXB(xyNOhG&gd{keQu+4g66uuiXSBAi!bJ*fo;avD`> zGY@WD`K{H|XC=#2sY0(HxS^?TQB|?~6?IpGN&2a5k{;`F6g!oRO}T5U=~C$HiI!^Z zDOZjDX)-BSom^CBRcTA04|>T+U8mKWXT!az$=1mC`ULOUaC0a34Pxfn_$<#{{RrH3 zTyms;5R2LM+^mrSLFH8>)*#N2~|9&a@L;Gh|E51|=t9m5?NN;BYwXL$x3MKhX| zLq>h%OH3}eGHR&IXGs-6%V|J=JrZ%+E1?>(!i=*s0p&hUBwg*_|VwCs*MTyZS zGH^pAtwf&Cuppb(86G6lIte3!F%wEVnAaD>Hr2(1QY|u}lrS=Q6E93BCrcVCBj6=> z#S&Vs`a6%X@}8Ucmp$a2gk&@%aYS$zp_VMrqGNP72Sqg{k!H_>Y4+ZqX8VI__8}-r z-J+#2ncdG3MBS>gz8daJjnatX&l~Chq9OCg66iBsur#5G$atxD*rh5R49E$_^;*4E zB0QR~=B*M;8paUTyj6m*ru3me1yniJr~y{z{Ss7AWGo?%>mCxc0h4 zfzSkL{E6K7q47bsW;KobAYpotj9Rf>qs|6(LugWv4I51kQa6OA1lh3BRJS*zI}Xbt z;G+`I;rtcKyxbj@bcZfws3WK^Q<3PHf6=IWl-qz7WZ05WW&ZGjp$-Sso1g34mE^`I zZWbaZ(2oubF=+^G(5eB~COm^0q=7WZ%%J6knU>YnPmiRAnMP>)JSA9}~nY%eb zJLaAn^v2xtg0Py>umlf_`P6csNGmP~;>1P667>1VLSiJ{@I^sTVAs7k2vuH5!_+ua zhQ-%F%AAJt%#w&9~~6ziB7QU~FJf0{>-=8R~Xb_9e@|m0Vc|oMr1j=}O>d zMxBkgj8;%*38BseL7k;R2&g77>O__i1)frZDe!Vag-L=6D}vZHcik(4u)jQ6&|+2a zeLEVyCJ2J$rdb^hqj|RnbH&^l!Q4@IN}gybOpUL~Dq(I3XwSMA zmez{rU{|(-L5u(dTHugM5XB~In_#=y+UDxuQTP-umb+kgv_v4ZA;>4))(5jrx?K;T z!NDJwAoHGb(yi_TC*3v%`J~&XAfI&G9ORR3TY_@ZjgAZ7U>-+pEJ3DT`M9uAn@JeGP zyoU%JMWVxQIM{RmFPtAZPDEMEM`y9Pw5o3$jFRY-`bss4`3NPO!uNo76D4bwEm`v% zlBo(`V9m|4ZCXqJjm6=r!r!&p$rmk9;7-1Nq1?yhBGOfECAkR4%R%GBb^U{K5b~!i z_Nd*t=_dLVVCEi9r;=I({d|UG6VA{HqVFU`&tybTg=K-fUUjNOomUJM*%e&nQ742j z?k221Em*&Yu>OQ#{a(U)*S(K0-F5FL>~`G;2)kYPF&Y^sd1NHh(d?E%URilclI?de z(3rUC?ub^wYN(&GN`gk#gF(JU;!u!okpLF)EfPn9bc=+{F|C8SD5tli zE?nc)L#6_aRf{YF2uX&hxrB{3GVh zr4wOMH^_`f7b?~xn}9rUr~pFLu84@5qNXsy>TWqDCM)pW?@OG&7Sv9&hbgmX@NqPo zk@^v=YJ`plKgBEYx$7`ZfrQZ|L+>DnFVbw*s#Hm$&xGxzN)jKVD&9~t%xKsQlfue< zVIhq0UR8i7WNl1mYpv*P&G8^iqQBItP^`p4QeuUFLVo3q7WtW%i~Nehcqn}xbA1za zrQoWKzi|%O!w7!kBUra++@3}m!Y60|C34x3lffmH3UhemRPYfm+{{><4nFEtk&?_n zoTc&Ora4bz!*yRG=}@F3GZUACk9*ZC40+@ljWJ1+l0O=nQXuLo-8VQ2%frZ-;A39c zain@BKZREA7i1a8TO~oW>y$!3`7}=mFZChC_79>KO8vd0lT6l61_YlZ@7FXA>yRB3 zs4|fq6veRvgHKcJkA(XiTi%dJVzLJX^HF4jlD-d^q07s|uF71(97Fx5q%U+XxEvn! z;U@eK4hAT7Fx|@c+mrczD@;}=*qHCtAQ|%wT?w)^-_k>a$@m-y+spa9YJ15qK-k1^+^`_; zP+jLb#UyUS1)OXfy^FIg(T@N;=*NtFDyvnPd_)oYQ9E_JrT!_{C zNZ@z;@!4P8(KHI-AMn)VF8?W_?^&frBSN%igyRy~2E|fwW4Jg{yNPWg@!%XAEAD~K z8!EIv7m92GiaRAnVHt#2mxZDrvUxKOK{d@^(jJkqKb})WH+ne5gzPCMW=}x`W72~` zlOGHkl0ArM!W0B$?N3dGFWc-+FcySxVOlKN>@g5#!55pUh1Z-xIfZIwwIVU0Gjocd z<9@TK5Vu#Lg-SuQ5roE;c9_E+CY1yQ$>HX5S;8C_i^5GGnHLxFTr`5(Wj;l?ABh!p zWFXiwDm|`mW(b@|#jcXCYqNJc%Pv>nLu6tNvCOu1J*dey+OW z9aTSef~UTm-~s8bFA|T}ztgJ7Geqf&urRA!Bl0uZuCyvxnA!2ITKP(aZxMm@mFkB9 z7`aOXGf;|>Meflm%XK%&1>zYjMZ}Y|1SB+hCq~X{p@WZ?f{3`@Aq13f+_>0jycI{U zk>~=YoY3tcMThPLC6+{SYlB3&)ElKh`RcJyu5m6F$|Y0my5QRs`&=ndO^IzPv58~^ zZVk8fZ)mueKZ5DinD66{A;^mP2r)Lo=Z-^4PMy06L2+13H?wVyI zd4k(s*^L2CjphWDp`2a`N7RQf+AfL)nJrPyk11lDIe#FxRPkTH)@C?Q? z4$n+HOYp46vl9O>1N$Qi;t(|u56-_S z=tV2&(kLim;QC*{?gi|4%HXMpry8CHc)r2&8=j7MhT@rmXBD0dJehc|;?ZCNAH(wu zp0ao<;CUaai|BA)tq zzQ*$_o(_11;F*PIC7vC4j^VkDhjw0`#`7|sWIXTTu~t}3v^7OTEznv}WN8uWWRa^y zl+~~3u%g!3qO*!BtN#m=Ua)q(u%NWEmLwcVu%?umRz_L96J{h>hZ2q?C~I4li&d<~ z?>2oG397cLY2B>VqrS2(RJ&RO&d#aXoTIAGs$uP{akYlBHdW84Ztbgnth%z+*Ew9r z+E{l>U1beuZ*1&oSnK*42m2b<)xJjKeug!upD_}z+5L>A{S0Lx!AYb+0>oQLfOrcD z5N{#DJxX)Czj1MpVT~AUEEx=Mv%yB6!G;C*nj!GESYY&8U|0he7{?aCdu@@?X0c(V zEjD&7hBsrSk-5^aPOmg3ta{MfY_-vIwP6iiZERbO*!#TGHXAE88`j#*MyD-^ov_{L zw!^Uc?=a@>fVa(FW87ZD+P>E~xffoz;k54UHO}mVx9LHn^FhPvd(fDH*TRFw8oaul zGKQT(I^Dy#%Ol|i5g!ru3SL{ZWx zsDW1j>Q!UYRm8S$?3vNnW6f#oS<~2~tQ$={+nal=<}E#ITfy7Dsb^uFcVk=6fwms& zR9nxbwun8{-qWFj#~Rncv!w&PqkDPg_VQROdU^Krf_FzhPkMik)vdp$H(s3wc;*j4 z=&^pDd;QoulDuPvdR7nhSnGy*x(Sc%= zKhuKDV?}2yrZqIsnZ|?SVCGW7qo^?k(*7f6_ zjwj$fc+}JUn8&($%+om&-af}X6X4x_%yan|yqB7qEt;8DS~GK4GgDb-o0<2To7R{X z=C)Sw?rvuuZD(31+nHzZ8r|NU+#aE4I+@MWOsi{}IWZ01^kL@oVWzcZn0a{^y!%I+ z>&KYZwlQY!@f17G95&9hMvXHsjf3~*c(cg_(`q@v>;$@Q-JD=HnF#Mhv(rR)&&@Ee z&M>W3GtIP_@LpJCu3Kzclb4%&m&1E{vDt2kX$@XtE?)}o+9l>zcy}%_4=#bX_Hkqe4!3+0B zc;P<18Q#;|%pKcJYx53s{BF~lwA&no8O$2AJsNs;hiP@lF!yI5v`2>7Kf|f zJA1EreXnWF+Gn=h5AWiA=Bjj)dTR3&onbKP3v-|dHp!N zt4^DjP6Md3=J~UxHSxT8@&ZEf?sUPlI$sd);Ik$YSZ&UmW6zt``OD_et4M_Rnk)Fu z74fdQX3n_|?{#y>b;QEE@tSGv;80~DYAs?B)%pfvZ{0C(-!-j)O{^(REM>L2Yj%XU z%U!e2UBotPVRdR@S*u%Ey4vW}%$({T-xHF&Vq zX^3U@7-EgUYxEH7CSI+ETCK()ve_!D*DA}pxZ3Kl2HvY1tnnKyYxYKK;YN5nZMKGQ zwye3Et?irPJ-frYu*0&h?6BHoSXM@cbsO3&)~F0}l6x5V0;~I8YsOy7TC>->z7O8{ z`>nPIEUV)|Yu91R+I!eKhu4+E)`BCJ)#13+6KsUFI!<}^VG;O7)>0@aK?U|+rz&k8W zk0bAf*1AO-Om=Pc2Bh88QTOkJ(3$P@f_BDNT1u*H+(jeJUNH zL(=tVcqgRm8RWg5uG@CT*E{PTovDa!dSf?j4e73@;+{zBXfNHox3;?U(cSxKYi?gX zzb`_M^w#a+oz_RM$9AH1uAjcqUt72O>lp*IHEV!gk5`X@`oKU$ZtJJ__R|&;Al^a( z!~=r{>869VwQaQSGDcgy#_7r9v~_i&UOWkrW5??$db7RKnDdf!RfnF&e0dJ#>Y=N&)f!hQVi(w&xLI= z)9Clpy3ILlZ9T6KpGVrxCv@)<+8S^|k2nEu$CG*l(vCQ*7oCL{dG4Lk)~U1lJb9a+ z(Vfqr-_PnHXHmVg`UHjcx~RurL|0za11@W8&}BXJGC~JQXw-Z8j_!FEwQOm3f}J~S zN_TsAciYekQh+s_6sV>cg=6}rRq4jW~U9A#T$M%nZ5T0hD@ z0pl*#?kV=6DYkWLihXtpynW`_gXh@R{yFv`oaVDO&9$%3wXKZB_Bk9uv{o&(FE6#N z8%ym$;GP>ovIM^S;qPG!JZyo7E%2}f9=5>47I@eK4_n}23p{Lrhb{211s=A*!xnhh z0uNi@VGBHLfrl;dumv8rz{3`J*a8n*;9(0qY=MU@@c-NbH9!90tM7j(_Q{tGzWTh_ zkDq?m=!>tvDi-?Vi!ZZ>{Z`< z@#ELu*ZB0O@6{)NYw(?_SFb{~Y85`LSH1FI|6H%ehwuNnUOn~0SB<{-{HsqJ7UL8R zzy9IlFF(x+{POFsK39#t_|K>HzE=$zHmvu_*I)kd&#&T~^*;OIt54$mpZ=u2_$of_ zr$5Cf`KrwVmy(HD(WHeWQsm(k{E_-WJ`9~FfgnJGHzjV1X% z?7exMT}8FWyZaRTq|-?{^8^X$ga83TCt(t_(M$x=1QG~fi%6%(q)AV7pU!ld?1170 zwMCpUOv<1^Kv5u|pdbW9#VG*a+TR`#C zP^qN`6*ToU^sceGR%+Q4N+XST=hn2hb+qL?RvJ=-*xKIJ)zjM6)0;;uK#CB1`rtDg zPh-8(slu+l&gS0wT-)k3xt1P}Qv^z(_Ovvtt#8QHuWM-U3(XaQ3aBi5eP=_5M@lk9 z#V|HJry+S3N%+k}w0!lsjonED`Fy$!0~W^O7u^qTFq(EjZ|E&yjot#1)?S;qFUPJo zv?53Wv8B7W(aM!50yih%<|1%Qdjf|oZTD(|)Yi5vB#Vl=TY7SRJ^6k@wirdCCaG_7 zr%>G1(cROv&QmU=Q-z(aZJlkoP#Q9Y;`WA)#^wfV*e6p(UF#dWe2G%2f^PPDb68A- zp=FAS^PE7b(uKlhJzeYlx>%}E(9z(h$GZqv-?*{RnF>QbjkKY@y=7e>d`Cmb6(JbK zY%Y`!B40;acm3*yZeQxtsk#WMw(g#`CQrbQe71n12^NN!&lM0(^$hQ)on#8doh_?- zP*=W#B$F!c>fF@Q)8%V-ZYmU<+SSu0F)fu5+D=0TBjyS3>nWQ;DU=o$bTyt=-zf25 zH379W<=O)K<#QUA;lLbr1x1>ds~O0*nkmN zK+i)8h&^80_pC{S>I=J^0?VX|yVl!m#m;%HK_<+`Qbh%YU9kHO=xu6fZz-4)g>0b( z!4l>V=~Q8fWk?f6Vjw@rK?PyJyFp7=NXVW>FCuv_3auRrJFyH>`BaNRkvAczycS7R zyFqqGOwlG(HAo6E*O2S;OWbS8!9_V){SpnnSlI$fuC1e`t1lOsc`u{@NMUs45DKW} z9z&`sVCD-3BX@Q+2d2vzj^ztTeceG>D^UQ$ob`?HT9fCYkS^4g%O=U4S3TC#ZctxgO+#<} z!X+!B@Gb!BmMt|PZx3wit(Skq=IVg(QE|3_Qg97~kdN!)MPZbIhL)u&O zLMVdd5rdU$I{>UyHjmQW(%83JeOMw7Zf(K2lD|nwlFk>lC3Yc&Njg=SQzfY%+vh%w z2h@|ujol!5MEQ$&p%_fy1i>RV|@ z=j%#Z;hTCFjq2%q9ti`WK3V7_T~ufe6}44ZaHs?bdS87f>3mHSy-Bw>eXbxN2IbR8wg^efK2ubjxQxDuM9mbTP!cJycD^C!cfIAX>>E0IeTh$}>i7+B zc&VTayA_3;l;zV&JpuBq7Bczb5Idq3pYjDlOlyll`4m!KLqvv?&lXT@Xxi99NHT+p z3uS`}e55H~GZkqvSURrc+ekxFZ4v4yM4Cd?0;CAh1YB)$54Gf30mzAO0~j@ThPiYRzocUl|c0|r6N=V6;QpKZDaGv!A01;s_zRE zPa{CQt)9-LYv)5YLLVPu>?v3h~F0VHQfV*GFv=Gh8 zmmpzVEVmvnr9}caolWZb!lYtjUuywTnWUh%VO^?;#)hV~ecc62D>c-PhMu+9($=p} zNA(;KwRJLZ=GfU4CU8Vl-__n+-__d6tT|sI!AVhlQ=bAnc2txHw;D_!PQM`t#2jNV7h~2j{puCgG#$CKg--)gXh|qfE!nQh zhw=>4)6&|~BY)Pnk`pH{+p#g~#P*U{^aX61s$QO`^3aR-dDiqQ_ zDwNKoYhYjdjY2JwsUiYKRw)S>g-qCfsen;}WkLCLrqGxfx;`i(ghI9$MFFFvyokby zbK*;jJQc$yp5!;K;yl5>v4T`|XHY)Xb2>!hdq_hHh)LK*Efqyv3}7y4K2@k?ffKPR!lp-Em9xvnzNE(zE@rF~#7NdBs&7-85SSwWD z(%wJ_yE#f{dP zLamTX*A%EwJLJ*`S~lNSe&Kx9?D2$5&cX&*n@x_E{S9f-_aH6TJ34{z2Go-I0 zVx#wlL-*dO<$Q!30dxX|!PST5dZVSMp3&OJ31iE=sJE}9zM&ntZxut*>k{HuR?yqk z*VBaa39+Pa6}=!-NpOP(3OVfKHm#dZkvr?VItjMtB8eD63tCa_m?SdYYdLxe@rAs} z74>#+2*DyeP#?DNI-qMkmnI@{Siw2~*GF3;H4u_)1v|v`vEL-;Wf`hJb;_HRMUC9+ zkofk8zpZ`kDWsO>)h%anpw-nAH8cFEbCbQKJbEKT^+|iS_H=dFH3II5w6|-t2H~B~ zd*?!DRoXGaicsJ^ET<0u`*5zsf)jXS?|Kd-eSuFiT*SY{w=pTbl0&F?`3Wt08gebG zH|7Bra!SIc1?@#p+LJee+^|NFUy5nvnowXyNkZ z%kq3yID)YK>tkTypt=wzjhegiK{Em){>aUrsU?1dpLD`X#$w!o(eX3)31B%MT=Br< zBc{8?Qu#!}apHBcrlDXUMP?+~#hb_sKHrC*P}n1>uAF|!k)$b9Fxa6MuRvijKl^8=8=UFy)BPfNTH@$x{W%vWi4f#wi40S;19Wb zT5>%SuR`^fy`_w4*x4SWgh5y$o!v)lS-(^yf_G(05#@Stgb2S&Dm1NW!7OiX>*27Z z-grQ(Se!6cX>MB=wYF_&X*M2Vp4!R`sVV<%@AAC>H#rUi7<<7I{xIgmGZ(@Q!C;3n z2qQMd>aLz<)Jq6R3nyQpqot!!9!p}*g#1cBjgUK~p}QNYt$4JC9$xAv(JVT@&>0s>o)OA8n(F%d=obpIX|yAu<81 z^G5rJ)ojxgn`s4meYqKf_AqoG2=Gtb`vr`fK%Z$z$rj}#A9|#KEhj-!$Qc`1ndE_R zps|FJ#R~KmTyMcChb+qK#gKe;xTCYH2R*Z~)4K|x9yE{!Mll2M#H>GMfwpiIUTvN0 zSY>~b+1%FQDNn*r0NG+*qz5lMbLH}7-Y_Aq8(B6V{q0)q1JYckzEQ{{lqr^L$7 z59LkK`e@y+gWG(Wq1 z>cg9~VtF``qgVO{Y(*i7eeO?i+SVa|8aR%O>X$F9WsaJ3Atf8n>mY;@ zhw)~(umN;6&4&|=fjSzvc#ZMIvKZxp46|bjZ?a;rcXoAp`uDWxYMBvVM&}BPsVw5| zQ-sgh)!b$5*w;-!DqME)>0VuU#1urbV(7!Q-heuDg|1CWym|@EQ}R-Fl?0}}mn}D( zUM%g-W}Vx^JS$9>CGY$=&a{5r9^T_g$D^4=l#3ElX!lU&Ky(^GuJzY&Ly<&Ht4_h$r_#Gk5 zwaok`slUXX4;$L9fC}a}pHdA?P25RFq=wt0Nu*eMsiOgj(AlCS8W(k*)($|CW-PYu@-q`YKT~Z;H_&tP2o4bOYBCp;|kg$n-2A+|)tIu`StIz|<0P_|h z!A0Cu*@ot8GB_^3H!qMK$2wX2S}02_Uqaix0R{IYcwZ{h<{q5aU>kaR8aAT-%t5wH zNZVS}7f{qdaSndKR*Q7mwxO|C_idHzX=ztdimeGBgKNr47PMWScm_{~PL`;(ZCI)Xq2 z3B1cg z@bb6NPM~vPSZuM*WNvDOK2(_*_+eYQj9wY=%(k&KAbd?z)IhqOzz%8wo#HQ1gY3zb zAB{pNZB6K2%)+(So%wvIAioB(uKoE-e)1CE`HZ)wmCYM`mT5pmVx*X!GwhbuR{Fu# z-I$_Wp&h@ek|Ok^=P*-$UUjQkzi2+6pG!hG?4g$2QfrbmXzpogW-}9P(TzASN0Rfn zbXAe8iQ8$~1<@LXE;qEd`6FvG#`*%J_732%roNUc3Wb)MrN-N%0*2}*{}MclaPA4w z7DmpAU5HWS(5K7}VL#}Y%fAeQY2U7cv+y>Uu3WauI@iZkWISo}MYbe`QevtYB>B?i zOHAX23+?$_Qhv(fjc<4#J3?idCQQ7&V$Hfo!x*QY1rwoqChD;Ad>5MPU z^|UudO?n0|Oe8@__G0ozT&wA5=v}LKD3xmCn1yAK_S3tlAcXuV@~Kb=mqQW1>b4!5 zh;K=XZ)|I6Z^nfP9qO_TyhP)YyQdP@YHe!Q-OSe3_C7vxk__YgRS|V@gGG>&Oz0}f z62TLS9SyeYRM7{!Rcs8BuWPwbnb>}zFv+AEw!(!A_(IJnEyd_lMx~@{A)t`F!arr{ ziu%(}Shk=pTDhVwq-@vexJ#@=#>YXGVS)vKnekGX{;Yx!JAy{0mSWkRy|{`kSo6fj z6}^p4KVbziHf`*XvIrwL!a^2PT{dc!`+v2V{ZQ^Lp$|1DKqcR>i+V1aZs z*ON_ZU@YLCB;k3u)5r>+*=Lz&%6JN+_d{;=WDh4u&2l#QiVaSeA5X+o^J7Up0LQ9x zQ*<8IJFh^CHtw(r%kYV3g4xNdrM&~^A>XVJ?9`qJvs?~&xky7rjb%S~c?T8splwcb zTmzAQmz+qiWZ%;;B*5px90Y)ZdS0ly?3L+J56?}*G{7JaV4gVY*knX zs}VnnFwlCliG)dyl-7IX0FapRfTk`!2vww=@Rv+78CU7NjbxcI4IRnI6-^cR=hd!& z_L`iC%VO}vw`3XkGSWObg&8a%aQ(7n5@r6$c@Fn05mmMeSVh(WDc|k=FF%OzSq+W! zM#1g0G?Rs4ig4sp_I3J&Sx6j;@6dXE9>cG@%Ywvw;R;`1!nG(W;4Ol#wMjLf4+t8! zEtFZBs=tsZtUo!hixmsyKll2uumSRhy5(%;6Xvis^av|#1kT4%mBTsWLj1yHD8^bk zC0Mx8$c`cjM|Ma{)H=^bbN2F`n%6E*&c1_6eVt(^g%PH{yf^ezxVBV$$vw(v{oaH( zq_R6VX-{@w5Z5=h5I!*R5Q4ns%Mk)*#felPOOpd)U$-|>47$@U?%R=yLJk~=dsZcI zfE44b#J05s*{NpqR-9eE+SVf>HWi<7xQdqIW>AVzVR4~`o|2AjGb9=9HD9g{sGwJ9 zDZc`Ryx21|moL>Bpth*qUUJeVOG|VwPktTIw%eNf9pJC_gfvkyaUxc&?Te+I(uC_c z3hG>I$7V$U8t%|Xq=ven7%`Pa9xYUu>vS|XpEa<@p#<#6(0bRjwaUy)<*ZCd30at& z4kYM|(*%TDs$~^f6GFC@3j$2X-r7RQ&A`gEz{W+n@L`K}?&Wxa>{=kNFMXh&%Qs|w z+7#Vd3)EoyE1Jo)JDY7{D+up)>cc>M5lvKi3j<>fEMi~^1czkkSHo2k%EHENibq*S zZK5kIEz`knPJtz`zP>*X2DhQGiP~B>E?+V)>S{g9l$5v;!^L7SYmga43Dkm(h%{XW zQPiY)qOmB^7}|&{F*>|{<_eZ}6BzY~$j(hBGTEzaN}I2i&L>ng5i+LJgOtIjWnjMB zXmJ-YpFEarih#z|Jd>!ao9sLyIh%_7M<;ENc;j;KLY<%(SJY}GVR%>ut8;52Y^7#` zA8j%-O)oYQLB-K+W0C|MA`|4WjRz}1^e7m(CdEC-tTB>02y5$VH`hDIku&~{x8p2; z=nql4IazD#*1Y*=_N?gZ<-TlYivv=G_=@^ql8#8rppz!!U)|r!=XzOEf{q1%?g{9Q zj$JSizPQPb_lz_!p7u47bBni0{;uH!G?)1D*ETHVB}Yh07|dg8Bl%f|#qX|PaK;Js{`O=2kw**y96Km~%uxvd zU1EQ&qki6QkP=9RhV%7~4K5AmiLf1JG#nM&9I0FU4-Z#HSBwlPWI*%+tFH-JVHZvc z`Sb^p|E^3SeOWYE@$I^Qie=`-Z^{UhK=2kA#FKtRN)aXuMpQwDg;I0;Ik57=naV7f zi82o`nN%oDl_YqYUzku(7?gw&$guOX)L(3X1OoI1sjNQ?lKklpicA9fBPmUh;pwsi zfwAy)A-BscsB4I1{NasI^CcnUOVpm+Ip06_xy-#mKr=T4D?*Z}2go!+gn?p9s(p+} z6lqTn2Wz$zDdQ4RKn`*34Ws8&uVDsu3UDW4oN+XJNwB_7BR$YmvMZbdP@@;AYiw(;)284TD4QVI<-(uD=ped98HJe$M~UP|34~KB+@juGlJ00Yud9a!EvCSUSRoVK{m8s~6o(IZ z=@?8G>2WO-2_*85dX#}3B3`M07r=b9t0>qdbKIh8By`(>7xA+Q#l%W*$%=0k>^Ho{+HX4FZLcJo~OqVQG2wY5yK1K^MP`+ zf`~Co`gnH1Z9fQYp5WZjzO_P1ll z*=`N45p|1Qx}%2E zNt0J&4Q5Ge4&Bjt-0qZi^R*flVLvu^Nk$VewY#zmOLq#qrV@)_2r7s`Eq{y0C~`W- z#BKab8lrJL7}Q-ye%Ezw@{R=D6?9j_!lkE14dR;ya~L-$zd`v8md6>&MTuo@ zM>P4PN-6cZ3pYb5kL;j*A4{k$(a=`>k2`oEqAV_?FUINGW%9w#$3YNm!tPIw2T`aL`J3 zP009#z?kJ6w!P1<0q8zK=O->&95Bg5olw6sCm63*BvN!|CGy-ld)7srTrKRRCT3%!wl0P8HZ(HxFB@7>SPae-x1U804!3gK1kGJ5 z7ez8;)wB2i^tV!cD(}4{1-c8NE2yxVUZ(q7+uJz0k<9}Y)s8*ddOZVRS4ns3&t+lg zH+R8|SczSWL_dtn_P*wpB}?m0SgZxBZ*R0$Un488AvP&%V~u)cV)-ONEtA=HFI@J3 z?uUzXa!d8LkO)yI#pV=@!klg1X#S@#x)jZ|T){}NY;Th)FJGdkmOyKd@IuuMMptN! zbt0<8H6_NHCl4D4IKr4e4`-vWh7~kxP6JGUq=ta-(H|DHYVy}CVYk*a20u(wOe(i@e3z(Cs(d@+F8IFbIouF73>%#92VTH+Olns;yVoC5ftWHxHY) zcctfONh;>e3P61*%ownJ{JN6mqc`pmM%+HoU)6)p^^y!;k80uozH<}yfdU(L$Ijb? zgu%GE;=?azbm3kas*a#6u`*nAlv43V7i(!319XXxUAqL8ORdB+CK(zdWj$!^1L!Oh zb_wdzUbAzP!X%45#S~@2$&r)U74BZJYs4!suLL6-1S78#Gl8`r(4*+b2IFJ4p_Eq3 zYQ2E?^C%_kPXQvD;A?gpR9(cqM`}WK>(r!#_Q*zgZT8nwWD0pV%##bzLtM9eVYGH$ zv{sj;!%-z8mCk}8^e3uc}dsfLZWQb=~3B+QDyrLA5uP0 z7Dc0gPYGp*hxaVrb3^*qdM~IPwXky1g37AR`+UTGAd~rd<)np`qZU;1^~@xS&k4Be z0`BHaCa1F5uJ4* zX9SF*5&mVgs44+Fss!w$60mauEKar8T>^ILpt_>VrvvP0)wMP2&9B*Aq0EJLXYt;i z!1OjIG`@5n$+*|c#G`OnvgWS_+>1he&AmJ{mhie@Qvz&43U6+JC3DhP7YEo};n`Tv z%lEY^l!cekG#4_Jsdg_9u<0q-H363Nr7_)60`_nT*i$87FO`5r`}hvieT*vsn-yT1 zuYMX!O@O8M&WZq=XjmSvIlx4J{Zw~D3D}hZHpH+z-gPBlca?x`F9CZtz|#G`Tmo;O zF!?mzqyS5gWp)YJ{1UJ;0&Hw*9%}+jbJtJr3rf@-2(UEIeW65q_mrsnM1WOv+>zxEQaO9E_Ys*kHnz-|e!(J8$9 z2f>b_?8yN8n(%DbqYSDNJ@Ju!J}N!+#gv{vTZyO3!$40C_0UyIwTZP(GecRTD+N0? zzydoN-m(DuK#;M*TNPmG`Q=K$E-wMQrUdMc60nC$z@91rdnv%uG)%s9O^053pm^7<=!2TKPm~l6FKi3uSXY9VFV#o{QZfm$GF^*-N49v_jePq^vv;eNmyz?0AiJW+?lY z%F?#?;>s0y+xvH^p_=8s!uVxXs4F__r}lCIwnM@*J@>_x^Eby{Mz2XVXLOs7odxR1V7?Gfi^ibO%o|KK1d^pgshPf)SeDyW>j0W|e@|lz^=Wu<2@>pZaJH zu(Un2p+wy)OVqut1m0Z%Hp6=GeQYm*_iTWLrH-^mUkOUlZCBOdp`hKIhFJ)5ojiFRuvf$ZJ-)u>f1!tJ767T*klwDM`2lKqOxU##5wXWO) zYjv-pt;NPjth0>5{5Vr>ttx8ku(%YPo=~~!v{G=IRP(olKE{a_{ABChA7CF5!1o*0 z2OIC*wm#6~^vbHUlXMhm?yrV=E8p6_J-+0=r5&|3KPd0FzooV^A1^gU1cj~Fm7%R^ zv>Ppv?5?XUe<(6uyd{)9E51EhK^A=4s?G9mAAxIa_T?u$^aHK?PXq4ZYRA@nt*yK9 ze<-^`WrKP8{RN(uyq+>fND=>wJAU96`pk4CT?%h;z&mw!yd?>q)~h|>eO!2XK7pT+ ziizCMTvp7@l7n9e^|nZV%_`SToHp^IIJ|4FTwxS(!UzoyCCqAVC6wLg(Ab7 z5@11O7;J8UrTw$T0hX4bbtPc!C195ff{CZD4zPXqv^Q52O?Unt_U4KywDo*w>usb( zJ8#>ZV*H@Bi-J@0LMTtxm>u-2tsOf^?aT^z7X-Y_$!7dmphM*+g>sEw{a_oNP&o?z zB|DdYYeM<4g?$45E@t5^bm$H%lb4ncAKKo!Ce%4faf{v8eQ{;6Tv?bYz3i)wqWbSc zTYn>6XloGf{dY0%Re@R+4Dpjgy#||?1hKalrX`z$sJ{YIGX-L(k6Qxnb%j0(xa|q<36)jNN!sgx=R>{YLcPtI^|mIG6K{mF-h5dGbJyFt zlLCV;31w?+-riQ%*pCh6Q;OCzEatef{2;^|&HqbVmxl5QrP``2w52iM5pdrT#-oGhDZ}mTae>D(AztJPVZuFmupi*36v zm830lQoQ?cXv_R2^0WB&RDexZ`$fJ>udyAD_L9mfFDv#56*V9I)aIlBTVN1xCeIGA z!vtfl*tljsFAi{HDc}mmiTBS5@I!=OG=}#jV=z9rG~i7iOpD$4;0Go7Kz(fwZCtur zUzrP%&NQ!=1D?|Q>Ag>tQpf=R^7F6qnZ&1=OLlgE&8w3H3H-HbGTyPuvyC)`haXtT1|+ZVGbgeY??1YxHWUKR?vx zHUPfLS=PS#9yeVDQS@OwSWjZ8SEx{Bb3@rVg))o1iayIi*+G(FUS}G8=F2SpXy&4X zIu_)a@9peMLY-uuSW@)p{U)u=b)me6w0?r!6=45i5U)SB2iS%(fVAL!iNe~f9kezY z?;D}cNB2;te^8y-)R{ZOcltZMQgbvvjw={Xr6xHalvM#gF7#mm*;%{s_BVE0E9nr; z_Y0wo#iA>}llXT}faUff$c^ zF_WhP?sa?Wcc7?W*I&}GSx`9uO*D^L5;FX5(HfMZcX7P%qa}TDs*dAdF0^$9X|;uk zQ(i^#$^c&;;Qo9CpOf7wUt4wW2sm{CC&RWCk8BU{a>4lt_H2Ne>>*#pzn25-BVnz% zjXNZis)}~^hqjI`@NH^urR5;!U#Mg&3?Y^iD(7c**Cw3x(C)Z{c<`GM+6{h= z8}F$^*7HP7!28Rdc%pbN&+dsQMDxo-TVJuB{W@F|U@r%l4{ z$QJu#v943SOaBk`v?uQm^|}VHf9dn5_ms4uXh(D^mw@4SnjW4`b~Y%Q%nW4~CnB%x zu>tl=(qXO;J*>mdWF0(Bn*(k*8ZkO=C;_`Nz=o?$ekbwox&V9qt?}3k|BlCA8q~h# zmMpZyq<)L}H!dvxRsr(sxJTRglci*~+CC?=Q?7RSRq?Moz*YpgjPRN0Oy~R4aLKr< z1CG7upO~%DVrzh({?=s2aeI;-8r$DOTgjS=4~HMhgWpO$^79_Vzb6#)uhwXBsCVmI zw_9Yk6H3izL1nkK z|I^UcXRLL`#ryXG_QyT7Uu=iC@0Z+23o0*R%xdr0*}n19_GDjh6rT!ix+C{sUtC9f zIhwjWwAZ+&_KL@sSy6d;Su57bg33>qE#%yPDI;^wmH|Bn=n|ky0yJ}LXl=;;lLrFCIbg1*iw?wnd{L-UZWxDFc(AKAm`VYEl zprETnw^4J16h&9*u~hZ~F`!#a!+e2zPmKEwM~6m z51G4ckuZ8SrZ0r@T`Dh@iT|C*#90(Q5%4;Nm#1@>XKV31{}ymt11?6L^tXJ8Rf#X5 zzN@r={2KM3%@p1_X}psH-r2${9-|Ln;`EB&x&z*t3g6x!dCSd+V!3f*Md_7&F!0-h zp}ip9Y`uRPVBaf@MUF6M<(c~udf|SWu8-yk3H#?Qtz%|asnKX&Cxv##j3nb}pSJ5y ztbDn6UZ2~;K6;sPNEd%PwD)b&h4u#N;;-$li=Pbj8ulbdi~M4DQc1B)ms>wndv-^6kr`F`^@z;5@W77Z!2dJDKl<q zULEu+cHLE(V7E1gvR8(t+s%)2@Likl4J|#)Zq50Q(AE*dOSW}l<@3dSHhOsJ#-3-+ zqN_0*uhW#~C)qYm49IU)X`K|zy-=d$!ygk4^_ttFV{yo{olB45}R;y8D_G}T~yX(sm#;07o zKR@8!ShU}a_qiJxu4sMO4Q84ZTFVPU-3yB9rugEH;575@^^BMN|Gw!{@NQXI+3S@f^rF#-eQ>Vh5s9CsZpzqCJjK1y{?-MYy^^Jq-C+(;>WZI&~4?OL)dp>Ev zlb(O}cU6@en=icS@2B0|_=Gl5l-cr)E9Rd4wry=yZ#&>0PyOn&yA0TJ*N3Wd-#F%@ zH@0rSb;yxtnv0%Uc+DSfykT|bqqk4};4csS*dyZeD3g2spFiCH&vSo%!Y{gRc>K0s znLx;_x^U#pw_Wwx3(YfY-v9A4uAX6-L%XiscmA1uXWVf65#@L8U$fqTA3VG2$@~9# zXziUJ|JO|~Rd&5Y!1$H@|NO+e#&53w?iVs|Z#?I(;)f{n(qEqW(x0CGkI%2a_?G9c z{nl>`GxO_@zJAgB9=P*M?`!$c*2=ZNxxz5No4w_^>i_u6{TJSI(ZH)Sb}TpGg5TeK z;k!G||6%v^uP@%*H~l#Sj=SZK_=TO9KK$-GM*q6vxd+Ul-Dk*4jZ6OZKQq73_;~-Q z#rIx#fnm;Fx9zfToV@h;AN=UG++A1q-7H|dwdRGtAG<6*yF2^CeTQGyW&$u1o&U(A z$A9^z|2gcz^Q!Os>kIF)>J^___1qsWJ>ZlZu0G|#Uwr4G_ZqO_j;TkC`FwQRvFAMh z-;ckyc8LN1@u`!pYTR$^k3VtD+O^rw{h{p zZDftIcg5o>o{Fb@1$xxPM^?wj<>C{o<8xlr6teES)Et(j;cYBNzVZH&jc<*o+!P=6 zu6QBj8DAS8lD(9X)M^p4?!k+;$1dw0V#q^W+qOdYZgO2*0d2-)x5Xe2&(4dZto!;! zb(-N5W&LsVJyv#XJibpukLEJkvGK$tGlI<6Br}T4=p-W+A~TXa{PAu2C|?~<`*=KL zbA06EEaOEran}8%tS(2gT7CV!tenoW?t>TAW%)#MTe`;4)cEIxs?ndJ#y>B#8Xw5` z8vnSE8XwA7jccuskHw3g%DR^?tfj_)YP{@gTpen>q#B>fXy$%Y!!C`FgxW7yA6r!8 z1z+QaP~#V>@r6uly2jDe_?gxCvTFRy*SI~@_>pRS)z`354ZA8{M2$ynRQIaJqrS#B zLyd=2`Z!)>x7QQ9<;KR*UjXuQV|KxP?-cHcitFR-^(=g4)_p9)`n&(RFc%MH zL&7yK%h!JHip=)7l4@mhw3{y65l^ltpV$+RaZkD(PnGxem0uN4cDG-UD)1h4TlOuli}!^LVd#_CrLKjIc5aosZ@N|dSmRbYGcu2@SP@scJI8H_ z%iWV}bIf)`*4;X;H6HGsURy_Vn-3iDxbD`jT}Iw3bK4=5UiID8W8YeZ|0qub%vu?Wf5_=tS{LO;VOi~hQY32C`!Q1NY0 zoJC^^4hQ10eA}9JLvuFaN|>e$UO=GFwn8D^5sxRm`%JW~Wt-#ZvM^!^t`Ednpfvc@ zCesdEW19a<0({Z~@AANXD|Tkx_Dx$@Lif$MCZ5P7Q4730P<#2&fQB1BDS)8 z47%`o*ne|eabxI}4K&wO(G28kwQ6mu)imzf#73dg4h`8&K)tb$+-@6u;Q7I&3$#SvBKxzld{Lcf+Py68+)5E1tyg zvf1~?Bizlp|W0diKzG)Pne6KZoHtIvvm)%AsOy zJb6w$%MGiG4|3}mhpWgzi2;?ZtBpsUV!YtSZ!O{m!eu$u=tz5)u{|)z+@%}J&2)J`!XK$Sh4BkbvUo(r zeQa?vY=Oiw+WxX0>!`e%HwIhQeS}Iy7$VyLtOv?A-GXsC+^ySA_Yx2D;{AU>ot!$| zz($@!azq^kXU9VyXY>4Wa?VVHL#yNYroXRmt;xFIu>`UEOnK(OvUqY0S)12u({rXV zWl9{{DtxcsZf)HX52-l7CcGaLKA7_3=^TOTt;n6!hb_L0wvOEu;$dZ+}_6I37Ws32kuVO$ZW2csVYvzN1Xu+?w6xSBnXiz{oSyocddjCLCb zjHHOjpGU@{zgnjyc0ZhpRUKFK z$3tP-VIN0==2)L071wG6?uB*L@_lZEm*jvA2S+=P@lMJfL$=oa6p@1jy?tm+JmNl+ z;Z-&95jai#8p^c?L$4AeVFB)~!^p~yxUMAHpaH*7G~gj9&XKa^P&zeX5~H(jBYnGy zns|nWTI(KJC++3#V|*^`W8c$Jf^7l;HiMR^YQk;WM_%`W0qO6(61XUp7ym)R_!ebjd=spu?PPTt$#yD0e z=RSMy#psf(`@CD#nC}#JLYMG8B20%NRW^DgGc6KgtAuvepJ+PJ5M`TyWQ~Q{Djr-4gFK%^z zeS|qr$Yz$0rB>#+G4X_L@wm*4F>1RFqdd-Tao1_!*e8SN1PXr^W*u~J&fo5k4BkU zWsWow2V(VWO-8(jZ6Q)W$8Oq)E?C44$74couqvwrtoFbhBEzlMuxly)O+2D6)Lc|l zGsfG@-jIEfEj&lE(Ea(Ii&>Mb`-Hla>oEg5?Vn`~hto{Jg3yYJDcE}r`$R^w_`jSxvqytupy z1-Lps+-Hxs?3^SEXHAVKx)CyZ2i!eS2q6TC7L{fDtFt?^t?I}g1J&+Z_guV!>Y=<%eF`TEPQp0yu%ZQr5DvPhuU}|d!UtRpNG`$kB7m#RoT^9_qBUi z*Gl(&BRx(s`Bvuce*9>(m0hA`Qc@{wXr(g;m&N01)&4l9G7_epG7yifV^1i;)*tUz z=eFK+aX;MXex_FEGMIz=;{{vdQ|sdM2jcUvf$Q9t?_tBi?K>Zh2G~CR@w{#E=-T+5 z0zMXx&m1$BCFzg%#YU`+XV=A}>x^TYDNhHTa`QUW^sk0)XQDf8o?FoRlQ21%Cw5E-ZdNCD%=m=vh7$e>Gg9hG;8TF;2@kQ=~ z-r)Jq3Jjhht`|YVcoin9sB!%)KRod)WbrY+uf20uJiH=v;5ekpw)ij!p{o;7I7UL{ zF$GoJ@9#Dt_-TowIWHm%R!gnA-+Az71b*8#i6F!Ntp|U0J0cV8g8|R+O88xDp;Q(b zIfW46C`98^cVFC3@QW%)5z>eP_vP&v!V4MsQbK(-Cd136ug7N3%ep6pbg;W)JDWP* z!34{v!=C-@I(OGOC?X>r;)GD&2iR?67yu0WiE~;haCaY2z7M9A($NBI%hlmx%&?=#_+Cgd**$px>#aCDvwZw+W{i&g`}Qa^zs%Tw7=3FSAjj{g za5558F`ZV3*~U)68bbugTde4JkKB!as z%HVK!KZ0jFl-ebE`meg}iT$Dw=y3P`gR2p|52;}`*0;AK_vFyMvp+r@Ddirx`{J!? zsZ>Q!316hFD?Rva6X6XFhfD zY&*a?vNb*qUC9W>WVgoCw#A3m#t4D8?TC*aa9`43R=6FS+?b3`3?v&M+^_1t!}q5wAvppX%?f==$4 zy4n<(h)JJ2K*uV^EM&%qq5}vlsblolZ)F^?PFrY8LS={h%-vFCXf|z>k&M_E^t(@~ zBMSaoyJMtZ_8--?D&|Gj-J#Wh2aYzD7>kEs8s;PF=7vRE6QTwWt;q*6aZpL$q=$e4cZc-i;lK;Q4Tc&L1q8n#4Y@3&9Twrs7C(IuJti zlkw*X%TM*0?=1k)EcKyjGs}rY3(7bd`C(s`yHlmvr&B%N zpb%v~%MC4svr`#bY%d|>GY3k7SVl;Pq> z@1>|7BJ?S);Qm^H1^gS6_t@Tjtx(myQBm{B4V;J&L3OWGZAs=3;~Q6=%^|~o)+4sg zhNp;`DAw^{Jo&P#`r>i7!>Ii%4z3C3ESKJP+gJGS+OJ%H+wIqWr7y1Pv;FQ6n#5K( z^PKCxN`znL(eNGFzT4svx5ZPxMhJq~tSf&u-uE_|u0=@QZYw=GyNR;yoWq))Tz^@v7wrkQ6sm=!7lg+J3ycT`<)&1~p<`Clielx*V zL5OG!=4iP(U&gLHw@zFObPM>n1qWo`P1`7q8YtkNZ!-D)IuUg2 zgt%zUu(&7Ti^kcNan49Pe^VP^tV|@l^iIL_8^T$b@+6Es$;iD8MB&VA0=E z_)*TiPNaRb!(15aHf_aIJ7`~qp&rO8m1z?xrx@EUXQn5G49&iihn!*PrrEj&Uo7Y zsph|}^whsC{l67Hov+rnGj>lwiG8=R=Q0OQfFGeB;)BRt5DZ~cjl4r!(7kz9s|bsn z&>wom`uh4I+hI@C6qcOgW2aIb>l_m@dopa~k^g=c2Ejis%DMis8s1ylyrCOK|!Z9EmRfLf0IE9dEER{@+EH(7wY4=Fl#b-<*q#9cS zLJbIS-xe<>`F4`WZX=MBA5N-TYP_j--wEzfR6AlDv(5LGf|i~IrV3{@RV?FF*5x4H zGBK2&%zFm!{dmvhJ&pG)-txx|;H@CUVZ3GR&gDIYw;ZknFL}#k7Mmpbq}>Fb)Jxt; zf5|wKaV7Ai-a)i0KYS){#U~PYf|vA{)ZZVxgTWh|599GH{KYe0l+Y=!g?Ew8A3UTk zp0qO_vojvIGoG+B-gjp_erG&&XFOwPJW<)5@qPxSn8ZZ#V1Z605`avyDB)`ZpKPT( ztqyAatXUi9+3XTkQS4)5~ z??E8v+?|-EtpATE5MwKi0yR!yKjQOkku4axo7>DW`Z-l5E{lh)i_1@8Pv_!km?`Fw zSKi&B|jd@AaP_=V6nkZUS6VJr*mK!tBrlVW;KN!lW zZ-m6hG}Di?$=Jz5aXD|JNLH*$n1Jv{JZ7*Fh!$K>F2f{GVR2TR)US3QWhA(;f0-J#ekoih$sJ>H837WVIQ7| z3`70DvW9ad&c+h;wb>;{WZi$!6C~J$H#@$f{DW_44{Sb< z;4OjTf3pWFv&-lP)7UN`a^H!iBRKG3Sb3c7fho%ZC)Kz=QpOR$)hw%+>*(?t_Yxqk zV0|Khjs^4w5Bg*P5tO+&YgMuMKLb$vRLi8BBMLldxpc^>$opgr8TSG^cbeNWVE~(! zOe;xP>jiP%mI>QQWZqXs3eO;$xo|=}@#1*QweiGj<4Ny{Czih%k72Eq!C-Gg-rO*O zsKi80vd}FPZxd4dS@p3)J@DQ}p}UrGjUjNiIi9pRK6D8bXV+)uj-iaB0UG?63MQVP zAoa!5t^`Rw$}!;J7bG&mJ;U_bHn&2+LuqBENsARoi%RA>5+}xsjGuT~-U*s$IaMNK z0|zS9-~x$k2`{%1E30t@9egqQ+PM1t2rT2M@3vLD`xrGGIYIy(KabE`D9SBEjRaTVW$`na8Pm~=3tbJ!apUA5cH4I7luKZX%1 zSRD_0KSG0JiRyR;(nOMU9=<0P{gq*@;J(@Nudrb#mcNB$u`2G8oIGx~86g(AdqyJE zDxQv~tjoFwo6%@&sPFCP?^+QTo=N0e?QK$+!(^p<^REi z2jqYwd`E*eo|xYLyytMo82P5t7__Ob>Xf;CVS&iqe<9|NCNgFn4MQ}o-W*O)TE!t* z_x>3QXXWDgFfC5>dQNY^dK;5hNQ!$g*AcyRKWp`~d59>jX2S|`?zO+`L&y%A)f~)X zo7IE3H{pWn?(ZEXFbj1`rP$xE#G~9N=Rtio!W|1?1g@VP zUzg2QXCLDMfgg+A$&A3=xv-9$`xe}*6`I72n)st==ugjPtBJc9$gu2A2E)N{ox9~k znO^Rh<6czDH!YC|;eL7?8%?q)+ov9$;Nfmw!hK1u8xF6g7g*>O5s9~MT4{lc-r2K@ ziScSYVYBeEXJ48xcr~BOuTIIikIlZCEQ5NU7;5!6XMOq_Y~;J4+;~ZRZrcyZu8XthhzPnj46lC`z8&Ho8m0?~wpn8L-ni_)Xzr0o zXc%l+TYC1uE5QD=LD#@9J#NrM4XQzX2a#(kHy2U z<~aL}3kDoE(f;o58BU6R+{1+?_Z2MVL$;AYb8=sa95)h%t&NB4rjw-O6O_R4uW__m znQe6+VojB+3;LlJG}8~b>gO|KlmixHq8&K6VZJ)Jk#=B~oT@{ZA?}_s90`zV>v7JC zMkU%I-nTWLMio0vzHfZ~>KUgW3hUea?m;H9MB96aS7zNe=Gal(<16f_@h);B-EyVP znuy$+E4DIJ_j>gfXf-(YhhJ6czQ-Mvkqso?ge6B^NaFB;c+7=Ngsb=*E};o7L~O|x zb|VMk(HF7}YN3G+Biu%ULT)&VJ8Ut+r(-Le^d+<|C#*fy{BCy}1%`F#k2VIRn za}iGQTDTHrX|d7VR=Zx^N7*Mb2*?JS#cdfw_=+C?h=nsrqr3GyU~1q2S{ftB55Ts8 z-#LeBYvW<=j#I(8LdfX4F=*{@Q}<5j(=39 zuGP(#FB;%*%-_xZrCsM_gS5KqdsrLy%Mqv~&SJTf8v(LQbpdrYYX6?}OH==kKo4MY8)??E|vzl8iK>Ts`-GT$+PPa=!9|%nt1s_t*E~ zYW!-1B6wU^Ku?b5(;SG0n$+FRqQ=-k-{hN-LutXEI6iVA*J#Q&W4oQn*#q#JvR-|Gk>UJxq$D7IYPK!_uj7J5P{ck zppCpS?f43sD(4(W+y^JmCdk(s&qeLm#!G8r!uj;7kk&Ac(MDynyIaWOV71K_o=q6?hhE}pJ>|(i*o8@7w_dy zY|}s(jxHxcpbz)#66J21spTnXCeMtUmH?=V(N$E>r= zw&NaWJb80Gw2hULF5elKZ$`+PCrnE+62@|UOqXp6oqWB?ck)9%2V*(2e9be{ed&DB zRfs1u#_j6$`bxj7^lF3qb*Oj!6ggU|hojPDcWB;(=oJuMcL11OKeB)Z2ByK4>7M_r zWoCMxz@#X5FLj3Ly)i03y$YtMb=CD%3DuM1q5ksZ5SCGM9Ezycdlbu7?q2VdRXu2N z>vmsUIOZ2KF#Wh$CDH!*<$R37Fe)|Yn)sBgDpokwJuv*mc&K|bss#rJ^nA0IudLioY!r9$)$_eW%5B(+@^`qMSmq^K zSHR?r9=<){K!3!R!QCiG#kYpiS^p^(JT;zhk}l7)vEBdlm@)G)!YaeBizl@(XkC8Y z98c3l3>0mhdkJ2C2Ol?84iI9-!1P^X5fZ&sABmiWKv;yEl<-2BuHk z3eDm{;2litcVFVv=o5S+$BO@v&wo%@R}3$&B8Jmzis6pRn$T0V`{DV>;ICEs7}@vF zFGpZsGhH{N-L$gAT?xwT<%S{ho%pZ(p_!$*mMbgZmpROvX#3vSp)*B`*rRy zvN_$3ZiTnMK?Bu1Nk%d| znPWt{o0{d@xykO^Xs4-&JyaQExr|R{6b;jjc9VD}iTcmg;q=4PtGSe4k2L9P| ziRk}+`i^+`W;Qayj;~^B5!)xD=0Df89gFE{$v-!eQDTYFIleGf!Ka$)5IQeWR(5^X zU3o5M4)!I)&O%{6A|wTQABTL~VwC&T?e2$wCF$-MDSKkt@mA!rFQ|e(U2&Jq*pdHg z0CfP}jlkFlcD?+H8C=ykT+$vMd=EtW$c5Y*;o3b_e~bQRP}fe=B@i=}pXM9Npy;9f z%@?9KmY|SVv7*=%_d&>DQ@qGGoU_STwHy(B)b>$xv z%$$)-XuKcz{e^+EMh|P?C(u9zL^#0xqbxt}U<;(L z*XkuH@J6b1s(~gl$wYna!+|p7y13fTi_!XHwgc!xRdUaooW91_<&psm%05n;i4-FebwR0*yLsQ? z!q_ojI*w{q?2vH&@f;+>S5_qZ5ks9Z=NRc0M)#E8kK5v@TeTm>4%&}LhW%)j?#XY+ zpUuJJ9Z{h(0AhL7@j;w-5Pb?Ew_8_WmBQ{npQBs&x%i;kc#eI@LRx=3pjvOULNGe` zOjF+ta|48J$ssYX=bQohVQeGe zM-~~b_}6j}nCuI4m_y`V))zQa@~m$5ZyaC9f#d1%@Lmvp-KTr2?kg9<0a@4x;(v>e zJVgBI*~8GmkCqedylRcay}O%B!ISwyNdXy?{gb$`mO%+-Uv%4An9{r4BM5EiKr^G* z_+M(_%YD2~{)R%_f(JViA)}`EXJ)f#f)f>g1?6T(|5J!n?0cti{oAVJQ^3vA-|{B_-p(dIN?&ns{_57Sd#6;~j)QdrH^$6PCfoV=9`+5#zufY{V0r%59oPmWg%w=Tx25-HfrXRT+7sN$qL6 z+Tu*fe*=%@IPvzmD$+7oNo?eJXvDLin{qvqxi_- zV4@#Her3*r{)8M8Ms({GMzpiZ?0k0_QSec2+eB@QT@ZJf@iJ`qNm=U<{0D1LRqn2dtox&=U*`ERWlUmQGEJ>Mw>0^>%NSs{ zX?~#DHh{Zi_j&#+%yaW@^E`k?nddBQ38qRoS>Z{h`j0Tx*Y{(pmo*orI?i2bQ`IMO z%S;b4RYrQCjuG9uE!ZTeMvgEoZt@1RI@o=H8fE%IHzEXOyClyyc3ZtW@J%aPCBM<* zDcsf5rzyB*l9A%iWyY-t$ZWPR#XiD`U7z9>4g3L${f$j3#U}q8wJYAgf~(EQmA@<( z#jltv+w&aunu3$_Xo*$E?FxeSrR64QKgB13w1{`fS^5aJIWr`{hfH{GwRGM#clDZ9 zgaiKa^jp&+20Q8Nh?uEQnUvAx7n3qnym1nL!-LLH2(NK9`dE_xuM`5;;a4yvtU7(r zxIco1^lxx5_jjLTPQ$Vv+)Yv+1|!Svn+ucG#K*C^Z$V^pD$<4kw7>Ggmj!u&{Q%@c zqkPBuVgv<&eV+t2+v1wJunFso>WJJ`9qgKs73K3~w7G{GTirL2ArCbUNV+^URXeiQ zeY26EQ`UWVD$3?##Lkcn$l9CO=OceEv66Lc8>w>;?9Arg##UcJXHtp_Nv8y7*KD>s z8n?SA5m5NBL%9>S9|BG?h|!&==-hXRdtfor!B97y0hS@p#g@P9hAl@{xX;Yk!U!zh zvgdC_$GbniPX-QQ7eog32mUzw_1BebmCv8Qof2$NnW8!zw9nt+iU%u^$F~#Qjz?W; zZiv1LbKDuvEWjYT_x#K|%iN>v8<#Er8I(A`&OK6D%Uh8c3SNvy-AkFgm?LZx@W&)Z zp$4V{BDp_FZ9J00Es4d4QQsOL$hOhqtS0h)J~KrCGmxPbABX-m?vsq1v*|z5?{I3r zlk1cHe0AhLPVkc%y-|q;R(^Rrm5BMlV&qoT{Izz|9ClI*tl`8 zt(#DNI;uz>A$ z4>fsR3s}^b)xwP(!bE7D6z(kKY=%fkb+KDWhz1X!+fj=rb^7ra57t;|@z_sCubx(! zx8g-WSl z)OQo&bK_WVo0~=s7|soVvk`2O|Ap+^3Gssw%=r!Fu*x0lwQ&4->0aCgo_z$FBNqmZ z$>&GyvK*2l(R)Vfc(oI+!r@GteGnqs1ZQi0C=E-4!;$wU09Sh`trUn!IbC2o0aZG< zL2t<*V7j#RS0QhQ?X3wi-Pn^bN(D+b;)9d{d?P%+*CWoq;XwUc&ma}jo}40jE6m5v zQmI{4r`=rJLEq5u#}FqF=MxYm-keZmkMjyxlDB)+-U!>42_m{^gwmva>gae3A8k|j&SCWJrT0=f*rMX@2rMCs4oeHRnr5E^KfDcTF&t`tZ3w?jS;`Cyt-CZ<6 zZh>f*ccsCa4vjC7d@(claUnkjpHMn0C|%$_u}}G+#C{p?92l+*e!ItSu9|(8=G?38 z?g{9`XhUA^v~hh<@2&}v#*`%6S8SY2?TRuEETh0JWV&4Yc6_A7=B6tJ!G0%EG(aRHW3cm5~ z#d^yY(<+Sex0oWT+RzaDTh1JF=@?;MXV1Be4N@qDlRVNm-7A83F7?sK7qS!Qx`Ag^ zDwX7kPb?LX8RSu12TWmc5$*ix+V@NVh}@PA`TJ^od~df+UraBBHjbC-pQ)j&cx}9* zOYMzx5mc#2Ml%4nU2F2M^w~WbGAj<=#^(}n3@wM5$>(8|KbHlJO&);ErPPhY&4o}Z zO5I$vLr3~^DP=B-yyjR{sZ^@30Y}e8=Q>+P^i*9LM)r)4ZyRT~r^BsKx#J7<)p!@M zK?z69{of(a0niGst*a>8p>A-ADBbb;Qur*+hw|9aBMyZreg%6MctL5u zfNmtra3i-co;$aWXSev!0*i@v%#drLDDeP?;Je0y_d-6qKix;kkH$x2Wk|3^LBWTy zf(L?v4_tvgm=1>1wx3Ypz3~y{kf>%42eo$k1qt>@Q1I^fNR%2_K*8K#>0@7SAFrTr zxBD3E+;q+f-;NifpPSD3gzyDC@()i7c#;ShpOXn_IFFQg^%mGSv>*`9OJ~`$w4%~h z!S}yq(?ZC;Pluq9ZRerp+gXu*=u7N&&i@=bcb!kya{wRscaWVSU2P;h8VZ9LeC?!M zPJ@T=kx!vPEIGfAb7zd=j3S>vjNf=<+%ti%&gzQ7RW5-%kQpq-qm+*_ZB_<`5n&6V zud=L(!smJQ|BG(NIW^|o43xDC&H;?K{AtMdgWJ8%kEEMxKLw>;Stn8 zbp~)Wn#3`jckKNr`8d8IJ&$uKo1VzX4=<2LejtOAXos_J(&R~AZG1NVOp!Dy5!k$n zI7IgUqoi|;oImE%8FJ8IAIl+X6nih%Ugj6}dszmHENdb; zK@jC%My_&NO!=Hx8KO#h8~1Z6lW7Pi9N=a3rVaM5&OI*!nx?jjFvgltCp9X2DUJFz zPTCY}QS(*4$7kZG@A*;&0o%wxWnRx@l==%`R|D8M+k)L4J##bs!j*hY;s63V*!cMv zY4&`DX(e5IF&2!&STKsQAym@N5+sSi+}FCl!R&C{Ke?88Ffp0{1RlJD5hO3ANXRl8 z5(WB+eA~itx%P1e@=V=u#5aCtf<#(a#XZPdwPCmqs0!gBB4IDhQVKr|&}oZ@@=Oo%*+a`BHgj2jmcsfmUHZ_cJFl|wY8`8Jyc zVJUyh(3uQ$0v3uuL-!7b*93hf?+>O+m_V)_8XL74H5_o_+hzidC{0f03-LPNmp2QI znGSG{Yw&>!`TLblrE+BsxH~A2kQg~77jt^EpW__DqMVOh2MzzKot;{zcj1tU!bi4^Aq-rhJC#nxPTRCKmaiWqKdc#~f)!QLrn zmhwIFKPKEMxxhx7tfAbtacL5wc($Y(h=G%dxDf6c5b}thYmINp@qJXNHIxF=$VP^b z{zCL5Z1~P3V4RiCDJhI5-Th^g^EVZ8A=R=P;1)F5B#dy?P^4h9PYNWA z`ik?qI=D(0WrxV?Lgp0LtRKU!A|rKFFc>YA4v4A2*9^ull6&0b*!XnD(}`C_!6457 zSgmLnJIg7Mi?HRD#;DqKRv4fjt|3pDKOkx-`2(mp0XiUR>UikUV^)!I>^W-8Dy#sY zKR|J!Zj}evhXHa{;?q+Iguw6*t$Z3UHlbQFdo0i-DugcB6dNv&BDt*2osB2OEg z%!Sla{lt*^vaoHq95F0xw{r|obRe2ogj=1@o6LnN7ugq=BbeHqWP;6xunA~vx!sqe zptHL&5zVsED^jKnod-6{dkC?mCd50Hf%!AFkEzcw@;-dnsv!;R;x(5ymY!oEw3UyP zBOr}g%RgR?G-Ybld2iO)OT9A&F~tlvl<=Bs?=ZnUQqnSnSR+ajbizhbtPaBIbCM=X_7u~` zR~AS^{Me5|Z6wos=(98D?o8*8OO7436o2_W!ct2Ook(t^Aee2s7kLzQzHN{XNv zhCLENu-I<(o7673of4+t_`^C5V;2_L78(U^ z8ao0!p($XJR5^Gkz~bE=l@(X1#*t7|s-qV>S7Ng-x3DAqo$Fi@TgYU|ocT-Pm@wK>-S`HeCI*kRCRze4&u9coUReH{^^xUP=a}S>V zJyhhWPUUCOLlIUiw@CS$#zY$1(@2(}%vH!PO0+Hg9VZ6x#B4P?gE*m)&^nTrNa-=s z9dqB2g+k6 zEF#l(8hRwWqS0+_L&qM%y)2Co9I4|<`GSrgXEO%tL;eypIk;Uy&c37@aU(%rL8|>3 zanuD+LQZ$oEQY2rQGZo*dY0Bp(AQyG&ynz9uUd!T6z1QLKt}`@a1=&(Ko9sa$AE5< z^hsn>$}d;B6=9&tZDLE~5VevMg-yBk(J1i{d$2Z)5MmO7E`6buP#~El0-oz-yoD2Lousc z4qLPNqk!k`+Ss~m@;)}t<6g}dT+NW(GpYbZAHG=$BnyYmV2x&h|5a>o*=$7^ zmfjtSYNk#ue>tSVgP*EXhSW2X5%9>SQ7WE+=mMUHl(l3JBGf)lM!udDAcyh{o^KqP zYtPi-`w)+1YGrMmawQGzX{-3GrfnvddP}0N2u)Z!65Itj);X9~aeY$cq?{j$nYa&q!^Mat4%!AznM=!5x8|KE5Y?vSGIFa)Dks#YIbr^Wf#4Qe_iqlYv5uAvp(;%=s zjAv{+`+W+PPKGeCM9|}F(2B3}mI>2x?8ju!B@Dw#;JQW)mUYS^4h5Jf}WuJ20h{CVQo2T>-m}zlk*!#N^qH${a_`|1|*#23U(*A1(Y^_*@L^J>-=ioliQ1zD=Ds*W zab>13qM#gMUCzSz*=TCopTVMkM4h0%gHwV(KL>_gb<6)~dMMy4Pfyc2YI-)Gp)(ZL#L`sFUhey!e^m-0ye;c8whPm}{Aqf<^I9=*I(i&K`BS*rBT<;{T5JX=OZsMJE zo)>D5tbC=zP;f|2emZtYlR`XczFaW&<5+wJ?HQCQhu>U-()GxjlLn)93!aTIY;=I! zB9zt*;t7M6w6crd8ryyRj8h1^@y0yd%$2-ZnAwdI{z{wD8hMSiD6}`8g0#X3-^BFM zz-kwbWS0b%V%FP_c7!z|OW9MG?8DZJw;1OeNf1zeB>Un#2vQoNy>^MTJX}yDy{WT- zuRcMKc<*friKH*YT$jnm@`J&ffd0J%IihPFh$>a7%=HTXbdtM9VgvbbHG`>#i;FZY zN%V%0rpp%Uab1AhDx#8MYsD`(q&HGVW~tdDB6bJ^O~B4OMhH8Q zwlCAjp(U8aI(>AcEO9lJu9$Pzz8;<(gld3NHZ zrTv2eloZ9#gNHA51ooXQ6ldvDfU$`H0JLi1r4BxyXVH;aCcMqYBDZx%io>c-GX-`h zA49?RWJOsI=cakvr83}slSPO|WH1Qo95|EkNe_O%!To+93v1b&OVPNqu@B-dtFwIq zv_O9m66YW*#@Ru{Q1Pn{6Cy~|OwI#fW4Syc{ASvF zp+WpGjP3vP-;|_2*#9CZg#kf{?f;uj;ygInOX}*?@8)uzwb|#j#zm{pJ|wIfs&#im zcIsyr171AF9>B*^!U?&k;}}lpO4ond175AkUbU`Xy>4tKq9hCLHUHzs^zqyJ7?FM{ zAM2#$u1+zIO5sEnq&Z^j)6}kmECaJ5XxEn)-ep`?MT~agbKoZDYOtV{*320!HeFmML*r_x#F@eI;@hRV7fU@VzTLAH8=(*i zxXZP>E_Mz!-wJYpORbiRUa}F0WjcssbRL?4u-&X>K}!FHWeJ%x4nRe#Q%7qR&jjpM zt}Cm>b47e@m@_reE7<#45qtU~*-}l{0G-Uh{EK=zlg$D ziC~E%5T4r^l8*Frzw7BE*VFw+^|b4M*!_?AE$whE)%7y|h{_G+h znBGT(*&j8%hyKp=KD|&jXj`Jto=Bz}@U~+Hyxt%1Hh;j&k2m10{(x6j9`I&2;HUio zZ}JCR77Q3*onM4xs;D6codrIcIPfm$AFquib6RkL- z$DGUJTgAa5ej&q`;MqXzy(xs?m%oU;&u&u4lk5~Whxj|O_XB@%!sqo(B*+|J_AI6n z>BRJb>oqv-OO>d!2&QZ`x%TB>;2n2ze^v!suN^z9c>C(W;G2OS~+K2`{ zyl@XM`7|+Wd!G;4h)-Zi&6LtL>SYo}iUW6Zz}i%XzXE&hf>K;WmJo#45T^i_qa~j@ zjx4Te3jEh8P7z3d0O8l+)4xJWfjMKrW%g6C-F>BeOv!d2iBG=-*$$w5WIJ%t>&Iq0 zI8lV3pS1wq_dMh)%|4G8F<}DmoCJ7RX4H0EfSVnfv1~_Q)(>X_5J{lZFg5|Le@UDq zo9(t~xTC|XF@(hqw`hIwxmM10+=Iy3Ud#@8=I^5Le~`0XN?Ut|RO$A}2v|$Ht*t9d z+&LAH=1{nj1rznFUSL}Q;mH&f@q{doDN+S7R8 z_YB`d_RRvN8$a23ufd3V`Cd3JWAU&rgxI|=v$hWA@vXTN3#dCscal6fA@gD4D}1Pp z5!7t^1>61MyTjH-63_#(#{gNQ${@SZ2N@f`9S}q~@i}w)7ymx2pxw(zOe_uC{p=h0 z33RW3e;_+<91dnNht;?r#Foal8}Rk|;gByV{Oj2W(#eLinRHsoARS>HWwx4CWly}6 z4FV2zdfHY9r?MOmrGg_(Oa2Zz+Us#n4@Jh6me3q#{YD&cv?p+wsIF(wR;l^7Wa}!9 z6q_uUCCC1cPUwF^o@OAlM95)*BzVw2|_G(j!sifdhapXdr2q@ec z6tdmVsxtF9BR9W05xzbgEMXgbN#zLm7IHDdwH zat^MXS_On7aG8G)mVoPXjU=hOa8aq|@U&WG`^h+OcV%-i7+8o{*#c|)aAhX3`NXxS zjPlYWFTj@|ikt*;?StXD_CR(af1P*BL)5|H*4`T)6|-IJzcQ;)#61j$QQ1EzVu;GU zWzJoVm&MEQVZt?G6tobNoS^mZ?ftYNnD1l?_AWoHK>28IJO? zw-V$s`8 zC$mYrs;!_qa^(GMPjeaAzrF8Mtt-PgL-(|#;<5)bJv2-d$Zq6*E*(>OJvuQE5ZFPF&lsMVNvSpZ~Txroet+WD}0>wpchw5 zv9^1Mi3G8kd@NZ!JW}qjbqRe`U2DWjtu_O`wVBjIMJ|>?i35%v5sly8 zjJ>>Pm~##IO}ChMiFimroah@oy|Wo4-(BH%-J8VRG>|}3Nq<<$6n#)Mz#!l?H|q12ZJqd zFcg$|%QezhhCv*7EaXYd-d50U+FZ)6Cw5nk8G!y@C-BL(o6J|SPH65)nyWq?>2p{K zfLPLO0Z-2MQpOK5A#*-JZ-cY$)$p#-Oxf_IOS%g9$XR3rRAU&VV=c99Ka69T7@)n} zOgURt4RbjIo+sy#6nBZ*`fL5x*Hgcqt@t0&B~ZrsscelehLW%NA1sNsH69drc33VH ztQl)$moaE-09Xh$fa0KPhECB}x^1GRH0;tcORuDH)@>U_Axr0=lI1Qm_0ub8(O>|J znJANZs~K&V4ufq2`1kNJNxF?sMUZwvA*#6D!tV%EpXk6%csvR(22E=-ywI)GwxT0k z-z_TW9kjfMmbFNgzrr_USPA5z8CLFCrw?(6hOMHbyA|7VE&Rgp)ZunDE@y$>z0dFeul$w?=#Jh1fp^NC_(KQz}ZD*4`kT(39lrcK+H z{l^`DsFDl3jyNagdS|#u-!wlPS2-WD5gw*V>@Nb}rEAYy<_2=uR z99u()(5hb4*72QDK))Ei&W5ncWsJFnZ2$Q%j1HQMnNa5&YE=Od7j=;&5TQv?m7RY>hspbOm`i*Ap9BY=hOFK)gO5TI0Z5JD~< zRVvWBGsO#lHY9OIcg)tJb+$irGSF_3B8I*pI6J78%B_X0;=|`V3)I`qu}kQVtRj09 zV1t0ufls9+myYKIOI~vHlEYRiFF6Z(WXa_cdt{}Nz0QDgO9Jty7cBAWBlC+b@cY0e zwAT5f%UJ|xMbquUgF*ElSwm&4X%DO6e8#gp=uBFuDejI3d*gh?hInAfJ`hp93KzP1 zq3|~DYLDE4aKqX{^rz+M6h^oNS9byFMLFE?BoHoxR91qa;|Mzlad0p!28K>?Q=GHU zap_gAJMIZ1-8%s_!fp|-wcIO+{U;gx_yr(o}H=~38#|NdIw|0 z4NU8ue`LLp{zg`;H`M3a9At~1hvJvPxNgZIxs)7l+JR^u3A2;tRUVX=EQtU#sWcWk z(lwE|S|pw454}n)0Qz=w1cpl8Iy5Vx6E2SMDGTGSOj$6yo=+O}=KJ`o@S7u41=*m2 zsucJ;$BAxVgW+A-M#2K^qm2Po5w68ZirY#@;~KOa*9pFb%sdDYlESQRc;IBO`qJ1M zzUi;w61Rq0y%8+k6R@eF#I-HSDdC}(PMev`ld8xeAW6n_D9{e}Aqc?{iyopmX9Jzk&X@w-$8=zN*=l z$9(+E()&xK*?q3o)#g(pX&^Xot^?b>t(^f|!4*(|&E$m*$jM}+K9CN`E@~~AUNjxu zn!R+Di@t=au(-W-eFZdlPjj~6?d&$%_`bQ{h9g77C2Qmh!ibIyxIBS7pVF>!t;t`x zQ4h_`W^q3Rh<9CUPUDS?tb0B)$EA0Wmok?@E1#JzOG7Y{EIA4ka;(Rl^M3OuGULcZ zngv053JEy15~y_jp869UD`16XUG+`?D;DK=u(D6EFH`}Iv2ySGV~Ifws6QD8XCrzd zyDp40*B%)XwRdxigTK;j#kZ^hvE43PWPB?S=aC_>R*1!pTz9yI|H;BcTn?)WV^x%s z6txcxL5YXNm5q%`$_u{4ZK3K_fhW`~_*Vr6YNzdp2gB(NhW|mXD7DnKN^Mqbi-x$6 zvt7APA6#Jf4FO*G5vy5NHKVSi^2U3^+0_%GwZ7}}7|94nRY*Xe&% z2VS;OQHsRM2oFSWgw zHrkE!w|;JlZQjZIRx(c{5Gl{8+ZM2w*a#1Td>OQh z9v8~}QZxVRo8{-iRNckg6n@$ooVgdWg$Cg3)>8J^r|~+$J2CCVX+chKg?!cf(r2*B z3Ah#rhTzpBocNEps?z=2*{qv?tNAT%Si$Y-v%n^Id%9)F|Jm6JKL(k=Z_;haS6smp zap4QRQ?q~)oJjs3!vVtzVybmUs0q4aSv?IZS%C4pR0QwAwNu>+?0Nw{z`cOPiu!pX zp^8%|c<1l1iJ-SVuD9E(^wu&9#H!TWO`OG&bZ#>FkugaQFh{b2MU@o{r=rm?8AsP~ zw+aG7xW@8qw?@ZLG2@20r42hTWb?Tj=bv@*zf3*mx|!{FLnJ5~*Tl#eZR*u)Fd{*{ zHou7VUMp6Q_#Dbtu9@o83maYpf~ceX*#2#6rn-BcSYXwU;27;?z6<7Z>92mWH(m^J zkMx?Ug?f_H0sfsriF%Mwxe-y|;|ME;s)Ax?8E4{~gP7Y*E#=#d{FLUu=`ePx7wO^U` zdoNzR=GbkDj10atvxi6t?aUi;XxIU%VUt77Uv0z0kM|uy$k{T_Q$t$x?S)z=(yzdk zmHrCvfL`0E*Sm~-eI#(} zD>M{tZDzsgrpR7mC{3&^7dR>TH+jfuUJ7iuADUno85`p{bf;okso~bEu$T>T8et02 z^UyW&&GWf*)q&~NFRkuS z`AAjuP~6~A3q=dxO?@YG$e~s;$4Z(&iS}}C0h%PZJcN9kTb4Wi3f*srlEjcz*}KIi z1#%`(9nM8H95KCWa|85S{vXa2Wg8Y1qBp8d25PbwwfEC}kjoi;08|eUV6=6P4jh6e z;g6V1r!Qmgv&azIou9A!_i8O22q9)>CN^bBM97eI?(=FX%u3rA z*A-pN3u8DVTrL^%MTav^n|t%xsqO&0pB8i&)OKh?3$msuZ6@)wzE9h(KixL}| z=38sXTEfq_@iQpKp;kh+3Y?fMBBt$8^9>>6IR_*2roQ{!9I;Juj5q1@=F zDjJ?wa;tgh@rbmJ{R>&sk)5x5W0k?-ok|>Lt4pW3eU0u%XC$Hwl%WVlWvsi#vW1*{ zDyEx_4@wQMVFYsuZwbot-_HGjWg-JDmZbTu8fb=q#Hqx+$}Uk+KpW^jn?TL7NtH!F zYQ?{0wgt{lFsiL&RTxL9*F*<|NPirpBnZ%?h7eik;N6t@%Absa0j_|l;6(z+_{#sc zDZ>^A^@rhngUbYKMGqSu5bWi@aa28;r{CxE^smIzZ}WNjCjn1i;CQ-wtKjLUD#v>i zQ@q{d^YqW)=|>9Z`#k-NfT!nx9L)e|903U2lQoXu*~I^b{VFH%A}DGr`>++6a5yq> zMFO{l6KB8ZKiE?gyN$O^5mHHsWbMPNFT94$gMcfK`LlUs4Zt-52ZVwA5VB1$aE_p5 z9H}MgR11&u(twumJ(F-Uaog(Q_hHU3DWv50Dr2c^);mG zNINl`o?bnYE0BU~H|;@i@6MAmD%^ndKZJKnI?lsfC4c?aUPGl}lXm?xr@MS|2>aE) zzZgx%{bcEFOOT3#)Z@C$(cV8t(QGy!lcv-X^}>%bp;R4`O5^rHy541x@E6C@#HA_q z?QK#-LP2uy7jEhx`{>zhUEAKKz-xzgwAkxb>~-R>t9V~LM5*G*&~&v1We-!A>!aIn z$Rp2(-T>tNWX$Bci*RHpQpYM6299$M*6R|lqf@eed%1)z89*5Y7IJs~e$^!?E#fP? zfp1P_$~ih?_a7Cu2hJ8&+edA50!U;%juR$2k1)}_E==@&=SYsi%C0-x`A;8gQ;hk0 z*4c7KwqKc;oTroxE{&`rjD!7+kc+$rQT&a%8suD1slbXkmeBFEw&=D81H0Ogs{^nP zNaekVP10(8Iyjf-BL0@E`0=((M~Isq22tJ`EOM$-G`{hJ`Gv-wZd=Y_A&PU_J5nY} zjePXKUO!HvgE!KuFp@Y;{Chp}PMciGNvWu&q=~a9*hF5kA|6z+s}z?y2sY-Njb=J& zl9$X4=EpoYzJejSmLHFO+&FxN8fD-NRkI)G8Lqt#dQB4}PbktpZ!7y~u*(ejQ(Jjt zU&m~*8f@VFAD*P&+;!V8v}NBsr+Ky{;bvR*nG(#q+tHLbK{yT2^6iPi`;dC<1!|;O zhJ0Gt-SWUv7`dxaN)6EaZM6?UZ36}F$x0zh6Kj_Mu7<+|xjqaW5CA@;R%@KdP1$W$ zgF3o$h3mWeK$X*-a!Zp?wteJY_32D z?a+csTKt607qlZ0z$b%XVN7U6yK?XwnPrUB<~)JcWvZsNSP1p1VYAucilBoMxJ~Yy zTObXOVd{(6{!F&R$J7U=_mSWv^-JhC%lY0Qr%7APUDKen?HGjrl<~$Bte$PuPN%m5 zdy`Mmf<4g=?fV=2R1=!qX8J`t*((q0eCY5FIoL-bmZ4*TjQcv?zc59I} z)_tU&0{wB;P*f$3ImdO@U_^&grP4r4&sr<789Q|mg9D3px7&!2&%8KAe#yKfVTbIF zLGG@ChZ_)bN*bEx>>Yrzj=*uD*F3NYg1t{*FuVd1?PPh7l}~iy$UhlP3$Dr_U1&C= z$q;Lu!zzINzqAwKD7M)QC6i4@+i5+p>J{5`ABu1bEQJq_hN28CumkPk;_#bp3{8rR>jrYf zf;9ZXXSz&l)tsuKh>wqM$^aez}3?T1SheG}q@YliqmvN$L%*K%c zE>)30!rhp{4a9V(2b@91v|6ocL6H>P=18bhMih(e04FTW=^&7z3m$+0*yePQF@zU+ zuFmPeIa6^BBiR9ncNpmhxHVnc0T!fSp=|umik>TMEQSfso zFYLRgJ7Dl7rqMR>&KdUE4&*OnYY*_Zb_X_%LI(TLRL^3s4^&t0PR?k@HQ1}aoel6xhz!bp-&Uvd278XO(xr7KXg6sSM!Gw(-mVWMj zL5|WLuNhY`O6|*mAPWQ=u~Ec{lg)kpfImap58babGj#g40dxi<_>MvpnO4Gr~~Egu;AZ(Aaoj z{9Cw-)2hoNqq7u|!oJSOkT99t2L+-f4|FWz$(b=8>k-xhZyKNLy~$t^OMB^sNzW*aXX^RG<-^zRo))n&_xpH|<77+TY=7L;Z1fn9E; z9ajMr3_J7{hEG$Ex0P7nByNv;s>P6ywVm^DS;vyFy+k!u_i+iQZz9e#j?ImUYgU3KEFjI3oovU18GI!xxG085=e*=s^-TA^(g;SmOm zQTrp-uAcI)6?^&Ib+yqOqLYSAX15cV4Bn9yUS2ZOy(C;C#vm#>`b*q@lC;+Ob~jMr z(7u(KMhw!6bE!8#!EMBlk?=`2SBWd^zgszNCUfMIu*j}tksXAjM-*ir0qKI%6tJ7| z-niy8kW|=@YaQ9Su3@yW>uIL}CZKeaM51QV3S{c=Ah98HEGYrOl2eq3Zw|z-hpw(Tc=>WF7KlcLo%`;yb zcGn?RfUTa@MN&A}-^m2aI{}0=tf3O;k0@w2RVZi?I(!8!{@Q_pR_RJ$4G!%RMJ1%0 zMS9vQd+myT&LDImrEPvpX`34^MQK}hL}^=2LouCgd7!h!UGONCt&Q_LU?a`fz+oIS zShy5UHjQV1V^Q1Hk7I@1*GWDXx&j#DoogTUbN5RvMpsc+7x5*IgJfT=^9QmjSTBQ& zE=W)caQSq~JBKBBub+*c4u+K+YvWk6Ec`^!M!`0HP}H3Moy zF|&Q6uTQjY=!_J-zppMrwVQQ|Fu#3Iqe;AhY(oAqUags7+e4j`fl_DbW}H_KiS+P~ z?ptbicaHLxTg71wYeO^L0&Wv!ornRSUxrpr| zrd2)GIsp5i?><_6ptF3Tr+d|Dbs-~*iZJN}g7yEu*uVu$0O|*oqx&W#DhMy+#6jzI z(D=||?e6FTZ~y|^9JHNk>$AS{0&HS;GM+j;5md;hdsKx_U4>*@&{81_m1>&? z7NIR;bF6NUSoD)LHC~2pA@|)AWD_SfT%!V8!4RnST4w~zC4Jp)-PW0vSQaa9?3aTQ zTLk*tO{f#1-WdhnpK`rHkOBEOx29pOj)Hx4jvpZphmh4mL`;{zRQ=KDBAbAmvhR#> zhEd3wSL&U?WE&%aqAq|f>P!SNxDxjc1(^!($b5jb0kS}x4ge;VDGNk{tKED-^BD}Z zxgF}P(-oL24Ot$uQ|gf{`v#cnk~eOHg;33<0q+h6+4+4Vxq!BzeId}&yE1>M@fI95 zTC=x*>f>aM*{8GqJ-iGsU&_kaNHon@O>9^B_GKT*Pj(L$hj8RV@AN)i=IM}Z;F)jb zeH`8_I32wCglGONJRQkjSA5j+I_3F)Xh|4wVpmb-_7*%K9Le;>d}**cl?^Z zF6VuQO_QmF{kfijfQ4)5UNix}>>P#gN}o;zX#+dBdTXhd!*TI+B|70I9p}up0tgG6 zu(Nh|5ZlU@Y~<%!&){<%c5NNvVk29^3Y+P4$b|t%4f#o02G8E&S{`T24^NI=3NP+9 z1Ii0TIQPqCowT8*yH2gTj+xaVBZ-?>T9ym)^WEuAm&sbnaIbTS=p-m~6CehKemEVf zz+Swuk2^~3r@F0WJcIpKru(fNK2a;z_^nLq;jiM0YyReZq<$q^L7F|~B%yqJm1@X0k99#6^mgxkl9!iuQAl8# z=z;$`9Qj9FDWJ_>ZQ!LdXItpAV&6Gh+(Hj2k~Ab8G%T>K3=u(QZkK&WW>k9I8AYYe z9!w4fWF5YZl=1C8Xr(>Px7j^W(Y-|8MkRAY=opCc0=MNeoNwA%u6(IyzeN=pP7P&k z8i@=%vo428J1|P;CoSX{aFK(nTUG@Noov%n$|sfY#)H(_3mX% zRQU0Zm%0^ID9_EYNi@ZJ*D}0{s3C;5Gu+;J#t(LK!9rOKpI{+>017)nyA%unydo+Q z-t-KSalShqpnpCaGWqYu4k==AqeP{3T@Ws7YxD23XL}cNrJX(81&Pj@plw>k48ih^ zpwcO$oo_-fEd0k#o4~CiK&v?B*tG4*Gw_E1Cx8yBGy$Ob+)8tYXYBtQvsmGG@k$qH z5kj|aVj#56ofqE&#p)tW18q<;O=6s`&@8h@{BPb9&OOwdV6`stCQb_v4BG>}ad)r} zx+vhVU6fZx54N)0$?wp?-Y8<0R=mWmcul*-t@sxwT5$((w-12w0x*K87X|K=pbU4; zu$vUn_M8GZUvyDP>Gpdq5`ut3a2l;)7D%MOpikry@#Et!@)0b{i*&B2=2lm_v;W=l zBA&k1B~myF0S7p+FTU=gAX91mWctlQr*TVf)?hEd7xBlQn?-;z@zo9_~?Ti{-j4*4nQvF{A|7mea$u1EWa=_0f@}gl}To zv(2H9&u7cywgRv+3?CP;HSI>S`eoS{e+*b!e4)!e`+b!1E*%|UC4<0m!>d~YUo9I8 z+1pu*p7Dd%+)5#Uy$bfE+xN$5@`SFlK-mo#Vn~xH+UE8NR_eg^VrraR#D|oKg>#g{$FG35UyvC5iq?c)}yl=j34TX0ta`aR*CUVIq1G~mP^66 zq^s7c$X;VC&20(8W$=0dT+6y@4~h;^wvApu`{lHv!6ZV_74NNceLAxLW+1_OUqj~O zTJ{{LQaF>nz&Eh8=K+_}iRD7ada^a1qiaayW}0daZaj6C)Zd#KNIH3aw2aCsRvj;| zr8J7f^coe@`5xur5=NE{!oCoS|BLS1MxZRQ7o_%LyyY}e0|7ZPYWJK4G%G$u9?Ey0 zQt8KrK9@U+BZ~k4K!CaPk}@8!DqQ0H^d4hvB!s21^04wo_BDc94ZHQPh{!#>#QP{d zOSUw(h&8OVq1e>p44a1a`7j?8aKZ-4r z!ENs)BkiO4y0UyB6VA1_X(GcO%V+Cxp6DNrZ&m}xAgl>U(_wq7pEQxBq-AS^6i>Wz z{~}rQ(cSVap;sm{IZU*sDuZxU`?L0(2ivgR`Sun)x*14=SPXqO`#!V)+44+315Gz1 zl2luOV=J8(+nY=hD{_88I6k{ZxHQ+^=*8hu6bRDbJj3ds)nj}Z6klfOb!=6>E=#LP z6l;+yVadvvZpuQYDEuGf4l3}X;*kX)@o=4rY)d{WmX*C+AggZuc3hS1&-kj_y!w)( zzKn8cSN01@G>8aJoXWKglw^@}0a{bUi`)9oX0trVHn^;!;b1X(gKGr7ff+O7!P8C9 zB(DJ?gfBj&hDV4Xm3S>BU+@%=ZFE3lu#Q_jjZ6jObpv4R>JMANAN9Unf)%vEZ-P0# zmMWecKU0833b|G5 z$uks_c$7ReAdrXNhW5_*J9QTOE$z%NWf%6su28`^1oAIBv5)TUCD8_wSI&4+QA*vz zdY=MrgOQwz?CxH8jqw)cNq)IJ(F<-{)xnMV{K!bZ%rApv_9FF7etf4mo@A@B9W=;w zt?Jp?mA<1zDUtD~)isIL5xj2hrQ@#c*Y`K@{r-FeFP@Yq-G0rN3j*XOb%D)f*HQ71 zD$bzdAx076$v?kz^SugD^PQ=yx!kSsm87y7cAsv(eUOPkjf6U^V}L%zl@~Bt6@4TJ zBT*C}Z& zjHni4IzmUfn0|r%=9kRq=8T1Q2!FG5o6)V5Cx@Fe{U1E8n){WNY|C1ALoJdF6-7Uk z6uudOhVo!dDrCG9!nTIZuM1&&@Lz;&CAd`VT7=wf+C9s91#9|m;euP;;A^N>C3qt! zysvg2{HN_Ys2+7JK)%$>ATRowjl4V`1+q@&Kx{L60!F@q%_r^qR$d`MYcMMjYnAwU zz}ls(Lid7zz^?M`<424JIrFeg{u{tOy(`^RLon5 z8BV@{4TtQ_zhN4wlNjmcRYxD!4PSM*n9DN2-6xIZ2T%@jG{@u!O4R7%)f(W{-r}9w z+p}Ky6M#l2B+9xW>628{MoRL7D=%=|qG5PDUcL3~_REf9B5AhQF_9aizL)|MaV10r z4#~sx*mDA6cba`sSLcKqqi%;m`^K;_CAq}4X&u$v(xR?X!$X_O{c-*9w`_|C;O-_jkvEpyCLeF-rbSH?T2H}Cx6tKKdVl5 zr3+_)SH5+oJdkZoH@e8e)vufKh!4UoS@uG^4*~Z89w(DM>n_dKCaKmlA>uY59F>`7 zsF&59^<}BU)^VTL5>dD&v-`eJKCSAM;tV|3bk`YH$2)nJ>V#kD4RrbrcieaCx0}1m z81lV4KitguA;fcuFK_U%-ElhNm~v+p**AO*AHA)+@0k=14`dIZVNV2q`_K#OTy&Rb z6ae+^kpGWplHI(hJKOw2HP80x&Ze<<`pCNsC4u;Yl}h8e;|ynedaOG#5Yg4je3MN+ z8SRRsxQnP9F4|+^ZC*zA}0?l(Y47K)ZGO_TrV?8QQR5x*e#N6@a=mX zZLyR_x~vpz!R)8X1H6tSyu|)&VETq^uIgUMMHBBZOyx4>%u>*i4U|Ch4n< zxVh}Ova4WVw%Y*^+xtfVCrBtYWSPwoEPnxJ%3@oo@+>MNS%1YsD0yaz+z8rgB=h`{ z&hLTs*e>N#ZvR)Il-vODZVOp4(}gh1>ah=Krh-y@_Y1~gnTxg+kQJ)Ix_dp+215A{T;4-e>phz=;&K|_@vIK$FF&$;|q z-@fg^;Q?GmU&73o#E%RFl(Fj>gU6fXC`|jn4OiW3se?H9YY!Nv9B-r2({s2-u>Eg%J`@e_Lr~N^b$9iU=-15NrDNFzQ^FAj zw1EL-=ybQ1>cE#&xy-vI-BtrC;!Aj~vrhLA;SeDe4oAE8jCrFyqoKk**Xz3^kffH9 z&*2g`+{?6ExZljPZx}#?fFC}e1N9W+0qnI4Nap9~$4-D4Dob#c?9?soH9+TC8Uo4E z=V%JFcuU=c!I8MNJe!%OTfm*c)9vZH@lEkCp=HGz zWhwiD5{ufseYtzfKE=%KO(V54@Q@s7U$UTdha;Vqnhn0^d4;z0yp8F7^LNgD9qrb* zLT?01crn2=xE(jLS$(DBlR2V2Q^w>Xt4f}3P53ik?b26$$xT@3T`AMgBz@*W|8JvH zr##;$tYD#U(z+&@|Ef1INpD(}_BW`;jjB-%Jr$#ZPclthYJcqG=ao4X6(7AzX>hXa zDE)xh+Nos>N1n8-KKa)N;b`l;YTdD7db<)P!YwYxy3yjuT*-}=jWDMjwCw;ceE{$6 z=W*(37v>!J+*I8gZ~GHe?({G>F@%I^8tm^`73LCo4UsADrO zz4Dy!v}qQy5uy7>yYwQZ9plnF9S_>$c>f-$IuacPLuC**BiE5eC-D{U4916cC{J5w zp%-2b_DI#$gf2t&=~_aFK+^?sVB)h+H1-C1#e?3j7&pkP^B9~NW=beTp@*vk6<>^F z)`|8mDLvhRN(XYb-FmJa1)cU2phEi={u{??qF!`TJ@jHoJ{Kf?Ew)C$crn$Uor<&c zx)9s;Sr&{+hZPy525F?IK=qp11gR5>HbVGPFw+q^YTP!>FD-1cei`eUYhhRFWlZpL zH7(dEy`T`L7l|;}tRwP(^zC+FT^b}jWf9Oo40#s(^4kSz(k%ti;{)}@G#*?R5}(6q|3{)tBXe9c;+(9? zE6+kQp{UPL2U{};hR!@2OTCgmC6)2h-LyusqBN!Il8?wnwb~fjVI7f91bafGYTH$q z6jiICjTYyGqk)Qe4ZBt(Aaw(4bL~Za%eHuPT}Tmu`S$p;Q=@v5QZWASHJHx=uLfC6CaZ_p*e`g07pzv7PhX)r`hc0q{bN{$qxtCtajq zB-rsRwnFHWQaC96XLVh; zECd|!yO;0;v`Pa5aeo#}y8the8DA@u$WRe#XN5yW8uAgjl?66X>^J=&pP%WPzTWf% zrZ@C|lFPqNG;JJnLo)e=l$BjpQ)3^cK3QQHXJIr zupogsnf=*wc3ljjrE>TuGYdm|NWl*x7J3{3>bOeapVP zkH*>GvTu`Dh+!<%RGNqFwe^fb$-X$G>!wzcT$Jl5>xHL6RLB>sx!HrOk+IF*7hW}_ zmdYOR%RW#Ud-D;LSV_#8nS6-WO2;akJrP#G$*_IQ-1~br2$@!&A;f$xj8lj`X>++{ zq#jOdP5B)Dj`wj&_^(hQiMY1_E=Qa{T^}lUt%lS@E=y}ascUo9u3HVwCe1MPqQrPX z2MQItcLNog8o8))AlE34h=+1D0nsmR$IRC1Qu8-HUKs0?Nnw2te z0-1K+2B5<6)b^H5MS*aOD#ZH#I_T~;pn$9}lHT^Hh{@kcZ<@Er6S@pYdlqsB83e4n zY-*X^qh>f6uu87q`Mm4V@t{Q;oTMx+^kErL2MC9oAUgvux#%;$pJ|<)b1mPBo!cS3 zv#B0t%udBe4kUdEsywLtMae7<3}tgq&IGJx6Zg^6J=g@k3a*;87}LGhihGt!ZRxypUZCG204vkikBSUJkv{w@2osqkY?Pz2=pkMT43vesSncC0Z3oofLv7xqV|lY z$T4V(mcOYjgFhY7CkDWR&P{8&-Hp2^X7~%}gE?*0IBZ3*e493eim-RYfcc68X4)_> zh2dS{Wlf=vs_>bA1U{elAlV>!RtEzjvL+u5qE89wvWL_U82G;H^+5+M$KG{mo-+)6 z*8^?FB25Q)?V{S*A65bqd!THp4wwA+JwL|arL$!o5k6rd-VFhi4lsI&BI1?~@$9+) zOb2~1O+NyrdZ;Y4qLm=?s~h7?aNUD>PJanFl{y#nQibD12&4m*T}ac<;>~s~HH=4R ztiJK3ko4@n_g>~a(7=C$On$2>=mKteNg*e}5Az%W)i2=o-7kgWn?a2+snK#{=o(eA zVWO1NVV!tnwyXsEGpBedUA#Wsy=s%ZGr5xdJmjw;n5dl1JHW4cc5^qa>?g}fB-^=0 z?x(>rd?Psrz66FU!+mR-E4H_EF(L=!$6ta*qe!qfDe&L2p;m-4VOjS5Om(GBtH~V7 zio9-I#0MRf8gw@63hRK879%8#^umvM*`vJ1LK$@3oCyo;nji-D)X>+Q_ zwtoR+QQeCMM$xHzM^7ZdR;`QKauh!qp-92`ZNukK-~H|<*Lo(Ni0?!)E$L!!BwVfE znYs|EiK1r}jk@wU;m!J$jMX1BFeIcaBu?o4i_M+>+wy$_XF? zY?BdvzP@r4#u@4qixq;#kWLTbopk;gj+Zrak&+0FSK+TfyEt%=Bj+iw9!m7KI?QV0 zReOxff~LTrMc@D1^`8~~yNVMcSG!j)Jjx;SY9J0uHQJX1A zUu);-fa@Qw@XiCJ*EGKOG;@rn%e8YD)Co#8`Aq&nWaYE2oy)w9TT~KPc^o z6gp?4b9#|2QVk{9HT3VqsRy`ERDR^JIU&**FTJY*Cqlyk&D}JK0-S z!g=&us7Il<-N7eX)gt?HCHRD7yJ|DSq5vPVm#Oco{qr0{t4FG+jvPg{tz;uHcYZ`9qF$MV z*5#_2g&32L`vnQ6!f#OrjcnKmXFP?c1nC2$RHF}oFHPVSaN1d#Hi~P+*=jhT7h;=O z;uNp(Fd-FxcAbKTdDoDiZyddQQOxF+Tw2_~bC0d(G!>Ri;ojBqt zCWM{={RoVB7}-zkn&w5E2E`}sC*;OdC4tsx*n~bvTn1=7{}F#GGC%|M*lNLTVNA`j zrqT$G{;bwH!m%S6pxqJWN5Wr~^m~D_HE_69R&RfmNT21Bd25yMB{}XYp*C`1C0G+i zNYm|fqnY8EFkrBjBgBr)?AshhfG&ugw^Y(%oV_7&IJC!Wo=9L@gIi$lQJcTgN%o(E zq|8Zqg`#$sU$$Fi9QoPyQM=PG`+~(~-`>wciuBoSD_J3AtFMK{4ZBv_(qWVkQfDDC z&C|D@?bWVb=%~aKERHT?sBUkn6NNqEp5f7C_<*bM4=T8Hc=nzu5UEytmeM)coRw2q z+@CeS+FUa3k78ypibI>>@Kr`(SL9k6-TU`IEEHC_jz2lNPK~UJe>`HkuZK0 z@Hq!cLu73*&0klLj*)3{Mb;L8PMDtVpyMA5zG1FZ+-P0cqdORfEv5o(4CTna0xUtS zdUQ+3g{N&_F?AzKBIb|FU1EH*+S=~6MKEe?D=EfS8N8##TqU3d>+!Pcz^^{s!s$d5 z8bl>i{}Fl*SK9bz?M@eK4k%WiB4zABf_bE8auVDo-5CUGt!||JFh$|v`0!q&m@#{C z3(2GQA+tpK+;tF2S_J_B8&-ht(M7OPd9?H;nv?n0%TWuFW|lS5W&yN6VLX;VPS z4~HnoXOWV}Dp>JpeF+41WV=oJPjU?~lD!10Cz9a=`6{v4mh1B@RxJw+>{4+N(OO+u z2`Da=I>7GDDn;9HDg9Aza~ApQmI53qRord~#QmyUvS1-(;c*!n-v->UyvKwlsm2>r z3}tg|E+$m|EgP=`D*$l1p*m2F2%K&t=PRu#jQj(>2-^cIFd!hzenxAMG^E-UQ}NgP zVhfv>n^PYL|5o^{ZSNK_ewKHh=7b{q+b!@x=(Wuiz!UUd=(X4N!HAXjcxjgdw_>|d zwHw+GuKhrDD&9ZZ@hW!=<9=KQilrR4APugS9a8tiA@ds5%SJtc&OAyGQm!$DJCI$L zi>+~=4F1*m6+x#Tj-v`Tl!T0023nW4=oS zDdaHc#DGfId7?tO1W(94__r#YF1Xke!RhW?qz0R=Qvv?0Wd4!w2^Sy7P}W%iS2t2b zu?q@V6CZUxDKN$=cl7Y7Z9P>6G9p@Fx@;#X_st}r zV^7;2k3HKK^PGWg1j14sf@|+z=+KJ z2Xr=Lr)biUPiCBMPw32pu$vC~ls^%TP zYJbuv)w7Q|>*5Vt^wdRYYTWZ3@g4BGZ=g-|B~ zavj+6SQaEFHy-7D&a{uYv?k01YJ+=Rz^X$Cz+ZsNkaPfOxEgW7&}l6}NP82IbLY=j zm54wK=e{Fv7&Tb&hxraguqenh=+%?%jGk?8NiIs*1kx{`s>3PL+~Nc6T4Vy+LA3N4Gj*x02`$v!3__s>vX|AdPx2Up`)z^$8wC88S6G)c@=-C4TH)oO zj09bI(e%ahOB08PlrM9~|1NgVE1~Ur<0ok2Lf%*zEZAJ;&ea0YAsv+n;GMy&1rLx; zA}mG#xe}ctO*dA{WY|rTqZs0dLtT|Rij1$%L8q?NFsVq066`s_@-5lm@sS{QP8pzH zT?T~%(#u`}Yw(-{)V6II>=qiiT$4GQg>s$vWJ%4i#~B$6c+Lsr9p?va0L1$q%=lD3YwN$JhJVL6MO{r(Qq>eordeX@O&oQT3KR-ddXJ-bd=t?vQv}2Ll=8CQ<}!=RK}~g zg+Cr=5X@WzFwj17w-6Lw+KS+zA2v+_O5rab#SIY3p^t`N@Zrdo#1CFt5 z>P9=HY2XDZ_o|a=n{*s7x6{MlV+Ql8$=anvX12GdRJ7WWc1I7G@F8;biF(c67TSk4 zc&SJM$UJ8oJ0u}-wm@g!FJ+5xG`@8km?M9e_Uukw$!6PhNN-MaP^jfP=|}Ovf1x1Y)tO;*7q9LUK)uw<0SqvHr{Jv*ak6UIe-lT{608QeM&36Gu$)JNmWtWYJ=8lS$jH2X<$(I&g*r)%%-W0p$`5V0QUB8Pbjq>Zqe!FzSxN#H4 zt3B7upU(c1|1j?2qANyU+*=Oz`vQiI)VQOfDKdb`qtGX7mLA*Fon5 ztz0>FqF-{wh=~)fDDs~tU3&4@5y9i=aTCXmP&bTx^!Sk%MyWMAI(o!q{_hj77~vL! zx68&xFCEX{aaUh5_G0zNbS7Rg`qB~S{7G}=?aV&sR4Vo#2c2~`5C7!9o9l-{CxyQM z{dm^O_lOl zP5ttoRmvaER)JTgG!%NTnLp0|41RIL^vh%KvA0VrpE?B`%9{nk80$P=gFYlEi2E9a#e6r=z0CA^xyC{e*M>jGQj2j zdmwi&D*P4uMDYr%W$Ps;#4X~BHlu=%lB0G}>Fc??dg1N<2ol+&I2FFzR1 z;9vn_cr`s3&tHRbHyyqh0e%Yp^MZC_^X<)p%2x#C4sED^b`!sRXHd>C+<)gb_R9|k z<*{|_7r-+o=r>lr+D*g@r3K%|{;Uo5c90t{TMuB zKmM0%-wV}=6$F111Nc7@j57xRlLGj^5tPT^c6R{(P=Mfo-Tjy00Pckv2k)^z2OXfi zP;CCO@;h9?NukD7#y>t7f14`hje>E0o#MC9AZVy=FwSbhzGxhjpC7F6*;UG;!T9S2 z8?tUtzlWRPNui!q`fU>IqjRd1r?=3D(4Q*hX+gj3g7y=F_RnhKfQQ9^HRkf_a64fg}gzwSxVU9F%7U<;{ZmHV(>TaBk7q@AveeJm@CWAee98pgh)Z zdNAL@D&>X2d`Ac689~1v1@rw|mHIn^`Q8we$KWtAnC~4`+Nl@J_a8xdY@7#zc|BdF z{G_0KLr@-rXF@RFH-hrmdVS&eOC_kZ>OL<){Ym-XbeUVjeCW9#y5Ft3q8d2Iaqf_0n{ zlm~x8ZwB+7Ri*y!V7|9ish=Cn_o1LXwqA>a`7Q~{W8>c$j3+f1Uc4L zg7unPrJc6HIPVL}WBrb#U(uh5alrtCKN|vibxoD>e)OyQB~{9Y(XYzyt5Uujd{Ft4 zD&+@r{qpCll;0fm`&yOqP5+0kdx6in`r`op$R#w4gd{!WeyP!td&87_b8WGhOCr)j zBGhOkjpo`&T1bjm_!pv9QIfPurHEB?NoYw@#Q%Js^EsYR-=1?`|K~q@@4N5${?0kS z^ZPx|o-NG#Ygfwmnd`d!5a^EMT35_MYxs$3*dK~o=m;Nye)ClR+t6=;^4g)}EgFcy z_qz|TqMr5`NcU~iG5!fyXjSkH|KPm18Ye_8_)O&KfQ>LTT;^+kn|frwEsZ>(;Wd82 zbR_q0*~e{ytitx=3A13t6HeLB-F0{;)>UsToS^-3;0V@pMsW+S-xsj1s=!THsAXfE z>tdm~`Zpl|v642<`9>U9Ec&g6JXd4KXLitzL!KJ{W#+_@@j0OULz7VaEtO{m=5bL8+h1ronSVZy<9Z+7&VD&?6zelb z9oOHe$NYdj)LJ6`AFM<3=iNfB4g7VS*SRXsbMQRnpQGOb<$FT~7YVrM1xO!AM0|8% zC-&o0q4=VK#D8<(Aoib2sMC}kYNs(TRg2lrO<1Tk!#uWx2jNpte^B+?7V9}i`Ff0h z67qz;-Q?PW@t+AdpN87gp#@Vkkc`jWhi^mcwrF6O1AIJR-Ol?-e@T4R`x?bm#;z&ui52F2*<{D1RUMH{d*S=V@-x*8dH>IqLcn{g%c0 zyb)do^YRGXE9tpz<+@k5T>s&WjnU-KMM8aDz`6u7764jZ;$m* zp!`+L@8uU#(eGcO^*TnG#+y;ZXHej9PW1TdGUx|4v zQ1z#W=CNqtobtgKXLIxTuXX|FZ?x+7*BTOLUSCz75!#oE1Y(p=LBGXS{zUW}tvto7 zbJ^c2DIXmgXY)F+@}lrM%44x_#Ho6k*R=H~DE|=kCo8Xj{W(VEFBUoh&GS&@&!hf0 z<<&6nDJuU^thWv-{&CD>g7UOlc6<_*?+J}_kwB`-KOg6Nm8<3Z0+*jR|AzU^Q1RoC zCrf#ExBivqyZu@D1f1`=%3ERFl2!c)p?NX)x5^LTdY7Vnm8nOb@ASfPg@(}_-$au~ zd>`C(Kg{$i{)O@@&3YC;2=5UZCG-3!XgwD%__c@sYK}|dCnMhdym3}F>r)Va7vkT* zz8wSa4u1mkl7JTiyTF&?yuJqR?$fGbob%iPAwGa{E>M2HmIM?Hj923}59783`9sSL zxe5nV661@pZUa{$2p?8qUy4@#8Tw6C{oaiEouT|~%x{MB3g|be^7li(G0HPS=bd>z zqI@&z$yE7kpq?z{*{Elg@&~KQft&v(k@AT_>zkB6Zst+qbCeGVUC_<-QTcaRS35B; zh2`5#TZ#2k6)&`hmVxoprcPOh72w4~(Sg8FtpC!=d)Bt`pCErb#E-9Ly$j+y!KVkU zFH|0D_6OsSVBE^!2VV*B@|c&`;U+B9W?^0iz`Mc! zan~bNPZ~T``CMG5@>HFrF)!aEe_Q0g3VAYAp0%O#(fnLMc>?kuQ~BQwjlcPMfr>8^ zI)Bak2eczkfy%Q8`@lKn&zp53=V{;y6pjxQ%{mb;uKZ=Jw;L+kK-c~L(Dl^({9VP5 z2rV#kKcjpa`VA_-ue$BGj`FS;w_Mku?LLr?`>{ObH=8_iz9gc~l8A3s&H5mC5%^s= zUuwY{!&?Sz{7`u4Ho$zXG1lh-css<`!us3?cjv_^>`T3_vw>#BL+wm$o4+gE9ma!L zw^zfPBYqmj{~mZ}_~@X`^AbKUjgL3uxK<#(1^gv}9SS7*%|ZJo{FuHQnKmu_&^Zy6l#aOLH2ylHT3LxJCM-FX4-=J84#uY3Igmxn+% z9PdYncXfV*;@TR%*Zcfl1Z)bRP=&OOie9TKfxVxS{ zg8J`Q{xIqvqkI$Ue*%sVf!lFiNLStr`}QK0C%1;J^JTcJ|1r$hIyiP&k0#f3t~qqxkPH6b`u6t=+8x?YKGrH=F!!b^rSd zg#&JNgndhyK%g95L>l5tgUx`5o5K#ZpYXA<*)JkhKiUkq#0Lx6z;TE#X%0y|3w{rL zy(iBf=7frr{}wX@k$kRMz@hrFkG+fh&zj&!@$<~kNPG_B&FK(ogUksl?tYGAh9%UR z!p)$Dn)7<_Xytw2LFJv`Za;MU#z$sKq~8R@54YU}wwmLLRR2^no{{`vv%iOqOXWG{ z$#cl`Bk?gfAyUxq`(~aZ<pb}zmfZ1h$q1Dv?nmv-1m#8z}_=_*BHlAparHKCr;V zN6OO!^OB7`ZX7C^3#;VMfxG*w;_zI!x%`D%N2~{T0d)00XFO8B9n82&{%BlqTzntn zk>X#(@dj1=m!9JqX9|}5F)BXR%zLE#@^fE_k5loZjYo>_VCGxm6IA>|#v{ewZQ>+8 zS;Y@ApGS(n662YIcswl(RP>DJ)T?a%48*(r_G|OG^qU1Yr(38k#`x#Jv3vt7;kn8$ zm~|z2^5Et)3AN&80gD$XzYgbxdrQ2FuM3Yh^-6QTz@0B}SI>*^7#06K)?u8Ae;MxH zf93KoF@qc$f0bu7JVp5ycq-hK5o*J*4zu8H?jC_>t31t30n%>{+@0@J5uc~>KVwcn ziFda~uKrATG;W!&Z3P}O6DsjRxQm|%k5T>bV}Cq5N*#S7gDltpx6aXDi=?^CAasmQ$#0hvzAO6zj*`Qf@%}K+kny zI^uIoK53ophrkG||7dK4X8J;{J3I#N?vwk&b1}f~xL(8kOrG-1@B-y8yY+yD=JKp} z>p^*IQ$T1vDDMc5QJ#r@7FZJib z-TKLg=P9p^bz1;;>$X4kCHK?-!x}KZ;Ty^yjRSSw8XknZasCkf#=u?vHaLId;I7WD z@C4;+QD-vT?QdJ*DJs4{&eK%5tFt{k1CHe$*o-=}RGuD)&xYeeAQt`R0?cv^wePY2 z7r0uHuFiFsuPk^|&?Q0V!?X;O7@f<9Wcsw6%fcRANx`nhRxB%RSagIiTN%qTu4(4N|<7$ui6vTH! zd^eLX)Gxd{ygxjM8=`jbgQznFehFR{$D4xVssSH@`jg+XunRuLb6qHBuG5j~?`V!c zlFv5d8_DnX#Mk!ZuWzm^k@Ccw`H19&&2dKZfu4HWdh)a|^Bfv~3|I%udv|zrEjwVt z;J=u4FYy_*t*4vumG%uh6>g?G)aH54i=x=af-yGE#UI5y#=y;K7;1mPUWwaPf6UL1bf)ydEBfUY2V>GnAOLAKE%wEv_+meKlhxc zf8l;3?>77W?)4n`eWXZrR`={PZOpevicc~q>n&@K&0p7k2$aS77&Fbne)#=3FET!~ z;O-yZHJ?hJ?CsXw@1e^5XlOluZ2hqP5Xd#-Af7SX!tFTUdtklg{$u?QvyP?R2G4lF ze!kRK6Fy*T>)(|jtP zmu9`Q{ScUlb&@>U0+vglky*DApL@vqSabZ+UNh@oJmm_T*o|8f<|SCzI+kys6XKI+ z*zdo?eh92IVWBz^@77OI)Soxr2Ac9h?HO|(NPI%R{roW;*9_!|K5l)X{SZjUd6cd4 zXCgiij@zTa26&)|P3-EajCx|=E0BK=#w}0zNc5Xg)aH4}eh7SlaR^*#p*!+Kne`&a zl?)#P--`G=IHnbSbbw!v{XhFR z3yJXO&Bsuk@VnqA+&DaG;T*ghJX)>WdtIGR+d#J-%w-{zKjs_jEs^I_?EiT&xRn-K!zcg4@d8{fjDgfPnq>D`Lmv~-VAwKp`L=P z>^!=9Ho*f?*3IQU)J~iGoKPO*Pl7i_{w1B^E5{8cJOABrsZZ-MM*7Tot2>nK* z-!+Jc!+w$j$L&v`ocTwjJOi*V#bDo?jXZ6UCl`6#&o`Q5T?N(rHZb2O^#?F+S;#Zb z+&GEnV80rR^I{J6u`IZ&vp&wd=yaQ4DB?%B`9;5#%{WSX7xS2laf=ISATSQ&oQHbG zz~%2vNIlszEL1`MlV)(lQ@^(!k986#YdsnhSROw4TI<1Ro51ZG*JFG#w%I%f(eGsB zkIS)OraRQCns1kWQ{J(ke~NngA%6n$_rU$Y=cp$G<7U!^+6C;B+1J z?nlIL$9a*AeV{4&9cNC+&^YY3fkzR4jX7@dybml4h0ie`#S^w$xEp>5^OcoqAr>b_ zP0ULw)_)q}%OgH!oP|jk=hpCmT5r8DkHMKXz5?o>R?OCuG0Zx;3GBf65`zuw1LRM{ zyyWh&@zs!LFzU?u(7N2;NIQW0lk8pg^PTVs$diy`9j8rTG{!UKfOT9R0$;g$Px-c`Cn`?&cbyp$`qrLXzneDw20M7u-nR$Ls@<{ARN+Me_chJas(rGfa|5dG>g`tl57e#TWM+ zS9vpTk>clH8QG_r{VG!YSkHLg;K~2Ena4Zwx7Rj#$8&n zxt>Nk-oLTWr>?Yd^79XA2R+Btplaki>pko6A5WfZ&2=zRJq4clv!35zX<11ZY5jiyU0Jnvrl&O z^!u%6zNUE2mp?u6(>?Pz-ZNjfQD9TGtZghl6fpZ{EdkJ-E+O3j`-kQ z8#os6XK|mO1<$s_7r5HQN1ER&JpLKZ_moVV7%vCNe+VH|XX+yB*ggW+U_Hkzw!Xxi zpVIE}TxVlF{nqrj{9O_mpS)!@Z#(Q)cbQMcW3ZpNby(H2KV*6KL-SvZ4&}*t&E`L1 zKLiSS)TU}+z#E{>EcmtN`=z}E&-v7T9&0}YN}6Iqb(QqzU^@xq*0UajyYX*l@`vh#&&D{&2l3QD zY#y^+hguN*X2I`=cY;TswQ#37AEX^K-za&qF4)hjBY#cL`d{JMH=g$FOB2dP9-kLH z@g?0l#P#thTUH>^bKmuknIEY?11FFhpX;zM1+TLQWs)e-QZxVSmVmKZkMH zXX=#v3D;YA3H!!NxDL8EOyjZYGoc{^WYr-9FH>j`dWyNgHZCu->xZ)!|8q&xO~5@5c2jARU=@H@rRe zy=3?_`{h70ctHaT(-D7TCDhZm7&3sF%=~*Y&qRzNj8-Egc zu5$N{O)UIw(*!=kI*hr^`pbylYtAF{zyGw&h|j|dX_<(46`tD6CYTGKf_{Vefl^20 zUkOi>Vnm|XKzp3y~;6u@GLMK~4UcL{k_4NCI=eX`hp5)Fp zPdRh`OG`EDJkmVg;(5L^+Y|q?$rUM&{9ISYKeeyz_q|ZB=GXmjyb1lR55##|-g936 zf&C$;zl~2so^r?&9AMqOE-kOKO22Uft()NrwG$?PXdi&P*C$iWSH)8X+4$FNctHMs zsCaO&^@?U+lXl!Q{yRPA#Xiq*{p`7(-fQ{@)jz`an-S_Y5Ezejo(rFkeRW!C)IZ9` z|8C9`X+1o3UUc!e(P(VehqNcLPO{T%p6-?dnTU_Z29}I|pTqp7JZ0nE{waTVK<~k@IJ;TP=bdG-G;N~<5wNe=WWcc&AUVmr4J<@ushWG$3fbMnOR-SPlisQ=0 zjn#6j!*QNm{)dFLT$U#n#PjTc|CBM?Y^JX#&SFZb7*F z{evB5-9Ki}ORi%=Ppm=lI3sT+e&t z9RDr(S5*Jc zcK#8${L}eSa`RN_vOgf7m?rt<7Qw~K@3l!2H(SwVpA45;@~O_f6fax3%X8M_rEy)7 z{PIs1FRznG)7}xT&pY?`H>DmvkA@*$oX?}xlwbBI*RQ;OD^2<}wJrY z^OWMUpCFf878iek+-%{Oy)mwP(y#nC09<@4a-Nrta6SI=em`mAKU1FNpK|C788`CsJS$#szjrG>MmcSXbwCa$e^jnENYf z5-;~+F8(vP9?xUscbRW;@li6Vrb!-it8&>Jk(*nd%ibQY^A9HPPWe;Gdyvl|?@7Lt zob$W`mpaWY+vR#%%3?B2JZK*7xH`afos%hEUK?}qE6J;oulM9RPw~|$J_rt^=3OFexl{zHoA{NGSKpV#vKH))cG`|VsY z#34_j{C(h3Pfhc1bq=9;&cBM{Yf=20p7;WC?)N<9sZDuG;E9IR&;53VOPzHnzMm(4 z7x_JOyeG)Ho|1C%nbyuU_tGwZ71?x5 zlRAfxHzJq!%)5B^_ihXY>Y0c0ArwE9;%CBjy!*R0((nBgzmoC{Bi}=L>Qle#@Pt(I zv&+wCrAdCyGaRntmwUXJY>uW$9v-*v$cIy%Kf@(IkI&7rnVKef9-#OZaEWhV9&S9> zQ~U^um;WAzG|9t$#^aUng8*HB3y=5r_+*c-flK`j&BN9IBgJ!_=R6)2G~aBRKCT;s zA^wkVhD*OUn}_T7J-Fl(3@?=tc3LRGy*~Cqg_{Qep;_rk@e(pD!oUeD&$wyIs`8!L}BoB{& z3Aq@Uru}Ae-UoVk{1J~Y^!QsIKSR#@a|yXfpibVO>%(Q-ZZQuxZmlSu_vb;L_y;MT z_vfV)e;eh0nY<}^0r{=u7sz9cpU3M_m1Wa3O~!vT%~vCGp7$rod7ocE&hxv$<9j@w z@A1DpUQRATrs?(5(BqvwJ{d0a*vvfKJkF+g9*5T`p2yk#{q6sb=XSZ+m?rr-zP@aB zrs?$)1DE6C_0!!GpG5JzevVOm6O+pwm;LY5{I{M)vRRuZ^>BP^xLzlHD4vgNs>h>b zQ!`ES@cOAl&ik1B{XJwdMD83Q-)8s#p z&m_M{{tS69+0;yv{ORO_$!C!llFh|5iJwhgA8shn!aQ94-90{lyd}jy=JC@WUoMN% zH0hV~{NV8yWYL=@@vY3m)!9WhU(>YDfXnedYrg2>-y!GM!_Sk?q4?6WiJK;Q=8|7e zK99TsIq$da;IduH&$3)SUC9@aCz3BDA58un`6%*C@(JXN$kWK>Z}PZ$o+W>td@=bF z@|Ve9AkQXWO8z$ai{u}YXOVwSF7L%~bsiv>_jWlyO1_NzH2HG!&_%_}iOfqC^3rm# zF-`mq@+#yN$m@}>Aa6?Ef&32gm&tpPuOuHt{t9^t`6}|q$@`P1lfO#7m|Whw;>L3o zx%}->=WmkB&#IhnCvQOh1$iCvJaYM2n9FmDyao9M@>=92<)UJm%-3t=mB?3<*CJm- z9!vf@d0X-c`J?2;MZT7N0Qpw(P2{`C2JXOixCT~E#mApCmHu4VS?~wN)f0uj+c~kPy*v;gCiw>xzmihA0*#FeuBIN`QPLpk{6dJA*RWEeMDY?yass<@}1<3$(xbKk+&l6Mt+pWCyD%H zihqE77x{SdPspc}KTbZMye;`M@;2nz2Xw$QkhBTuFHAo)3pzlr=Jc}w!Y$vcr3kSCI#As8&|HRL`PbwhljoD~p*l~K@1poXTzI}dqxjO~c@$rTJeT6@k$+C! zl$>85xP$x)itk1KBlSCo{8#c6@+ivlIQf_4>EwIK7n5H{zKXm(`J3d|kZ&h{lKczu zugLSrza~FL{tfvB@^<7U+XO;Q_Q^ZRE0OObuSNbXc`SKx^0wp+$rH$LCht$)hAb;(zde@DKayg7Lec}?;?X$PbdYCclBa3;7}PzT_Rrhmq%zk0ZaHJdOMZ^10+cl4p@WLB5v! z{X*gOu$BBB@?GRVQJ#I|M=1UXc|OITAumIIMZ55P6(f%(KTKYg{0Mmi@}uO<$&ZnD zApe=X5BYKOA>_Z1k0!s3JeB+w^4a7k$d{0xB!7+k6!|9dvE(0;UqQZ?yd?RLh&vKjh=dFOp9uzeN5#`L*P)l2<1G9bQC+sc?9o zEOLh(H}N!zuR~sl;%_CF-`R1`2YbLxih$fgIv+ssg(?04PyC}4UxeakdVDVV9IF2% z${$Ddtfcs&l>ZG+{5urS_2iNlqdZ3`PaEp@SBk%q;_KdNf=rWfYik~E+-`!)yl{Lw zif>2p9X#>(QoNixF8?4;{G${vOUA`d^2E=fcsWEDzt9uEn&Rc3EjJ!1Y_vB^Be<6=1|BJjV`IWM1nkM5QzYFZf z=Nj^>$!{btPu__98uHu8E0A|3uSnjHyb}3v@@vT-C9h0Aja+_r(;e45@+#ynkzY@~ zj=U=QHu4+DKOqm2e@kAC{3v;K@;}ILBrhx%Ez@MaJi zuS4DwF8c$&{x-?uPr~KA8)6==&J~{c)f9gp#pih9Kce`d6n}*Le)98_ho8UHmW#S+ za$NjAw1MP&pFfS9@AK!9^L_q0xQqke=WnHWzR&;26Tg?@`M&z7$A2Z~`}~WPKhD(T z=B2RQte7U_!1wv3;ZlE`dARuND4y%7L(cd4w^N>Bl;=*0=lk|FiXTq#PkZ8*Qv3rH zzuXhQiQ-34{5DT~tlXTLCga2Fp*LK{hu7^O^1PaN8N9X%E^7`Zl$QzIskT)bRDL0*_NxwIde?dN&>iLVj zI(blTMop7E9N)#`spPXM&l?{9g`E4XCO5UFNxwV}|B&BI$F)FiYE6^)81jAOoaZb# zkAHi)*)>fc?+Efnlz$F6AMaL=uaTQ$)6CEW9yAZP9{wO7MIMlwW78!5A@gwY#mQ61 zqsbp8&m`ykN9AVPG&x>gSC`0nU0p9X)22y0ud94=9{(nCGi{pGKiWK8{Yf5wfP4(a zPxJU$k1vp$a?_+=&hw?myU9(tX>wfY=9^rdL&#qsf0ld}`8x8Y2$az0mK^{x-Kf_HafwAV{j_V(a=Y6bQvI#Ox;vX>&7k_uM`NTA-pW_!K zi(2RUS0;xz6n`t#v!9&nFE39*Oq2Xv|7h|TX*^#bA3?s^<6n9FyvHjJ3Y8P8hx6Y= z&gVsQkKaMwgvMbAIp5bkLeAH_CFESsCXes+c!9^G21h>LIv$Vrc(TVQc|6nO8$F)u z@e>{|J|yyS)$n+n$H#d*-Q%x%duK)sJ{}+K@!1}K&Ep?>{6~*p^mt`?GG>}yCvhIXo4gf`&tQ*_Aa70a)5&=}*LZxV z$A9toMRML(E69@^)8u(N|6Qg!a2W^w`!KhYPd6u}J0Clc-%iJMH#r~IB#*E2_#Se; zZ!9BEx=fQg+fcuK$hqH<9)H^7Z<6zVvftye@}$l*y?#1*yobk!leeeiDj?@^C?!u0 z(Jw#mxPd&C=ZpMb_iyBU-!+Gv@84FC^Znbm|`7YJjiu@PyB)E*j^yR}@hEe9BWe)qG-_p5IETA^y*KaT8p}46OfCsX_BAM z>y}eP{Gao>2RWbDW5}nN$#MNY>+u)KJJb2H+2cQvccJ)yp0ssdVLmK057%$0v~c}= zymQI<{&pE$@;pa*UM0^Y|B&)@rFu%r#mO|uBO$JyO7J4axSkH={Jh{Pa(;bvA?060 z`Cp~@ZdA{1ieF6e-%~u-^EWxa{@Ft=uBJ)-e4dVi%kj!oxZ{0-;yM3Q6#qQMXOO=@ zzTA`NBXX|iGs?sHzad{j`TNO5*EBgUzRw&Cm*ZM$9`3ltQvBEEi_Rxf{EHO-EXDIU zd_eJhKm55TK2|RFrs+Cc!KF?)L|0E|isyc3lJmIDp*&M5&kGdKc|N81EQ&887g5us zPTp^ChD)8x%)`~$hT=JYCyHNA@%=sVk5c?g6#qBH^YIpvi?L}^53k!&aH*f`X+!ZV z%-3A~<0+nx_Z5nNnc_E7Jm-I(;#X4q*Pi(MVHms8xuU+}~y z$<3B&l85)(6u9*Jig~y^Qz@R0YY92;Z~MskzVReE?|bFsX3jLJhp#U;dAv0_UtbbE zURQ2ZLT+A7ljAyRigNX|BfpEh z8#(`-=S6TiuGh`O5DFW!-xNYixuLGr$or-a=6A-*4ZQ@Lp{O~zrZdAM=w2$%f49{N-KI*NbL z6aS{%WSAy-22j8IJzhdC(x&P7n>^m%<1;<}s>fT)O#u2$raGsS4jBLK9NuEKJXE}L)@-4FYnkMo5y3JA9 z98C-5F$d?4tF&xtaIQ06HXS%0*JyG+AD@KFxJ@w+mwzTXU&pg350B?-rit@7_a*0X{^X5NcqpDNZJ`^ouu0~^A5xXzB` zd|WBy96xhoI1j&$cj$j%=XFx_&9D!r`m2%i`sw~wIG)$f!{prWERVnH@f{xj!Q=mU z{Mt?7I=P;QH-~)?t@A8$e!ce{k00>(-yW~DCEPFPZ{qP@{@7j7K ze^2sm*^KqhiKiNAm=<6$$8(X`CcH@q#oHC-S{+z>v>Nk=Y4WG zIX@qKiJaHNo8;{uGMm>(@MT&cB?T^B*JUap<=rTqhszBDmBeTcE4wb&BVD{-Su< z+Fg9h4{d(QBU`WY-tZ#E#?bgYLe8%%K2QFfN#^o=OU~>0PjX(*O+E_OBU`V_(*Z8^ z@NtbN=YF3i=k@4$ z$JLjd*I_E!mY&gc6$az5XGhD)8>sm|*^xBZIC7VGM7KrUOF^Hy+KZ+u(> zC|)idE5N)OYct$>r2{p6bc-6~)V`?BajSOm1eqrF@bjZQa{hZS z=g4^$-DUep7@~@&-v$5JnsY96faA_ zD@^vlQ96fSkjp}0Kv zlFJl1&+zz0aw);Z?}F>&{hQ+DpDw=Ce)EZGI=&)Y>g0ObdVCAz;p6><;^m*N-)aY> z*Z+>sO>pV=d-HJd@t*iD6fggD@hd2v&-ahW`MO_RIx|hif&cznMRGo`Tf?Q!gXZD- z?Md-`o<2;@=le3sbBOY6BF`iLnVjSQB4)7upZ}PbO!^ru(yX9y&zm(wOZzuoRxSPizaLLc(FqWL(&%c?R&(rr* ze%J3o@~KqMQOd)|RppooGEK&3ig~y^HQ{<3T2j2Ebn)@zGE~m{lgl_bf0Xh+P3vkJ z#dDso$tO{sW0Z%FtFClrnj9C;OGmgI7msHTisyY`2*q>$G>VrJ+;M&E@n*8fOp|_R z((&F8mpXqj50_^;#q&B@M$YF;J~^+?Qj*j(>Gx*pw;f#i<^5qS`APFNSIWP2f6Tin3|MBT?JyNo(v*Pbzmk{TT;kwTI$@zYD z73Gl zDI70{?&2GfOUZ8icY{lvyg!Vfcs@_ZQarEoX%x?OUK21k4W`L)aXr_Qb3Hf1bv^AV zp7Sre!seIwB-4pI-nDS)SBBjAyA;p$U!eFJ6kn`xIDaDL?@iAACc~v)nNrv9D2nHP zkCM-$b#;n-KKZO7;d3i#dJ0_?c0L~mz@>gU6UI?8(#fx^SJc#kxA@c>Ln^HeTxIbz7%u*!g~}2RZK> z_mSU6>m(g6<0f0It0$A9-j5`!rmRm-nT&J${Is z^PeQ&P5I{pZNHL#DXqhkaH&Tw5pEn>RWQD=iGSV`zt$7K+Y^7t6W`}X zdtAEyesDS7muP->lk>iPm^_Q(XV(blpJH;k@m~Pf^M06|U$3ZEGn_{*xh_uvT=MXB z{9SU+bCI0mqiRLYUzJ>LC0xI8aOrnB9d9c63i9vC`8;Y}+x9DYcs$3GFQYua!ezdm zF%MTy#X8|Ud>&=NCB78Z|C7hBt84S<{MF%lzNV3Lo$rwIIDbv~qJ_ejcCW zaH*#>#a~@NTxS{bP97iJARN!*HWIFnYhJ@}yxbzWIxmvTt&Q`aZ?^H0hxfzMG2uMr zD88e|dy`*H@nhjSe~HH7etDm-=JCbk*|e_qz-64vQNN{b3Fqhc;kSWHJlDCz<2S{I z^YHvW)FkZHO)@v0Uy$>09f3=~<*Ckd6wmAbhTFpVx!?0}$#V_mDb_R`zmdkLDqP|# zP<%YO+`78@pCae{>7M*cDW3CJY!Ctzc)m}5gq+7Yll))zMJ>X4xZgo7 zBl|>hem$yht8hHeV~WSed;D4Q_B1bR$@#kcH97yBx@zliJzFWy9poIpoSg4Vd){vI z$a<(`{^{nuAGzF$IzJ1S^Oy6~iwoEDF4Z%Joa1-HrC)yi{HiwLJRDz_oUc<|;gW~z zoJr2FN6n)=e15%8@m$YtPy7!Q&-ssg;%m3H$EC-)D_q8tuP+Z$JRjF+is$qCQSuxb z|6Fn&&r{?)o|W5$>*Rh@;Zi5Zr&D|t^Q~^3EGFkX>&fM*n~VQ}oY&!m_;5WuFFE8K ze;lsI^EAa@PyNtoX7JNIgjU`l%MCN zc!zNPT+eMD9|YHRKH!OeoSf@rScbBdRz)Gq!Q#q;_p(J4Is9DgTV*Ey4XJMCj1P@XBKR@d)tisx~@ zNY2-z@||rx((ew+KcGw4`TpT7`9~C=(=~itT+c4JZ0pV$bjpn6GuW){@ClM}rYEb-ea?U@6ob&IX{9OO16wi5nC+BrFv$w5N zub*w?9G?%DapV24T%T|rj&A|i@$D$SCXK@ka$e6bk@LEGjq>yQJWBDLCvbPTPR>&T zuGeQLis$2ch~jx1=6T|y6K%hepV!099`6p9d8tn0a}PPMhq>fj=R1_2>->=7dHhS? z6CNKPw;JR;ZVlmj+?r85*E7=Nb0`nj`GP0@O>(a1UCP7j;S-AIdJ6RoA1`}dxL&un zdg4b>JYV;-$ocy9K)>*M_>`^-Gd;e@;}0f<>#t@0>8=;^;JW_jDZVzve@4#peuSLI z`B%!%<6Pt3a6O!-1v%%5hwJt86vgv#y+QH3PI4)p^M6b6TxZGt;W{~g3|x;}Q%`)N z$7fNVw`rXBlJj-{xW@|*uysm39G^nY`~MSg**EG?zY8gz_n!lv_&{=ad^k@%@_Lm2 z3-Y?;dE}hu47t42>eg*wpzT+$hZu4`zqY~UcpFfj-#uPqkj*dg@)E4;w-Y(%Sx$Zv z#os^J=8-yieh}!_7CFCgawO^3;Xvt^{!F4^ijIiJ5tL`nQqGxVe4xJIcf3c7)=2d@hi;r*XUWk#PNYkT-`*o%?B@tUNAq zd|kN2^Uo>n@x%}F#HUg`*Z(p(kIx=*uK#;a{@*E{*Wo2{&R_P?@bPjz^~k4~V|MGg z1zgYX-4xGxc6vOQoR8}mIoBCAK60Jq$vICga?bN9c@LA)9oK%iKCaFa!u|H7_`Yx* zpF;7yC_aA!udHqk-Q_t4<+wSzJQ$LUm};60NwGvLEeRY6L}xketW!o=M?;c^_K~mpqS~hs*Oe#phH0 zA1I#3^Jj7%&%%>!zmmTz<*7-|d1k?7eE7cuvV`LArabE@p6lF4&c}O-@^HUr$+`Yw zkB95$agHYEJdeV4{nIHvk?LPU@m&8G6wmW`gq-`mM9%L6DgK15U$4*W;4&}wP(Ag? z`;y0c^0cLRuIGDluD?QRxE`LDesHOW$A1jDyoB%8=d^a4kbE%tAo9_k{7cDqQ+(Vs^NDFv55K=< zHC)DFFvVw6Jm0@%KNZfy?;H7socHI0aLGS}@?W6%eDZ6a4(I2er}TwOo?#R}g5o*P zVu~M5@vA-Y-;wk9oTEJVQJ%sxZJkn&JoR+*c#wPq`Ej^j5AQt_&T~J-N2OcW@i)Sy zU#{mj@}ZO`XBOq5`}VKkl857q&ko1`MDe}g5JJ;sd@ioag{%P{ZOdl>!7P&k%cfJm;*VUKgd|W@0^FI8y$IH&M^-F$^Z|L#6 z$ahnn%gOn9cjfuv@tH`+dm~&QS6gzv-aSfrQmEf2$VZd!C!a$79;W=f|CC)|>y&!< z{n*XO`M$k7T;`qYnM3hh|7wbVlIr;%#dAHU$T`nd3vHd!?^Mcj4P1|B2a11~#%CYJ z^E@_wE<6r={q@-4xIDOs9DMyUnvb@oOla_md;!yx#sGf0@?9oab%* zQs*i1_2j>jZ-LA4K1SoYlU$xUxN-iBTyDvoe@`yA#?F6*>+%1G{3p}7i;r4jzS%Tg ze?xMv|5muJ|4wqbWp??KC=c%&50Y~|3n)(-Cpghwl&uDVFMRoaSkk250j`DNA>nUDtAzhx$&f~28bNucm|U*ku@uka zlS}cBQ@_7>{5-k5gy8abe$jkln$*dEfAwCt9M>d@zn|he()s=ZIbWwfqdZSgp0uoR zza0M_T>9nskI5&SZ*|v&DlgeQ5-;wKs|#F?i+>MgxyQFto^;Cd3B~jHU%AZoEBX0; zyAC-YS2A4cOfwHx=WvSW{Oid1@5+8kd3avFp?IE`mdnHABTrdezjwf;e!d^*N6!CU z;OXRi9a-w}!{k5HI{A(KIC+^Bk;k(MIge*w^4^puot&?0`^fq41N=eW*G!HZpF%H( z>q#Mxg3CP0Qydq69mVI9-%j!J6wt*FUupA89(k(gd<Kj5X^VqDEg<<4!iWI@;BgtjS7sux*RGyON^9}Mv zw6gdp{y*ccziY@hQTz?$Z&Cb>0-S;_n-|vpsc?|Npb>Vyz z+>L|t@o={;oKJ=a@zMDleD2nT^B3WDRQyVO-az?AeD3OXdESP{s`wA_c~j-`w~3{- zv>yU4&rkR~PC5PzJhTy0l65!{zv0 z@Kohr!PAre6=F50~rz1-@JP6}WH7 zRbCptSNRR_eahv(@gVJh{cyS8PVhYC_rmj)%YWlR+A;g#a-OO16Uyhq3zW;>_>gwS zez=@x1N@xw58xM+?}LXfT;^-;e39o2(u!bRJHG^X`;GH5MQnVOimw5WR^9|&UU^q| zCFOnKZa;JV4uJ<%{Dbfs$|u6>D4zyzpnN_&M)`~ISmo>BO_jd`Z>jtXc%1S>@Ob6F z!8<7b2i`?_>7sUC5|m#D@1?vUJW+X5c#`rCaCaSW^U?!8M8yw;yX%9C9|a$&;#1)% z%G2RvmA?QVulyDGB;{|yQO}!4bM@&4ZdCZXYifM55RXTKL*cL z{x^KD^0HUj@!zLB2tS}a7M`cPH9TK=SNJjI{op5*kAfE{p9DXn{8{)pm;7G6d99q^#?p70vV z?}OJ-{wUntXSw5=4UbXr%iyuf--b6;{xRI$uetmO;BhMc1l--nx%fgQ?6`GM@z=n+ zD8C7wpgbPlOZfn}yhbO@^*ailq_sGR@te zx_)cI$E)~O@JY)1!c&!xgr_Ng5ed;@?G#O<$K{P zl>Y=@rMv*XM)?);!yMDHm6wHYR9+LlNqHmqR^@HsIm-LMw<~`LzEk-$_-^G{@Lc5^ z;d_;T3g4&vd-wt6r{Q_Zi$vLR%U6CK{Fw5F@Ds}8;RVX?f}c@70DeySDEI~CQ{e&J z*UK`H*K=mWizuH5FRpwAJWBZnc(n3u@bbz(hgVYm1H6jzv+$tuOYj=XOW}3DI?AiS z_`T>dsM=ShLLR6Y|Pr~G+%yz)2T9hAQd@1pz*xV(pi>p2MT zrTkZTqVl4p?e`}s55kj`*MSdFek**K@>cMX$~(bRl-~m%tNcOuc;yq}la$Yfrz+2c zrzw90K12Ctc)Idjc!u&r@cGJrhi59k0AHfKWEndzS;{NGS17LyU#0vO_!{N$@NDIs z;Tx6T4d0}EIDD(}RCtc^S@7-3Uxe>ez6!ou`J3=upcSBA$ZuMLk?-VEMU z`5o|<$`j#n%7??_l|KRRp!_L#7v=Ne3CdT(dnw-rPgMRXJW2VF@MPtu;O_M~H~yF4 z!&H3na`wC!sk{O_MR_gwSmiC?hNskvG9$`JHt0AzZ0)-v-ZDo(n&w`~duf@{{la<$uG^D37XS=j)vE^6(4FtHA^Kd5GIjZiW|8 z-WFb5c^7z;@_z7W<@dwOD<2Q9q&yW~MfogvQ2BH48p>C~>nPsDDMpKrMy2pQTcGV`#GVj ze*!#N#ZQM1QJx7OraTKiQu*uf6y@*0$12|oAFuo;_$1|j!c&zOuWZLZO?esk4CPhe z>B{TEGnC&3pRfE5c&74R@FmIz!LyV<1Yewp~@-6VK z%HMoo~!&f_+I6K>+HPmQ(gvsK>2m>Jmodv`O53Vk11~g zKcT!eyg+#e_!;Hh;pdd!3%{Uz7(9TV-@5a99K49~G*`6uup%D;vWQ+@0+e;a;G`EK|L<$K`;%71{LQGOJDPWfs01?7d@ zF9hKIChokr23|yY9e8o&aquYR3Gis;_rc369}BOfdXJUs`#_;mdY=|Q+Vd!0c|~{!<+b2ll*hmml-~~TrMxRV zQF$^vN%<&vvhpeLAZ zr@<>Jp9Qa?d@($zd^x;^@>k$>ly8JLQ2s7FM){}kSmocsn<~$Tw^aTsJWhGwM!SC8 z`!wCWl!A9q@z=n+D8B)opu8@;m+~g?MCI+^Ny@vyla=>@4^ch@K1}&&_($qJe5djb@ZHLLz;l%k zg6~y6624FQL+}I2AA{#9e-fUrJRN>a`2zR}<TSNQ_wr?VAMzS_ii&>=K34gA@bSub!6zyI0-mb;dw81iqwpEZ zPr}ocpM_^AFI3B}&-u!)f@dm^hA&ZG37(}q2w$PRK75t(Tj6Vzw}xjczZ1Sud3X3G z<$d8>l@EmHC?5{ru6zu9r}D}0-O8uKbCo{}->dvN_&()X@B_+Uh36^HhUY8a3_qs) zefSCGJK+V&zkr`nz8`*0`OokR%72Fk@OupMWjXIIz>6p^QroWE;>ydwqm*9 zUS4?vcqQex!mB862@fi753ixT6TFV{1b74G_rPP64}`}m9}aJ-{84yI<t$aRwqw*#2P0Clmw<=!)&r!Y+zFqlN_)g^?z;`R(1eh!|l z{2zFR@+<1uePF)wD0rswYv4_->!T#e5dlq;k%X3fafY-0N<-T3%*bJYWM-=Tj6=iKZWNjKL|gj{1p6z z^1t8(%8S*v>*tK}tKjF9mxo_aUJV|=?|qguY32U^CU_C$E#bwL$HSwPcZNqR?+q`n zydS)h^1*QTd%CX9QShLO9|y0YJQZF?c{;p-^5@|0_kdl$%iyspejU82@=frT%5&gx z%6G!!mFL1cDBlO~qC6j-p!^iPm+~|4MCF&@Ny@KmVAo-?@~h!PlvjoiQyzqmR9+wM zet+7He=K~gif;}duRI<;NqJXzs`5VYH0AfgXDA;EPgkA-&rm)AK41Bh@J!{;z?Udr z49`;jGJJ*d*Ws&_Z-K8-z5|}E{Qsoge|%e2{Xg)_nv{S8f=mc7Ai{uxVwVL{)W5!aJRtA;%sc0vd+xdC-lWO7e}r!#e+`}|e+Rym{BQ6A`KR!0 zVW<`Am42{7m>f@^j!3@+iE4{1SMS zycxcjya(P$z6QR8d>uSSz7gI^em^`x{xH0Q{4scv{Fm@P@*+G%{tA3G`8)75`G@c| z7b$h+Yl@+;vJ$*+Zb$usat z&ZWXhsfPQ)4sFG4}youeQ=q7 zMfS^a@CfBkg*T9&29J`T4_{3FRd^$L8+-|Q4?ITxb$BcJT6lu|4tNLo-S8y&W_Ta@ zqwo~@Q}ET~+u>>Qm*H#3N8tVBW%ye1Pv9AHcdh9U>&W+q50D=M-#~sOJWGBud?Wc8 z@Imq~!8emHf#=BM@GayW@I3iS_*U|3;RW(r;oHcw@FDWe@a^P}!i(h3z;}@Ef)A5_ z2;WJ*f1TNnCGun8yU0WE5%TlkyUAnlGI=L_5Bb&bQSzJNd&%#H%X~#L&O8KndB>j@ zo`ieIUw}^}e*^9%-vggSzF)mrpO1VJd@}jx;ePT{;Zw-xz-!1Cz^9U53J;Kf4PH;a z3LYZA4nCWF03Iga1fNI#Q+R~@DR=|<@8D7LSK*7v{|av;{}{f6+&$gwuNe7Z@K*8~ zc!GQmyo3B4xXe=}{c{1lkMb{ur^wsjGOv}Cb0s`Y`Tg)Ui^-Oa3u@BYE`>s{ zkCIo-H2Zxo`GIijVDr2j7n9*G@{`~m@>y`1M@`B(8}6n22KXfMg>WBv3w$#9<#0cF zFMJC5mGBz!tKn10`{4od_3(P~jqnipkKwb)pN5CYpNG#Q|1&&7{vN!6{9o`W`TilZ zzZa8Fg3G*gvLBCuFQNP|z+>d~@K*9O;0f{wyo3D9@Fe+V@ILZxc#6CazMA|hc$)lL z_!{zC;Qi#^gRdpu1kaE^0$)e|Yxn^9AK@Fw{{qjF{{y~}+&v59Kl!2X&E&_zbL3xu zZy^uC^W<~kTgm6c3*=vcZzI1PK19A8zMcFV@FMwj@Ezng!iULkf$t>09bO{;0elyE z9zH_;EBJ2mXW?b?Kfw2pzY8BFw@$4+VR(W3E%-L__u)h2AHuhjkHU-OpTc*L?>F1@ zpJDRP!grD%3NMi#1>Z$}9DIa)DttG25MCyq3*SS&2tG>Q1m8>E2Dc6wKmMl zqG`tv`B&ld$Ybybc^ABa z{2TBn`3>;JRy-k>}y9NKpgAbDT zz&DexhUdtygKr_f37#jv6~2}HZg_$Ge)u->E$|`o$Kl(_e+e&=55sqmzXu;C{|LU5 zyn3GLKPB?R;Je6AgpZJi;JeAsgO|xKh3_Fx!bi!kf$t^10d5^Se*C``?jrvI+(Vv& zPb7Z=?j?T?K8gHYxR2a@wyED_@>#A^#$LD*1ePfP4wOp1cztB3}ic zP5v!-n0!5a9(fiXA^!=yf&3|Wl)MOEO#Ujok$eQcg#4fI7c zzYE_;{%`mo`Deal_Sa@|A3R5X9DECT9XwAy8@`qN9C(5JLijfFW$+>LRq*ZPYvD!m z@4_*Jn}YpgnR|Of&82BDEW8bi^=bVHo$lkj2kA^1-6BD_TY2ly`Xm*FGiZ^L(!m*Hjd zf5P{W?|Z)Kx1;2rgYP9j3U2wvkN?NQUF0XiJ>*m2a{saYRdMz_5^yi&&w$H)$s~Uc z+(-H6!Y7k2g8Rw80-r*@3|>Rt1)oa(fA9eLx8e2VH^D>XH^XO>-wF?tZ-CDu{{cKg z{s3I=!zS&Shes*@N%&&&U&9;8e-B?m{t7%s{yMysd^bEn{t>)`{8M<6+}&XMYajUm zaJi41w8LTW)s%k>JWYNqd=2?Y@P6_Dd@cEz@C^C6@O9)1-~;4efo~wc44x%#fo~*_ z!w1Q~2H#BH4bPFUfNvpR4bPKb1K&!1ExbUUfo~&U4<91m0N+l&5nd#}559vu2OlPX z7`~JI=kOBwHux^`XW%2`&%t+-zXUInzXsn!z8gMDz6ZXS{NHfv@bTk+)qJz;BKN>O zA-@{lK)wbZCBF&2nEW<)Bl#WhCFDPZ$H;T=R`NVNLH;DXgM2$Y zN&X_dkNhQgio670P5w4KP5vHy4f!a%pM0MS%<;08yc(V%_rlka9}XWNKN7xy{AhTV zdDBdaVVf-hRsWz^9OZ23|w{S@=}) zBj5pYKfIp&1bB!%0G~}h10E)y4WCCIhDXTf!5hfWgGb5d!{xrR(w>Xpjg)^ed&SP&2gqN7Zy^6OJWKv2d?We$@ImsA;G4<+1<#T1A2r9_7V?APd2%0oE4d$DAU_Gd zjl3Q{ME*ticJi~~Me_OZ9po3nhsiI6?<8-9m&m)}yU4!|A0b~0-%Wlqyi7g--$R~- zkCJbO?F84i_ao|a~>&Wrvg>7&T`E&4z` zYWQOE>*0;$8Tbech z`Lpm5@)zN|$zOq&$xHA(^@@EEyOZMHW-?tv%Cz3>#d zAD$);!28KV@Ckjs5xljN4Z@KFC!AUL-HThslfZ5_t(eLSBZK$*s?r_8%qp!sYxX z{oD`t;5;K9fXjJLJPh|yeiSa}L&=Z9YbZYnm-D3Lr{N*W&%(pxIe3J;0GIQvlwX23 zQoc3Ov|Eha3r~>y;YsoUJVhRcr^%!6e)1SRL!N{Wkf-5U@(g^CJPXf}=iqtr0=z(8 zf)9~f2blIOlAjD8CO;2eBL5+Lgk0{=Q6{$zME@uE!Yy3aNPh^xJ><1;FL@a5Bag!U z*gVK^}l7$;0pz zc?_N=Ps01jGw=*~7Ct~;fM>~z@ImqtJV#!J=gF;uO}iDyz3?G&KfFjDfDe<0;U)4Y ze1tp(FOw(XqvUD0T)#_y%fLOj{uR%{z2rH#kNjb{pS%dKAuq!N;c4>U!~4lg@C^Ce@B#8NJWKwgLri-PlAjCD zkuQVi$-e3L^lFPgy!{lE44!lJEW%vkr1H4S0fsc|u0+;u5($D30^74L8 zya&Hal=pMuSHXRFKP2vj%lka>B)o?5e+rlPf08f1JC*l;;tTLQ8F~LFegZr~GWK12Qv@(0Kd@R@#|CHKPz z$(!Ig@+3S@F5izVkXPgTD?{Wbz>DO+L;1tx5#*Q1lkgGp)$lU8eD7+M{1g10)x!I1 z+3yG7^LGz<2<|2S>`|tjedJG|K7R5ESZ@uvA08l|4iAwh;9>IH;Suut;8F6k@%e8f z`Tp3h82O*z3G%w5O*lzb zG4i?^lb;~J2%aQg1y7OR0Z)_v9Ntep3eS+seaQ#N=U{uYa_9bBLEcvtWLGoAOIr7)xdGZh81@e#KL*z%H zeTwAM;lt!_!b{{6>P$O~kT=51Q~A^m?P+(RzkBlVKUQGXx#RMg*3em=a0yayg2zY!iH-vken%lD!ql6)ARBL8%;DL+kq@P)?v$(Nv<4EdGt0do2NVU~Ok z@(0OZTx8apBmWmXPd)|pFOWy!L*#4VMe>K?!{qP7OXSC+eMZP{zsS_TOrC|0l9#?> z^5ySx(*JiN--ExiiGK|DlAn9ADaS|N4fm6;hu4r7-~sY?QO^*0)mP1W!{l$kBjnyC zCO=AkGQ5#I3XhSyE;HpM$OG^s`9gS#JONLW-vsX`e+Zr-FTe-LJx!*bS@Ix!kbEvY zN8S$4lMliRJ)8v1F_mh|58S;O?2goOOnEGVNL-0ZJFg!izY3lv{}#NT{6=_& zd>wp%{0?}Q{BHOl`6hUd{6To0{84y;{1@;c@?XM>k&_ANfSMpZs(18uFvy0rC^zA@Zs4FnJw3LVh|tNFdvLzXlOK%pPJ#S5_z-ymyhxsa50kHlm&gaLkUtL(kdMGac$EAZcq94S@EG~W z@C5mRSD5-F$;0pz`D^er`My1-oPP47;TiJt;REC=;aT#V;Dh8(!gJ&+aD3&-*T4(p zhvE1dBCm%R$v=V*lm8LNV~ISl!nDr_`GxQ@`6l=%`I?j|$2!D3O8?KnJ>*5Wm%Ie` zkz1=wxqfmlyoTHl50D4oA@VRhO#aOOne|4<{|b+ie++LVzj(DNCq}*!o*=&g^+}Td z{Yq0#iu`D-H%)#zyr2BX@C^B6)MtRa7M>-KecjY&ko+2Wjywy`lRpVBkiQEbBJaM+ zthY%17V?M5TaaHO&%j5>^YAkHtMF0sVYoHP)JyvRzTYs*9&#^SzLzTbr@?)czYy*x zkHKrm*T4hhBk&OUzG+j>FnKLJLf!$7l4s$Ke$fS1W1fRB>@8E$>fY=`vcf5ScG-s?=Be6LyZr^9`ee-YeI{!Mrd`6hUP z{26$N-1?TOPni63@CbPmJWAdRZzR739wX1f6Xbt@%lEsbeM;~Y<%jxB{nO+N;Qiz= zc!vCX_yGCc@GN-_K1lxX^`<^K@>Y1B+ygI=pA8=(UkWdh7vaO?|Ad#w5B|2P=LoqU zUM4^G29rNZz7zS@q2_tnU#sCB^2gy`@|WR0@-WuxCtnG#Ay2~t9wxsP z9wGlXJW3veHR3-Ap2DL0w&2gt94XUQ}0 zLGrrqm~wLDUxDYzd*B7~419=u5MCtz1$>yi2rrSp3?CtX3tlEaI%BqLl>AJ%b(ncx z`u~^U9`c27`Td9FN4{%b@1y*$!u{l3@EY=4;Q{h2JVgE!JWO7ON67cT+0-*i?uR#$ zXW=pO=sHu5{H{gX;fHYfU5j|bdXt~xa^Pw5r%+Bm`Rniu`2i?rfIK;1)|(}tf4lKP z@+;su@-#e89=^krQy_mBK1BX9yh!f3)08tzehR!qekpu}{5p7($Oqsd^0^z#dc)-3hDXRt_n7=B z`Frq2@ zLGn#MGV9HeZ%2NfJTPeT3*_g(hse9&Me^@py~E^%`%L*I^4$H#N66oJ*m#-z_(zP7 zk{|x4aqDpNDEsSOl}HeaC67E{+(*6w?kC>}uOWXB9w6Th50OuL(5yF1{>7Ye z`Td-1*Jbc1?&y#P37syB8L*(v)S#Od2IQTGm7+xa(5`2U_3NMrIf{&743%8E6 z?0>Q!%Wx0*8Bdx#FL?~^BkzR!$sdE)kQd(er56t^LW&Tz1 zx8PAK|H$8%`pbN(l7BK>=1mo^hbO3AkV?G z7xD|_`))Vo50TG>7s=D`Ve%}zM7|3?LSFx@S#Ozq5qy;V z4!Cucd7bRv0^CDx{m$fh$)j)|`6{@dJPofQzXKj1&%#6GKZb|Nx4|RiMR=6F^*OU$ zjpS~4jJyM$Aio-(B!3Q`BDacWy=ihkyq|nJJVU+^K0tmYJWHN|50Yo$Ir1DlPhNl* z$d7r!Y}XL^oac=f$usa_@>k&{@-WIDA#Z_~$=AR~$$tX3jyCm@{{KAOL%s*@CHMZ` zyxvD1f&0m$@EY=Ozysu);34uS;bHP3JVL$)9wnc+!_>c#+zXG99|KR2uYo7Yv+xx8 z+we5G^#@a*e)9S74Ec{DNb z_%Qho;U)56_y~C!UM4?l*wkl~{A9RwjCo%A|D|vbc@pj=AAtMFx4`}6vtBamt0DKp z1LXI@L*!+6n0)ffru+zbGdxOuk^FbakC7jY`~-O#o+Q6;rzt;0{tM)%$&W{V zKY0Y6Ay2{w$OqwB@`VL$&Zjn;ZgF*Z<_o@^2d-LBX=V|LGFVm$qVolc@dr_FT?xEy>D6ezYO`5 zw~Y^wAMuXyEO`UU86@w3=g1Q%KTn>57swxn50SqMFOr`$V%h(O$#=s`)TfdBI;=NF{vbR-9(~W$KS{n0o+94^Pm^EwzA2}l{JygB z47v4z@d0u-JWE~!A0+=GJV!nso+ppN3*>9yL*)0si{$sghsksB68S^$5%L${W%7^U zqvZR1Xxhy>);#W`9(4cr!ad}ExR<;P_mS`OH&d>kd!u*Wr!i-j7TW@ya*p6@7~Ac7s=D`Ve;ezlV2kLEqsLhMR=L~ zF8C<<({SrJ(;m|Q_pdVR^^p7FUh16Pmq`3N%A>vQ+|p(15cBG2=6C<9G)S!_BG`Xke>w4lFx?^lE>gV z@)A5xeuT%Yw?KXZe2BaaUL@~<50kgTOXT;$N5~8CGIA0`BY7P>M!p!HApbf% zNq#*%MZO-MCNIGI$&2s|`NRWFI}DJ&bCB^Yx!-Giko;_Tjywv_lizc&DW^dGUE~ju z&qRKaJO&>oPr*y%xzCyPj*tfqHC`rfgpZPU!>!}T_x}vsL;fJ#Oa2(#NB$DrPwqX; z)U$>>>@yx9Uk?wF{}>)7FTx|_CmwFfkCM-UHUySwk zlRpj5kWV#NNB(Y&@jUrlpK9{MS}7!}X?|6nS8V z@ih5Dct3eBJVU-0K0qFrY0A%%cfbe9_Yax;9C-$wCojPZ(nUUh*W$@sS5+oAUkS&F~uX6g)uw zIy^*vz!y#VVe$YxLVgQ8N}h!`lD`a(k$cZD>rIfK2Tzix;VJS>@HBY|-cNq~nP$Bi z@>Agh|Bi{helRphFkVnrm>m4G$30@>G!iUKxoNvl0k^A5yRQR5!+YZ{Gv$paS}_mMw(k#RryLko@9kRQLucz}GrFB=b$ zPeA!$^8Z7Ag!}`vPn5g`?bAs9F+4{8JG5JZ{9|~M{0kSD`lrZ`Twpv+egWFQpZra1 zSBCsdwC4bMD?CenBieb8{7HC@{5OkDJ@e!v*zX1MGqGQW$RC6k$q%^Lls`<~3onsB zg?>0f9=ybqQzl;zA0>YpZhc{V|3Bp`rW_A>8tx^30PZ8-2=|jmziP^_A+K3tJV1Ua zJVbsQJWT#Kc!WH1sVP57{xH0e{8f02y#6v%PJ;Zq@FaNwo+9@*nR3$PUxxRS?}lf{ z```oQu4YqymOKm}B#*&!JBnk-x(A-JFXPw*P@zrX|Ji`q>2A@UA* znEdPT2>D91bCmpKv}YsvDQM3ac?zB&Uxao}l7}xh^-q!a!PDfM;Qi!9c!qpohbe!6 zJlSPDOTJ&P@j>!g@ErNA@H}}IULZfK&y+tzKCsewk^FVkbC~>)Zj)akuf4+f2>F3M z#>?cr@KN&DQGe@{@%`UI{XOJs;9l}S!F}XsVtf7M$&{&Q4f$*E0Qr0H5c!lVO*vum z&-|b92>BJOjYr9sf5Uhq`H$c+@}I*KZO&j0;55a!%ke>$klHUmTkuSl1^pjumO|#w_a`zhJ0rKRk9QjMvoAu_&AOE)T0(tLR<3r?c-e|l?emKe>CchY7BJYNeklzL`lm8e# zO8y?|Z=E{6|9eq?5BWCK-%D=YWVXvkeiqzMe*1S!ehv9Vt_=AIe1QBDc$T~#^&cd^ z3Z5f>0iGwX#da0QzYQNEFT;!E|AY^dd+#*uQzG}nN63@#GWkmQDESo|O!;yjUA?6L zp8F5DCpiANIO}^RU+%9f`Gd&!QU2@5_mdxfmno-)e98}u2gvV-hsb{h50f`+H04Cd z*P|Vx<)1_nTs@)#Nx_tj*-+OJ|lfLSDeiT_{g4>i^1c zAGuX!3Ybdng@?)g@Wtc-c!E3%UqfDi%l1h<11?jat(2dI50hJNlfQ>N2KQpSrTij% z3V8`0A}_-m$gOI#-Wa(T-be0-_mcfiEV{!V}~L_-gVZJVRcBZzM0n^W@fNOnYu8_rgo$e)t~p0NjJ)L)tA2 zpG+Qw2gqaadE`lWBY7I$L7s)D$#d{^lzRS#ry3>a&I13m+o)!*`Mg;AQeK z+=cO5+9wA0ktg9($usaUc^1ByyZ}#-7vZbPOYjVN8NQL+I@q*Zp4@Ocn5hFF6T+9PY%A0@{906@-loYx%FAoo^t+_ z^1bj~l<$X+k_X@uao&(}!f-!%6kboBgh$BJ@FnCKxST&_y;-=NKgCP%jZ{t@-I>r#$)l5shYiD%$)z7m)FudJqW%lFr_b9pF8AYGLN52? zOOng|_|}li{rKd5b5c*aAKxy@m;24RFuqE@+*fWYx!m8afn4st)_{WW$|zTCIM z!u;EkFZZpOOfL7Qh>^?vAo|GVeh@Mbxs)&W5!gxjavuSiCtUL7J_4>I$M;XUUqF;x z=EGl0F7wRGywFm<%pPiT=JgGb%e=l3a+$w3MlSR8_LIxJyW7cS{@Xp|GC!@yKYqW+{IrwFWq#TK zxy(=7N-p!qZXlO=T=V2IU+XBj%(LqIyk-BBc9wZl>&ayv)F`>kce;jL<`LaUF7t)v z$z}e}?c_3Vr*-W3ddmEn_2e>-Wh=SNGb!^X$@a?pkXtEV=5_QOH-5b`58-TbnGY~Z zF7pAllFNL6GGC3mpZCmiid^PZllexZe3|!b3+2mvW!uSRJ~5fc zL&}l)#P(3WGoRS;rPc%LUO^KpgAWqz%- z?AAVZh2(elQjW}XwT1F!o~vEtGT)SSBDF)6DSr~V%o9~ZF7rgqCYO1iqU18~Q$M-P z?mhF;xoF>+cucx)Isb>v&3_hE@1W%C5yhf|ZWnLrsJ*?D6<~7<#`7*DO{619j zWqu*oNmT!drv5&1nO`VIF7x*Ek;}Y21LQIfkNnLc^*?4^8}_r`nj_U&I!2nHNI7H!kfU z^Fr*Te3=)*HEsNM$-EGY$z>jf1i8$^uz`K1X;1l{t<*>6J(zSVt#_8mpG_|F63F*C zr5u?zK)#15F7pP+_aq(vqA7nbl`p^FpMuY&Bwv1~-#{+E$L}MT-`#H`m){Y~_tT_& z`Mt0!IKCa^_rDF~^84Hkil9insPxk3Ta_ZwoF%96tkjI9)iNfMeKj{3!*sE*^mh0n#K)aQ>_ zzL>m(vgCV8Qa*k@Vm(jg z%h$}`BFEPxtxw1|V_CkxB;`K=KVA=D>YwM;n{X$W=otjDT;UiFKrr>eG9{j%y;Rllwps`^dUZ>x4xy;wC|^-|T#RXeNxR8^{a zz3PpsH>=*Ndb?_*>MvD)t$MHO{i<@+hgEy3KB^k6`nYOu)xWFKuB%s{Y=-QZg5y3uu$>pQND>$|R-UAMT_xz@XGb=~f|!*!=?gX?>)yIkLQ zWnFi>e&E{Z`l0Jy*CyAX>qoBpT=%;+yB=^o==!lM=lY53r>=)wTU-yj9&tVD%DaB% zdd&56*H+i#u7c}H*Hf;iUE5s0bp6WpYuAwLH?H5ho^fq=J?r|NtLXZJ>qXZeT`##_ zalPvLlj}8C$@QM=eb)!Bzq$6f{_gt7^$*vm>z}TVU7xu2y8h+*x9d|^+MRKK)BS<_ zPwp4o-*eyPzT5qMciDZX`>*Z?-0!&y?j7zQxL`q`+fIz_ip#F`-kq^-C6f9-6i+y?mxT#?taJp7x!)MTit(i54iWZ zKX$Kkf9T%j{-b-N`$hM&?w8%ac0c3(xBDsgi2Eb=tL{PfgYF-@f8l=I{V(???mOHY z-1oSDy|Ma-)%R9!svfNV&Azv|w^v#1y-f?w zY3jPt>W%j`t!VCPO7^sO_q6w|vX(LEjHT^e%{{C1s}S|}^|T~cS)K7t{h)kqb8ma^ z!gzD5DWNCc*4)z9))T*CdAzG-m9?}j*%WVUYj0_{7h4kXmdl%3dsK1HqZj;5CGF160)_AU+0t*zssN3FO?tu5Y}>{ZX(izd_sw{&+b z@9aX^&Vnfw&zKUipkLFy^lMFR`Zevn(Vq6s=8i?}oyiWA(HrmTZSQMeq1sC)LX&+x zP5=3fF08$)t-Y(gFRl{xT2*^@HFxSI-PoPYs(n|rceP?!KUG=kNUB%MQ)&+_!{Yqt zq9(nW>P5P3lkF?I`#PIbR!6e8slByXhq~a-EX4)w$IUl4_x^y)%A+dYsl8U%Gr*Q}fcLJ@FNm>NQ<`O?}NvJL1jDt%YYt7c5-t zEb4N4`jsUwo|S z?lg8;SK7Q_X-{)kOTvCx1-rUi<2Logld9WV%X?MNUaF(^t`%|hpm$SGTs4S_?OhY^ z>`t03QhUp80rUqf=0aI?CF=vuEZfbi`g~t|cUL7tb$l$ecd0`{ zzi`olMTq8~8%6Y`3+E!z>+g+swyQ%=ZA5P+M#a>ww=1lwrNi+@siltArt!zAz4LTt zFY4B$3f0TgTDm(s<0>$t#=>}uUeFtcI!xF*`$^ikSt zr(9qk`}U$aV)c>PtNK=p3G{|t;AA&AkvRbE$|2MnQ|b7o^s&o0!h5=wb+q^P^~w?7 z(cNN}%`smYk4*`@tOvufhOuER>5Ayxxia3qETLCq4-jU2(Y?pCWUr;RMRyZj{a$-R z%&}@Zi&1kvX>V)li1+qdNp(Ocd%9cfSRIZC#~#of%_>i~nW<1yivxPi<52hO-lW=* zs;+1))z7*+R>ajHlHYE-4!`_|t7=H%5YokdktpR#%_bO~A1y+UI9#j>C(uJ?X(PjjbK91Hd-6R{qh zdUfwpFYC2TV=QmcgF)rAr;kC^()Rdo;!2)bwwv38*!gBb?@l#T>f==vphm;?W_@~B z(p0&9-92$UV-FS1((v2+# zAZk}P=_?P@VCv+BB~|gtf-YDc1?~ELUn#O8raRc9l<`cu86m&Cf8T8$!^sK-Ant_Mdn50Q4LILIFCbnbS)8M%(kyb z^eL~WCDCJdxt>H*hq|8au@7EnL7i5X#{2rfX7knPVP0Z3N?rY^(GVF#x-YA;ma9uP zr(m<7cVo1ty+yg|L+w|_v0#QuEa+ngp+57gU8}Zwsd~xSkyo9wd+dV(L!P}gcBfPO zSwGR%o{G2XSjMQ9bH<7us?{Z$BsBGQt81?@i!E4E7xP`cZE@8j2(Dow~X@RR7uMP_;XBZc-h%rq5rbmgA|U)nbnsI)9nkO-aihgq$S|lg@I|3}5<+ zwsm=DQo5{t3bH}%(H7;QwQ z>|ivOvsgJ{IP@Q#!Y*GoqSH-m(N`D$MeU2g|IAc7Nu6veZmt%bmFiGs&8dT+D2gsD8C z4r@I`>JhMN#$+O20F%~;l3G3F`Jc6Id^@9WlY6!aB_WrjsrGMD=H6Y8LAR&NvKbyznR)sr1+ zG}Z0XlIU$;)@8pd(5p0WudUXOZuRcdYP0{ZD&C~`(yYd0Sc*cDb6|FWo?y0WA$ zkejW!tkYEY|> zHybcVwQ6V6+01E0E$Is*{f=5~o*k=VBs4>dUeaTgxmJ)Rwc57j9UT@<7A^7i4y#GO zHCCU2v?MNXYHL<7t)X{idtXapn*DBiny#UGW7QE?mzj1gRK?ZRtzN=YaFqm8N4OeK z^%(YHRCI z*KGEa=J@GpR*SlfF^j4jB{ZwgQ<8R|_f?NcQxAGcZM6C(6@hf=W{-TXpf*qkEPXU4+DTW5B0%bgbyqqk}oxBrc}?yj<<&n)WGyIeJrX0VpYMSzW#$KN4>v&w;#1raWx4K$1-9zf~6g42%mz}l-Wtk1DO%Cc#mI=PHljM^7g4%nB+de}1`0n5es z7_l#O$1E>b*P(V-k>km39`k9G8Y7pPU8xRSv!EN+S^fAQAG4^RRY#k8q1qcJ(4?>C93HcvKIu`LtNVAa`dCrD$b29;eo1%P%F`-; zJd9t`g;$bgkOt|hs4I?Edq3HMI!p9*w_0tgG3;$u1F(5NZVpRlNo`GUOOv^fjknsn zM(q{#!A!ThQc$2j=x@#g&PNN4XdCst={CsvvIvkiM$HIw@6#qP1{69+jo)U~3zZdZS_Y3gWSI<3Xt zFx9F{rFoZ%;FAt*nz{hikEUy@PtVoISo*3Z-q-BBl{8D{%2f3i^{GlT z2GX8xd%<~1^@lMaOS&cX0cby^PJb#?{XQ8~P2JP1c0v@9&gp3GT-w@f*H&L)VNw4% zZ|Mt=1 z=ANgo(InKPc6;xlc;C5|RW~-AYp+^A>Q(DU(=Ix)n@b0JU)YzY3(m3hpLoUs64rh4dUX|oSF9ZL(&wO61z$hrDz zVU8-QyR}I@PHQ+TdT!l}=}oinaoe=uEGMi)!H|QMC^*x>N)(*oU?mDpcd!x#>m95_ z!8!-+=zqS`npRuuWCknYm?&6zeoW|KZNLeGl~9>E#-_FO_Ju0VqeFcNtLAaSN)!w^ zSc!r&9jrvb84gyW;B*HoQLx^@N))VfuoBhQIvA{kW1?W?`7xn`wE-s#Rzhv)8#5~# z?}W3QC>V0WN)(*wU?mF9aIg{ur#o1Qg7pqoqF|kam8iDX!C)mE69p^Jj|m;D4LG3= zu*EYfTkM3hoG7Tic!%y#iGnj7tVF>X4pySzbO$R@u-?H+6s&Ww64ll^7}Q~;0y;VQE^8A?4!Prh}CzIK#n8G~Kaay%ScVV4Z`NsJ7O@U?m(A z1uM^w2_38rIAO37YC}WURvKDD)zAoanrALmt0sJfhJU2P?tQRk@Imr__IteaWuXeF#wI~%$B0F#%govlOcY$u%MM8S{~ zR-)ic2P;utddKuxO%kdTf`qDfAk-ZNVQpPV!n&Xn>h2>6Gn`QOB+a{Rl?fPbVpSWl?2s8C7kYr>ZIamtrM!V zilZ~@C9JK4x??*Pb3)y*WfiJpOF|`7BaEXnolp%iqIK#Zke5}$I&~00gOyMp52BT@ zw$9PIS|<$73OczVC)CFdO3=rSvtlOD1w&3)iGnj7tVF6VQc@)fPIs^p1?wHGM8P@-D^YE&gTYETHmW=y91}`KY6BG< z6FP^!dLI#-rc*E)2TWM2F2E4hsY6dfb?8Z`jyHt*&_g&YB$0Y=BH>IYs+~~@)j=vn zse=@uK1fB?K`L4a_3L5j^k5`2Hc$EZoyh=FT3H6~X>O}g`6;y{V zLVa?PP#wAwszX|mRxldOKv5s3sf{zFA3^;OTs#Jn9Iv5p+4e8D`A~F z;-UKBN2t$gl3NMYm6W3aC)7iNyiAP)^0G>(M+ZqzLxLn!LOnV__2?kstXc{6Kp`)y zgz8-9=!{CJh7aWG;X__l34@ieHs~bi@kMgg_<~R!+!E@cM#@!#isV*8J=92o8fqk= z64uo@8k`l71T_H3t14k_C9G3pk(5;l^|he9YC#K5IC@yVOEh0FTj5Q)2qJ2K2Nc z`u94fR+dc1V}1Tuv;NQGb@EV_^~wwIgsfj4uTb-O==%T1>wj#vROVTha-}$VJV4FU zqBC{f#{R4Msd;^NEUH*<>)3xD_4@y|{l%I4+G#TXwBCN*BC=jg3uJ9qzqi(FlHc#y zFH-*-!uq=~kBqpfm3fV}KOA6U?gQcHOr~F6h(~ER;i7u|f2)7ybW{Hr5_SFeQ~z=O zpI7r1=rwWs$FTmedT#7LdA%PvRW*ui)7ZQ$UVrTu#y>lL$+GnC(Aac2$A4n>Xt#T8 zssEY#Hrj7|mSwHOQME#TD2N1J*X#eI{mN*+3|^<(??CmRY`^UP$^T>f_dm__w06vw zh+_U@TkrTEukSs_yguiUcLUm?f*0;zzyGLGIjkAR{wGROX`P#x=jKm&H4W; zOU?T4TI7%&Nc+j-B(;4KkIh{5hpw~T$MwHS zy;zsY^`G^QS$~arx$}QnzdZgxb$p4PBo#E{^3^){pF$_$4 z{r``>_l}RMSmTG!%sFRvv%5)lCm}2lWYr*%8j27QH9^pgqJ$=~hBQbt%@m3?N{tc4 zj^!$L^jff9ELX7tV!@6bJ55DY#0J0bGjq=F33z|+`^Wp&`;iYj=lhg-rakk_oH-}E z^wnVdmcQ+P_|H=3i>p)i=@_?s_qrnk>)-gj4KUq?Px9Ygx}?!gekz~-x%o6@7#pyD z?o)&kEl|*I53Y+Rj~m!9C>G0$CI4xx)8WI0DM9{V9Lp&* zJ#gW;@yBqMtPwMg+^>FAda?7H5QGaTLE0Uf#hVGw+q7riZk~Si>XToXF)+Q?eBv4D zy~Y|wykim7H@;wXOQ<0I@z-~z_kC_>dc=4ky;mD4O^&z!5$||b>+Ed_D|7KR^V~+B z+R0#nF?Dh=a=3*SJjPIN>q+q?k5Gn=t5#vg&3m53+dq4PdQ|DnU)?e^-tm+wqGBFt z#Fu2g1a)KZE~OCfP{qZcpbFvVBc6@7`?vAI-?eX!&wJ5->gk>;ES*|-5>;8{b6UON zVq_YxYv7i%U~fxE=@hL|V~7g5S)4jg@>X_y`>y{_>U(P88Q$8a_cExy?e7-0@A6c7 zXL?voEb6)ooW_IapOHT8tr_V9-<(~8k$MdT2J1~QUTG~k=cI!9-?gO0J38pgl#43f z8{0ALilPb(XV_YceCwe0Tx*|mddHV^p*}==pP>O5+y3L=)vD#BR3qQ zivo;-w!e7mAg4}iXZ0Su8U{kzz~SR_!s!c+MzF%jMo%p~t?=~1GYU&je?esuJJb7b z-j=Q#zuNWGaUFNv0iPM){;O({Dz?DCxiytIu%s(O1g3=Raq061Vor@)a$XLLFKNl~ zLp-+q_rdE_?)j_J=g-)?cW?XH91Go=KL5X@yWp$z%eJ7;#_tOYGSwO5_UzqT)NwP7Yf;Cw%J0yhd&jnaKJRn$8S0SuyuD`AiG}mN z`g8EE__JW(-;Se_#lfHA6}1mr@%GW%2>4wPazR*uc`sW> zx@SJz$*hiN75yJ}@}TNJw*Ii?X6P1nETk{ZU$8p;vO`d@vF(41Uvlo=_`DbPjBEd^ zaNgHu(Y$Z})MGfzTfG9b%yHa^wb`)}UvdJAS8Rxnd^g_yTKbZA(I^bJAB$Am=tGUx zP5TaSJ4Sb$Gt1Du*bExRjP%^+(1{l;R|BnvoLKRBf0#`Z31L)Jdyrwg8t*A;yq$4Y zWBR6&(RdU06;NZWbmTP3czq$PfMRM?+?~GVAl&Qef}Ykw2h7!=?k)z&f_Y; zyD|Kzczfu*EgX{ePv?EJC;scFDtppPw)HORctB-oKkr?m?YsyxT6)Eo^v{aVdx^*A zJ&(^{tmPUiq2*mAZvEVo!@uoqRqLsR6t57i+FvVbe_zMhj_W93sAcGNXW|vMzlddM z^a*Hf&v?iAaLak5<1R$w+xIAI+q%a)rW%;Jn79a`W7~HnhjwiHCJI<8TqS)-^`8o! zSW&Uw>iRhGv*d*Kmy6n8Yk#->r=s>hJH^prilcFI6#@kWR1Nf+)|yq+F+azNs7@#u z_}r{R#|_?_v~u{^oZ|Ea0jzIh+jk?LmU!YRg3|b$-1gd>a8bql9Mx1ryJ%s@eK|C? z)=RmKMWnb zsUT69v%rsU|6cd&0W@g}k}>hyj+UITr*AJgFDIR(;SGH(9f))JaN z(eX>FRTbj83S-;1dTQ}4LKRgYUi948CKmJY?ORp3aTF7e>n#A)`>n#gSLYPqc3~_P zNOlWQVrU~~q*{?@q)&NnXJLBy>YTNh?uCyt)MP{Yq5)WDiqI3vT|36-AnJxQX+o+@ zJJZiVFs6ul^7HWutZ?Xj>y>!NX*p4vK~d~}RXtF@%y};`6%o+Zk5FiD8uy)J6NbX- zn~Aox(INu3$R{xYb!Vb1BBrTs$VYS9KUB6#19CGj%)O=a>y zT8C8IJ21H^psSS_4gDK`f@7%~ZCRtcPWh;XO=HO#^3kpE?v3g5mccR>qxsaoSkl#& zprtB4@{N|A)Gll<2fonC&;6SG9Ch7|N%AMP?>;qXkp3`xT@eBc#Sg6VOK9=ijfT+Y zca$}HD+(LEm3(FXYz!-M?3s1lmW?QF+~8eXHsHE{-)@Qg0nNhnfm_lSU7_lQt-;72 zTh478J;Z4JF+TE_mhGtB=wD&&57h26)DAVv{QFR*m52!j@lyJx7ynxK-vS6bCY~L zv6iY>L}Xe*EsjPY4j@P-)yB==)zXE$oqStqVm5B+{yWy-|FA6*S8|x?esqvIKZkxM zhvrK>z3*CQn@@Qu2Cd{O_qIjql3bl;EZyg3sTB*HzS+VJVH!FRgQadB*3Pm9ug1+D z-9{X9&e)C)wVzsdK~ucrDsnmU3z|*aqDkxNy$Xnreb#U6f`Yd50(*^C^#8!IYj-z& zyKQL4RkZFbc+iT({Qbhs+foLv+h(hP1#iC^ zRiXZJ|Lr(Rqt4f=*Ip}hG*-Ks6gTkiLY3l*_dW4WKK=@LRBSB%##U>^koAB z)ZeL8#?-BQtgI!b{=g&FyE5Q>^@*FWs9yaUNsRuEEJlAl7VACJs~;N>OZ}qrSrDc(~hSeA@7#UtGEcpS$sS5TCd4*@91ZjOqk@ zuEOUwd>+DwesymvKEL6^&=1}48H7(WK9(WaR7*sx+u77x3`?Z2V#6vp9=zkr*kr4$ z+z~XM3)Z<`GVs1+U$ai!h2R?2xff8@9qdmA%|F@YCR8ssuQDCggkUiz?LXOGM*0u( zhdEuBn-7`D_mH{TLcZ1bzAcqceeV_+FX8L9979TT3N)X$*cp(o!Ntix5!@Fnc9QzO zE~rnu1@g7TSgZ3-L=zJwJ%<_^)_vxyX5eP@9R1sIl=Z4P-(uzXma(N4D?{>_<&{2W zJxlBtVUCpxJ6ywO+7Mrx)xswyymeyDg1sr{q&0zs*Kv*4S^-g}y!u zm$&iFUATNQkxgB*Xd=`FY+gFmRio>uutD!Dsue z>wORS*hFis?;1ZVhKYp%k}eE993biLz~wb~B7RPe#K zSdWU;0`k>j9c)_GI@kvJy;$!jQW=HT!oZRM*h>Phhlu@p=*;cH@X25zCp_lK;5$Jmy%YR6 zh%6rmw+5lKHMpCo-PGx2*3}`j2mbP&?_;w5v2Qb3-|5>$RGWW3nSIRv1eNu2@KwtA zYH%Z&`6BoYQ9FV^QxSKD?g_DS!)i;rI}Pr3ciQ)9m>b`x?MidzMqAqQG&aRrp0*Qi zXYJI2DHxZwv>VdUK{urRoW@G6pS6HyLtENyY3T6V$l?@O{3Q+j{)?7Rg8bgJ9ck<| zYX>+qt}my(4m-|us$nfn-;j=)Y)HR646Vz<*M+s?Ul+bQo1Ny!r$GLFI@L5?$*0_6 zT^D{k4945x2Q&EWOzXjn4>DlpgN*yLh`c}R(Ja*F(X4x;MBW>HrW>Tsbo;Cak)QRr zC>!KO*_US%d3pBL*(j7+scJJ(mv)j{8iK%e;akIK)~(^EBYbw)dOGrQ1m<6k?CDD6 zp04*sA-y;HNjD-t>9(so$X(sZeAqQleWlD#g83iQ;nF|q#!Mpf-$lUqF7iPJDgwp_ z8L)UdEWX@LGhXg?Z4WT6?V+kl{ivxgMr8#@8VcjnOBhk_iG8T0q{-Q2>x+wmhF4t$V5>#+a zlscjtS`P7x-M4oK_s$*<^dR!H9t*SC6vKKxVg17}@jnbd2kWa1>p4^su>hk6tDu#+ zV(U{Hu3}|Xu^;L2-yRsR&w6~@L&Y1^+l<(#_Ih+A8N4ohtt#-^9-sA~w)a?)P3$E! zz!X&0Co1rPYTm{2W{CoJWj@hGm9vqGd#lI$Jym$EJFvEU{JS~ZQTE2x^S?~AwkS?F~ zxICNc_+ckU#9|n}Hi9OsAiqS_Z;sp*p-HB$m}GxYKUY{!k)M_;uLAW+x8J&hqRwI! zn2@AHLR6NxJ9|)|xE}LLg~3mdR{^CkNjv!zIQehg6X=exhy-QQ@m82JYr1m)$~ z_fQ15C;Rnm1d-RX-=F|6^%m=m><@Z^@j=fIdn$%U^C4&&$Z=mb_3%U4>y?YWk-f1e z)qEpz5dS&wQS2MpJLqy_&y_u?^f$6UfyZK*`6PRLHiG5O?D;)Yn=V-K@3uB$#Y!Z% zSeNv?v8UN|;VmkU(tWh&D?Oq6Hd#i;-b%J6S}S`#N|#4_zTDG1`@&lc7Gb@6XV_-% zrmo?xJ$graNYUK2rR${(KbXXG4D*m9gF&1Fn1H=Cw9>Ipv9pY#472yB;NcL8bP$H& z8^|boLG+w%gF)h_dHF#EQieGo5N8)=oR24K!6Ji4FTk_L&_Je)*nPScWsL52R5$Ep zZDlM?6>x|yAU%VbhXid9*sS9I)$CoAK}0?Zk9bH(CCEb@DaedOJwar4VMQ5zP)3(7 zj4oM;G9c`#$_VNLqX{cPDx+HljE+W*?hFf(<9iNWLIjVeN^A{Mwdo4gQ{@|dQTNey?0c% z*nzl3=wmz8Acfpv9^z21_Ass8w=!3%?A$-FrWw_Hen{-C(Q>1bs zDl$J&q|(D*a5zOOa+K30ia0!=`^S#JDMx$y!lu4BBFLs5Y#2wz**q2{w>4&urF%H0 z_UgIv0bjp5uygc__l;lB40YP8zI{Z|n>+gcnR_%fj;YiT&|9YW34vha{E2(?(t!^3tE zYPD8`ho@kW`7CQ?IG^SVZURiq%E6gIr zQG)ZVD2q%wgy4KD#v)UO5nN#9vdBr32rjhpSfpe+!9`X+i<~l-;9{$QMNV5pu-%HY z$Qkz%yu>PIk?C&{?668$qORecFQu#f>B~~?y%m~2|`DIoki&Xa|c)2x)Mb12d z;8LrNMQTqac!jl?Me1t^UTH05k;d5sudS6ju=U^5QyzPg|RK zfBWu4V_>8rKM_&1f;Ir0l9(k4F{YSpqGR(;9c;agC=PcZfZsKCB?P#>zJ%AJco4e63YrMn1ie z;5sXAMm8-W_=;6*M!r}{aJ^MxM!tH6;H%bjGxE*n1YfhN&B*4x1Yfrr&B)f&7~mV$ z95b@L2f+u;+ z#hxYn3%<)*)ju$KjFJK^0pO_O8TAB2CyL6{uN0y)6H<5Wr> z!v+%m!`f)cI6H#ypZE@Yc^n&0_%Ca-CC9T<3GcCXSn@=6CgHvKR(n~@<`Tw|Y|BY( zF=1x=Z8?SAN0{4TTb{(;C2ZPJTb8gLge^N}%Tw51!nU1j%hOo*-oV1nv*j7=P{KYt z-62bwy*p@Tc^@M|Vi7l(y3c?|Kx-HLS{~?@eSKG3d zy-YaGZnR}RdzWy!J;#=f>?^`yyUmtO>?gtzd$BEB7{>;POMFkioW&x9Gw^Ntat@0T z&a{`?@*FmZa2I@ozC4c|NjMANnJ+J3ClKz6@5`5M>}n6(k^hHvnf^VvOw zyW1OVxsa_Q+ymd_FBh{lgtP5Uw!DPBN4O`xr(a&mb`d_n-eJqjnB51s7rt*_E@kxd zXFO&bLSD%ZCVZgn7xHR0gz!OjSjcNxA>o7VsF2GT{mdE9v13Bsz)A`CwsVENiPaN6 z#Lg4)WfnUWxR0GL_)t48{G&d_{{+MA^VQ-V0*EUA2a&dFFwRx zD&(gu*cW)Hy-dhWtUKXh_HrS=V22Vu%w8enS1h0KaC@bY->_o|kFZw>xtX0rINx3^ zvGlY+@Hw*bQdyVjs_6{L; zv5yHKW$zYpH`_+Iz&3pHclJBsLfh|?f3lQ*z+>#NPwrt+!bjUtpM;q3SUcvEoYPN< z@o{#pPg=Z`@G*9tPYPa7_*gsNC;j|*GK?45ai0wF8wnq07yD!yf0FR= zc8O1h`8vYm?dd)#IsKFvKf$i{$xQw&;S=pfpUmRB2v4x*_+*s#>JMCOxA|muK9KN4 zd$CVu^WzNQDfUvI?8zq+o@Oue$pbiTeEBK%a-Zy_@u~J5J{i;aG<$_l9;or@_I*Bi zkj7`&D}C}{jZ5uEeKJSma(k6e_SU$bkYs8+>w@#}srXpQIFe!o0IkHrEz?3YJs{z5zI zmq%&5$d37CfyRsNT)!;T_!2wMFUM$nsh#haM{9hUUEr5vHC}4R{c@bfSK7sXd5p$a z*(H8?EdLMfX0EZP`(<3?Ywc>kEYkQoyU{O?(|DOZ$1ji9ZNJ`b^ULuX-(b)8%M&#I zm%Z38Pt^Ek`%=H0pz$sCQok(Lc)5MGUryxh6pL=Pm-*!+egygC9rkj+oUC>3vRC-! z6pin;@AJ#48n3Wd`sGP_yza3d^~-4*|J#1dFH1DO&wku5PuBQ;`#*kpiXNi}?Nxqx zs5IKA~Vc` zhl0P$-jE`*HU8D!m?C?c7ZHEAy(vWwH`P4-!`_@CN0=)9{AKS*k@*_$v42dFBQ@S@ z?@W=SH0I)`6nVI*VxuX3PLW+q6+bPpJ4KGxHf>=9WR|J?SqOhXcGcJ?!U1`N)(?tk zKpts+GYs_!iC93Mplzm#+<-h$<22DfASY;?F7g7hSmUr57LXH76>~B~en3vrI8zh^ zG&F+CtlH100S0`g>ydx-LYJVoPd zQ4x@*>byNgWk8;0s&R>l>VQ05xBWoT7?5Y^HXbDA1Z1h^A1vAea=NZhj#wO!Wg7Pu zO9Qf8<6N;UAS*OJR4fn3N{#!96#@C9p1=LX%7CoW{QhE9K+e#3fLI-n^R&)Du{I!Q zYW^UxAt0+Y&J!C0vPRc`sMr*cXKFl5d=-#qX?&R29FVmd4;R}5vd&boafH|rkoB6M zFLnoHgT^Dpp8?sZ@hD*g<=Gk^F07zz()}=6_=B=p<0C{kC|k@Wa5#RXhz8|cjgJzs zpgc#{vryy)<+&OkE%Ji$JdMYR{GdEv<6}fYP+p*MT*QO&LXC?=aZt9ItI7U&oHWYI z%u|O0pCG0Ou{bD~X*^9V4a(~^ zE)mOu@&=7h7R!V3M)L+*M@|tdg7PL)?IlhZD}(Z1=15u}E5)jyyxF{)>N8WU4$9@` zQ-rI<+MvA6{EBdm*btO=n5iRx&lDSj@-8!*@L6J0P_8ih5v~=RgYsT;6yZ9tBPj3F zxL)iI%KNoWgD^t!0kep78ihY3S8AJQi*QIjq;ZpohUCNMY|?2Kv5-lN!$!1tIyA#&bkGB%d~aBAvOSI3%CZbvQ?qgygek&wTLD z71KlVIbF~5M0H3$uXWBBjUoAh#utb=A^D=l7mBu!d`Y*xO)L({mo@()u{0#tXge2+ zWg)rN>`(URiRB^rig`HU`C>&#zN+;Xh?ODvnmLvD3&pCCd_(75Bvyyy2D6g*i^bZI zd|Qvva^@q}*>{#5yec^2UtML1P{Wu8O$CJ{}Q-A2w`fb1ziIvZ#Nt%> zyIDax_lu>e@(;~_KrBm@e`@}NVtK0kOY>KX6{&KM_Wwu3%2Y#a$imZ+50C`;VP+;R zHtIwrJ|I{oFR@Tz41sQ zJm0I=* zmTn~J=SaHo(PpNyM~NYRB*E`UdhjF6F3xegh=Q4pq$fXe-zFF$$CdWtN10*>QDopi zUSQ&}7^os72lGNtPD7kbf^sCi`52T_17rxQf@mhmc}V*3qdgTj#HA#-2Fam(tjCrb zj#L^-LpJY26^`iev;o-po`3pt_Fw-VpssdKi+C`~*+M^%!{^XA0?^j^uED;=X!@Xd>yk zNRHqWJcWBk+GFY#QYLpkiWi&WewQlb6HW0HQPhf~`6N@UbE$EBvMJtosbl#RQ+(}G zMSQ9$esZbf`AMc=-5o0@@M)$sbUuikZF8G;nWt**)y{9IE!=u%hl^DzHi>KcAN=08#IAi0iTu&=RH zZSi|j`4!3a{KCIgQF@MY4?G6R$U$-=Z~NcMi2tNVjrbS8$P^QaqIq!(zt|L|E_ExP zXNo$aW+AzqFYsDap`BW5h^3@LG3HJ_-xN0!Me*ovzR(o+5k+2b4_{=8Cy63I`!`=~ zinT<&iR6CX?lqn0aYJk)m7kG3$S?U@6}7N9t4kEy%Zvk&Jj6Txx3VD$NRMjq2*1=6 zC%V*Qe2FPebE*IE%S>^mOFh9aH^m&HsAW&_rKVU&)a6K?;a8ZMw6)a%+59gKUT-Ji zeMp|;SDKl0kKhPbL%7-%zQC_C#p^^-=fA|SHpRz8(ac!GuQA0|SGJB{Yl_`2wVq#R z3W29LO7k_o%oLeKk!QcbuQ$a(L{SUhn*<_4AiuKPWO~xNH#VampGyXW%ePb4 z4YwpWL@S9dM3TYyQ{K{P88O7wB&Ho!7sj79#qBQHmGS?Y;$fHU#`rU)c+MqzF#as! zKao^wPsUf9;xi(*AnC>Ub8aPcDZi6Q?c*4K-V`a=b7y5B$zl8jSCcmSsUuaT4kh_e zBnLA-z`OKmah$}Hkn~~vMK?R`-N<#L@%K$}0g*HjCNjR!6ibM_4#{N3Kk&9)m9D4eL!|Q*lBtY;xStLM zv{W6{J|xAjkW6FzBX?xAjbB{R$&7z&3JZ@Yv(k{9%J?U)rZ&=xM6_a`&iJQ@e?;aZ zDP{b#{R&sLR8f~gg&|HO?HNeQ7~iy?w)UMi(xGTy!T9Hx^-#fL;vv}|DfTT^UtrDrp~8S9@*HZ#7(6h1r& zRm!c5Z#6|0krYK{Grr9fy@{l1%w>GLDd;^mHB9F+{+%g~CX(uWKI7k;ViJ+3A-Rz8 zANFgt?$%kPL*srC<2y{TfXK^{%wzn={j#WT)%hMEMe_6ojPJz$k4UQKBF29*#jCEg zo$;Sd@ez?`O$M|kjOeK!AHgAJ)lqxWl6)DnGwy++dG=0sPr_XwTP7JZm~MCineqmQypgeJ_3KF)q5G;wis z75jtG$xEY8G7FES%~O{}pJpLKr!9{@qf0w|Mf6!lf!I7_Wpp(=l2GZY=yST<>8qp9 zvrNiS{-PmXg1K(@GC@6;M!Uxc8D3d>i1|2wgy9ai1etqmhY~ZgA7g%>*ah74Kg{f> zw4Y$s^&$nvx;@22gs%Vf#7-h9hJD0%iX~WIkQAgoVLV`oFp)IXKVv*-iC#of zgFa_GWQl=9Qh@%F@l;D3K_s>BYsS+oG2T`Fmhp5;oa&NW7!O+nb zYSH$@rDI%03~UceOm)qeoM&62(j{%qds?EINVs#&5}&xz49;^bvE7w+;k>sc{vguEW74ji zAL2Eg+>+=H&Vi2Vm2RB(vBXd!X@}B-^IS`ijyM)PF&;_UR3tOG2z8yoV?spB)r$_o zZ$vB9V^5Ldk5=;eq#g)It27Em4MF+DWn|$xB#m5T9gr*1qGzgyy&`Nx&(irL{%Ea6 zG8C=TC?g!L*OoG)(FTpW#0>EXEMym4;CT2y}C&Gg4w zHSBJNVzcza)E;IyHe17NGa8$tA943IVR$$m9A_0Ed6N6$tk)BKsc#T-4EqK%Bc?0s z8^Zjt3zT8sP!@_^sNpacjp zYgot{V~=P!hRumRs^QVBE%umdvTrO~9D7{DajZS|9}SOTm&8_Scr5EM#Br#3))XX* zIR0d!*Fv7>JA}n9($;d(Cl_mYDEdS{KJ@iPN6goC?}v`i1LNzDj#!`#4`8{5xE(eR zT*1SBi^VSCyFuZ-awB#*&mIKm1H6hC5cC5sBQ1{TH-56}v;%l3|GM)R40f)<3+*kTwv>dpxCQ*LQhd%D|`|tdu+>`T}17 zQOaO{^bM6KWk@)>L8GCW(Kj_37LC58(P7!qx0M&C4390yV$ro)+9xNv zPM4IM8+}Dhr<6nUqU$xUZ+`SujrtWBLgJ-|v>r%)<$)W!?&3=W)lOprXBkobf>xm3 zAJwmC1sXz8{jyb{DIC?WS_PUjqu;2411-_$x5{+joLF?TM(5^6x2P%v&dZB#)w~Px zquVsPs35vsqxtdZcN$$*9Q|ISr6tiHblxkcM|Ws+RdrN9vJYI-7~QExJaFxt=uaA5 z*B1R*bxdH{;^;3LUEgkq->8{a6v<(xuNUhz%v|LQC)N{uUsUV>mDwjTF?(s4f%PQj!f@blytiKDV z#0IF*@O8z4Gth<8V}s1sso*FUoIK6##+JqgyKq@dJFl-hTOJ!?en`4K*oxRtH2}VB z_OQDc^kk1<(WC8#?*R6w(R~7t+SPLpwvFy|tEl+EiJgA{=ie}$^$U{mCXblCjyLnU zFR>d)!EWFv)f67UZlFNJAa(F}Y>-y3{P;JGr~h`5Df6k#55;aL$W0 z+{Ht&c^du-Kb^1Nnb{3LU7+Eg@Y99*jiNm~H?~N_y*w|rSieVOnEA1G4VhUGyF^27 z#$z37=(uSX8)Eu!w5A5hm1d}W*DK6eD8p$@sEfO&3uXD8om{AED0;bh8`MM5aCE7v zNvIokhm$d;;y&=R9!GME$wylUDc)-0y@KRclaKdqV#zzaH&xmcWmD=^KW7On#Iljv|syng4C_xFt>`vINP4CLd>c zp5-TNL+`3N53|oB?S)7lG5HBr@;P*}+Rnq6J4x|DB#)W=M6V*bx}&p>bQo@I{$uhY zOKc?a3nWjN{22Fc%X2oho8&wnU&LbaWA~HmCqc)l{x}FqS@b}3waLd?0>AgB?_SoK zywDN_L>`A^y~)Q|nW}^j6~zeDnY$)|Zop2l0hWuXv_ks%`3 z1FE~Ck4#=-i5QVI{GXV7fF%YIiC-}^J~R11x7*a_0NPaN+a3{N}ix!u- zIe#?y2z+;0HyCBpx>?51-fU_!H-?gv^k!2Q0IK@~Fk`v>%)J25G22S@pSpvKp8`MuTh;8v+(@#*?He zW^-E@e_HIbLipV|bRtz*KT%daquM#pZyBSgL8H_(IV8n03fwjpDAu5q+mVk=>uwpv zB*_!dE+&zxJys9=o8jB*bX^AeF2P^5i^@i$?u+tw?_yy<>>J`Hn6uBQMo7TfJPN#0n3!pit zQ*-iyy}+Zc$qT^`PN&8WPCLdlN=Z*OR%QShWj=qZs%W~Zs2YfjL@nMQjlY3M!K%zD z?r`8o20k^@0(uNo_v;xrsLM)=s*`OQ?W%Xfs7|}8P6U-uyumVN866a524_YrV~MI* zmjhjtb&zFTN+t()J=jIj9OR&C5AN36LAi%GLe-KiHEc_w{n#0*DH+M8bWJoR3vL^Q zBk4w50H5m%PB-EVqyBU`-NCWKZEf@i)QU;Y*n>Jh4_`^dFI1gRLokJ3;Wq+D!br9w zox;y|q()!{_&tNHgmS5@Q}`@bXoP;}2l%Pw$u2ZPyLr!jc>@AgU`uDcabCD?mnm@cCmmf$GOf@5II5>j9+Nn`2I|sJ~H1 zU*b>IC+SW*uydy+o!xg34Ktf|Eeh$!rrv~$aY&kFd_xVVS^o`rTAy*I@eMgppLB@G z&-#P`=pB_@_?zlY<1lF%HX9Cs%}B)SLzYvFK&jE(Hu&%*OZfoYIp*TaI+tNm}Pv*#*C(5 zoulSWgdtd+rY25*HE~AMAore$8sLGoA2K!Ec{JSp*y%Lh{j4ii8@H%2ADkHTL)l3vHReOqm>WkJBM%#BAwM;2R6Z6T)d!==S^B7IjHGHz)mhJ=tSHOL%SMhEWZ?ms z>dXAR1ROcoGS1PRJ!%MX$@t;JEMp@pRF-r7)QGD+mZxaTleOj1?|@GJYh4k(+JY%)X~!Svk+$ zX^c4XNu+Gr0hX~{2bj?aFxypt8F>_D{|+4p3a~_fuV;TDX8#X5QjEbo*HF#dqtt}i z!P5OlsA+p-a=j}+yY<(882wNneSIXymF599+J^NRec=~4ATG;GZ7&rw9J&fq#17pC0(92mb%i z15?Xe>swl56}4scGh?%=nwo1G>SKe44a^&uH(+q95)K|X*zo=&XN57Sx}mOW(5#x~ z=CUT}51QT3bXId?Sw+>LNwXSitD0MC1~oTT461ExZm6AAHK@F`rnVAPsUnTm`sSLM z_4wV8it4f^qq3p3ytXRItZk^DX*AcIQ&rkx)YP{aN(sL@QrcKEtF);Vs%4dxr4)oROTq8_>u4o(UuPnfLi zl1p?F!>QqO zR3+^quD@vx4PR-?+(y?xg7(@_%w%2kpzF%*t46b+*(uF+jpn2hjXllT))q{1rPhg) zRIF-jE?05_o!FHwyRs9zs@CPhE!E7W1|m02%Ovb1YOHE%X>CfBqnL~9_ zP(7yF0{K4OS696+=@P+su%; z=}I*rW)S63Xs&9lY^Z2xc7j`DlJ+PelqMHMr*@rros~PqK3z1_J8?T_@I;M9Xzm+1 zh__E06IS=(cedMHg$)#(sitLaDO@R$X&?UoHIoyUs1EyN^R77iikqsF{p8ICe&^C= zVP9B=ZCz45!AUAM>D9ie+RG|U&TPOKUroYpARNsycc`_F*pin7|O z!N1+BJfPGV=^p*is)p7ULv8pe zemD$|MnemN0{s@CQi>%t6M}t}>l-Q^r)yCZTe+YDrdSRXu_CQT8(TQ%9I?nVYZ+RmJF}=9yA|Go5hrR^HI87f1&ubJHCf zMefAXqe|M3t20!WHJ6S#rr2<S}K` zk4~qIdQC`Jhgy=8RIF{7*~xmcMW~S@OlsFPch;u5Bua3Ent@1HSvtPhaIPNa3B{8& z7r?`&nXi-+vtCiy*_YKdYl+65JbJ<_JIPR~h`;(5=Nv<)xEV+%(e$&)50 zYm(DRQ3XavB^elrLDAf~dUEImQDsojBT~mux?cK3N_me`)wFwPwLi;a1tYEwt@OgG zR6DW$Mpd6Fby8KVq^iEnR&~>GUlI1blwS+oI}L}U_v&84n>%sT`G;gKqod%NgQ?ec*-F$SzSqD-Z~3Fpbj0JEZ##YrHw*F_X(e@Xa_gi^Ht;C4SrRN*u$Awh(#Qq*kRrBqSC^^$Hr zEp#)Mx6Vi^65$G(%Vv2@l$TYU)!LZUR8pl{SJreE_R^|cjg3+~4XUX}#nHz42B!f- zjM9eM%F>1zGtg?IlmMO`l~%OU0grl2lz8IQT#fC6Q94WQE8HC3r%|O!1GR;n!by_~ zPcEHYbjrBWDJK_?D=jtP=@nM=#*#~CU~jn*po6{;u zI;n({A~Nru6ggO*6nP164(z%0J0-J=+? z)aevPG1P5p0wr^)!xZ8t4^tH7-V~`4;kNpIDVdMXO`Ovf(od3|Rc2Sw!?$K-g>)R+ zqvRZTC?gstg|rtYL1HVc9MkZ+CvH4EkCJKEo+KSZ37-3O%t)%atj?;mP~t8wq36&^ zC90GT`${KCc2?0|n^5sOF^y1ZRc#rLwJQxTp)DZT(a9z~QKzeB>d=gPJ{Ne|xW~}! z@x@+t9nS1EAIK}9+Yc>B+<$12;#V@4LwR!&E1BD&yb3gI+E!xVG^zIZj!0o|F6UlE zYidG^aeOoNPXbq+l4IE$Mzyk)76!y$DG;Z`{ zxxTca9tZF(289?LH_(XEjB!t^n-zspoHK{SHq2;loZ}oI;jUC4W#~1aVK!c^Fv!D_ zI|k_L6Ig=`I1p1oJ=oRf!7im^8MXtSC%>-DD95WE6u$KX;Tf&99;K?vnN=s@Ay)%l z=|J_3`g7EU7LR5_scNXw8BGm!>eT|gDpFfZwN)Hky|ljJpyyXKV@S)uqTYnz)Q7_Q zh*zBtyZrLz*?35)1sbEe2>2lIXA&j$58H3YI60$LACB) z1KkbRaN-x8b0th9PrXP<-SOd?ydfm6I=VC4(fccj<)h@;;NaXeHs3N(~p+wD(t@W%>?fE zG=M60ku}X~heHqJ5F@A%7f^s2Pdl?_Y#Xa86>OZR^rljft2_>CM zJS?Ggn9>@e($3`!Pv{J%N(^&qqACW>p~)JJNN6SzmZ_>n)jMj+Dx^GZGD2IKe(>E? z)zU=al~na^Um@i*nAw^|Kyffc^gQ3dl+{B8;M{Skp)gvSaC3wsd5Q`Z)m7M*SJpJ) z0ZOUz0UE{5K)Fg~%`9U^&77)AKJ%~ zvtdWiAQ)j%%xq|?#PZ@CQj<<1LtRx}Io-v$+Zl(RtefFbCzLfdB5KnaHC5fYP&w|( zLeDhlxgGjJmj&Tqm#2%Uu4y#1J(@dY3(x&q8_AjmWKTC30IhE(k!nq%w&f~Zo&;Ca zsHk#|p#m^HgH#{vnpHE&&1eLhwOnlmRif1O;ebwY%U_6kpCZXuE`sFKbO@2GER!a6gzUf(J>`OpWn0%KtY zLw9EB357I;4d+r*KWhwbwN5;Vc+Q1_w>n?L8;N+Gk-S3p1EL;q1s;Tw=QdT$Fw{dw zitHMxF0Is9KQSc*glu|{NO=+~DjZR}-_&A#9Y4XL$IudgmNDMB((?{@o?07_siF)w z2lN1h#uJsPE2}S?34f|-R;!OObqq}=3fSVqs;QFI0M z6A2W+fWpnyjHKiLs#!G+Xt&NtR+R+;%CIt5*MJwRuqnVTI`SnJOHHap5^Qy)q#tIH=pHA$DE*tiEOzys8Wjo{Z87V~#@`snJP9E4Pj;a5X%3 zRm&0FlwLy8H;KxD>dG3`kphNA^_=6G>Ofj=M6eC3Z>ZP(-&92}5$SM<(JEGV%17fZ z7XxCbdz2drxw!-GBj!QyhEy|4b25wGifrY z>-Y&uvl+Xn`bv6E3l}O@amu|WYBN=pjy-faZHo{g^gapW2`}<;NW(d%RNHfkEi`$t z%XWIbyk_PJM)6>5Qku$6LOgQdSUT{-ewJ1hy3GP~_B+&x&IZevUDjOORD~D*Dyo{v z={4<4#Kfk42t}pwYEMj|&AnA~rnP$Ik9c|t5-O{xz&of|8=bcW-IGCzIdx@-3-wh5 z5l!*t5+Sv*Add6yB4A>&t3FaMPyp#k2Y^mUU^P$)N^NRYXi?qk-pQ+X`jD{#r+p0# zwe-Y=BHLLrpkjqc`m|SC_BC52k+U*s9u=G8Gq- z2>DcCaPon~jZaINE=lcpHB{}5bDKxVpKHL zHR8npdItjRaySuQ{6@9(f0c(`j@?g~FhJX6lG6L)WDtEuUf9W)5@2_t_5f&7C5cgj zClAFYPbQtC6;T6k!P9-E@@$w#gUMf9CaR7=K;^m|RkXIP+dyrikJeJ*(A7=m*3nYi zr9MLxOBSYuR6E>;ASk;Xr1tnqk4{o2#V3=BqoFht3OWiW?Ku6MtQMwNz1udjf-)#G zTA-_~eeUuBYdccJ!oj zMOZDhhp7USX7!+HI?)!l%736pj`P0V<(VFToecUXDoPFC+VU%81uxEoq$>w_c(ej#}+{&#mB}CG2Ib)2`z1D zs;w|8DAlil=%YcrZGl$>XF4qP7#NFngX%9t&}Qt44ZLGfSJr$MT^&7I_i(0vjqzadlO(^kB>D9^{RkR$4e^99Cfch^%zz5My7~ z@L}%JnNwq0DjbNSl5L{s?oc`iIs{y#W`^5cYQNb$4o8XDFpeE}(zp_%#-InHcpbma zsK!l$QAc&A<3)9urF5&Bn)EgWeNs_1sS3S`KP9R+DwMQowlQl8y26-MNG}c1?IJ3J z${7`!QC~G%DITL%hQWru4#Dif%?LUcRiQ^)S{#7ON zW;*%VIg<=FC(L?;eEy~Q)d1pWJ2Le>nuTfM32A-rD;l&g0Xejjyf4r;>R1*GdUwg=x{kG<+}fLe3iqg5l4F=u(p7-|duuJx1$Umyza; zY0)uCQka9$0Sf3yA%Yxe^dMfC-Ye`jaz%(8%> zqM@R$xX51rASM+l78cb)RA^*W{y_zVLM25dLqo-a(4w-WGNm%3vZ6AjGR3l@(n2$% zva+(mG$S)5GyR=2b4J%wz2D#Syzf5l&bgntbN|hq+1**(#RsdsR#~vgB7KQnMjjS^ zW^0Ezh9$JE`Tb$Ac{<#ekl_~~o>iXRwrb_9#!dV8#^LTW_uU>U55MmW%Uk4}+Q9`& z=iMD#4+L4Kkg1SIQIx+rgyI4>u%P$9egT=P^mc}cUSU|Eqw0@`XLdaG`vpgeXAM2J zDXRrd@jm=j--)kvnQ^6Y?!rw^KD`mq+2u2B?93?NS83P0^K|o9$>z76sy&`JuIO=F z@i$j*>lroh3FAl1sqJvR`sc9XcSQJSpKo-(GWAbH_4?kc)<-8@a%uIfzrXHS`}H_P z=h_qfCPeOb%ifoM5Hspn!$T(e_wM=0)8V$9d29Y0_4K4|IQih`zt>mA-+0061)dA~ z9&h<})H)M$*HwCo*PnmylX*?g7(=i7#>7ij9C-4HDb9Oe?0MHWG55WTbJF1qn!c)g z@^!N^pLp?H*Gs*U=9qZbjh^O>C;O+p^uVb#2RlrM?x>Pa6g3{QD& zUa6V$9lh?WxZ5AzIIm%T^^xe^*TB3B!ta4IZ|Xorba3|(18)%UqmaU(yUr1AcW2Q> zFBW=|=%x=A=jaQCqF*T-cM8>grM@x_QojqwQP@tMng?6z>Zl}jaFWn3R1T_;^2uS84DX%jLp#1zIj4b zZ_a~EaiW8+&Ujr6Ty%CF1J4!b=~e|U&;P37i!(K3KvC4(h1lG4lSKFs5v&)hEAB`W zA-ejLBMm%FefW+zh}XgopQ;@e!Z>t-ap(ZO3e{)pYQ-H3v0cX@uS-u8hMumg<#)Ii z3TXRc<#k>CYknSf?Jgxvh%v&k89L|sU48P7YV2Q-y4R5>I_hyEv{-l-s=v*TQ}0#M zU}r@gd~fCwfCW z^K|v&`B}oHzNBP9quz%Vaq36&fnQaMMW>sgdC-wOA(Ef~HN>@2gw4dhL&;aF#aYlt zXl@ehoP5|iOMPd)D@|87!!IG|>X!L&B3xG+mECXrHf6ySVU(dY!CDwV-8Bo^VajeC zu+>VEuI_=}MCj^M&|*VRQoo#^2k~wZsXK>u7X9@s5t%0XpZ#d)sUp%j5Le@%riyN= zZ#T56Sco|F6)0f4k_1avF*g4T@(F?%n#rIQ4NDRp`qzuptx}r+x-) zc}961=F1H*A*w}4nh4XUh@LQEVf{TK%vBBvoGjNv9^4m$L?1Yaj5MGrK(LGxAz851 zU^Amb{d7Kbr4{y@*XdJy6=_WWxJL^e!klr91H^bC(%FZGInh9g`I1G__h_%w|MNWDRNb%Qpe-+jF2l-4ohxDI{k$fa!|F=dDpY@6{cax2 zW!MUO;Derqt%b(dnvI{r8xND}?8axQ56p*yr-!cAIAPYSozg_mEx47s1KQG8SL>Z{ zL^MM)Lm*rT?Rg&>j`M1oIUxJyRhuW4$DC_npW<-CF}fAn=Y~m&n{J-B66fVxuj8giWfmQo4xM{yYSpU#3e8?mn{_CAQN;U z$khi{#)%-k(CqBt(mXr^-K%Da;2)@iH=7--oVOb~*i~(J!VWl4nk9y)530LiI_a*# zW{(H!vqY~|!nj_X<9ZTWou#{OfX-!!L9ilfl@Qm9-mY3$u@H9FuZS+LbImyo zvoU`kuz3~n{Fzf~h@${N5+*d+%3q_Ze!ks1@>KfR=@G~=CJDZ>%3t=eK zQM+LTG`qJ!{SO^JqX>n9J&#Qb98~OJ~$7LNH|7S7d(-<)h(rI*3tL23a6-{ z_H%5o9uLnIunzYAan(8s?<_Ts!bdbXPpG+AAIw`AzeqSUz}fKB?Q!Y?tr(VRA`&83 zk`N2cwq!vUhd_kSFd1-yFth)0dmJ9cOEfq@U?0HA{V)`8kCq0@wRmcKK&uwY1g8^T zf&Jfov&rCDGiMAgESNO7uyFR&K|>PE*!*gh!PZx*3@(^9xo{R-XNZd%4FB@s(hz($ zd|J)zDa+uJ#PcVdpD+k60M05IG-cYX!IR)}++e(FKhyEQGvc2*72!3AjB788gFl2U z&Vl~}6PJ$+4TJ!$tInESZ2mDRq|9PriGNmV7U1-UuaTI*sJ#Q)=V7+wx*j^9rGTQ=4F zLf^C3RGY8u@Xf{9w>n5F4t!y6-OR5dhVU-R@3L3Wa=z*Rd=Wm5^5grkz*{Ccz84F; zT}kcMh2``9p=v?1c()?|8dCyzKH!Fc@b1c$bY!`(-i+$r#h@R7JP;3 z=)%cNtB!O2;a`As3fM2^dsna~*pGb7aO2-8zXua=v)|KR1o^R?WK-#VEyUmcM>$@~ zUqt!M_qq^=!#Mw2z3>g#|LS2>P8*eDz88kLJ9#ZE@n*j7g=Igu|6BQe{=@Mt9`-B4 zoEP*y81jA!{%_^{_#giGfA}N+;kW#U1aa^jSA8wF{+q2uhe z-F#a~j@MpnUj;GVFh9;s+Z!Rq8+v!R+un`{H(qZP4k&qGy#oR~u-KjwSdhXmvgEGIP}f3JZ2w+DD&dkzPf z&&dD}ET=nMzrq{V8(2;nIgTd|mEGSv0vx+y`{n=-%-XB^^Fm+Wt7D z2Qptn>3HU^P&$G6CQ9Sy2zay0|Hw)@l4xoBmy}Ls{tKm3n4h4upLw`qK|1q3GeCttxlk-V1qW#p@wTkj_w zjymS~lz%Pr8RYfM7m%-GZoN--I2xF*ru-Y3uP1M0zMXt4^KZzTm>(tI#@wk|(9FCu z`7Y-D$Xl3SM81dlDDu6`3&{5|pH1G%yn_57^9RY>m_JQ^g!u;YcIMm2PcZ+A++JdbJGn;l+ICg53UD!xB*$N-$D5rWev8e#+2<$QN0LXd{AuKo%;8fm^Jc%_vCElA z?qT_-ljHk$yxIA0Blj_{ARoy50rGg}Pm(7vf0;ay`Mcyv%s(MdX8r?t3iIE{{mh;8 zej}ZE7QF>tZ~NcrFgT;=|LXB-1+BnnVr9xJc;GsOPsl?bm~LJ13E6vHY{i$1=Z%Je&D*LFJnH3yqx)b@(Sj6lP_UzU&pCt{tV?`#{4Dn8s?kG zS1@lPuVwxj`D*6-$m^INC11;2&~==8=H1BGF^?f{V17RNM&@bcjm#&LZ)JWPc@y(x zwSgX&-`8TbmlwBGnju*p2_@A@+{^NbX{^R^CDyOPDVtFJ-=jyo~vym3#^FPspp8|3towc^i2R^ONK&n7irXYc2C0 z@`KFJCvRhZ1^E%?*OIq0&mlj-yolWV zzyz9XpJx`3YjnNA_It=(%xlR*m_JV*&U`a@1oIEc?dwT)y?e-`SpJ{LJUl64)g(g0&@>}BJ&H#?d#}v`Kjc|EPpn63iCp8Kl6Fy>C6|CXE48?Jd^ojS3!~8w+70h>#*D~KrzMA=d@;c_n$k#Hr{}i{L zc?bOC8n~@v9!cK7JeGVT^K;1?nO{P_mH9Q~P0S~fZ)09W-pst5d>8Zk$Xl2{Nxp~q zOXPc*ZzbQyyqUa}`M2Z;nI9r=V{ZR}%n|0UNNc~eGw(uvf_YzZ`%l>IHjXpoI zJ(=9a{2KBQ<~NatGcP2MU|vif$$SBM6!R)_5A#RJ?a$5Z_CHPTWBFerAISV|a{F^O zyPTcm2`vBDg=nr<1Q{K99VP`BL(=%pW1IXZ|GlI_58s zH!y#dd?WKW$s3u!L%x;y4)P}EpObH6{sVb4^CRTDn5#Xk{ocYnjC>FCZsdEJ4jd=$75#~3Lw=>TrKf%0+-2SgY_W5BxxkjJs+P;L`#r$FN5azYy z;mp^N+n=}F<-bTC$?`XlM=^hs+{646axe3JkVD2MN zWS&Hx#5|QenfXoRDa;GV{me_r)0rmg?ugZpULZ)EBK#s;I@u=D0u_(UgR5@`^X!a zUqHTgs_ z|J3aL`!#tf%YTTxjQLUWa^}a$E0~`mU&7qz<1la4%sY`UW8RCrhPfnP!F(urE%S@W zS2Is1uVa1_`C8@$@;%Itlka8jinjLqKIUD?TbX;w4>BJ_-o|`5`4Q%+~$upP_AEs}yp8#b|HX2zey)zsaMRt1(tPJj~tXUgi?o9@?L)K6wW7ndF(w=aFYIzl(e<^Lxm%nLk9H!~AjbeCE%Q7cyT* zUc`Jec`@_%$xE2;Brj$D1$i0sAIQs@|4LrL{15Ua%ukY6GY{%#&D&+nJCoNik0f8g z+(TZ=+(*8e`B3sY<|D}0GQXU>p7}N8>zLm_-oShk`9|giYcJe0Xi^;b! zzlXe;`Ev4I%vX`OFs~!u!~7-kz04cP_c7l>-pc#~@`KEq$=jHJL4Jh!_vG!&e=OR=a7dm?@J!eJf1v)c>;MP^AY4x%u~oc%&#K% zG9OLuW1dAmkoiP%`}(zK z%UqY%{M^U919>a+F60N9cPDRS9!-9Pxg>9AK9u|f^9#xCFZQv|ZzIVy`u|n7r<1#w zXOf37A5R|6{ATh9=CjD{?}M`IEhCR&`InM=m_J1BWxkT!$9xU>K;|!y$1`6~p1}Mq za{K@D+3nv(p2YI+Bu{4k6?qEtAISa8ecNb+pv z(d0SI2axA8ParR3KAgOWc?x+k^Q*~Am|ss`%6uYu8S?`2a^@xE70efrFJWFqUd_CQ zd>Qj6$!nOuO1^^mo8-03-y>hmdhP{4(-n=3~fHnCFxGnU|2KGp``eV16%oCi92MvzV_WAItn1@@(eo$nF0RZIAzE z@_d$mJ9#1V-Q-2geZ}KI~C3!XT1oCCf zN08Srznpvp^HJor%x@xJ&3rO>9rJ1AYnjg_uV-FPzK;1)@&@J)lW%1HGzEivWm&on!6|j91c_b_6 zJ#zc|2JHNwklWwWZTmOmURKV2av$^G$pOl4me4BF|(#pFE5CV)C)ftI4yOKT4j%d<}U%^Lp|^=9|cim~SI5 zX19t z#yOLD40#sw{^Vns4<*lLKAb#^YP?`%nQkjnBPfW%=|&}66R~kOPQ}HFJr!y zyqx)mW)?B2QqxhCGq^ z^W;g)*O4bPf1Nyq`MczP<{y%$Gv7|0!MvF~lldO zA17bN{7Lc}=1-BYV7`{TmibHMtC_z-UdOzFd@b|MO}M`ID5+ zVBSXQEat~3oz2{Z4TD?0wK(1WSaQ1`cKh-7&+%4bEl%e@LFqE)gDHOn^J~egnb(rn zFt@)yy_We)l)sL-q@7&PJcGP}`CRfw=68@cF}HsgqnWu&wV;K07xKN#6UbYczd+u` z{9a)}J9CE-01)D^VAC%rxA(K{vE<=2ezxCC9?86n+{3(@+{gSw@_6PGTvj_1nXe>I zX5Kl-%I{}xf1h&(bNhQ-vzXiePc@tQrBrV|^HTC6=I@f1Fn3Zr%a~t4UcuajPq=Wa zW*$pk!+a!pE%S-wbEaJUGJKKEEZ?_+T5&cGB@!%G^G#?RjYDw~uRkf7x!2b2Qb9 z)20)}xUm21)%J^MU4L5IZudWq`Fu*#mOH^rr^n#}DlVEny>PBYHmS6qGFAajKy4u7|N0&YCBV2UGe=JdkZxsFNJBCs_0O>+1NbF=u| z{0Vt8CQi+DKx-!y70jM6V^(3VqhRKl7@KIr)amfs=V$*iIgV=a#7U00nYT^F<-|hR zd!sKKnQoRid3s^$w4B_Mk&dDn({m=kG7gp#izmiSo>`n2m>6=tBQE{YjMNJ!47G!E z?O+H5SPy(?U~dkoA(*r_iMN9DCs1%61pkk2Fxly)*I5O=G}JmE9u7PhAO{^Lr}N_1 z-Jsd;BkUE)6ntSnPfhB?{+=fMD`MSr z)YJC%>t4GYyZv_hHQ4yy`d=S!)#S1k=5JnihK=m)?fHklOHNtrBF$yp3s!PDy`QmH z^1O8b|5kqky>PMHkMpMs+qHW z^I`pXv(r`z+5-d6#~#-;yk_Odz|O%9xBIv8gD1;5g++1G2YakrJS}ly#n$8b2?^$! z#0wJ>EXj7?aasE1PUTFC6vsvXXdl*HpLHfrGJ+!+_NU@Vt!!TWzJIBCg}}eme8b`o zOKI{i#esGVX*|#&FD|TiIVK!oy^|dyuOB&PWahR01qbn0bNrQ`q*fkHtvuzgO!r2n zSEhJ9=@9wK8;gg8$rNvVm`wL3hsjKDMwlGy%?^_}-l8zM)?0?f$#vdpbGgx53(FjT zl@^1?iodelyVopzFNTdsOUu3Ca2m!m?p1#SPCne>DD|*RU%J}cY%Z6W=}ovxUQ^&9 zz4E8mvGb{wEv>MC^r`g9A4i_r4Hbr16%JowRyZrnzhEo&>!y)oM~)vk;cYX2-~c$T zGY8;0YY1@ST~)dLvdVW;E4TS8GrcZ<JIiZz4CptJUWkdE2`6a!w(3_Z2S?o>lSB~{Y z9_W)^1>moO*xpB}i?%B17v^~VVdXQSv@5ELpMoL!CZ+PIS$BEktgrl4PAxg+r*k^Ey6N`9!P&xed> z_WSU1bAHb{$K0ndwQ#=R)EbAAYurC)SBfKWel0p!;;;M^jxU&0X9|V+P?S=&8NW-e z>Ms1|H~^o&YBPQ*1nuImau2*^gE6qC8y(e)8;kpwB|3^@&Tf5rO5rPpiX)cJQVt9ZJe$D&_FKKp z^k&0a=$6^3l*&Vk+Lc)Y?6e>DT`$~s-LQI?fiAnz=6ueFHb7O?Faz)aZFRwbm?!jE zdRP^{nFp<^fhhsr6n5wNAn8kUv9^@TAFVl3RaIndJ$Anf&Jp2xVLo%8=HY2O{J>yH zzkSB8e+%Ld4~M;FK3`~gVVPU@5^hYA;26=GHiPXqy#!M1RUgSG(A zik%yS^T>MQp{F5u{$c$*FyDW=g(+qWbtt9jKny%K!xW&l`kDgUv;*1%?HTg{RAqKQ zZ1Fdcqju{Df7mfEl{Dan>L>tNR@D`$1La zS<)P7)-k`i1D|gHj~z(6876mc)?n+1J3V0LfoGjb4?$zcV1Z|L@8Pg4+8sV~pmB%6 zE}|Ib#9c9PN<3?Wv9v*^IgtW0&yG6l7}$RdP8w$>bwD9!WrM?U%du0Z_BZ1x=JZ@m zZ*?6G8%vWWU{iSgFb(Q7>xNwnGpg*3HhdLX910ub_qD)UnCOSY#{b*K|8qWBQxMuT z2-_3`XKkw%m`diL*mYB_v+h3dU^+bQhNldFqZSVBu%%nzNWW_GskEiq-*AA#Y=XHA zCy2}NTvh5#K5(P`d>qiJ)XMh)QX|(Z_=FM;Ctupj>6L#%iyl3S^9;)HPhNy|UAZ)5 zuz%4O#ed{4{4==rnJ_I$G`d9IV)lA zxtEn64O=|!6z-0*nn8m{XMUJWLC~W836K#sH%A9gD`D^|2}bDwI;}L%o)6`v!>K8J z)6$Z{~?3vQ+!#VDQu*LWmF6{2r@MxB5zE-dY4B9poirSBP zpmyvT)DBPhXPqK>?Zf^@?LIhTU2nY}Hjf}2w6MjWneD(UwAKj|D>dX{*hxzng{Gv+ZA+ z4HIS%)C46w@09~fN}g^N6r3s@Qh;aDf6|m*#kVd{;`Mf*zm)6TnH8HzXs;> zqBlHvPMKe1KbxL4RjhX6lP!#wfNiYP`K9p6#5c0?-I2$>HeVK;IrWA0#^>|OZz>O& zZ76RHTl^{%KXR!Sx2RF6+z$tF<#v2t|8mhAUaUCmo-uF~{qM>v4pZe}_r$;k|Az)7 zv-;crz5e}Q<1-+=#rp-Cya~=L@Mh0!_x{W9MbYVQ*v&If66Q+}^C|1dZ>LTThgbDs zOYu{Ik(FEFHBkCeyb=YkEe7G@KoY)R3@GSy3F(zTTNCF+DC8f*6IPCIXU}X0XSXi{ zQ^ngyE;^B0x&}_SXLeC~<#9T1K`*kP*aLT-+2%jGFywR>Hb8U#wF`;W0j2!2{lB(B z`<1Q#=t6P9na!a2-vp+LcbLt8`oEk1FqC@Wu75NdI(7%FvFFacTj78@5czM}vLGA2 zLBtnb<}O{_Xr8RX?n%b^2JInaZ zABHV`7z%}_+hl*0*5a>9hQ{o`m%wg#2@G#C-h#>V&tfNIn<}?jMMktNn(Kkq^@4)n zY~DC>GX#zUH{?~PR$c9axBZ{{t5VJ99qmt6RC?upcryg2iB4Fca=Ji&RT^!Oy7U^w zKY4~H^}=JRl^=&K#j8B#KE+o6thCdU(tH!`YJKw%y@_^N4aNTXeb7hiNwD2K7yID# z8olg-ciyhlMW>u}Owk*z^sq}?FR4m+4J(T`_po`&_L-+_SJ>in;N%u|cgKG|w_BZq zop2tsV}CEmP?Z*$Qgw+J=0q}_q()u{C#_U?ImEgFTd2523a!faFFsY=!K~T;9=ub7 z5rBDB>djAnRl!xlTy^G6>u`9}I;&%4tAEkflK;~i;AD9JJLcNd%9H-ZM~jEqZ!ht^ z+q+g}FbhWbE8m9sb1775KC4-4D&Mgudu8i^sMMnDR8aIIv316IP_k)APO z&WwWM+`NLq++m(er_UF~Ck*o0x0j;nCq4;qX8f59IOSHc*xaGvhJ_I|9L&i8Bf&PAbgxOqxDxS`Jp= z8F6|gZsag?Vj);CJeu`kzKcfKrCJFp+Dh2vTie*F)M>@JQ*vi`a$uz3b5`i|Ob7G} z8#@s0*XB+w7&LkMwBmwkv!>6Q3BzYKZl+^q?qtk#?KRh)wJoIGh|nA?!dwgsXmAd8 z6l%bm)#+Hz~q6_c-u*UjYX;y5Oci+ZTerPb>n=&v>MzelUmmTHh( zsx3E@%e4n|NItB;3N?7NSFwgns=-6u$%5`|P+{ygs0$!hg0?_kqAMBN66if9sry-G zXJMFbfc!6Goi9Vx&N+!tcM~R?)CVAcBGd?@HqPGc2H5O?6WTgtm9_~oI^$PC&h;AX z$n}s1k`5@Z9rl9OZuT%7dianE$xZ4`U7ge9fLuRA!QtA^`Uz~;33GhH9aktPiHv0__=1nFtT-%xcy_kCcfHt=iabz<%6reAOFf z&sV(<_jb;S*ADlt@j!B`=dHe&e5>z!eIe6(efM}VxyQROhUQqcvD1K^w9|N@6V&xW zr#Cub=ilhG1Cu*CE$EEN1)Zxp!{$|;D9ybL)|uX!?hc_y^G0ryM5aYGM(tQ zsyphc?$31xeXje89++Iwqpk-e>v|kFlgE23kAe!8M?D{fYoCwW7zJxLM*V6ge~ntu z6Os#hzSR@gzSXk@lPx{l%w${7QnauLUr8(B0n4dqZ-0@2AY< zQ@vlpe`+Q_js6{zzen$by%etP>-!h(rN8>FfV~9$^*--~Gwc)J0JnChb2`=qroEVufF^-tYBRDZKVPd=oGr^_3hZ7?cCdMCT@(-LCnJ_Wd z!Nhx?+zWZz4A^BSOjoo1$Z|S}Py5-Y0^mx4o=<7Y+>;d{#k56G* z`EXk}WIOJ|^TKz=5*OrH;=0eJWNA+Yza0#zw{dTehO=AXN{6<_^$KKiXg|1C1gUfO zIw_Ts-N6qA!xPB{-0d0K7VigM^W0b#v>dXvI<)1O?FMZzW*e=&jM;8*XpKR8 zgWwd@+~-gqxBbV=@I3lT^r2|rL(zZ2tafRCM*j^-D8s$ljdefke$lOVR90y(x_7wY zT)oTvOea`iDJCE4vmqMJe;cB=L_=L$qRYJaG;6hxme8>WgCB!_T1)Hvh+;+0bZY5@ zr}`F{iFoRNr1Q(2Venq<4CkrwaGqKlfw~sXSCDLn(-kJ0a7K=Y8Tnx(CO^b8(s(!{ zo#+Nh2TZdq-Oc80>Hb}J*pG+0|Irv9L$rsT9+J#}e!^Jf1mo9oqAKHe-5opDM4JuJYD-amG}~tcZd0=!%%1V_*mW9MguWwwOOK z^+(LH)6ax4&&0sy&&0fd>tBf3jVs`#-R_vL(7&>B;_3H=nDsGG|9Z#*Xa2UB!;o@l zA7F9}ye{Z>Z$HR?Z@-87;Q?9O@0os3-ZTB)?gyFQ?$-n<)R!>ROZ^)9nYB2Sj!H~S zXQ9T-I4As^9x)wzbkb*@vqU)u{!#<~ga^KoUyZpaI2d2HhB;Ef`^0Y zofS1EIM_-Up^!JVGbR#YovSk>li+Vbf)oWeboYS`FMt)nSY~kWMG%H`h0xkMG)}?F zlOyML8v?mI2!}HggD?o9F$ni7cXVE;bX%bGa5y@q!s_|(w+)@nY^L_Zl484IWu0*= z3osdx0NKwZ;Xfb;uI<`W8PXXm&kDXF_VYhIK|l4UTSpWswp&4{Gfm2i>(R zN$BS31Mf(B2n7k787HRxY;@Q8*nJIU$B5iz&o7S(<3f$#Nk6L+5sXF)=EhBGxvv??0k?ol z^uw8OUKi*PR(C#h7CRKs*$aqZ2VQKAEcD^bF1zr|>eSAZVOT;yhT;D<5pWcfU}uKn zn2$)Hy?Rl={ua2uFAg^6p2LxRdSVFNk0S#swf4y+XUKv}S-obLu-=r@Q_w8yvVY6x za9ob_+!_n4@e1maxrv|Zf+DTDQq4mMMl{XZT`)PLQ{j+wDDZX_|86P-?sRiH{7{~K zbE>N5f`5wnf3O8!e;%S4dVGsA#1Qz=w=&dW80i?C?=phS;DT_&Z3c;vMz9%N=rKaf zV3^McHG|>tMh7!UN;JaEU_`PJZU)JIqoWy&%rH8c!6jKn=j*VFlx(95zPnd0&o{c7 zwfl>VbIc&M*od5ntI|r09{3;Pl&i{&p0{Ff^+KcfEDWw$Wb|2#!KezO?>!jYP;JCK zguzWUM(kr4jIA}KS;e?Iqkk-PR~cV#3|Nh;CNvmvW?k8h#^8FCNn0JNE;MZvBvhBK zX!w_=t_Tf>Nfbcb-C3h{6D~E%aH_p@B?vRR7r=w!2==%P?QRG|qLl$=X0P*M?NI<% zKkW%z_{3UR3{vCNfrjhMrV)-%M>IC<`Ztr{e5YLZmbu9M5EfyMUHGVc1&`sUU~4!{ zU#G(5fR0KgEHXPPS+E!dr$6WKW)XcgM|bQ~XJ;rx*x$}-2Z(-x0y=AhAi_Nmq2AZ5 z_%uhIItREOkH|op|A{`?+E?7S&^@82u*X>5(8tA#jvK;0d`JA49Ll#}3)}7*>Ff z;WO~D5;f}r|jN>{EyBGGb!)r!0@R!+M z^Jj^14me`YhX=P7)ZQ;hYX~*QX|Wg0g&an<=7>#x45NvfEB2BPFq))=$EF;{XtEX= zd$|{$tBf4Y6YD=0qg>4wn^u5Po)#aQeiuelw8Yq}@wao0d@VUP<5i3bG=J=9{9Rk) zW-TK&^IME=(XwL4{EAVbmK~erih^jWmLGd#G)B|3qS&#+F`BNG#Eu`2QIS>_n_Y;} zty)Fwq`4T)(5ho|DlnR<)x_pKgi*0p8=Joxqgh&A?9FdtG+V2WE&LLrIa)*PH2e)# zqeN?rE$V~OZCX?8jH@x4t2M_KkHzSAttECg{syX1s_l&}DZyx-)*3taPK@SjZLy`x zFuFr)_sxF-qcY8*_{!=rTma`--@;88F4V#mU->o+7ip1-@6InUEZ01Wuc8&h#hOp? z-L3b6@J=mW@hyqK@GdP;@!c~B!wM}~@l_AUuu}6YzWc{xc(<0J_?F#?VU?Dp_#Rq@ z;Sw!d@zvl@dm2l%e8u-jBZl{AMT&35*BIWbl_PQe5(gw_<&ZU_|{yA;WDjO@zq^{;e%S8;(PWw3?I_!72n#)7%tZu6yFQCVpyX! zD!%$VFnm~RQhYBj#qbfWS@ErV6vIcg7R9%IGlna)y^614JBE*Gt%~pUFEL!HwJE-h z`!QUlwJW|&$1tqb98O=O@Id&u=5qSp8ie5!TDa4= zX+Ed#gSi;4(c+!HZI5C2w3g`fee?l_by~91*L)bmXEeXlx6{!F!e_M%r*BsW44>1o zoW9*r7_QZ_oxTwlWB9z5@AQ3s6^1WpMNZ$BH(~gqR^s%1Re)i=R_645GY7+$vx$@A!il zZqnMEz7tPkxEU@*`cA%tVWZ|yr9;__@fLWUAf3ub7{8^3t5Q?G!uV}1QkA-bzX@k- z)jXiB_Y^ehU6(n6XQ%Ri#gf!T3|HPL=(Y1dMlU z^{O1GT#E5$T7xR%l+hTsXpO3jS0-ZoIb7J4=PE@Qf1x$2GC{cm<1e)qRi3ZhgYh11 zuPPH2{CzCrE3H+P!<4lcf33BtGD&#@<8QQfRbHfgf$?6=p~+Sd9!jG z#z(YTO%^H@82_QwX>yvf9OI)}y(Wtk{9O>^nAV`l8Oo~|w`+}>ELQM$K8!!LCQZ&( zKEe37)~v}AnKBgPQ(C(w z7b=%v46mStELTQhtO%EocPg_mc8YKzE0mQOt0Gd!yOq~4)`UmMB}x;+LgxDpLgqd;LO!Hii?Lf|2w9^{!Z=uD3HgX}E5;!r zTgVj({(gWFD)NO~soaZk2T>$st%AP?V1$VhA)ip5$2eS+3AtL?h;c_zA>lD#qPJlaT9`85nmL%|bRP3oz~>T7-OEsm3@;>=kmOvI^s#qE*OE%4Upvi8dh{ zm5(s)E!u^AOTq7OH$1|j%dN^mjQa?eF5gxD!Z=!l>#|944}iF@h}7i=N;izX!lTP= ziVx!$;nU?u$^{tr6Y;uiRz_nSD-w0NQ@I^upGel_F6C~FrSR)=xAHK?{Y8c@Ta?!@ z9w4%G`GwMi@j#KS%RS0x7!MNpy8K%C5#u;fq|3d^9~ci7CA$1h2_Fb?yeQM58?MqM6JmScROXwv0TCzVqeUnJV#H$I#l;O~x%i$%LGoz9*ZCkq%C%{dU`k-}w2-8mfNOGLOKUCuO& zFBOr7bUSBaoFY7i3~?^R_%h)$WC!Pc7+)^p4H@pN#rO)5Xvj{^7cusWWJ5+cH({JA z{D$o6+>UXY$S`E2^B~4oiY!BRcm9QOy2v(Ul+z9Wf!(-D&(V@l&COdKPSHEH8MrDA!D8RF2lH9)ELs|#Fxd!jiT0&(u!{q zs}0%TipPpNLk_Uwabm3@2U_uXQE$jWRy;whGi00SX44G)f z)5V8|ywHk^#5O|?v*KIDc0&%g;u+#2Lnc}AO!2WHM_6r}C7KO+krmGty9{};70(eZ zhD^5N60ygSBh8;HGUkfChP=dy?<9=dMXMn%wcG%KzUK9{`GitiTjE}3q{OGKheUS-Aih-8<% z+KQ`%-zBfH;`>F0OJ-Q{10u^MM>(h9>yrmXwo8t-;)g`OOI~Zm%SDk(W?FHLC~?W_ ztiC@i%3N}c6+a@%UGjP>eoR!jWR?}L6iZz41}k1As$KF%E3OsGT=FJoJnr|$MU6|2 zbxy}Qxmwh^tyu4p zldbr9vB4#CtbO#NXmH6~tDJh#=#qI>{F2z}l2fesWzpo4`Bwaj*yfT2R=iF$yX4JQ zyk6{b$y=QG{o2NBqQxa=Sn=y(uS?E!zJdORXm!ckt$3qobIDSt8~)?0v01dck^bAo;$v zPd^gAAo+ncmzqU4kiAWBT-&)&#D*Qq6J1gET(u3spR-Vs9 zMv&ZRZQCNUg5(cY`Cp3cAo-)^dqjSa{K@ifL{X4zwc>9@Ns!!c<=H37g5=LuzkU)G zLGpl==VwtJBoA8g0Z|hqf3f0&qBck#vf^JvU6B0MdGSzabDO9Sl1{ZBd}pHZn`j7< zLcIXvBcd@#Mp^M6qA5uBRIfV^{HSOSlKrgsm}m)-vFa=6?P70`Ojga~^e@pGBuA>| z`R8xZ79=mR;*;XHAbF`3pAv_IWQr9#_1}Z!WvY2@RP`f4vbSoUKQ+BQNM3H0DRhTh zdQ@{h>$=M=`&hA|hr8t!R{mf;(k=aJOQy3vf>W<$`EEJI>U$r( z$Sw1&K1S;$ZdqV?U%kvNZ?@Xw)hpcc7Aua?tKG8DihX*GTTZoNsn@#YG%N0}*SY0i z*6}+)uXoGomJie$+_K1u2kDJ&xzx%Nr#HFft(Fhgo85AT702r>ZaLFx|4@CeTNYb! zg1*l!XIb%idaGN`w&L^kgKjxTHP4L~=xuIUVtJz8?v}S%@rC*cx14Lm!*oZmyxoe2 z>sqiZwZ-Q&A8t$(j$ZAA}hXF_XNvwtDPftU$9(k#h2>w!SYTk zzD!RHmUmh4<$7|ktgvFg?hlrgR-CG51k1bC!&rVgd`cs0)TN0KU!`XU%g3xd8G3%O zTxrFl^rB$7%8EzpCBd@Rim%hlg5~2@JVvhwmQPsm^?G%%eA0@u^qOF~+KO+`YlG!e zDqaCLZq)07v|Eiq2750+1>@U{c4iRlf&vQGUR+cQOP43^KTzhIoNHwDYJYS#-P zF3_8UaD?YomzB6nN)7wh#Q@-y`=^gH#25c#>a?Ol3fi2Oo*2)#mY3Xxw~ z`{-W1IYfS~9!9@kZwZlmRb@ED59oVC@295V=pi2;&F!wh;NFdKJbsdV7d$ zRmWoduLsDl30Dsxeoik7m8xdW+qHT{ zsMNH9nCE%DI#deFU(jnprEd9)dTppQEU(w=LZwSH=l?5ueJE7b9sc&R0v;|l&Qk~A zlZ|!d8J~h28lK3tCos!%@G#OiKQIfn#v5>P8q?axn7IWWE;TL)%xvZ}x4<$T+A+-M z=;3f&W+VpYJG)Tp0=Tt>gv@5iR~Q$n+69jvz9a?A;!0n z7K>}*;o&CZ(tw6Lv}9b73J>Fqlz_6#4-CAxKONft$KJb#S5aO6|1)RioH;-U;c5`n zfS{<5lZ1$YsUd47L=pT~jB?Dg7fuYH+)n?09PW5QMjXLG!Mmaps9xu@D>fl`O z1a$(!n-`A1lYKv+U1M;bm2iEItlAT&#q{I5)2=x}rRq#p*8J^x-K%?YM>{-Z{k7hLT5 zPaEml;1bW@#1fyI>w*f;|Eux)QE;i}zr_-#<%Zxg&;N*}FKBmTaJkHe<9DGIepLiF z2U9)2FG~YycS~@ERjiI*!X6ymZNZhEKZ>RCw7Wg1lqOa2(D`ST6z%Q|rX8fBn!K(j zH?tlazALDr{2S?>pqlc}(puWx8`Rh~bjaVc@5{8iKd7}&p7wp0efQAr$H8>lS5+0Q z5~Di=D(VMCqtN`Q=7>ENJxn%UEJ7 zj|WYjUvH$J1Dge0=l_Q#t`5%yGd=%+@%wGi;rX2l$gd~ueizKL zTe7OzR`o7ny;EtoDY(YgJC~5-v!Xx6sQf5su|YX3(1Q!t0xKTC^f_d+mN z8XKf7KEx`I)9$5U-gl}fJt+T$mABLGFTwmnD^vf^dYp;B2G@FibO1@*E?x~5cz#bK zy%t>O`2$!wo_2o=eq>t=M+(Ou%PQQ*Y!4QC{)H^@*?c3o-t(ui#I;~YaD(SJvBYQU zpTQ!}pUu*bXty)C(Ka2HxZ^*-DywPtPH@wAs^}4rL(u(iR(_3kyMmh!t?c;wSdUZj zuVAs~M`(pZNxOqvJU`D!{|;{T=mi7#?Fnx4{Glvy&i)fD@%&R*I+J#LgWJ6mcz%lx z`6Bk1O1sa3JG>M4B0+n2pGM<;i}CzCxYP6Jvcv`dWw6xq7qi5z;;Y~;&%e+3eI4BG z`KyieO>mFr|I%oF8!Yqu%_I%uTJ5^Qy`KLni<~{r4es;&cUa^z5Oss)p8pApJgNk4 z@MF(+=pK&}JGsFM&+lf$E^hDu<)1|!W4pS+O3xo=#BOfzpy!tvx#`gp_SnK)Yj5y2 zPjrK)J^xN4p5z9<^!$fdRH zaD(;Kf2v+Hd*}E*&5wuW(r&aH{F+7=pK7di&W>j9VYEBb4W2Q5F#9|H>FhO*c4xW4 zvv%w}wmAM3?9J1zbKGEq=ckM~-VL7f{2v~G$3yMi zohI|c`qA!EH`r`~^9&!si`oBF+EutgkqnLze+uicjmzEO_nu$NViWDIbb~(_lYEf@ zlMC7ZR@zMfL)noc|ZD)#?5?W)}1kH()bOtg|d6@Ox-S7|rR4H8C)vxGE# z!2X}nuEq_v;3TUVfI8EiJ!$Ls1rf=my(7|8OJD zaf8=9|2QMgbA#7Cf20wwb%Vco{y8jiL%7ZjwtN1?EKZ}{kKEwzcHUL&x@lg+Ityuc zgB!eYkPdMgHdKXum=%9UyBpo$O><_ojo%oro84fC=fA|_-)MJ>8~np)l1R0FH+%6g zew!Qo)APS%(WQHrx4Xex2Su(@sk&h9Dja_>DGp1}?oKz@d62fQJL6f0&(2+L@V4hy zu*iwN#|_@`{OK%m%I={wc;^1_>lU4qx`rV?4kajMLtbGbAykl z|EK$sjPv{@M*b^ZdJv@3U^O&+}I)k#^6y!RO|*as@yI+06c2K)-c^ zFKGN{k<0pbZtx|I|3=*824B(m&mvD2e(whVrSYHc!w%!sg+IE%*EIgK$a(&g8|7kd7cMb6NNZjj^q(^%vx_K_QO_5EfRIe#C!L9Xx5HOim3 zK{wyO#fYD|L7wj~XYnVr``it>n-uay)A4`BUTo(}H|XK}e_)YM+gEPT)AwIv@h#eY z?FMz`#E|GD67=!?fh_V#_aebzzF*8D z&n}~pAm8^#8Q&lh^!5FTEM7{xPLben-&)X8ql47|I*ekMNYKysZ!l)MMuPsnf4334 zMS>%I{}C2>3fnyr9O?V(SmegjGZGx-`(LLgLa2Sf&q3Cbj|$4X!nf- z1AX72`*BLUUnDr%_q(yknLQ#B4D$UWjqg#BU@(;vizm@;KqNTEHk}#!xRf3LVq@m$ zNN}w0Ct2j7aBw6TLhFUBGK-i$mv)11pxqB5@tnezNI^W7NU3}6@wk&{RCnIuo#Kh6 z$S+AL-Z?MPtX*C59iPMb8`;92Xm?E{-lu3tJU5Y6_Z#DRPNH3h?;cOg(5@aiiJ98f zGcVDhE%nMz%+jvj1@wLj-C`Wpmv#%Oq`l(nB13}1yplN)o)ZT7o>MYcg%A3A@sfGk zdAOHTGGE`%>*wW_T&tb^z5J2|`Y!7c9vQA@!>zR29O*R9E#4Ga(kbD>aHnF|Dbb1T zRN}@<7AeD>hPyc>H)?08n^$rZz5Pn{>O?oc9>780<9C zEh<^3ohQ2^OPW(YtRXy+O3 zw327FbCg?OvOzmXyDcTpY3CTXqvSW*d8RwRyrc6K4>&mw*3#&G8x>UahZC%7!q`R&4c$ofALcSWdDJDuNh z5_fCY&bTx964F^7>HM$4`$^{=qqECN+^4eB`90G4A?Z9A>Aa_KCF#6xbUttrD^%t> z|2v*|K)XK7aRxs|+N&a+KP`Niv_CR-J`T0_hT5Ny_TNZ*b)@r`g^!Zn9_fJ-2WzDScy-_N`Nbq&co% z@^hU^mrl_W+8J?kX#AtFgQwAMXQay!g>OZQx)dh#$?8(%BwmXAioCiM#}j{7VY-y$ zCEn1k;k^=XYFBA~VuyB}*gx?PRg1ffC`kNMyH29hyn&4P{6nIH|4h5>kuF0E{}vh7 z<*3BV>Nb6s0Z!sC+QPs%x|J?R=OwmkHYh*wS5;@a4DOGvqRTM_iC47mv4aw?>X?QM zNo-TismpOiiPtnceq`cx?K)u;t^d$H_`&DV&h>KcFLb;mIrYeF&ecvrKO>aW6i?_U zgmRj568d?coYuUAe%dFetyf~NiZ~~opZG+X&bg)_@u_zGa7f}am4uwxMTvcy%^jKe zT)VCvmH0xt7LH4Nsa>~DO6=FJB^8OUbl5wlCH|{jch)ELUE`d)S`r7;8PB=9Bk_%P z-7`P&KdNAImMuzrt6lfr==dklBL#y?Y3F;LzAB}cfyx-1MZ11p*MWtHdrP`@qN1Nf zPZD(P;v{08a^=KP7G1mMC3Ms6nwy^p)ZO5&-TEiu+Lc$3=%iiU2PHadSC1iyF51;| zXd*|udKD$QsynM)dyh=yYFD38iEi3;*tmp#ZlY`cq=bG_qHBIdB2WAFotEehSAC*~ zws&|-q9WvKQSg4GJpwOvHzgyb?STu_uyW zGEnP&6e%b<+WR>_pz$9%Lq6N|*R%EKX?KR#=_t4ObZ>p9yl_0}PQBI;6}VFmYM94q zXHObWjyKM{k`s)xSIJOs_XrvSdQp!$Ow(S}qZWGmnD%xDl_WInP2)+Cah8=78|SE! z67B5cjx8B(oa0JLjkCPuMB|)PGQv0~mz<=|MyJDQz!_F1cV$VL$G=e5sh_*Lgl>)TK-S-V$_xfaxWAx5PthaYbq)=@)cx@* zR}sri&l&Lms5rU9*Rnc0{t;w)*s-*`*bBOQ#Z%~2p&* z%vVpPWd_wd5|y@K4H$W3l1na(fc1X6NC~@%zzZ4#Ni1?q^}%2c)@ADe-Vp(Ir^j*Oz{0`7WsnV7hZ6N@Be^BUe0{l3Wd=_t_-LJji zEZ@45942HCKQ4s}m!GrtdfGkb1?TyhyP%onO5AAv8!Ns|yWe`j`L-fgb?AJ}I=q1N zJ1-dT`<+iAu@~(&dBNG{YRg&#IiCGXY4=AjIOiaLeIG(EmrQ0&z8&{xFBt3lH7xSg z%d1{6+V@*ooK3seykLxff?nyS={41V_Tlya?Org-_wQ%%5!&tWf(s5Rn$6^qS2G2ZfmDZU>&l|-%+Z+pSTzTcb0qiFZ87hGbWc|PCz z9=~$&Idc3nS(~ql-t&SA-@lMWKK<`|!7$&iV)1I)ec%O!rr6ZUWfN3U7qG%&+I{E+ z3E#Sb4gZJOpELH67ZmyalPo?$OT!JIJlS8L}56AEY?YjBFrE%TXIFMe9J-LVP3}ure=R};L9O=lO zhLCw){8i?MD)YUJS8sA~CP(%m2bcUQ9TBI9BRu6Wy1HhAr{o()U*kC3IQsccg3rY% z{e7qS*3-z98G%ZiQ*%GfrD^3QgM4QSo9x+x(l&+D*0U$2iC>CwdiJ6`PvJ!M?w#BPmIjs1SpSd}k`h z)_X7|T(bnFT-zI740cM1?^JMrKK$-+H(E2`XESo$EA>0b7pr%W^Z6a*!yJAGS?lHX zW4&fi==Ehit&>g)M!L*k1JD0C{yZnW~UFosM~{zhQ_=ydY_oz*v)mX;8%7j z7{9Z7n8WYvmhE!XOS}BdJo-rueq;AESG}k^K)t9tP`#*oG{2~;BkxJwA$6Kvx*el( zfw&Jttenwav~1=$Te{Ng3VE#4?O0Boti{kb7Jz9Rwp;wZKzTkrql{8wKMvj8gZOaMej!Fi*fvbvkIr) z?skr%aK&~$yOmfWoq?~NO;h^;yJ+8^U(0U8E6GRjtHd+ZTgr2Rj?6}%QIMnTAO+d} z-Z>PG-eGo&wG#Pyx9=o2fIJ3DkKN=E@f_!9dSgA3S4-Y1_6yXT(v#gH6VX@-JcvwX z2)_|MI6G=a#~h4~%|hx`>LKcN?c>4}MrOFqfC`G^coQMpI)MVJH?tXXaimCNC|lF- zvU8y^8g?)$%t9*8gvu!82pNTCWYsdsZ+TPUO*SQ{-wQ7xa!_K1XGNpl{4QmbIfGnq zCuVCg8gVc>DI0MCjLf#hc|AE>i_t0Bhy$M5oxZztd*0GK^2$my=dCPT|5`F}S~g-6 zr*mDHM>?`Z=@SfC~@vclh)KqWIh$HfP0{)RL!$<}<8 zPz52EYOd~eIO&&WD{-POJJ=j+UVgCV)b8#D>MIH|pM@dsqR!4x{{ zTy=0%S09X0A+nlT<9ER(Zm|3{i-VhGvxIyqTPQL9?M0^P{@~ETTSahZ^bvl}b3BU~ z#IIsFM=uUujqx-{O&y&P1#~|&ro4GJ<%~Yk&m9qp`iU~0+vr*C=%f7H6EnVNP%-H% zE@qC;GpVCr33>)Rk+P3jAQ+LG#)#g3}KQyeJqY*@(m4;G7_n5Kf^p zqSOt}m2k{%uUqF#Qq&AL-x)E$4{nO9e5qWY**2XFxR(s}o$)T49a~EC%klhq7ia8= z!)w)X_#fF;Tj0exR>c+mOz(>N`;zakLRTz`qi?*oyOCc?dO#a?m>#zY~8)2H)s$w&&43KT6T}+xI2#eF=PD0^gUw_a*Rs34C7y-jD1vT|mtxjcKs%pCW`6#Dy{KU%EWL0ft zOS;w3o`xiwYBS!|Rc%QnsUPdA6e0&^OWM-}tZuK%D6(KY+Nx$GEuX5ItJ_;Lvhr1` zja98zQvoT{+U-w^r6P zr`j8vGKJ7q-`q-GGt&I?T_#vo0VxeiGT9k@;f13wt-NUbWoK1RzI4)Am6c9qs=4NB zl_+*_B#2o>I-*oX+gzKhnL%DuDmBJEv!OOw$-iZ$3o9elwI-9T$+pT=LmLG#l8(Qn ziXK7>&!5U%Tf;R;j--(cJC*HC?QO|gDg%n@?D6GiIchhft*NDzejtpqKqXj7WmZ|& zNP#M=TAb-ECdr{;Qg!M=+)Nd-F4a7 zOjoux&rEhWRkgLIv@_01{+Tw*D@!lgVSAgOYlF5Cze^>wVw7x4RKF=5P09@185{ho zXPi1ZYN+c+WkXYCs>QJd3Oa^gC=-?Wr_Z+lDqLOEL;6QxvsHR<>l#|Ao~y{JsV_1lOR=?`x-F=% z+wxRDw^x~Nm|mYwwrZU$WT{fky}Gh0O|>=E4s%&3qe`c}vZ<<3D;Xino4OFHbDShy zMNECugil{(dRB`u5X!a<1v6>UCtW8_s_7ps%-B|PMv2cock%7&=MPyei)0j&Ep62* z(d@{=wFcK_;bh8is+OwdvULj0Jw(Qt<<*jGO}Dp(@j%R0X_(O*hHqgZv! zvJSW9*`$8(5WWyH-l?j_>e?z5R68xN=9$&a+J{}1M+>#}TAWN8DwUAs9o7W$Wp~E2 zoI1KTWmLH`9`y5+3ezzQR#wl-M8=+wZKaONRB{Fio_@+wOIZr4#9+Te6klUQOXYO# z)#*IJZH1*ys)0s=8eM>mp_ozO3}%uTN*RUob%od2HbTa`DLK8BCNnw$BUs+eP1ht_ zn|0`>Ycd|^H@7x$H_d}HY}-UCh6S&~v1qAee6u~8tFNl8=I%iiPbg(V64JjWY813& zDR3$?<)e})Y78^eXJ|7P$hJhO%k(oG&VYR*X*RIbxDhqbT!+uQsuCnv z-ZY`$8KL%uaIiP^zAd`&TcD$et=P~g`x;7`&9ao6(%dg0R_ZfYvJ~2q?X}G{&299H ztSa3Z*;1meG&3MVF`H#8XZ3yBE~#hH>;P7;L37ti*>f-xc?_)zo^7`+NfT}QY1)SL ztV*g_VIaZ(kAcuHaT-K0d&H66t@W95vV#%NjxF=cu&VqimXKr=TlHw)T5qGuOe-f3 zC0O3gGgWT6I)|eM33i%IRSy-jyVkavs#G#FiO7f5N#f*XIBG~t0l zKZt&J08`kudR9TV(J+=uc7*c*OSUXx_^zSuNsk?7Kv(2oMXPKOR1r%tU6pRv^`K2T zrB|BLq)K0VvzSpyH#8=j+qFO3mS=OCdI9>O=2mrqRiG|JxCW&|52@TlmnS+gT1Uwl zrS=w#&g{rws*RP^RJm$&70ig)D%`lK!=m9#<%iWWC|gyxSfOmggVd>CPR|PMlBxn( zYU-z-b?&~S{m|u8bu(Qta{5sFA7b!fY|4lDQUOjZg{|svDZBT4y=rsa+WlGjrC{cUH(Ep(3WWs`8VTC59@s z$?Ep$9EWm*xGqUoQ@mb5KE@q-HkgSZc^bFnndU$|-l!(7-E_&*YPyVrNT|pci1aJr zG(#etPzb$gLe|j8Udj>TrYimkay~WW6$-+ePg3Y@pDCIqsqo4d?l3HORCF<_ugNI5 zEr&`p;_C$fQZVi;Pjv+a&&(AR0}S*Ww{eFdRj+F*P$*=3n=`AtS;%;R@DwqNKj~}Wrb>5MpNpkminru zTDnN5a?{~$?@Wm5>Pj92vchmt+rccItblq<2(6P^hGY~|&C|22^Hq5m2A&zv*p{u$ zX$iIAsR8wLwUy#Ng}LP`<*?N&iKg;ZjcwXTyR9&~!7Dv$6^2?X zjUvV`benJtLaP}e^u}TlS1(gIy$`srD~5- z)v{ToIv812=!~mXDm}0&)hzTKs(KMAOI4was=lsPY12;WMN?i5uRYB)9YkNE+JYTA zT-$scH;YduQ=GmWtYD=c!Am8Eb}qGAlCOek8ar^z&1 zR4&UyuU}~|do7D~dC3aLOb9*Q(U>MaSsrSY0YU6lD5c%dMAM|uWrf4?l=f0fRhDPC z9;JhZVn)TRC@BRaWW0HDq!)NNf>6p}p61(BI#ei16&j(ERl4Bl;)}v)kWsT&f0Qj7SZZcDh|`q49HdBVvM$-mmq^-1 zC|VZGyb$_&x)kjv9rZYe5}ID55_-Sa8tm{eQm)COREz) zYF;(Klv$}-YXw5KLfaSoI)0mE6wO6ETgtkKS3q6mgsw~|buG?3b1kkUGpANDiWxR5 z@MSkH*0aToX;zt;+}C@1|I424$;qKT8(@p&sOn5+_Rc8cHW4W~=C08>-lqn9opUGF8<=cW@nB&=%sBf~lw+s$82h{`|>x?R1waS?sj6H&#}q=;pl&2&bM0(UOSrXlrh7t)c4~x=iCP zoG*xJ^^2~T$v{S;DOUrZH@*|uRN34_3$|&8dlhv#TI+C&F^isUN}^bB$r_I0PFqU{ z)*tAiMqdf*F`#)SJ+k3&4a*ETq^sBN95w(aH3fAeP_HB!N%v(mx>$D#jh|CZPmXZ+ zt#2UKwWlnlWbO3i#dI5_xz(wqlrs%j415X%PP3pnOS zlZ~vPWU88qlPOrSlW{2}ZbW?1o}zl3Q7Z}6$Ozk_ zQKf{=OPaOlKshYVXb%syhbvP`IgGM2^et7sYJHt|Suvg%YMrRGO4L3(o)MwW2u?&P zQlb(@n!__GIw{o5xM-M4wy4rkO;)*7O}mJ?wyGLl^Q1V_t=zq`Dqrx^w1!=((ooCR zh#iX1DdPLT4mDYQs>p!}yE+w4x|QbEw4%$sLQQ>=o~^2FXr=Y{N>vB=EM_}YRjF;5 zL3OnwS*z*@<&&E-C8;JnrkZsu#8p2|6+l%lsuFsA|C}jfs5aoKD=Hc4jHppeZ*Hxn zn;clb3 z#z;q9e)5qyADNRs6$^`epd{(wR6ClQTWOq`)ub;K5RS@#M_?M53FyMCJa05NVF!nX zrWs@C(YW(3W`+ZI-fDSLJ(i}|LCA`dYq*@)LpkV#QZ-jC zl2?zDGa8yH-#Q>$RTkKx3@dYu%}otFDWHcfDO@;MYEcc6gw>IEZ8ICv)SRg-`MEHf zsnF~|IkP+)YCE{<(TS%fp80L=8C0vP=)Q$hIdRMc$|GkwUMK#s(Z9b|(lT<%tj$vx1sMu)^UCq-X>LK(ziOwh0BAc)VR=L#lock7Tyfn*3 zsaH2lKhK#|Op}z>s*9;Vf^#gd7twr{M-{%zA}8iMT!@%pIWw!;CbcH%0kN878&`TQ zqalWq`V#Jy%GI2hyEb#FhGwlE5o4yCAiJt+YUr6o8XNI+nORukKBuvY`h}(>JE=FN zCtcX3CKgQatQ$GQ#;(dp-FhdNZgk|JLI~aJM1_)?)T*vU6|cFHSI>Y^z#3WyYHm*H zsaYthipRd;qoNbf=HR5QvPn*A=@_C(Xs2y`o)Zk z!l{k{;Yg$lpLCUuNzHh*Q{_iH>yz!RG_h)^(V`wmwVUs0lgrF$=@wpXGsYmkVpGEl znvxc%&Tywk4;56hr-mdD)1y5t9ML5RkNfI6f)Ym$$JUOfDEK@n`+TC5W8&FlyA3Kd z^~B7Y{kVxsnG;*p+FCV>W})ihM+tDNb5WU5VFTF`)dw1f9ex0>s=AGz$75$}GR025 zw6CH0V>+pvs_iOQSa?b@Nz!WpJT6j8#VU?NE0YwCpYN#W`xMpmv^G!59TL=o`wVKD z8(ZkUGT%ZcTuqgT9tfsn>HjJW^&shkJVOIKO=e$yj+hNnnehcemNDf)vlBH3pe)t0 zH^pFu;l9ZVq(ih*uR%{u^L3@V=pgfyVXiL*Qqrj-;CKyDQES^e51c3d(^{%KG`gA4 zy0_GJxy+~+%S5I6`e#nxPb#aBM;mhNO8XAF9Jndj* zHJ_(}h%Wp{;+d0vbAlx`CUN&23VN!?A~h#m=dn;l10_vW)M%%)lXZ0zPqL|ImQ`{Y zJGxOBFB&a%4O0PR){wnKud`V6eLLm1~&hvI;&LY8WIFi$xd4GwSqjGkJ(I+UV1G1Qs2 zs{7}>Dx_U%HbU)zt|n-B=Yt~2j+PX^@`9sc{8&+{Mdz6Fu8TJGQl}*2OD_x2v?TPM zc(xjG@nmQy8UORfPGpmGP=w~sG~m%V$p=N~oQFep=+wG&jibkMnj&bI;xuuiJ{?}R zpncP=sT!w-_xdRUy=q7|>*-0e=|Ji(A`RBfs=R1{t&L{I4&9<}tZKWOkI>_BkJi`e z9P!Y|$1D%5^^li#!IPQ*6_>6Os;$=0!UlKoJk_Dr!&e1Z%j9Bjpeo&3z*dV@x6nlQ7#s?f)jWqVznL!(+{CBJP(&5F{2cb6)sH?{L6xE9TkvP!9SnkWl2 zB0J604LMDeWgf~YvpkCFdtdbZS^n}*{Qt!l`@T=}_a*Rs3H)y*@PGOGYcJSwues21 zJM!FqIYE30eL{>r4CeHQAN{(d+UVnTj{4FV9Y13-CO2^rxJdsL)bkI+lS!G-BikFG-VPXU;XzXRy} z-|p0x;OOVW=!c$6c<)#@dTQs>qFyXs7Ik7?YkWb}>l|r5Eapv%9Pj$kXy=&sn)9je zL<8^q_>!1+#S&8X2E_|med?~5H!NNd&FvgHH9zK^w;(Eel(=-1{&$L{V%~l87H}HhcL>GG zqV#)Ev?oiW3uE3T@h#qQ%)LK4@fB=$$-MZQ=ut86b7xDmZ>-L{nNsADR1rNg_9rr5 z=iQ{p7er2t{W&@+RuT0oD8l&dG4FIO7Z4vgqNIje&*H!gO?GU9=%y z5pAl7=El4y=TW(ywq8YR6G*Sc=8IGy@W=MpaSZgnFk z&=;N;L{E=BODb!kow#0lpUmAA9TW5Jp$wcu#nHJUdS2w{9?_Fxw^J&%L~~;Cg;Xr* zXy3Xh#o0Ah&bi(-H~u=gy_GIS+>dOuFt5fl*NBe z$2H!YbNP(NygS?qQlzq}i=MP1TDryi&)mZ3rG#IPwk(OJ($S0S$o~OVvnV5{#JrE^ z(wV)KL&jIcNPP`gmS@R~7fXA;=L}LFo_FI*qLs1Nz2A_3ClVJ>{(due1y_k@-CYzU z9rf0bx;jA{=mf=M@gCl0ik#}$b96$FihUaGza-ju31#kF%6pmjJSo$uKaS4WC6s5f z^aqM{Fja_A3!RdnD>Ueg#!E~3_$3g6ySIYFqqT+(A;OD0|`;9oe&*Ir>z^Eq0?htGqvNc zq%=Afzm6LE8t=)uL@2tg6q-vvmx?}iZp?dv3!DPH>K3X1U1IUmV%{32$5LZ+DM!6y zb!7HgKC2IKH6knja>@TFZKgYoOnFoe_fi&BIYjflO&sn-D(9tC&QuFNq z`P@&r7kSq$i+Mku8{fh`&u3I#F)sO-_e+)2_yq5`6&%k?l-m4Qg?AI#j(T6X6UarC zom>=uzZKCal`7S`7Wcqf?h{ir4suem%8o+ zsJ6FK^c>BnbDr^TjZ}~w9nD@!_Sl$rcO*{v`!_|?o7^j+J+`QrxRX#ZC9-2W7BT&2 zj*98d2*vc#9MYsd>$*r`%=?C-xsIag5u2q-ka!;T@Vf~wi&W52b*Voljb2pCsd>Fi z>F68tRuJ*Lo4J5gVOLNW>3vBxxG(jRQL31|WA!obA9K`6UmuB671+Y@mQr6CNkgIMvM?cfY&u%R^)eCdb}Ad<9@Tp&vLHG*-iK=S zgy<18Hcar|pioqKei3<{I=KnaeiOJ?>>YcIYw*@N)DA|+yq`qMqGjZH{)A}Rgy`jU z(GnfHj#}2U?k>)b(Ss*DD#1eF}M$9U{CR#{8wrP1ki%2<>} zB=<+r9$v?UXnaQ0jh9l28$OM8rpbom^`%igxAS?*NR*7^QTII~l1CGx|9@X;Nwl}M zCK{S*Qth?LM90Vxl_N@r(IP>6$1u8_PE^y{U4obR+noPhQLCgHsuQWyjK*Qbr3rSc zugxU%S7uB^PGMn!{@2r*7TweisT~DBWTn4CLyH&fHEH#Ik-~a)bG(g?ZRuKin}Zzu z$q_9#G?$Qr!cnx^F^--$(Jqw-a`FmFb5p25%M;q4)(Bb~I^b?-sfGc1L@C9wkx{)a zMsA9^p;;g46D8#MU$)LPb@ZK2zWpvW&zhJT{}@d-T_@(K-@PD+DYG*HJO_$qM*6JM z$xM!oe-SA}=wH_L3F$shvtqX2P1usX2HjR{}9|wac z4RDjrpCjHUz`NkM8(dvy6YB~-6n5T)%-89>t%AO3Kqg;*M0)z6VHrEqpdSS{^`Q`) zek4?FCOsd+P9Jb%|8DRh!hSo_c_z4N-xbh5QSgD#=bx(M&8$mYjP$gC(`V_`HVXR3 zLFVt_^Y%~ZC!ufJ^?l$ea0;%rLEtwD{r8a0+rdpaKL`FGxG9Il;6D-em%#q-!A-lM zUm;TU^GR@1&R2s!0ZwMsc0TO?6x_tS4fZ#Hn|f6a{#Rk=XtKloq=SyZtXFU(o?}W& z$7%N7A=ZgK$E4b5>Z2FdR>@5*kldVY$?eo>ze+mv2zy!j1rr3}Z~B{aWLp__2+o$- zP7%sStw#}K@w@E2dI)~{A?)us1m_atc)4Eirq-?Kc-tZLw;qD`JOm$0r}n$j&%c=T zUHqCu*x7Ul?j3^vm-6sk_V*rwR~&+uAA+BH2tMWzJbH-yen9D0<&PCKwa!O2x*j55 z%MZbMZSTAC`vvS5pnVM?+r0HZguWRcD7k6@@4&Zuv*#<^R~c^lKi20y!0?aB%^T~U zO@D?TMe*{+{2cl-yxHR8E&id!Cs_Olj*vD!a4%u(jI%iB#qf#X9Phanzs=I;zRKu7 zVe!ru-(+!aJ4XK>mVK@>hX32r=f2i(9^ZLmZ=0WCal4%7fXi}w+2ZGuEn}a@9o|@f zBK;Zuo@Jk%hJRsk`#gSQaa*5$`%Z0~emkA?TX!M1?eKWY8|(8N*Tj1gI3Ffie3Yfn zO~dG)V{xw1hPPREF0lBm7QfKqPg#7N#Wz^|B8&e8oYT*vgNgTDi}$v86aymb+vSjB zaSm$i^t3pS1%{t&@xv^BJ2>00+slI%pKR&Vx~keZJ^2>@yT!TxF!4q(0b~19EZz^C z?eN^q=qC=r&#*Y#{~G;C^C9dnvh@2}_HVN|_cF4-nEu} z`#k>I(m%@5-)Qjyi@$BzvD?KbmOjs>On$$yIFB8M_rL(du`(P z>6s4B(5Hck(B73Mtlwm8Racz=rzws?`n?Rr~j zaoc{K#clhI7Psx+ZE?H3uebOyR(k$naXa2!7PsU5(BgKy`MBhe=W94P+py2eS(g5> zR(hsb`j=RIx}`tF;I{&AN6vlc(z;(xL1*!5(GrEkZ(*W&hgmzP6EX_NUq z1)R(01o|`eWRAt{@?U6iyZmpqxLy7~2AA~!&ti+)_V2WK!m{(aW&cu(e`DzvSv;3J zU)tFAW%Os#bA-jqEj|dG%c0of6D`g~XzW~U@e+&I9m4(!i%+oh*I3*xx0fvYcKPhI z^zHP&Z|M)W?DybKmNw3po<Sx6^+NILB$*zrx~n`meUQeO?w@_U-g9x47NzHXVY$ zZP~w^(qzit<<6HjS#RSOx8v<*@lpzB>z}DyddG8J-k6V} zKcmlcFy5G-PJdj7cr*UYM=PRt#@}!r%Xve!Rd!gvNYTvtvC(e==eo_C;q6)spLH|* zI`9G<4ZjKUAi-~iJVfyOArBRNC1jIcWB+I1-1d1h{8=rkHfZxdgLB>E&FF8}qB9Cd z!~X?&tl*zP9w+#>kjn+<^)lWj=|dRr5#W3+%$te#c<>61Lp~gw+aPa7pVw7+o2K>| zeinGG;OBwY3qA!rC3qEhi{N$OX~CPoI|S$TQ{HClLzw;>!RHIU41A&BtH2it{&Vof zfai{O`nzbH80=i_awK7{$24!%wBAAoNcyd8Xp;IqJY z3O)~fm*5M*cME`q+UMlogf{zsZDeyAEp8+2w_#eT?3jP}SIKlZoG;e%=jW?6d&%h@M&W{iC zHd*i<;1z-&1J3tTcr*6t7qHbfP4F|oYX#@$MR=ne;a&@;9r2hD0qPN z>#c$x0lrP}Vc^>Z9|OKa@X6pi1-}}6m*8pe-GVOw-y`_V;CltX7kr=K4}Nh(n0EaVxQ~9_@EzcB!S{ma2>uOtp5W#_K`+7kVSPMb@S))S1wR?QK=5^SK$2oj~%ahA!e%J{o`71n&1iWTEWY}>jgg_JSF&L;4Ok* z4W1VK8t@LmZv~$%_;T?1f%gZ9{yXq#g1-u0EBKq>^@8sPPYM1d zc#GhESDnwa;O2f(hv0*uKU?sV!RHHp7WhKJ&3&mwf?oyw#e!c4zC`eQ!IuiY4t$y5 zTfmnK{xK&4S+z zzD4kdz+V*n7vNh3e;$0B;4gx27u?(@+adT~=1KuL|Mc`?{F9YuoybgS};2q%e1-}h^q2SBG7YY7z@Wq1v3Vey+zXx9`_$%Pc z1m6X|T<}l8R|@Xoe&i~_%@+w)3tj;IHG&s`uNC|(@O6S;0KQ)EYVZw$H-T>yd>;5_ z!EXlNBKUIf7X^O|e5>Hkf^QRi3;1@y-vHks_`kq+3jQVdF2N(XkGorNb3b^G;QgS# zSMcM&_X$1%e81r1zz+yM1zbJEX7zj1!F{Z&nSQSWJTCaH;O04AqklJep3r|7yqDll zgXatWB6xqncYvGqQ4{Yc;DdzzH{e4A&+VnUeaEb)8as!97YY5r;Pg7I+Km2*;3EZ} z08U>)$kM+Ae3ak~;9~{v03Rp#V(@ao?*=#Pz9yZIfKL|szW}H2Ze*qN58zV;-v&NS z@b|!L1>X;D)|*Xw;&?D2CG`7)w+LPgo)-K}@D9N*1D`E;9r%2~XM!&jd=dB}!Iy$B z7W@(LC4&DFe5v5S0beHg3*gHI-v+)?@OQvh3H~AYYQet(Un6+5kFE!61@8mCPVfQX z>jf_c-yryD;2Q-$AAGammxFH+yb=6G!DoVR75sYeZGztozFqLg!FLG$4ERpLUk2YL z_?zIn1^)GpPVjl)<$^B;pCtGSaC864ocG7UD}?@Y;8O*E34EI1?||0| zz6ZQs@UOvBg8Tf^0BtRT_W(Ed(@gsNfp-Y~vI@EgE)2!0#*PQjOh?-Kkc z;JXEX8hnr7&x7w3d>i;a!T$-qU+|B>4+#DhxOt`Aw4=`b^m+7gKhW^L;O6}=!-s+A z2>nyQ^8_yk?QVk>JC? z7YjZTe2L)Wz?TX>34EF0SAZ`Ud^-3_!DoQ468t*w)q>vzzDDp>;A;h6557+D&EV?= ze+_(t;O~HM6nr1}X2Jgle2d^+`Q=X9UKIQY@U4QEfNv9gEckZ8F9+Wt_;m1{f_H%L z5_|#pZozK{-y`^a;ClsM4ZctCUxM!!{7>Kq1m6yB9_TmiYY(`O=MfA)03H{-J6<5j z5&Q`7Ji!aWdkH=QJYVoL!Oim~COzZ93xxh;@IivtfDaLTCiqanZvrn8{2}mC!Jh&j zDfl13&GRoN{jYIHn?-jg1_&&i0gYOr-82o_Xr-M6q9?G=S@!-DTlfmPHSA*vW-U6N{ z_+0Q_g5Lmco@+DdxeL6%(0>@bK=7Y~4-)(r;6ns|27IXC8^MbNe*v7o56+uO=WF02 z1%C^?Oz`)?M+yEh_*lUYfR7VAdbCbQx!|3^CkfsMe6rvJz$*k#fScz5O@2=WpC9(=Lje*j-1 z_%`sRg1-g6Oz;oEmka&{_)5W@LApMy5#0H!8d~+5d39u)qz?4*k8eYZs-=@0dAg?HT}SQ;5kD7Kj3+S ze+k}8@NdBL1@AOir^9?lg}q19UoY?ip?@U!Ai<9XA0l`$_)x(|fSd2Mus6qB23{)k z$AFI%d>nY0;OB#n68sYIv4UR#K2Gpj@N&VMz$Xbl6MVAZ^T8_wzZrb0;CFye6Z~#) z^IS7~bGh9QUN7{20-h3lEqIII&w!@|e;&L;@Rz`63;s9o`GUUT?-G0y z_-?^p0N*3{Yv6kYe+zt{;Jd;13;qfC0l~ilH=l@QZ*HfNW4U(H_ipe!yWw5H<#yuZ*t4ZJ|`bHN7*J_US;;8%hV6}%3-NbnzkmkK@y ze5BwvftLw>EBGkE?*Shx_zLiGfYivf$5xR|vide5&9tfKLt|Z<&fpz__XM9U_>tiA1wRgaq2R;87YTkE_+r7& z245ohMDV48SAZ`Qd@A^I!5hF=3f>03O7J=0s|CLve2w5Yfv*+(PVjYt{}_C|;E#fD z5PS{zM!|mtzFF|+z_$qgJot-(zX-ln@HfD>3BDVAyWn4d?-2Zdz;_BBJ5JZnU4rL= z?-sld_#VNJ1m7$8VDNo{4+Y;Z_=(^L1V0VjeAvhI8)t+2c>l)m$>4Fpr-A1PUJq`* zgJ*piv<5Uc&Xs)!AA<1&@PQ2%ZN%Rq+1c(*!>TyjJj` z;Prx^1fCN74Dc4g&jn8lej&JdAFeZHljk!P;IoB(4fuS)Q{W2)Zv|f@_-ydSg8vA7 ziQu<_FBSYQ@MVIp0ADWnYVehUKMB4{@MpnS3%&__jo`04mK-zNC!;M)a13w(#*<={I7zX*Jn;Fp2# z7Q7mKkKk8gKHOTf)fL3BoYxgXrTXKDCPz|D6)4POhMgZB;% zUk{!q`0v4c3BC`+_eK{8;d% zf){}=6MPi-a>367UnzJ6_$tA#0ADS55`2x|t>9|~p9Q{7@aw?W3w|s32Ep$E-zfM> z@Xdlh4!%Y3r@>zo{5kNgf^PxeCiph+?SlUke23uggYOjlGw@x4yM?;`>=wKm_#VLv z!1oHC0N*G0>EQbXKOg*n;Fp4{kIPfiOutJvjyJ{K40*+z!wVsZ}3Hee-6G_aPy(tC4zS@()DDi z;Q8Ro1V09Rx!{H1D+NCpe3js5g0B{Q9QYc+F92UF_@&_M1g{5QFZgWm4TAp&e52s^ zfo~T4Vel=2{}lX1!Jh`-D)=VwZGvwD-!Aw+!FLG$Z}6Rhe-6G&@J_}0yzdr#Aow1^ zi@^5^J`Q}J;M2hO3qAw&jT+L{1)(0g5M85 zR`Au};{^W|c)8%4!6ym+I{0M4-vh4@d@uM^!JXl{{HFbO5WEh2w&3%?=L^0Ne4*gCfG-mKF7U;IuL55p_z}E>r5`4YjW5G8FegXJK!7ITx3*HRAMesS` zFA9D$_*TJx48Be9Rp8qNe*%1m;J*alDfsWecM1L?_-?`91m7e0d*FKo{|tPe;LeHq zyzdvhJNN;?4+A$J=r{f9(cpfbwrBWIaPzwuhK~Tx5&EOR^8_ykH{b6ub|!=83;ip> z`wQLxULg2P@Iitv1UJ9aVd7m1K2+$h1TPZ&QSeg1e+E8M@Lz+M3H~SWQG#y+H{T^P z>D&cAPUwFHZoXG!^qmp<{7n-2x!{upKODS5@B;9uf*%V$P4E-IYXwh$*9$%pJSF%k z;4OlW22TrqCU}S7XMvmVFq!fh4?bV$Uktub@M++S1aAOeEO;CE62a$yFBNVMz-v_=?@UOu)3;qrG z7QwxfbUlAj@EG`3!QKaUG50(lG)zAD|xc0{G#z_K+8W8-HWx@8Gzd z9O@qcH{pza5j$ubsSlxk8~7-}KL#HsxcR+?NrFFs%vA{fGWayX-v+N2+Mv2HA?V7IPc>G9}7N7@Vme( z1b+m4n&9SpH1&eVV!D7^1aAZH5Znv2{(QlQfiDug0(^2fkkLK5?D?je=hezD4k6@U4R14ZdCQSHX7*?sd}f?iSp9r+Tm8<~!B<1-}b+ zOy|ztT;I%l2yygth98T5AW!fP@O;5Hffoq=1^5ubPwJxcRV4VO;3EZZ1s^52`5y8( z!Oin$lLY?*>{JN;D)=f>=1k$_tNh4_1vt7#sxR)n|XqNi+J+|KOW;+f#9RThX`H;UL<%k_(;L;0Uss! zli=e7H`n=-1b+|u6@m}W)9rDZ;3tFE3qAw9MevuvI|M(nyS6`H@HX&8g8vbGiQr#@ zFB5!N4{d*?;7h<)3vRxLxmNI3pub-555YGI?)230ZV|iye5>Ha;M)a16TCp1bGZ7V z3M+zTk&qWbFD>+o(C=>++>~Q4_#6ACe98qk`I;uU$=5*G=k9$h+`QVL$4+L)&d>Hsl!A}OCE%+GlYXv_a{CdGJ1;1JFTJR-;w}9Uz zcnA0c;4Iqp{IqkN>B)3uYxB%xhcmOaA)TyDwOCH_a0+Xa)$P+OtE#J8lQW#c)?})x zFrDm3JFUr<=GL@x(Zq`?Ynt1e(oRELWm~ebp{7~88|Ywc)-*RZCP^*~9olNDxhB=n zmTrSx4cpSKmCbc^ZAs=KGR{;(Q?im&oWk-#bx>S=9Xj=%Z*hX4UG;Zpt89=-O`?>c#>6(P9?=#RdY3| zUtL*O)sSM)(n|TPV?@%7wx%q(&XNk7n$yX`bIzYKOc~JyU+)yAQZpJWt0>`=1gEho zT{)vF)lgfNPC9ipspht1RvtL>0Ll8wy4I@3q&b6?O-4wyWZX5)DJ_&ws#GVVt|66l zj8I?IR7+xAYclCjsF|sj!WxH5HC z^+Hz(xiV=e4td5EqS6z?;GwG|bQOoL6HAR=Y3Ldrx=KPlnUls3uN-bdo*24H zL)Y-oRT8?2Ll--gjgrtt=qe3e!$TL{!qg3@usC$FL)j=cekX>m($F^$-YywD{m!r3(4x;H# zhw)T?bUP$@6jfcYf3Xwn^6e}Ae(1mDUmMMD%h~zu^6l$2FrM<;`vY69I-1}9omrbt zvh-(P%Nk&r5RDczRbXcHzRpgw^VxJ;fD3t)me58?*!x38{ZsZkB>Y?c1Ia2!hkQGy zx?U)I5bS?zzl1|dp6W+`)LwMUZ~M(|ze?~f)Crd3d~~Dn#RUy;q3j&U{#*G~he(UV zab|?NQhDUc3(H>t9_dU)X!!TpG)1)vHssdZYTL03$u@2%dFEwB9lBs}T`0Q^V*h6U zoahfb+n;|U`{`EiLi@*o_iy$e*n|Z9rKn3?Y?p6e{{vv-Iw1nD{*9_5E|lG*@{gyn z`M1AletUmqr`h(~^m^p~xBC09Rwb>93R3-PjNAF`{zKidwmPH1-4cE z;qoo44(!`L%GY{^lnO;=)7P6s9K_1Qciobj?W4Ne>1oyFZ@fq6qtLS5*V++zfWAd+ z=35*8B;Hk98;HvMQGKCEPAbH69M^;@e)5OHXSa|8YZnj0k=4xV(wImEeVJoLH9P6+ zTz%3Po0segg%56_!fO|hkZ%aslyoyCRlMoH0qS6%ZEsGoqASj8CCw|&vy#>uYwKKa<3&L6JTWIjT><!?SdSfa?Pmr&7|3r@payXyROoy-UYdCC4sePCSdRl{l;6@*W3q1nB5K_;pbid0aoBAe@~3C||n zkb86PEjQI3qCA%ktND!b1dylZZM1jPgL8AHDt}9VJ8Jkm4y;T`=V^XOYS`^|jIH?JK00Y$T@!E-DAV7{4QFw&}JW9OdQ%1W9Ru${T( zeS)mi6Drz`PLUffspPrgevW=KzAGu1SzQu>O$Fie1>qml-s+cDom;yo1@%Bek5Hvt z#K~srJmIY})q&K4@GsJuerd;QT)Df{p+G_S2&(M5A@|1In`E`O=Y@A&QQ0*!RI!8Q zh2N_9`h4j0r%~f-5=K>pD&x{Z72C8>#ZH7jnQulux>@<%y=qx$qfpU4SX-GC%njf8 z5C_x2O5d$xR%}N_z^~a{Kb)%2*$T;Jk>%8(cJ?jPRA=(V_8l79)pr=`;Mk>pFt2>- z6i10!(RUE5X;VJ+E=Ng=+{hN$asddz2damb@QS{LtfFrLQ#HH!Z~eQlb}=1;rM-o| z_R!Yw?&}()()d*UA11vU{v9LW4RYd^azxUsP`HB348haa<%f5n?}dM^T|l1?o>5(L zne2-6VO|i~17@Bo37{ENzREHtL4NqM@uBdpg7B%RK6G9O#zF3`%L-74V=b%E(yF6| zqZiu4luGPEBM;ulDW*$kSB{+jcjio`$-x(!lLJ;EC9P%K)2gHM7lFFTtG@q6a=fbl zUYL%&f0G|fvqAW5L1cp(@MH687gxbx3|ULomx$bO|GeDD*bo?Lr__9fbYBA!5~19k z{mUGo%KE`pyC8&q3HB7!zrU;%#@6^hM^v zUwM%SXfR@MmQ8@R#q@nBp~&Jg6a`V32qP=DGT_hCkTIn_anjzB^DoF6D zCw)WH-v;NaQNBT6ob+w`40#5FXp#gjac=oC1Vy2W>NB}nZpAEzd-$ z`Mt-dmay%ZdHgwn8OHzDJO)Ja`vh{ zBrn@(yvlhHy43n6_2q_7L77^}SZ>8vwFQwksCoN^C%f`1C#U3AUduMo0wp^s&C0KX z$dBCX$MRXyI4^uEFMKlXEtz`sVRA-o+Nrb;q8#*b|E`=qls^>R5gxiE6rQsRjNF}< z-342BZ8?uwL;l{nR3fWXg|UXEV|S#2rpnx`ozpyUMCYCG>eiaL=<2td+F5b0!wN7I zE25g|Px`v~BzT;siI>6MF zzj0HdT)%CxyyowkMV^ysaw2Uw-PDh_oN}zoZp5tA70C&0kL2WFXovif+%i44q(P65 z_IFCli{xfTUMz%HBAe(aG4kLF#Fadoov!5Nm3;ixLt16}ndv(NVCPnxVI_?aYo(q_ zKCm)j#F^t9@VDLD>b-Zpj|{Xy2hems{?E7M9s37FkEb zqI@&$cUbs%#ev$~to}UO0cp~c&6YqDz^?uQazWkHRoCC@>Qm;&klF`JkCI^BeyeW2 zJ(VA>wHqcfwSg7+YV=~BV--`mW7=hD$LeRODlAi>$Q3CC;o9)e1>uvqwTlxlV9|Ie zj@YNdKjwz3`$fBE@7wv^d+QY{In`{KY?WmVW=rg^>eqML6Xl0L$q)ZEA{626sXK(i z*j&tAPX0m7!#sJ$=efRzc7!4?P@ll;;exy#LEK4?CZsfIOYQ9iqNwO>LgD7u? z5ns}|j_PO&>e_-Cm_Ruz@1U6@Qiz#sdjjz&+!WtMm?GV}|Ik&Q_({@HEQrF|61(7&89=6Ub#q?8= z>t!`ne{Y-$G>C8BJh-M`TCHr&T?4}B@=t%6zx8`f)u?5|8o|ANVb%Z+yF%gZ_YC_~(!$?dKDIqhk?9u+yTaw%CUJ%YaHRei5_L9)MOXwAsn*Qq7* zBkQG_&=Ty>oBL)Z(l+*3ZpB}?gIEn0R`f|m*IfaW zR-JatUhgqOC56Ick^`X#nl@5gQ0H=5NXhFJ=U9Q-Bt-WL1-`uMXwi9*5M|gxw=z*r zQ>$RlibjT3*UV$Sd2|+#`x)%7u>#>suS&-(Q4&||46G= z^-}lZGij$M@1=b6oYH~_>A>ENVQP3497l}@`>Tp=ER?mcBv{@j)=_#Q6j`?fX3(DW zlYZD!xbur@vDM_~Cw+n);5NXDCD1alZEkpf4HijkI%`W?9DNGf)OmwlXpIR8xqpbz z*Qe$e?V`;9md0Crj-o2+ayh|m*-SoAuR4}$hH}Y*YvC;WfCP(@H$VQY- zdtcw|f!Kl(`zVUs4ddQ^5xdpy5i-wLaWN91xeO{tT?+e8_!e(H+KHHO8`|6M4Ytpy z*#dGc{#$3prld3$9WP1GOLq0<$-eu?oU5(v-8K2{HVpk;@BWd!&VmcF$O)6Oy!ekS|3@We z{3HASYl%9t$fm7dP#c^-rPMbw=CDB82X*IeTci7{x&6xM)?`1rBPR7ZZ}*{lzJ6sm zoGSH41_Ur)_bXXNZh1yVD_GR%dGUQvt- zPT6RlwHq6~jweU%D7F{&3tE!Ka&q`+ez=7KN-wMB=7w_)yKWrd_|l&n>0btB3A{!(bud19 zI)?!?iw>IY;X)^cupP!k?>D7qkcue-e5|o@zM4gaRoqkD)VHj9PQNKf4}iR|Ho1{W zp)fUrstI}ZQ4;%`SO2FPkwRMQq%Scvu+)8Ab7%OIio@s8R0rbjv$_779cfgLnkE-CBPOJeEACECa^PSZ zL!f@M7r<#?#hWSeHuk3N(n(k!qW4d9HlXf0(yFs((+vsj7(>mmr%K-$-HPA{X*iDk zkY@KR%K4)Sp)6)_z@2V0Fuj z-ap}%`+u@eZbxNF|6iME&o}?GegD6h=4)M!hWh*cCl1&KB?taCG2+lKFFBJW3CI({ zx(zM%DWUN0f*4GaE=*Si;qCe1J@V}59PLvxkzRj}LsRKDXkJQ5l{v8ovk!SFaR()0 z&zDfq8>&i@{nG}g9qX5Niq4ap){loGosNz}IREPrDS4LDDxN?`Lj%HxYGFKfz_|PT zG?Mo$&o6p6w_+y?=S6rwcCH4u&Di?YcniY6L#0#<^Losq zn}ha~CqrS}s;bUPH?3svQEV#);5PaN+Mwr!H_#5f-^^3fuBSrPeih^A(n$JB+JUFi zZa!05J0N_9EDggTIEna3gwnk5H@Nf8-Gp05wQgnY@Xh=Pp3kp%lMTo^T)IwXuXv-{ z1?B)c)V?v<@0;-=3a-3H-5S()buw|WH0c->;quL+*ALarK;*@t5^pLdf$)(5;jQ@< zTQQd}gyOt#b;Ti^${&#TeVCHuN`$j{wco2uN(ohL$JzW2gtM$@g+?{MP6I+&HO#7QuUttn?c;&;66lg!@s~0*v$H7E`Xs0MMH*x z&dvJFCvQ%0zD)Nhd7VD2IP01q@++_8`IT{r2y}aZqk;E*73-;=RC*u9`7ghsF5zuo z#Un_-o?t-uz5LVr^Vz{r_^VLGVZ9_XKm0i!#LT;*(pwce{gpf`P5Znm!ehgEO>rBt zy;kY|s`RJ)PM_v?!egq>sm8ASidx-w-}g`(3V&MA=`EBt52F4nDml!l_NSeSj9L3z zc+5+`;d%zwGr0bR>tB(sYr|b%!jm1Ce4_NzqmM})2Xe!o=2m=tCciTOOenlJwDp)8 z;b<+~8y*dzxvr>8g6i$*X{YcwZ{0q$)w)A?c$W7HM_ljGdgDV|4{H$d=gr}CDVP%%s(6=REYFZxGjNZ%JwIz} z>7d;3!G7V3>xO!+7|*5dBrV({;msMLMY>!Ay1m5R7Lippv7z~8+x{+FvQXJ0Rr zyLHs~TZ-`7W68(?c~@lz^2e5poG^Cyn83&h6UI#lv>y=|JvMO1=&_^kD7_;vV&rXj zg)lH~!ibT09rCuo1iUs$Zz{@%?}168yXc;V@0cN#qlOoijGHj}u94Y+Ye!C)5-1)% zVMJhT=^e;eG_h;o*3yzd(eSZ&S29pC`nKYdkz)f&NlEd9krRu@jTtd9FsgJyN%6=D z-Q5=|>_1`TouwnkmINk@q+$Z&M^Azt`En{5JiH`;H(X(R_ta6nZS^BZ1nO1)Q>7|= z;^fgKMa3jKF3^6W(o6NcW88?5V~9C&EMBE78X3T=owtt0yQfqBscGQIiQ~phqFgX# zBCe%lhU1M}sDoWmgWHejT5qD;F~u=@_C6KFAE1YY=f@R25LW|x4ZqnX38Hs zv2@g^(M6-FvUiNUV;nk6Lk<6{d;^trBwRA`j`1Zhd}3))(a4DtN0pBG-_p=`+yqpy zWc0YP=+$;@rv%6e^_uKPE}1ZV>@8!*O}JzDnE(BX%1q@4M&L|Er?V;1foU zC>=Xu_}G%{KtFo`PcBB21jdXTK7x8B-V`pqV=Q$hboOGpj=jt6xCL+e84j0YHl~Rr ztiPQRG7zpp7=TD_LkRJBO|uU|5ke`#Y=q|# zK1TQ%;T(d2o07H&oe}yXT!SzgVJboe!hD2h5!NB>K==ybG(s&xbC<)>1|b(=I0C(o zvjE|7gx3(>M7Rj&ST`WhdDd)%O$eVN)F7Ng@Zr$w286i?n-C5lG{pn1YY<*U_!dFK zNsk*LfN%rCe-Q3LxF2CT0(~nkeZ#AUTSPa)EeNv^=vx}MA$)~k;B~rY2%Qiz5iUa* zi%^a*AK@_s`jpmwgrf*&5!^o15#cF>T))FH3}FMp*9d13n&Q(yBN6ULcoyL}LRY-D zwjO~yyzFZ3ZN^u!tCxd{*HV}B_-3ro!OPhK#s>2R>}|%b;cv5d7=#8x=n1x(vEh6* z+rhNSF1`aPY`BB3(AH^?U#C66A^!w_mP>hDUkAg%w`iYftdRe#oy5h#_i8_D>=u4f ztK_&yp<5jMC*lt0e`sMHm$3ejPDMPVFC}uRen^ss^wT=Km7msYB}sW9<>34HFB}&9 z!k3xsW<-yf%7VwtnND^yrT@m+AVkYe6uDfb4_eM;ItrKRS0jCs_m3(7vl<*2dH&Y;vLGO|BPW*tPrxl`sgpR=Bpf(7U#{q$u?-$r%XFb1^9P zIVCy}30qtTTrm59Yh?_(#lcUxYC$^qhM2=KVE+(v6c-0y>)!2#3A^1ZJTPH}=Lt{L zge~sJJ=DT$J#Ts-@TTXuowC;Rwg<+&tvF=WTF)*ItlFhGWYq>hQorBxsR!Nc3nI~> zk9+2LLC*1R@S?YE@XohT+VJIkzO~2#W0CcoVvyuJUKH|?x7>=E;D~j#Dj|oLTQe-L zBx7A*fFpAb;*TOH8|2_;J-7~a@JGCxz3e)bdL3F4C9xt0f58i_S2xgl=Y?9qpvHUz zg6>B#i>W{4IP7I3_+gmCM!^iI8zHqf5K_5hHzc#sSIArw=CY`vlm>5E+bwu>yY-C) zmw#g&A?k>Al&GWD&*TB>Hfyats1o0!IMU6;x!UHCo29COP<7bC@HJI z)D@)IP>6kJp^tn=Vpl_~hNv1PHWXszjn*}SDeD@Y^}&?0zH)!ml=4Q48bR@*M(2Fg zC6+a+^--5v>D%C=X7p|Hp;0&awi311_dX~G|I+u9j}3%U|6)IsF7|)!M`@q?zqOS{ z{QLYUW*-tT&@oc|vtrRPXUEQ^OC)waF6iE|n`4oEbL{!ps4>q1lHvog=VD>hIU*rg z-uR)$5PYcd_l=?T`^HBaN9E@={-H5heZ28m5;)sJrv8f$B9)md3&6r7D41;E5)S<7gYNVidd)8uU@XwY1qZx*AzYIzNQZ* zAS33-2NRYjfU!K`HPS?_`T?o9kw25LJ%KdV#GQ!8Wbt6af#&R52cOq;QB!H+qNXdG zx+gX;aYNJhnv#j&^Bw!$iEN z*@Fq7mZMOacYDG|M1PdZpgE`ynjdH`g&s;=m598nP)jQK1PZ1# z=*9Sr@$k{E_&s!as@e0+*kCeiW;`;Vh@X!&lb@yX3i)pd_d}xtR)M?)nxXI(2d_^2 zAQ4$VNIa8>V$UR=BkEk@x)z|;wb;}G)TS0kh&s~ZXHe(`E#6E5_syiQ+JXC3yCdyX zyBuk^up_nX@fP1Dq3OR%TG$Z@)aJ)qyqbiTdR1{~)E#f}WD*?pq~cIhNUcMmb$&~< z=KPk+l974na=tA2+4f*O+kRPxD5Jv@9l&^^!xvG;7ahJO#=Cml?pmG5BE z;+ERv6u!9SV=YnscWr-eiwkKa?y?RKbi@^NPSTN(B%iz41PP( z?tzXn^?{D4AG*bpNzah&&m_H*q)m44can}LLF_oH0@A_PB)vq*FD30mvY+ousv)u_ z={!vF^Ybm|wu1EBR!_Dj^2yeRTcfDMttqqL!FOG#^aygHj8+F*$!>74)%@1zu=86# z+!|UQZoR)PD6&u%{YTQAmSE3m2_N3VA8WaesC6xmw1m*gz`Fsd;@!Z*ZQzB~ZPw7` z=eDQYLg+}lWyuhd&c?n6&L*nE3mu^63;2n8%5zX89dV@PZ>0FQmOr=ECMWT;tkX z1RVSq^Z|5U>H^ediIft=P!cOT9_)x-ez4=3ZV+74ZErW(%Q2mHT$4gGTgt~NvU~H7 zQ$8ccXDREuD#rS*uXF|Dm98=m4S;t#ZtsMezu$Rp7hKkNo!^Z*(hsB?6V-y0H7T-b zNRtF#rF@e@u3gmWolekntkVOX;h6=UcXS5ze&>~4aM|1C%PwGk-DNQqw!Z7Gt}^TV zZjW`NW&8=)r;m3nS1ANO>iTO}$@#Twq?<9`)y@UWR7rmRZRhD-umY{`0t;{Dk#4Z? zRy)JI8q_wR}NzI#pgs5AF<`wiCe-?~W-xoTgxv)$0JXBCI$im$tU*&SXx)cr?Xus`Xx zzB}rD2uf%=JKnvr2UJ(~INJlN&-SQD1yzwcCl%D3)Oo4Vf{u4z*aHPE>>)XFQtJL_ z4;1vM;!r`;dz7c5po-K=Tu{9p`+K0E3Miq1s#4dG>NTm0(x7@#+M{Wp9!*e30o6;z zb^)R7Vz1C9C-A-EJtE%|zf1CWQQi|mwsa!*D@A0jLIJlRJY&!6nGMsn8lc}a1|nEM5)bH8{;V2*u9 z8smpC9}xM0Sb@_0d5un(wkNpH_IzG)pYK_j4sK=o2^it$C(=Lb1y_C6>k}A( z_e?TA&j9&(#;hQbvw|}-LC((niY{Mel4*Y1G~5j-)BHSY8u@i?+V(W~b$i;`G;MN# zpG})DK+YF0A!~q=7Ya&m0j88J8>u42vKW)E| z6XJdW_uK^cJl|8zi+@kK`QK7(VYJdG8B)ut%r~+mcq8kbEbl}|?7b~w*%Y~hUz`1Y zZ&gz7iaw|YS#6gzTgZDrQHe&#&EbTEV_Lvk)3rT9tuhsxq;uDT)1c#(82tAFK(Yd(F;#I1`uUnX58o z8CwLo0~@~m;s>Em(w6g|#3McRN#Ll;0-Q&ekusI(U#6qgq*Jjmd$Z>k)Z4%4c^Ey* z#Si!VnaH1eZbqeCd^4Ge{+zxP*17mnvTh*qz7MNh{C#Se!7y@V5Zsk8j<_|!zli)R zxF(axHJMAY&{vmat<5HKZT8k|kXy6&_a;(xKHSUiA+rkkgS|fMCC&V-*H67<4Swns z$v}ok#;OcSugch&0l}R#(s08I2T6J9p=i;ddu232$ z)1?m!`NquMnPBhE{5sQpSKT(0??Ojt6zvFip(C`z9XE?*?b|mo^!5{)`J1(9AKRj_ zIk8zuv-?>y9P!{N#-S%W^!68fJUANSK1V*C$i?HLx6k(U2G4B5^!6T)BAgav^P3Qn zi8NQ8AkN2Pq@aN`5I8uB3K}HnX+R>?+XSh7nmZg8V^m%N+t!oK(utJn zDK(*93w@_cbIMB~QHn{uB-SFtDptIAZM7DJdO6R0>ke5y#=@uMBwq$8d$U{Rt*LjA(tzD#F>T2Fq`lXKS*4^>%?(807 zs)9Wl8lozaDtm$S5?;tb>vZrKsuu_}dk5KFj7&6E&!%W?YRUAv9N_jsn|DzCFGFUI z_O)PLX4%&=n=rc}kE5QTe0-X?>c)8&u#$Xe!6WFrBPy&<2;(vs7Jj z4AcPUlj-tuDb?C;!oJiQC^3&3+vfI*YKV3`*)aXlFm;{gvh)T-sG)SU8Rf4RUry~b zxSicfSJZVpgBrJ>K`R>6iUW`?d+3!76{;#+mF`Hg$j-w0%H=nahFu*sOe!5%pL~hx zP}f9FmC1uH=#kQE)F%haE+ZXDwp}Ytr5+@+4XLY$G<4`cwU7?HU>F^LGSl_Zp)g5+ntjx2?w00@gCcSu8=T zROjffq`7sb^FLCiO^)++3EJj4$4JmF&raJf~sD&$psL0G@ zF}J2_riZybKjF!V*@!vZnI%wW`k2d|-38iAKl8hLOI|EXaQC6_y)@%kz2tb4e5qVxF9I;x=bPnFk|9!ePvFDY?Z=WW~(WSIV|z_TA?6t*xt-V%<{2D?$C(Gc z90Hx$8Ri)hg$~U#R0?!sF3oe@3sm`3=GQzoOPIzIG|w&4-gFkwJi{dH#gaA8a0xS5 ziiUF=w2koxqM+e4GY)8JPA{cuJsnPqnqJFrIeiiY{Z79GnF-EV39GCpXoAv|-lsnsXB5>t>&i361Tvg%hcoBiC=QumjlQ-?UDrc7~3EZ&6*=;a^ z8&^1c$Rci9A|AEC zPi=q$`Vzgh;nLeWH9gs676~@WLc|=t4lXCZ6wsfdb&N8%-Yz-WTA@4Qx1#llZCW#STt58ZtCEK`Fe=BUPpA3X|g6a zrkFZ&tFgc_=B}6B#lVAxCwWkH<Huw$A<=ceW zz9}1YCwKYChaEhuD`Z+M zcjc0Q;x*JGmy#0o67K3tJRBQ3aU{qD&JA@O&4Y1`ix_EOXcHk37eh9)Ax*jK%KFl; zR3*5{Yivk7cMYyj8%$|%RcVy#i1W0hNqxxgy6aZ*PCSPpw@O2dN!&Gpcr6`?=49@= z?IPerXBl^?-zbDRUYMi#Qyr~dh1)DJ8bwV5^hIH7c8x#43S*<9jy6+cvKZAbuCcN{ zfx8~4Z_Edj^-X$7v&M1PLsXA=7tDHylHy~gfY%FOix=qrwmDE+EyJM)j@lD>) z+%eKEaT|c7Gn(GZqbR-{h}0xDo6OxFvaeH80C8f%bncF)nWghv(A|<6!ku8?r2Bo4 z&DqVL;zEXA(~7DwNxB0)4vg0IEgXnKM_ik1NV6fo>h5-RE$Nn{Cb2n6ZcimU;@aW` z1W38LJG)*gTeWvP)far+om1Ca-8m{PS>^L{_ht3@E>mgkRaztNzOp_|jsW!X`@kh_ zj&>bNWYK@e$0=kQAW)jdR zei4UCcFmC`oz>m9%YmJQ(r%~H;#*d5x7_-~x0(?}UD&{4_w6(}B({bvQ}?-unJZ6rd-XH9Q@SdVsO|HgS%J9cY@`sWm%nPgQi^ZUFHDE0ogT- zRLScWj`H9h+fx|un5C}95F-Dm;Y2f5H$gjAHslB0(V04CTu<7$vLV0d4*6wc@!j9h z9BH!99`|tvzNZcbrs6xud&+vH)923<)8=x=<jz? zeN}0W=y9(%gF0hlsz>9K9TAa@jfscH<6x%lLe!r-&!qL^8!hW5?k-Phiy3qncewBC zPiQ!Ixo35E{u--1l3!yS7I0RQJ3tgl^-R?y5XO z#XQG7|2jgWdC0wRGNJ$QLieJXgl^|U-Afh_8pDUVAAXL|9lY56-<^cU^6~CR4-y*3 z%iJrpWT5f9-2J$p(4Bma`-xVBCh#ivQ(Xy7(%s0B%K24~MSG!-@L1+rz1XzEP&|Q3=`xQrfpsDr7}GKknX=N$6gF##7y&P&s!n&$dAXr{jjl^X9Dt@8f>v**TtI1y5j}-O~up-~r}& z`+kBmc?$FFSxs;jPi3BWHxiu9Gnr@K`vm9k9On7pAi*#XG0#U@2f(?!ka<4oOfbTS zGS7ibg7@=b%=1})f|b0OdA=Aya2_AeJYU^M@Bv=NJcphnSjEek=bLo|ALMhG=ew;0 z=kqG&Is6{M1$+tf9Ql&qLcW4|eykz*5MRYSKm9>)5x(%i^Rp9u%v#JhGSBg*1efq? z<~iAp;8MPud45YH_%PqcJf|)p_y|A1JZFjs{+AzOoMaIi-Ruiy?%Xlym%$GA%qoP9|6aqicI$xahq$rCi;VrB~P6Fi^^H)~4xNuHt! zFQd=jT2Jv*O*CR5!cX%|P59X)!mD_WCK|KlgrDIdO~kS139sgbnuuqw6MmKt)kFf@ zL-;v9OcROhIN>$CSi|72CHy=euZdQyQ77ORc$p>wtR>;Kyj&A)Sy#d@@;RDFW`%@b z;#HdHz@`yi$Cqd#g*{DpJzj+po!KjdU*@Yc(Ut8W{0d*IiSFzp!W;NTO{B7K32)@p znh@+H;Z1zECeoR=Gw`c?pC*E=3*pWDfF`n7HsRO!Ax-pV`GjBRM>KH}qaV1pw(#Sc zxP;wC_ziwW6S-^>;cD*CMPEigMsID!UA^eX782gZ{kph}tt7miC+H%dy+rs;9?-=V zY%Ad%JVh4+*gnELd8#h1Vh0KD;+eX*n*B_8H_y?n=!Uhrkf*;bwR8~az zOMXNb_pk|szv9PraW9)r_#i){i|K3y;X~ZPMFrbI_-pRsVkY~J@HgDg#cWnf_*erfhl>SlG~uH>#Kl8w z2H_uhAs36;0>U+XC>Ia24+#InhjFot#dilj#*4XF&e{|HnUCkAiiypwg@+DlXVV4m8jj!P11$HIj-}x#oUSu~B zKE>B^v5t))e420M;$=3K@EKms#RfK)@E?3P7n|5p!hhn0Jh7R*PWUW8z{Trq58=P~ zAuirvpA$aEk8rV-(GRm)=lO9iwzEG7*YY!5>|m}`V4QgwVi#*hm>DiZyv2GG)(pQP z-eGjRV(CVLA@;I+33DT0i1*k$!iJGzi1*nugiRyW5FfIQgq=8d6(6(1gk46CA@(zO z8gPseGQ_8>IbpX^Xo$~Q3So~i)DT~?AYrdD%n%1zf5MhgY>2PfV8V@z@rL-8jUenZ z$_(*6n@HGilpEp)b|2wbV~!z?vIhw_HmVF!!&VS(Vk|MlG4=xCIAet&eqmb(H^qyD z;so1EINn%mh+o+kgqs-~4e>jpZwR##jA}!iWr1>8ABM_O2PrdVG5`A65%$6%M>x% zR>Ex!zbQQ0KEmyc1XEbrLBh#Kz!X01XTt4`6jQ`%=LmN&QcclBOXvyQ(a1DKQ!STp zijiZAW?CWPPDaQS%{6=@ufytW6q=%iMnCdsbuosTqNO&Ea93lPDOzjG2zN7zP0>bs zj&OHlyeZmgn+f+Y%1qH-`-E_+QErNk+V_Ohj5((0r2R%%7*(d|qUqS$T0M;=rs$?M zCY)}pFhvio4dGtKDpRCs^n;03hOyQZJ+(^+2aS!U=%vxAnw4o(naFzM}#ji&X}T~ z_AOx?y*tHa+DXE>hRZ4PHP#FGQp4{QS7?61eT@XC7@%bl&NBi|ag`P#+|NjHimSCD zg!>z*PH~MkituGdrc(^oN(qOI9H$tf(U0p{`9{bouG1C}zT7BuiW{_-2w!0gb&8v` zt%M7VVNP+2wvX@tqu42iYX=EmX^eM@BJF3wR~cnaF;Z)WTXw6^D0hn6v<`%?Hs(0R zXbn|ySc8lzr}&S?Iq(o;iBsIJ(U#e|-dN!jV-&u@c)}^}Q20h;l~asW_$K2yrx>U3 z&Bj`%7_aax#(Jl?Q{h{UjZQH^;UeQTrOj3BX zvC}CgEBqg0ms6A}e7mvRDW)hq#(2vq?o#*;<87yys_;1D9jCZk;qk^Er?^MqJB__g zF-_qK#=A~&ufh|J_ne|!*;Z=obBgH-PclAoiu)9vY#eZk3WdvzFPvhAhGhpEXXB7l z%+%@x5M!8EYRrq0JhD$uG@G@hL zOFW|RqsIL%@n40P8&xi`OyL#ALYGIL`CE?}OI+enjZT!TCyW&?v0RBfWvp_E6$(FX zJm(URDZI*9>k^Nv=6c3h?-DB&e%5%|C7w|DIpY~o3d6n@3{$R*Zj^qY#-CgXrhtXKF| z?orXU~ zICVJ$cNqyW!lm%rMpBH3QTQDr5F^|Q?=_NRgh!WM?_DD$MtEr^#dgm~jS-f@?;Dvh zqLH3}qay1=BPT|*Q+Yo&LNOv);ZKZ$7|~wI>^BNyLibX593H-^QC6vh9- zD2@@G6#t+xK1Os__-msqMs!g!-x=jGqN^_J^@A}dMs!m$KN?jrqPxO1#*!G(L*bu{ z6)_@J;bX?C7?GwMy;#5&iU^i2s{W9V2d3_;+J>jJQd6L&!R1 z?28ej6h3Vnh!MBx#l$~j9EuU;O8;5oNQ{`S%jxHwaXd!cr|@~>M2x6VxYjrsBW5V9 znZL$}naWqX`CE**Mb(j;XJW)GrPDASZZS-k{n<2KZZTY8r|EZ#*-GAHCb-2MeJ@UX zEUy`Gi$zMOWu~~rVuc%-UEN}d!ag(AEtV?mH`CqXVO>r+P0UQUctqhiGsi9dt8h~@ zfXj2?-oz1I<_^-++vmDw=>J#;u&R6vN^{sRx8}zta6KI z6;3gixW#h{cQRMF#Ttb>o2%U7B89t{Yu(~`g}a&?-Qop>yP4H)@tzvv-Ob%@u~zYW znETw~MTJw%18(t>vcIQ!$Su|>oNj*S7V8!6Wgc;hmle)1e{zdgbU8H!&EsydLGd%q zGj6d_;Vknnx7eg`w(0PQR~7DUa*x=o{LsgAdBkf9Uu60{;&pu@KDlaLY$kZbHia)S z10Jzm*_msmc*L6u_cc>JVu!;0%uJ8isc?TY$0K$r95O>5v0LGMv(O{n(w`#z1$do8 z?ALR1fCrevJmL!_Q)m`@#Fq+RZI1VduM{3=mU+ZMg$JAE9&t$FYt1LXRap#ysK?zv=@BFex>I= zbBR~P^2VgU!d&4MO?Vr^Gt5<9(NxLLG}n4XJnv2XS>{HsNKkoao7G;?oL^4-Ip%J! zNaC`M9x(TLMN9q^@#mWdyrMOKneYPhkXN+fZxUW;9`TBH{3PLr%;R3sp0mEdOUyG~ z(UJQJFEz2H@5IvxKWw@z(S=`4_z}}@iEext;s2TmmgvF5gqN8COQi8Ngda6iEYXvH zPI$SQYKdOFmhcKQ(-J|Rm!46KWP?PqK~S}Q|3_1li82% zuAerCSswW|fwjskwmiKh_Zf4%B`)G~Nn*8GW{HdC3mVq5X1OIUQA(aO=U5_#pCsjL z%qmOdD*p545=&gF_%E0%EYVl-*P5#=k;i4{UuUkh9K2gwJb2AOG~Mc@<3~R1V`*Be z9sCMP9fYXD%4nD>&#Osu`1G}8(;l#?P-nAQUae}v?oKs4LRY$*44ed;(| z<=AU$4qI6||D34r5JjwP9lu;-TT2yExg<|UWLaZXjmGVetp%b=t9Qd}Dm9f-vk*OC z_0fCELwSlEJf9Kgb(z`FRtDmeJvcIrdcB|4u=6e(D2<>-6~ zQI8>7YUMV_>EJI?!mEfLu`We9TY>QYGECs_P|8P$mRWrp81CTTQNl4q%dNZyx@2=i zA0#-Fqj?{*`suu>O|7*0>%5&!J!xI0^E8`!+6w9X5~9e=XRLgk4piJW zqJ9`f3F8p0v98d2$_9|GBi}pt3`(s;^nx{@f#Ir+8g!iJNbY4sFIrb#DCgjBQ|gC^ z)>&6ID7-;SH&At&gsCULY!&L6&DJ$K?_pD~TZ43d zkxji}4c7S;Hnr8dR_E8*)OKr#&Tk`%+Gd9}ROh93+AixlomUV=w!CFsuk#0qdKl3= z)(sa{1E2k)RC2*y>qecwPSj3B?^!oBaI1rVLJ3sd`_|1m|Bk3*h(5G#xlpBakApjL z{_pZ5`q&!w4-q-gDRS^0Bu9$(Tf88&s!nxymjL{WFBwI=KMtP9@W zq$W4fJW=&~0mSx{=(7_Lo;5Ud2X5H0LkRBmAI7#xqY#ArBrs~{-haECY z472V={cY02tb26ciO8OaEM`r+P@#M<>EHuMW(Xo5v+n&@8TABH*)Wx)XCjJaR{8&0 znm$MqHLMAVf+(GouW0fX6w8yk<UPZP;-Qqq%I59&Q>vm2eNW5G;sfhdDn^Yxx|%b-$v^}-=JPqmXX znY94(KatcH+00s~^DBv@G1G@x59$0SJN05_EzVx3R5g)e2+60CnjQoqk* z)>54>C6X%JpIHypYgo7KpB8*2;#hQMXxe@LqP7q0D*$9nZk|1j%$%zt+37-qeo^IAJ~EVI_?yb-LCW{hXn zi#l&Abg1PGZ)2ozq(sGH)5PUdH-olXo%e6`dCoNj18gSsQdd z*-o9ttfzE7i^wWO<;)t{&^v1Ke3Fu1Ky)9oHe!aA^XlIttp6nR5uzE)+7#WIHE6S= zl>95ASXvrujyRa&B1KB6iwr}ROHRxqo(ole%sS7sgjKa^gA=m}=+veW5?Mdpu| z`2YzmMYNJxJ!~PVL^ah5l)eekQ_R{OZDhGekS(n|`60=CiD(tG-nvl6!B0~1Ux-#S z>+OcgQcr!P3Jl<>VR~mo&oOK7g?%Ghvpieod1k$%^J|Et{<4-?dvt!QO}@mecXfUz zku<-oXV!Z1d8M%UZqH_SS$^U*}o z4F4Uoe$aWDoqCvAM|3{hCXX=dDCU1#_(x{_i20vL>J>jRs|NGGE&MaHe!~1uBsJ4< zW*x))PbArVl371v{wJ~q(QnN9KQCn+2C<{fYITNIH6OYt~t;|3p%qy_$6f>pzj?kw%*J7uJ6w zX}b4o);X;IcxIdKMbucc&f9j;Cpa9uB_(x46sK9W|8PWu-F<%&q?*U$OPn|#Oe7VU zpjnLb5k!tfl&D!6S7!tDx25R+cJ3t2!ftc{k+jEerQs6^_-H0bs!Tw$@Nt_LZL+Oq znVeS>`8J|t&B9@w+^R+Qm7h}*4VDg?<>LHDB5AOsXm}By|3M^;hR&Mh=G=waNOyPD zEDz`Syq>C1cg^y0-hoK!VyT)1oA8sks(wPV8gZUy3#V%qJ~~04?U2sM&@6m_;#MNZ zAj;INSldF{a60%sltg~Y)-24W_Y+Aq?W0-vc*P?`K8fgJ%^GDl4212MA2(Av&7?V+ zg%4r8O(b=ROEn80#rTv+YLYz7!Ur;r5J`>RU$gMBjMGHY?lPoV_;7}aXUj76a?NVa zc~c@=BP!6WMBY=DDbFk9>d;^STx<(osaY*JA7HB~)T|`VZ?wsQn$?o?+lizt>>$l* z#ra)C(%`vPvs!a}G(2j;P|XT(zJ$of5nZoYZ5o=OdgcaO`bN!a%lS@Q`ew~)$N9&0 z>M+ep=KMQ5^;XSl&-t%Jo#ppr3MT5_>}~3qbqn2}y`Y^hY-OxdFjw~5Qn9lq^Jc%JU^??>@6j&8 zSBpA(v4rf8WEsv37RdfsTSVL-OUeFSKFoGzvefKT3TCm)?9)m%o8@GmQObI=Q1%}R z_F)Ctf650&&Wl)K_E`llW<#_8Qt%QsEc={-IjlJQyn?xGe0HsZm$I^KhkX3u?90lt znS4s-%wu!1H3j>zaJH^se>OLpD|i`;IQXToJiP$XhnllH%lbe|b#`FcdzIo8_~cy$ zJHaRFv6izl9I;Q?-UW_O4dd(zN4zhc?d-jH8hL)t3I< z5j>*NeZn71 zQmAKKu%$xj2|XPH&ZajcbZGxz;?tdiXQoYJw9IdSXc1KXXH{>7d3aYn;{Nubq^$w7K zfymg6$qv)G&LpIOPb)n8^24dc+)b2L4~I01Tz(y5ejB0 zG_Nq2tx(m_U~iRo{;*&lg%%VC)uUwpL*s)N%hBs!R2IBMp~dCF9O)SUk~zU#g_ef# z`5&t0pNMYIW7}q2uUEy!z|#iaCW!Sog8dcpx}sH&wfsRfQezt>1TT}7i}fW1Lkjr= z!F+{clY^Hl)Ho%0g+fib1`8C5OAQW?X2mwm3|^^Fd`|Exg_?ze>fMRhguXzz$^H8nUyx-zzP zd2pyo4a^B%r%)R>hJ3<(@I!iYL?dirW;+$9Nm| z$-dKuIoT5wjAwb-6KxpEF0o-jcBu^uvnSbbQ1)cm8qQ`|U&?GaEPIOnG8LSF_2n+b zZO*E)r`m8yw(6_SM7ARPZhb4swqUEW?~x6F&nCWP&;2dgI;?TDyKuH*>l=I&RBM2Z z1|JIruKP@?+rdA8>hv!VJ)~QhI2P)ema}g0kHO*}mQ}IbSp4TI=)vM2QP7LU|9)w- zWnuoQ)cer;2aWVV_Iw3>dP?>JeJpYPu$|`urCyHcLEYadqe}PtV}kRfE9Vj7(;xGZP31h)64~RD(sOl_DxCT5PEgTC}vK)>>3rv7)6u zsA$nrr7cyeRB8R)_gdezXU{D>?{mGs>%HE8m@ApR)@R-8UgzUpd(V}-weeG`roUA! zpy(J?)8A?1ajK>-tL~)eKLur1?$O3C3M#IAMW5!d?BQ4bUK@RO)s?SmV}V_LyTYk>917mVP;$D>jS%});ne8k;S`|dYJ|PNMDETqKPLKWQCUh z7z^_3`)_v9RepabI`N{qk64Dc zi!6W91i%01Y~4j)1^%LOW^Lu!@_38g57Ae^Uo`$p?)oMKt%OKha1=@M?YYzZMPq3F z$5vjebn_RDr1c+LE9k3-zi5+|bLi`Af6>%0WlcLd z`(M-Sp8MbnrDD@Z3^7~(4>#Ov2zQ1U; zx8!rH8fD^KxBQ>7G_QgB`HSjl{WqGdy!UXCzvwbr|FQL4`YQ7mm78o+#l4fT&9=PvX$)L(QtC0BXZ z`NY4(GvpHb8tyL|3hyc|+IfWWd8NN-n1950f1r|{b|l68c8^@U)SJ5_s{Mhl`jiVV zVx{xd6a0a3KH<~4;H!ia8-LZx+ejXzMO zJzG8awlsMO`YrXys(RAZx|{vcbG)mGauj=CPAb;13aiJ6>y?Lp*w(|Gu3keaoQGNd z%we6aM>)p5hkx5|ZB~iyadnH5{=~L;abfkkf~2>rSY1gfpJA2sP-m5SsB`&Pdc6%l z3p$YTC}1*hsUy<6e zq?R5@ok3e9wf+DtNGWJf2C6QjWZW7R-Mh$Bzse2#ebpoMJ$l4e{=WKY{;qnKzRNkL z<4sIM)wu^z^)uTyk;nv+o6yHMM?c`sdCCl4_?A9@*w&kz&Eu!~End}GRdSbr!Ipft6^S#ff>$utEz|XW> z7qj!l7ZdaMr>_Y;CKlRUyHbAZBi7MtBo+ThDj<5L#Yfx-dyS%)e#9~DHTrg#dXJ?@ z|C1x#yP9Hsl)d(@p=fK<#HBEezXOIEel>*8I$BCUszoO2oPvoHuJv2=mfQ)nFU6%< z+eVn`)M;n==5o2xqxM{|lYFyO$&OPcJDy9{s^ywA={%Od%-4nFb)A~UbxJ!B}`|die-S)C_(;nxC33SQE6$A0#r9Eg5R$KOxJka<1~T87<&s&#mWRw4z)v&y(aF zmf_mU9AP=)zQU!xX$_od^fGUd_5!z`+^CpLr^r=mE@mYB0Bod>arY8+ECwKS_owCL?)=}e~ z<>PXjIrUC9a<~(xQA3{N<6N6K{X2fTzt74h&RFZWu2sfaGdt4_eI6ht&brHQ)ob_J z)W2w>%2eBG^*Q}QoU^0nan4%j_$SuiO+VnR#pm4Px0Y(-HCexPlX{_v^6AjM>`wiz zQ$DX(J}+rW(a<^Z+I4=qS*;>7_q)b8{d=zIUcdECm4aG+Q%LMI3X|^icB9u?^E*Q< zMQ>1aqpycc?;*GO*Rt$SeBFuOPxiBXp&zgpYE92ivaC2>Z@_hd8^9WRE5g*k8f$Iv z0`)3`R@9C1%cx^Wc!YWEOXliODpzsnjR>Y@eT^F>zu;kpdUuM#<$s}I(~Op=zC^YC z>6x6TY|hxmT9toqeONsKxMa0@!VlX6By;l){I+ym#Go$3!83pvhd6>wU#$@YiU?dgRX82jWoM? z+s8xLtVn0;fUfpY8qD6*HL;mqV)mA*yc1jQGsfxkl)rYLP9vK()$-7`iZ&SO^QNz_ zdH>Nlfr(Au_gnw;sd>veohHVpMfX$Nkyd$h3jK^6C0NZo)Jt}za+%@< zOJyF}&h~|FQ<=w8l(3&GsL1El(|#kX@Rrr&-NnLBbavpUF}3m{jSXRRTJ zT*+Ej&-VwemD5{YKx(0rTkW`3Yed{1sLOSdx=*ja(|0droNu=6r<++bZ=kXor|xXb zncqSt_B}IxKf9@ZtCdP^LIIcB!~~U9waU-(%j)P%GDUEjn#j={a;nvrGjOf1)HmlY zc2KWd`EtUn5v~5fOivxk#aq?0`n!D_RP21z2NujsQtaw=>{2acQnC9Q#jak*E={q! zR>v+wvAZT0yL(jZXq26ri`_bo-FN?|*wuf}_gxh{jVw15%*;~oH>luew%y7^g};Ep zzd?t;kiu`(;kQ%xdY89++*Ix^^MYQ_L4W^$3VKAsAJC(XZd`80STi>G==n%0v9tWv zZ7PK`7g5A+(-B*|n~iFey72)P;8pU>CG-nQx2ZVJT)N2^CoZE2q|l@o9AJ>r^I`e?2RC10o4m)%jI#;hbSW6U`+)zzS;MaW4-FJbq(WcHj{qVVJ*$<_%%5X zxSrKSN;y+6quzk?Ai0^qxcN@=FXi`8lGaU1t9k@2lowX6BdL3T=;RscW)k2O>GkEKG{CQ=YQ?{t#Z%!@`sdnC zJH{3XTU1@FF#X5rpXR!j|9SekB6@?~xBcn|jA&1?$H5--8yDMYkLzd;`Z0`sXFb$g zzw=(b0H5FN|JViUE&1vV`TB+VFn+h}tuplrd3t^PZI@ZPUP z>T@awPUXO<95|H&r*hy_4xGw?Q#o)d2TtX{sT??!1E+G}R1TcVfm1nfDhK}m&w-f@ zZHa7KX=6N0KTy9Qn$EG_#dxG_3l+Ja;}n#slnWYUcT;;BqBz92fFp)D4VkS(OFRwUWh5RY1I ziA=0H5sj2KwuIAGERnS`*>JWkV?|=EjY*0U8^ZB;ve9bGMAM5^W8q=Tpuq)!J-@D2}lN#Xc5~CXz_SAS;xNM?%S_rc5+z z#gmC1mOl)zK18F72R;VpOB^{wWprFQ0s2yvmFI5!rWV59To(xTG ziAKts=9X|GLKP_zZD?zbC7O~}ye$<@w_5xaZ?h;{!&V|1kG4|niZt?9nl^-6!|knB zE4xyyOIfk6aSe;5Vu=N$voX!?2`jmrCUyGIIGjZhM88hJw*wKMnYjL9Zkil`9wmE zIV06WmEd%=QTt*8H3F)8*(lX;GR31*{gf${%vcM;@wTXyA_ptm63vDoNU;fx;(X?m zebW6DH5%gyX`2O-?SPt|Hx-BG*ua zdKcVnr(V%pe|wN^MnIhl-eOUW5Ss@ml2(RPnxwB75RAobKXvk)-W6N$K5jF49o z^-B~F9SN9oI;KyVuJqGYLmlH#ED?&QxKJtj+G3nji?oZnY8atnYl~;O%ZX9X>9rYw zxXFr0)EK=^Cf?+kosHEMiBca)@gY}jfj zm2b_7=wz^~G6{#qbU4$Z{3=&v^@uc(@>I4Z9&3$dwUn3S2{y%($#hdJO?5{F)<9#3 zA$fx7HtJv?!e);n4N;K{HJ0WUZjMSO4|zmsSehRSXG6M$D$zWY6QyDgCBm&bOk>G& zrdmODj&4X&Ru! z@<>iFn#wdNcQ)kVh{2IO9E}@J)l#)wP9XW_W|=eQIi;fMY+Kq52iANM?wE{!)l21^ zW38!llKNBD4ztHG(G*M2d_lXyl5>uSTN@%_<*1Dwr{uzhq;_GG$00?{JA%Tb*^#p3 zIlDE1T-ls+tW75u>T*%0oC6OnoB+D!!BE4ZTwv@7yH}{429yQJcpe^}!psLe1fncGYH&U+Sb{sdTJSXJD&q&53XVb5V3{If2Q#!s}!kOU^kFZBEk+RtI1# z9_M6YaWqZCBj0 z6m87LQ2kt+M}T9Q%O4d*QDc~yK0}A&0r{FJcDa6r{TYxGqghlo7LMl%%?mtY+@feE zqykh`f-D|qnhf$HKs&?oWoPPrQ#$igkWs`d$cusezJ{XaWqHDhEXyKP>ND8p5y(W_ zBFV;N2Ax|fXZHwESDG6T5xabrFPzu+>7YqGkLG*u^cuA82+5v)_DgEv#S z8*n2j91!6z(Gz}MCcm(x| zUa3+>>6GOaL(ZA4IT4=h(=uPV!|ZWPW~o1*5jm}v$)##J$(pjRgA`8CB2(8lEu-u? zp|%vpX*T3A)yq%=RkKE28FSWr5pL$xb%(=lrO5=t`PRZFNsqRO=}@e9qT1g z1@go^t%+o`%_9&^HzaA_L#fc_oFi}FaHs8#I!f$IRC{O%XF{XK)mgaaV14Zb1?j3G zt@U`dMeRzh?(?lVk=&|)C0v^;&=5<6(~EfJs7*NsGl$j_c^1ect{^73s`8VR$Lflx zJp{En<;?^aH$`b(#hX>+&6r(B+H%lSLUJ@_k7JfS@yMf^xHi+`CvCcnFA-Oemx{Ci zrMVKxxE9x$re-nP(#X&pj|?tOgn9bFMMF-mML2UIxz65_q6w4ouUuhv{c=Y|%Tm2M zBkx|jD@0?z-o_yTW6pC_YbiM9)=~^GwR*-?Lu&9;kGyk{FA=Yxs?3qL)|92iTzj4n^;a1qz-F%_E#I|QilnN( z+Lr4egxxEo3c+aBmON*(TGT4c2$Ls5d$4e&*@q{5waXc9gClGZXrm2=2HFf&;_;N; z8|3z<{d=8rJ{lTAJP73Z;jH$0^T_0R)MJ9Hoy2k^C+KchB1XJEcm2RI2U;`O+=Mj8 z#g&Gm2Gr9qt zBID+ojXwsi)||z4#&bob8f;xZ!)<) zJ)2C5dAF3b4lnWO@@^>^LAl8UjjChxm~&dVH)jXB<{$<{&9w)T}rGwL(QL6SR z(Y(zmuL!oVJX)y4)qa&8Se5TQbOKSmos=i4P)<~@uvNg?D4l4^%l@^aS!96dX}Z_q z_3iF*L4j+}3F!fz6)02ALG4U2&+SaX7E#&=V`mDOHb`7ko*HVb#>H*7kktDsUQ3=& zvvCE1yp1cv)W((9lGET0L@IdKmJ={LTkJh=XG;MyjqzGMevzuYB)O9k6{2g)`HHJe zFV?6`9tXXXrTuw#wOE!nuW-%z(9<1_-T4lzYQF(qy!%ngnI>ng+Ko*fh1jUlLTb~> zS8dE=X4CIokK zCV@wFTQ=2}<(rM#murQzcHi;-C&BQd5NTT zxK@t_GcSa^o-VmPnmd7j0@KwKfr<#^=v;FDV{F6Uf7aTrsht1iOteEYrY6?KNxp+>rDYO_w`yle)+DR z_Nnggx%ukZ8_>?Vy#tSL?}A^8c}Y&tEaEv5d5d@j)GEg{<$S5NIP=_ET-nT=T7@WP z*et-yV=UJ5tvS^!vM|cGZ8A!W$L!4P&=I7>PfS_+?__gTj{aF zkIT$`6_1!f`J&v<(jvf>gFPq2kf^6kW&FW9_38RdM# z<`v*#)4JR#u(s-{tjFy2g{iD|)fVkc8-LA-R=Q2CPQK7Clo{FDS}khm8Qj9nSkbRh zCr8_{v@FExk*ZvV?r6_wYNPvA(ScTm?z-!fF6X}qrrj@E zFOvexwb7I-#^uKMBom=zg0^nyhCHuGLwvG=57MZW<=8Ce@Dp2U^tV zm9QQIk_+j)j>R=BH{g&g&h4-Q7|p6q?<5+V?#pO&@$BOpH>-heJ*Jm?qy5?39Ox2#3o~SGFc(f@SvPMmrQtQ^P+%~pqwR$rJ zH#>71Zgeio-F=}Iw!Uqn@5`78sZJ`DfS!)4u}j~Q(kDM?_f{RZ3DM?Yi!!+eQ_r|* zs9}y>Xa#SnRXk-8oll{5$fsHO=$B4VJWMy}AxOOr>B#d+sv7v*Qij@|rA*qhGA5{= zCM)z zZv(BINeOY&;iY<N`K2p{~qOj>HheL`94w2j^lm%$3ZUXmE88)d(L+x23HYh?x#P@&s5R@(|GGLmnio(jKX+}-^xZD>s zwnXV%oIa@(Qgwh!G2fu7N+h;`>S}v5qUs2xlbbR{snNa0lR6aQs`sV}psE*D3B9X7 zeu4LC7JIYV6#HHzkBIzqQLu(QcBu7}oWYXhGpG?N(Er|V?EHYuD+QD4m)n;dmq zI2=9Du*vPYbXbH28m5D2q4RNCAGaOWMfZu@QmjoISc^_D87TD`c2cQvW80uQ$yrnt zwP^w!hg01y-?LKx)Sakgay8=;%xHHt1yo;3T(2ngH?0##QbE#=kvbmAeGA*Tf6xcx z*v1`A&Zepn_aN%%CSNI!xieCWPQG$K!B^(wPSu00e4!|5?^HVyNjhK{S(MNV1o)#o z;Bl9RV*)xeLz6~w6Si=n(}SZ_Z>=|I8e8Z@ELQ`aaO&pB+(>6%xvHicn=Ex}io0@c zQh6BBW_?SI1*nha+fD4p9Y(3<>H0RaPG4)Mz&?sc^7&RRuDmNwRZR^B zTQlUK3{-+tuT>M|P2%W+Sd!AMJ+fA%felKrQrDWKlQ%T>)5%!!=Z=orszyb^>dIf4 zg|RHPU&>292u2eUngl3go?|T1&UH->H_D_=Gis(M0?ItCaZw`;J)`wyvc62xmkGK7 zWm{qyoGp&bnlh?}(#VOxQG}}rf6FUFXQ9fm&`#&nJI<+7k zO~)WCn(!whNmU)&QgpBv_r0|_!#BEUM5hKqvoxx;dK{ct$0sPbmFR{>-(2l^c;tGo zuC-H?OeRY8EyDNlsPfdQF3DWoc+6Dcs%k`KOr3$A66w1sUcwa(+gNJ;&D{vMQ<_F2 zzZ+uBldQUdG#^Qax$A*(3~vb0gp~&nUPqA;Qyb1c%%!Y_;Y=MJ$W133qZzL5+KwjZ z&e{iY2UJUqubK7^xZ$d`8G15(8jP84d~6CgHq!A#8U}IK(Ci#>_tF}s9w8BBBXyi~ zsD({x4#5P++Q{fObBZjc+GNtrjSQ3tu2~h4Yg4mU)v0hgjT+avkv4jg$+(_{HPA_O zWmQ#<#B(>Eri^3n|`(l~y*{untL0ZnaURM;lwBZE2cA#TvC$kD1!cH?7HJrmu95E|SD>!%H$XlAsZ3 z3)LAl9A}ducGQq8lrTN8tI}0NyjmzwFPJ|WY+o(R!kZbX|yKqB>kKVB{9gVY*7xIlXRiqP( zY*ejQncU1%HWMYi*ykaTS}L|_=zzMZWG#FnqM->ZT(YR=D;P8;TT^u7nD3DjZlFp; zXMZVL`cL`co8(_|bQSQ7m|gkEFe{`ykA)tXGl?}j({BuQ9*0nIt`pA{?}5fBQ&x(-@2dFdbwdzFO~~T zJ93<9#X;S%$sjeIS8}{nI<0y-i$Fq2x&pfY&FMit=b}YTEMd~dS||+mOexUOR_;7^ z;dvOvtl`7}kLKhl@ai#r4r!nTp>8iI5g@FYn; z;Nm8pyKmQ`XLW3)=7c33Tf#I%(j-NVb4ohe)I{OXgBpuGIhWI;8n& z>O#|YH!UXPXg(CpPEabT3?k`hgc>ugnfZi_?nli2yw@vdStH%1<5pm`@V--fJf_#o zWKmV0fv4>dMwx0~?2$!CQ-p`{xRsM&|K{JwsqLwg395pj&OEJdkgKPua<|HCFj zoH^7acZV|No`cgfj=rWer{;AE*I?{Plh9T!1PwS@hKtq z@fx1H(Fho$Ej3lil`BO6Wl76En$*#hg;zb)0qbXO=(#3K$GA3@n6LM0)MSrWBFaFs zQhIu+R;5;br=zWOv_2<3QZ3AP4b&>Qlb|%H zi5@RA%vwCegSt8dmrE8jspRO1iRx%_K~W`~PE&1uri+i;)y^C~t!^};q4R*o6WE)$ z1BF?2rYanrD_o&DVk)+Ixt}}xV@zBPl1)6@Xrc9tMd$EnDCTFH=mEASZmJPpdPkD1 zvz6vD^XFSPSao`C$`9qx6L|Ds6%ArE1*Kw1L>H>zlky~l)h}Hr!)O*v4~Nm}JrPmc zAT+&QXr&U1X&q!m^rb=hq!pKbR4mp?6@$v0_U7=Mn+lHnWmFeJan4x!!7}O^XvsBtOnbc|ymT z#!MJF-kLRe%Ct$=e5$b=_r?aAhpWWUg@Z~gRxwO0R!jDbrRG#Tyo^&rw-uq+vhf?^ zPJK@0z^NQKl>?`8;Qyl>_+P$OK!@G~k?<{^X8GESePQXYQOXK6GWQ3&JWt=KE@h*-RE+F0d?ab@v^wx@ zqxq+dDwK0hKM7g=NLM>_ML3XAoU{^(#x3^k1qE~2NRbV4*=&Ryz1CEvp^kn-lGC^y zyaU`#8wKg6ZAE_CIG>KdAN{tR`Y`j;JJk6@uf0|uW+h-I{mlBGK(0!#GLoACmSt@^ z-#Kmm+d04ETnL=gy6!B8Y!%DWhr?M5wnGv6r3Jcf1{=YQ6i|Ah^Nxa6rIIpCl`g9% zGl{XT1MtUo{&4*0$D#Cx^Frt<_{1oq*Z-4qDKe#zeW-}L<#eqnCl03?au=~2eVEM! zyIv8kF9p`ZEMMO|ufBDVGi{IaU<=q9_Uo3kpx+`SyQxB4hxKVbeGbkF_RaL553i2eKzrndfjw*;*-jY z&)fEiNp;TK|k04(B z2JW0LPu?&06rK|FM1N7M$Vq zRUMo4wGCxsI)8S~nE%@Qn#ZR&&z%PUh&^!-%394;^Xgdld=lVe!SE8 zvlnIGp1k{Ax-$D~r}z(l+|l{JTK~n+-|xF`UJ!n|XL@3%K`Va# z;3KLxDVTlkeNUZVIcjuA+rQuHy78^+SkgCd=^2kae&?s}M*3CW{GAzV&sVVe!2Um% zc3Biz`tZM|KGLw8I|IwPIWgj~eq(pt@{jk%fBU!3PU=vS8=ktY;+kR4#7c)<@Y%k1 zrfyS`172($n7Q<>X=hG9I{gj*@91}eDW07UH;nt@AN@8pyttxx%+pJkDDSskQ@Urz ze=e>0@pry>_;8mbzeU^f_56c>Zl+J!n>AB@{m7m-tGX+=<@iORlGi(5a_;CCFP!@6 z_PZ5~Zu@3w_Nk$FJlM4B(N2SBzOCS>^&dX?Ky$$zKRV~uw=Z1te3^o$CGYE9HM4ET z13wxR{BhsPh5n#*n&}EH`wXAcxpPmad*B(z4p5bQ(CN~-yVE0(b?kD-3M_JLvRa=y z0lN5p?pTvayt~sg(BxQlZPxJx?BSJ;^@($aqU5WFd|gLEUw2M_+zABAN!I|Ui;{o( zrb?%Cz}{tTaQX#;H56crWBoW6ASnvOIi!I7=uI2!KUnonabTj;iz4F-jCP98f$?gm z_-q(QI@WIIg3d2ET`7c40Ucs5(p$K|IWth>1k0U53cqKd-l=SI%4?kdHTK;%5f9jZ zw{|&a5kEUHAYgagbkHfWk62CQa+%Y0uv0{y`<6QwH8}%ooS~J@#ettXMNy~EAm>s_ z)9IwMG_cFQ^`;K{U*zfBtkZi1r7h~5Q{i;77g9S5*mvBtf)Z|j%h%-ep(J!}qM+>d zU^nNqrIdNycR3}LXMH)RIpOok8ob)MAW-RaU19%u*$PU#y}?JWflB+`Wle0R>jsYc zM#9~qPWP+GQcuaQa8CQGbH-Ip=WCrnn{(QHr*m*3IhB*sfZ&>d{d>|z8UK*4-m&eX z6?QyW>YNuSxVRe^SNFh1p{DzC0VuY?tka`&n^U~d={?CQ3DgJXI6ZH10t+dd&Z5jX zy_wQj;|wh4tT_F3#kx*(d=qKye>D~9d5&+lzcVF!$1)20tj>R?VmU~0T0p^5>g}&_ zT4#HpW$j)O4W6% zQ%H6Bv^M3hOJJbWt<@=P(+iM)3eR{B4z@AWQ597MsZtAvM<8=j8HU1bm_He9Y zq;a8RF9{d>t@@MC)IaDf?AynVGUF-N(QX)%8u$R+y;Z@F=S5ca>PS+-? zC0D7K6bA+d>~GvuPu%{TDs|ztPWMUVQlrvl*HZdVD<%JvoYNP;169etE~}wTvhVWM zDACfuEl#&~$5Gk!{<3n)DSMr7MZi9^EKAh>9-H4MKUC%J^#v&x*952<+6R|)aMpg` zSFgewPqJH_(*lD7_B+d{ecAVs{?h|rS7G=9gPgACIKG%;UFV$M`41{G4j1nlWju|H z4yDZ(_}EXoI`-#OuaH|kJ3rwRKI#;=J7-U#CQ{>cqG&%ug>?hv7#S-m5)}da=Qr)5 zrfTn|TsVVDdO%=Ou)EW1k>l81>YX#~LaH1^fevci6UiGj#!9*jAXHDSsfL=d{jtS8 zN{w?~jZ?aUD#c{y60#MoaC(!M)5u8W6R^KdO^@otze(7duX0vb3i~t4IGfvKWgyEX znk}a?c!^L=;2Nj!7RUEEmE{!j(UV(J@lPG!D5toO&ar@oS>e?-j6L^gZL8!SSu+l4)u31j)UZ z2=bX+kRP8o$Q6zW@~nV8xISRNyOjDZdqY7z6?7XF)C$Kbx8GSxb>F_PfVx1+jt)xC z0E#XNR;r=qG|IiR0_jbZ*KD9hqrJVcw2AV`-s=l~JcQD&VMu-~w#=YF3W0L$77 zwot2D;p%OMUi*&}WIq~|3To^hP&K@iWRTtV7HWM(0sFB6?qRu6Hd8geu8GQtTlf8Z zrMwGJpS_H8&9M*o4muYFs5?EI1SkPb&gGPVLK5#A_}CdrS86#$Wb93KSugtW#U*jOrjd+vyqn znKQD@8Bef(jUtxaHF(e|>RfPs52yE?6sxTL(9%kZnZ3WDCSY$`%GKI_yP!VsQMr9T zxlmvBPC-Yrb51k$Mr60`KT#PL1|FcEiW0`7z&c9q=>hvM1zZWUPG1_X0|^qT=PW*b z17#z%XL}`;B-wAFVUye6psW*o-TwCyY9RspR+_a?mfQbY@)6h2)poGMDY=U3NC&A} z=}hEl$J8uopAfJ=S`y@L!@iRS!A^m4`){P8g!0MmaEk6!19K5IQ68XAqn0qho_>&| zX}DdXBxxYIi?Z#ktr;rkY@m%x+5Yje8p{4N>{oo$hc&Z}wy*mr0}2CK z8Y2Ug4R0->=$#+1AGUe0*kHf0q>0Q~=kkx7^Ql*+nE;hHcb}I1$0g+)*Uk1bl+~3E z4Pckk&{$7Zz9R69{W`f)6a1k~W5Dkz>6D2tQ*rkUY;ew@F}2*Oqz;059IACRDwfmr z%&c<>&waMjG>N(mdn?r>DxvM9zqrNeKZnYHgEMZ0Gr7sRM%D1_>jC?fCBY`=vVi@Z z&Fx!_XQMYzepga{ms8%a;5>iU>Y(WZm*4=WSFqW!9}KME(S0t(pJy{vy)L#tSVr@p z&Xh9B!mfdj1NJYLl4@##A5dfOM7`a4fft-JKXxvp!K&X!PTv(&_6^Q?c72nl%H}*$ z+J8kJO|`Aj)%Iqp=d6}opC{M6`WvvHfz$sxkJOU(+rfG+-p=;ROQ`)(muPRJ>^oic zi1vmhE9`eEb=|1$knp`rxIeHDQR#La;PjqI#ZLVd6$uX!1DqZcDS_H}My(TEL|M9; z%Ct|w{)FlV)lRC1mpPrzR2BAAb6hB`C|&A#_3#6 zEv?xZ+U5)-A0=65>@MU{GU*TNv49(e` z)9Yzk+v1c_vC?FEOq0`#TcCaZ3g`5Xxf`SEx9dhV*?HPe-4VrdD2eBXNa=q5M&<1j z%66R%!7Vh`{)Ad@A&suxC^OugU^H7Gl{r*D@A8*Br`csR-3ZdOZ0C(?rtqv^b&fy3 zaSQd3{uML>ufOTzDx(*m!_x-PR{Z{K*qji16x^7pxJ~F!I{BLyG-3$8r zX!6j{xwLceW2fsHDxMBX>CXf9-xfc^MRPaLyr>NA4;FLnv+r@J0se_vCs}D(vfiPE z1XZ_#i_2-OSkFz{7}mIIw9(ulCQl6&t>4)w&R zU+okHsh6Ode`S-?yWZZn_@KR+lv8iKkAk9FzQw6*c8Zr!a6A=!k9w>c=fZmX#l`hh zh)FCCgy{9-Y!KiTMvZ6XV; z?UaRTY&WXM4yEho6m~cJSx%Qz>GUob+|8l+QKvw2AXr)+Tv1Llg)G&R#T)FWoqD+qJaYel`a~L}YXU1N z)TbAd8uHys#8v#4lNR1bIzcG-LiNW`C~5}H8o_v&T*@nL;Zi?5Av1mj)(%T{9@a=l2rpJG@D;+r320BlhjkdlI#4Y+Hb@rtxIW-A3W$`Y`llJ4Xxa!;TX7gQ3#ut9zQ=; z$Wi<49&G)ZIO{R~&w%4+2v=<;dOX|)`RQQ%8+QDm1+dbyNn0)BJ`4O)aQ&mOls77# z^uyHP=JJRN*Re_s!1WC1`8scz(#Paf1^6xCCTB;3j|3m3y;;Y}Bd7P9;KRW8gYN`a zyNl#jLh)qz&xIbnKkT^o`Jl%7zKXx!Dm4Jth2Uz3(c|`0#Pcdd{BpS644ww(`*i#X zfj87mU@%0be8J-zU!JQmT|x?&~Au+w+k3 zy4zN#oS?^KpX79l?cPQ72$Rva%w12(yW|7dY|GT*d}rJ0nGalfbN49cOuxBlb@Q}S zBXN{On3qD-+~55LrJs2PxM`X1L%s^!+~*w&UI%XO^=_bg#(GlVCgof{%$I|!d%k4m zy=~@uz|DQghrkbj^L;V?)F7UvsL$%2FY#IQU(5pH^CI%03iZn9e*(M?T;1y>zjKM7 zNYAj7aiq5c^(TVxzYhJTq3hcp^uxd8&grE^yZUrMzVRgb8!3J#iVwHL6Y+(_S^rk( zH|^+LV7xrzU3tPA32Gh>yZyfpvT`QmkQ2O_r}S1!%5QnTf{Skil**=ll%+NQ;dm` zx|dCS!AbPIL~fk_TOqIRR}-7X6_h@dY-=$6AOAvso&YCx>Ku#VA9^_ZF+9bB^kK$h zkl}v<=L>gDhX2PSKg`1)L^;U#T*-hweBn8l(UbP@N)Nx$!@cqOmWT7NmK!~T(cf{j z*l74z59e8m;U9ZAcPWMsz*L5Vnc(4*Je=pYMn2@>6FvM+53lv`*T6ZR+@%;jhdlCL z{pX;+J~UOi>#*H}Nd1rwiJJbZ?S|Iov|@}GG)&oPXibI{+h z{@EVB%)`BUUh;6Sp7%W5tLI-HKF6bf2nJ{l_Zknc_V8;x{B{rbruQ)qpX-tT)Wf~< zXJaBK^K+Gld(*YU!@cSHn}_qE43nQ-(QmST9s>;@?%^R1pYGvd508O!J>)DjdhYXZ zPNLzvJ$f2E{8f)UN7=~7F=gj?Mm+rc9$xR^C78-{eAsC8oa^D-9~*v^hx44;@GamR zZq&njpfhLv-8_7NhjY}7o=qp=6ET5jJv{Un`5VAFTyMHod*pj~#!o=rBaE^~x&z&B5ubx*t+*|Jd_ULKw==WpX<@k8ZeYA&r^(4VL zK3+WwJn~*W9UggaeXik5qz{M7t2~q5Z-KM^W)J_3hqrk6?>u^VNHuy!V(G|wyzEQ_v z_v&c_=lJyX$oJ&JqYvwe(7%c2AP=A5;Xm{6i5~u@hu3&`H5UebSpO{gH~PQs;a>fF z!8xAidgQ;tg+w3brSxy~+~DC}`Lj9G>BHd;qkkhm(8FhY_&&~D`mnrrp73W6_v-oL zB)pt6mp-h=TYrLz>b~lHnE8V4P4!{@$Zq6N{T091BhP8%5BF6U(Z7+ufFXUDvzhx2 z{usZ^&!d0CjX&lW(!co_cf*Z;bpJ{}%MXGFbQ>;Dfup*)d?7fp-{oHiFU8e_`%Tz6 zPxxbahqkJ7+Ft%$@cy_O`3GRH5PU1_Lj->c_Thr>guPPm-@sla_+Hq@2>wUds|9}_ z_FBP@!d@r1?bBd};9bG%1wR*juHfdGg?WMxhkQivao{b2n{`)Q@J7g|1n2c9f3o`G zmhVFFcEOi{FA@A3;L8QS9ekzW-veJI_Ejfdj($tzEAL5!1oLOP4EMP-wA$D@O!}z3BD2hu;7n^9})a1@S}q7 z1V1MDi{Qrve+8Uwf~b!v-+kbI!QTWA3U2l_3I#s|`C`HU3f@ETzk{3SqfC6vGc|pL z{3nn%`|?KqbMSsb-t4oK3C{b5{4xER(bE~cLdc&1K1A>y;HLjGdU}CZ3i-3as|4>0 zK1T3<;MIa(3SKMt0Ps4&2ZGNKd>DAW;3L833O)vWp5T1Hgg+6%CxN#JUI%Xab(3$i zz*9ng4tQ2@-VfzZyWoxBO9XEPUoQ9p@RfqMgRc_&7Vy=A-wxg(_;zVl z=Ya1Lyc~SD;8%n15qt{xUcs*c-zRu8_v!G{aJ3cOPA zyTGdi*XKFt*=NCj1o>*gcYvGuk;%6g!Oi_ekuHc=p?>|rQ zv%w>RUkKhJ_z>{8;8%m2`za=#Q^2!Ael~c!;1O^$zcYF=;LC;lt>7yKUjx2M@QvWB z1^*Fvhv2^gUn}@);OhiG48C6Q|A224yk{p}pEn799{6U#2Z3)9d@T4@!LI|~CU^>b zyWp$9cL;tL_)fte0e?>LZQ#2Ee;$0d;ID)45&T2&y@DSH-zRvtpw7?zf}an5K=5JU z2L+!1en{|n;D-f|fgcfkA^1_jmxCV@{C4o;g0BNtH#I4Vrd>P&Zsx^?KLH-Zcy9Q! z;O0KO;je%f3;FlJ&3xI&e*|74uce3jsvz*h_YWAF~ae+9l)@IBz`1b-KNz2JWb-zfO!;F|<5;+shH*(`WJ@GXK5 z2Hz_9c<^n4PX*sD_&o3(f+xUt3Vt*AbAsOizDw{2z;_G&WAHtK{~CO+;ID)46Z|mv ze!>3@en9ZR=kl9~OK(_z}V9fFBjS3H+Gg?cm1+{}#Bq;XqO5YQyd2 zesDkL$=W}=7e0vwXO7Jhh#|VBF?)O&JHX|1a=Og8v45v)~87 zw+Ma&e5>G2v98D41V0meyWr*EI|Q!+-zoTP@aF_?0N*8e8hp3lH-qmH{4Vglg5M9m zPw*$e_Y3|@@B@Os1b$HPx4{ny{&(=hg8OlU_lV#{;70{N8~m8ymx3P`d<3{Thi&?| zso;LB`wfqQ2L)dSZuV)6{5o)Rp4;$8!RgHxdHvxpz)J-GEqEWn4}g~nei*!;;Qt0M z6TCal<@6W49Ne5QH}M||K19fm1|Kf?L~wfeJTJZV;AUUS=x+ueBjn9Fq-w#x33+~= zg+E5mdhj~I9|oTx_>Axg13V27JM1_ z9>LA|w!MPi3;BJ5ZwB8l_%q-K1UKj84hsH9$R85?J@CVVe*%6)a32o%92LAP_%XqI zgC7^X%p4TLKBDP2E(h1o8|M0x@!&xrKLfl_@FwtL!54z}5d7QV{QMw)OnmMF?<4pF z;H83Z1MesJOW|2|77U7)Va3S9dyi)Lf;8lVT0Usmy1n_FX zXMxuW-U41H_(Jd*g5L&SFSt4HI9KpZke?^`6X0gw-Q>@&!CQpe7oTO5?wAk1n&vHQ}9yo=LD|+-z9h@ z_-?@`f$tIg8t}b>$HDgrz5sl`;9mznAoyM22L*o&{E*;JgC7?Bx8O$ve*^re;D^DF z3H}NAalsv&yEV@-ns(a5oX5re5W~yBgMwcPUMTof@M6Im!Fve47`#OAZ-Dm^{2uU9 z!S4g_C-@fdGQocW-e2(FfL93qd+;HGzY9KG@PC3=3SNZs%2k4wf{zh=IC!<-6Txc* zZv?LsJOMsK@MYljg5L%{SMcwH&lCJH@QC0$z*_|04IUT#9dL7B(bU5a!LvgCGw^o7 zZJhI7B6wHu<%0JHUnzJQ_$t8%fv*;PBzTA5wcu+7p9{WD@EG`d!EXfLDEPO)HwnH0 ze6!#`0N*0`&%n0|{u1~$!QTSkF8BxFI|Tn6e5c^SK6<=(PVnB~y97TUe7E2O!1oA# z75HAk>%jL3ehv73!DHYD1aAXBDEK$P4+(xd_+i2C1wSJAL*PdR-v)k6@Lz%-7yMOl z^B{m}UvGlbJABp0@WbFi!HEIQDH-HZjd;$1y!M_P!Dfs>1=KPU~&yT^!2>Iv1s|9}zyjJkP zfY%9r419**h3D)1uNV9*@VSD21$>_1gTW($SAn+(J^?%~_-yc$;Pb%Exhj)y3Gj9y z-wwV+@LR!`3%&+?rQjRER|)<@@YRC<61+q3m%-Nx{x0}B!4HG47yNVZje>W&K$qht z!Arn53w|N^7Qu&sZxwtz_%^|(fNvLkI`|I3>%n&lJ`emk!RLeT5_}=}ZoyZ8?-6`8 z_+G*90pBP1L*V-b-v)j_@Mpmf3jPZCA;AxT9~S&W@FRl%3;d|yo%-o=KPGrr@Z*A? z4X!rY$*XBc{lNVUJiG!tDEL+2g@RXu7YjZeyocan@Djn3;C%#N3SKJsH^9xgLUz88 z{?~$+3Hb-W`wRX!xOvZ%(eniO5F!6G_;A600bVKii{Mp)?*$(t_*>xBg1--5EBN2Q z>jeKCe1_nD&LsNO3mycYD|k=vd4iXMM+7eiZxQ@T@VMY(!Bc|QfoBB|gSQKw0AC{b z0`TR6F9%;K__x7V3I09s)q+0+-XZwo;A;i{Dfl|UUjSb(_+Idhf*%0iB>0Emn+5+T z_!hzc4Zcf)jANX;>9|bqB5M^gB z@~6T5INxgcufT(XKM!6g_$%PWg1-UYL-0R=mk53sypP}?ftL#YA8>Q7*~I^}i*>y% z6Y|}``wQL&yh8Acz|DKHjQ+2H4;S(S!7BwH23{rjRp4U;9}RBayJf8Tfj^?J`}THwxYbe3RfM;F|?M z4}6Q@mw;~-dOt7yK^p1A=b=KPdQS@I!+C82qr{+rf_rz7zbY;4gw76MQfDalzjNH!t=v?e~3f zKhEPD{x|TT;GcpQ3T|DZ>u0gxoxpntUJPC$_*vk61V0zNRPal{&GQx}{)52FgnSiv zf5B_OD+HeoK1A?q!G{ap1YRk48oWyIo505iehYZD;H$xF1^*6so#5-iX9#{jc)j3{ zfX@|tEBHLYw}VFn-wEC#`0v2ug6{`U34RbfEBJ@t=6M%W?*9Z|BILgSUoLp?QeAIX z3f>)jmEe8BR|{SS-XZuP@U?<}6?~oGW5Cx7J_&rI;8Vdj34T5JX2Dy)w+NmF-zxZx z;M)Yh34FWYtH5^%ekb@&!PkR7C;0u~y9D0?zFY7o!1oCL6Y#x){}Ozk;4g#k7yM1| z1A>1Deo*j_!4C=kIrw40?XT#1ctr5i!H){w9sHQ!y}^$Qejd1m=Z!j3a6JFN6x=WP zAn>5zUj;7|d;)l};4{I^b6qCf>%dEdd<49Y;4$!0!873f1YZPho*Oga-VEMf$gc*k z5PU885WzQqoA<{W{f~iH3i&6&&3nL&{7&#OLjJel)q=kcUMu)p;B|t(4?aWizk$~a z{t5V8!3+B9`Z-VVLhy*--N0J}KLDY~UBUMVeh&Cv!TW*l6Z|XS`vo5a zen9Xmzz+&u1%62IYVgB?*MT1qydM0h;EmwN1W$k;7kmM@h36wp|8q0AU+~r7LBa0^ zFBE(Oc(LF=0Pi9AGvFnH?*i{5_+Ic*!QTS!C-{fpWrBYS-d}L1T-U1#!HdC%2;K+W zJdbPgvp;yHkiP=FO7JT1F@lc+uNJ%(yjJj;;O04C6QAqAX9)QSc)j2W@VSC71fM7P zP2ds1JHT56e*oOP=iJ2e3GkGVe-=C|_zU3eg1-vBMDTs!%LV@v_)5Y52EI!0e}S(S zywd<(e>wy&245?9Dfl|UF9TmM_;B!zf?ox`N$|1Yn+2Z+zD4jk;9CW61m7lj0(`sR z3&D2?z8rj~;J1N4C-`09y9EC}_-?^BgYOZ18~9$qe-6G+@ZW&%7yMQ51A@N;eo*kg zgC7#y`~cQr!Oy7B_2-D-eZh|kUJiat@GHQN3qB6q{PdS;cQe8LXXx+^4}%8MET!M_b|e!swkyAHgMkbe-oRPY~yo9Fe7o}Yo23HcYm`wRXmc!l8afDaM; zLvZsx02A&p@Jb=?8>sWQO7J3Z^Zo#%=PdAQA%6jQt>Bk|*9krpe1_m7!RrOD0iP>) zJ@`DqW8e|N7lF43z7jkxcn5e&@O#0tff*u0)AZZW#Hz=xlBKE8@RtXzyH4vJSg~9@It|V z0bVTlE8ymLWK6hkgO>>TBj9}m_YKkUD;2yOct61}1}_tQ5O{yVuLiFWd=mH&!9(D~ z1#bnf6#Pc;D#2HQj}iPH@M^&~f!7ND6nLHBzXqQn_#W_j!4H7X75p&xJi$K)j|hJH z<+{9D1TO)P3w{B3O7P3Uvx1KUZx=iSzC`c{_;SHp!B-022EI!0mEfxdUkBbH_`~39 z1>Xt2PVkq(*9-nW_(s8xfNv7~Kj51McZTY6*&=u`_*TJ7z_$tB4}81e1HpF)el_?` z!KZ*fC-`;Xy9A#PzFY96;ClpL3BFhGJHYn|emD4j!S4q@Aov#WgM$AQ{E*`88Q|vqLx!IT9_*_98Gaskq2T?&iv_ZvgKncnZ8s@TK7W1^*U!h2R^&hY0>C_;A6W1g{kQ1@J1t z-vA#Y_y^$Cf*%L372F=K%c)Lq2YiO$LGXIP&jz0>_<7*-1TO=R2tEM3MexhPI{J7v-!PSpAQjwbe{0VULJBfxr10L*_-~aCfFBE(ic(LHS!Fve47raF9{|4_P z_`Bexf`16!Pw;<&mkItEcz?ltSL$?D2p$9w>;ML&ug3khgx1J4S6CwRNy z-veJF_(R~!1%C{DrQkmTUnTgH;Hw4y33!L#KLcMY_)hS3g8v45z2LtC-zfNN;F|=0 z3w*QSe+Ccg>TdbyS^zU&Fl}^sDcnkMHS!g(8+XI2z;R5_)l&y<{2BQaIEEiremQs* zu15YluvZJd9d;9rk>3MeFXRuvK2Pvc_DG)=eR1P60^G#c=)VTMUC7@7zFhD(z*h-g zghJ>L{1WhWf>(iW6ub_6v*70U47LjX8RSj=nRIp7T5zY3e*}D&;O4#9Ccljy%dZ9Z z3HeUo2Lvw#KO}ep{D|PUfFBdQ9$Xb5xtaJx!GkCV!|wqv7TmlKw?uIBo>o&|j2_F; z5h)Y$#o!f!mx2!$yaK#R@M`dC!DoWk3El!;FZe?6d4k^w-Xi!`@RZ=@eTD6U_Xy~G zST4AEzt}3l&HKDM1b-iT)(LLjleJNBtCJ3Qv*5G9w+cQOe7oRN!FLMY2);}3yTSJe zejoTg!Oi<$4hU`qb^H$rUJZUk@D%tl!8d}N&YhiAQ$J1X52D>0-WR-B@c!T>f=>c3 z6?_(Wncyk#3c*)^4;Q=x-1KuMo=<>R3;FlKP5)=){{vnxF%Wr9BiULm+SuQpup4qu{@X{AR)b4!%|J3y|LJ zg3reKd8gnB@LhtNeVILi{{!;-1TVq7{D9!*J>-W3H|w_}g5Lx^#{@U;{WkM2Q~#fb zd=T>;!`}lh7TmnYyF_sFzHT#LGkS)1*Y&4N$j=6^5Ih4uT<~v!R|&omyjt+>;B|uE z-b2U7%m+<8Ujm;e5&T~8 zV}fr5H}i2*?q{8);}gVu*6^X=W}a^Na_|x%|4VQ)e>d{)fR_pROMB~Z&Ai^o*Mbih z^4|on65PB`(yRlFp3CuGzB(blAMcB+7u@`=@jSu*0QpiKU5kfR46TabcCX8gT(yv| zfPJpuRj{W7uY-N1;6`qp;LBm(F8ChUcME<1c5^l9D&-8MPaj+juR@|L1g`^MBDfj1 z%VL^y_1aG$o{hF=m4b9MlMSb{2rnCJZplUyN{w<>rp9Dj z!bmrT8?!lkV=}HS<&DYKR*Jgv)D%lZ($Pp;A`%9PC1OyJT$pTX%0#t|g3h*OOa#-3 z=6EcVb?xzFBkU^5Iu(=!A*~^!!fH!J!r5p#%JE`#nkJHo#nE(9TN=X&N@X^~QA!V;E=L_ev%7+Ef#%z*&c%l=IMAA^%7>|aHITKqP%_j3C zIYg5?u}llcH<^wt4rgP@gbpGdO@(zr@*PxFp!ic}x3wk^8VSe4jnUCw7EgvF0B(gs ziE`D6M~&yEY&vYr4ayv%1cw{vhZG(iyM4F&(9XRFdV1WHwqpe)7!ARHRfevDQ?a zYI-(9sh)3@$KwlHL!9}UShI4c5~e&?#@04Utf~;4kD8h6jv`?>yPH!vq}!g3kWM4j z-%N|HY6_%uS$POm`Di=UFa*b$8iG__HQ>qx5N!!HrNgb-N5U9%_C=Cy4RP&4Eh|N} z#8{isQ8y86+2Mu`bWN^d;4tGzhMX5V1P4tyQx08j99_e}AqKgIfrAYiY(?8s zgUB|zZo=TpLu}&QC?DvW;CMx7petoeLkt@2kvc zxu(HGTsBCVw8{!IRQz9E+h{(8sa&3(kM7X})A_hBU>q@A8LRa*GBFckRuv=$;r-6A zy7xVeo#!7srK>Uk*X;ovl6h|%FZXzSG~4ZF+4&xMW=U+Tz_(?!BV3tF|A)DE0gtLW z7yf6+C{agu&{(5Q>)1|hqLgM@+GYyX4D8W8I#EuEf^EE=5rnG1kr|{40h~m#-44P* zThFP-%lDmr2R&`2)_T9>0!aYD0Ez?*H*bt17*GQulJEDfz2`#2)1L49p8xZo=Xq!L zWnJI(u6Mn+wI-WC`z!k9vGOl>@{h}vXkU~#_u1cdPX4T%mP_uOhkU#vuV$ayy|U|+ zXBrQ(&$4Oc_xNwycQMD_l6^Ng?KQj@{7lkLbp*sGzoPzZdA(mz|JO&^DZVp4o6`Or zT$lJ;jx~PchS@0>JK1IYL`BHq-FYr@-QY6iRm~zhK~^8N@4lSYPv&Fg-|Xc7!yv*K zoc3%U9IO31oc3>?Zr3dB_X304FZ!vJS!E~7eK$U8U+#6{0J1M6t$eb-f8io~ZNIU< zZ+*-Do#N;t*>{7}{)q?2YX7s2fa!AxRoXA6*}?5^xcysp@{mu3{geC7)}Q?q z`$qOUmxzlYy9)2}*Mrl3YUiIJbGz_U?BuT*#8|TJ&!!bS?Xmj5d5K+9)~+o5m#LJ^ zpXDF&f6{~7BxM`B<=f?o{tf!s{uT8y`~T&}qwFPkR&On!Zb?Yk`hm3)=J;PxXs z+;V;V)~T~cO#i-*PnCQ*AN$(={_)6>>gf-vs)IlIv0Pqv;=FM5q9N{li`=dYzSKTx zMRz5gbUroex5jlADX$1k2wgeeNPbwoUmK?Ti$mt7ka@r`zj#H;e0ecnY7`B#-7qV{ zO#@o494pIy?JA1juMKZW9-Q>t4bp(xE^BN_s?=?cm+xeo+ptC% z<~AeQG444T3{_P}vYAVlZr)LBnA>%;Up>{$nO<%K_8o1b-}HX$48z=PBv(}bGIUMo z+N;~OvvrrtMoxuwak0B^)Ws!phc0)gms4cO>^IEM>1D@JC@2vWBwHK|w15Gx|8FDU zTx)Ex?(QqhS8icp=5d4+Yk*S$}-ZY*8y)`L5> zd!Ay@&5tAIk+0}jtJAU8zqex{>msjv^M9*jFWJMpI}*F5R8I{*KWt7bO_iR{2uG|7 zYEuo>QS(TCgu_kmBupWt<^*%e9dI5;_^O>3X5&1i8&QZo)3=BGyMo+2Z;(j78C2qkxMd8BNn zCoqt?*hs#6*hr0B0;Rw? zrVa6P4fmTA^&CZ&Mp}0r7Z^|_U7*rlAZa7PLx~S-gRSw?qwY5C>>5b9eu>8rau04y z><@L^r3l;}-TKhgHswwpp`G1G-(0T6+3D?LRx_@Kb$PWByVz@$FKFtYr-iJ`ii54% z<*kfR$n5;`lveaSCgmBGAHqU%R%D>&)R!jpso6Qt8?Rrb$UsGJZk+Rt$!b2D-KlX!O)XlayY2FvUs@sd@*1FhdG_}OPW|*C-w}w?@bk_J}6ofTd7grqPbw&Pl)iGYH70u3FeT>)D z`P?xuc-*B#^ab@|s*j`4a*_I1-h+-sw&Q!P-x zEWowUd!Ap73+z$Io)5A^=Bpv|O?a@`eL~*}U0U-^_JCLym*_>e73;x1$g58`Z!57b zE;VA8dqeKm^x#3EIo+IBYF%6wO--*htO?b6k^gQzxPv!4bo0itP_ok z^y%iVJV7+J#7D|lq-ItOeqL@ruNw5cM!SDyW=LR9DA^&)Q`Fq6n}_lRhRl^A-yS1* zM~y3f2F2Ep=I8{zm3G0#Q3Z$0753wCy174JoVil>?a_VjQs6{a{7ed*s0u7dQsdig zuH^l7_WSDwSD1Z2#T8dwO14j7O+Bg>mBif5+$jEKD9>@S3;*q)^|7o^SfABrup7; zq_ahXTI-sMTI-@}a(F|QcYf2VhM5uT%5kaCK-AopJXmz=XtOK1<1jb***|%)5xXGi zdERZr8a&Q#vGeOyzsZi0WXs{i=Kj{A__vcgivlhA+zKDD(RbMiTin6cL|-V`Q0!{> zX2iN^oK+myu(&9?*kb~b*sNlk&F`O+3A3z)VU&yRr1iDdWxl92+83(-4wmK4gHDa!qTX$)!{*l8MTf-mGgPFOz4DwQ)k@>E)N4ji{ytgQR_hBQp z&Ma?^#Js-?B|Y~t2<`4rus8n4u<8F7d1^GRN_1O4$-F5gFcss+sWEicAXew&qrv6N zQBV^@JLY!`MNZBS)+h!mQKDFCNsesVRsMYA^YguKe686LF<*nnMq}@>QhtpE+1#$u z8`juyO?wi>fmN9kxUL>!MISjFGPN<5=aG(`~!KXEZ-ogrzEfkoHkyM zv`AIZmUW8x+JWux7F~Qw!HU}s`+=^nZ>G}bdAg{8XPq{ zjpX|Wjnwd$MOs>+q@}>t$=a+{nbULgKiOVv1h;FA8QT7_Hof$r$=dYIleNiPCTk5n z2i8+p`~)u7yVsju-hI?FSzEbgh&Sej?cc>FyNFH zeaK6Fbq^u346g9RToPV>b&aK8RbyGUMy;`YV1No|6x3RtF6LPzcrbCHZoY4{zCR>V z)G*H6V6^Un^*c-`Pk79P60J$-K{3&?+-$hIz4Bn7Kl8Q10k3f(8oGmh@!wm~zq%07 z=X@l%`Kv4QzKl{CBV(>VuwHlX44EyV1KnZwj$o^oH@_d$gKCs6ot#^+M44A8vyN(3*WXhF%*IDDC@&N>IBiRDeKB6^V{l&n55v#IB zKGW1cTQjRNrFj%B?sR37$7Xo!BrlpXJegMWf-GjNS;fK?&AtQOI{4WKdK5FALglOg zAZS`OBL{wz&KuYedQQsBd_(cl00!$*GZcu6<_weiu&}fSq%C3ZHs1t8=}!(fAM;Qdg4~=jA11!H3NZcf?$4n05Z^ z3^VR$G5e4GYo5H zH8&{sx__b(8|$^achQSz%5d{j%BZT*71n(Y(;yspN3qv1Q!Y?IPrCV;Va5GOe&?pH zKxm^d3vu(c;7aoitIl7hrQQY~y7{qg%|Z|B@CaUg!8a1;3YF-i=J-ps)PFcAGh*v4 z&*Jp&xXsQthN4VRa-GA)5i0M|gCEab7>#A5whF_VSOF8rrVk;EMwkuZ;NJMPW2}+? zDVe9J!6xgw;o!URx1_=3yT~`j@-BTlSg`kHO-2I=AKOJbhoWU1Dz(F=^2zThyD`P^s3z|{IS zyz}acP-Q3l;1p+mpn?ZKivO0bQ(j-b`=b%m-x|nlbH*rBOxslD5hZeV3)PodrAu`8 zF1hrDf)mQ-eVz4FH{VkY3RxF>3)2c|l*uYcBg*okrmOR*;SF&_l87^ zW>jQ;Y~x?rNlw*4bmYU>2!;)fBs&kPPA1zAhA2=Ubu)Co=xnOetw}D7GFsz>s$PgS zi*M+4P1rnF`iJ6Tj{!!4BA)+?m=7jvb^trq-TSpR6_kn)P`7%rc18DO?MfDpinjDk z^e;aEiv=ZXX+O;z8EmgL>2Lz-jmEkahNH1ABeo`FZpF-!I!xAR%ClBbWUjmC0$Vd@FrF#TnXEjFTKhmW*sU%4I;H7|!S6*x!B3S|S*8DKxDT485AdL3@Pn#L zQl*GJ4W2DgHyzsK**s{z(aDxj^6-F~Xo_4F)g*4noI~T)b!Hk@=_langAyssDbjV& zR{3|ME%YLN9uSm_GpzaJifz7KhSk&4<m1UH@vS>}>*+R@&u%ekEDv)%LBM;~K`DEQ;?Q&t8 zletjiPonP#dGh-`=l4g>@6ViH$NuaXyhzxMbb6#)jBd+4eAg{UuCpIPL5POD-J+iR z`L16+QoYrVyslnqM|#yeUA?Pw-feQ;ZCCGZQ19Y!e=OcdT3M?OCl(rLDHoE=X^zu; z=xOv{orWR>AL%iYuSugk)lx=v31uM89%(}i7)Wf41lPvTGLoy@c>*`R%|@~nYv0<$ zCqf-HhBcR!+2fB|swQ~E^B~#voM^n^K#L-ezr8k=-lay}IziUPrd4pBDAq{EJscQ_ zn0xZ|kFn~WLk{e8qYHhUewnGm>-2x{t7@|4jq%BOUKWU_XhIbIKWfdZh+5ZHh14pK z2CP-6m7BGeN#@HJ&iWHJt3s)WTQ@iAqcGE$tLDxOTjQv)1;Jn>8^h~Ztx6z{s$LP^JNOIrI_h@n0^x6H{lI_pz zur<-?&z8A6YGa>^Bz<&$Fl`6lRQ>r4{i$i}kDsnux#8$eZPbIiq*K?@sil$FtLAVk zWR?FWWR@?oldDdx7Lg(IxOB?VgY(TRln=$8AgUemA6=`CB-=cO)jW~CP9pv77Tn!E zKSqpSv+mz!aJ*n#M8+Z_U1LrQ+CH8%xX5DlTAzKkL3VO;V~L&%BycSPNLt@vME zt$WXgbl(a$tqN%mwbab-ck8~68tv)++EnS2A@?UD;IOuMBEdJbMsY7iDGuxK*Me_w z@z&hijoAKZY-QMdJB-#}R@fhCLFuN!j`)Nz$p)>t|<& z&0V3&EunK(hk|c4{9YE^Xl%_Tsgcd*_5*L~?)Q@eL$y1Vu^omKF%K%ojW(^#@!L#6 zdq^9tX|#t{+!?QhlJ5^Sl3(C3y1|eC4?$+;Nl|kx4NuF&HeM1zfX{`-Icc6F2sB3) zwDze{f5#dBkH>2B8Xqkom3`&QT~+0-YI0ZOa#z>ou4Xt_`lIuu2>sE;_Rk~s&vN^x z#s2BGe|FeEee&aZG?H9VLzfO}P17g~ds6&+5%-5mzPTjjeS}vfk=FN*3+#cPvaINp z%70XefQJ9*qr`{NV5b-iqZVk;8ZSYh0jGEA?snbWS=kdP5T_j$ z&> z*LnD`{jgQL^C>dcnynF(&qykCFk-evT0ba)6}pwK8Cs*YVMFx{XvhrM7=U zWB-+cJ_&3n)f3nSf_B=X%^vd@YMH-M~BsSe^xZf~>X~X<%&Mup~CC<#02Kt3A zS_<37XeGb+2GoHC(`h3`NW3qOG>?)^mO?Y-~R2D`Mz z>O)BWmFv=H@O$)nQf97+n484nfGgw+d{iMTQ5>?a@XGQZo?+t|*$|DDX4iUYYSW&E zsoYix`zx-sCi!ZuTPhIpGFV$>{)%X)2fv8xW37=dM$H4NjOxwt_s3fCmssuK+1W?0 zt4Cw4(iesG6su+Qp!fnD+fL>$YK)UB3T>JN_9$XZSPs2NgPTL<>nh5m&>E%tMQ0t( zf{!f&kwm!?=D#97VON|vJ;y&>Oy(8%oa>!NQ52VapDu|ImNp^*UWx=b0hx2e>f10h zS2#`viBBmJJBc;cTiMZ29zlRSG3!#uoU9yS?^SlFzLIP>%RI_m)b9_=oZOz3tdj>Z z=BHr`=1NLPocc;V0+LZQ>gBJ|0F^o4nhI*9P3W?;scFybZ;50&YclyTtSG^2Y?TqC z3Z;dmElQOX+FfFzr%tub+6|&H((X2GQIw3S8E!E;se-;I1%VbwYr8WJYR=;s@fp^o zSmnlhjo5Iku~cMKu4UphGs9pY9iC`v_#XvvQS$>;4S6c;bcKoXFYVS+LKh`;iRywO zp~%Q4h+(}NHP$=to2p)PXz}MH^#vZRw=_Z|_h9#&y^eAMp1@C9LcA36kEkXzwj|Jp z0@C<63l@dVf29vE6!-rs zy1RJ<=cy_@eYgFd`^vo61^Z#_Qt|3wnfEss#sf4T)QyJNDdyH*ONKk&M88N5XyxAM}3T+Vi%O{5)*Ma?Pb{N{C?B3 zgnQae`<;7+w1CF2w%J4U_3RKWmhr)x`Q`Bm{S~ETTl`xET0Ju~fhT%5Op+L>obOix z9jy6Ppj;gNuc4S=B|}{#{%e97K<#O!J@m;?sBysWomr-?3iT1kUL7{qM)6U@DTqZQ z5Ur3!H2UW=t~o<>)cVQ%7yT_fa>d8af5GMyKkfAR+E z>c&(g#pEG3j1v}4d3z(~>w#6FXL)V&si?V2HLF?V*wmN-E865*?jCh%v9{>@JV~F) zmnv1NbSi_-%w~;{V1!&bph9eL;~m4PVY!-GR8zI)?bH=b)!4GsBhp0~2^PuL)C^3K z;!Q-F+#cA&Tv3EVS=ium!Ar_to?M9}`BD5@rkeKy(TCxYm(G}Vy0Tvw?$!?dWEYm; zm2N%duaNop!NGj0)`C<6*;FGkkK6rW*cfVbnmw7H81CH}6rw$${uXzKr4#;>n7SdmpQf?Zv!UNgm8fuyEEW z+Y_K>xsxd3UW+KTTXAR-%)kvB4vd8(t4CW&MB1XKp;TF4Y@^6=28hBGw7)+G31Vu zDH0-;9&5vjr8~1>y#J+5brI5mFySv7RaJlPlf_UCN=L}IE)x4t#@!i}60y&Wt*DLd z!Q>%B;KM#*4~1AmcFQz^(HSuocib+*dxC4V)P<@uI6&slVM}Oyhtu8?eK)NhJVGPF zn6FB*1Cw2+vSXt)-9cfQ;RWN9PyHUjPYUaJ2W$#!swK4=6T8IRn0!w?x8;JrcTC)> z8w%AW2pLL7>`EN3Su+r{)i?+fRXwu#gQ_juxF>!xOfS%%ZJphotgMX0B6NYBCo>%$ zo5c?H;A{(=uT(-uN&SeI0|^cQ(q!ff<+^D@eBm;74a zWhGbpm*b)NFWD=3b$%tsA^j1iBi;NUYJR4M<*0RBiqabEF&%jcUI5p4`qDCbriXl?d`=ao;>uSvpYVKC`2R76+4ruqaV(4N$ZT?UU zp{v7I<9)K=hYk6C8eiigVm10@$*+yQ zcS)yb2T$;mu~Pqqi;y^2n;zpzG`XSDOyckA{f0>OblcX1xe@kMl{r!U$Q(0N2Xj($ z)gY-E`Srh$njz6zM`?ru8IEH}8AegX!3H)FhS?q>6vbk&6M_b!q%NzKD1n>(Ra#?; zX4gXbosG6E#;uWhN?ofa>bVdn;ie1Ja$<{ZhV_&^{N~%{7KxWpy@BrJMT?XJO1tDq2SP1R`lhcj((-6kA9k_+iwUwGKxwF=DI-Y8u)IOZ|hJa5@!5CoWf9 zh?glV{dR}-znd)zsX5U`R#=E)AdG4je-ON*)G@@3hV`Pt2FpWYcxF_TTWN~8g{m?? zMA}o0N>nB=t_Qcx{U8!+r%)81b%hRr#S*}aRgQ(LE8eaL zN8TIXM|e_vx40v!@Jslt`V-@Mb|R>Wx8<0Mr&l}B;cCR;IbqBTeq ziC|uw!ZXIOBLd`&BlHMya9M5a3rxDtV!+ZXcY{U5M5Wmaf@eg`SDk|49b$r$9Fkl* zm!JRgs)|>j3VP!G!3f%Y);16|cPd<{h85NO{qTTsW(NjA9X3>wIZ^!xmS@mNRFVDq z`K8Tz@ICFpmT>U31}_#Axl2t(Z8Cy?P#m&GyRS2py2=eF7RKq)?r*K}ebyZHYqhbr zB!iGf6n5IoOA~3$u{MD0o0iT?;2-X&48SyjhlJ@H+(s;Wb=o5wkN=`C247K=_lx)g-b~ zqAF3E*@I%FCSZ*2jsX)oFcL(dRzz$MLgMRa@``YD9uH?- z! zYw$bB?LBQ=q?b8^DxC5W!G?98q9frQ-3Z>AMDokJjI?5|R?{v@QXxgjvP^!lGgT$7 zQBovx#ZIeI!sAP_sgcpp2Qxq6mr2U^-=}zFvxlG>7CA+Cw9T-mIg8aQR-aadL-3af z-F{)PYu+djHt)v{%VFFiQ25}15@kRc4@5Q>2BDZ@W)@k^HtpdSd^HcF$ne6juBd=> z_}J}Wv>y4UZjSr`k9@)<%+Yd5h|w3{Q0P9dxK(>vwI)=#;=pF9gW~fIQFR=%HSRW> zwWuL_?{f*!c~85imy1kswuOX{>o`Fx56L8#!P4$Y^Q~8I5)Q>oOdi6W*v6v>TY2#L z$c$qvSj5~vS)0bbzT9T8d`RLKNerI$RoFeCVd`19HnrlaQe_*qeN zQ`8N6Xa#kv;csHvZFL7%CqC_H61K_YA==QDI5DqO7RV9tVT$q!Wdm#kjOUl+>%^&O zoSP}H!1AZ^9?fqGcX5uq~3($QCAkv9U9o0?sYh8 zvH0PzIr#!xSs!zPkk{wMf71k7s02$!hQTvF8K8GH4%g&|FQ{@;W&!CzGXQZ}AxnS>72E&Gaire%KK)-O9|Jkv5=y*p++)3O`X zJK~vE`U>NjwthuClaef)fT%CWGp$6mmUyOi;+c%#CW&WST^P?)x>%+fmL`d3s>d8? z-BDwh|8+bQPEi$a{5y~>HVP*M^(V-OVwv(eilQ*nG8P1aeGwjr+^}g|#*63@nEGC= zQPv0{o$o5jAVg%j$ZR_dYfKFxtIOFG`K?UB61tcd>@e{z51W`h`^SvJR~UbiRlk%_ z%CLzHU+?!B){v<6h%z0=#-JOQt}GTh$?Y(fb`?irosr<-_;H5Wn!$jD5WU1P086+a zo{UXc(QiZCuDk27HF8mKQ`r2FP%CZGS*-GSw8b=rr|DumdFzeVokNVG%PZhysfGb_ zzlxI{D7y8^t;rz7-Z#DegDu@-v>Jo>eVn;Nk-sXH;>)RbiJ*gnxv!&Zk)yd$Il zhX$;v<8b0dLfZ%f$9EFwUu?ui|5+N`=cHph0Dk^-I<8zRn9YREoMIzBH^1qB#b1tX z)snSvSa#cW&ZVI8D}H(uKVfRK`bWf^fM);)C~iW9cQC8n*RK28+1r{MfG9k}-r`*w zI}ize7)25*Yp(Ze@sn%G4_TD3MrD4E8UYzCv~}|VB@G;uNUE@_ackV?6oDE4Y!NmH znJhUz>(@B#_zVIv7E_AKoTz?O8d+a1i9sr3tnz0AEx|R~qJLrZqN&kqWfY@DbE^=_ zBdzZY5f$1OEt*tOxd!9u-AKNf(+fwCrK!URw#R=t)*AlQ{;^0I2coe(YVq9LxJvdT z!b1(K+Oa{4rv=KQnW`}~`c&1Qy-thAXs3DhMhMxKXvKdYW8VCvC-ZM$pSvL@Q5&*H zJU0jm|7?}CxA0Byp6^-GUg(cr@S#Y~P>&d{oq;hwF5vf#wup`1xlFpv$JuLuy3`W? zS=P5Z(%goYArl!=WH0`Vth4o~HAtj&t?_fThxEBvU}SRwyaPi7W{a%XW(s==FSC98 z@r#n554rUWXh6_WA`3!+^8=qQSxb`D===9lWNIuDs|c2!1@c=wD&%dbNXxlCgu$Z{ zsGz8XvO5>gf7X<)B#I-QVY#4Fn8b{r?w=Bm=++Fc+U==wXpR5Vd0(QON@6T%+Nw2v z%2S0mLu#wgt$-10w}^z7RKB!?U^unJ|76##HJ(9Za*b}fi96-=w`&J)j)*6ML78>` zGKHcn{VQ1$#_^GwR~S8-PG&_zsEqon(v|9RLW}hD#%!ykN2w`ZBlVOmvkGUGZJ=;Z z+kGUKlld%rY<6MiWVLNx^r=l{pU7%xb_KSw8%AromX_LYD>CQU#b<=&U~octcHTJI z16x%DNYs3vgB;9W)!GP-Yp)*MH}|;oGeg9RhR4P#Z%&O@-l^HCk>?TKX_)ufrZ-}` zX(8(0&0@W(TT4UkQ`(~_hVyx2Vzs(Q$>Yp7A);}31~a2__Gr=QstkOCqD5+pE~HA; zCRMMI^0FAz|M@V>$v_AjJfwxn?5$2+={BrCsA6kVqeqM}OaJVU;ZWHU;uCA$JvJs$ zr!F;$?8b!Vk3Pi}A00|f!LEvY?26YIF}D0-dSgUAtr7E6Cd!48Sc{?)DCA(~hlT8+ z1_gIzx<{Jo_&dlVibgY!)XeY840Vtz`v|)qbAJ8u!%U$?b+XN#a?q=&P-@H*1r?MVymn&wKV@lhcvQVYV$mlNP5NintlKwDyNU| z+yW+z?{dA&+^cPFkk#;TEnTYklHv^ZbaNW|ckzeGOmv4o+{vY27)HB5)<`2}D(;eX zTZ6mevgd~D;}OA!idVxolDSykvV!~;dC0m!Zh=>a??N3*;1 zDgXBsAH4{{vUBy-;OS9AUdS*C&QoANv=KHr!Dka~W|tt5Wg)`T*l}%r7nwL7$ogE7 zx^QxL5RVr%(`tn-VTDFmF!FRLiZwe+YtbDWbqI#^P^H#X%{3mym*utWuaa;?BYDs> z(;Mhli%I%J-k7b)ohZ`(#QL|NKxG6G3Bc@+&o#_9B}f3O-k_qP*uC2Vtjc!@n^{SD zzkJ`&Um`y@_xt20-p?SmZSiOwTX#>^4so9wA#hpboc`?D!LecD?IxBzJix8(PC^M0&^A^{zFRDQ8D;A$nmYK81lG zHbxC9tCk@9z7`dL84+{l37{6r_6g$eZ!K^@3{= z#>H}*D=IrQO%e^noYtBoEM2js>@F}u-(zhc4o5O!tZH%mDs0)C((lO^uyD(EU?g}uTEehXe}F~-)i5!A3o`qgF< z)%e2WEG93O^hTtvHQ_1lJ_CXHsl`lW6GV zbFUWDNUhOFv*$neDiXCTadPsx#XLPuyXQonN=F{$v1)uYrFNu|GjnDhV@J3BcEj@e zlcOJVCEgbjh*(!MCAMb+hzR*)V>46l5Jm!LE0^>?^Lzvql{nw5L9940hf6?N(|<5X zP7<%M&cbs}RM4XYcU$4&rk2@PI?Y6Gz`a(3r=bwH3h72sM01 z>;Hm57U0q9ypWUax$RhM@+2ciA|y_=qpu5NhgI@CDwRIU`7#DRKi%{+FL$>~Jj+61 zd?>K!-{W}IZ;gBsp^{AtaSdDQ{i*@%XEn?~Ey6UXJnNEt=rP|Al% zp#=eGu5o5Jp3&oi7kkBN#GycnfxL{0!>W}z8$TC^5*)7wClt^14SEmdIfJOC(p6aF zZ>vs?8?Z`$W47p)=dNcNHVoHob8m!?4TMsj60?J?QtpoRN21o{h{hcuwlL{tOJ#TR z;PG>(lsy77A`@_@NQo$X-L_xP0$qevonrLL){l z!7r!_ZWsJ+2fyss+L)Nkb>ez+bNVWpDf=}xidgF2KvHv)4CbcwM<7Qj#@u3VgeEH2 zGX~(-l%l}z2ElLJfO`vH;CEA|M+`1z3rDo6j-&@56I{qzs-FvXGh^KhmYdpxZEgxo z@8n^=$&1G$z^Qq|Tqmmi(kin>sgl2J$M*0`$9^+@obY@`<rDXq~G=z9crt<-FcO`cD1IB?j4fjVzaz|0TBHvx+Kf6+-MLjIS zs=ZjG<%p7&fdre|u!;U-KDFX^F^@`5T04C!LD5f&SyZ}P@JMW!NQ zP$+QDi#%$5tU$(4DoJA4?HZ{Ht!p5kbrY|3D5d+^ua2%$fgD*1RKgGW9`1*pgssbV zj;M97@Hs**9=Rk|`Yi6YlniskO2D<&L@GB%lAn9DJ73~it+^RD*5OF1=CHk?X-IBE z(-5Xxlp_X`?;b%1M$~MtI{JVrRI`#B+7XmWqU}5Qu50h(yBzWPs&|34leJ;$^)U7N zsyBGn%QKa1Sa~~mFGl=2l6Y3_cR9y!OHrlx(uk9%Pbz~HB9Dggs21Diw>jD{M=zk* zyNQA5619p3+OC3hZ7{7hJrAkNLW74@S!>0>;oYGUBUO2K*z1MbJ?ZL#3@1T_8#wRR)8y7E0Kcgnz#QhNHn} zWH1sHrihh7cC4DJcAC#6lc$J>MI4D`&6kXoE9Dd>**p|)K1|4rxw4Xj3Pc8y*qBsl ziYr&7=*kK#`$dtW%c@ch?wbCUZfwr6A5f;-Ce4YSk7Y`JjI08h+dSrx;K6uZWnZ8_ zhd=D|ioW+{b8tqfGWO3=M6T}>X_XdF^f)h)9YcbBi7vLl#8&dy+fI5f1G$28x~{pJ z^FnQW*yo+H70ZZ0p}7q=-8Am<8R%!I{j%XEI|Q34rCwyff?X^k6f?0wL+N99g;~1U zqQbQ~TrR8RlG3myNQ=8uW88!bJ8`qwgTrW0eysBT0XfUG%-m>x${}8=1%VbhS&n^T zcBB!TZ;m5AWyxVnHo|Od+B%y(tK4~)m>=LDu54vGHO*xR*a;<@+cww6;N|nxpxDQ% zJUhz!K;lXc?m|je{zJ#P#59%dRu`Dtj(%Dp$G6sZp>UjRmvTJ#X?_+8ysbpGTru-x z+g0Kb^a+kPL63tEicXFEdQ~9Q_Hraf}|zyQ(FRg2{`6BbUs>;vmzcJF&lA zx#-)?ZjR2g^B={J%9M70BheSr5mxMj`cQhBqtfC$eGEsBRQV}&|G*_&$(HP=BV7;!s0?reD%>!Zs|J8~Hten>mN zaESim&U}}HVTBc{A^VG)_5Jj0ZY3>eb1P?Gp_rd1XV$x;=(U0k^LaHvd?RXh+q*I^ z$J8~lS)vsdZ4fCEZ(|v)R2LGc#M;RI$O)XmgFDQbt_6=ua*r+^7meZE*c@hK-lG3S z##-w}UxX>aR(wOnx=KU}Ti5sLl|8lQmdFA2;(RJceN{$M)7Z$;V;txa^E8oqm&EFy zISg_<+n_nrYSh#RIiJCdn(Ijszx2{n`I1Xh-tGc^UH62_z@j(IlMY#>_nD>ti5K{Z zgHnt<)zch>z~j3A#71_-5ftudaLc?7Q9ge|YiUldIh)Gz$RE=C^j zwjX~&0a$wvx^L@>q~=u!=52cpclb#d2Q_}mC2+K!XpbDWi;{epN+fk#btH8yr*lp( z4vm`5sd;M|XW0%M=EQ2w_2OhS?H*BuWxo+Sy!w+ZLsU5Kc`Y zt>m)Xery%}9hsaXx9z;TR=e9U%l&LEE)AvXzvl{>*K$$!J=FONk2*n^8+AOjVIAKo z1PRCT_^skl@KsKQdo|b-6%)9YdSAUcp4~tkQr%3*FB_I4W;#;2%08v~Io==RlcwY5SRob7Dj`+X)dDX4Le>kt2{YA>8xmM1rUf3*% zkRdg!a(``VdU0*)#uDgb9J88pJ+(z&@Lspd%n#J*aO)(s*&P~mME4Y;w9*lddfQ2qk|h8y#sR*A9uE!>-qI8r}Yh7#XKWE&4gV&Z3{w>n++o-EU#Q zm2Rtx&0O%DN2HraI#Ql}f&3o;)QE5t*x6q*h^rIo#IsWRS4x#5bTF#&!YEN>^lYTGTrlM={T4%Miq0DY}#j;m0dj!2RxnBf% z*~y(h$>hH{fxbU;g?$1&`?!;xapau>a~1Kv%;0AhtM5nD_j2{!qP~Tm^=E|8^=JC{ z_Hd9z2lKn&JbJVdw#ohN^XN+nI+XcsVm`H}_nO4Vp$^;g45O3dMs6%&NEQCgbqBU- z2B*`ojWF2PP>wa%>{If)HFAj=S0~!DMWSt9UuKBeCufhDr3*rAHS)Uo=LMT|a&akz z9X?uKD3dixoLQUj|0?%4v7bXZFo`X)%R~>u7$1!>pO4aC)PVuV)?ak<3%yeI|L6DO zBQjNp7K0Z4sI9s9-S%&qDoRihO9&`D+8pFB@sby>YT1cbDs^G+p8a?=o_{isuLc3aK zGsfIb9wU|84R3ys4Rumfr6OJ6{F&1NEtz2|TYoOwayd=g>ug;|98H{5pe-tNs_{5l ze&#G|Hb8J96aW1{xZFZ%byGj%gqu*!m9ltcG&Q5fNY1Wd1DY@+@!;W`YqBGVKtss- zH@VJymxKlh4HC+ku-Sw{KjQ9|go>6@cesyQC8B0UewAPi%dZmA)Ld2xwNhl)HFHG7 zIy+)DiG2l9s+mDE`C}G!I6ie)qG(EBUpBULY)z+-H4=j~+q%H8rrU!p!SCT3vkZeN z;dx%Ov{{Bx%|OwnS{ck!aYqLFbFsp?_o7+J`=27cHT)Z-lg`ah=lqU0}Xo z9ZgI96h+*5uBKGpxd-2(_{^VSgv=Cp~~TWG#J!0TT5b`CAM!dEXJK>u}%;&p3f&O4yjrOo;))Ms5;VHqo+n4;PuT zi#u6N0b@EmRj4bMWg8I*vax2}+?Zim(qy7`|6JJ$E3uM-Om;V6dD_SSJuKJHzhOC{ z2HO>W?PFwRkM2{Xl#JL|myfap9Sxivr>g4k6jOkDs|sr<(Z81a<|Ib zne3*iqR!;}Z^x+@2-6Q0#_sFHQ->i*1z`q+pWVrT;s4*I_bLA7DmA=|^D<@*V<#VbNv05( z`h|AqUA#39sNE_Pqy<>tOFPuL8#b-wru$;C`R~RURZ_njOqAS^;d&ywTubWMW~oiw zNanW$C;ZB39BHCnHXp|Y58HOj1y6_7ORixzXUbUlv37lwc+3bA0d|kHk@Kq#Y(niw zRDfU)_Tz~jDb%5PIm5GU9ZkHVYqEBlccWm;aIcHAaly9nk;yBWypl-}%T3!R$-vEN zrE&mNw43pq7~M!4zMP_NBa%$p5ZQmge1}>c3BjH+c_LSvv`$uHLbYR(RdeO&^|h9b zeBvd*uc$l%5%Uv?eIN*)Y0eRfP5(-l)p84QA)3N}*D`q5y)d5V%RIzyn{U1>#wt~| zVU_yf$!E($m#^SqU=>!^`&v`wYbBpyJ%1ex-+EFp_73;+IkwNgeVE(WEF=E*+@@>0 zRF3)(f)?XC9*PpJ@pUQ5?2?F~GG(%qf6+Xuso84OOfRfPO0=GID6(0)C?Q9UOQgi6 zmZPf?_#!>RFZWzvgSRUo z*;9xWiD@?YuYk&|-xkO@{IyGN)v#@fTBDqO%8DeZuwkh!IyBLlcraNwue~N2tVwG7 z#8<6JfmQ4j%x*8LwHG6blGcT4WMewcw7rXPaGdxEHAOq5RGpgZxr(%Q~2 zV&0cg%O%6=f`UTUBI&doHeM1;&-vP=snMN!Wh+QnTTJ5|zl-WV<{K7QK|sh-Yc~Sn z#S!Z_N(2-mIJId_L+O(&zG_v48Y|^2$hL-Wx!VX%p>}U8v(sVd2r(+uIl~z_oVb!- z^HPE+Tc8=V=21c&hkxZ7Fgao^vKs(e4GzC^Fla9bNB?08{tldL!6Wg2HT=2Y%7#Ao zN`w6}wCMwxCSG-Xy%#A!og+p3U!>D>n3lLQ9kLpfeD!KjrZp`jomvrm68Ngzbc%~{ zhE)z7@H5r(Ou4NevmXCM^k0}7@CARgvjz{eHT+2$SC(yDDa&Xb>(_|xS)i$+&0=2; z@7s^@{t0=Xc}$V5*k20PBm2CSS_#R+%#sz{zF;?i9IRr*l*ne-aRictATy$$?@1U9LOrT+gXqeW7q3CZnbcx(-kusnjNvNR-W0m!Bp zj+W&@q%kH#SxcIoPTNqDiAgQenihe`mtuS&2iR4`hof2LS3*`n{;A=k{3@7T0f(=Z zY!T}v;V>cVuc~Q2GKOl^=|RS2|GLE5`eZN4l%7?E(T_5|V|&YYL|EJ+!OykE zUr{n!${vcw-sWE}*_|TeO6GC2q14=5*)1xGVOUeqbh`QPn8TKSKl(^dOXb?0z4l*L z_4d%T7$HV+=`YclCs9VvUcz8KuK0-F&C>C+Wh(ekLMOr>SPRPEU6ut?i;sv{im2pX4F=ywYH6&)zvr>a3Wty`J~e3l$F1eWdG=z~;XT z6)h??#mfZ<=;a4GvJt?7{WdnXYd}Ou+0+uAp4QB8BX*K%;%hV!BO3^n?HrULKXet@ zwB6IwLKI%lDx#@-R>iOF?WybvtYY}=^-xA{w3X{;xftCz+sH0OemH~D^5ovvua-5# zK97iMmZ@q8bnWWdn|Mm-t9P@*AC|cjKa>HQA^TN)YQD%!kq*_UIV>^Vmdsb~t_q6ov=xN=$YD-UV z4;G;kQTgYO_POL)Z%@za?H}~^%sP(-JdkaGT-Xgb?LoB}tJgkyVQXfVr*~`5Ua3b) z?(Io%?AN0>i3k-}dlv5Jnq?SQ=v`@(>%bmKEoutpVw9}>2hFC_jHPX1f9oE##Y^VjqhvRCX%Lm=-tfjdHVpig`)Eh>~QEAqojx%xqG#qjUR_Ng)PT0HxdDW#Z~^c z2TK6x#$XB(yxBjLC2o+ZbP|tF3bfR4Opa`bASvdB{h@*TI;$yL+2V>FB`$03#YvDW ze)cy86;BA48d9}PFoEm}3JU(Mv{{uaQBt96iH~#SYj*o?ns-ud?S}$=U<~jX8c)?9kp0YXvjHKOAttf*c{NaM{J(;b|m(h1T=4;pQWE= z)`ZPs;*=FX9Iu=0m22i)pia46W7xGD34aIh_L zW-Whzj7LG7Bl>n6`@@D@WYs-%n9U2FVt;XkgmEX^4oaS%@L!4r&N@|JB-R5fl?Vbm z`f|pagQoA2mA1*wpr?qvU_* z|EkL*!i!kRXGHh37RuspJvYCskkN*7WTn6>DMn8Djrg1wp%+ zu=xo;J5uFU@>9Qv(K$3WQ3U8%JPc9ggB}W1~ZgpWDZAt-|R2f8iyi62_qRA z>Xe-iWwlEVP^lw&8VV#x>UR`wsBQxwi{|$GbrOS`h zTKB14Z8!Hlt9T(7C^1MU{2!#b4P3SMtPyMcBse+5ii*0$c z{LfUYiY=-Cv{-8QZ>RQM^zPpaMIcpsuU&gfwsyI|IPqsC)s#v;tbAZ)SvG-ONX~kd z)0T!*yVZcH09R>D&uW@Upr>qxl4d!yg5Yx&qD}eT60a)sm-$6rLS3AfZ)`yap1cY2 zYooYTTi5rj&Wj(m9OArRjli)vGo-iYsFHhDk$kbVRx7bD95zo3H4;lRZ&-chXX~Dx zwOill?WJ48O4as@Dj6ya(9 z=xV5_Kz172Tj!rG1LL1v(2jclj9w05KxR6vcPo3obGBi{f9O?t{t@GQpMO5>RUJ|n zG`Q{y?121d$Z`a!f>twOAL5BfusEYQ!#=?2Yzt_3dLfS)QapHkW83E2OH}O(wvzXk zFDZG7=0es|Vg3BeXO9+H9pQ+yB1=+=sqSB)^+;@~VnW$HKnJ!VJ2<9;30rBfhz_W# z)K)^xnX~Qn&35<*uHruwt&PPFRv>dH_-4aSCa~>Hx~1B1e`@J3xkl+P9ZsyuyzZ=5 z5i991)KbJMr8_>ys>}`=MrzIiPv$?tNDKDTp1tuadpBpfSAzeZXK&{^4#H5KxA71) z*C1Y21LeCxvdtcmGs^)uYLAd?t`A-!E@UbqUuG$L2pb@2IV%ZURY$DQ?vf)eMdob$ zGZ(53RL-}e{we&|Qj_y%MC$*#z9H2SPkR zBQl#y*^N|(MgBDYXcXeP&JiBl5FQ7lq)dmi=_~z9b|otrZV>vzrdy_pG_L6*c1oxB z@g-8D^an9h=%`nup;zTfyGu?(?CpWf)U9$YpcCXJ=JveA9Q9A6ixaJ3MD0#cy;JhB z^iKAVNdF`R#Tr)7yC3nFirLOZzW{?`FFK9m80p6*8dt{nH3@jjE^udk+5}#Sr1C*Uhz@Wu}I!jB{gf8p|mU z=H~(Es0D+B5o=Vk5Tc)R^3ZFJJ6SN#qyZ*aQ*zvE+Ydk6Pt@cn-`{owrnU*Fs9 zJ$Rw9^Y+p|UHs{V|7Z73um9#xpHqJJcW}L5^}MvkF1jzrhn)KhZ@E5xZEVV<*iEtN ziD~hfKlNRC{jF24|Hqpr`MxvLH+80O+Vr?DF>}%lzNyoE*H8PkFE)MJ%=oR>PbKY% zt}kUCn|mwSC*3k5{%bqchx*8+a}#Q$u}8H-ay`|(`HS& zHU3lI&nHd3J{F&T>(tw?k4vJ-w@&(}#H4AlU;Dl@B5)&!y znHj(SAE(|tHU4XgiNq(}O2%1}d>7UIJaic?yp{S?Nw-X*BQf81ZY)SN=BpER+$M1< z#jcSs&~BLIJHR2J1P#;=`~bKZxDvPqxDB`u_;=tBz)D~jupc-C3_<)W2Yv+n9QXw= z6}S`l9qQ)g#n)V}-vFnd;c{&NN>~W42bzH20gnSMz(>H)GhME8feV1Eff>L&U=i?d zz{|jPz;zbo0;7OSfUAHhfCc;scp7*E_z0-|I&A_L0KWsa1ABpD7NBneQJ@1j1k@uT z-VJ>7o0JK30kvnlTz3Ia0B-=hfhwQNRSnbt1~3ko3N!VLT#=sLm3oy2lu|1FR0uBP<^IfhF0DU<90B-*tb&nuFFuIDq13wIaQ(!D`DR2ky zG_VqQ9r)P~T&^QP?GN!`1B-x%f&T!W0G#%{fPMh z+yXoVJO%6m4gsDYlMg5bCIL?aF9Z94@}Dp-fQNxMfOml}fOD%|t`WeGfeV0(fXjeu zfE_`X>x`dr4}1=UMnMliFL2Fh>IUxm8GQr(*99)uKU_$kfmjVV1|A1q0agJUfnMN@ z5M=-_0HHDLn+1A+E5^E9*8&d!Zv!IXaO?7nU{hG;AUV6uoBn`>;pVem+RZW z7~p!~cfg;3Hee^l0M7y5pTnDg8vqOV3-B`V4iFem z7%A{Cz}M^Gfxs-_Zs0!PA>c(|D{u%n^9srWBEXHn9Y7OsFYrg;8K50l2W$Zb0RNTX z0;mIi1qOvm;A~(#&;Tq4o(EO{B@>xzz+~Xpz@tDbumd>h zD);~p1>!&humpGzSPT607d!|41ndUR{3U$>4B(f*G~hSDdf+qQlzP@4U0L%qe0ULqOfp5p4MPMqh1DJk;%e5M~dJ=2vWM~X{1aRF5 zuL9bDA54KC0bRhEQ{l%z444J{2KW>h00O^a4gjlx-N5lTfh%AdkOKZE&<5-T4ghD| z3=aXW0B!>A1|9=m0k#ACf#Yt0)_^MDAAx@c{sgoFX<*nicoA?jFb^<+KLM+OlcqCX zz%PN@fX9KCfN#ujxn=_Y4DY5PFBuJN%w!=3a>V-Tm*!N!|M&RcfdAj{zb*eq@_#Y^_woN0|6ggvp2z>Y+ zc92(9*Mo$M^XR|MP#Bt_7AqB}7puKWB_KSgyf3BcgX%a^kKUjTDi!b1>E5ee{JH8q z<-@`$Uyd*2l2Ih0nCGMadA=1sjIHn;@QJZW-orkzcGyQVtY!HQ`@~v~Z?neQX1ykY zMr$H=MTD#wMIws64&C&1hC5gr?hNy*njU@Mm+6SLOlMbwSQ{eE>v{B4C({wDd!18G zu%(KUTc#(TNz)4>mPPnlDq@ixaX*6o?nm?v(qHf3#9*jDqew*2Ge9VM26_kRuXkWV zP&M@E+YwzORdtWP9_SH?xJTreps+K7nL&(Y22=CkV``rMc|yk0^9+9+#qh_+M4=cH zwKnRZVq+dAZeyNZdFXyup3#rPjegwdWdhUlppQp?CJ$bm$gmo_k$_@Kp3{#@L^?h({|QxJUwY!o6F7S1iGER}O~0rCQE&sI<_I?@Y95?NpMIRO zfkzLJl0go6oTdaZC+dEbgeYocUVI#xcU0c+l!$^5MfJ(csQTm`Ad18^Js|HO5e%|5 z%`ozA%!`SQd2i>(#O?g|@*5NSUjB{+q|0-8SLgG#^61t1cIIQ8o%8q0PxXHJ$K{ta z%s)rCIr$glr;bP8%RBN(RacLEa{iO_KL5$(Px`*qX?ppSYXN~Yz4pl+fXCAGjwg>u zjU!Lqd@{0yC$BF0t*2O;zWL$O;5hC{8|;QpnC(N}=`7B3S?ImS;omWfxfS6b`L;YVT7>NPxXhJrKczrxr>Z z1PcpYErj4|p}j>yHHw@lg5X3EV?@S~U7%Aza=TN(K?SM87zPy_Q_#eHOu?*z#3QTV zzJg54zJf=DJ5sQ7w9)pCo)k?`CPnXihUN#KIr)rjo>J&~Aq3Y8T`z0}*9-S5Vp{Yn zvbP8=_7=HbL@E@S_bgL2@7d+g%1)A9pwCnE(nm(!Fg)snG@VlDbRh(%tvLkO3->RI zpnuVM5(WhGo+T~~!*P+&-Y;%fflB?Uie;NgdJsY37BD2tlhcHi6mmd zNj6%OqBlPSpHiq#A&TD%-7I86aO_%|MU8%B(S=1>atn(t zElS9iGG;g#uxLHZ{7#wgozhuNeXHQuXpEb#66q>croMln@r54yRu*Ai{k>Ur8HHvR ziZl}VG(ENOuZ06GJT1*4WEj1QV53)&(M5bMSlpwFtQUSgqci-{qN|EN-J05=AZE;! z5H5nq8rExzZY&yT?fKqv8;jm4ieGn%c7FDWmY%%cLU{v4^9HOJ-Jk9E>|bGtmY!(WB2kb=zdY?Wg({lq+su@|tzkJ9<(5>kBqQ16BCgY3%4g$}n#}JqFn29moR%P_Wm@dUw?p=!YD=uum;zNov z?jgn38+Lv1D{}6+Qhav_(e5s>rvwAsQ(|RFVON&iSQ2()$sLB>QF2Zx*g2(oml196 zG9$`hYDAfiWrginwpUrSy~<89?4+`t%E5LjcfFiwua{d?9yb=1UtS(oyyW-R67_{= zC&u_%o$}!3;TZVCF$@wp`pKeyzflJJX49xY?| zqh-#Pfj?Vjd3oWbgVWCv{L`j`Z0X=s4E!n60sO+}4nGHf__BdYv@d?V zgyD~uI8y@tOo<_-4L_vx_|ov>OG^jYrh^eN%*_bm>}!=N9W039(zGCEh2>YotP%Yl z(;@nW&oL48nTUaO06(zAuoCdYO5A(F@b_LIe)Wmp*s_KnD*>!e0B62v_?a&bE>Efs zE(s`8c&w)D&=jJ zU+*fFS{gRB^t95#PAk2%w8V{HlA^f%{LvRg+N~-Oxn7Qd*Vhvy z;Fy(wbL6-ok(13}ES;OxzNkcINvKo+TV)i z`Yi2Z^x4uEguPID1Zy=$XOvkaYjshXi-w*1{GsPXeCYW;FCZTJ!pIj2eB;U6u29}~ zMf0|672`Ko0y)}EcwzGYQXPF^3QIdCm#fE~JN2AQ(sPU0P4eppC5AlOKJx2prEf{- zN8rk1ZNt}{mkOuh)tX$Amyv8MGxzyF*BQmK_>+WVwJfN37Sz0A-d54XC0p2|k|=Q` z%2na6k}smXQoK_M*iI$7Niue0>4~&+$q^-C*O&gIH2L#K=@TYJP7pKL5%?gZILf+| zaun-P%3mZO$Hj~4xCqPMKN7%6Lt6JM$J%pjXgF;-}G#yF@r#SpoM)VFK0I%{&EY-?$y#)!%crn+ZSv@p@+|Op zv!fb*mTacX?3(gd%A2KmrTl=GaC5{$YUB;99LH@l zX8B6_ZZE0Yx|=lP!XZ{`d-P7}tu@i^_R@%#1h8qpl<|_epNcj2Q-*E#@GfV>OB1Er z3~A5chQ7S|W#jGYmyhD6KKt_CS19(rvi}tk|7V4|wnE+iS)rb-zz*{t78t?mmw(4+ z{k!y(VC&Tm)swrkiQe;Rx&~Gl zRsk=ERoGR*+p3w~RpFo*KSfJe9zoEV1juwpz{HU7f6|xQfypSBL**ePu=F@jo?$Sppze z6w^imYkduC>gUq*uF&ySQnBN!U2vkc?(*sgVMiFBT5ID|osdthtxt9EDFdHc>kNET zByR5tguRaKm3$q{Kulm{D9pBu#0Ew*4BW_*tTmS4XgYiPYwi{P`>n)O8U?=gv<^*q zR>i9oIZ#}!I6RhhJ3KZ$R-Rj=$1WFkdFh01yHcgoL^?h8h7}xpOOB6d#I1S(V-IZ4wY8FN!W~Ib#Z6vTW}}DtGd#|(TZg0(TeAp zlPG<@;$>kkSG-7EqV&bs8?i*|Mr>MTSP#{f$C|lW9(y2`6gd%lCYBsJ6MOnKxYMuY zye4-@Ij>z8_WEmg414FbVSk4m_V*lui81Tk~H~inT`N?7AjVW(%+xgOShMV%nOyOR( z+{`x?3-^lUewC0{*PY%X7kEnY*6_-TJISp~qjB*>EcsO(rxv|#_?~YJc*6kc4X33e zM>`SjRTvF6rsD*}7#nD*M(*Pd=ctpEE;p7`4Be=v~FuMc=V z^1FwR0|&f5?$lL zc?h3gc>xop7gQcsMY4Zfm5eIX%cznqtf<#iW~6H>AE?4W4j?wmP!!uLGs10^cUNIr zcUy%#LE2S$6-_;QRh5lmX=9abhTTRDxkO}FK2${xG^Z+`uS`VGSH8_M3+UUGJ6Flm z&SRc(vnf~p=`v^q;pbC+DAk}z6@%C?T zds~&$L*JSH4$|K~*ztiGu2hP*mFk5mmC={pzWz3qMoQgy{mZ+*zDu#S>Vc|6WXA_b zX{j%N@E~Mh>DzqtvDBE4(!afZ@@?EmPSYpfJ}-*%Z{MWfD1GzoF7Lp0d8gYu!ghOS zps)kqIb_&F?@V|XcEY=R-WBbhcT=jurc`}URoDkr`@RR;_q}272|Mh)5yFmm?-#@V z^4^;FR1c&-i8K`I z167Y#^|fHt9H;7!w=Wso%)Wc&AN)$9EM?_+Ah`|G9HEFRd8ETK^H*wEm+NwaBIwwKmqW*|f3N`g)R0MxTg&eJw`0 z-s(Az89n1||546IBuUOkDIc2^s8c?k_c4NbA1@0DmVLZh1gk$@8xr)dwy7F|P1SZ* z^R|lBJFDFi_ExpK)d=g|YNNPUkSpq_xUq4_$Hq;KlWN!FyC=ZTsJE(~;(*xxqmdsm zDP6=x|PcWT}bQygjUHh^06riUI)nG4FyNtzvz8u#-9=3n{hy-CrB+N;G zos%%6hOk3wOsYXVC)MatOV}Q@de?&OU29>IunUvcC&8{yx>{SxFg_YV#?^$J<1(jlSfr zYtP49tHEwHQ&53ER>i@tin|^!+UxOM6JWb0q%rggI?YZxRyNkU$Z#vrIg>#Bdh6>k zSG7s5*&nT~X7<3H)s`n1Fg$T{B6YSW?yrfT`)i)83AeGzF5Io9hg!n_EAq?(cPt;&A-sSCr}17BUGjdSSJFaj^U1vPqd3 zogH@|L9RCmzmX#``nMVzYsj^v#udX}sc}cxJ2i&a6z%YuX*FTfYDySm82bTICq^Gg zI+=v{WKvIJ8KZmF9#k84Q0-q0`)lpl!p^QOk&dyE<`O+llA)f-0*W1RYvL)k#GjMm zdi;U}iUkrOQXye&BAf|0&!B3ZswE#@Wc+!}nK;WGPyhJq@ytYMadl7VEfa5oF51Bf z)2qvqt{t*cNPZ@RVzBM#Qo`WsEXcvt4_EiK%Ha}U{kZVQtDmv_mFn#i*)rNEc1iSo z&1Tjmu{VItY+~Z}M3W*WHyZreReh?~z$D-I)E}5M0zmx?vPC2weJJ5nLjD%vGs(k` zeF~#Gl8}|i%$Q;GIHlHsT5_@(Q9To9c&MCNeKpQ`NXI>icCjV)uR(^4sxhc0#h{wg zY8vshn!9UqML1RK0&~XSpTZf`%aeYoP4P?Z6--K$Ucuy0>0y$Mu}L+u_q8pQ0V|Y0hWD=6rVbGp6b4 zXT6#U+pAgMX0Uym4K?i0X6u_#d4039%|&~*`L*U~uQfmXg|LUenEfT%*3dB&egfC=lir{BTJ7P6^^@_R!cY0M|7R5aKO6Fy5fAxnr0^p@o6*ehGi1>54En&o z4S(R@!@qzZ{>8u+h9B4>qXm3Mi%~5NKdR-tmhkgh4*gd6kfRAWy0Ixay|L-BroL9` zN*`-_NBBEUmw##aTiid}_m~4dJIYoM-uY4Ksz$Y&fcs z(T{30rV;#@MhhF!`{?B5$wd2D@-K~jt=1{MuW@!`#3q7?`b?ASO=M>s)O1)=q&GhA z*4)=>fzsWY_iT=P@PT%}LftHvgUV4~gJV{R{OuDO{=Fzk%8Nb^iuC z8qnR228VHesM3cUjBf}(-Z%?yoK3{pUq2T;w|ezAHDD??nFj0FI2v3N{#t`HMhBlp zOL~~suot6)@71Wk46A>mqn1A^X;OnUxs+`5mn2bmsUmrB6T=T~lFqJ2w>)RtqVnAeikMO<6%hZ83UHOzIT(t{)?lJy*d zC97>-!^OfbZg|(QT_qLRu^Mk^ESt}U#^)QW#`;R*K20e4G+E595~VjuV3PHjFCR$p z;LFj(2N%=7nrOkquYUiEeQy6(ERJNnV@+^8p4VV)1Cn(u(!P%B$J!Mn%Pcb zwznn=yEU1$T${DL6hET%Qv8A4(0DrzMCmFaQgln^e`?42B>%OvrYqNrfwiI@#Ea2K^0mE`x z$LV0}M{g~O_fD(m;#_BB0J&AN%0em`Om3BoDx{Ku1=~C_C?gE1WRSU4GTM+z2Ao^9 zv&pEYA=Rj+)0&c4)0)m{DswZZ=@Ma=G~H_0txZn~d$Q?TLKCIeN@zHaH``*^EzOPz zd#u@M!=7&T>*uh)e%_NUK1%m&p4yzYsm=Qvwtw^C!VYgf*05unUl#Uq^SOjIO3(e` z>=&?Szj$ES2Vac*5_aU56TTGf1j!gaj`;Exmxm~Q>#GheU^}!p&m8c?N-~5`2uWOF zP39)({cNJJ-19fu-AHzx-Hq61JlS&km2WcN2E!`;dLEa8x0ns97r zyst4^MW-g+n^1ITyhdzB+|Z+KTu9ho8WV}?x<}J1P3dn}^V9!kn>a12qamwf<`-}? zzgQ~V(l1uQdGv5uSR}-!GbucjS3jlYRk>)Q{iSKQPl#+cuBme8+WV7VK82m~>50!M zPJFhIoGPIgO2$6L3FZ-wfKI{5qxS5YppUn7#OIcRsfsEn(mty5=XOIMI9|VK~Qo z1YaEf0)FpI_`+YZA*va2*Ya{HoHb>gP9%(b8t=X=# zz8&=)!yWbAZ`2Ox-@aS>9U)x%-Td!`o&Wv%@7WR7f8T+|0o|d^%r-=7W}DML2z&a6 zOFv-i(ht{u6873pBieFMF{jOMQ@*2J%6H3uAT5{wFzQDlJL<zVXIl%=42ZtsN)ZVexR5u)>-aL+w7um-hYrz zd54oq!uFL~iPTys#X>40<@x9j{}D!!2RwSq58Hl}J<_B1{c!9DNwz^huKrQVr9Yng zk-?n%@%E3tuldOD_K)3v@_o(QquqZR4&d$4;Xh6Pi5k;?TK3apKl6OFFwa51mdE(Z ze%kcY6JbeSjZB_!&Ju%h)?f?l7=taM#NgECvz^&1)7#E&OKfJhy-)QheV-mM(&^{*KMTA5=Z(T{{5i|8SwCZp`=xe& zU@S`iA;x%f$r|Glo8ES7TXy!XZLhW^udW&wp1_48Kf@mRxgV{b(EZwBgnJp=>It5n z{K;dF-h`FB^5{RjGn@A*MLwXNqySAbBw`uuZnTr^YuBkgud!<=p_4q^-}X3>U>l-G z*(r|v+_RlLOuQ-XH}vT4;sHy{*r}ux^qZ-=DRHvBLNkoe~@mE!ih$72~pj|r~ z5ykM%QfqW)wZH)Ab*rOzU_{V?T}*X~jIN5!WMx-1sFwifuf2?pBC}U$M1WORN|8-P zUMxsaYf`KmDQaVih@khah@y9IMbyw>sR%)S|f1M{Gem z^c5X+b6=yQIEW}tLyz_ir#mxnhq*}9&_9S-bxouQ0{~yevFf^eA9Wh5)y3FeOfa#b zX7S->^~240NNAhY4>zkHZpH>jvrY7tprLdqDNWIbsZEe+KWhN=o=kg`rs!ej5!y$l zHcC@4^HdK_dxA_mj*HIDu^^_J*=4MELQ~7rRpXW@8O{y~7YEip>UR?^C?gb+9U{m$ zyB24YH54z+trF!xoJ8FJq)R!cdf8)Jyk6tlX?=%L50=u9_BP*IYL zB!Jj6wn=oks8Jl~jK>*DUod$t!kn(^9_h_{s=Z8l^X&|i$fjB-o>U`A4yD+(|ad8^Tgvl;UAsbCxXrmDkbFk8g*j#qWju5RWB=u`*=oDG?(V9Xwf*Kk+ zth*6WjOi{S=m{&LxL`!kYZB*ZO@ZIof=-cTjja^55K)4L5)KjBs8Gu;SP?O{Z7i~y z8p_BJdGzlc6HfP>xBTq0ACUhKY04!_HOL>_iU}c||96oRvY= zbW$B;;&?_%IEYJQJ<7V2tPgin1DPZ~jO?za$h?);)4HqK7Ev5P*+fIf;BT_doryWU zY_d^yVFr_RuM{;#Cbhh#ka=z_Q#n{BwY;X7j;~E*D*MU|me&*+OllMEiA+dIf^J>a zID%JQ&*`D=(IfA-^-zmVSnRl|!>Et32xOWlFQlkEEj$^k9^E@3c{s7T=JVk+=E!_{ z^x`fmvy00A@Qwe6@9S_PL-AV|^#rf)@~TDX!+*rcy5L=+hT^Hwx6Y+UHpu9q%)X3~ zVmwpMlRz7B-c;_Ujv5JcBtxvPp}zwXHS}apX~y#IqH;*51P#TkuT^`V8RGI9gz*xl z^*s>Y^k~YBH0CQ?G&TT=6;YB@T@{gh?BN>>yk3f#o|1HO)Bvpoac>kt91nB)su8KO zlA+50)irdJkw9k+5(#w4pwM+3Fn%aP({eKPc(o%{Ed(TK=oTY^9yJo^StEfi7$9|^ zivcw?bizO}$_J}}-2+97^_6s)qz4RD!+DNs?_okd#*2@uFvp9e)<-^2#V!pRXsGp( zyP1%WEZ$H{UN=ltD{0BQW40xi-&8e!2af3&i1J$%aMnqxF@(mrp zditubp(%rnnqvH5nGPr}ixKNNweVje#ZeG1=Fxew^f{}a0O*MRGQ8w84M^)RLMRQ4 z(6mXVO_GML0W{Q5+N0(=3D}9J4K;MIcv@IfSWi)hJmq28AnR7)uv^^T8n|l0c48)5a#xLkmKtl~pWvp=;Dp}P~vTC-GKzor( z;n`E%PtabPCF|3JR2QPl`zAxwNC|j(O)=VtpyREGVl$#9nrR_LsU8|VPq(|-{`fxZ zP?d&`NtrQJodofb?NBv%lq5ZL9KT;hVsm%E&)Kk3lB&KTW?bcMHK5tF&1)brl7p8a$HA3wK zaMc{4PKZsOQH)f#|7?m!#zWOm{A-}0)@hb+$Z6RXhN^+X$T$**G6T13YUoTrf`*F! zHTCHc>h1`emz16HyQYTrHUogJ6^TbL7^e1`hD(R5-NUU_%45a`^gJLzL-8F8c#UD{ zn|shTIfxq?GScK27P_BT7;|ddTpA@0>tS9 zY3j0(TuW1Z=`&tK2Llo{RJ`C}LeDgHh)PNNVw&oWC`l@fGvJqWHA8?$4@pz=sgx*{ zZW_=zU5!A;Eq1z^0!Y+U6_ZQ~u@X;ehyzCqpxGS*df7^x4>Hr$A5^cQq31)9)qt*J zL5hfGD7Go<26D+mJ#j^dyNp&!|5YVj}3cm z(luRe#(IK=&ZSKQ4Ydx+w|2+K0Ok1)UW`PYq@h;Lg&45Y2%(s_7w^yzk{(4zzAwE# zT}>RL%%y>HHm&%0WsF)Hl2NWQGU%3&jI#4sskdaT+H3%(M~$;aC^PYlgW8xexh-Rp zA+9v$e0hK7n_OnH1oFUhjOuR;O&Y6a0OG~;b|cv}*33Y4@j7Jq$QX4VT^)UKtm;Hx zb##w$D%Aix@v@LEj!`Mb5+3d`;MiDo2f*`|v8orf`Fh$oW1EC0i^PE%((ir)&f0#% zxg@98tZ`~D?P_S~X+U)iJrhnozy%|OUVNB*p*D%q#!Ai8ace35kyNIfDo3#pr!hrc zxgO?>Q$5B@m(VqU>KeLfyv(RPF%7ACy?(sfh`OeRTD5c&QpbyW9qI-eYSq#o>brE4 ztf524o2wedC@S)@&UiK7iYS&D5tO!E`}lx-yc&RvSN5zDPeK3DfVVrxtIJfYp`mjo zi1*Nq6T{wz)QO_*gSw`MTD5qO`jqJy+H-<&j{-fv0HZrhP@QN}LnF!%z=wSk)CQDX z8$m`U-5o&5gZK%mBf3Nl9W+t-zU3NBnIX{2Yflr^a)CZ}?1^fX)MUCRsxzP(`qo4> zYLWnGm&xY*5z-}wb&skii)bj-lQonU=7CnIKCfO{Tcq6VNow0KvcRwYVytptpFc@; zL&TleFKUtjAsy9IC#y;HO+HRmqo>MTLer;)V~Kh$YCdC_tVW`)uAx>fu?(r>MSY5T zH8r%SY0VA<7(yFfYYMlK^q|cuswQjb20&vC-8Gp3@z&*Jb;5|C)(m$PAv4L3%p_xm zj&4eie55y7jhkXZdwsH64I*v&PEl(?T%e|?lT(y@*WP^5y`_A@fS~V(LT#&3SUP8@nE6RTS@h4kRd|qKb0Qs{m#8IKoMF`ziLQ+FRr%jW1LT643 zhdZQB6!mn}yu}z+OSn<*q;;}}?lDm&Jb;4;n`-F5X(o&m*pxRt=GYcQBy*bDjjV=- z4xBEgp+l#Kdk(2N`A$=psK=Yi(?V+LIi!vk_26H{Z)h*mnu!MV#$MYSY!Okc@JV$XNf=Rmuzr1a$H&@ftdPmJNgkte+!7 z=*BrAAz-f&LOab3hwR#Pl{Hh2k_Tq0?3qe_H$lD|z$^YF)A5<=&P)|)WJuTxOegY@ z$t~Ni{(rQy-zmu5PQFzTZpY1uZD%4zzjVq7ZP$Lfk#8)}m~If;&P>%=v($mv%EaaL zY;}LOvcEDR_4#()3>iY$q_pMM!8j^1He{nGR~`*fK9l?TKZY16isYfIoE`?wP{WBa zcV#oww3)J3X^Ppn+*Ct}q1nDt=c+k#Wh$VzmrDjf?=BBT9ne41WCLoD_a!{aoU1l0 zl78s@nnqlNYEx z2Ao--ZY?miJ1tZx3&jF2oX%C(tTBqCVk}Bih_TvwfHhWIcUoYK)z-7EvD*5;0@V)_ z^1(x|dFmQn@{;C!b%LJi>S0UO0GzHXPWNV%9Q>$+O+H->J+qT&jGD(K(%T$-;$~2?wv0UY8`E%|^ zjv)_N8e8qC67-FEiq8DsxBJm!`&|In(qlLv;p5Sw;m+9@vH)i;RKF~;iAFhZkqj4l ze~G!Wp*^%nrchIy6eYj^v(RW+5}OvO1ITdU_9E4Lu?l|u=(ViVOVouWO5Q(ak!Py8 z1gnOIUI6g$I8$BaJ*3dRQl?sjl<%Nrs>^_e8fw*M`?TtKQRkp;prKYR`_;a z&N+#$QvGSg3zw_aKtQ5~ju*+pN_>!JEAh&$trVB5(q-G(cLA(Yuh(kQhm930BY^Vs zo{}&)c|E+E!>Yu@8i^CM=i2aegrxKymYPe+YSovz+#s$|UDwJiKy4$L1sd(dQ?7BV z)s;17u~DFx%h{II>Vg^1_%*5rBCY`0wriA+WYiINl0~#nYy>m~X2ix-tCUa}yJlM% zu~v=69>N)G)do-v4SfJe(9rw5gKHiY0XnP~Ewsn_@IYykvrfVcwN<&<3sp^gR8>Yl zXRSK4)`pOhI*i}eG-1VTH|+DVkg+cg;m2L7k#M`#stF+OLawe=i$MGY%R04foqFth zbCiiHYQ9Q|;Mh9FZ|TYLMvf#%*`1M{$}NsEVqPq=w)j1X+_pk5WBkb$TYu;&%%5!K zdP`&PTD1Vb*vy8nQ!_xxdi6SWUH}Kb^=hn%9dt3Ex`r+Z1yKVsMa!=MtXIFTw;`fL zP9j^agoq4TueKOF&}+sHwEc$gWPna=kST%=-WZxUz^IKPgl-H8S>7Ae5~?O@sFlhT zA-#+=SwpP>PFa9oFu?n`VFPjqrRrF!#%t(G)D1Lrjj_+M2!K_&n_jy?O#yLqIl4i0 z12xppUH~STZc;arqK64>r_*8<0(EFfAKu z=#)(+Vk5IKHA@|$@A!vSxHi!@t&xRoAj8I0WV|E0UBW6? zRNF6WjA|m{h)u0b)4`DKYMu<3-+|nw&Lbij`t49F8N2LcJJlAZt%in9+9xvuow6@9 zsel|!g z0YuDNG_#4vbZH>REEaxxleW6FCu8_ej}n7 zh$vn|Cs+~1Y$Jm1u_B5irXlo%6;a$XwV(?Q7+Vx;4u~!2j%*{MIF>EZfnKp9iVlZG z1RZu*Y8hX5<14q%Azx#}*M3wZ(HO{Dlst^srv@P6RYKE}y;e>wD< zZaRPb;TzyDmwf3NDj+5oblx581c045!%vFZoZuPT!x&%tLyeL+vZ>mzH`O6gQ;%MD zK=ow;>TBqbKX|Oid##kSktJ#<4jCCOhF}D{wuRYo2iS`7QgP)UD)-Ot!qSw-2jTm^ z=hE~YYlBsQ4YV>~>xnt_BkU#J@}SE!W;CG|>?VwWG%yRyrURL0vq5Bp@Sr*%gVg5_ zsvd{TXhR}W@Sy63h<&fmA+;66QEt*9bxLF!+A~|puf>{!C6BatIG3#^WUD8_vhedS zWWVGVho65hS>Su)26uauAA*(1Jxh z3pMXOu#AtJHA6A}xNM71Dw@@{{jfSN3olAjbU7ma^*o}60Qh}|BWeX8Uf(#P*3bj5 zejHUt4d`)9tvDuqZaSvU01`Cxf{|n&S3Pl?AFVl|_5rxkpHPDsTY?^SQq32@&yOBa z7&X&RIUJk()bdf4c~tqn<6=rF9o7hUSVIpr9hwHKZI^t-&~#~J4DGk$)*hwwUnA7N zQRBzC6C^&SDa9GSc4wRs8F$IXdhTlpog8C0$r>sHY#iz>cO5&x+>%o#R6mUKMcZGu_B5d zmyE4TYRF|<>#`bgSwzs^u7?yV5wCpm_ZfDHF#oCvk^h}SP{huBZ6K&ZE8_Sq?0xD51G00nnL11s$I7B%NzS6Y1vpq$B3~q znnLV1*3iRNL?QMYYp9)Gxi}Gyu1J$K)c6(%`<5haw@X{zZMSWcr0qHJEubmHwnoj8Yuphc0r|?U0O;{*hTPj6H^V$;fVAR-3Pga>`XnVt{qa z)FMaEij3dxJgM%Q)P(N9CwX<4@*qAXXeha6W#_~_atunc85!l>iz0(EG?DRq{gj$} znnS`-4haC6uW;AWAGwVmd0Oe*?@rk@^=Bb(FrQIpXZM2%HPlMwK})Dnyfiw4n%{&AtL26vq~pW8)&F)EzdDfi%ovn zDJ+#oRY(^gZLFayuaO?SUmMoT))q3#YaG|qMJm?RP-|4q-Jq`5WgO5o0AAp{uGU@; zj|256qs>e0sG9=D+*BKHa<|%=_t|f%Zns1R9d^seOpAe3Owv$k!7l*W zYW!I3E!Fdu9HGN!eR-vM;|+C1`qDRS54EKStV!>Ct*A~|B=2(FQX5e6g!-21bVsHF z+U1U&3JsWg7on-QiF&*|dP{YtUQG?P^*HT@>anq5Z}@E)1N8UXL^MiMh!OG^2*+~J{f5xV~rnu3;%M}LNql*zyjOikO znFhMZiYWFWs;i;hdr2*0KL`7Kl5tn8nu{eRtw~R41|U&GX>61sBXMFRy_?j6t^n}I zZ@PO&^*~~*;w2dd?b^#r#zN^bwCotvAnYbn|EzDBcj-5L{LoA zmd6r+tKFp@v||rbk3zboX^&7JvTe|ZxWLokd#W=oaApd-Ac-1MCyBZv>iQaLJ(S%K z^>93FtfBWLdVD9mi+2d_G}h2f;vt`6S`QoRhaNV5=wV~=@UHxoAwF@jf#HiRVGqrN zkGpCEq35SH?y3PYwNaWP^}aX_9ng`sh&p-)b@a-5?C8BLv5L|Z_qvJ*I!ip^+j7fB+GnwMKfF>H+L(KEDX=tajmeXkd$DrJ9<~0!X186JmgNS zxFbPeZ@#DI-p9jOO|itp9lGj)5m976kUa`|!HOsjwwFYQ8V_T`;fs^-jTd)fL#x2t z+3Yt_&eO`1`vl4CkwJeJa!R|WF5* zb#!`n?@Sg4zs1^JW)5(lkn|KVvZr^g0QTeiW?=mFh6m~rBTUrYx_fD9I->j)C_iLK zIai>UpFcO|jFhmB>tXAj>EXq^X-1jS(>9|VAdqH5O`oP2eQ!o;{9a`p;7e)`)E?r= zC)3@m1Dq;xKs@JnvqBvq+Z^f$NJlaZez7WKP!640cB=T5Ks!MR`dEAKqz>MPFM*i{ zR|pPw@aB363@K+#WXE%h?fYCD>8(+|)@O~@{Ik(0`vmJxM&$r&pJ4sTsJsmpdV<9y zGK2Px!!93#xo+C6+3c#+U{eUKE;dtih-90$GP7@6;eWRzwRwCPs%_qA>Eb=i{%yj) z-I$ArYGSXMwpN(sAvZq<%zBmY%BA-5 z{?7JVLqqrVmc;`-)?0RSdGQqWUevtS+RJ+ob$t!BYI82`<=u%oUPE&L4K>uN&AFIH zNV)s#D0a~{Swk^RE#sCLP7=fS z0eocN%ezKQL}`kC#1$*t|y!oN~fkA8`YrKO#KGSWi8^Ho*5d~FMP zJTJUQou6^JY;KQVfBFqZQtpvk(&jIr8cwb;{WUZuNBnv5QT^~R#7z1B5Qp0H2Pz*9 z$25QW;cyK5O0MBJGMoyIr*Ix|aWR`icYwXERvQq1Q+L(^qE`qsQ}RRgaDCTaP@o z#w!2KkRe&_!UmqhX13LfdBs)^ad%I~=(*838v8pWA*6Q>WV zs!l3eCilY%c=pKAkBlPR?Z=KWSnbhxLwOpy^Yo9hVW{aicR+e|wF?`Oh(sv`ovkEx|=K_2+r5zc*Is@u%(dl7r?|9K*w z^)6zwalZ^i#8~vzV-Y1S`Z_A2lttg~t6d7|#(7$z~$YMc~NPVH3MV2Tb=u6!qveZ8X zeWhDRmT4rYg>E1D!k2h6){eiHPxPL2F)PeI@4p^@c>3i?*3N4`8!(04i`vchsf z-|HEX75@;_N-v0vb)EsW)|ruiFD|H!UKja#oS+|cR^-1L2>Ma)iLCT*K|ks2$hUqF z)K;I0tkPZ3&pIdaoxy_I>6^i-;{~6I|sII!a3f6o|U^gABf=Mq5?5-=RV4Z&o?4hfwV7*2Hd+In9 zY|vd`FP)@8^t-9iOF%@){Kw^qSszQVv%-ChNo=M~sb zcUQrGKP#}mPF2A#{~~aJ9;$*Z{vmLnPUn5i_XG~o87lZ~ErEme3>EzT6M;kY0u^li zjliKgQw4wMAaIyor-DEA6*ydHso>9}1dh;qRIvRDfg^Rc3U=HoaFjl!f}Q^mI9lhZ zVArz(`HOZc*!`BkbnWp5dqxxij?n>cFy%#oV|A1_*e5~YI34W`rZy5dUdMQY{l64A zL6`9c2mT~*qAu?Z4o(v|NymDFLpKS`(3QNw;a3IzqN{p?BfUj|lXaXoI66w;6rJP^ zrpq6nS5tK(Z*c6J0;lO_-r)FZ0)N#lyupd}1y0wky}^wC6F5V+_Xa1o5jc~-vKyQ_ zQs69|>J9$7Uf^s!)Ek^}N#Gp*h;DG!1A%jOhBr7T&$GaJdWJVRuaLm`dVx2%;CX=y zbf!1B=x+iS>UG}W(nNuabe1=m*;3$Qy~i6|*-qdRo$U>->Md}oKIILr86j|)&hZA< z{UUI=zUd8am@hC>dwju7s|Bvm0bg*-4uLCmlrNZdSm19u+85k@QQ#^a;|uP*Cvdec z;|uO~V}NUPd0%kP(*oD(SYL2oX@To>C13Ess{+^Ss=naC$^tj&IA1XPQ-K?Gk}r7V zTY;N&BVX{?5P_R@Ghgt;T!CA33t#ZmZvwaK*1q7GZ344&dtdO}A%WX;cVFJfepBEco#_kS zttN1juia?XQt(L~tKDZ*d%>r4CG8egeFdM^Rkd4GO%{Ac$7wf4EfjoKCuz61 zx+VCWZlv8(>Yp4>)Op=ZyJggef-mS6+AXV61Ygvxwfk4KO>mBGuif(Mn&3;iyLMkz z`AdK=>s0MlP;UvoqK9g?qWVe%^wELFI6ntA}X}5|xCisrtquqDZ6~T9Pwsxy3Z%ObyeM-CUtGt5m z>m2QVsA2>^&^NXFv3gN3#|6iYQ~wgIoPgsdsK$c5PL$&&s$PP9PPF6JR1*bjC&qD; z)Lg-iQ^s-Ys4T&Lr@Z6VQ-=gca3A0{PMu@sgC=tS}Qo8Gt_avSGxu0chViVwK^`ifRo|4Kd7sMpK@k6?oY~B z8eGs>;J81l(t@M;gV}C-RZ;NM&N|2Ks2U1>#>sNr&gx6Sg`7Q(+f}s{T-eEW-0mtx za1s8t{HVBS!JbpJ-?G^l-6Y#tJ)hWTnoG8CLP~8w* z+==$PgO$GwxP%kqcZaG1f=fDO{O)j7LU1Xkyx(1;jy(@9?Zo=sbt=yb;4)4nzq>&d z7W}+Z)$eXnWd*I1=Log}}TrRoSS=QQ%W+tufS|Kc?ByE|2D!GCpH_}$&A zo8T9n)_!-78Y{TG)86myQ!@p>I>Uj&(Bq?iuyG;MbgWe)pWJBKYr4mfyXg zstf*yv&Zk|sK$a{ce4HNWz|veKb=#4_p0hA_+L(r-@UHV1;63k^t(6JbitJzPlS70 zEff5v6Nqr{s?CDma-t&K`|5z;%1(5I>+w3}z*U@>2-oY)FZgYzOoXew#Rb3Pl#g)z z-j@Zx>%>O50q>iFt2&h;+@Lp3@Ow_x2=_5>L&5JmaS`t0-k$}3;3P%3QQqEyKXe*J zxKDaV3jWAx7UAaiP7(aE(;~us%DYH#HK%oi8|^(RIL>Jw;XdQNEI8ij9^n@D%1K)# zI;jzE5pQETQPy&XMz}@Isa(}@(j#1Zephv!@e!^)!K->sMuhvEtyABb8sQeRxPdbx z!YyubLuXEeTf*YT&VmTnp7~W1XGw%>PyMQ?lNsTb_R3jXeder+aLZWS%vl}bK5y~o z&YB4K1&fseWviNIfON9Hf#ostvBivW4&)+#&5pD&Gzjt;;wYtKkZy}aiRk5 zzpT8g6CH5hu(+EO6L2e8+}$Y?aNo4Jr&B)QzGZQW6B}?VTinN~6mY9poa$5!xNlqB z--!#j?^ry*NeZ~{dcTmP$RMXtz^!WWV5eEYeb3?{PK$v1zQseG)&cheJN98t`+)nQ z#lxM>0rw+|M>*XC?#C97c2WXvHH*`n)PNgjak?`w;KqC3kiBS(Gc@2Pc-3FP z&e3#dLBOqR?aXj818zNwXF96_ZhebqIqL#$1B+)nn*we_i|0650k@IG^PHUlH`(hK zpBFlN0&X*l7dhDh_jB(@B46yB3b-vTUgG2g+^@YOMZVm*8E}8FIMeY&x=dl)LG+1MY@Y@Uu&J{NO!Tt8=S(C?h=bPIx&&%Qj0e`B_iErc22iAWg^|>HkY!T z@{w+)#oL_NNOy(zaCz+Sa4JQ*yKUQDPSr^FcZ+vBA4a-+Y@OeoxJY-eZM(-wigfo` z`}>_nk?wvgKj1WrbPrhhA*V&8`-jDcoz{`=L0jjT(>~HYWXE;V=^p83+d5~Q)JXTR z#b=$Nk?s+T&pGLl?oo@+I~kGgG4FdGe9m!ZM7qbln_mK7au!6or@RLRUv)Ag-3Jz5 zbJj(=9^ajpkzaSRBHc)fZ#a7*-Jq}bE68s;*^zDu^Bh3kaZW|LCCweay65CXx}_|> z?_7#>OI!TFxg6=1vDoXs66ro~o>M5F|7xV`HP0B7_TP+jU$8bEzbEMWd?ug${y@;x z7DxD_f^Jz`-}Ofa-EzLA74YXVe@xK*hqal&(azXc>7C+%HA9Vj^ag@J8 z(0#)^sZja+u|c;m`jdig6^o<&^@8r(c3e;U z8wK5WEPlqH9CY8cxRAeb(5-55VSkgL`<`uE#NRaNzV9>h660?cbU(0Tf6m_`=zeI& zSj^u#=ze77#r^Gr?#I@j68`Q%x0=Nz{i#7W&f+rup+Ps^;^+P8K{vtT7yKDP*FLRL zW&JaPZgnd!=U)(X6D|IWKQridv}^pY{&hjOhLykQ&kDLVEiUih6Lf1?|6lQE2i+u# zEBKEE-P#tv>OU29>sVaTe=g|O^_ji#Z~mO1ThGd4{WpVdeT!f7-wnDAEdIOS}&EW^ZqY?wCjFm@f-da*KKC~eA8dXbw9VbvcLTQ z$KH3xNmVRucb`5pv+T?+i-5w4f{Fr)xH~98StSbyk_F?kVSt5AZa^?A<_P92M$9>1 zuVT(uy;rX}=bUr;o~P=ZnKKK%zxVI&Wq;78s=B(mySlo%y8FybGPy|Maq(fv*k6rLELmP|IfGbw*E4vUiqyX}Smo)VvzOdg>;)8Y%0$s-k>9&b)2 zmn%FYzBHLUO5xe@!;{IQ72YF$Trzo#!gJy)lF4Hgo*O?WnLJM6J>#pA$>ZHLt|NQJ zuSzCQa1u-G8^0-;JkkBky;5!bu4M8gcOcudAigGv{dpsZNq`_xvAv!?rYKyiqA_WZ`5`k z9AB79-lRN-#G6yen-xAZzBHA*Md8EZho_RaYTpl!AD2qrrt~A?D^khZRnC#|b5hAW z++UQxJiaQGyvr321AJ8cs#NkG@FpIdi?EF@=E1wLimDskD}xYZVBNF<9&*f z|8?gPz9`%UEK0tK<8Q#1#wQdd-*&Ii z#;%A@D@wkjeYr9|wEV+UsaU+OzAhpuPRD@uJ(Ux z{3hHh)o)}>svSwf?%;|T>=yHEyqKY)=^QJtGKo6Jac*=rSyv$`v_qn-JQ)}MV#e#H zbElXuEp?Bx!1GM(&}ae5E|yXZPL2DTEWeOwhei4F1xHJ4-XoA)Vuw3dMr=5eu69RP zB&DPeoaS0eXp*pr+BvrX*_}6tj)P#_ zyUhIz$xu5b(r_ItF%K~%S6B+Zu1JR4-8=Fb*PprNNOrPQBb7&nJR)i~nQ7=1cA9fF zA-0R1?%e*w*o#qihI5C7*cdz0xsyW-zeMWX`60Heo$cJ!A%-8rbnea&+s)2#?h#@f zn<;j#bN>nRrrJH7dxsd?GTrXw+*ibYMl#dx-LV_S72$ASR507_s9*jR(8jq*VSgUPtZXaTl(rz1_TNGjk*e2(e5~H;(v(3&OLyQ)D zklo+8GeYbT+v41%#I8khm~9QFzRoRiFWUM?$wS2*VcVR0A;gy3cIVy=v7_x0=e{OJ zb2!!>;M|{K-tl&+b1B?jq`D(H(JqV5WU=gsd2dg?3M41n1EYLXKr#~Ox;Y`ssrDe} zG9k9o9*p@PVyD|fF#n02faFYjXh&hiD)Dl%T#w{zd)PWzgfC!zp3JWzIoBTk_squq zLOyole0zj*30#`UytvRF>0I{^yVx#wZVO@qkz8Vrj!G0CPqi2~o-Fh+m)WD7n?;PH zd4)a3xoTpx0(_a6bIrs!QdisKoI8}*u}H49$45nHHE!G`WVr^(_4b5yvgmTC?f4g& zUqXWKjrx0L<9;L`TXC~J$vGe4s$jR;lbzcj#BR5zIM*k{?zE>mH;5Q}cDG&O+z4Xh zklbrmx*`U>>X1ACBUa${WM(xId>N4|;_e~Hybqa6!psNk>CPQRj85qxdxmqT5#!8w z#GdKgsxa>{dzN!IgxC}IZ0GI`IiIrUIQJwmTJ|&cT<2aU#vVRv&vWiWVjP3#?FG(# zPmIgTf9!?Md3^%xMSGERB_Z~bz1X=;iE)K}#jbL0V2HhDFL7?ikQ1LOc5VW(=}6wP zmqj(7jRuTc92R)TUhdp7Vn-r*&t4HNAVaUQ$^~S(0?7wI9!+_KQf8*4_nADgH4(LHtLiUy&49dv_3G zMaHNzqUSC>k#x59p3vKB9I-XCwr67PKccmB6)|oia~NQCwf0`;=7wl@Yyauof)L%v z+WVYa5~4k=z2CW`iL%y>tz85EPxK-rn^^lm*a)rVMrLUkXCHL#KBA8!+1%QPLQd`g zin-M^?oH-@jAS!ww~elRlD&cZllcXR=(n`?;jla-{Gj}%0K4=@(%0Iuj^%^JeKdI} zqo1{pI5(Z>-bl8#_R&xzHy?q>{h5Cdk^$BZ3iH{VV(sBd=AVybTWcQ+^SLpR@3wm9S&YVA|b9Y~ZzIo#T(ojX26ce3_h&YdI7n5q@l zKI`0SqBQ+otbNY8JBZR?Mp^qj;y-PIO;LLP?ctM_A}>R3z-kF_H*YxCCXu1X6+Zw{X&#&KFHcHoh!hVX_pO< z9AfQPYxP>yI*>dZ_rt9H+PR&Gjze;Uwco5&MAWL~YRO1TUvBNUi2sPPnMYguopVQq zxyM@jy>lyxo{!{sYkvrbl?G6(!fs|h6?CGtKRUODD0O|ZwLdxcY>1v}?Jv%~Nt7|c zN^5_0?hB$kRXE++-<gXQ=wKv|So>$# zE?(RiHx{Ws1oytWa4s#Movgvq0p#li7OQvJvXu1E*XH@#?DJzZ4V_h zeqrJoZOeq_#I*`dY)f2cmosq+BtlaTPuyfz659R9#4YwLLQ|I~ZnLWiO+PMi zhrOB5o+}b}*?S1>eNN&Y`yioxRweG$+V;IF@lQ)f?Cp0`;y(K%b1UykJfQW?Ta$Ru zzD!#6!^Ry1pzBrEQFA_{M|^MTIo^#n;dwXPxb4O>lkS&-$(jvswFL=x9pH`dg_7F{ z_np?A>+YwFyRCbS&wp6|KX|UO{vhvun<&Uh=w{p}$m#MOlErq#k!d1 z6V@8vZAO&yd@5+eoh~yb-Jzq~^a)$uMO$$puYpwHLB~fmvo=0KdH4>%8{Rgj& z`0kJpebL&u?@l6m7Lu2&O@y*FuwTtAdbC%pE%4nPMCs99v$m7(9wADX^@g>DzI%Zv z=fqpq;@0IoqMUE_--yy_Vg=jyZUYc(fyHpW9|HK_QL+VA^xbVlIWvE;b|c?CM3kZaZ`Stk-M_=!KdkNPyLX6w zhU716OZ~{Hqb%VOFI9+_0ff;n_`nH=Zax zTqn==_TB7|8Si)X@m(#^MkGa^-7MM!bsx(^?#`aw+;^vi++94oh3_s2bGv%BukUUO zbGv(XOW)m3^a&&zd3LL)=v;uJ3jR10)6=v4eD@Pk#w#0pw!beITP}$kS670>?}=oA z7f;3Jdwt^ZM76vS5ic-_8o3^gcPdEKdK17DFDyx96iW6$%tQ$@C}D3T&0c)N9{uCR ziA8cL94|46#ag~gL84xv4N{2)g}Rm`8dXxa9*HJ}y7$5U7m~VMi)0xz?RqZt`rD0M zCpnX}J)9|RmEyLiD=2MKu+*hW+x5nTM8RIJN9h526TXRq++Qfy4Z>E|OH8mm z@A6h8wzDcXQEpACHZ_s91*M0G+{9p;Dm_%e?QKcvVP0Z8jQG5;!_6y+Og9 z?cCBE72L(nE4@j}INB~Py;Z?6_VCi%q{oS|_PEm96&z=eFTF#- z@%Dt$I~Cm3o@iVOE$^}+l4HEYAlvh3uPm{ZEj?VN^@mQ5P;dZrqL++`t)YnJ+V*X1 zk3f9`p@*YX?zXnSakUV+@oKN6z_+Exdv^mXh(p>b-WvoH08jHQuHy>|0G{n_N3avX z^Spft76QD;JAxoS3Q&5fcLl+eg_%7F0VjI}@5D}m^fwYGcwBl4-ZF_36?z+A`tc!n zR(b^=##Vsm-H_*flQ>m+Q}6+J3L)_-ypx zUWtE;4R;#SC-EPJhGLW_L5Q1*#Gi}g8L!j8*wfyGPQ4Qk$$J!dgEsN7O4z(0a4DU( zC`mk`w7xwOkBZ53+Ok*RCOU1^C-Io(_UoH?Tx;szKkF~^>tTtf6xwE_ zasOr$UPJPcm-waYhn{sN*a>a=5${G6CQafKg;E8okiw#pgc@{V zagW5OQhj0PUWv~XD(RE>T%j&~6JIE_LI1>;3UwWr_)4K}Wr?q4=nA_JOMIiyh9eW- zDzwprgud`m*kf8kU-2mHF*os@=JuSI_&$IZCVo(PrOk;S1E?+WlPIci_Gkm-tB(*3eu$z2@LBiuV=!Q*^j(Z ztJi;@c&0RXv*S~*pfq@y<1??MGNwmWfL2~TvG~mg_A7`!IIMA5bRdk*`18nL=xTLZ%dTg4SuGJ zJD1e%wr}YMO6?9O+cgA7ly(cjk)_=g+|Z6K-7o|vlx`G)lS_Mq;Iz`7AvmkFRIVix z8^H^29D?&od$}uEaSwRmO_bWxt|;9!1kWkeS2Yr)c2#K~cQbi6wpW#ICTne?m%Sx) zk(=0Cu@Z2VPHbv#Gu;@HNZ9K|;F#&g?T^p_XG3Fr`0GK4?(#H}9i8psdJcEPY$9AB zJ7Iy`R(fI!u|N(|Fo^|nI|Wl%Aj_o9wg?Mkx!Z=XOcc95r9&0$jGM1vZa-2>T$yoY zfc)V|hPY&LYzJ48?3750EPQ-2F<7CLpV(f6CW{J;W82(9mfIi6e3!g5mT^6j7Y3h< zx)@=F7F&g|Lf)lGUQ%M*d0_5xIg*1M;_jXYy1DjSFIf1$hha8p4}O4QHY@m}mnz*~ z!JlBGE&8s>&#=)}1%HQ)w&|NVe|r5(+ZFuFD=S^1@1Gbqtn>f{ts7aoR6);8C|#y6 z|2Q`d_g{GZ!mmJbI20K>%=Jli)xM;WN^9 z5t=&;^e)FEIoa6}elMY&PTGY?PIY#2G^UeaHJjl6myC}hS?TO<>t>`t<31oG!_(89 zt?=FVM7f1N)7eSBb3=hLem>jTU3|9zQJ%q`>+A&Ve~4~_s%Y(t9qidS&c zJC)pfBDuubDSqyfHn&9zF2t9T@kk_>IlFt5k!Bw7TtFTkdR^h{MBiOY^mZhxogE); zJ|YJRB-c8->stAGO`=CUKai8Rg*P}m)_49epbX~kbas^Qx)R+4$=%M5_KTzj zy@lVFIlP*<*V&Q28$onDk~Iz=t?sCr3^H!X9X_hxkvrQDDPr6?Kf61Ku0iscvvZ;&p9}j1;usnCKDoI`c*5bM*zP-`9R8>9LZ0uu z;XqSJo^f_is5Ti~irB=sEy%Dfl4qUW&X3%$2l-=|&yGFsY?<$75ZwpKf1E8}tDmyb z);;Y(WIP(li_WH_CLopTY0t&vxf;n!&JK2`3-q~ zL-LxlJD|H#T=kUN5m_4|dBfQuL2+q|W^co6mVC?Ep}xH2vZ?XSLloZI0+H^=hZmzK4K?d_Sq8r8 ziUqdZ5lygn0y5jVt?bM(K>NieBkdob%`~weQZvBY2}dkj+Zi@(25bq~ZEa_HhvGzj zw%3a6g&_GL*|LCQwu$+v9YjfNPH`VF=!_-Jh|e0B_&^%}Rwe38eay7z8>Ib9v$yDFBM97E^wQ&UKw=m@uLz;iD+8$S#;~z{S)y;R)xOzJ zw6@7rA++h$0VJ*O610B0cQ6cLme(36Y=e&UKy6(+(gWpn%hC@MIfn$=>7Gw_t!sje z4YL_iv1@%i$k-^GLDQTiT9u~u=$P>`N^mH9W;3L2*ZOvlQJT#VQM7V1aN`tGJBP*- z8qL67orSj5B%y65k6FX;Fq>_HRSfLSzWG@c&MEz~3__o@Q`&%GJL7u~FlijVbpxOJ z@BOZf+y1_(PjDE@H$$2F1Pi4%zs5IB33`|G7AW7WVBbPK}gvpjRSyhXTK7 zIQPcAJB2_Y0Jfud5&+L>P1zQck=i*e_z1U^?(|1@I*DPI52*0~vOxLP2M`p7Z6=X{ zoh%=?TL_Al`i8EhY|AfwN^SK`A1%Kvr1nv%gN757^4sm0WhmQ;;Qk|_r1G78ct_Ti zPS<<5<`mTp9^r@J_Rwu#k&xb@XO=n?Y7TgZLCpa;{Q4}oi7DH$pLj7tTq70-JMp$GbrMD_pzd~imSOVt&Rk>}7^J7%;fLVv zmxRTJ-RYZ=-hVwAu5Hk5gqU{PR(3|trF<&s8$a=h7*&ioR?%S2Yowrr<+JiV7Y~sxXGduN#di9HFv> zX21iW?jU6qe-8MNt?gXe)eH;%={l3)YR&Kse0x}d*pn>P94fQp=k~LBmS%S9>KANd zbNA(u;9Hn}h5R7Q{0pF8Fb3Zm;}<-uF=-EA#Y~Lb1nG!vyZc5z-o$lovU~_-(1wI4 ztYRbI=!cvtU?c$q8wns7Ljb`Rc9-*r3XJqrIl`%cB?L6sn(~>lq0gXdJEz?@6Xe8W zXFD79PLO&BZ;BQTeHaX8l84DUyFc(8wVkvzId6 z<4B}fAcnnw)Xt&IK-5-tmdKhTvgV4cJw?`DB5QAvwU5Z!S7hxcvdV^6%1W@rH+pWY zjb1E`F0Z^RB$v;-I|PSTIn(6H{Hwml$6+}?tdOqxhi~*iJY5SX7l0WkGyvz{n*|p@ zxdCIM z%g*8>AS9m!-dlJ^?lJ+w`X6!|Yt>0Sk`q&+WPfD|=A|hcwFY^1&H+A-4!Nk89|}th zz{B8Q|MbMa9*!?;2;n364G4dVQqxD`izkdHCmQMH_&Nm4DDkXESxf;dhY#ta@!bd^ z{TPc0q0x5wSc_p&SX|y{S$<-!U@NnDK#A z1dYDNlk*JmMpCBEGufGf(Nn@*G>{hJ^on(ovE+ZySgSi(dZ z#NnNA4-p+_=pZ-Hll~VxyZs%{9x8`%)MQ=YJ9Q3QFyNO7c%zy|u@bBNY;Wa2GpZBR zw7cx7rjpc(H*huqY1)7^(&>TECLL<`R`xXmUIu*zWZ3b#@0v*%D~RsI`om~vg(D=T zP+1={fa}C;*31Rw6NuOYi-0U8N=hJNoh;>)cTSXdZay!qU{B50YEjN#nK}awYjkfv zwQJ;zVw*mGYBxE6$tGs_X1-n4alt9O#~v*X??~TltmbmQ2Q%7O&FBIzouyysZJmWL z^1dQ0@!rMW*M!B4R(ap}W)qQ z48FsdnBJJ8LNR4~J%K>o&ROQ0jpU%P{4~z0jb!eZpN=mw0W7oX4BOy^@R=5>*+~3A z`C0ge6TqUHvpK_5&dzS-8hqhNfThpDH@_G?noggKZ$B}m@|nu?dHDJhqleQ&&$rI> zlKav01^6nIko`h@7fJ|U#3>nwxfoxJ62hxEZ3FtHbW$pkQ?*pORq)>zd7Pq{enHGGVY;xI0S6#I znNMd>Ez`3mJHPyueHhYl&el?nR38vIt21bgqT);D3+IBcM$YamgJdlXg#?jgL{wdt zQ$#Hi{>52-J>B85!1%JBS^y%f4Z_;^H>^zot0`;#7CzC=InXzYVw|Yum(i*h#c2HH z_z82uV%1mBsss2+9OeOLC||ysmcJ+_R(%z%TIIm1S9q{$#fDxDi>;4ID0B_Jg~v3B z(Db#mz?K+iY5F>RC68%T`t|ru9@DHaey2Fge;chj;JMxIh=50V?!fo*gz%mCVxCa` zU3ecP0vMAjai}k~=4+HOai@lkTo9sP!AV_NY5o!8Xe8Z5rSoEn& zW$OmaeJqyR%3E2cYvsRCpiS1VFJl{#{4yoT^lL99_xGsfpH`x&`>cdY_eQ4Qk}S{t z%Ckm!9*FQ9Aak5@9#o!(geP2zhrI>|6o1(pFdF_~DW;KF@^qOk;o0L7*dk9*meIh7 zaF!fME0lSbJ&qhjgFQ$r^d@ZuH{3vUNZ|N5dwX(|Oj`y?c zjoz4Svz4FPo^wk+9Z`H9dZcR(X-2&J4*mS1(l9nJeHa|Q5u2AjK>)FN>5~J%Ife{l z7_V>J-#4$yV#EE~tFi={Z3p<~K8e#vypNvC41&oAG^|7Sbz&O_Z9|CjbSk zzIi~(R$zh!&>$Rh3tz={zIjl}aswFTVj`^3vY28@Gi68Pl8Wx+Am7}qi{zvD;w!-7 zP9DP-Uxo1F_~NU8XDEKq)ZD7e*^`X3Z<94L{S>|r%iOLp^wYT10-c&oKSL)F!1%Gs zEc`6KCo7=Kl68#j2^E-!9j8lyE?WEPqV*mWd#uH~D8@YJV*Q@8Ux0w^$4~N@i7)pz zyO^Y;-I4Zx-uC9>KXw2gFWA9+yl5-<_^;g+4>`&^&dR)fyc19Eb7y(|{%z$fPmS_; z7?Z3`G&`Ex%07C|bV8UhUBbj{c7HQ~#|0-MdtK)RG96Ds=AN8g!ZDrDEPrLUGjIoh zwWtTT1p`mE2T4H3&i8vsy4>$&%P#lBD~ISqzgI2$-0w9joqoekXaC;RzQ3(~e@A-T z|6T3-d#Z`|?cSjZPO(K)I#kf_bsJH^TdD#Hdrw7UaWkQFYXuQbKr?Wq)uUUwIz$rU z;L1+3w@Tb~uy5wXWhKH}jD*FcKIEzt&_Cj;G$$^r(#Kqt=EP-H`UKyZ2AGqy{8L6+ zbL1c;{TU;zJw;~vb4FTw#d+nF{(_O#-oiihOPJ<9aap&%!q=^Z>|Zm|3W|QiHB8yl z-_kS#`ge@90{DBbLjn8)qp<+~5ntODz+74Ol7?|*QHU$ci}6?WMC^1c(b08rE(!&? z4b&O>t)|b%*V;kN%tcmb{%@Gh(g_1e{eIR3;1^vae$qu^z|=kX0lmP;s$wg@7Eg^p z40~z%c*ae*c7WTb+dfA)!$?ex8b&F+v%#x@%DGn7i1XAYLTAk7;e3$PH8XCz09X*X z1six+HL7zfuY$K{=yp0q1XJhWK>CGNEbb!73IZ?A2C4I6P_yA1sp8dFX@f3d5nZpi zjSF&Dceu|jAGf1c7Kl}c&KkG|ufj@F^Yw$B}v&bgGASOX&lAY*}xTcInjt z6~=As&Fq`RQnM`1gjKH$aBe|{n7rORkaTN=gyMrx{I+$7ynP)a&5qmKs)W2VAX{Vl zQZxE#*SS#R5{X*$zJJHd?LHkj%kB^xv2zad%@d*kJpg?|6t=US^)cxbG6>xdAcP+Z z;r-T6!hBP9Cw_K|x=;oB=DRE+!3IG>BAEeZ;DeSo zqjnA}MmV6=&C=?ov%0Np6{{P|&&Z z?0rXAtnL;MuK7~cz^&f*zPViJ>D#;?vheMk{7RP%&m-Z$p_WJO?P7SxATTZ{zk{_r zptaoT{YY49xr?)Nw59_G-STF(O>F7Mt__(9emzz=!Y1iU4u zdFh8eYy;jFnFIFS7jGJ&#~Qc|f5F)=L}1vS;keBIr2Ztdwm>`4jB#O4;U=Kk5BKSo-*s z_iG5JpZ1(@P8a@>|FXA2Li!o+H{YD4=h^@Ae$T?sdVgf$=e$2dShus!W=D6xf%{?4 z08~Qw;MR^uxTHVdfesIEcHGAfNyr8<>vd&YsC&b*f7@Zwuj74lt29cz>aEf*c-2os zdir@TF}DkkDf^GTOjfTGu(Yc>{!MkfE5*|Pp{smf_HOAHILsd?{36ZiL+$&2y}z>X zOAH)7k{w?9Wp4&ywwSv;<*vZD;VMn`IWNe}G+%I^v#xg*_*%n@%Jb#l@W}rBzoIX> zS!ImHE&EGZl571KG%k=Ylct*`zV1ZQD-qIQ9NZ4}%`2QeJh**@D|m0jXRpv6`oIES zXI7sbeDj)6hJ*mLArw=F-%dw#ZRecmo1#K;m%l=N78O!f`c;}yiO|!pd6)R6b0Gz# z-{g=4@LSYv0Ke^x2w}PTcnvS;<8Q;lLhLamav%A+{Ws=r`gIRc{eVJF)btyk7c*NI zGUhOY`3}|__7U)yF@^B9mGU~)JD$9c^{yu`WWDFPd6+@(d-6)w2VQqzYOk+BJ^BWV zDD_QID))rm${xDed@DjKF$1oxGUjcNz)->vpj&2O^GFC$a$$+J~Uc4lh2iyo?^|rzRHf zup>@Mn3%GU@Ka12o0ELAPa(fgZUWx;2Po0PN1lrTmYM&t=ZA3m6E7As`w9C1UZZ`C zT69}1k(LHod~xm*X%fOyv+Xe7Tp;(+Tw*WKTkzq8rSjOQ*bjVXGU-kfhtnwY@E3Q+aSC#i)`?O>Vl zC;MiBcK1^+9s^8`h`D@bAEdb~D#WbZN6h6jHJ8uTT)t3q`BKg0D>awFyy^YiR-m9+ zTL<+Z$jpBg@jUps|W;70ag;s%Zqgi~FDf`ks2^n_IDLARsDfu%y z+$0??|HVrXmT~{pd!0P8+WqDgkWR7b-@Q&T)1p)L53ew0T9tl;!*t$XWKQD3hiL6ZD*k01kQ+;!=)CCWYb{?z)!@HAj^-Scj z!lHghI-WyeIKQ*6NU0URS+2cU?oevE_U_?o;Q12^!vr1cb5?i)PT9!W9-H+Hv=u-Np4yAv#Bc=3dzPVOM?G%>2wy}hLh6)IlSOS@1Mxlv$WupF3jdq zv@)eK{^}@0P9`YBlpXG!gV|{3oZ*|7wTt+28-UWqv)M%@m!IRh5*AB7*L5Q--93+8 z58(6Jb>&H4;JU}m8-?;N$%WMIYogoqMO4Y_Y7`ecXya9pDc{d!2CYS6Qvy;G6bhN+4GUHr)2n02HpL34=3_gQ z2(q!Gcmo7Iv#yUkq_e+JOB~ZbgV8XC>h9y@1@g0i~aYoSby9o*ot((2DFcve;3;&Jw@-o_NFiB?%DQKNWTIUEU?1LHpq_d5(4avp&X82g&e%X<@(>ULrQJ`GZxY-7u z=;%r)LL0uTZy$dy0UMvjl4CmGZ7t_}+V@9JDBEdi7%a+}*c23UH3yW4`WXyp#qH%q^hTKOd< z9_22#Wh{j6c3Z{FufjiQYeJNQOWU{cX#-#~z3y@SW9HA4OqYMqyZn`!h(@LFbpx{W zN8EnC`9t|1b%99@lidb{{DTmF5@>FaSO0U3h z8To|K5I_A-w>MrtmKPY!q!a7$1yW|iqFBE*?o7b_9&i`)@sPWkkNe%Nd_3s>$;W-} zF+BP|?4HNN40s*sC8Fn%id;&>l^hQAYvf%f!?L{@(5bj`5-jaM*gnVCs z?@A!S)np?+z9dNiYEAGi70i@L_!?0L6Znk>4R{A7C@5;ao`3` z!5NYA?M{dat3XJ(OiGv?f3%x)oP66%^;0ADtZzto-AM6f;3M8ivMyD%K{JQ@i}^Uh zZ{y=g|4=@b`^VwY|0w@+K92T(4~*TPv()#=xKgxtbQ1beb#T4*=D+*8l~Qc8WG*7x4GKuC3Ea--=t(*Cg8i80LmPD z#?2;K=GDLGZBjblp5?qs$?%A`DbZ>29KB6vVNXBLDNw9a&Nb?H zHcI9E&OU4Tooms-(C?H){0`3T0>7gkXHXNqVg)q03e*Bw{{n||1KCLk4$SFe#O>UO zjHuhW$-4=oW#^pZo1J9FO~Cg_0Th+IK)17#OxyAo>2^lQbT0od-OdQ5zeM$nkf~e# zGTlx9ze2ZDq5Q8pIGzgOm$yaWcq*i_^lNlHW8{lG(yzNgF*9E2_|TSbb}bSo^p@K$ zE@P~}4 zC#b{v$fdJw`PdC6EY9l_#@Z7V{*+EFs0p_$0R)$({i%TKRA@*%{U%-7TxqR(qMKzL zM$(lqfTE|mg(NzskVw~as|;k|qHY5c7>5Q3EZTd2gMB74lkbl;lnx$ejUV zhR^Wr*K+))YcqQl`84JDySz@AyLQgGxco@TVSR;64;)ZodQ^zL?`)@IdQ`~t7=+QU z5Nn@er`?TO)^REeUvy6(_VN}v;k`y4vu>5g^nc>9`(sET;vat}qU>I8p0w;d-%QuZ zi?783D3?^lml;_81;d8vI+4HRM4qk_`72uLbZKk(*R<3C{>JSDzB33KqXarxJNJbLuP@cWRnL z!qyLhW_OkL4nk{p&FXbmX{#x_-JaV6Au^(p2mU9OJh)Dk41CC2 zEFIul-tT8!#(&Xe{8w4ValX%G9G?K;GQO3aE6ezAx{Q}S?CB2r0^gh>t;N0@3*{++ zG0wtLd5U)QcZY>Gq|d-odx|RN4~NB8;q;#l3+f7W)_-yPps?9yuHR*>j2878ywJ0! z-(_3}+O~W7<|=6h2Jk8!KuqqdMB<=*2ys#k+BamYfOEP=ax37n0%#s~%_5|tDhr`q zK`vZa0KtV_Cj-aVbpqNL7ea750WA|krtB$iuDnNap>MiKHzu6oJAh&?r}}W|UBnj4 zSNKC?W&@f1-;4=2oCl%MX8@Jv_bIm6#E23R7@GyMwEh370ECe=;o zaPO-;xc6@I-c$N)A1&Na;d6Yr^wMIw^opHgrbjW|c*TeiN}ub)&2J3&+pen#;Wjpn|OrxsHHLAK)qpB-3s=89*s9hzB zTCGvkRT@QItx?o98bw_z;gdv8PkX!vlgKIFZuSpDCd@o81j3Xu`ZuQ3!W(nkcY{nB~8DL*?gQ2A+AFh8t?*dDCNZ6$p z&u9IGu3ouKDmJc5WT{QQ;S0@@e|K%h0oJXyH`J?u`NAX2=zrAYzc+L9HzhU2g1L&I9?fb7=|LfN+ zDE<#`*bCnT_0Ny(v7cK1q3`W~z6W}q{DwV$z5dkWJ>%bVwDfXIk6pwrg#v*{;61wW)qdX1nV4y82pRm4ZT& zsj985tZAxmZ)h~_jjeSH8Z)(hY8FiSG1zjA(iV@(9lEH!nFZFz(!OJi$W zOI3~`MAyXvN!pB%DYG=kR$sLM4Qv#S0M2F3oI2A;YgrzM=4gK^>l!Q3!6*`DH!ss1 zc`C6sGry|6zOAylsD+xz3o7x*|TPxe@7A$Pbv?xy= zDZ<*4sajlF)mFKrs=hrCmq*I6V%RGis~VIkMDns>@-RF$Nlhd)I;C*!q3r(Xn$5e~4=cH_J!z>oIJW7r+)7)Au`2_OFwIR7SkDRFw z=`c%~!t5YQb8hCqysYL-OIv$Oww?gZXQ^A#lr7&(B$r*+(A?6rL^T({k<7;Vb&Yjx zL2iKLvg@lFs%xvHVG2gFnhvOL(i}pOjAqRB+F&r@+yu$X&RPO;3Fk5=w=^A~<04Ql z11?tT!ZVLpS-mV*88ZVs%CxkyKC>iHd_z@$P3~+bPuAQES4(?Ql_S@E-=3=7GYp3bNZ1c zcCZ-ILZ6}aLWnoTF(PE(I*R}+KUlk&?9DA0MV{FmYzGY#QRGFLQ$Pgrw z-E@HTmgbyYHGl-Y5hyPsHw)ID0j)Jv^_g5akwbG5NDGZWfFqgf7>1})=mxTl?2r*O zcrEI>3xsNqvgfJ16$@H@W@$Duh~N>4!9rdGN2RMsxU>spZN`Xhf}%o+Ft$~-wd)YK z3fM8L4Q-ME(`=$SmbSWvOjCQCsc#D0OF)QlG_}DgU|DVvran2&Y(_`s#-`f9=-Pxw z@ElWnbFf$w$dO^3mDRAd8nwtAn$NG|N(( zscv7uIt0j)=V!3F;-(TgA)L*u3*$m$hHxaajfJ@U$UIjVJD`@(Z>&YhGIG<1ttbK} z@MMu}HsZ6o24)G6B{xwZH%cUzsb!fglFM$*$fD9J*&(9Y;SokB&Ap_xPCU*T=6pa+~RV?QqI^a zB6->2mQh87%S;|iTT4(qx3rP^+ZZ-fwFj927BIBql%cw*rA^rDn-^9!)?&{Ny=nPq zcCJKqbtM;pyfRdEv{-~Eub{38S?OTQQF4s+O$+j*=X!(|1(`YShSq#;wk2Cbkf{WC zy4uRg(@gM;5T{I=sZ;7)Zawkne(Htd@Q5<8yl5>nC(3=O(NC{mKrGS8uEIEeKcIkW!Dg<);AlHgC0(oSdk_7DG@l=3fvW7X?c^hQu;Yt+A6B(Xf1q^wo zS0PPKucAm!LUtjN>a$pmAw1q<@x0?LA%tN}6p54#dX?9uY)~RKX0cqUdO7)`M1dk1 zdYq-@qDNcgT4^T=Fdm3O(lU!JZsu{z>|N8)VdJigQ;91aYa}ndcjmF9B3`%jG8fH)Si_y zC+;<_a@L;H##L4tSbEK3X%7Kb60LN|_EIf^jhZFMf>vun_<*|FOl56VTa_v?hw&N( z%VcGJ9WE;>Lrm*$uBzQ3cmE}uUs+GVD8VwK)ArU(ExM1Y#!s9)&Pb9QdL8E6;75=6 z#6qHk2wQmOM@cgMvS)rmY01pbv~c6AGO}ny0=mSjy^ukJ;Osh;4GV*O`W>)D%I6O3 zlqHAfm~ec==7h&b0j$SIQ6yRdfw;~nlmZyZ!pV{p3Qv{-B$%g>lckVLPVb{gPMAc* zdU`^J9GcI;0T8NIW(W;fDCWsT15(Z0zASL zoPvlDg>#taVd841p*a8xJKY=fT9`PlW0bEQ=%xHTCP-pMN5*DD;;1_1`eCb$_|{O68HyM0!K>)8x-YKM6+?G zyP&ZlgR4)zlYq0uFkWeIFqr7A!R>sj$?Oj&hm&@kC!!6T3o?7)=Bo*>ZlL+5@j!WS@n|)| zs-UFvTbde-Ky7vP^=z$B@QmWR3*n^}XAHRvR{9nUr=Aq+xvv}=hxF>!18{Sx849Dh zaQ|`;&Z|&aClwK#PG%p@2T9uV+Y>X9ydyeb5qV7&r&#S~N7vnS-!K zWtv4hGG7G}Gn)y&R;5?rEg8Ho2H#3njsFD_i@~&35&@xLhFE+`7G@Br*VeV*N~Kb4fTNfXh^f@pEiv=!mS$?jM$k{rV>GEI`>b!$T0j>k z4g(PLf^F!P&91XY!y1AR9-4tC!i-qZ)KZJJB{;SwPqsiqrlFeqnlP3L@R{0;0Gm?P z+zgk^Q)@Ooc(9&uS>Y`QZ}OlAtqYmuAx*1TSl4V+9_J2a;Z1<{W=d0l^0dPM(EC zd$51OgU(P6vG4*NUJ9h5RW!T^;2PXE(imE5<{P=$qo-6zT3M^GUQ3bz`w-sNu}pS_ z!r1DF&Yq^v$x{P-G?&c9W^(Z4r2+<1d@TyqR3X^rEdy1A#xztlRxQ8~)wPN@H?v36 zKIs54Y@$ z;u@Op_7WCZ?1ND*yZ9(7iw?;0WYT&-T^nWybjg?Lu<~QI6)-Qeu68L$6VVW?OdxQ! zC={%$LY+~wtOkM27=7%nk16_?s3zLBu&$L0H9Ny6{!3BPF=KH9r~OnA79>uC;f$V) z*Da}ChGnC!##BxnJqevOe zt1CR>o5rR_WF6Mx$)@dynyk1w6X{Gfm9?ZyWw48>gYMU&nfkUWagaF(<-|h-<$z*G(N?83NhqnH^hd#knf4Y0Ep;`D>LR5u zUjYCV28%dTs%;AVJGVmOx`U~t2yBMlud=PFl9@^b0-CO*IFUhY&oxy7bTkgH7T1nK z6&xp#&w&zP>UhX*4Okd&>A4Z}IK?~SY;09aOVu(&c(SVyB!FcsDswCpkdMJ0u*Mm_ z%2-w1%C{K_wq)uFa?f0Y*bFa$5|p_sP*!<@g-y~;He*xFR2JZ?EI7zTIldFKkk>lZ z^Mjow5P2b-gqo&?W?aMbjRTOYVMKTV8_m*xQiiXhu9cY;zz~$Vd~cfqp)*F_dBP+E zE5F1F=u$1SQA4B*eR-simS~69z&q#Mut_uz@#rw^B_yKha0IM3q)62&Tl>I1@xOA3 zI}CYqrPW)iT{;gx~`Sc>&(iujy$}Q_cKHcN&imy3g_#hKb{?$q(J;s&n^ zXR$DU%GjwCiHA@SNMpfcJdKA?Fy`4MI}0i=_7A$2BScV0=!oFp(}S!iqPcA?^);r3 zslIffXKr}60Wan)2uO12ip9D~^aT&vityOrjfRG**2R1Vd|dZ%aE&qI(#U6CMsSFN zEQNwhOaZ7%O+w~s4bJW8;`z3_+CTG&;fe4n#85DTY0$+yx^6zPRbyBt7n6LF&L`=} z=R5<-2l_^bU=WMyEknQ_#F0=a2)Y$xRL8~zkGjSh$|t{^IkM6G%nf`n7umo`5XRyv zok7$jJP=0^a; zzov5XWVTCFw76y=Z@^R>y^JzN8B_M;2^njxXQYiSk=Xn6oh;s=x2dy*Ourb=7Onn2a8UqOD(0Cx6 z5lgn?YBn422HTHma&jead#c|?_^^MwtN?IH;!(lL50_zg8~A_NV++Dt9Dq00$^&r| zHuq3hz|eT0tWVTEqhQ2&ZSa44=s~XxcmRhCh_SHA3y*^78^r-4@YJFlbqb69+$t zL<7f>^BQtREF4g66Lv>rMl*wHLJSsD$6cvpNvG9YF;AwL^okf90?ZCEhw@UxQ3Hg| zqNwZ*YuZpyBtxren<7^h_mGYX1Z>E(EIl5gqVEvLoxDFrd377&eCvTZ$VIKO0wGs~NB#f&)DJvH}GdS3kM5*ASJrWIO7FPhG zj00OSD>67Z;BH|y_9~Mh2-`J`R!fE(>qs$0|E*eik(kpC9b_;ai$&D@P$*%p+iK%x7QBd@Zi0d)!M^s^`>lOGl-HgTG3G zjTwvz22=(C$LH`p;>Q~^nOf{JkcW=|bHNmAk+p$G3gA-$ag;#Fi0tw4}~ zqle~p?s9R-hWbz$h?wsRa4Bo#jym{EEHJ(*jlMNjnWa@&0AY}k5xlkG()s>DK@C6oy)dvRhS>aK&OSE6KLW>+-kyN5F+rL z3-c9WDwmb4qXJ1=LAeT1IBH#7ZWgCSwy0<-&JOFdivw3us(=%e&+0|x_@6czJTrVA zXt2#!c~HzAvXTOrAxpiSw6H~-^m+<}Z95inGjEXj4@yj@`cL96Z(O8R)Ox|Fc?M(S6AO&o52FUgpQF%|9yhJ za2?|jOy5SXy-2ynAhZeg;!TU`R}Nr;NhphYy#A9D&3m@L2&<+Pq(=Us?Nq^P3#j_j^w99l0G++;$VeHZpyKyQ}umV4*F${G6_$&W525v?bmy9m%F}k?VsN()( zi{~wmo#LPBj`3WfE$%<6xR2zOj4I|Y4f3}j=Hfs9o?|k)7&$%07LQ!+PVu})ihGE# z0{m*SIh^_U`yj85(Z&5o7nhAH9>$syC&f<=YkS%j4;xinCi!`F;-^5&(;^AK2|`(@ z6Kz7vSgn7GJJoYTEnAO1AcyVjL4NY$uR5rIx##9tvrtrT)II;UWukgRAE>uXs5UbaS$73|@A9dA#n_;2&<=YX zKPh&y_WDsvO+uf@4f>9jb9{dfWK0H}8()<{0Xo75N6PB>Qa8i!^QQd!(npfDjjV3Q z7EjC5&FS8{#%)ybG}e7oAghUkvbL;Ui`UpZVJF1bEo=??LpyjOkoOGWoIL0tG+OV0 zP#Mx8>Y@O@lgGaom_*wEedcuGJ={?lBf&m4C|gN=M$4)V=e2z|jD~0_7!5Xn`aCX> zF_k|hxVDUr^WgT_x>YcbzrXTAAZrcab;`;c8*lZxM2Y=#Z1K10-;Hr|Ue}&<>k>4o zxS3^OkQMp}_WibicI)5i^6UKh()KsH z{2J}6g*;z=z7oIR^LKqeJWt+X>+1Tr;=`@W{LL&s+=`CtgL?Mo{9Jp?I{J*6ew}%71+k-xKSf@JJ+q88J->Bkw>N`scSQ+%0lZ86R zqVZTwu-rQvuA#aX3EK?ismIb`ay+tx-#$e9$1?{LHe`JuKv-1N(GnaVux`6MgfG<0@81RI1 z>-Kz|LSbee_&*NH@|Wv#;}OwC{@CulPM@05%JTQMb7lXwuhZ7KZlmZ({O^-Ofmt~iZ<`27cJL8jQlU|_K+)o znZCOEX*w@sFS_Hzvb~1hQ`cwc7Qepy&h*=an7QrvK5cglIrXynk6)b_Jo_ync51q~ zbmZ*zS(o0JF1UHq5eEoy^aY3?1M zd2!QDB)Y`s)#LyArtjs|Paat^_U=Ot7S2&0uRdf>!~V}UZ+83G;7m;AZDHnve=!O^keg3V&3Zj~Joi^oUAy2Ka7V&1Z@vF_K$HeDI(RTtX| z)Z(^SkNCy068HL{Z85i7tn2ki<8I1Dv2Jmtmb! zBi3tywrEnUd;FacYE=sGpl8**ZkVqGyF1h=0= ztXm$|HGV0YG9tFAPPZC|=Xj1Dci9v8b#Jt*q>cdaOth zP*G8jg_nvD&B_a!nNJy!S&tbemX)Cul_i>$rJ|LVPf=N!nPQn*zQ46+jqaA7&-;Hr zpLagunfcC|wfA0o?X@p6=M3thMFX;b>^^U<6%)~(jHUV&SgFeIw>l#8R8_@xz-N0i z?W&XiXBqoF_5S$=G0$e%1wJd(UTcLMwjv`oBQt(geSd-46H3GTJc_vveA!%duP z)gjbnyshS!CrJ4`1sDt_-6pjLs5Op9#J5hq` zK?*Mow$+$iI93AuBgblo=9B~0%d#Wp(YYCL#~523gEBANprzf@x&UQG&9$`uWrgBh z;c8!0jTIi@-HcoY;44L8(N=`oFz#Sjh?St~(0ZxNXXmI##=&>g;TW`NxJay;Jt4=< z2a4Go1%HA6%^2rXM`OsTygOhszm*8n;n4WMgMAG|b0FG4A>dfdK?u^-*I4lt_{dci z<9rAN>M!U?LT=mG55SU;2w=CDv+Gx7;|dUa%369GtWG&rJQ{i>Y>;V1-D;2m?plgqNTwd(Ar=e9m2x1Z1vo|xwfkH;J+>Rdb)*@ z^eRsSM02gEax1}$W(XUpPww>$2!%hcf-y8lM`0@ZIHw* zwt4{9W~dXM9PH&#e4eM!4%?}*h|*;s(W*?56HTz9M^JtKJylCppeeRMkwet+saoA! zRb?fqi4@{-#*b*8X|?W)I;MUi6UL-Cmuba~1fmPzWQV4DI)*~E`jQH!jrEx)*NXq# zik)bk)dy#&5zZ5)J$H{4TWFp2%cUwiTc8TQ{F4AaO%(C zb{T3PO1l7MYlWW8_!>Q1515r|FMsL$%qSb1eTdV|he-s1~ z$b%liRqbu{n+Il_i~SbZ^;vN+b&CSW76Y^`PP+(sI0&C_9pp4>cRSnyB@Vw#+lcDm zNmXYhMtFK9*s5u&-?|FT3w0E=z*b*REw@^!XK<8JfP);XD-L{CPrrr1$W?x8pdVDb z_6!t|e0vzwA%NQ0ZD$wT>T_IVssE}f7(Nb-WhW9qsCYrai+4=*_(G{|uT)J|^h7w` z)Erfd#NbQb1|0bjchqW?gT{jW7Pfj9IaNJu^)?cP&+S%TbYf~ajPw=+;&49KYLSZr z9VFhND@hbx(0V8SufrJ}ZBTGq_)QDAQ1k$hTr{>qSTsky=BVDHyty_;A*d9DM|>jH zl~eudQiR|iN;b%qcE(zB3vwYTzLmFm8vFsET z>^ZGj9oa*O1zfp38hUK2w$I4hnA$~h3W92ew|W)cC2QHp?5%;rj*mkhr|3QZ1o2Y z5OtpngV7Rhg{3FvSeK$C@wl=Q*(|hTb(>MYI659jUTD~jxckEt3O2YDx%+O)LCWds zFpO+b7n`RPU_S?+7#P^<)v$6@r>AGU72X7$BTz3i7)5Z}FvW9KC|T#3upG3jDV1m~ zYDt)D7<$s8Yuh(mC=CF{-u~_OvPwNy@I;73vi&jz&EKEX>p4c zI}n%o)VmNtHEaxPv|2={C}i;(MAHIQGex(b@4`IYL(wuyP~R^CwNTr`Xox()is(t# zz2Jy_fx4x!bBKB#B}UJ@I}BBDkrhoNBkGf~5G8W0vwYUYRaS4b6jI&`=Awv^>1{?d zgCb?CO;8l_46^d@=@~iu|F?{&rO0JRwF^c0f6vknlqK)=+B{WgO;qfMP{-|Ubs($; zgKLRaLV#qH{_@Tll=&_YBpvk(f3&1>kyOj8?6qgHr>+D zOOZwd&tq_vE|{mmS3*<;av86VhxxImL+eAjnW=!^>f#tS4u++`7;T@6PtpK4K0eul z`79d149jn&BFw4MI*gghpabKZM=TmX97cw^Q$DLuipk`d>OUB7hP*|?wd?h8?JHn- z{8A{P;aZgak{+ccpp~ngld0=mhEs6Fos)go4Z!6*T@z8yeyf{(5sIt56elsDvkP^dAgQC&6Xaaf%NFt)YO<8^i z0tnIdR<2!Mj zG*oS(hSEY$dS9O$V8H@>1|aCgz~y3`Ex^Szk3iNDn7!+e8O+mtRyQ1BoI^e3Mcz-z zB%X6aVFyp=Q0#k~uGHBLtO)>;unx1u#5FFogEKx&p~6McSC1 z?TM(@08ZV5_)(zd!#4XZ`qVA{SF7BL%+!;n)swviwi;57nG>4y0V{`T9Rao3s&l1s z0NSf9xUw7an1VjruVz7QGc1{Idtah~xfKa#^jYU3-|ZpP4RY}50&;}Q@b}^5D#sic zK^0nU`m&kTr*Kq+%Ht?Rth%cS8OcGrnTF3?wFCvk+Q8R1M}zc47_J5`{<#(YBx3kv z>WkD1G!#r30Lx=B#9mJI1UE+y25;{a;eAH04fM&euA(V``g;=Qo@h82o$(|9ZRJ57 z@u&rKv(=GF=o%ihbFq+e6vGOfo(;_k_N3Wv3*@d#xz&><#&lF=b-@S#?wFQ^nOm;a z9o>ADIxtB`j0L)p?~81*+C_NIOTlaeeS|&H4yYre^<3?t_=D&ZM^neHX2mzchmc?; zxdDPFDr7YFF}{s2Ks|!tY9Gp}CSVe!Fs%*miOL^cP9ukf@jgB856^}3+(BhiO{3vW zYH>Wq5%vn`q2T@PXqrW;2O({%6omXe$OtZfhGwG}EPXw?iW=*)@#wdl8QX3MfINpD zI!O)nVW!;<36DY-0xPTSkca2IL;W|VX&<7K!W7j{Rg#R(oZ2dqd;5Nj_td)~NbhxI z08wyrJo?VnxEPJ%4Wu2bJ{oJ*$jh-b)1}dRU+scFkM{cEg5m11_;MGJPyPdt8@E)C zqrfS2sb9T6+NahcYsqk@_P1#3Vhq;ChS}a7-GE`7`Y+|<^U+NdYnH{MeZ$bXRvL_i z5h8{tb|L!a(KRTo+JtPLgYvY{4zzA8Ili7nCZjm96eV)hOE4Bnv^5^xdmHZ?NEl}I z1JkkqtPbOqYa4|j@#dJ9oF+T&}53-q;5p$y-m46QMrZ+8nQ zf(orqq6|-r4mfHNztuNn-N%tW+S0!GgP4e><0O{60#<( zL1TBH)m5j_9udH&c21(zJ@sE3QSWoequfhvH2+f6k6U$^{dsBFhs(H1bIrvpa)VnW1yo@9xn!jD<%chRv3K+Qba4=W+R6+lW3%; zmfH;&YE5dO%BaB-f!a0+9toip+9A<|F@nPy5qc)S+B&I*T=EMWD+lWNNe8h<4vbx` zcQ^aiscucLO!78C3{i6k4K<(#cD~eVovFQg z77B=JJd8?ddy8)2@IV^fc_D^MS%Kya6NjKHdC;-hQDmRIEkw-#&@KSm?wW*I6)NGV zje{AeDHQCHaLfeK)mV%JXs`rFM|+`*(61eXmhMG54n)|uA$2S|W0Zpkj@o|!kuCuX z&?idEIRPt5eHDVnxfv;x=EAkqgN_WHe+tW}QK~5fRya~hMpF-kWB-p*J;R?H?ztfp z@d350CmBg_*e^<*wJR*XVA`b`A&ES_7+$Gw25c+MRW;#$zfWP0+T6-;gv=y$_&#b? zx}>nl+;Eiiw^H;8sBDb)TX@%^8!bl9h)S~>QJICPBlH)gw9={OBfqB?_(vpw{4S#W z?nR~?b5dpPayql8!fC+wts_=NV&9x5hKuTL&n=;dGv!!!R`qCF-EH+A9Hu3@H?l9S z^1!}zXg0{p1{>A+#-uugY5SnneIOY5{YkM6j#wRueK4txT3v(fIggfpsO>`6(^kS1 ztdvd4K?6pwghho(dQESw?ZH5w#i9__qA|}ZL`a6KqfkFbU{>Bb!gGEC3>blV(?289 zLlfaDFz3+-??HIc#2R$O>Nplc5#wpPKW!q$sp>BRmHHqNE)!Xf><3iYM3fz_6G;u0 zTFr?7nmCRrG(85LfpRq?l4ei#cko~IBQ$l!WEaBi5i7_8P+_+sncuO*ivHt~NLc%D zKwE4UuEaDwP)UZJ6G@#3Y^Dwda>+QAkyw9#X<`uHqt;@LDv*PHwICAL?883V(Frtu zTeU;r{08|#+pVROTLN_yo>oO-)@RotTO-il1P-dzk$$Hw{}@0O45Ma_vb~BySR`^D zgKX37qHr6Q-559sk5g+%T>~&{7?I)>(e*e4lj@f-c26eMeyfl1FLkBM}`a$|Ts+ag1>u`kOi$z`b|3 zJ6uplu`&l^HAJF@P~vtzwI+a-EQ~lK;k~b-yl{cdunR2%bn~gz0X@d~I1+ut%Ygt) z{xOU}!<85;m(&Jy3)=dAqMgtk#Sli zpe0iB!xvF>qc`r~jO_{z_b zHCD`rC^W5ytNoZH((t-Xj&(L-1SYHJ;lzbLH6K~EvA`0EzRjA45oExV70U4)PBcVE zet0DL=&XPq%Ts^wk25;_*9ItP>1jZet$ruNJdC2F8$T9_b>o&OR$KdS6d2P;v@n$a zFPH}*<-~o6hU$S(PX|Q6X@MGW&sm|^LlefJu`CM9cd87QKrtSOI%s(>vszYMgT<){ z$luH;Bzgq*WT+iQ(O}504o{$=u9_c(Zg2%HcF>@7--H6SAPRj42EgbY_D%5g4F#Z^ zn4WHkj6YBCTo$Sxi^8DGxxu+_LOITtLsEBKk41Sd!czP#s1Mz}5Qc9*iZs2Gtk^88 z?ekU!BH!)_V}JQ<;k=-`RwlW6Ew+ufb@Wq5}A=!>1pg zo}QQx;~qpSy7Q@Coj`YmKa4`JrSt^(H5kni^x>1%x93?Y7eghMZRp-l7VcfWg1g&@ zNOW_1qNQ%NYkX+*UR1$Ls5iL4wkWtFVtCC28s5Adjw9T4-(e;9wW8-)Eq9_keyfvT zZA5=}t$IDY4tr<@*n{3WL^i+r0HqmR8Zi#iy8u(tW>`rFGcP!6%|4Nl~rBU^LHD z_t20GJy=vvDm^WQVIflo30g^vRm&&Cr^&uqw)zAs2wo^$hvYlJ#Nk!ArEvhkqZ2Mu z_EgV|0to(WKwo~d9cQ++W? zhn_0|?c-$mXbOOEf%4If1FRJz4kloFTB%-z2~g3SVS+fjMy*C+5y?KGyK!s;M0Sk3 z&_K503WWwHt}i%)2E-6?!&xd;+;BZhp51^`YC>&VnX$JPf(O z?H^3U)?vytL3_|11UVYt8#A(}Cse8bMHQ&05i}43nxZ^i(C`)`5}|D0W6m1$H1a{k zMlKdj@THI~+dqm>)_fFe{h@}$zJVU%zXQ#e?lGP)5x*#R6N#d*;fM56`oAFs{v zTT~Uyp(l~lJ*sG2HV2`jjXDU`unfjmSZ@JAusjSz1E@z3DslLSJ}giVO~CTtktkd_ zbHYKY<;SB@8)%w8j@Jv*i=q)PBkU$Lwh?Hmu!K*2H{Pe7j1J&a-`!mtjqu!reT*ZY zkM?ASVg|AYr?1L_E$t>NTM!5dmrytE2GQtNz$p<$G}9($fppAgPk{yCvQ?~ zqW!w-2iY*bPRFQd&pD{(caa=SQ6Ej6GFkLCOgWa^k71Yk8dIOBOpJNgA?s)g??=}l zisEX>e-Mq^UQkn|>c*pQ!&oUA0m9QU!D^jtt5?RO(WsA5Q+UWC0^tJpN8R|y5bvz9(Xw79sw6h4ab-dSEgfRdOJZSka6;q;UdJ@Pn5=zyGdZL-s^6`3U zcLyF(QHAJ2)G}lMh1(TPW6h=G;ReY6-|*G0utH`PO;^g%G*g(#ds+CAO>^+OqA6hFeys>Bt*N|G{B_9pT=+)zC#1^O!x`iE*gmE zBgX67f{QWCIPLUpRtwBhhT;UWr!Or0=Y?o}e@5ZCD^3@Q+-gO@^QR-{DEx66BUE4? zMVlRsz8r=)1ViAm>Cv8kCohYkSaKA#q~&PJP_E?=A-;xvXkyf{wX;z3kFc<4yr(N{ z_-nL|H)H&3naE$)(JFF3$3~6}A1c_##_B#1g z#duocN6zqsmWr#vco3z-lF|b)u*ivVSc|q*IUd@HnFq(y698CiT#c%T@zW<|c{ZG>Ecrh1+ZY;Cuc8Ymk z4t81%u-XllaylU;Z zDw=M88ACUwq28ySL-E=JpqDg~qY9PD*<+v;x8R+T4rW46;+Zgoy2UeLu=b*HH1OTj z5<$Wnk%$wx%|+ukg$KhzR8Fqd3SGZ_4_XGz6ERd&J4(nNYB>fQlwleuL}4gQPwAcc z2%{8RwWigJHV5&5qkg6j`r5*P7>?m`nle3JqT}E`J%qtpJWkR)OP|D*kCrr1#Qjff z9qt|GI?qGl{&fTmw&#=}jvi`B_arEh*?6i9P3(`BG#R0Z_B<1c^N2{b~n zFl<8k4~=a?iko~^HETdBV2XX~(p z2!B!Akagto?O5jyfVLZk2yc&t-QJCL?e-Q_!)^^Q#s9%>OU5F$Tk0#ra7(n|h@3Lq z_0Z*4|G~WnwDrxgRoZ5+jMX;V6#M^XvzK5qM4H!PY0Q$NHsKIC{3*5yO#~|=1(qLP zTd5Y}P7F-@d+b4k4Tam+F?vX#T{E;6YXW0@YI+<@g%x5FK(Z{M$DF^QJ*KHg<8sw6 zW9V+4dK$8!-afd+-Vr0*1S{lsJaMSv@sKWJ#u)0*)oU2j)003Ebl2;HF&Oi&jYEyn zFx;osk10^=;%MCB>5zc#wGxeYF3wP2;hm=e7G;xhFUk0yMCf@r_+TiW2nuJaN4aA&(JRuz-P4#x;G$HuBMv9&22LSD zV2)ZgMn9dgJI;F$Pk(tY#|bnmbaT{^6~h7Pu{VqZ7a~JH#TDQaeG2VCa5^-=ap|Tx zHIW?L_QfCtLo9g52rOVux8mkw5qu1ue^h^>Fv<3Is~6IoIRK);DMP4Oy^Y+Lj9k`dX92P-*5ZJeanY% z-x6c4WARv9P#6TpUPF)3M|!%nvRW5fq4&TQ9;K&F(L#SN*6Seup&1p*OeKlL22yA-4@D^{+#A-Baul8THm4n#h3&u3#e&4%dB={etNxHh6&q6bkJyB zs1L96LYmoQRzOlvDl|x z2aB`41CS>_X6ZdBfFnea)4pGvq1Gnk@~2(|=~_w8_``{DbGi!z6KUyXfOR2u`=SwJ zf}4TXmr#Hk)H$^Ji4}%xn$$uh57+t`na@BfJ#wrIa4Mi4E3N{hUb2U!M(6?g$Hnx> zvr?}l1oZJo`Z!s=mJo0}gT_{PJPeb9Inat~K9bwc?U zN&nShXjoiD*8eM^k%|s0BLZUDKMiJu-~5fNb=+a8IhJ(@*LgGeA0C~ty?AP69`v9s zJPprBH$X#NS~9Mq28(-B=(Gpu#m|It_4lYMTI`sfNKu#sY3fRMP%{xQu7mkMq=!|$ zz#OW1wDVwNB--vg^wCrS$RQjID=V$%VPVv-wvR$YP%kE;lSNDD2C_|)8jx5lU(%p1 z+`imOx&R-3_35YrwK5SA0bj5gMKKI31gN5`$t07m8sMQ-GQWvZa1#3t1h4=O0+QeKO=oOf9y7l%Rl0tlcH_;j9VD5up{1ooL z(`X4cOh@xIzITF&+f(=9p(cC<1znNtITvwn@qG=58tOYdOWJ;;m3AwP1kVLT%l!%8 zIH78wc`SX$;xT-I1riK?I`_p z`g)YD%{1he%DZ+Hb)oMkVt_Y_);8bA^d(8JPS%a0@cls|#tN9sd`p+3r6y9u-eI-5 z1(23E&<&}Z5s;L-$wo+ePLh47Ee>`tVSb8^IC zD+*mAqRte+;LI?-@6?xm;MPywhewLo_PF4Ks|AR+r#P@$L#yutD`#;_l{|7r$js4>bK&{kY=$~WM z8zq=}WLpt~F+0aIQs^<4S$g(}__>a19nGviunwa1$QXvzD=m8VL$`-FG5m}vgdu3K z;9Ut5c}G|Yk6Ia*SV{e{=5iE|z5ieO5{!?3r^olzbokh5JqkRj8LMsa=#e0#3SsjR zRs;qb)OEpP_;Lgy$nSdfFUL9;cZhV4Hk*R|-y<_rc`FLnx8ag&`4aW#NIfT;iASw) z(}&`7oF7gRa|0Zq0Iv2c&ZEDW)e7^dH?UGQvK%MWyjGa59J11`gBh@@P4|RuvihRK z{dFV^gwuZP>4#zGw<@>NhCmF@a?=QNu$49vN4azqgNyKZ1bw*!EpKEK%%`dlEJA+3 zI!5#(#s=1YC zN+^OpZkplI!D!?&nQTLAJ+z{^Q4f;zgA&tV1Qhs0t41r179hx?Sn=|%vqJYmUs)(t zJCY+jol{U2I(G*yrONJ!)zl&yiK@qvsE5Re&Hlu0QcXpegG6|wMRnHsxDe&0@5R`*_fn_)3)fl^pWtz`B0U7zlSGUBv_6K3=|(Hjdz+=6K@WyO z0eZDXMS5BA$0R+oe!K|FFux=r;5vW1ydpKDe^7q09EU=}(1rUv~3|A1KG1!A`(EtBA98m)6Yi-bE zj||r}{YV>3R_M-qtWO;t-k=`A4U0_Nwmx-)^Sv;-x*TdSO`Vku4fvvFl3)Ei9CwN^=b?Q31ObHF zW0ILi2eLrHSo}y2gD%j4rWe>O4w-CzP;Y(AV-_MG*-M z;V&GA8n#ytW1xdpt$rI0c~~L^0(dSABV-!)xfjP=kKU(%Y^oNwp{n<*rr`zHr%{mi z3Os&~r(ZCicGfEJ%p?5&o8jd6>X|lJ)}(Mnjl3sT_~Gd^ON+e}`YBvB4%fHFUuffh z!wRpkVk^*CX(;lWm5J)#KAiHQmbXDi)i_+cY)zXgh+uS%^=*0*_5cJ55S%9?FL+>G zX9Bf(3yiC}V*>XP5`eW=qt?);sLe2}Ha=R4>VSRyu*D|mhJU<)+=i%a_o714#JVNH zEeh2BLTY03lh4@1X6PoCrv5?`L%TvAHqxj1t`KXED1I^m($|G`*g>;xZ+oA{xG2ZU zz?{`@oeSqhjxo!@ny7P#aD*>swS@)neTMev)M$d{imI>R#Ta8hn~X0X!JsWMva=Mr zj?WAAdd-W-A~ojig;+jJuEQtYBUClXl~97GRS?_SAk0MKQZH85=)RpdM}1bPH1fx(!aF zTbt}917f|cEgn{gr;=eY0CjkV9Fd1ojwshOTh{^kpP6<=s4cwHrpfAyib}AOCZYC* z>z;3O8`u@=1+T!TQT=UbGLOTThvQ21F`j1+r><+|aNIEY1fo#0YIqX`fW|hs4FG3z zLck7cdM}{q!GvExE*i}z7B^#>(DE%WigdEcqvN2PrW;W+!<*FZHhz3!F$a4n%(KwY z5p5V6x}(Gw`>e}pjF<_C`(ZiiF{F(Yer-eFte6L1MI$@VMo&ytB^ud*HV5&km%o2X zrH9K>@qK87O_)Zn3}Urd9l@8MW7Na<>)D8!g%r`BA8AvGIEE`R={<_nopz_cWLB;! z++5Y+k-%g$uD|p33fgO_$i=37J(OI7C)wMhp{3%{Rs>-z6x65&oWj)neVigU!i)pg z!6n~GMZidZ2>0#qm5)@_kP7?YZbuwi10H-x?{6hvYo%Uo#lK@EUNg{2?T`CfH1)uv zC-|fhPX|~7GeRsc#Uqj?;!EQSOEkD~gDL6#4R|^R1&KlMOKn6Tbn^G$Y5Akkz~d({ z%ZNtY{XU=KgnBZSjD>+H!WW8AiR@2Ac=|S9&jp`IMf?0dKcJpS_2H9-?YN>ro0qPD zCt*bm=D>U(hqxh*Y+{if&zC{G0L?({O2tTSDK168-+zTB^0~*uE95y z?<(xat8b9)-kuKe7RDpATIlH#ub#pgsQNCIqA*p&G(5%q1HMuop`O4Tvqd3-w_h#F z*U!T5PsKn6hx2h!OSK=>gNBSD8{8+~o1uP9Mf9St0HQUkIgrtwjlr2(1ywE82be%$ zsg{1Npm|sg#ppvY5t^Es4Z9*2hjG~Q2l$J&74qm)59T)@Np&I>Ap{H1sM5}AGOhn1 zI#VqdVqpq4&cKsWSh&;omK5%DBiV5sl3{s>4Q+xF(zTQrK&Jr{d7;A1CT<*7F za2T}2w~}$&B_dg08DcLm_8+5l5Gs^jj6ut!5QRK_fgu3Qg=?QH)b|DUP^1m{80)fF zY$b8s`WF_$+!*lul1ww?yCA7LU@YLpT^P)HTE1l|%%RE<>CqM|QfMeMz>2<&y3}~; zQYqZ>5~D?xl%q}*=qf8uL1V+?Zd0sK{3ON*D>kAFgsEfu83HK$0tkdpu+%^-Xcd&J z$Mo}*6OoJ`Uf+769**k);|~S;=Hg;J-xrDg5s&bwdvX+R#xu?)xs(*6=tyHV2L*Uh(I*Zg%S7;P!8%T8B490sA8QG z^C$Y51=MXcnj#HOqcK{y?JE0vbq_{D*rz4&X!_zJe(?i)*O8QZ69ooXpHgWz_z(>n z@Xdn){V>;u_&SjN7EDObb*Iq$i|*^F3_PiSEy{5_-7sm3aSRrf@GwqiHI%+eq~lu* z{Fn;X85gFnLOUza4|yEM3QLyyA&D9wWv@3h2UJx7tu3f;Q*tm}DxgJ0^&N)v(WB@r zvZ(H&$2Kx>_OXI03S;|lHblKZKLBukgr^I7k&%c7!}MryNgATgSHtvZ@Y%FV6c>H9 zjjX^8(5nnX+*qAP<9g@zOllzqbXu;&car_2dDAdB5*(^74Z|Z0&XC9VhasSjz_MB>9xv@NPxrkK$Nsmtp>*w^OH1;{8nKfk@wRy`mRueS~-jw zvD%JHXh{~2MrJrdKw}k@)KTO)N}6XtAyPS(=B>2xZvg&N6<~0!vUChjJ!i*L#6g9u!c!k9 zY72eq>nVyUOa41FJnK;uMHySwj;@jPSfFlS# zl1^1Zi&hv-zknwmQ`An<+&r{E&4T9Up$Cy`HJdcg!>Aq!^}-}K4Q)t|`)LrMK8IaV z3AHpB*Df~@Y7XPq7oZo6)oAypa82&7V(9A|0ksez1V#B7Zfy1SKrF^uszlSD@ z?}cbR7)Rl$B1piIo=I<{egVIWkmB?UI7v&sxPMOlLR$oP^b1Lp+Baz2X#0m!FqDi| zZ+oa=`qjtii9na8qvPI%N<*s8Ba10^f%;--Iql;Uk78i;4Zjtndnd{V{k9Ai%kd2a zlnVKHIUUvK=7VnB;H1un(?7MvAjQqcr$cp$uTqL14lSo%atWFeN{cBGCI!@Yh1&SV zPVXuNbx-%!)Wy_65Hqh$>3EDX5xs7VO`*@PUMAnd05V;#87+rY3VNn=ES!YDjFp|C zNEezvN%!r5a}33}03D$E5(UIuM?E)GpKVI7^j>O(da_!3TH@!mGKtmBB@7>8G(`Fxr9SA@4` z;??w-{Cby=%!w1my9b%2ea^>w&wAiRY7C_PxwCwIwHj*hGrHQ z-#xlV&)%7|KdcxpKhEsg+n43baudS)ndntQc#)KE80|yOhc^HQ#!nm;xbv!O240CH zovNn!`NIpa!yMxM@0w5qfIU|TF9^ar!yPricz?Td9&i60N~*y)J-t6MFrs(@FjB-j zdG0L0s|QCEj2NEpNb1)=IlIm)K%ITO1ZddsK{rv}piUoQH`ulqzke1M^4p0somU|z ze}U`d>C5zw-Qm}{#MaJB;Pf9;o2-8m6s{=b+pr$`9XfOKupY^8XFbWLF!m2=`LK`- z!M|g9$#a-@74q-0o-DyXV|mFhVDA0~sC!u~mn+)^{CPynhlLCh{3hmkf*;qv7aNAx z4*hfcnt9njamc&OD+Pa?d9~n^nb!(_JM((M`!e4mc#$rzrGKN*JoO{nbB_tJzlQk% z!S7&BKg(xs%h^8qcVLYZIV_(cdEWUg*}N;5L_QkKiwHxef^4 z!1O_qYr5$DxP# zFh1_gpRvqm@^J_LJOtGwzg);SGXF%#Pu1nJLW-EXA4Qsng=C3x4Q8G#x$9SgzrpGL z#)^IXIfr>Wt`|S^9$JreTHJ`_e3rTy)%|itNHwK&d)L-zh9?|I4SgB&3cxw9=G1NbAHN%{1dES#>2N*KmF#b zxlKU+$xk*2{o`4GwUE!@`mGiGLzb@>ypr>?#!Qs=Rfx{iX=l`Fy{sdmLimSx#T6=q zf0*_(?*5wjKToI-_t)PgZ}m^WM=B)gH2xrl4)GzU3aj7g0jb9@bcj7oIwWK=*qL~9 z5c#vgNxvJf^!q%ZBaQhU`u$*R`rRD(jAWj{^|(c!4GD>Z|C}k^-#PzyUQ%!ReI3|4 z3VtT}cX5vLQw@Ez>34YGa|O~PK1kPd$jO>GjQkPLWA0k~2j(TrduVMTA@eyu)y(yK zIB>2Je`m_i8_;tm{sZf&HSuZrRD$!S<2!5kkL1OFTBk0o#}#XMTXWerE>Q2X4KjI)eH=7})I? zq<$k=zPi05U+;W`jAVP}b#Opi9Mkr{Amy@y*x}+J@^zeU_8>>EerEu7kD+Ou$!=#s z{!DyL5dGE25817(i=$t^F9W-G;g9$r?uhhzFTl12(PIT^N90at%1;|E*Px3afK9&# z1D{9L9HQT8fnD76()r2AcDUPKig8H!%wn$JQ33WM>p8$3i+GC^zGfCddCrJ_#{A#2TB_mIZh3NMuV0TUs`Ab;7jOF!v6CmG%dHqmF z&nD+1q=0$lFbAYDpUJ$Ix&GaDoV(GL&vyi~SpEs-^~|%G_u}$~40phX%&%m=g}HtY z0nRPMAK9&>&=J({4!~{|{?23{s^&BCy~xj*_zOXJTo65RoX^;i5WuG2KY-6`@kja0 z8cj4LM88`ApC=%HrgVQtM$g30LR=y})l;>a5dHi2*liyqpOHa$8_s8SiK9oqp8&h( zvHtoA4%hD-z;0@gczC^H`_q62n;tIW^JeB{f}g|bRx;0{i?Ce)`7@RGW|lv|^4vW1 ze3I-iXo_?FDCYxTM|AR2&)oIHl{kMU{lkK^i#Z4^y1wpn6zg{bV0Rkx%IOZ*zw?jX zPR=3Lq!2^!cl?C2UBMjH5P~9}_&QQ{PvUHv7@Wx3pUxRE>!1zq`P zgXmcnM9*%6o8@Xpim}lL`KGJCpTVh5clkBUWj=2<ao;N@^=xB#`Y`kPV-Wtg!G{{@Vhvw! zQqR8(o^Qxc48j)#;jaYYp9SH+1>v#e#MmgGW_~h*@aux`(Lwn1Ap9(9B-o^VE)BwO zF}P{xQiGfI^`9WTHVEGkg#Q$TNAUcO@^9v+M-V>Q;3II2>z`j4oMNNP4;$Pp*Co{0 zu*v$m&*0Q2xO!ePxS8$@YRuTA{a-Wq7@T+Yw57(0O{P1H8WnRh|C6W@GSA1StEZj^ z{8G;*gPZvu#hsVT=S$2fZqTK!{;4!T!AA0C{$CHm3*xo-Y4WcH;eQxB50|>>R_iy) zoStrB;+geNF?flgXD)Lp7fp>_{ZAU4rohLzpM9B^a;UuH4EYb3OFf?%+|+Y*Yg~*? z*2{g&rJWx#I8}w4&-n%?le_#$gOdqe{;a{tgf4&4;8b*%zhZDIip$p;oOWIQp23q0 zej^=VqjH(~zs=xg{?{=-8}j4v=j#8IIoXYdjxN8L*ENWn{#?YI(rshNUqqFGjW{i3 zxOyh=M1%C0{yaPb02}dA{JHWEWZ(ds}-FZor>DW7?U{9=Qf?e3i*{QDsMSqdcBNWbaN z8w_5Cb8fl*2*Oj(fe<#*W7gMs%&A;$@#pHf%-|W|Za?y*p(o#vzp^_Hu*rN5Gk6)! zyZYw^;VTVp=5r%+na}M8&wze6pXohtfKBEn)8J(|@8+kk!Oi~hPJ^5FA7^k=&;15B z_56pq%>R)f{7N4(hmG<-3V&`sR~x+C;Cl={!r;p?ae$5Vl;O|S^NzvId~Rn>`J~Y9 z%6qbKfKA$Sgu%`6=Uju&z;&*kwFa*+_)&wKdY1O2RGoB(;?vdhy}|PhKIdGLcI5N$ z>B|3LaI-yndXuyxZ}Lt-_#GFVk}t!qtAD1!OAP)Jb7{{ygLi$g7|dQ5*ia3O@S zk^Rl`dM?uVG=7P}P5)V8aMPY&8r-!1SrKS8j z3gIrl+u#(!U4EazDO9_BhQTS6x_pkoDKxr#p}{Gnxx9lP2iT~*X8zAMxS9W1%t^O7 z-g|~Q)t5Qm`^wde+D=8ce?bHe$#LJ zFef`uh;{R`DTw?}LF5-@pVI$`q358%D-6E*vQzR?4gNoaml^z5gPU=z_vNSbnEm@x z2G29}9K7O`yqRu#zf;__&&ABiJ`}=T`&?~s3Z-tl9%<+)Gvq_B!~wQ2{F(8mZ4iD% z5I)b~`OxL&XP?2%a)n++sXFPF;nS6GX>ik?|6)$%rLM-6|0D>Hx*9^*q!9bBgB~+|D`0D-3?8!DktKd=Nh0;HKaH#+=HPW$3wJ01mKG z{!Kg2F}UeJHOxs5b!Be3))>4Oxa&Wk8+ytN`D?Gm0XEV@U7V}uLFSa7IR;;B@VN$G zXYe}=zB>qSW=`o+SLvqP^*S72qjW3r=kmS=H`Bev;Q5C9m>~QqgO4)gdtHwMY?Pn# z@aLv`qruNN_+88?pJsmY1_59rJ=7JudLA-(AA>JqF7<4`0Ycb_KZ-wBk98x_)A>aP zpN#Xa{7pgl7=xSRy`eX0^*aAFWN`I-G}z&kAJhK_+C@4Znoc{ zLy#CY%Fi?SbJHye!tXbDz9Ij35dI}|vI7kPT>U>7Jlo*=3_Z6S{HP&MUAn6$mV~fL z{b>fz#(7u1J##9rsXy1?rhT5g6N1>JeU=5`uNZs^u5;6UI|z@-BkhiUGhUsar?F1= zS?s!cZZi144L;Q1l$0yKjyc)qa)UP*oQ5{8{71~CeZDm0`x)}h1~>KV2ZkU=>6-ej zy8y6B{g)ZswEvNzjy&n1p^BT&*kKMQJyQ+d!{B)aFU`jRHj=*wf3BY8LHJIClS)^9 zufb{8-1LV! zgPV5VZt$gs{_sK^V3XzQXYl1X@8;(wgPY}g%HU?a`pn=f3_V8-KHcDd72yCI<>w{* zx#`|cO0f|)_1tanl{n|hPcwL}!DkzMmBAllPJVcm!IuS*Uuno+ZOFf6$eZzhhr#m= zc|F;~F_p{ohaBphuo0&w;+AWy!Dkr!QRb9?8Zx``&l~cu82qRqe~rP1P$saE9+S^9 zcn;3F`k!P@`83NLS`2_q>Uk&#uL;5f z@&sIrjnd7>pPTMr<}%$ihP>$y*91t*>G_{;aMMqo4Z=4Y+^qMn3~u_#q=`88+N1smxx`8ej3?jZcR@)`Hy z02|4_hd-BR2H}2#uQ%ie1mQ=iv&2T}-he+>zvq6Ur}I_i4yXK>_J3j8DQ?;`xx(R6 z|L;L~33Wo)NWW?4FAQ$_e_Lu)*ht>w*#+eiR>{W$>E}?p{af@)S)=y4Shf zy*}2^L-ObHaiZWHj`Xt)bjsDk%}w9)H95OYNCrV{uKaB0@Z|G{E?>aBD}TCtDIa$i zd=(#O2~NI9TW{y%WV##pxR2nCeC!weCqB*={1_ki6Fe@|0sRF}XHK!5Hn&_p=G4Y% zbNTtq2RryAznD4s25qieqmz2N_2-XQov=9>k#lmoU1p3Z!m;91Of3f`ajF2U(}Zrb+f|4;c3eGiJZ zCgg-V1Hb&c{jp>zE%A{4?gq1^>eHWK!Gfx(Ju4A4iINqwKH~0H~uAV~XorL^&=3NEH z+luwpUGRC#vjl&Rd2hjAX5L5e_00W(Z(&Z~SE9|$|Nofx6Wsm2o*R!{dH1Ip1`2ul zJ|t~}1W#q|KBw>M>C8M=$oFPGMDWX)=Lvoj^L)YYWL_kA3G-sXCo^}SlXvs^5c7bL zpU1pZaQqsI-rRo1)$HFKX)e1h1`D(!{nXeIi3G;P=uVh{?_*&-c1^;Njs8-zIn*^PPfcFyAG(kNF93OIG4~6;mwC3} zp)DM{x!=ce^Pj}LzmV_6e4yaY@B1MB3w|@p4;Fkh^IX9nW@Y|V}2|j{(h2VEHpDFlE=CcH^WL_!w zQ_L3#{$J*c1b>bBV!_{IUM=``=1T={V!ll9Bg|_A4~ul{Un_Vk=Bowo#(a(7mor}{ zcrNpL!6z_ZFZhGZ8w9UrzFF{E=34}RpZPYycQD^6_nKui57xN>67cf6A_&v<^moSlKasyhQnZZ1a=K(ISWbPGwDf1}7 zS2K?ld?WKj!9Qc3EchPg?)P!s{QSy1L&&RW$NrrJZ_T``;6CQv1;2v1J1=z8y`6b) zAwPzBAHge_`vsrRJX`SRnD-NW6?1n!>gMNN<^zTNPUeFIKg4{n;K!Kf3hs?@>^Vg6 zSmt?xr!&tNygTzE!Lykc3w|B*62b3c?#`!OJB(spD&!|KpDOq)=4FCE%e+GHmzmEL z`~&8*1pkD2rQo}nFA)4k=8FVB%6zflc1x#Tss&GCzEtqG%$Es%HuD<6{mg3xzlr&3 z!Sk4}5qv!Jb%IY}UN87V%-0LPka>gP%b0H#{8i>#1mD1Xo8ViS?-aa=`7XhmneP$2 zMXXaVO@g;#zE|)r%=Zc2i}?Y;uVCIR`1Q<>2%g9MxZtCi>l+%#vfGaCXCB7u5H6p^ z+$(q$^C-cWGmjN~E%QXdKVY6Lcq8*P!M|qiu0Of?{DpZZA%B#4SHYwBMoM?VQU?tcH>)&DBd5VJi&ito-g>H%!>q%iFfoC3!cinMDQNW1A_aRmkK_J`BcGg zV_qis2<8=n-@|;S;14sOCHNxdm4d&(e1YKWm@g81GxNoQ?_pjo_+jQt1rJYf?7U3y zw#;h;Kbv{2;1@GrE%-p@YXr|_zE1EF%=;G39t68v-K zT?PMzd3V82Fn50+&`q~B-(Yvw#a-T&c^{$YQs#ca2QbeTd@$`5Ai-xbA1wIe%<1=nXmiW;U*ElFmkNFb^QnRlVqPZrQ05hak7Yhn@CTUB5_}%>O2MCJzCiF==8FV>oB3kF z8<30}#3r{K>r-zE4;=6eLMXWk_EN6hyM{x$P`g8#t$fZ)x{n+5kI zJN0rz@K(%^3*L^o{;?{fz5AGl@% zn5PLogSmTu%+9D@%{*Ih_xDZv z3Enovso(yB_hdd$a6j`wf)8XqSnyk!=L$ZG`4GV;FwYabjCsD`^OzS2{$J+Bg1^SR zMDR__1A>3ayj1XSm`@e_SLS7cA7@@6ctjh={xbznVLnUnvzS*3ejf7$f?v*jk>J-c zUo7|#=GB51GhZtBB<9NmFK1pO_-y92f-hjcTJXip*9g9p`8vUCnb!-xhWUEI*E4Sr zd@J+Kf`7w&i{Sg2Zxj3o^PPf6r8@P#OYnH+djwBs-XwTu=6eOtWWG=EKFkjY-j8{+ z;MX%hBKYmhj|)DEx%(63Zu~4|9>(`|U4B1vui&$pM+v@wIsHCAZLXdtm?sMUEc0Z+ zYnZ1AzKXeff8N!Dl;=Lx=ndA{JEF)tGQ8|KA= z|HQmR@IROb1P@Jj>c#!tKR5re%%=+ZbmnD(XELu4{1WCf1;3H`EWz(!UMcuk<_iR$ z%6yUFbC@p{d=c|%!T-yAso<|OUnclw<~4$U#k^MV!^~F;9@^Hi{~E#LnXeN(jd{J` z=P+L{cyHznf?v*jv*3f6ZxMVL^KF8UXTDSL8O(PHzL5DI!Cz$FB>3yh_X^&?e4pT3 zm>&>)H}ht}zh!3;q{#_lp2-dx_&O3WV|VDK78C+$*@Bd6eJ-na2u#7xP5H zOPD7MUco#~@JE?v2>xH@odjRaysO|JFz+t-$IPE*ErGkIPe5&BzFfSAQC*~D`?`J+!@I%aJ34V-u zrQmk^5WOuBJf8U?!PA*97W^#c)q?k8zEtpR=F0@Xo_USnw==I5yqNiF!KW}^BlryF z>jYoGyk77n%-0KE!@NQ8*O+e>{B7o21pkovHoqQ*mYz^F$&40P|$QA7Y*+_(J9xf` z;Cq<+1^=0Ow&2H^_Y=HDN5_Bq3m(UOpx~*@2MOMp`C!3&G0zqJQszSh&taY?_>Ii- z1QY zd8OcAF<&6~x6Bs_{v-3ng70TuE%+bImkJ)*$?>0Mf=4i~5j=r;t>7J*uNJ%;^EHC| zn6DH3T;}zHU&wsD;FmIQ5WFAr&4ORYe2d_BFyAJ45%ZmbPhh@F@TtuA2tJ*8li+ih z?-hIj^L>I>Ge02si_Dt^f0g+W!QWzjT<`|wdSM2x;l}xon1>NC_*Uj#!9QmnCHU9O z-RHPn{ogT96!QC-Ckx)pJWcRp%rgYHIy?F9BzO$-u7W2q?=E-;=2?PwW8Pcv9?bg) z-ix_k@V?Bm1;3hkKf!Nc-e2%rnGX~^pZOrc$1oo(cq#K-!S822MDPch=LtTadA{I_ znHLHE9P?tqYnhh_UdKEj_(DXFmv~nqICKe{Qbq;{r-o`y=OUo>*eo5xIB@0l;G`| z#|qw=d7|Jx=E;Je$2?8&OPFT}eg*SRf?vbDtKc^>?=JXl%(Da^%DlJWCCvK>ejjtc z;4_$K3qG59Kfxbo-e2%%m=6?uIrBk+zsh{D;PuSi@8!7lyNUS_A-|1zp5VKg=L`Nl z^CH22WnL`!A?785hjexPFd%pY^HRYRnNJlwoq3ty?U`2yem3)&g7;=VOYlpWR|so(|7mkBpU!-Z;FZkR3BHJV zz2HljuNV9!<_&_s!F;pe>zQv6{8Q%J1pk8hPQkxnzDw|*nC}t%AoC`{k22pYxZTb1 z=Y4|5GCv@AYv#>@w`YDt@NUeH3w|DR_j_z^d-pRBw6jwSxc5e6`?5n6D8$>>S76)(IZZyk78h z=IaIT#=JrB3z=^g{3_;K1izN~Ho1Du2Mb=sJXi2#%!deG%REo;waoJc-@v>`@K2c+3;qT3 z62ZS`9uT~ld8y!@9*+M^6+D4?ncy9mR|wvd`AoqtV?Impfy^rfzm@p{!HbwL5$MCRKB&tSe&@b1ia34T8FJ%VR5ZxZ|(=6eMn%zU5Vw=+K=_$cPh zf=^|BMDSV6j|=`d^N<+FPHy~vmU)=qFEMw255SdwlX;Yo|B$)+I{~izXUr3Y{BGvS zg70OXCio%d8G`@Cyp!OOnNB&o3ZBB;{e1#ApY54v3Hk2KdkcO(^FD%K%-k<{Kj!Z5 zAGqlbWZqB6|C@P#!N)QmD0nIJL4wa_K3MRD%yR{Qiun-1-S^Dp3H}<(=L^1pd6D3s zGA|Z zM&|1U&tu*o_;}`<1utX1MesSyw+a3v^PPe(XTD4D*O~7Td?WKF!FMv>EBLp}_X&Q8 z`2oRCFmDz-rk7J+M+9%n{J7xfFb`?zT<6B0^O=VU-k-Tw@LQQj2|k{Atl;-BPZYe2 zd9vU$nWqW$mK=8MjmkRzd^QnUGWL_rt_slBhD1oKM4TQgrEcsu5c z1n?n)x!pZ(v>{_z>o`f{$drTJU?AuMzw~=IaE1lzF}2PcUCE zcs26|!Iv}NEchDcTLk}r`8L6~G2bcpF6O%gZ(_bj@O{ji1aD@(SMcM^_X)1fbNuRn z;1SH51&?QbMDSGR#|7`kT)*TVNx5<9Jmz7sPWmqI%iJq?Kju+_-^@H#@LQQD3O-be7|%>9DD&OBT2cbNAR zd=vBjf`80>py1n?4-))K=7Rxzt>7OpUoH4Y%-0CMjrlskcQLOQyovdG!GB@i zAo%ahHw%80`4++L3mpI4CU^w%or0$_-z9iw=6eM1#k@)I3z_c~{4(bI1izm70l{x( z-YodPnI92+DD&fj=Q9t9`)8alU>+v;MCM+>r!#kdN6n1`4>6Aw@^hId3ciqevfzuE zrwRTX^9;e)Fz+Pz2h6(){sr^yg8#rgOYlR?dkcP?c^|=5AIHA#@58zFiDaHFPw;!0=LJOeFBUxX zLdUPF1-F?m6+DIcGQrPbUL&}ld9C2rGG8tDoy^w=KA!nH!S7{WFZd(O*9*RYd4u3j zGv6%u3g%k`uVcPV@QuuO3ciE+F2TQNzDMxinKub;UF6i)UcnQY?-RT|^8iwwg70D8UGV+PvjqQ(d2hj^E_UqLNANbx-QTBlVDWE)T`7 z8igp+h*I{Tt|dL?mKmiPx2(t~l^JCZygj5cgU~|jnw8~$t^F8=t=)Tnzt8VKAJ3e% zzkBbs*IxT^_St7R-o$yG#OHIqUE-;n*GoKy^IZ}z;JiWNMV#-E_-f7@C0@b#eu;13 zyh-AlIX^7%8qS*~{ut*UO8iOATO_`X^Uoyy4Ck#9e}VH85^vzVP2z8GeoEqRao#EM zqn!UF@qcoDUgE8sUyyh^=Sr{c^Z$>WYZCv3bBn~)8(97TiTiRMB=G>wgC%a|JVfGs zIk!oCAm?_8hjAVz@!_0@OME2f!zCWgd8EYSI3F$X>6}MPd=}>uB))+27>TEH9xL&s zoI53+%ei>}u9)Zl!g->UekJEg62FUc@xET6$HnywyYA|>8~^U)IT%XzfK`*S`);)L@U ziQ74kmG}_Oof41WJVD~uah@pg>p4%7_$1DgB_7ZDLW$4hJXPZJIM0-LI_KFE&*nT= z;>$TNkoX$TizU9E^HPc5%lRsaKgfBR#J6(3R^m@`UMcZyoNti$4$iA3{vzl1Nqi6I zH4@*;`4)-4&3UcFk8=K`#Q({8oy1RYzFp#{IIoxZ8P0b}{8!E!ByNsj<7kh>{Wx!w zcn{9^OS})~O%k_repupzId7JD6z3mGd<^F;5+Bd`XA*aC-YW5#oS%^RY|h&xKA-bb z5>My6Q{p+C|0MBZ&d*DHCFd6;zJ_z9w?aQ+y;sJ$Ch@yCw@CbM&I2TVFXurLe}wa3 ziEraPMB>kLZj<;coZBV7mvf84J}R6{T*ecB45A1g!Q(>sS@17-*e>y(c$oh=pGS`g zGr}j5ojlymIp4EcwxcL7qvL$|6W1v9d zCY^y&iTCHcOyZH8S4v#Gr?^_;!+aR1k@$_A*Gl{r&g&$;it~DjKf-x~#CLJtDDihV zZ<6@;oHt9nhlPO_iAQnXD)B_l+a#XKd8fn+I6p7(HJsB91#zO^)^cv){Y&sqIS-Qf z@0^E7{1?te{}p<~`z*qx^e^HB0-s2Uw{jjW@uB`KeT>Av;@m0myE#vk_$!^oP63^$nK;q*0P^rXU<@@Pn62F!2vs6m_70#dXAlDDjvO#+xKA-b>#s@y>oMeT&2sLm6+CxZTEho5a)XjCV?W zCFkcQ{xIiaa>r<#A_okDFZfvad@1+}UT%=YYkB$*iGReoUE=R^9xn0TSF&;=B_7Us zw8W=#9wYHo&YcqfjK9|_QQ{hZ4^pzk2XUS%@yVQLOI#Vu>@Se`YgaN}D)DbQFO#^= z?W~k|Fz3}0zn1eFiO=G^R^m@_UMKORoYzZy6R&TB#7}YFDDfihhbD=?!FjX9i~0Lf zS|nb^d8@>y@xRM%leqYM^G=C3^7Q8={tf4fnYEAT=bgM=&v~N6cXFOA@j)Y4xv3H##d)^G z9h?_PJcIL6iI;F*Ch>C4Djd6UE&xc$u%Kf!s6#J69|^tVd<0OxHIH+X$JCBBUF^Adl9b46q2i2nZv z=N5_AMX_{262F)GEkxqtcT;wWZ{WZ4377b3&LbtB$e$NSOT0JV*Nu^QEay&%i{}N2 z5`Tf~PnP&`&Qm4+6n~DBE%C27FOYaG-ybWL_@|tgNj#kI15`@<2!t#emycg$oiFZzA>BA+S;bdIg z{|S5k7SDLJlzu8tA0zPwp57^OziCWQqQo;ePnP&{&Qm4+0O#2fA3vSxFOc}XoR>=c zbI!{o9+|-OR7%`EgYjyK*K%GX@kY*TCH^JnbrK(b6VqQWaR=uO60hgHQR0o9H%Z(+ zlj(1kcoyd^5|2q_>02efh4VIvH_u|}J0*UM^Yaq#L460hdGRpPriZ)B_73jwZyAAuaWrQIIop> zJ?C{2KgfB##8+i9dm1EO&3U85cW~Y$@kY*@CH@)bEfQCnHQo+|NH&a)-n_b<$z0*N~~FO_&m zAxmE-@y(o9O1!a%rLUIw1I3KjNPHXTwGwaUyiVd@ab7R+X)Brj28oZmo$*GA&*HpE z;su;HOMC_AEfO!|yj9}sId7AAHRqiYe~t6=691ZW`iIL<7194YIk)(+`UyVluPhuS zal(0s#K&`Pmv|!Q;Sz7;JW}Gdt5~_w68~^D<1rEs9nQJg1AJcjdRiO=LbRpOCr zSh?8}zrLLD0*SwL7vrT8e~zawlX!6jOJ6DRYR;=A9=ndEuaS5X=d}{Qo%1@0KgD^y z#6RM^LE^*uuyPwEUO0^LCW(hfGu|xmulV2lv`Bnu982FS@uw3Rx3iOCf-@fC!=2v&6-ItH$#Q{gFCLDD(*~?yqvC^ojg>Qzr3L&hL|W0q1)pF0S9A zlA>JE4<_)+3oiU6o*xM=p680^EP{*Yl>uf}Kf%TGN~grd^U4hp7tbrjKDN*!o)6l! z?)t@Zx?G8i=RSKRF82QecsmIFVt+VU;$q+RNr~HIm>pt2N9c*<++uXMQ|#9jNL=hw ziT{^b=n?xu;yzb!u`eY4Ut__=zL3SId%0r&XSBq{K2MUw#eU8PiHm(0aUUeg75gpX zK1Fb`uM*7rqu^ry#3^yHPf{vzvF}kYaj`EU{(m~5U+hZ+@#~b}Vjp0k#Oc@}UPPgiqUaQ^s387lE49*&SWUk)fE zC0@(JLZ8t8Hs^es(qqrZoM-d1NPnD%MLB|>=KNkM{l9p4o5cU%;XM-9`E})eiCZ~8 zDe?ZC|0eOPIS=AzVdu3xJXqq_^RPIJ^iw#WDW#vq!YRvxgdWl$!Kf}+qus1FU^o>iFd9nQ$l^$tSW zg^(2L#q}00g_;#BMHy+iS(zz<7iH%x!73F|k0ekDeE|+j%bks!*Q_vaX>LwYu_p{> zvoNO4$j-{REhE1q594XwnLCP#3sdr!EP)ynDa*4msD}%)ii)U7dHH!*2NqZY&5)DF zWNH&s$5R%l5oYA(BVU|dGoR|iu1c5Sdx`il*MTw*q13% z?p`nB$;jXf%wWjO?PErFjbUinKf>oqh`)S-Hz_l)(VW zStjhvfdNBh7;YXJD&moG_<(kiUWjb?U?>IJGcDsbDEPLNC22XiP=o_2vpg#yC+{{T zA}_xXdyOK~{FklESoQS#0jgUy+h00#Hd7z{2U21-h0pwb;L~T?%rRr!33Q1UWAQ z2ROJXr3mH=59l63m0i(YAuIuU9!y-hm>0(_>oMKuthl^PTB*F-Q%dq+dSfAMZD;_9 z$%Pq0fyo9>xdqgooYII41&3{MS~{FpF2ge&?b!doO=(mkdYcAtuAUv|NSM4b{-z|Q zXhm89p6M)Cn1v$MF5(iCW-~D3=E*Z>CNLSZQ*WlH73CDooI+(NEFNcl2b<^N9FcHi zVtmv{c$-HAomV12fJ*>a6p>L>9PNqc(#R-yZwyb_6?q*?29YRXJtH^*&0{^0Aa$vZ zLQa$N1dw!$Cn-uak|T&5?TJK*Msfs^qdbu)(MXP>#-)tpkz+j4Xd#Uf!f1~)QXo*v zb4Ceav`2!v^2kUK*l0;9b&M2_#Yk#~P%$ngikT4=Eu@iSgfwQfkVbl>Q38Q!JnKjy zjPXcdq|hq_FjA!VNRb}IBx)L@;_U$~78N1%j7y1RmX3-R64)%*bwV05Mo6PP64Z#N z8#`J^P&dv-dnBkOXHgz$lt5!W(io2fJ`fo^(nx{88$5EPM*_cy3_=(aB_!~W$l#G8 z1sdy-Mth`@9tr)8d6@$v#VYK7f5zW+@U4k%N@m*`UCr+oMI>JailA~2NXYo@zK6$f z>BKq@qC!yjpt1qNxOEXD@s>ok%5+}CBJgM5Ncios62j9z3k75OJ$YE1BG)rX{C-w& zQNB1Q{z-o2ZkD4_WaMX2zBrEu0m~QnIU;!@&womCmgDp^Yhm>EQjwFL<+Ptb{>!zWy_B_IHP4Rihh0hd zO|)M!D3o<#mVi4M-G>3MkDRvZPx8OV^M~=jM-VFH{FMMMXMa7nzYZM?AG9BD>1F#r zyMfu{q=TH3q#wRRA8{PnVeMCNiUj7sRC;!a+Uu$P6(S9o& zviMqYQ_$Y>N( z{qBfMm|{}9EK=bm6I~&+f_)0SCeav*VwC=n(lOsLZ;tcMQ>|cXyz8vf^_$a`6c*%k zC4_|}xMIWX2_S{9Z7hzm4v7tmv<^uKi?I$#3QM#OSs0dT9g-PVU>&kOtPE6IhwKW& zsmeNJPgpISGo5a2a5xA~*V-_A2H@dVc&uD$<&qzWT$p5Po0mScJ_ zFMydhegieHB+z;1e)PjFj>V3YeKc(~`p1!k9>Tx=hFR0Y*M^}#ORUh8*kHFf7IrnJbzqD#7rVRbH}@v|&z_xC^vV`>E~=4Q z<$e}v`R`G8L{*$#6H|UbO{f|JwNaKtSO=~}0X-FU4r<49lpnZQ{=2%Oy`vY`MdNv7 zcLcp^Q9G*WQf3_p_V59S*8cw)dgzd{H{QjEG}g5%pmpM1=l-(`teakh3>BxX8()Jn zb;S)JbhAFzk1X0S}V|ryybCKiPM1Sz)cwLHVrf)aT6@n=^l?QkL304 z{cF@4cy*^Gv_Fg~S)2ZOJ1}F)UoF6aRebAZij<9F(-zvBP_>5-Fm8(ikWWhgc3@#) zm-f;go?Z$Q<GBc=rzQFYOa$60*mclF>#2*@GZ!rZ8t?jq z`^D)h#tU6in5E;dOT_q2aDBtQ_h+8!UMc3SSl78OcY&Ycpl~`*eC6#YH(HV4>Wm+E z#Oa2ztyLdEUrwkhP-j$y9g2s#opo4)5)N5FL+nAz5^F?LN&fB2{?wtK>B_n(4x9s1 zRyg>-%b7UeiT0AlXIC}buYs&xd7M?l4?-(q;W$2&62t1oiQrF-h;_fpTJ>Vo9V6l@ zF0L8xC_kin{3(?WanPO@p*>;7ytIp423^j<;3X~0J8hSjsq+)utHQ7b<@gH~tU=iy z(05$J!~V1u9#`Hm2HZFZ+-MzGhV_^17xTU7Bktj0?I(Y~c+oq&55mwMFX8guS|x#Xj$(;`xs!mf%PuVQ?07^fmp zRAcwiNUv?((Y__sUG;_W86N98;BdX?bRDIaAZR3~`xX54o71%_EQHP`Ya6X=AA*`C zxXwU5pg%cY!)A!H#{W=pdZpoh7RR&Gl^bT~=Fo>~2{4>2umJRS5|5WCXtZv84u)N< z>$KCI6lNdy5%kz|`_08yi~3>b;fkO-;a$xrYUqXbIo+{gAx?KpqBG;&Sa)&d1&8Z& z`Cb*L6+4c<$!@I?g^Fd@;azhMdKY; zwZ8|I?dmN{s##QQRjFFhXx;b%#73R&nADX5h9Bm|G3WFc&TGOO*a2OD)^N`FXEE*S zJnY`{8)L`)zUm!l%~;p>uJ5Sxu@l9PFAfV{UH50Ec0ANoHr5Xs>5_7J-({t(x|fz6 z`fn1(gFOl3p-HW43vr+dmx4dTg4Kw0GmyNJ?ll)ThPB+`&;>Ih`@gg;SFn1@UqMfZv7f;u|6Gl9ZYX3V(-VXA*e&h8i z&b8mw`}mMJ$dhR*KxK4nnUwXf9qBUzHH1Iy0!Q_;LH=U58h@obD?8_2(4#@W&kE z4y@_N)qX|08B<&FY014EnT~OvmrQr!Eg*b4CplrP;N_3rF5rSO7p_hn6T4jMvrQz1}n-v^z>{aoZ!aQOY0S& zHP-d+#m&{A*5PXJW;hIG;ig!)(74*bY+-1S(_N0&q*!-Bh)`J^0NO5YZUf64uKkx9 z7w2l_mWf(gcQ?gacb7MTUG8V=EU3=iNKcy&!%0$sUYqSP06J+o{-z7gZu|`_oHsYJ z^WU1-`3d|@tE8k}ryAVu{j{9&CODz0+ODLImsC-2J_)+r_-i?+XDysSBOQ1N{A7)7 zgi5$~aYflseYB~7oi~?W+EDf8HXMACWx_Yiu}*hlbS&?CtjB{*QE#z~?#*S?_w**j z$!=gE+UfefD@B2K3VMIuO+hV-rZ***(O>=VqrHlk%eAna*z@>MrR6&Q0aGcv1BGg_ zd0SZJbp4atUA8JrgZuAK|BZJxm;U>T;f#7o30-cnKs!UUTyHP)obJu|Hwc$WB%ELK z@1yZA0Gt&c6o>q&it<%qcBL4v8B}GgtF8MQYG2n>ZXF2sx40SObiaW+POu49d=m^l z{BttsX37$4IK2f~Vohp-Fx{$wMg9A{lkz_1v`%fNmqy;9ootr8r5*d>E&IB!KjU40 zbQNY@8ww5Q`qvEij%4V`aqideLo3)d_f>3D?@MmQ=?1uaRID=(za=^z*8)fOz)~RPJzn2-#gFU- zwgJ3-;wXOu2MTu~bvE^5bv)|}-f5lS!1#v>NJZgHGDz`VE@ zyhx`o^x`J&#ikW|gclt@{}Jzg-s8lJ)QQ1if9^vq>@qH#@8!bj)P<}Ace~;X7k0Z3 zWc$guodfQR=~^;CpNe*tQ!Ow_;BzZHtrj`joGvJNk9w`u5YOYu<*v)basL0cn~WWiIoe-%Gt$)ft73d z-&YPNKd9W@@J&0FsNW({Ki3yS4vMnS+DNc5_Skt8!$C}7q8-GfW9KhxI`58jnx)-w z^+4_t@Ez-<`|hZLGF)F!pLNvm=AfajCLa$?UeW``Sd8Zmb01COJwtZCe{jNN*`)yb zObmL_j$UMU&kol?e$9k+2tL+>i9y`Wc%}vxA+E{)Z93M=gj$~4b6?gUdMvvWXFHG` ztHu5atP9bbv2Ew!n=WT)CE*?b)}nZ)cbQ0-yIMp^uosx%`Vte-o(1Co%j`!hs*M4CM)oKy;Kmq*f0~%>Vs_iVrS?kRj zUV^%rkL%sF=d2a|VFD0wOW>|UsMEqQ)P5D6E9gdSTokNhE^U@#82ZqHFc_c@LISFQ zwj{kCh%EoN4fd>Pu=YE_Uzf9=`I}bx(rSqe)K>52;=N2X88#N161tiUZq0GKB6d8z zskc_y!IW;zbGcTK{EtO~_gUK(Ps5HB?WT^G*}9irVPKCl3DnPpEA70!-TXnV z3W{_6j{Rfp%a9-Kixl>?3;X0uY(Rv^n&~E2e8#)97VXujfUSf@U-k6ndoE-4<|fRTRRB45KQK@TAqoSFX23QxqK;mnaenzch^kj*SDzCqCDJ646@Z+299i!p-k64|tI`e9ZOP-@@3QRLQQ3K4U z)~bCt)3~4I^@WEv%>S3Hox5M%)=YwlTlkl4w0fzCb^Y2+OM>ewZWEv2RviZ4LRqii za+oHCUsJ#?Fnusi4d(vs7zOp=X~9sI);k^K^A%}*M5D0l&3~+w@RMW;D-IM-rIz7P z;j?6ub=@{Pb9vRZTSd76&MMkZ+KV7D*iV05z-wt;n}r%^k&^oP{LT(0*mW`glVSpB zV*Y~zIyk%c7P`7!GmZC1K6OQ%_S~Q0)Z!T!(Ailtz_b)^js4hLl^7r0JE(UG(fv#1 z!a5?lmT+B#c`YWpje*tC-E4x34t;Eu;C=%8Y2oW#`NTs}Zd%iSG|jrP0{YP<=3U!m z9zGA|>!Pl5#0EJlXLW2h`?|V_rwyBgtuJ=zkZj%a=eCNNa_>jG;^wLQ(_Xm$q`$|( z`zPsE{#B@`qwMugUpQOW*1&h1dk5R8xulmk-0N^kaJ?C;wwD&*O%S`lO@sc+?hnK- ziQbHNufshLsI=DNRXH)5s-~-4+2pF=aA(E`&T&Vbu6I_4&Tv0XXPJy9=eT$7c!u7t z(;?9D48Py@Trg-=Jt292r0emm(1OEum>H4kg zjf3=7Xzk-Pe4G}JH&^$1g<*Tyx)#@e<*(v9f-V-9x;Nu}4L-nv8w*^FcI|Cp=HKzh zM(j>Nx)wlETEtnWbtqgysLw?b?k%=8g^#h0L6P0=777oQQv=|V8}(^dCE@ZKX{~r3 z3U#%>jZ(D7ON;h7T&EmE_QQ2P2zR|)U;ccoY(lu=u*Mx0rFQ*@K;5L>3H#}y01#ix%$8eh;?g|FccG=6f^U&E_ z;ex^T6TxSdGaMpOK_!)wAX zpQ{}=th#0kygs?zxD7ciWAtO=4z4kV9CZDwV?69|L#@<*L30S7b$a zNDISjGNghZ40a`qcQwcHW?=4T4;x%>t9$vj$?1+UVm%;Cgr|m{ zZjO@+%TpB$UG4+?RSa~y)i**dX`fp)R8>m87JCk{?XX^TWA)2c4S@*w<-&Yseht)d z%_Ab%v6=b56#Z2b>-q{effPvMwBB?U`{^0$#?$!Q1J`k{ok3WA!<`NEr;7LS*(6up zz8?Z$J9i50o9KiOI9L@HzEh>YO3b@(@gjxonIN%o3fJI^?QTdR(zw@0hK zf$6TeAMfRmhHiJj&jxshhhJvEFFCG;h$z0y>%M~ldr|O6NhHn<(;)Q_RMWNe`u7S5F|2q<_f8{avg$22JAlnjY%OQ1OCGMzsX<|8K8^*R~hUg zgXO=>fUQQ`0ebm=RYJJP00ZbhXXxsIbpOql?Y}J+KfYtXSDBMYf9U%gUQf$FD|8F$ z9C+$c2KBhK6~rXZ(|K;9_{t)|8hidvJ7R+Cmv~pB(9pdLarz&6Ivo%2ERVrE|4AuukAzSi#|M z_1eLW3d~>K)-%}&_p7`?)CL(0L~Pi-~TGO=1D|dC^)GA(|}Ff zw7PzFx(?E|!bj)5+Am;Ax4Q;gt>P`GHSSHk0$7~mHse*N7&g|~-eJWD5chURaM`Or z0#~eS_hH5=x}$^^guCIkVIe#x=LGh&DjG4uj*s3WtsCi2PsJGaed=J#8~D9N zNQb@ag14l)e4pxY9mik1#JYY<7?&FsQ=ElQ)cQ_#4}S)J0~567^N!%I4Ar>T5j44K zc(`NO_AtD#;IB`j`F!Yb9dfA0aZe-&7N;CefZes@Ff&6nJ06T`Y|n=I32tDcPD8pF z>-`6)#wuGl_;2Bi8)r|&mEOVxcWxN00oV@@)Q+gP63}!^YKb4WHVmC*y${yQzd#z- z7x?=+yXVFiEd+h#`%I`R5iJo9JrOv&0rx^!w^n>w9LsOwK_8uQ;kLQ^5D*bg*D)R; zNLNy*5jC-R0$xi)oa639LrWrfXM}4ay^e~EbS>+k|Er2vz+(mJPr^<^d%NJ*tl@hOcGqLe#i}Qv ztGH=VW(49XPDywTicjzwCHf3|MFoT<3e=*rM7*d>Y$> zjU>;I1Mck3*$CuwNWBUpSo}>zLRc!@8O!!sv{QB9uuDFjlg?y+UHQ`a6BD~fbxxAQ zP#gT*LBIbOXRfd8zda8gnW>Bzq1cBG9cnMm&$nl0WffpRnP^uA7ug3#MMp%9TUW%THX*EhQAqy_b0HVIeEod zOS1}D!Z|n6_&GD@(DT%}lZW^zv1!F=Uge;|WwdN~>BR{8)(e^#-UTw*?m_l&c&P!r z48WcPPALK{@lZ}-UK+Ew=z7#b&82_#4lfnR>}J{JDgI?XO_l`~vG*i^AK)z`g)8k4 z=kWu)381hj%Z{%N$SD;W{FKBrd>;Xr0mb8I2EO|N{CC4((0UU@6`__)8k~~>FFVLv ziWQ|{@m2*E2`^#D%_>dIS)N}E05pqNR4~Q%xPqd2_(p{r1}`0s0eC+KyhK2RV&Qcp zLgqSnGI*IvNntv~`6=)kmGqq4oZ^*Sr6aF6Cl*>Nk6IAVUI&3M`Ct|mKvMhiw8EUU z^jxS%8emW|`Rd7bc%eoy)P&Y~@?<-_SRudIURaXL>IEbn`bI`JB)MTQ^a23zr{mBd zOINazSpTrYI~3SkIH=__;uGyl(+Y|(fCWu)B+Q9Zl4j41Q~Yk6IXliC>qv5RbzJDK zH_|=_y5V&pMeu5m6)D9l3$m2_!knckh1o?+$jx7op3lUR0+66WESW>`OPoFP#<)3i zB+W21KskHIh8^`xhIb=mba?{bC4sL?fcG{~-Bc~UHwJo$;zt|Fp1;JNpMER6ZUtV5 zVP8^`N8dgIJrwHoA5ug_FM%{rImwCq~<>cn_Fh%TFjOM$m3mop9KKpaOnPP$qHoM5-}o`bIs@mA6$vsSd* zyWAz>X5{1v5l1^}yL2x7-xAaYEjxy_EViyVJQeW_$p2YI(B?Vt!jjuipr1=B!X3-U zJ5@hBe}(ZbXdfIAxdf9&jmcC7kIF=K7>KxT z30$&KMHIH@XqeOeynSH5W^mCp(D4gP^6Xa)9x(>uJ-rPlXzq@1dZ}X>`IUL_b(war zVGUO!0G@sU!Kjg$U6;)WKV@E8;Ru`>>4c4m`4xIN6axhTD9T!vGXiuLM|3f`WJBIL z@Nz1Cy`ZTt{lffkS!Wq}G%}Wd@L+JkVA|qvea3$<2LgciWKDBOeYI z95rz4hvRcNdcyw3a5$#GQ3%JQaJ&u2894l41%DMB6X2K&$8tE;vrOoqSX-wwye zaC`yB?{GxJ3klZ1Q3VISZ}m7Ff50&yNKq!j@hTke!|^p77vNZPg`(8K5!n;!3&*2y zyatB_{;)q1j$}CQhvN}Aj>6#&?R_mASFDL{w?O6wN?8TlBkOnty8ZuKxviHVL%Zb z#*YwEv>Icpq0ZBuHr_A-mMcMc|6uJOW!tK~VeIuHBW+MZnNPI^G*nx*`GSURzVG`| z>$LZMJN!_k-#z}^+%g}R1*~&fAY!qIKqG(k`OyMN-}n6)R4Ce3%QF@z{RPW=mhPp$ zXZgU3(9&!DkN89BNBnmLf`%P|uLbhL_Ckc;a+TY@RofeIB*45}h0?z9KN0|GKM24q zigqEOA`r}}2;3SNu*SQtTLYi)BDA!|z%zkR+L^#ldV+>edYj70O>v5rn zX+@BBp~ns@1b0~11z~Vq(9R$T?hN{*Ck8Q}nxtrrffYTVZ7O;owg`2z(8R!>0{sfQ zjQ_63T~_lNH2xjy2UhUS2i6~~-F@?e^{f}6)*cD^BuGusJ_-6EDBuq7n*9*;qZgrR z@9p_ePtf~N&*yt~*ZX|W7rh8g+u3t#FYvt-%-3%8SA8 z^hRI5)B8ei&~%~qgMBdgV4oNIKBn)_m~x$oC~A^3IQrVtD^g?t(U!B0cZ(BPSn zwf!Ktw%^nJF!t$wd-{Q@J^fD6;HiGUVeD`Hs`_JWRsSvhA-JV~0}VFx-;crl{f}Z0 z&8qGVKC15h4w~~z@1y;}dFUe=F$*G|=mTDT0_=kb7`HF<*^OX#pGFQE`yB0$-I!*W z4H=&84NiR)>$eE%SJ4N&(%9!iJbl>bvpxWy?zgX>x`^jUh8(Z-hR9cX-wCd;Yj^g6 zEVCfXCwTeQ+-Upzx5bZ#pxB94w+FO0j(%{)X zzxIJ{@oS$)!2coIBOyvI}( z1Z$`JoWtO`KKDTj2W$8BeY!6MpYHn@=m^#xL%U%%ysW=I>jRPCuh05CMiW)^y{|90 z_?fQ>;pneeZ^=lgokK+G$UqNU%b{k$R+Z8!F}G_5M+#Sl1s zi#;d}+Nb{mq2QDULcbjV<$OD!eE=O;TKj@=xHcSJ01En7X5SR@c|H`+Mo;n9=gd!UAW2CgoQTQKC*$GAKBJJnToc__K6L; z?^hUv=GbKWhYh^-ldX)vse(LB{2qlh3Vu2#X-CM3t}tAUPmuLc0T^+e12zlQx?*1QG8H1h2g_aJL;h{@Ou548n8Wm9DGs{L|IP!|{BaWu(&?YMccb z4-SMXAEX&Io>Ai&HJ(uu8F9LMbl|fCp=IA3_(M3hXW0<<5F7+Ujtv3Jjt%)@2y5>z zh8#z5d`K$;(11hEW6JYG?i&sz-Zy;9aF%k*@NEdT4S$vaO!@dw=p&C0-8mF0wR7mp zL&5DY58XS|v?4&;JM<6+4-MTi9D`dR8(x;~9(wO^bnrbx9~d6uxo*@wTUMsj)x%fR z;Hds!{Z7bD+xF|BPYuKNVF3E~p`j;-g25+;oidH|oX*kraY51`S@XfJ^;}NWG$0JT5I2G|d1DNsz*sGlw z{z(K>`Zz?O^)16ciU?UPu6CDL{qyimBdFDzMs$pTK6ZA5I|3Td9dRH6>%gL+4x2`7 z8v%9LHe%NZsKc%i5Dj(MG~$U7rWJ~IaKyR@HA7n$@puFVACLHZ1k~a0pag=@l_GXt z3w79eZRbcZxpU;^QM`|BxwbMA=d8CPk4CDq6^(_1w4;%qdxb69=aHQ>yz|=TYoYk+ zsOO^8L`C}nveN-l8ToLexyZCt+Zy=`2w?BwsJ18?)fTmTBpAMXX zBHN-&D;qu!bb%HEoIbRuhoqZ3;I zDB2sNj*Z4)@XhG+qtP-J4$yC}yHwHT5zA?>^ zOluzV%~%NiaNW9S8oMs~Tr`BwMXw(hxLm1w340uNyRF*#aofh@<-Bc7`B=QHmXEC* z3m&f=`xFg6HTD?{J~Q?;3@X~4pwYAV_H+!0nIS@aROgm~5R`J_#IEK51h- zIBH}3mUuoCiVhP z5g$+e*Hjwuq;s3oD*}dA{64T=+ZSIp9W<9sUq7AIYW?($2sTc?hXFEBETh2KoSX9h&xGoxV!Q`j(LOA>%BNzW%S z@O;uC1c#D7WkAvPOs`2WMQ+t<64uW!tq9lF&$wp>h8t$=nTg?dXZM(|Iw9-R%R zvN=_ApxkFbAtri0>Ek3w1Q(v^yJmpp4KqGX!s}26D5F(xnDPA#=yKoB_<06o`+3F( zH$mvp*$uN^O#G|!%yr)R>% za(d>kGeP68GcU}+iKR8^fw|y-2j*5Rfa+B&a4lfYc&Dw)bZ=)y$k~M(wFD8fdIC)&3kCR`3mz^?VMp-xB1(X%~u#(we88DgW$7O`#gE$&E_jCTeXchzX5_T-0R)Eae?^?KbY#P z7d*89jDKpu*9*b;uNR(Ph+VsS!E*~>{(Wx2>4i`iyb{uMvmjmbEl`Q(TWADb*e^V^ z2oxMz^!#E_@ciP#i*Xh_y!aCgezN#08vJVU@f2{}@s#!ypzSG-q|()1YFQf4vb4i# zG*8-@G;r&gv~SWe_)YrRbQl6>)9=i{;GG$+3@FEyaU>IiM>5Z5Qa8htyzs+CVC;vB zj-esP7Ja>l+N^!O=nV2Ri)c!EIbY~n1Rcq>=+GjZX%1nISu_U*Y5G}^{v3@xx9G%T zh&{3R^AwEzJO!#S3#xFE22WyDWzHGv!VReEQ@DHt>l z3_1=LL^5a20}Flv3nI0jQlCr*-#(d+{)rU+!5gW^7CpTPN`HFMZpas{?M`_u1^o0{ z3K|m)6T+e+7=3I}-C{V^QSITN{mT>xo=n*Q+Tmh?+82TLz0erp+TM&7Y>bwS3eXX* zRb(E?#GYQi=-pHtn(snt^NMD;=B7iV&C*`ZIGO>7H5qCff8Sb$}fl(2T)mYN8!%gC2fP9%+O=0wA54cq`(XMO z@HyPh{F?GWDjM|?xQ&jY6N}GbpFFpCZ3?7YpRy18;=Ys?452QX$dz#)m>_b&kUN3N z7eR7p{zW_;;C1OxMI4e(V%sj%4yA+XFd5L~^R%jz`%|E;Ucg-Qw0F~wrbAEs9%~8f znD&%kX<-WV<|i_!mM5_0ixl+=b@1R`x_NM6-=MysgRcnfX%zJ>?z=(l3p{99=c+>k|ES)9j%x` zx`IJOjp~INll^b@pAUMjfaD=jkg%t&*sLh@LIo%Uhd>p2JJmaStqxU`KJk!n4WPc> z6`0Tu%M8(}t^H^{sWpny9}K_RUkB4*H#F2^ypG1(yn+x*Ab2&cnjQ_o0UmcjU|?@G zzSlKShP}6nr$L@FAo5CDhCfyxc40kQsDr|Kfzk<(W3UPu;6FPV1U6m=>8`={^7o$z zVt5}AS?(ddRDZ5$s7EUlG0dZtT0Xol)(R6s+=$+w5{-%gmv|b1x9PRerj%jfk(ag> z`Yp<-ma8G?-H}d(xp|bgD(2nMU74|2#z2eG_8E&!bC=rhP8Aef*OhM)>r~OBy$l$K z?LPM^(dyUx)7}FwXXDv)>^`ix38=rz^cx@r_D!!86T1we>1Y(zXOgGy=~(L+k0u&) zaD!-IvQyzzzp={%WQQ+dx=2)ailp0M* zN6*Jc1S-98RpEudFaX)dq!f-6GACm-AI&sI^HEKsH6M%FtZSNC(=2A)qUzT}8hsXg znGHiV7J*<c${nP%UOXMfY|xp)pR&EACPK-26;;jH*3;MaZdr9T8; zeyB`;0>1ovg#`3?2Lvrb2?%0>7H|dr`b3Mc1oUJ=kYcv_Xgp zOHl%qflxJd{`Y2O7$)eU+-XvV;U8A^P;b&0vzqT|R^v5g#EE$@SD5dqSEp%8#2E+# zr9l?8KPrN|91W6f%>lV*nf4br^)ju5Z@~5H);mE`g5HBK6ZI+HcFg^RMMEz7zxV|A z#{Z1Q40}rI$UbV4=?(=p|4c=YsBd3=)QxZsLBm4cx(>e3cOl3Wy&hmc{9RNJ&HsG= zK&>IrSfqu9bill8q-siN{~j)QOeT7 zL&H8oX^9pYdi9SeE!Cn!!vmmy8QEG)=+HqZ{A(0zwV{)PP%6>tLSu)Zv|OtXoiY`r6X6sxps)mA(l#f@5l zYFj=H#Z6kNYAaoaVzpML+HU_ViuY)hs%@1E#e21C)wbqA6gO)%s;%rP6z|h&Roh)V zQM_NPQ*CSCMDYQwUbU@z55)(y2Gv&iIf^w}qiVam1I355Ce^m#7Ze}XnpN9I9|Gdv zv=-G?Jq*PyTB~ZicN~h3Xl<(PzNsias&%Ti2j-%&5~_>>lIvORec#izAMlkI8W0U&PEqD{8C zu_)GQF(%tHi&6Z$<}}&1=c4$GmT0o=xE;l3wPcg6z7oalTB^zR;GgS>$NhI?Uk=ld_k);+4dL%L3~lGHrZYuh2l=F#$;=}1;t(P zl*_g^2gR4PI+Jbx3KVy1^(NcF3KU<~8cepP%_uf#jV9aMkD>Svt;uA2_jMFs(V9)R z=1)<4RckTXK4?dAkJf6kefTqquW4;2+sC>c#MiY>ldYu}if?G=O}2jyLa|X(%(l<2 zMe$9Tl5JnyfZ|>)$ZTt!j^aKo#BBTOW)$~pcC+ooQWOtp;bz;(5)=<=k!D+4If{q0 zXtV9Rdr)lBV$8NvTTy&VbDC}6KZoMmTB6z3*^J^lTC&-8_6rmbYpG`2PwF5L-_^3s zwsQkfJfantZRbaz_?}j3w*5LD#b&L{Y`Xv#B*l1Nt2EpGn2+KITD6%dY8J{zwHh-q zsl_ONsMVT@rk11pkyd9WhI%i`A8YkyVo@JM`4g?dO#IY(lv}h$GYL@NK>3)~WF|e- zBPjndUz)mqG?r+NzI&$L!E308kY`E#w!O!}yPSAzV7)@ddoYCn{ZYv;|R zzZ#8ltEOlKHiJ?AQnP4efVv9hue2bI*wqJ7{#pys$d&4Dluu}OjfANOQ2s^>*T~iC zhbW)aA~h1OevR_CTC_%ns%KGd(_%C-Tve|Exm|N=Bto^J{GFDlkw|qI${kv=Mnh;#uc7?CR-lpb>hCE3pp|N5qB=PY5D}JT(*L3tFp2lGP%Vf7jYHvOv8H zD9R>1NGF-<1(eNth)$NMeXj;t z)9pIRR;TSqQ~f@Kz$r#U)`ybLiGid{q#hg z6swIW`|HU%S+2f^a)6$ylT!5ylmqo_o!qXTM!APxpp#YV1(dCNsZQ3Y{?~vUq?hTW zOzn^I6?&yk?ox-K+*7aC$yzlUNb@7=}kJhS8YbQzuv5q`_$tohw3dlc|iRhWt-lrlN$AR zl!@M^lZRCj4)OrKQzu*0;V2K(&+Ft-bv(*;9n#gR(@-9yTMY8JdNayb>Ols1Qq4yB zDm}y?Pph!`r5Itl-5_=9I+O?N;Rbm|y&vVP^+Nb?G*P9J;LEVk= zc)i6Sf2apgo}jlHL@|AX@(p^MK}@EfP@brF8bmXhhl4yxKW`Aj)Dz_xUGX6n(;$=` zy2Xe1nIci1tOxm!0MjItZ`4D4NDoss%CWlLhrmw(P>$2XeMnE!I+UmAkv=5YbU(^d z^=Kc`$Mhu1PCdqlgqU`s9IrclNPp8_l&9&5KE!7F66NW7vJV+x>O?s~PxT>o(?yhL z=-EExN>h&!Am5}H_>eFYL3yTL>O-zJO+h(PFY_VcrnxB3(kp$)P}5We^}5|cZent! z9&RBsnS8e%X(5SB-k?WY$Sfvr)MG4UHj}G$r-jU6^1XVZg(NX~vz}}rb4{P%Qs;g> z)k5Ym`2juKLgq91LA}62l9^nims-fptnLr#Wfro4$q(ymE#wv^KcZJ!$U-JRs&BB6 zMNHnRS6j$pCfDlsSxAbh9_OOR^co9EHDzL-d{VEqkTjO&X}!)u(wV$X-)=G zEhLk**WdMB7Lvu}XZ4pXWC@eE>$@#vDU+YmU$&5J)<)0k4HlBa^wjH(7IG_-U(okk z$Zbr1QE#%4Tqf_-4_nAGChyXlEhLZ0yY&w(B;S;SHvdC!v5@6VenoG!kQJtS6~&-Nu9j33tve90*$ zf2o)HlG7~B3BAmhe9!9jtzPL%eqd?7)2n?+CzCt$8eejT$*1&MUvieor}a8t@}p@q z?1&hhdc7|(%%P(|KBG7I5?}Lhlz-A2eTkjP|I(X$$sqHz(ZJ8?&AwzPlYiD*e916# z9rE*ft1pQ)({cKn-sVf<%yjU*^gv0ImB4#N3vMG`WdNyWC@e|8)<%IDU(BubU%{KWSf!UM{-zRVr2S} zTg|jx>_)a9xsBC*kWt`Aa#bWwo&R&o@DY|qs*T?#pHQLr9XL^$@7hBf3l6q z$wrMosbliZMy)^jyZIHojw~?h{K+$Bx|UdE)cccX%@gtZm}xZllkMgsXwOok(Vy%v ze}!_k(d19+&Hm9K=NQfYa?t!M%FB)D0Mf+d6-G<|d5g)VhBJV?ZSFq~(yTNR1IS@!!|g_L z0D0FOi~O%fY5;kU*}2Nd4j|1e&1$0{fV|J-HAZOw`GCoH7-a$ED64y!Q5ir!Wc*H} zI)Hq{^xS3C1dxx-b5MV|Q5!&7%;_kvHR=M$KUw+;qdtIqYF>qWozW0LK4*E?8;t?v z3$q(}rO^~XzGQ8*$!HEBUzxu}ey`CIKu(y?p}g5>4In4YxZ7;pXS4;7HuETy?>9OF z$am(+DAyS01IQ`!ER-KIltA*mxe(=t4ND;DG~bKz-;AI@a@PD9%3F+(K=PCMZImA| z?1AK*`FoTfHNpeQd9!Ui$XkubK=P|O2IX2KI*?p2--7aEMob|2!+bl+j~mWFqG;3c zUi&E{F_5Sl?Qc&T$$`YAeU5yaks3(MjMo|2fkb2c??yo&(X}h_p86T1G>{k?m;jqs zMp+>7Vd=LUm4U>f-Hm#lGpYlLFXKCmnn2>m`13|>An|9s-lz*C0UGW9JB|84Mel@- z;sL+FS3hHnc_3bF*gi8}f)pJma=jOb18ndWYK-+xg4Tp!x)8k1DEfFz7Ykp+xXwEr zO+pi+Iz`XGbh+>~(1`X<*IggmuSWVAktlAHrei;+Y1F1gzQuHf;4d@SFLyQ~DcIq5OzZ&7S z@HNbsC|5zzV@2!;W0F~)jUiNUtr26^Q!$hSUr~m`E2pBb#E84#Ym_k=%5j0D=xBnz z8DqA<*BIkQFT)jmJ4U<&U)LG2Ub<*=@W%u1iM->CIJ5q_2#q(UnDq`3y1|%g)_)P9 zNruy``}F5#I*fR;-Wx*$;OjK-vJ*b=N}@MNh!kx$rgB znBiqOYa_3YQ;g|W!&kglGN<2wzK$MP6=I z^hYrQi_0+W?8Cd=(iP-a1&$D2%-xzDkTt@5W=XGch(9zE&7Zy<=%tVMz)x2^PK5$TsU` z7{W&StC3^YH;TB`#;s<3iwNCe+-BCF5urPcT(jOFLgmIXvwjdmsHMWlGwUCU(0U`^ ztbc_ebhXPUFzcNd!XE54{$keu5TPog(5wf*BZdLJ;cJso#D_i`TXa@o)<)%dGfe@}!SGgiU)7oq>h-kXON(S7e(&#n-oL)jV?UYhI-mN~sZ*!cuI`y!>z{=FPtuP#UFWX~E6X<; z<9OE5yE{%d_^aEbXdaWt5qUCBH~DKalQI4ij|y?Kf3osUB#HXPE&f{Nt+vu_{yOEI zP0~d;-Qk}qHSUMf@~D10QD}_0%RfbVkB~&Qd5`}W&`*@&gymXLgi%@aNO(uMc6mD(wqLp z%G--1V!rKfQr;+%sAa$FU!uH8BvA?9_b*l6ERv`WKJ+hF-ti>S?Dw&Mh4SjG^ohS& zdCRTznSZ77){{gt?C1Vf%Dc!)JN>Jbx5YBQ@~=_eog_Vk(>MOL()0T{C^(%Q?^VR= zY`^ojDDPvEzQpMV|2mmKSN#O=9nZ%@pWYpD`pLgRQcP@riY42A_HR_)2$HBwzxp>R zuhdGv`TwK5L#_0?f3xzAwbCE{R^^=lsV}8-UH=y4EhCYXD%Zai<+rh(>))oli*0N> z*S{V0Z^ibme~0q!v0}FC->JN(tk}Wz?^52&R_y5dcVqmsVkg(XM|s~_v5V{9t2_sf znzU7Uu798MI+93Mb$9*imDiiZfjISW{c7nLGZ>Di=!0!+#Ho+#KWIl?Q;nBX)b(_7{fA`kG@CfyLli>`t%U1uQ{J;y9N_v7 zEALG!?(O=Ip#NKOkn2B+`JY6}wb1n+Q=XrIn2Xa;*MHm^VRGq9QF=M&`cEjYn8f{X z8sYj+S|+Xc^Y_;jxnzPwDO)H@j0CKbN#Sr1?BBcBDI&pT>nMo?L%TIPIFxUC0R|nxW>Yx zi9@UP!(IPn<<(jZN4owi%3Es1qg?-0<(+25V_g3=jDJ=<&h=kc-gP8WM<{dsHed5f7{lq(b3CBEpYvJ zlvhaNXq;+Y|6R*8N)Dtbnz$Fa{(H(hoWwGm>Rtc+-7?o!>cN+W3ddVV?6Yxdbo~!@ zW1F^f192WIaGVoe|3l^7OClNF;`$#c?`aarvR2ps80$YPE^+-G82_!f%=JG}-uG5q z;rgE{&)pkoX~a9p^*>WyE{UXSwd?;&d3~&Svg?1Yydq0p=lWk@{ZAsbic?*GC)R(K ze46Wjsk~!Iq-r|d^}oXSPa@fTrt5!=@t?$XIGyeK-|SXuwk;&KZ*C^ zw9)my+bxN9t4a4N5vir0@A}^>ZwHBF=7p~RgYtf`u@}4kkIIYS!AIX5oGx+wpKP^K z1KlrWe@G;c+~E4Vly@eHRN9+d|99nGO5zrrUUvQeTD#~ejpN;ebB{-GddY3y zuHTF98|{WCZg$B5?M6C@tuD2hcKgH}6p-J-+_qm@90ycSm;sN&?3LUsG@u0C~ zYE$AN6FNAV*yjF7vD20&9&vxC&>?FQkGT;%m2P+F+QbuXI||KQmw3v}r_f>R6MuF4 zQRt`*iS2G7g^t;jc-9?Bp<}N~JZEw{?#9GFTpEbm9e;b`d3+@Tp|blE|1|l|e=PBW zJC0IRJmq*_BHRA=yB>M22Q4BWc4M0&kGkz5k;h%%9dH;D@6`ot*V+3?H`dPE6XAhR zyX^`!`)_XS60aCg|7TopEM5OD(safBKd`<>;Pk5N|FK*9JP6u(m!g%3)F5AXeJARj zLL#+;H(^E8JD*qwh!%3u`|DEf1h{>G{p|J4d~TNTibf?)qJ#-m@gWg3}+aUt{}=?#E^{ z|AOLa2z4WV*Qoa^iPTe7#LtU*u^|wt1YX4N7WKN5NPV$g#P1&U_9Bti`0XQpe$*Rn zW3wZEkEl19#6xlF5b=9P#irs6s&X+d)mvi6h`&eFTS+2i(kbHiih5^Su}cImJb0Iq zNOux>5x;lTyNN^^)4E6eK2h&}OYRZz3!>iNNPH2eJtBTzX@VIrKDF#UBYwZA_mgG! ziTH`A7saDcZAagT-#_YgA(3d96a5s**oIz9rcbT zkya>!BL2XrM;xyKnAd_+kCiyJMzV7HB_jn{exgag?~oO95+~}XpIPl=iRQ@7AZ2Cc zCR$7=JKymrop%pucm$_ak*scm24=+*OZ79~tXwCt%%txWODs2`&N+z{Ce$T2vC?Sj znx8nygz^d;5AReved9Q-ho{xx(;@@??yB(Q2yN~8`FL4+txoUvP_e>wCfHNu6rN(9 zsqUe23r{t{UMj!vFXl=2o(hVOBgG4F+8)WC>JI)}WJC5amlbE@|CtsVW3xxNvBI;o z;_Q)bPT|=mILgf}JSS2&3~zsrcJm7_(s^X>;}#TN9C@11G48;^`}D)v?6Gcf;r%AK zuRFHz0mI$TEiHV|C>!TaEqurXOWYZS+w}9fYrx@Q#r)dUZ6&vd*K zVR_#bI9(XYE^-H75Gl^y%Pl{XO z68VgR*$Cbd$;QL^oE$WP9s>bh9?AKz-(}GLZsL*%%{MvkJBdq8=!2NkV+J@^MRGpv zcO^I>n)qCnxbg5gI&m{*C;<1?Toi&aQs9f%A*y z{KrY$YHa*1=Jd@&sqcy8D7W9;ApLGl`@<<@(;PQic&D+_MHSs;f)O_d^B>aoI2@-P zkq&$I`#4hEp(tT0t3$DqcrmgSQ5}ZI67T9X9Y*9P-ZP<*T@&w{(5U>x2PQPSSK>q6 ziaYF6kod@i#-N(-fD-Rs%IQ&@-idS=((moa)DC?TFX>k$I`nlCFB=X0Vmz#LNaQA7 zFs?oJ&B6(`;_*x<2=w@j$8)baMk zdk{S);pD0KW&NURLwq3@HonM7nD?~e4Y7oIODo=(lQ8dG#hY^z=8da(OV`AYI^%dU zKk<`R9baCM__qnI7?}83n-E`FocP6HtHvgNHKCJB6aO)xQ>G?4C3cz6hIxtK zP1^J3C;n?f=PykBq3bz*VN=4<&x+$0Els#4bn%)*M88`Q-?ToVOz4u+9j^edb@Uj7 zQ%q(5+P@vvzXa@uQy^-(J|XeWGNlWiLoy_cF0YbuG=x5pUBov z)F1j15jL9BYF!3iq|aS%v%A;M~G-x;C=A zW5Ox1!TE*b)lZahJ|>*~4cf!qP&mN`Hx-)3o88mBs<2eKc&j3N5BJ8xiMj%^d%1Vo z$zV_SE=+o~+{o_j-t7#a^_O1NM?~0j2GFgd#t}ZuhO->6GgSBOh11c>@1zDFrN;X0 zg4IBKtOgFzMe(z+8aUJhv#}bOX@WUe4b0L;`yH?vI83dCCO@tU3Xe3wj%r}xJarqP zxvJRlPDZH588{uG;_-fmtK4||#B8lAj{Y>qgmR*ZxmszwL(K8WIPU>U_XJLVQSoc~ zovQNVSJ?6AN++?-q`NAXI7Po16u&wb_dj6w{WngRDL<+PU#jN$-$(2^=SMWob4?k3 zLgU6mB%ZpV3awGq2A4f_8eo3GPBWy}-O!^xw$9!V69Ck4SOhMdo!HM~yAK z*aTfwTDZvsBWh~lCA#W-rDi$aX=6~D4LD)*yJx>ERe{%qOXKC)HJ#Tj#w$6mdrsmC zMPCi`@^cfLwIyB;tPW{4>b(rS@4GnNqWqHRP>p>?*mpSHru-Rl5vy0{!O8J*$AZ`s zr#qBCy=@{X#Q3j?SdZVO{P9t5Dv7j9aF6n*MZF_Qq#K6&ls_Tr)sRSg-w!B%YSe2b zaWzg4D}PF~kIp`Lj%;oi=#@3TTfCOox8U@+@(+oo9!IC{3HjO3b3}X%rze$vs3cNT zXU@08p?$rlm49&5`-8;x`#R3wlz*VT+Y)hp2XX6`a$`_cPppfS)jt=`8N^Y#OWvHkC06O zkloPwfjGb8^t19uN@cpuX=VCk?&|uE1G^BXUzI;fx`m>-g-#*POq_mG{%90eC#M|o z{Ewne!0C78@59NpEhc)kP5FoN$3%-dMkA+C#IRfhwjvJSkUjNW0QiRNshde*d%B^; zPb{GAxJQ1eoH22QFR_lHwiJ){gG|Ze9=^^xhFodC&bqJsI_rMH*IB)uq;qmR{t{~^ z_xNRy<+oT*hY@}UVohs@Z?T>S5v3{;Y|hFVSjh2Z`)MiQ^J+#^7g6j~E8;9YNk3+a>DEBO{#Rj-4Wu|Cp##8IK{p zQhT>Od|JsqeayqRf~(1m`;wLT6;rQEmbNsTEHw@>|HY_oceg#}U8&u+U#I!t>Mt4N z8^_I5MY-ibI_p|Vwlf~CC1j2Ml5whjpyFiU=qtLYU39@rvAbFqhuo1T3!gU{_i)|d zM(h)64c*gX$yxalLDluJdd=6A$90Y74$!N2GY;#jEAF``TbaqX>++FROyJ!Ezo=|vf?Ot07fz-)XmPn)1gy@_;EI*F|BvzxjC zYk$fw&iKiGc{@F-k)66API2Gsb@lHXb=JpoQHJ%p`a6A#5DhZ%&fjyWqzlS*29+z9 zT0y_LR3YcK@8r(Wh3jgX0!1ZOQ`CjoHYzU_)&F3Mx-^LDmU78}-O8|68bZ$4TRLN4 z8y+KP3`$Ez$lwfaE8LAaBm;BkZp@-Igp3;|jYFqRd0yAu@ZAu66+T>>PVvaE;UM?O z{i4pb@$NHmrluCppM?-rUA)I(2f9Ue4VCw5m3^S{-U}#s0jm98UG06L@?Nd7A5`j4NdhYG*DCwZi8>F_o9871 z=0=?dG`1JAF|m6eZn1$!*wCOOZS3HAQRhKgnT)t^B8IrUzv8?Pm47j{X5FSuGpC3# zL4+Rs^bZA$%!|e!*0T^<;EX@PAKgx`bb_|b4SH-`m$oG8{1z`nX@AqD9fH#Srb{~% zrTtBpwg{#DO_z2UN~=R9#V9S!mQKlVl+1)ipcE!F5+yUCQ7F%UDgV67CZVSXH3?g( z87xKwm1IAP(7jqjJb)DAC}JZf2wQffa7K2EcIuoeln#+Crex!~NBu8j+6AdH>s1dC zo&8H(k6O<7s58(d)`Zb0=|Gpb6ZScZP-;LE#vE-4rDNfq!7lk{;xYI|2%ReL_Q~+B zZOV^A*xw5OgfPJh??WhM0psOF*}5mWb0z^hAQe5?Ci@!6rdZ*32nW)SLeLb4iPFg< zb7Cy(bH`B%r*dv-VUdHS8m1=_r^or(;lks{L z8N{0v;>bOtxp!)enwB&9@cB5qNA8amg*#ziG|EcdD5ubR=m=->k<(Ew_s9uRr@@`D zAEFyfn;lm~LDExNax7L1E`7P8bo_BqJO`%|mF|Ch)M+w=3FxdGES;LTs(x`Km zJ7FSBKFgRq2_~OqEII&oZZLLEhMngabPDX`;DNC7Ty1CGRv2__${@5kZP0Pf_`CgM zcgy_vgdX4~M)Bx)!a>OVCY^cd)L9W{t4kGDdhlUEaN6u3IK3?D++s|c0XxhyI+#&IOp4Dxw=>bS;l=%%$sWJ&l>$ z8Ie0pa!sk+(L{`$RHG+SnaF+vQD)6rArw10*A{(F>bzT1T7uG2vsrA?>t-{MI2(}( zd^OfA<(J3;X+=xhP(-W1WxFw#OGKNpLZ4Ua^GRCUsx+5qSHLCOHO3{v8C2-iWL!{a zt!Ry_FDIMJT609OcWCOG1_LmcNkSC1m+Q?@Dp=h1rO0=C&K$u5LsyH(I! zsc0AJq;zX-+AB5fi#3^ku4=Bn={7NS$Zr$Hm|wF>C83B*bOf#TMT%1qacM|DkuPgQ z%ZN)5ak-mEmn+&xv)N?eG|q<*BM{qzw8IMn9lgG{hW5e>O)VcJgaW?yM&hS&bWf8e@b}z9oIMNpBe_o|Jy$( zq}Cb#lD~gglEY!Tk_(f_voTs52=t;W)IdN&4A;>GAWUj`?+g(lWFy6V#3B zMika89jKk$q>G-ucK9FH+5cwup(rVyf{hmaL}J2xC_lm|FE5WeN9jj%r4rnYCU>j&FyPD0HwSO5vI|P1nq81Gte=B?g4a^UK-Fz z{Ir|ydiMs&X|Z>omR6x8=ON|&kPfqn4D>)6O(<(gveB%rg0GW zQ9$#;OBmulrn%g1%|!lqChilOi_Mah-X}A0pVHislKXTf?q4-GC<590w@lpanmbzR zeI^t4SFfM)CM_RzZNt#oBn(Qj+6*+vg?p)HMf z5Ro$DT}bnETb~_n#k3jnUO;{n())o#IeY*~*g^CU0|L=MvXb7c{}@s@4`=@!ZX`-m z%G9W{&3LU2zT9SfS&u!PZQ6ko8cv`fjW-h-7X{p=I!icEZG6XB7!5_DF`mb9LDG}Y@Ts& z`H4Yr1;!hL(k{~zx*U0vj-aR)rw9J@z@HxY(*u8c;7485z@TUj<^uV7U z_|pS_dfRd39ORS=`dl z)QogBPFYzCJ`MQP)F*K+Z*mqil{MDXv{WZk>L`nv0B%I7YU&!7l$AFxz^A(0X|7&S z)>6K>+DK((i_6REYFm9;0h^k(iCdlXps4pk;4BLurQ35TNRJ}Ast1DjsJB$$=PDRd{IY;Zq)quw0 zvf75Sx+X^oHo9q66&lgs;X^JMp?U&n4+y1P^y#F zlq+IQh$C9d>!{W#CJ36Sn&xVa^VNV0s*`2q4ar*6*MjN>CtXZYOfe`{he8pR&E+i% zby^*(MM0^6@}}g%y4w2Mq+v-UjfjTU*j!WFjJBgQt0+q$X~gDMbO5GMSVT6qHdM8g zC2JQfOjb7=P8uYrXw8et%9Cipb*-!}4N6f_?PU$+^@e1Hv}iPHv^g@#G!fh03_{gc zmR#0k6$G->p}~|brqYdZVH)*<7S7E!jg}ON>YfIS)+9z4O-n;k#OkJ&3LQ^@G`Pyb zRcUZ_oyE~Cb&A~ki(R4^^7sk%AY+8pG=VmhUEabu9aiG);iZGBTSMj@@8!y>Yw zrnaFr$+0Y?qU*}*E2_$MQWF$WjY}#TO$>!ZL=*aY6;~z(UM-|W2Q2}y6i!9XXl`6$ z>P3fA5%uM!c(|s4WfjX(nNcLmlC-p}u6i*$zP_BLG=lb+E(_vA?yIkDDqBD!J?e?W zA}t1~TFefW#)0*Ln4(YtQziydig2iD@TS;SNJTePFKEW>Xfm*Zh;D3HUftYiQa3D5 zMI74LTuZ|=O&6?NB4J|Sc$1DqK}p4?M>JNPP*y?1gLY3KrBVW_u1wZ)^9v+FAS+Y; z(I$pk3}JT6F!=}|T@$QJjWd+a0x4Qkd2_P1ye?H~5)d@%M73B2P`&FW0YOAJSDOWe zj%H!^XpF~A#`#Um(TF70)`!O$m?p6_azm2FC1VsVN=Oofmg?53#>&PP9^9HzvLIn7 zO-+bwT{@OdP8<77)}W`M=?TQB(FA6A`oNE;iMW7#AJE0)l_kd4u+$Wut`^# zi6${cN!Hd^H?}4neUm}s2Lpo9n8cufX}MXG3R27*#4Ur)GO0OQPLW!hc(SHI z3P$5Bt3X?;G%YeErcEyCNFQ^(wqlqrnMt8y; zRz+irnIJiwN=>(iG;#-1kIrc~)FfC~-cmN{z*!DoQ{cQA2Wt>l1J<^b(M=ROS3Ml> zq>Cv^>ehf5ffNubY8%R%mr-&PN=4X(v{}s)Aq@$Lyvo%*04yN}l&b2A)&-P@4g_#b zHEyoxMi?Nu^SQ)>3$J+p;$1169_>x)?c;t z6r}?J+)z$y2&x)H1wtsADk+GTHHB4^POoD*9Hgbu3iqbw77fXz9FVX8D6!O9jK_uONqpwi591NlY z_v=6aw>IdNTy+(t34~O1OSPUefc7N3(Z#pqQj#d z$py)7h$QMZT-93NQ|$VdbT-)%zz(`kBHe(ic%Jfx$ zhs>H|Py_@_JztZ9Uauvr?91z0OpFPOG^WFAp4gN@Z^eXc8qFyJ*A&PTqE4XaMiHgAp-gsWM@qLIO*OLJwAvjKT2SM9)5=V&nwkc+ zK{b0yX;clRsOC0X+h&5{D6D%ay@|AU8jP5=x)fyUV5^H21agXGCU{aHW_S|y_LL2z z_<*alHVUM{*d<}Q-JW6*oz=z!{g$K5=86>3RNCDuCZz3NSxoO7NXw;4D^jp1(K!ZEDiwC~v6v=}IwT^@c9w~fTU*4X9W1`4QkdnA zfwAyOi_n`6oJ4L)X*M?P>P;MlL^|HBG9^xg1eMz8gQj()0s${u%fjlMI^yS=%+q` zii+~eMXgOKrjFIr`ts&QSWD}CP1q^J^Ql@qd7?5lG;#q(IAx7>RrUc?83pjXs;sh= zHhA=7qTqp6%R($4oU+AwU13wm=U-)-0c-KpY2xhJ6OSsJbMVnq%H|$5Yf4#}gO*;o zNZUgJ%7mYK=}h+-rL)CiqjE8#;MGbSUQ%0CT~<||EH_R}N%R;6)1-d%h2pSe@^31y z8ts_%HWs3-E!9;hDYPDV@Qf*rKBa2e)M%=ng`Suhs{or6l4mlxlQLm zDg;FoHj#89yNSdCcS*5{WLbKnUJ5B?dhu&EN{EmW(q(A$EL1vdCF(+n5|Ak|Nrz7}Aus3!?#jn;L{tsq|(F;i=6OE!mqQogTS#@1GwzaDqDHshH z>}Y3`p2XADfM#gMJ)aFo821(T|vbeQLphiN{3}Cz85h}BbaDx-!5pVuf|hOdNl&uh<0hxTJNBvxA24b7N`0| z40701$L1m5{-epYI0qj(x26?O9jk{sEv@xs`W*zFkb`D^!JZbqoPfsF+FXenQru_L z985bJ*uKPu2Na|vteI=6-ss74Ls?@3HsF&E4Kdhmpc@V|rDiL`%mIx{@G^%(EiAQS0N3omI;4Pu=nDG5uGtT^k{Qde91u@_ZJbkq*D+}L zHV=erTI&RT^wVW4(U00Pm^P)seLt!BxuU zhJ&78QI8>(gGs#^)oC_`%@(iTAGUZ!%Mv`KG!Z5Yb20quJ#Q>C%_N6G#f+cuMRR$w zdcm>)(A!XUD>XHHVWZl(*MYmyG9R)D0n_di&Dcb7^{AbxpF& znKX0ejG&#R9!u!{Yxc$X;dN^76tC|D8)?`qF^}QQb2fW#VG3=Vl5S#n@rNEs;~fJu zIh^p?2bO`@=Uu2nLBO^+YU|WAH3f?%M=zZ8D?yH4!I?Zvf$GZf!Ud@?B3RM-f zY-&L-bacoh*1-m}7#*OMpAIzPVQy^;wIteVpl6lMn9xNK`Zck|q1i$259$Zcy5s7e zWZE*?2X;S_3#+mEGB*>r-!lPFv5Ks1(JLH!7>6-}GO+;~pl0BuB=qd&WObDeHZ5+f z#X^kMy!c>6cG#Smv*#k&a3>YgBr#hyoT7~gXi!4Bup}BmFJuu57nE>#iaj!5 zkJPF(ImmKU5Iai8>IWorO3QI{z#6StBlI~vpM3((K4iowwnQ5S=E#&qV*+L>glVd} zNqa|kSsl_XZ4QREa`WK3xjNZQ!z)qEYF~$Rqe0I$5Ct@XDx&B44!W$VDg^kBOIL-H zY{tzIw&ZD4s9ac$WqDO?GajIn={7*Mm>$qgrK)zZQ&YRNx=ObZl#{wLOsWj7b&Vz$ z;CdWK1JKP2O~O2&Iq2|7Xbrqzhi5Ptp;IhqY_7ue!kg5@2@=#-*H_S8j9t#KJjWD+ zr9;Y_nlNh99yOWH7s|)ZEc8r+p4-6>CND$|x0uOdVQrIR^ikg-U3l)_+Cre~1)gH^LGCN(pv!4?y*7lZnw>1K1loN>!P z5q4wqPtTGxwva^Q170{}i3XaKq??hBqw#<^^jaV|djEi~gwvI9#KSEl(gh}&1M;h5pNV~Mkgv}FEB4Eg-2Z@v>m{HLXP4hc^mbuQD$?_zc z;ukqH_)5<^(DL-$fJBw$xH+H)AXJ|)roOzPd;!{1ZHu0LoWmzkXQBZcZEVscDwR1m zH#R1@R8&6wnxWaqf)*`TlAkC-2T-AC=DJ7H_J8%_+D4SyBqXg`0|m5Vt**WiFIHhu zfLnB=3noh=>PZr?zS5~>No^9{8NQ_V{IF8N>Ocq6B5SLbQqx1lqf6)zn9U}{D*=tp zu3T1$h1db+a;Ui+VlD@p{*+u;+d>NqDhyrm(MbtM1H!{WQ%)1as>|%v*Dgk@D#wE- zr)=h=X(%HVIu)Xs+l(w|YIy9brz12|dI`zgBVlX z*kJtMTum<#nc)z%HA~+qAAq-99NY;sRyFG8*xH0`27axsS5=GhL8E<&~9q z2NiQ8zb$BY25HQxFUPphP)$LMrg(FSLV96A2*10CV9?pMkMs)^2$@cY0Gtqnbwve| zUexNLMZ4GD$?JFekgyWFeT|KE^u&eYS=0@W#NgH6nFn&TE+(ST(|L-9(29Ae8JleM zrkz1e{(AU9*Dsq~U6(A^<6hhT2!s^y$EUaoPjc6uP z6Q-9E5VC7pY<*QV@*G5WYsg{ zu9}D}sGhWbswf?pc_4JRFa=9bURhHdb@8xF#+ElXmoLLARNwq)fy25k%2E_kkS?J; zU>K<_{Ru0SKgi{CKI{OL6Ga_nxAfdX14Q!KqN zP72{OYK3XabOcr>dJTXgRZ%o@5NT*^5{XQTR*V{W3!d&Pb<2i&6qwqJ1z|b{0?OAS zI%}ibl!3}bAH&kaq2;Dho6*wfC7)pwOJ!yv$vWJIU{JOW(rbLpqn*^*Q|Azc8JZao z%qX1F!+uVgg)Y`$%SKv|2PH-cjM+M#7BsXtgJl(M1N^m)GzC%*HwV&ynZ>*`3$k%n zU=7_K*H&T%uA^lKk@b2W6A?xiNVIY?U-%$N&q*|V2ZCAZk%;cZ_jx3gW1_@TMbCDc zU0qXye5xBNmkH0M^q5X%qcB^V7N#>ysWp{m?;NIwR~WZkI!g%Pv`t6~T5Sk#xd zETSv(Xx_vAI_ij~M!Kd&@Lmt1Oo$`V1>i2zBy?Y`#Kr~<@r!FPvG5nA%!9U?nz~ke zw?)IcBcW;3;@eTJN!+I5R!HBF&^XU~wpIEz2W_FYX4%XGhtq8uS{mK{;ntEv`iAyM zdK`!KjM*~L((EY{X9$tDmYkZ(I(jpZ)?nz?bi1P0f|$`LEj0}6FYBq_3TC0Nd$CrC zq?HTlK^fg)(mDe(X%a2$2(#lyD&UNRX?JNN-#VhWja6k3Z3;|lSWeqbLZEcdQU<*^ z;c=eM+N@K`@J+ZD`(mkmO`Ac!bwq*%$%RxTG{%PIPJMlu+5W94Z)m_mC6McrOUo*o ztIG70qzgo4HrA8P^fj`{N0v>TI|VBZ^C+-vpHaI(V|PPFj={d##}fjOmn6+^cZi@7R?$Dzf8|s!h4QTO6+9@~$(-c}Jo&lP^2?z@hG+@1*fV&{N=UnEH z7G0vM#zRRnGNz}w&LM~B?GGJB(gy60)HYPswN_PQ%}NRMJJ02af{k^wcUX^rvuKf1 z*UtRB*Z-35r2c8+X@$F17(b zu{#QQFOKU2*_jm2ofOZX7%w;|zQ$h{Jx84zQ871OFfpF5qhb?*SVc+)!nEbna7Z`(zvXP|$`uG>Vv20w#! z(7(ND)6O-nY*gw}udP;vaRlX@4;7cQKKhp(ZRiX20oAWfb(uN=ROV&k2+p=b$o1tH^@(VYONRd zV|}B_%TjwJ5!F%Eto4+SXh%)o?yIpiUi+*_O*hZ?OVs2VuamDHcS^i$zsAe+7kDv0 zR-hhPUF5a%)ss$%uO40<+aa^+rA~ydcF3xmzYX-Y>i*R=#C`@^y2d{7)xE2eCc$a$ zS{M*lQ?`41fS;fAvP!)6{xDzNwR)cC`D*+;FCH1(#aELy2Pu5@>#FTY=KAUtCsyP+ zzS_Eahp%3DHhBHAmY^s#DEALu7hL@kZ%=<1G!>~W&mbz+^pJwFCi;~(Ow*f7tD z^ha5t(b-pP+!C)hoa@!7HLGhVyGTDYlNg+Q)#@GI0AHp0Hz3yAq$)wHSOa^sQ>L*~;I%Fw>NMn)5~PWBG45DPHVsaq<0N3n zn=s_ZRk{(K4MX-chWr4ezdGBEEOWg*;e@rwgfKMMbKGfYH#@v8kfu?tGtx5UD%Dj% znGWMRK=l@(d8!NC*!NzJzm`%SNX?p*N^_|(kh!0*wWbk}FW~%HzPbp`81K*X2ErNH z)m~2Q7_Y0p*~?k0K3k==zU8!KkZxm8`;fE;j=0K=?SL!(f_@o0-&b$0N~#;&BG9_V zj)HY1>h)Ez&0be^le^ths3bI2Keo=x8;_1NO}(;8ce7iNLcP2S4Gulw4z~zBbDE~Q zk^Wtvy_=Vp6?@B9Pp_iNQxCiIz(}emSE0HeMR~HHge$@_)8|roFZjaoRzs^@TB3U*%i@U*B*RPrezpJ-V zeKBaf4wgfF5A+^ze`nN#M;62iz3vEihTExAUTre|m-`wG0BRGIpa5SWRSc=RPeU3;!^?e{2hZ&icnu2iadx=c{=7Ac`JA@l7n_0y!fAI5fu6noI~YTyjm zav!_`gP$dXKVf^--B8`$SO0L=VjKejnZAfhLxqBiM7OTmtX^_ACUc21bRvLeX zbn~)xb)XQ#Jhd3jpeyQ!8p$swY16NWY}HzN`)U!Y_Lq||o~rc`3?J|^hGyes_47$Z zR8<#7Hoz@3)L_s?Yh!N~`0B(W(C2xbX;9Fa<)B-3@X6cc)6q!19pQDD8kSM55;)Au zimmt6S0}{^sBo7=F!FzP5}G8Ob#4R$_gh~31zw+6tFLyRgfR$S*-V^|h=cZX4b0?b zi@}pX^o}i&@5ux2oP^=~CMfBZ6*~bVQi(UR$eW6ce1E*JUP5vD`s((`TCb1>of7o| z5VYaDBC(R#QIXT#yvPi+-oKp`DR$KZ$TTvzYh--a$mFh({kukrx<-!3^M=6zqmgoz#oBY`RaHt1QQ%0oOOL`+o!xR(N znn@e*L6mHa2@fO=83sIu!d(%D`^LlJG==u^)!~@1d{u-FG|Y2PL3jVf%gUOriSSfM zzZiWGCOqi%MRQV@kZV!+DT`*V-c+l&!!HZ3U6~(}5U_!%b z@lXWy-<6SJE?SaWr;@(~v)j*BKuV(a$2fhq_l`2G_&{EmvD>b9(mp~UZExbR{(czq*# z@X=Y55|uU?6<3(oma z?eNqsp{y@8S%0ChjJarK3?u1IQg)#ZeyKKi-fy%*>I6G?z{Z8oM2ay`T(mN&zCe?^ zXk}y{7oiOlnvC3cDwuZR%B`e@l%OPEq9iJI%5H@|+vNO^(d*FCaV zC-_tMd}J9zhG(pNP5oPy;EKiX&t&20D`P0=FH~Ae4g1t@RN7Nlnqg~~@%||*p?*yi zLuJ-&wr~BuLeu{eEs0@Xik+wH;O7-odFqTP+CXk(5EZxvGgoe8To)bx1LDyL&WUaX zHqb;DBlV{`_8X`~>g%Fd_VreEFd-Lprf5#WkRK`Rq8r9nM#lxv0jv{Ym@A60ScmFi zUI%n^jI^Jx_?~jQG>Y;5a5QB^ok#emE70V8bs6wjWMEgX!@s>)1>&=iv_D3+-fL+! z)*cylh!l6lSd)cdfxp%3{k@G)k)hpT^G0p+>#!!~tN)3{u(b2lYb$n8Bfg1>KxH2t z5dUe+z9))ylpDK|Vv%r|mya39QO~bf>&4Wau!_o%i!~{w9vP&52ChMI9*R;Y5vhA2 zbr19qwS5JaBkKO$6vR!_ZY7~hooi!0|(7hcNue^kG|#& ziVQWqwKoj_qGjJKPiU;(7HUI8XREOh-Aug^#?;n%3kS71U_JEE9E(a-!v=-b^RiLUS|T3eC2 z0Lr?e6GqWSuUxU228i=Kw3Bw~ShTqAks-NQcw?qVtDzB?hNq<0o>wF1t%&T4`vG5l zAH@(>j1@;IVh^hEy3-{749viE)XzTw3pAbCX~r?9d$FQeKX0UJKt}!0ME20baW0C` z9>jM3DD;gLF|49~i^dAjcUHuvAy|VzWG@$?9k{=UjLgRXl%z>!_*V7D@_F8Lbu#V- z@Yf6XsNN8oRM%omjP%PxJH+w}T>)yA>k;`h??Kc}Zyf;#b}sR}&2Y&uj3r4go7SnQ zk6)L^)~eIIwFu}Ye!54!e0gNJt4{Z75TYqYo$YP+_B@3u%)ip#T%*2)De&kg@OU59 zX$Sho26YBJi?)2Bw}bATv()t~Vq0-Lm#f~ReobTTXUmIdJ$xz5@X!Jiv>ZJcF*TT( zhEufz9)`8psko;uf&Z`)pjm!1T72wgU}&or+y1{1Q|~WFH%9Bb#?#Z&d&@C`UWb*9 zpY;p|lYD=nHx$j=L&MI86UO;qd;S&Z7#+=xi1tq$QTgy$Uolb{^;?S@ z2DIK{G>sZ>5Jk3lJ#l+B2$4i|A_IGRJ+rX*!+eU$?tzPkwdYk{?nbZI`Jr{C*LSg9 zPTsqG8dksRd5~!>bSG*NbJfeRI~-mgGi(E50xuWo~0)bQ&brlOnB3Nfg?<~xfGj~IE|lzjB)fRC};!_@j3TyQ|Fzt?XaR+B~QoaIT( zQS-bZTRqHd=Pbu80C)UErk;sZih>BC6#pjdjO7o~;^{Z-0o_V5rLMz-un-AzRZrZ= ztbxUQs5R)2@CBMN7J$pJC}0mj<3N=0zsqR6QEPpSfi&7|20}OBY8@Oo*c242%w=fi z{R!OaWzmgpk=F;+IsgmL|13jc)nAZHXRIRW4)NDzMd~yVaj(C`>lqo?5iuBTX(vKIGV}Au%%=7!K+C_@k(gx(xG^FW>^JY&~%E5hT(4^ z-ZI43jQ&3)97ZpIx1{Aj-;XtK5#krdTas1y*`y+T^*&iu+c-i8@TL=f{S$8)*4ETk zR{=r-d>OQ^#RO3#Lu;)}>Ypiqq;tWQez3r>rs6AtCS>FA7A3wyVNydQUUxI`coo#9@gfi8|I<-}&CaOv-5+gnl>XOy=`nZEHm#G|q}AK2 zpgb8fxRv#GD)6z4<7FRxbmr^h07y>{mM#By#_1Ug9XaOWd<{KhY54dJrjVY291-X1 zCdT&(;lml99KzqgCNSxl&A7FvnQ{HEZxLtrh1az=eEj1=eOQmY&35Vw$I;~h0Hpso z#;l$q#>*HlY5eo%z!k z-^Z2uC*Z9QJcKK2FaqH(Uj6cmd%+SXmtT%i5V&>V)bX^e7DYXD!UxA%8zU7DTX{`Sk*3a&Cj$waNJEepEIVv3+*>5K@ zeyD*RpYcaS__@fJ#-$D@A00i-#TmjljT3ZO{m-x;_G8@YpU3!m#`VAWM!G+cAL+j& z#Q&N7FiUGsovvp-^=~?CJ1S-TXU1(iIgI@f(f&*Q8`x9X{%(wOwK=;O?;OHUWB;^c z-0JVg{GN=n`dbXWTyM-J#n_)G5%VN}Zn7yl61*+n9;muI5{SujAQox3hjbzqGL5{>C`W&_^6H z`OWl8$Khz_M8;oWz}D}-7=JE=-^~7bJA_mJA^q<&ZtLqq_QMy97qC6+8PC$?OZC%! zjMIEe$NuKxjO6lGFi!78(NW9g-OPBYMjfXQ_%!~6$E){X2if@^^KE$-F#ZwaY_1b! z{By=_d%K#;`vc>49Hv}V;9ZhZhtmJ{IVIbW3R<^C%vA-e#V~GH4Pm@vI>3^0@-pDI z)uf`|!~&pmuquQfc|Fw`1GOEyQf$Zh4*a(8C*at&aPnVUxSK>>eg^0=7fHYX^+h zRc+~^^<7(dYX<)P(AyS&Bj@`q%16gKb8%X6C41IDA07IAJY45zC@;MuNBpa}BkK3> zz~4Uue;w>0{$prgbm({NaNPwy;Z3?-JI>cS)^UbsDA!%gpU(|ezyF3bFJ|H+t}Q=o zv3fd~4D~y12tJg7UxxnBmY!1fLlZYq{eByC?99-9wr9{^o&jH!0Y4x^{r-|6U%YG5 zru`phz+cILzn8(!w*uGghbM&ju$zvD*gqdIuHUl*z8Rmk{5dp3zTbmS`ir|EfJ47a zhilgi{8`-Ins_MC@5O;n^H^K?j>_OSdKarL{w(B6_FTm`#`>K(=$@IuKN~XGc^La= zejg;pq2HCmwQmOgCmHmw%z*nD%JoHta-EF4+bZuB8T6c=0dHmh-`<}}=pkqOXazTBY`F6?R&y5-M zT$Z7{f6t)jQEipkFPd~YXyE2jM{G$b5 z+C%%LZSk*VJX|k!9HQto_}F~$vZX%g@)v>A{746tOZx2t!I$;&ncz!1f5^b6eH%I` zTDH%#1uomki;Rcso%T!VAYA7AzQF08z?SzHfm6`pv_C)x*(1vpC#5*Tc!9vzBi`!S zU*J;De8$7=WI+c0Wf^e0?-2Hb-CrP_mYUWc+Bcwsa9Lh?|1a&d_w&Rj6Re&R))V%_ zOo2;3)CgSazeCtVUCQdeKLdYf2K;xSN0zr2*0FSu{S>tN_Yt_vcRb_aaxKb$uM>Kt zKhMa(zew<(6N! z@UsO@dp4GTnb3cxz^@T}x>d3KJ2LS9Dfo0ZZTbJrz|SXV;UN2^{yvP8AEZ4+8TivP z@Xr$X+0bR}d06O?et1prWxnqUzO?hp4E#7%299vKhB6*5*BgQ_{q}waetX_IJ3jUdbzbpfPO$Pq`f-miSRN&G-9}7Lw&YuM??a8OaIKuwfoAGeDN;B}U z5`4iI?RX-~%L@6G!NVLuOGJX|khGVl+~z&}CYa{X|w&_nkh)}D(6 z|9pWz$oODjay|UK&_nmyR?oXakMz$^0>41;`|?c?mG?q{4-xo90^gT$@*6$7w)s{F zzRb5l;1>)2r9uxqOR;+H6nv@Yd%>qI4$IG`!sFPjz8EJvY4_6dXJp{d6*zqt%kq~C zJ+via@v{V9+WDy9)0T+kKc9jBh2Yb(F3aDQf!~Q=7@%^|mWbu&3%sYm4-ohs0-w!z z*l$M(KD~2b^)Jl8KUwf;58Lw36#PpBewE<&7Wge0_)iFaAHjc4@Glkkhk{=q@SPd> z_CX%`v#;Q1@dG~ckJLXv;Idr%F;05=2|d#U|1yEk6a0k0s|EiofiDsK{sRAt;LCP+ zncxo){Obf?mg_;m-%IeH5`0f1w4;A>s0xuHyKNt`9ySD_sR`9#>qZjf+ zvA_o~9@bNq0beQbD}|nOg#KXye^T(T68KAkKV0A+3BGKHp9{X6$A1<02%#sR_noO+ z(hmz5CqIl5{1(BN`Cgd;e?{mSDfG1C{cFni8i99Xobr|B9U%BJ-ywo8%UdFFS>9uW z9$DVo1inSs^R&=2THr4VzO?6k!QV&lcV^&6_=O89?-;=!%sBbyI)Rr8e7(S11TO74 zOW@ZF{xytKzGDS`tKdsL+XR1K!QY;N|B>L!a{VIs(*B|zP>O@fEAu^G;MX9|jx%)v zm-TqAz~wsdS%Kdu^t{42`C+`kKNWm=fBluiW6RY) z1HVx4O9g+w4E#BQKT+_Lf`601H)g;e61cSgJ%OJi^n5LFS-(+Q4B;R@$b3g;z~^MZ z7cw5Muag8{+IfM%W&7VO^h|#=P*uwlkK5F@MU?=7Pzd(y96%lafi^qAM&vNRQ#ev*#08M$)0h7zmLF6 zfd9tNO=e}#b7}_se}ta#LjN|wm*ss@@FxrYOBwh(GT=Lfo+(1le=_i0T9o4;Ka}EQ z{g%r(`Ayonm*C5KJV5Yey_99ZPZzkx40ui-B*qc0_r8o%dB@{p z%Udk?(w?~jUnTgf1%9)@|H3%wKS}^lGOFh2{T$U@V9}?przuk(D^=DBAd_3dihdF{jS>S^NeuU5?^Q{&5 zZGyi{=s8f}7iQpZ5qxRS%>o}N^gJT)xdMMy=$C$bOYjdD{0{|wgus6ldTtkZ9&J+K z2)EBd#v_P35+CdTF&X#=3BK%KhYEb2&{HGy+#&F#0+;1ITi}v^yTB#?uZ)xZM+yBe zW#E4*_|pEb1b(#8R;c`QCbc^Qualk?HO0+)K~1b&UsvrgdB&d&vYkKq3* z@OuTm*Ip2CkUjU|W9=NxIN2}#Hd*kcoihY3_0JP}<_rA`1YhboS@6pR|AP$tLA2?H zgX}yWA8Y>@#;IKQ3;b}wm*uJwd}+@rfj=PhoG)C|%3Fz#EpJc8sk~DEae^=XQ!Dt=KQ{_~mC%2i;7k2)3cl3;slbmDdUgsu4+*>@ zO*S~FT$10DaVpm~d~A6S6}Yr#lh9Kp_%~$0-xYc`3H}cm_zrEV;vjq0;$!XUB=Cm? zzL&rs5%?hjm;56IzDn?K68K{Rf0A+XTeZMn75vo#|5V_Q3;Zjgr$*qBLI^mhyi!kh zflEET87F(Bo{@qt^-LAG)H5@Ko+`nYdX@=X>RFRP&xL|7_56>(rJg%7==rPQOFeH3 zT2%H2smh5x)2{*FA2t}UQQ7B2*H>7_Y=6(KUv^X|8${$kfF4TWpz=P2kL5ov@TUcyOApC#5dW|ESpNP3 z|C_*%7PwpoE)w{5!C%QZ`MF-;=Lr6p0>4o38w7qs2L1yX@Hd2>Mxo~ef!7KAKN<9# zIvgY%cnBfllWL(p1_xIm@a(;z8GQ4=i582zXf;>^LV+c@e>7Z(^0;y z%%zJ>XK|Z8mpK+6$#T~aPI=IgZ!S7t(r@$V6~b4tToA&~V7Y$?KbPf!A^ZxKc^V1w z-NHCGw*bGD@lhc?cd|S-gwwqf9VO-x=-I|{X$Yq|kB-Ua67c`d^3)Li2Fo)-_(v?y z3gJJpJU4_#Tm#Gt;kk?-8^XIYK0k!_X1pqd_h)=z2&eC*&{1bDL3!=(TTmaQ!?vG; znV&RpfFHs5(h$Coaob+3o+XU03GvTl{FD%WIpga?_??WO6~Z53d_xHTC*v1{@YfmN z6vB5fet8K0j`6EPxT1j$hi$*MyxEN3XrcqZ|YUa~RJF;lb~ngzyKL-!+6k$9R4S-@$mV5dIzG_WRG)e*1kPJKk74H)_f` zFr=p+<3mFD2*!&;_(6=13gPn@9~;6O7%vIos~9g0;pa0xIfP%w_|y=-jdArhVUHU*uOP|cVqna5I%tMyF>U;#_tc|_V;79h45+2 ze=LNTG5%BtuV;LF2w%hab0Pd}#$O2GS2F%e2&dogpyQ1YzK!vBLipbq{~(0F&-jiI z{uSf@3gPxAF}@7p9oiXtz765_cW8bL;q*H`bo>&+_h)=p2)Dlnqc>=g&i2P6nIGkO z$>Oz)$3plT#&beA{oW8Axgnf>4~vejA)I~}j1IdVvH5OeyjO^Ceiz1Z3PSk1%>P8J@f$<<1&nVE;aeHMJ%m5Q_}wA=ZN~2p z;omd9ErkEd_+ug5%Qk*^Duj1te0vD*&-im8dd^Y3ngzz%P zKM3I`GQJ~(uVMUOA^ZZyzYO75G5&1`zk~4~L-^B-{}RIAV|-T#|B-R~`v6oOwAa!x z$M`?W>uZZA7>|YU62@~v_zcE#LwGskT|;;anO_&e-)Fojg#XHT zGK6Qvjh~l>@B+r^_igB~<+9)NTob}4GXIniehB01L-_HGpB2KBjBg0x=Q4gl2)~%| zO(A>>Cd_9mcnY@Gls@J%s^0{36ER3E|f;{y_-8i}4*H z+OckzrpyoA^aQ0e+=Qf82=@N$8$}+>XS8mjb}^`3k{rW?nD&9Of$p zU%-5o;5E!w3;rPU2Em_ZzDDqWGH(=oEAw@NcQ9`f{2=r7f*)nxEci)hnfl)(_*u-` z1iy&+4#88Iw+o)de2?JPd&?by7jyW1f>$!{6#RbX`vrfTd6(eU`^g6d-@@U01%HS6 zSAusj?-Tqh=KX@76l3aHeY9wp9sVJ62d@`ecHpPXqXhp2bNUV*{aE2snY#p^$lUsl zwiVubpE*{9zlp=g2|kl~yx{Yhy9K|Od4k~gGpFwo510QD=E;JuWu7YdE6mdbx894! z|J)dn{yQ8#Q}9oidj&trToe2UXPfEz1wWU0j^JaNTi*w>^gn_5bP+zAd7j|Ym|N@X zRysw@3q|;H=EZ{R%&ql!E1f?xFBRec!8|DVCgv4_zsI~%@K2dn3Es!NT5#JBO+D8N zeme7|f?Mx<*9o4$;a3Pgo_W3ClbEj*{6^-h1fRovwcz(MZxH;C%-0CMhIymlo0zW? zd?)iJ!9QTWUhsp=n*|?WzDe*O{K(XQo8UiTzC-X!n70c)k@+6M{meTAx87slCwL); z?-aa@`F_FgX5J;Z&itU@4>0c){IATv68!JX`vm_N^M1j%F;^dPzmW_h_pIzMF|BX|mW9}Aw7V`wb?`EDP zc!+tj;C0MX1%H%zn&8hd&k+0-=9z+TV@}`Oryon7Z!^~f|CG63@Wae=1n*~_EBML$ zUOoMPhvCmXn|Yq#7cegnJe7H&;8!v)7Cf7IiQqReFBSZD=0U;lWL_b7n0ck(e_~!G z_!{Qbg1^kXR`A!EFBQCld7a>0%vT8hHS>DGPvQ6cR|@WAzDn>o=Bow2gn5JDlbEj& z{MXDI1utU0PVfcHn*?9Te7)cX^Jc;8nQs#OZ_L{Se}VZ9!8bB*7kn4YHxwZdn*_mAC z^#2`(+kpb+QG(B99xeDn<}ShSV;&>8_5BF?za+z-+rZ)D1YgTMUhtQgy9IAyo*?*k z=GOkXrH4JtlSTMW=Ba{P-<3!c{5XfVzVB+Ke@dL0&rA_MhPhYpA2ZhkKcBf@aO=Aj zIf9Sp@VSDgF`q8@bAIYmkNF%^E$zQ$$W+28O-YizmEAz!Ea)|O7L0CR}20- z<_&@`WWGl5TIP*{Kg@ic;H#N83H~DU^@49^-YocD=9>gRz`RZHqs(^*KKiF-d9@3E zHuF7#pU1pI@UhJI34SH>PQj-#-!J$~=3RnUGCwGIE%RQ%|H%9+!5?SdC-^^@_Y3|C zbL&L_%PwtY?%;DA7Jr9%l;EE+j~4tmbNc^o^kb!SI=_ezBlu64#|l1d4dRE$UI5#+nFZ|Ud}vK@M`Ate=vvV*ZLkxhTzX|_)Nh!GWQC; zo4IwK$jVn2bH50GjCqdWKZrNw%N6`w=F7D&FBQCBdcn(?Hw%6j^G$*; zV%{crnE4LD|H!;u@YT%s2)>qihu|+U-zRu0^G?CvX1-r=>$@;rf`7^34+=i&0<+wE z1wWnnSAzeTd7t2k%=-l&&s_a813b#IC%f?MCmDHMDnhc6a9hk1$M zdCaZzo0dLrV;&UY%a~UP9%5c8cpdX9!Rwh<3;tK;wSuonH+wH;I}hx7rd1D9>L3*cL;8MS7@K$wH&@v@cWtX7yM7my99rl`9Z<0 z|9jRe_zN8VE5To8-Y0l7^M1j%Fjt0unEl_*+(8X)7=Md-l;8)LM+<(Kxl8aP%wq)q zmbvx+M98}wzbF5Uq_ElIM0h9jc)??ty9NI#^8~>!W}YPYrOcBBzlwRP;2QHZ!GFy> zL-1+LGX=kyxmWN2b4~DB%>9DTWu7B=1@m0N7c!qNcn$MB!Iv{H5WJpwq2PaEUM%<; z<|TqZ&%9Lde=-jWzMgr7;H}In1>eQIO7QoXR}20z^IE|_XTDVMKIV0TkGjaL&npB! zm3h73W0YzMpxY;0Kxa3x1Tj^)Hsmo9wOa=VtwM@cRK4Kb3iu;Ab+A7W`c1F2OHk z9wT@X^H{;hGmjHIgL%B*S9=!Ms-RROU+szlwRC;MXu; zA$TtHdckjDzEbepn6DDNl=*7G?_}N}_&v)M!{DwUnlsZ%$o#%lKFbUpJCoC z_&VmB1b>xzo8WECcL@GE^LD{InC}t%-^@D%|Csqc!4EO-6#NA9{eqvGXx7gz!GFa3 zpy1~*?-l&#%)b)+m(2SFznpo$;8!uXKHOv3y~)fS{63S#vzbQ;ek1c}!Ea&i68tvi zF@l#fj}`o0=5d1S%;N>GW9}CGLFNg9Kf*jo@YT$d1z*cNRq%Dp(*$47+il7C*r}SELhlu~|Q-3qFQ->!!S7_gRPbu%b%KYP zuMqqJ=JkR(2;HuGM=gUr7Y{BGubf`^#*3vMu1AA^Q!Ps1;b{~uuP;P)&o{wVV(!JlFtE%3ZJWhn)%RFB2Pnf#}|C)J%;G>hwdS$&|YdzP=JXwT4hk2^t z7coy0d>r!(!84g#@9$dAy_UIGgrCM-6Z|&je!+vxt@nVf^zUY#E5hH)e7fLEnCA%| zW?mrpL(B^Wf0TK#;7>3w5&T)^rGhsx4+`GQyh89@%&qsBEj@h9yh?=sl6ke@qc1V* zNv+`4cV?Fg9>d}51V4xQ3c=mX>jnQM^Ob^M!F-kA8uQhHU(dWj@EOe42tJ2-qu_Tk zUnlrN=1qbxX1-qV2bebt{wL;}1Yga(P4H)#?-0C+dAr~(%=ZYsgL#MGZ!_N~_`jKV z3f|3pzu;dp?-G2F`9Z;>#+vo5SMV6-UkQEz^FG0onfD9sVXpqkF&<^LiyY>TGtB2( zJfC@#;B%Qr3w{@Km*7j7#|Zuq^H{9C=GtUuxBJ*6quVX%4@ZT`c z6TFalf#7qP7Ye?Bd9mP&n3o7{Ft`4{wpG4=WF8dZpJrYm_{+>I1>elPO7LCGs|DZ3 zyjJiY=1T=X&b&@=_0LXG^eY7aL9$sN>IMHH^Ob_1&wQ2OzhJ&v@O0)4f?v&ijo?$5 zHwtcjS9+b`g&e*~@L9~)3tq;&S@64H|FhvzruWv;G39t2)>>9 zKEdB+-YNKg=KBTznt7MtgUk;K{(}^=KJ*IyL*`!zelhbt!6z~A7yNqW>Yvl&QC9n! z#oXaEpKtMdnMVo!F!N}^pJMJ3{59q=g707+D|jdKIKjVQ9xu3UoGG_k@H3fP-yN~? z70*0Lgim3fEcis`se(^so+fxP^9;e~G0zmdin&+tWz03fS26bszLt58;Om*^3ci*3 zbiq5A=Lvp*d4b@^m=_9u@_4gciUl9TyhQNxnU@NF3G<-f8O$pL_cN~){3hmAf)_Hc z7JNSQTEUkvUn=-2=5>NU!F+|_Ynj&z{vz|0f^TNNO7OkRR}20r^9I4~sb;yX5!}VR zQShHLUnh79^CrQsV!mGR$;_Jtzn=Lf!Ea*TCiqO|I|MId-Y$3*^F4ysG4BxkQRe#u zU&Fjp@K>4d7ko4GF2UQG9~Ar@=DmV{#QZD44>9i(yq|f$;3r>dmb=YmUM+hV!`vbG z`OKpPAICge@HFNw!M)651kYw3EBG|#ae~ia9xwQ8=5E2unI{PTd*(@k-^V;z@OtK{ zf1q+m$_}sNc;Z_<_^I#m`4fjXC5th zK697gCCp<4uVfx8_+sX9g0Em6FZkok-GaZwJVEen%##G)$2?i^51FS5zMpxT;76Hf z2!2w!srO95PiO8GJchX@_>YN5so*~5LBW5`yh89Bm{$s($Gl4L0P||WXELu9d=~Sif|oL{6TF=H3c)Lx z*9*Rw`AWgV%vTBi0Q1#?uVmgJ_~Xpi2>uN7M#2Bde4XI0GH(*Rjrn@PcQJ1k{B7o& z1b?4-o8TWX-y!%%%%jX^X0ziuirsW!a~R=Iv0p4-t?)g3A20ZRzUSjUk#yoIB7Tz1 zON1X_&gLM(f6YQ=ityHVv^BxcCQ%k_qYszmoYX!CjnAgWyw`Hwu0`^CrQq?*=vtZhgP6P4Hu! zPP^cDu$&!&Ti@sE6nyl_Cg>9UOy<3UyP5Y1K9RYqQ1G+r?H$acxZYXZ`u`U$!L9GG z#0qZxzlM0h6QWE(5(NL8d9vV_oMMJg6Fif7rr=YVYl7d-JV$Wr`vTJiKg{6^1oyC< z#e!S^f1yez5^k_4Dv*4dHZxg(L_YvC#{|T=zcL*M2-YK}X9^EB)DX&xX3Vxhduj19<}SgPGmjPgVdn9If5JRL@D%Qck_ETMRcV4RKhu;yQ}E}QYl62k z&k_7E^XY=0ah92Wf#8YEiv_=qd8y#Dm{$n?6!R*<+nCo1eu#OU;L$Orob`fR-xpma z_!JJ`Ab39WM!~C?HwnI%d9&c1%-aO7I@^@9UGP@s9fJSphi3Rr!IPPH32uGouvhTk z{K!nFPw-OaHtvV5dj34~D8a|Zn(4R%_cD(a-1^>Kyx`V%O2!5D(r{F*0?<{o* zK9+f};9ll^f|oJ3@wm*Y|MxSG65RTJlr?^|!du^WiWT8=`TIigg6qr^1aD@ZEcn~Z z(**Bgo+f#6~0#e%P4UMhGy^9sRxnO6z!;_uJY3ZBZm zPVfTe^@4|(uM&Je^9I3P@uvN06ugLeli;JzH^Vmz?ql92c#wI!;H#K-2)>tjr{IIk zy97Vu0#lw|!N)Q06Z|*KZ9M<5BRX{vvzbQ;{zv96!M|l5EBNgfn)1X8en0aB!B2CW z;gbbVVV)-V!^|@Ux88r(1dscfnSPGorOc-bzKD5&;H#Jy3x0@sso>u-uMqs=i%fZ{ z1kYh!EBJ(;o8jvOU&Op#@Q0bN5`1=onNEY?hnY7D{?kM=e3RfGGH({#aj_Y`P4Kgs zw+ntf^A5qS_bfUEujKGug8!X)ui$%`_X++Pa~scht@>}hFAyd8kNF(9OYqB?#|mzp z^N$z2*g8)x_&v;%1^*-SG{M(0&lG$cb4~CMnCA$7g86j8U3{LoK=35y#e#d7mkNF} z^9sSsm{$qDjCrl#k29|m{59tFg70CzO7LFh4T8HaG3#xk;FmCO5{l=5P_^CH9k?_|1ZIj^EJi)>7taL2zB&(C!EU--B>0tl zZ*@PX;hw@5Gv{UyNylK$)hojP!ko9&BYYe4Ouky_zr*)gf`82S*9d-)@23d&a4O`p~AW4L0j3((z#_p+tevj^8<6s=LBt6-!PF~W&w>Z$&Owf6;MoYGgg2!E%%59SG;bz2C2EGt50uQ9 zX95cF9XMz1oV#Y0&7EhdrLcTPi5Xn#vaC1~NQpnsHcT7&w?b2e5t;EQD?25#=FH4j z_x`bTfs$vImDy&`oLxG1ZV5^#h^*W=GZ36R1d*$mGv>`?N|`Au&M%p}U}l-hS#WM} zMoIpxAm75TytEWIvuEcoCa8HI&qRAlo?OJ)U8GLigJ)hH~VU21`n zh-*mEv*r}dwftw#Eu4uw0Sr%G0TL8a-a1!FSzZdqa23s)TT&jJHFu7cQsmy$0m`PN zeD)mM%!<+ysDy+K6wjM=+Z;0^@3Bfn_ItP+6v z^X8~pSVWNSi$>fIzZ*MeZgA$EAj(nh57Sl-8Iv8D{?u1rj=!Cj{&sJ2%zL=&z?5}gq-td zl*}re5u9l&3Y5&9H&f|ARrmbhouxBJXq@U5gPFzoMP)N)&ot$lyC8p#byHG0o(+M2t;m*%4S9cf*qKNCR}JMDlHENY)HT~2V(;^s=lxqxZXLNuD7CP-Z70TobS3^ zSdDq8!pb?L1U|%uLQKr|48QfztqL|t^ZeRYJY!z|#K}3s!%vywA9nleERWv|uUtdv z`qjPJ+)I2Ayut%RG`BDx*RiU>jZI6pT$e{&IEKQ$mquKv5!d*L3&&VETuQ_R2OcmZ zIAd&JUNFt_Pm8!NkGL+2xGs&jQX{VM5!bkgD<$F@a$Igb;_`^=vWV-_h$}VX8Xs|u zi?~uEu81S;vPi-a*JTmcr4bj7RI(1nM_l9J8d5?^gb%qQDE(3^I?nuZLYGHemqlEc zMqH^8*Z7DF=ZLL>h`1t-^i<0;E#kU7;<_y2x-{ZSjkv}~T;n1x99HLtMI7nlEtD2< zT^?~=7I9q~aivCF<0Gzd5m!pYMUF{1zLd-J$FVC_xu~^`O(&*YX%W}u5!YoA*QF6x zYQ!}@;u;rm;k6Y`j~wP>QzDPGT*>(`iZkSr}fIU*vvE{&ieS89Zfi?~uO*SKWMm14TgoKSM6QX{U* zBd*ILu1h1X)QD?*#5FGBO5r)AH8%VIaxKIBho@2_qJQ*}IS>rGR@n_->9+XlRA0ALfdOJ4vpdvv3$K7^D7E@Cf{3^ zCVp<31^8;kx2{zX{QKhfa{N*e-;&?D?m$8mUu4r(Fy4&l`Vaaub7!-CgkY9?_@hcQ z%)1+Tzt{4UVQG0yG77sT$Bgm1C|ntK36v@s#e9G#U}@9LbgaKJ>>|YfzVhqJGeg#K zL@Ga0g{60^{N4nUX;PH!&(L3+?PBv1`76Vo1|S&){+i>r^SK8r0U7orfbWyP;$|~s z1QvQb!j6x=x!6JV*|I2h9NRJ@pFjF0pIpII(|LJ39yi#5VvQn|)TlW|K z2mL4T0hu)3&nNlmsEU-o7VP`vKX=f4LV|gT{I#BMUFlq&<&Fe`Vel(6hT^JTiek<@vi2r@%SMYE1N!Ga>%0C_Pu;N?w@A!X^e-%{>{Jg{GLevfZ zNcrjioqyl+r+1nmYdK@|d^(CDpZ^yGqmZ)xEI7xE|A=`(2=m9fwXPvNf3$yaE_|yv zh`MyL{kHT<&!-bT-*!IxxfXa=)BoK?zCL|RV$Z^}w7_P+eoV8sYJuG;N0pCX@BOXkmYX*^&#R(< zH+ZIbZuH#X$(@?x(+7+tw8p7_acu9s1HB!CgD<;&jwUm4mwiLcQK#>1{bBOXN;y>X zrpNi%W{>?XIGZ!!v~Sjo*NWjeG3+=*>3YL%b=3kLLo&5`6F**fmM^f$uMdt8DqDY* zBKwS2r<-Z~oziGIFluCUy(6(};Whri0mS#)Kh*;5njYikj3Et*>(k%X^e=t-pmFjM=f%y&v!u@=XTs?e zyvUj8a2Gjq+q~hK_OSOPyK`DIg*xKArR|8*r4~_@;D`_bMb5Ep3zCe{&S_f_whhr$ zT3&nSe~Nv?d6UC^#F^Bqk4K>{BT?<2L!m0^>gM2lk68;6yY$h%z*u{iC-I=qSWe~R z4|H7<&gj;{solQ7J}n&cKFO^j`iv!{Z+JJryFqLDc$B8UYk85bB3_KM^s%1Ml6W*c zd!xO_)MM;$Jvz_x4zHikUxKEeFqV`eF|&%s_M?i@DV5<>l)R~is%rUGR?7aGW>nTq z9{VO#(F%Bm9jbOs4re?;;`;-=e%)*vK7F%S@AW43IhP%WkEWNn;}vobOA9$p8xci?4TowuN))1y`}?BMvt8DsRD^J- zPQ`P$5sjSR7tM;H{KL=GQw-x3x(tQh;12QT}Xk?MvL@qzAyNXm|=FT5hIT9Ju zbTiNYIUfk|-z7$X|0-a%UT#C9OVUEGkd|%1-}ypU*@AayhSwdXh0<)nf|Ta$nxnzr zYDTnM3#HqF*F(xE)Fq#Oh%Jz(W&db@pwF)ln6*&fl9l-BLYFVl@3$ZG1>T9+!{;d; z8oBe)7NqHXusN!Yt7F2j>i8XdiTbE%R3BGC#Q#zs$vfq!s*hXjZ>ManX?8x=VsAlZ zY=DoZ2i>l);|1grZofM!oD?SacWPx~mmfhhQ7zogW!);ow`Rrk2Rc)Z`t^^jvRBE5 zLyanRvtp8ar~+&@E9S5$Dr`8^#8J|qOmhFXC@O3?)XY(m5ry3UEs6>o4z+QV1VkbC zuqbBD9Lh~ME&Zc5{*Nr7KK+jzAjJO=7$N?*e10Q{3Wzr2f>0_S#w+c}LZr%lf+~lC z`kbrWCa>P*P3&EmPh}UCt$*$hl(?hN4f*Ydg*|zk(m{*sAnh3HGNhPIK07+{!`b@R zN&;n6lo;wcJ@J11d!t9h$ku<3_B0*siJoF}RxhKcgkB-N;;u?Pld1~Zmb3bIe4A$8 z-paSh=IvCzO)zi0xDDN%Hp*FZ6lp>7E`aZ90KNVj$hT(SiC#O>^d6_ch|{MoCGJdZ zNOgLb;di?e+ZN^xDX-g79XkG8ckEC)lmL`R!#E_TE}W94Z~l(*VC`auH22@*>c0$C zx?Q$~KZd$UT3hf2botO`4gf{91t*8@&a?#`=*2Sd@Lm#S=;2w3Uz5=p(CmkOfwx#< zO@D@hnJKp-wek&W9H9*}I7P$yzuc)F{SEyskABRj_rFFDeKi?bRe8YBMuSbMei*cM z5@9_4La%G{}w==s9w@z=Her=jFL5(GxV?vDxtTo{e{XqGlUR;N~ zn@8NWByVex4NbuxC$vWs8E?CqgS7o$|819#=bK=LjN8bFl8KY z=wFbG14_mzY2k@|p}yl~S)mPsp>IxF@DnYtK?|#)4TeIFmLYd^OOFf4@=`fF;vBPt zvWDw&%H6OrnHuj-&Cy@?=?Rf_T4 zyYo*ou1>3IUU*qbGli!q6S8v4HY>~#=k)EAH8Y)CHsF3^qn$FXG8^g}s5}G4EM;q` zZ_t_5rcX(;$~XpPtTfX&3W-H@W$H-Ow`0(aG1p&nXyGic5%7A`4^$Rl{EAU#C}`;l zPv%5!;%ic~8fYnXVxW()V2uOfb2U(!MQsgU>D2??(6{#TlZ|V0bj=akY}dPc&Io7Q z@jRzysDOHuzRjy=)alpyQJr%d?U72RKF?Z7-erk?ZoNY|; zr+-m-hTeu@LR4tLUhXii&e^CLOQ>-5FAPU5ra+mn7E7uCG-G))T>@`wf#~~9&nkLE zc=FewzAqPyHWp}FV2f3f0q?yI&EB@LsE(#jQ(KqhA~OA8{7_R%3F#;Nfq&+xl-0cG znsCh5Q3zle0OOVE@VqXZ`U0tkdb}g1j*M3d;4uXJf#*wAGHNJvT{t5W;TtOgWq=|? z07)Bqks3hUH8N~pZyv(Kox=? z15;NujBqT3syRf1_XOuMCvLpqay#ZAtzLID?ra`qyfK6Bxy-chsOnVS6ZNDf8r>!z znF#aN2U-k@n=y_)U#Qidoj%~K-i!n$8A(mv^g|1iJ^G;u&rr=+__J{NXpCNcU$+d5 zI)?e>Fp&_5q*{cCNOC$qsH)N(XA7Q9&x@a^(mUW>HV^HlC!tQm03}-aXaPq<%2r=` ztMic-`|Ela@)Qjt;9TZINRNJS!ZTDWoXf7j?SGTtAS9?c8-dVF&qvOo4X^$TnGmo3 z_-b6}X$g9Wnoy%1lj*c!onYOF@`=sTxA^p(`denHc#S71(xh-ksxdFw2<7003aEAA zh0bSTzCOsN`JCS!t;)!Y;Y4({-bD)84~1mapgI(~UCw3y!ksVB;z7;N4kxu{hcl`? z>yZ|W^R%s0a&X#uQdE60LL{<|NtpfthGAi4oIQGXO0#+h#qfnTp}al`{_e;mr^|Z) zsf=wYA9Z)vBqRDsuc3@*&DMo4!qEN0o8I#Kzo$P#Nmf1)qB_DQuVJ9+f;ECjYK8#g z?rq1&Ql1!=EY)xfD*f&R^mHlCL{v;?qTikAOw4uXI1}^S1w{A)f>EgwSN_=?6{{fSoz))R(&bW;kug(>vtM9CBu`Q$tGe z!`unO+_A&lu3_#dcAG1aEh>A>5GArQiR{wQlhU?vSWoNXT9Ot&p7a+ zbU-=x#9=)f31Oi`DHx+zILV|xiJ)3|of1+DuW+ZS`=v^6h=Xx<3yi;tIU^-R4$h%bPt;61S(mo&RMXGwRF%?3z)L{jKx%VKI0*(R$dH6 zy+-tXoLV=j-KbWX^XRH>A#W;etesa;GND$7FYpl64Xx#)QEVWPJIYqgR_C%yF?h>1 z7B}El**M=zkV0v{=ZDVopu)*^EwD>V$3S9>Gkgj{`vMt_umTJBL$o$ZHxS*3d3?6< zkSXY5^;~^B)_mjZe1VwzjHEg({qx}UdMcVEIKw4egBB) zqt$bfXi9U+)|8`JDTBre)h<2yL#hhs*ZDpA1S>o8_`re1@$GCRlx+%0? zSu!ks;I5StSxoZyS{K(tKKjux>dG}Dme1opn|)Qn8#3s3CT!lr#Y9>CSI2DP^}pP3&=;D`Kq5l zI(}GRwYvfxH{!93Zu^kbD>Y-qE{ zBz=u|p0LM`QlfUq)=3Mrd0wF;dlH9|tmAl|(5AsG{Uc9!l07SZyGP&X3^!0Jp~~8R zm=E8OwekntwOQ#ORlc5WteuYJ*iQJ2M@i&4ff!XB zS|IfSEj$P80o~u&kBpDOM{1ptXE9S_^GJYktcU zIsj*1?7XNf47DDkWJ4eIQ<9jab20uAbc?=!Y}WM7GX;34b_>KRq9gXFfTDC zY&0*;CUl#ZR1>zFmrfIU%}cHcd+Fi`nXJ&f1bw0Acu3q|z9btPBrTxsK=`}hdKweV;w3? zonHB%ZFJ=W{jJ^ylw7!XjLvwV)$ss{rG=wi7y^t!5#aZ@y}aFXwAmhvrdZI73WF)( zvNnXpR5#^KRfT&JhMJfb@YkRb#Dz3Fnt8@!N?y~731k*aR2+>S`{iPMpMlWEF?anRBN{4 zbFU3M&ZX_!C^X|mTA15!8KQahH$tDF=}tz|-Ke$npuKLi>mP(ZH5=|-DQ|Yu0V{ob z=wp=Udt60&E*erk>>E|ru;VN|nG3Pc?yP>{+rdGuMZq&viS(St^&R1T0q+V2sb{0< z^%@vuZ~5bh)_wZGAPVPW(^PP#f+=rO%cS*KYH)RR>hCK0`yfUZ_#2~0qxuVD0)mqg z_?xOoyZYOyh*$m1Riqbx9V)R03l$Ecm|zb!_Lo0Qi=7j{YY&jw2bFr+9*_+ngK(0I z60i&clEKPC>tK1iFZ~N=wQ2s|Ku_{+;t>rihR53d_6``t(ZP#{YtxJN*6MwM(nmu! zuc%O{I2#7b55Sy`E}J&Iu%nCWTD^^I53Fd7Y!B2rFp_Cxd+-9=0~!)g>TD0TIDF|} zmN#LTy)Xq6AJ~Hs*@L5I6F=H&55`3d!o4ms2;LeSTZD3ql3@|%KtwY*S%mE25<0y4 z&d{f*J|Cz6MRj@*_8?dXdr)WEgCOidYF(>?MzpX8aX*6kxhkDd_5dd7bczMdD9x)W z(XuTFO$(nXZ>q-7a}n1sEl^4JAg>19*aVh_;mQ~XBwu|3ej=ImAruTcYTExb|<$o-h4#-f?}aZiJ0THB)8 zwm-aD%`W^1PZJKB%uZL=rD{GwYhN@;@?%XYhpsr_h1J5GoExTke(jlx1-)F)4Ope1 z=aR9>A;$`Gbg3c;ZOXySgq}pR8n3ZhrLHC?MwTtqcS`VQp}td%rE2_Kei04(PDMmC z;M(RRXuIZ;XHODMUTBEjJq{Ebkjob1hC)+4q|kpD3N2=G-FLyus}GtrhwEa`PpJJ< zYY00~Nru~-8%Ek2s-QimqR7ymsNjd$8|C#X<^ZG_Y_HOGcG?+g&P+o~TAHtRQ*Yy3 zRs@Vf!bvIG3QTO}!7K%!7KYm@#Gu<=^Og)a-I5yNOJ<#JJI&jAzU{!R7S6)5Ef)3Q z&Pv(pq46BbsSwkPl>M}=;PUCaX_Fwf=OP+Oxyb?^OXxgRDT_og4e=VFp9O~c|*J>qFtZmGgGOW)%O9UO2j`xTZcVA#5Y zC|8=zx%6#`8@zglIwmz6o){)#f(zL-eTBOgQNK66Y-3q51cR(hqD+%Y4zfu7BB_R3b!tbB(BZ*6? zs9fI@pa8Q=8ao&GvErQAix4fQgxF3}xj_Y(?$@{Z^sTGZl_o?)-xn>+}8&2; zA2#^X57F%@q$FHV_N8~x^>Qu!gKNW;%ln;wXwlLSBV>y&{ViNted*0A+WVQ#KWs)K z&OdCt56M*{ac9j%*kY~Cb5Hl`Cu)%cnk`+B>pn%*TN(}*Xru?Kyv3xEQfEyW$`0`_ zkH@o}HHEl~-{q{y!}S8lt@P@wnT*@a3rZj~)qQ8pOx&x!P(PwIVT>?HZALpEyZ*l! z(DV*%R~Kx89fvQS)$|^_+MJ_V(R7-ZggzQTF{7lK`+VV&<$ciF)?R4#Nz&}K;S5xS z*1joW$A{2hZ_0aEUiH3jqtSi`q>Xdhe`_GTN8QVW3TQ05%6C%{e3fNTXd z9CU8bWT1sNAJ8iNdY-$Y{2V`~R0-X0BQX!Qzi{{k>)74bLSrwHro4%}P|2{NqFTx8 zW-EDHOWcB0Jm(VnS`n(P}6 z7~V)ZB=GenULx=nl$dEI`n1G0Qc?wu2cYn_K*O}%6;Azz9Pxe(R};5m?(i<=4y1i5 z>|N4No~6EU^z!Vmv?^^2*8oUTnk z;&dCYrN54DDnD6uil5IQjDgOc>$iQY&ta+)k-o|=~AOXQyD<%BZZUW z{q9qoHNCjYjDO2n^C=t`D6v)Bc%N>Ova@D4T%Ke5eAr_2>mLqpC@rK47!VIy%LZ-N zXV5-c3l_#x5yfmR)Jo8IP-$KlPP!K}TC@#s2payD^iy$7xN=Lc7S4MLl3^7i#HEIfRXA7>zNGZod)N;Me2U`V9ZysqH*dgeG&?Y%<-{WE!Z@*7lJ9j z*=#nMSF~gAv*n=LO*&DJRy9#|fJ!l{1$EyGL1E6jr>JU(@Je&tJAwK9YH9aa_@%tp zU=NPfj_t;D;zDgSnu=<~d;3%)ZXr1y>qpZ?bs-ldTGH=J+(T>JWaG=x$~wDuAt5bs zSLhA9ex#ceo^nV@MvFq@v}13fdHm9E-%MHk9BZIsyjv*UXDHne(lvWNr1vzXzer7Q zihYUA=&O9`o665r)zOcVA#2xtAr)h22PO=kDB!_U%BN`IDTBUn&LEkN3OWejZSKPw zsJE|glHm>YdvxzBc-&W-u}+oYM8mtdU-!P+@7F)UdYIiuhM^5lr^>&xXS7HE>e$G z5OwzrkKte5KS}pL*>Cv&3Bk8uO%OL8YF%g~`X*2MZf7-(gH1D!UdS{}LwFuo|McOKI?lm-+^D0O?LYu1Ld60h` zKUnIf5iACk-f-L%*qqYmem#g2@TxCDkzo8rJr-6j)o3oT-xv7OANWQKUuXBH!$$XM z&M7Sz^0htdm1F9$Ft!_s9Jg87`+?Zn{bd@b>7n3qGQN4GDW`!%|myw?#0 zMLZ>3_*aK7oP=eU&A4X#17`j{UwQ{@u0MU78n5h#jAWXtcROn~;Q`+G7H18uxM?~@ zT_2(`E_GMYE!B2?8&)uB@(Ihhl`2D;v--~}>@I{Iz{CE5hsF9a)Jz73u-Rev%P_Wa z5cAtKg}PJT8=BJN{1?il16_m5-_c3y1bg8gjl+k<1 zlssbEsFgIRz=}f4K>6C9Gt{U`Rr8)3Q{IDVP;OYbaP)Y;{bNe+by}5h`CoTYg6~I> zq4U2VOU!W}-FW}xprWjT$fy%qdYeiU=YGG$49@-rTDKZZW62j<{Rc+Cs&ugan5}<^ z8v0j=0C?@NBbcTDD(RyrKTE`zr*&j83f?vS%>iTSS-t^)zZJ2HwHP>wQvQd>hCxgT>@XPzC|sL-H1m1 zmez6zYhpNp*n_28tjosEyCr3?n`#jz*D7_t-ra>;v_|X^8k2Lfj5#G_D;B$u7SvO1 z?y(VxwMY~k-77vu22!?m)2nPsxNbTXriBjlrwpPTn;a;`rWh31OAZv_OEJXU#8Qd5 ziKPg0ifl_Q|(}F5m2eyuORd(_0{(lyY4UtsQB#?uO zhDt;cRYw1Z;v*~B2K9Bn`Qf1Xf|PY$O1;c=6mN13?VnKxmeP!sj|ZDIV`XbQ$sE2L z%H0y>3p}i{(DISF=|*L93ZG~3hYQ`&G@ij&fM1P@+*wDO@S+rTeRlL(^27=hX&&#Q zgN~|>4w)yk-=Xt!Iq17W1E(xV%huoU={q!iH>B6XYAe*-(r+33P(2x^qA~Iw{!*Jd zOEVH}j0B~D=yyX$yp>FmyZ;dw-YR_egBXrw8PiIs+?F&W?>Os=zgQf6)48kyp8S>? z=7ibCk_PBH+gMIL6J~s-LBNjm=@i4GZ|+HstncAHwR(iYO35lDeM`(nI%660G1X(d ztKr9lsrp=%dPbus@mpWu_3VIKr?FVf$4Ky9yk7^qJ+@>18`;KV#YhOts%x<9kIhPJ z{^T3Igywgch-}Zq@@o01`f)6~1{e1vY60v$yUxXy^1IkwkE1i(aoaKGLx%+W-`r2D zv(>-Fgf7%Fh<#MGzJ>M3CPa$+#){QLv3hV!v#B3E?;DH>%;eYu>zv^vXXx93vQ6Di zr1c+_I37a&zf$6OTAv%KKUdsF(g=3FcYjxp^jfMR{Lkm~`7d>vam!Gb8 zI1o7@PDdLfccIWq1S7-Xz_X%%mVi4AN7!^){ukZJ!r)c`F@-Lu>45V8AG>!n%_!Ofetm#&|Gn~sBN#Z9_M%gv{sY`#n zgA#>sX(S=UR4cY5CZy222iK_rp+cS(5t`DV()5I`IHep*wBL45#2OSmW5O$>wtKFl zEaPB8B+Ez(-bjo}l@GB{_E(uHxje=w+G1FTK%qW+`59T^DKNZ#H{S5TVH^xUGQ1NE zDvEo~^`^h>H>y=aC|PLvo*$_|Jr|F}J?G*zcUBtKw~f^M^;9fgf`2Eb^wO z-dlbxIGKG2+zhC1t()Or;v+*tv|R)xH3RDp+Iln+0WNGjIS4*-zkQ2>%l{c*bI3 z@Cmd{9H97|b4V**$?AzT)sM%MVm+iXBx7nwMfW1QcSLkk5m1d8*=o5X6Zx*9^v}J} z2KLoRN7mu35%nG|$XT-pzNq6-$Sc_60pP@!~yfN)Am=SEdk6OP{0-S7mTEF=0hUrX00EW%)t|E9Cr3tw7y!{R4Gn+HsaoQIq7yA}O4=0k3HxJm|SY7`uZ z$KSjGj29F7i<}$2!K7)!N2j2Te_G@$-QQK@{ALrp4iF`;&&cZ_ybh4p4tRZHc^x6I zui*8G6$=AMGuFH0wGUqJk=J%}2DV|qSu>Z^KnG;9AVmy`l}BPt+mD1lL+pd}%smwQ zEyRA4VsC)gZldJ1kGwEOE!|CC+lrh6Ex2jB0gkpJ=fZ8i^sT`Qwa`|(FMOw6DWQ&z zXN`5dfjNsEI-(iY&hj2Q(CEB)108|Hxkj9SzNH1@yu;1vbPg$wgml(SgSb6^8tR

#9N#%ZdFI5os(NOn&W|~9&>c#3v`en{lIWM>JPMg^zELO zp7T67=(FpDC;h$3TT|Yv!;uw_e$J$D67~wePJjI#yq)!BXuI7XI6;H*=s}$G8XJ9V z{z=*Tfd0NhIO;vN1u4(F5Pfs>2N>zUs5>6@>SV#+|9zClILD)R^*rgPK1-pAj>1`f;gWf_R9PdolqsjNaVJ|e)nGaH) zj)!~!G?AD^tS$4=&Faxt=_pXz{~rGQpL;^~|N4COY+4vrB9Z_O5@69V0nGPf@nEVJ zt$r9n^kQQitzJEPu`jS!cl-(Mlr&<*E%pbt&%eeK>Ko-;N{7gCGPS5~S2yWnC+Wkf z=B%F3C>So(r!mp^3QgQHJ#I0|;!lVMIocNNB#pFn---Am%0DZ8W94lr%^2?>N25lR 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�waqB6| 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%0At$3DV1bZM~Z<_w3-hn4+*9OL$-=4 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 literal 0 HcmV?d00001 diff --git a/src/external/lpsolve/build/lp_solve/lp_BFP1.c b/src/lpsolve/build/lp_solve/lp_BFP1.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_BFP1.c rename to src/lpsolve/build/lp_solve/lp_BFP1.c diff --git a/src/external/lpsolve/build/lp_solve/lp_BFP2.c b/src/lpsolve/build/lp_solve/lp_BFP2.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_BFP2.c rename to src/lpsolve/build/lp_solve/lp_BFP2.c diff --git a/src/external/lpsolve/build/lp_solve/lp_Hash.c b/src/lpsolve/build/lp_solve/lp_Hash.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_Hash.c rename to src/lpsolve/build/lp_solve/lp_Hash.c diff --git a/src/external/lpsolve/build/lp_solve/lp_LUSOL.c b/src/lpsolve/build/lp_solve/lp_LUSOL.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_LUSOL.c rename to src/lpsolve/build/lp_solve/lp_LUSOL.c diff --git a/src/external/lpsolve/build/lp_solve/lp_MDO.c b/src/lpsolve/build/lp_solve/lp_MDO.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_MDO.c rename to src/lpsolve/build/lp_solve/lp_MDO.c diff --git a/src/external/lpsolve/build/lp_solve/lp_MPS.c b/src/lpsolve/build/lp_solve/lp_MPS.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_MPS.c rename to src/lpsolve/build/lp_solve/lp_MPS.c diff --git a/src/external/lpsolve/build/lp_solve/lp_SOS.c b/src/lpsolve/build/lp_solve/lp_SOS.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_SOS.c rename to src/lpsolve/build/lp_solve/lp_SOS.c diff --git a/src/external/lpsolve/build/lp_solve/lp_crash.c b/src/lpsolve/build/lp_solve/lp_crash.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_crash.c rename to src/lpsolve/build/lp_solve/lp_crash.c diff --git a/src/external/lpsolve/build/lp_solve/lp_lib.c b/src/lpsolve/build/lp_solve/lp_lib.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_lib.c rename to src/lpsolve/build/lp_solve/lp_lib.c diff --git a/src/external/lpsolve/build/lp_solve/lp_matrix.c b/src/lpsolve/build/lp_solve/lp_matrix.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_matrix.c rename to src/lpsolve/build/lp_solve/lp_matrix.c diff --git a/src/external/lpsolve/build/lp_solve/lp_mipbb.c b/src/lpsolve/build/lp_solve/lp_mipbb.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_mipbb.c rename to src/lpsolve/build/lp_solve/lp_mipbb.c diff --git a/src/external/lpsolve/build/lp_solve/lp_params.c b/src/lpsolve/build/lp_solve/lp_params.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_params.c rename to src/lpsolve/build/lp_solve/lp_params.c diff --git a/src/external/lpsolve/build/lp_solve/lp_presolve.c b/src/lpsolve/build/lp_solve/lp_presolve.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_presolve.c rename to src/lpsolve/build/lp_solve/lp_presolve.c diff --git a/src/external/lpsolve/build/lp_solve/lp_price.c b/src/lpsolve/build/lp_solve/lp_price.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_price.c rename to src/lpsolve/build/lp_solve/lp_price.c diff --git a/src/external/lpsolve/build/lp_solve/lp_pricePSE.c b/src/lpsolve/build/lp_solve/lp_pricePSE.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_pricePSE.c rename to src/lpsolve/build/lp_solve/lp_pricePSE.c diff --git a/src/external/lpsolve/build/lp_solve/lp_report.c b/src/lpsolve/build/lp_solve/lp_report.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_report.c rename to src/lpsolve/build/lp_solve/lp_report.c diff --git a/src/external/lpsolve/build/lp_solve/lp_rlp.c b/src/lpsolve/build/lp_solve/lp_rlp.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_rlp.c rename to src/lpsolve/build/lp_solve/lp_rlp.c diff --git a/src/external/lpsolve/build/lp_solve/lp_scale.c b/src/lpsolve/build/lp_solve/lp_scale.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_scale.c rename to src/lpsolve/build/lp_solve/lp_scale.c diff --git a/src/external/lpsolve/build/lp_solve/lp_simplex.c b/src/lpsolve/build/lp_solve/lp_simplex.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_simplex.c rename to src/lpsolve/build/lp_solve/lp_simplex.c diff --git a/src/external/lpsolve/build/lp_solve/lp_utils.c b/src/lpsolve/build/lp_solve/lp_utils.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_utils.c rename to src/lpsolve/build/lp_solve/lp_utils.c diff --git a/src/external/lpsolve/build/lp_solve/lp_wlp.c b/src/lpsolve/build/lp_solve/lp_wlp.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lp_wlp.c rename to src/lpsolve/build/lp_solve/lp_wlp.c diff --git a/src/external/lpsolve/build/lp_solve/lusol.c b/src/lpsolve/build/lp_solve/lusol.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lusol.c rename to src/lpsolve/build/lp_solve/lusol.c diff --git a/src/external/lpsolve/build/lp_solve/lusol1.c b/src/lpsolve/build/lp_solve/lusol1.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lusol1.c rename to src/lpsolve/build/lp_solve/lusol1.c diff --git a/src/external/lpsolve/build/lp_solve/lusol2.c b/src/lpsolve/build/lp_solve/lusol2.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lusol2.c rename to src/lpsolve/build/lp_solve/lusol2.c diff --git a/src/external/lpsolve/build/lp_solve/lusol6a.c b/src/lpsolve/build/lp_solve/lusol6a.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lusol6a.c rename to src/lpsolve/build/lp_solve/lusol6a.c diff --git a/src/external/lpsolve/build/lp_solve/lusol6l0.c b/src/lpsolve/build/lp_solve/lusol6l0.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lusol6l0.c rename to src/lpsolve/build/lp_solve/lusol6l0.c diff --git a/src/external/lpsolve/build/lp_solve/lusol6u.c b/src/lpsolve/build/lp_solve/lusol6u.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lusol6u.c rename to src/lpsolve/build/lp_solve/lusol6u.c diff --git a/src/external/lpsolve/build/lp_solve/lusol7a.c b/src/lpsolve/build/lp_solve/lusol7a.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lusol7a.c rename to src/lpsolve/build/lp_solve/lusol7a.c diff --git a/src/external/lpsolve/build/lp_solve/lusol8a.c b/src/lpsolve/build/lp_solve/lusol8a.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/lusol8a.c rename to src/lpsolve/build/lp_solve/lusol8a.c diff --git a/src/external/lpsolve/build/lp_solve/mmio.c b/src/lpsolve/build/lp_solve/mmio.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/mmio.c rename to src/lpsolve/build/lp_solve/mmio.c diff --git a/src/external/lpsolve/build/lp_solve/myblas.c b/src/lpsolve/build/lp_solve/myblas.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/myblas.c rename to src/lpsolve/build/lp_solve/myblas.c diff --git a/src/external/lpsolve/build/lp_solve/yacc_read.c b/src/lpsolve/build/lp_solve/yacc_read.c similarity index 100% rename from src/external/lpsolve/build/lp_solve/yacc_read.c rename to src/lpsolve/build/lp_solve/yacc_read.c diff --git a/src/external/lpsolve/headers/include/RlpSolve.h b/src/lpsolve/headers/include/RlpSolve.h similarity index 100% rename from src/external/lpsolve/headers/include/RlpSolve.h rename to src/lpsolve/headers/include/RlpSolve.h diff --git a/src/external/lpsolve/headers/include/RlpSolveLink.h b/src/lpsolve/headers/include/RlpSolveLink.h similarity index 100% rename from src/external/lpsolve/headers/include/RlpSolveLink.h rename to src/lpsolve/headers/include/RlpSolveLink.h diff --git a/src/external/lpsolve/headers/include/colamd.h b/src/lpsolve/headers/include/colamd.h similarity index 100% rename from src/external/lpsolve/headers/include/colamd.h rename to src/lpsolve/headers/include/colamd.h diff --git a/src/external/lpsolve/headers/include/commonlib.h b/src/lpsolve/headers/include/commonlib.h similarity index 100% rename from src/external/lpsolve/headers/include/commonlib.h rename to src/lpsolve/headers/include/commonlib.h diff --git a/src/external/lpsolve/headers/include/ini.h b/src/lpsolve/headers/include/ini.h similarity index 100% rename from src/external/lpsolve/headers/include/ini.h rename to src/lpsolve/headers/include/ini.h diff --git a/src/external/lpsolve/headers/include/lp_BFP.h b/src/lpsolve/headers/include/lp_BFP.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_BFP.h rename to src/lpsolve/headers/include/lp_BFP.h diff --git a/src/external/lpsolve/headers/include/lp_Hash.h b/src/lpsolve/headers/include/lp_Hash.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_Hash.h rename to src/lpsolve/headers/include/lp_Hash.h diff --git a/src/external/lpsolve/headers/include/lp_LUSOL.h b/src/lpsolve/headers/include/lp_LUSOL.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_LUSOL.h rename to src/lpsolve/headers/include/lp_LUSOL.h diff --git a/src/external/lpsolve/headers/include/lp_MDO.h b/src/lpsolve/headers/include/lp_MDO.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_MDO.h rename to src/lpsolve/headers/include/lp_MDO.h diff --git a/src/external/lpsolve/headers/include/lp_MPS.h b/src/lpsolve/headers/include/lp_MPS.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_MPS.h rename to src/lpsolve/headers/include/lp_MPS.h diff --git a/src/external/lpsolve/headers/include/lp_SOS.h b/src/lpsolve/headers/include/lp_SOS.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_SOS.h rename to src/lpsolve/headers/include/lp_SOS.h diff --git a/src/external/lpsolve/headers/include/lp_bit.h b/src/lpsolve/headers/include/lp_bit.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_bit.h rename to src/lpsolve/headers/include/lp_bit.h diff --git a/src/external/lpsolve/headers/include/lp_crash.h b/src/lpsolve/headers/include/lp_crash.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_crash.h rename to src/lpsolve/headers/include/lp_crash.h diff --git a/src/external/lpsolve/headers/include/lp_lib.h b/src/lpsolve/headers/include/lp_lib.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_lib.h rename to src/lpsolve/headers/include/lp_lib.h diff --git a/src/external/lpsolve/headers/include/lp_matrix.h b/src/lpsolve/headers/include/lp_matrix.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_matrix.h rename to src/lpsolve/headers/include/lp_matrix.h diff --git a/src/external/lpsolve/headers/include/lp_mipbb.h b/src/lpsolve/headers/include/lp_mipbb.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_mipbb.h rename to src/lpsolve/headers/include/lp_mipbb.h diff --git a/src/external/lpsolve/headers/include/lp_presolve.h b/src/lpsolve/headers/include/lp_presolve.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_presolve.h rename to src/lpsolve/headers/include/lp_presolve.h diff --git a/src/external/lpsolve/headers/include/lp_price.h b/src/lpsolve/headers/include/lp_price.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_price.h rename to src/lpsolve/headers/include/lp_price.h diff --git a/src/external/lpsolve/headers/include/lp_pricePSE.h b/src/lpsolve/headers/include/lp_pricePSE.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_pricePSE.h rename to src/lpsolve/headers/include/lp_pricePSE.h diff --git a/src/external/lpsolve/headers/include/lp_report.h b/src/lpsolve/headers/include/lp_report.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_report.h rename to src/lpsolve/headers/include/lp_report.h diff --git a/src/external/lpsolve/headers/include/lp_rlp.h b/src/lpsolve/headers/include/lp_rlp.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_rlp.h rename to src/lpsolve/headers/include/lp_rlp.h diff --git a/src/external/lpsolve/headers/include/lp_scale.h b/src/lpsolve/headers/include/lp_scale.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_scale.h rename to src/lpsolve/headers/include/lp_scale.h diff --git a/src/external/lpsolve/headers/include/lp_simplex.h b/src/lpsolve/headers/include/lp_simplex.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_simplex.h rename to src/lpsolve/headers/include/lp_simplex.h diff --git a/src/external/lpsolve/headers/include/lp_types.h b/src/lpsolve/headers/include/lp_types.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_types.h rename to src/lpsolve/headers/include/lp_types.h diff --git a/src/external/lpsolve/headers/include/lp_utils.h b/src/lpsolve/headers/include/lp_utils.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_utils.h rename to src/lpsolve/headers/include/lp_utils.h diff --git a/src/external/lpsolve/headers/include/lp_wlp.h b/src/lpsolve/headers/include/lp_wlp.h similarity index 100% rename from src/external/lpsolve/headers/include/lp_wlp.h rename to src/lpsolve/headers/include/lp_wlp.h diff --git a/src/external/lpsolve/headers/include/lpkit.h b/src/lpsolve/headers/include/lpkit.h similarity index 100% rename from src/external/lpsolve/headers/include/lpkit.h rename to src/lpsolve/headers/include/lpkit.h diff --git a/src/external/lpsolve/headers/include/lusol.h b/src/lpsolve/headers/include/lusol.h similarity index 100% rename from src/external/lpsolve/headers/include/lusol.h rename to src/lpsolve/headers/include/lusol.h diff --git a/src/external/lpsolve/headers/include/mmio.h b/src/lpsolve/headers/include/mmio.h similarity index 100% rename from src/external/lpsolve/headers/include/mmio.h rename to src/lpsolve/headers/include/mmio.h diff --git a/src/external/lpsolve/headers/include/myblas.h b/src/lpsolve/headers/include/myblas.h similarity index 100% rename from src/external/lpsolve/headers/include/myblas.h rename to src/lpsolve/headers/include/myblas.h diff --git a/src/external/lpsolve/headers/include/yacc_read.h b/src/lpsolve/headers/include/yacc_read.h similarity index 100% rename from src/external/lpsolve/headers/include/yacc_read.h rename to src/lpsolve/headers/include/yacc_read.h diff --git a/src/external/lpsolve/headers/run_headers/colamd.h b/src/lpsolve/headers/run_headers/colamd.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/colamd.h rename to src/lpsolve/headers/run_headers/colamd.h diff --git a/src/external/lpsolve/headers/run_headers/commonlib.h b/src/lpsolve/headers/run_headers/commonlib.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/commonlib.h rename to src/lpsolve/headers/run_headers/commonlib.h diff --git a/src/external/lpsolve/headers/run_headers/declare.h b/src/lpsolve/headers/run_headers/declare.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/declare.h rename to src/lpsolve/headers/run_headers/declare.h diff --git a/src/external/lpsolve/headers/run_headers/fortify.h b/src/lpsolve/headers/run_headers/fortify.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/fortify.h rename to src/lpsolve/headers/run_headers/fortify.h diff --git a/src/external/lpsolve/headers/run_headers/hbio.h b/src/lpsolve/headers/run_headers/hbio.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/hbio.h rename to src/lpsolve/headers/run_headers/hbio.h diff --git a/src/external/lpsolve/headers/run_headers/ini.h b/src/lpsolve/headers/run_headers/ini.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/ini.h rename to src/lpsolve/headers/run_headers/ini.h diff --git a/src/external/lpsolve/headers/run_headers/lp_BFP.h b/src/lpsolve/headers/run_headers/lp_BFP.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_BFP.h rename to src/lpsolve/headers/run_headers/lp_BFP.h diff --git a/src/external/lpsolve/headers/run_headers/lp_BFP1.h b/src/lpsolve/headers/run_headers/lp_BFP1.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_BFP1.h rename to src/lpsolve/headers/run_headers/lp_BFP1.h diff --git a/src/external/lpsolve/headers/run_headers/lp_BFP2.h b/src/lpsolve/headers/run_headers/lp_BFP2.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_BFP2.h rename to src/lpsolve/headers/run_headers/lp_BFP2.h diff --git a/src/external/lpsolve/headers/run_headers/lp_Hash.c b/src/lpsolve/headers/run_headers/lp_Hash.c similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_Hash.c rename to src/lpsolve/headers/run_headers/lp_Hash.c diff --git a/src/external/lpsolve/headers/run_headers/lp_Hash.h b/src/lpsolve/headers/run_headers/lp_Hash.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_Hash.h rename to src/lpsolve/headers/run_headers/lp_Hash.h diff --git a/src/external/lpsolve/headers/run_headers/lp_LUSOL.h b/src/lpsolve/headers/run_headers/lp_LUSOL.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_LUSOL.h rename to src/lpsolve/headers/run_headers/lp_LUSOL.h diff --git a/src/external/lpsolve/headers/run_headers/lp_MDO.h b/src/lpsolve/headers/run_headers/lp_MDO.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_MDO.h rename to src/lpsolve/headers/run_headers/lp_MDO.h diff --git a/src/external/lpsolve/headers/run_headers/lp_MPS.h b/src/lpsolve/headers/run_headers/lp_MPS.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_MPS.h rename to src/lpsolve/headers/run_headers/lp_MPS.h diff --git a/src/external/lpsolve/headers/run_headers/lp_SOS.h b/src/lpsolve/headers/run_headers/lp_SOS.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_SOS.h rename to src/lpsolve/headers/run_headers/lp_SOS.h diff --git a/src/external/lpsolve/headers/run_headers/lp_crash.c b/src/lpsolve/headers/run_headers/lp_crash.c similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_crash.c rename to src/lpsolve/headers/run_headers/lp_crash.c diff --git a/src/external/lpsolve/headers/run_headers/lp_crash.h b/src/lpsolve/headers/run_headers/lp_crash.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_crash.h rename to src/lpsolve/headers/run_headers/lp_crash.h diff --git a/src/external/lpsolve/headers/run_headers/lp_explicit.h b/src/lpsolve/headers/run_headers/lp_explicit.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_explicit.h rename to src/lpsolve/headers/run_headers/lp_explicit.h diff --git a/src/external/lpsolve/headers/run_headers/lp_fortify.h b/src/lpsolve/headers/run_headers/lp_fortify.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_fortify.h rename to src/lpsolve/headers/run_headers/lp_fortify.h diff --git a/src/external/lpsolve/headers/run_headers/lp_lib.h b/src/lpsolve/headers/run_headers/lp_lib.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_lib.h rename to src/lpsolve/headers/run_headers/lp_lib.h diff --git a/src/external/lpsolve/headers/run_headers/lp_matrix.h b/src/lpsolve/headers/run_headers/lp_matrix.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_matrix.h rename to src/lpsolve/headers/run_headers/lp_matrix.h diff --git a/src/external/lpsolve/headers/run_headers/lp_mipbb.h b/src/lpsolve/headers/run_headers/lp_mipbb.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_mipbb.h rename to src/lpsolve/headers/run_headers/lp_mipbb.h diff --git a/src/external/lpsolve/headers/run_headers/lp_presolve.h b/src/lpsolve/headers/run_headers/lp_presolve.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_presolve.h rename to src/lpsolve/headers/run_headers/lp_presolve.h diff --git a/src/external/lpsolve/headers/run_headers/lp_price.h b/src/lpsolve/headers/run_headers/lp_price.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_price.h rename to src/lpsolve/headers/run_headers/lp_price.h diff --git a/src/external/lpsolve/headers/run_headers/lp_pricePSE.h b/src/lpsolve/headers/run_headers/lp_pricePSE.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_pricePSE.h rename to src/lpsolve/headers/run_headers/lp_pricePSE.h diff --git a/src/external/lpsolve/headers/run_headers/lp_report.h b/src/lpsolve/headers/run_headers/lp_report.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_report.h rename to src/lpsolve/headers/run_headers/lp_report.h diff --git a/src/external/lpsolve/headers/run_headers/lp_rlp.h b/src/lpsolve/headers/run_headers/lp_rlp.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_rlp.h rename to src/lpsolve/headers/run_headers/lp_rlp.h diff --git a/src/external/lpsolve/headers/run_headers/lp_scale.h b/src/lpsolve/headers/run_headers/lp_scale.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_scale.h rename to src/lpsolve/headers/run_headers/lp_scale.h diff --git a/src/external/lpsolve/headers/run_headers/lp_simplex.h b/src/lpsolve/headers/run_headers/lp_simplex.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_simplex.h rename to src/lpsolve/headers/run_headers/lp_simplex.h diff --git a/src/external/lpsolve/headers/run_headers/lp_types.h b/src/lpsolve/headers/run_headers/lp_types.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_types.h rename to src/lpsolve/headers/run_headers/lp_types.h diff --git a/src/external/lpsolve/headers/run_headers/lp_utils.h b/src/lpsolve/headers/run_headers/lp_utils.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_utils.h rename to src/lpsolve/headers/run_headers/lp_utils.h diff --git a/src/external/lpsolve/headers/run_headers/lp_wlp.h b/src/lpsolve/headers/run_headers/lp_wlp.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lp_wlp.h rename to src/lpsolve/headers/run_headers/lp_wlp.h diff --git a/src/external/lpsolve/headers/run_headers/lpkit.h b/src/lpsolve/headers/run_headers/lpkit.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lpkit.h rename to src/lpsolve/headers/run_headers/lpkit.h diff --git a/src/external/lpsolve/headers/run_headers/lpsolve.h b/src/lpsolve/headers/run_headers/lpsolve.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lpsolve.h rename to src/lpsolve/headers/run_headers/lpsolve.h diff --git a/src/external/lpsolve/headers/run_headers/lusol.h b/src/lpsolve/headers/run_headers/lusol.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lusol.h rename to src/lpsolve/headers/run_headers/lusol.h diff --git a/src/external/lpsolve/headers/run_headers/lusol1.h b/src/lpsolve/headers/run_headers/lusol1.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lusol1.h rename to src/lpsolve/headers/run_headers/lusol1.h diff --git a/src/external/lpsolve/headers/run_headers/lusol2.h b/src/lpsolve/headers/run_headers/lusol2.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lusol2.h rename to src/lpsolve/headers/run_headers/lusol2.h diff --git a/src/external/lpsolve/headers/run_headers/lusol6a.h b/src/lpsolve/headers/run_headers/lusol6a.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lusol6a.h rename to src/lpsolve/headers/run_headers/lusol6a.h diff --git a/src/external/lpsolve/headers/run_headers/lusol6l0.h b/src/lpsolve/headers/run_headers/lusol6l0.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lusol6l0.h rename to src/lpsolve/headers/run_headers/lusol6l0.h diff --git a/src/external/lpsolve/headers/run_headers/lusol6u.h b/src/lpsolve/headers/run_headers/lusol6u.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lusol6u.h rename to src/lpsolve/headers/run_headers/lusol6u.h diff --git a/src/external/lpsolve/headers/run_headers/lusol7a.h b/src/lpsolve/headers/run_headers/lusol7a.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lusol7a.h rename to src/lpsolve/headers/run_headers/lusol7a.h diff --git a/src/external/lpsolve/headers/run_headers/lusol8a.h b/src/lpsolve/headers/run_headers/lusol8a.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lusol8a.h rename to src/lpsolve/headers/run_headers/lusol8a.h diff --git a/src/external/lpsolve/headers/run_headers/lusolio.h b/src/lpsolve/headers/run_headers/lusolio.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/lusolio.h rename to src/lpsolve/headers/run_headers/lusolio.h diff --git a/src/external/lpsolve/headers/run_headers/mmio.h b/src/lpsolve/headers/run_headers/mmio.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/mmio.h rename to src/lpsolve/headers/run_headers/mmio.h diff --git a/src/external/lpsolve/headers/run_headers/myblas.h b/src/lpsolve/headers/run_headers/myblas.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/myblas.h rename to src/lpsolve/headers/run_headers/myblas.h diff --git a/src/external/lpsolve/headers/run_headers/sparselib.h b/src/lpsolve/headers/run_headers/sparselib.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/sparselib.h rename to src/lpsolve/headers/run_headers/sparselib.h diff --git a/src/external/lpsolve/headers/run_headers/ufortify.h b/src/lpsolve/headers/run_headers/ufortify.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/ufortify.h rename to src/lpsolve/headers/run_headers/ufortify.h diff --git a/src/external/lpsolve/headers/run_headers/yacc_read.h b/src/lpsolve/headers/run_headers/yacc_read.h similarity index 100% rename from src/external/lpsolve/headers/run_headers/yacc_read.h rename to src/lpsolve/headers/run_headers/yacc_read.h diff --git a/src/volesti b/src/volesti new file mode 160000 index 00000000..5bf9188f --- /dev/null +++ b/src/volesti @@ -0,0 +1 @@ +Subproject commit 5bf9188fb11fddab17de98fabc505e993216ca5f

Y5OySqE62!94@f0DXdk2 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∨xu3w~>DUPb2>f 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�oog67pt$Qd_M&)< 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 z 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 z